diff --git a/.venv/Lib/site-packages/PIL/BdfFontFile.py b/.venv/Lib/site-packages/PIL/BdfFontFile.py new file mode 100644 index 00000000..075d4629 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/BdfFontFile.py @@ -0,0 +1,122 @@ +# +# 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 . 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): + # 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 = [] + while True: + s = f.readline() + if not s or s[:7] == b"ENDCHAR": + break + bitmap.append(s[:-1]) + bitmap = b"".join(bitmap) + + # 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): + 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/site-packages/PIL/BlpImagePlugin.py b/.venv/Lib/site-packages/PIL/BlpImagePlugin.py new file mode 100644 index 00000000..1cc0d4b3 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/BlpImagePlugin.py @@ -0,0 +1,488 @@ +""" +Blizzard Mipmap Format (.blp) +Jerome Leclanche + +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/ + +BLP1 files, used mostly in Warcraft III, are not fully supported. +All types of BLP2 files used in World of Warcraft are supported. + +The BLP file structure consists of a header, up to 16 mipmaps of the +texture + +Texture sizes must be powers of two, though the two dimensions do +not have to be equal; 512x256 is valid, but 512x200 is not. +The first mipmap (mipmap #0) is the full size image; each subsequent +mipmap halves both dimensions. The final mipmap should be 1x1. + +BLP files come in many different flavours: +* JPEG-compressed (type == 0) - only supported for BLP1. +* RAW images (type == 1, encoding == 1). Each mipmap is stored as an + array of 8-bit values, one per pixel, left to right, top to bottom. + Each value is an index to the palette. +* DXT-compressed (type == 1, encoding == 2): +- DXT1 compression is used if alpha_encoding == 0. + - An additional alpha bit is used if alpha_depth == 1. + - DXT3 compression is used if alpha_encoding == 1. + - DXT5 compression is used if alpha_encoding == 7. +""" + +import os +import struct +from enum import IntEnum +from io import BytesIO + +from . import Image, ImageFile +from ._deprecate import deprecate + + +class Format(IntEnum): + JPEG = 0 + + +class Encoding(IntEnum): + UNCOMPRESSED = 1 + DXT = 2 + UNCOMPRESSED_RAW_BGRA = 3 + + +class AlphaEncoding(IntEnum): + DXT1 = 0 + DXT3 = 1 + DXT5 = 7 + + +def __getattr__(name): + for enum, prefix in { + Format: "BLP_FORMAT_", + Encoding: "BLP_ENCODING_", + AlphaEncoding: "BLP_ALPHA_ENCODING_", + }.items(): + if name.startswith(prefix): + name = name[len(prefix) :] + if name in enum.__members__: + deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") + return enum[name] + msg = f"module '{__name__}' has no attribute '{name}'" + raise AttributeError(msg) + + +def unpack_565(i): + return ((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3 + + +def decode_dxt1(data, alpha=False): + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 8 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + # Decode next 8-byte block. + idx = block * 8 + color0, color1, bits = struct.unpack_from("> 2 + + a = 0xFF + if control == 0: + r, g, b = r0, g0, b0 + elif control == 1: + r, g, b = r1, g1, b1 + elif control == 2: + if color0 > color1: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + else: + r = (r0 + r1) // 2 + g = (g0 + g1) // 2 + b = (b0 + b1) // 2 + elif control == 3: + if color0 > color1: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + else: + r, g, b, a = 0, 0, 0, 0 + + if alpha: + ret[j].extend([r, g, b, a]) + else: + ret[j].extend([r, g, b]) + + return ret + + +def decode_dxt3(data): + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + idx = block * 16 + block = data[idx : idx + 16] + # Decode next 16-byte block. + bits = struct.unpack_from("<8B", block) + color0, color1 = struct.unpack_from(">= 4 + else: + high = True + a &= 0xF + a *= 17 # We get a value between 0 and 15 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +def decode_dxt5(data): + """ + input: one "row" of data (i.e. will produce 4 * width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + idx = block * 16 + block = data[idx : idx + 16] + # Decode next 16-byte block. + a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 + elif alphacode_index == 15: + alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) + else: # alphacode_index >= 18 and alphacode_index <= 45 + alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 + + if alphacode == 0: + a = a0 + elif alphacode == 1: + a = a1 + elif a0 > a1: + a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 + elif alphacode == 6: + a = 0 + elif alphacode == 7: + a = 255 + else: + a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +class BLPFormatError(NotImplementedError): + pass + + +def _accept(prefix): + return prefix[:4] in (b"BLP1", b"BLP2") + + +class BlpImageFile(ImageFile.ImageFile): + """ + Blizzard Mipmap Format + """ + + format = "BLP" + format_description = "Blizzard Mipmap Format" + + def _open(self): + self.magic = self.fp.read(4) + + self.fp.seek(5, os.SEEK_CUR) + (self._blp_alpha_depth,) = struct.unpack(" 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): + return prefix[:2] == b"BM" + + +def _dib_accept(prefix): + return i32(prefix) in [12, 40, 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) + + # -------------------------------------------------- IBM OS/2 Bitmap v1 + # ----- This format has different offsets because of width/height types + 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 v2 to v5 + # v3, OS/2 v2, v4, v5 + elif file_info["header_size"] in (40, 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: + if len(header_data) >= 52: + for idx, mask in enumerate( + ["r_mask", "g_mask", "b_mask", "a_mask"] + ): + 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 ["r_mask", "g_mask", "b_mask"]: + 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, 0xFF0000, 0xFF00, 0xFF), + (0xFF, 0xFF00, 0xFF0000, 0xFF000000), + (0xFF0000, 0xFF00, 0xFF, 0xFF000000), + (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, 0xFF0000, 0xFF00, 0xFF)): "ABGR", + (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", + (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", + (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"]) + greyscale = True + indices = ( + (0, 255) + if file_info["colors"] == 2 + else list(range(file_info["colors"])) + ) + + # ----------------- Check if greyscale and ignore palette if so + for ind, val in enumerate(indices): + rgb = palette[ind * padding : ind * padding + 3] + if rgb != o8(val) * 3: + greyscale = False + + # ------- If all colors are grey, white or black, ditch palette + if greyscale: + 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): + """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): + rle4 = self.args[1] + data = bytearray() + x = 0 + while len(data) < self.state.xsize * self.state.ysize: + 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): + 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, fp, filename): + _save(im, fp, filename, False) + + +def _save(im, fp, filename, bitmap_header=True): + 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(map(lambda x: int(x * 39.3701 + 0.5), 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/site-packages/PIL/BufrStubImagePlugin.py b/.venv/Lib/site-packages/PIL/BufrStubImagePlugin.py new file mode 100644 index 00000000..0425bbd7 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/BufrStubImagePlugin.py @@ -0,0 +1,73 @@ +# +# 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 . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific BUFR image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix): + return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" + + +class BufrStubImageFile(ImageFile.StubImageFile): + format = "BUFR" + format_description = "BUFR" + + def _open(self): + 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): + return _handler + + +def _save(im, fp, filename): + 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/site-packages/PIL/ContainerIO.py b/.venv/Lib/site-packages/PIL/ContainerIO.py new file mode 100644 index 00000000..45e80b39 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ContainerIO.py @@ -0,0 +1,120 @@ +# +# 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. +# + + +import io + + +class ContainerIO: + """ + A file object that provides read access to a part of an existing + file (for example a TAR file). + """ + + def __init__(self, file, offset, length): + """ + Create file object. + + :param file: Existing file. + :param offset: Start of region, in bytes. + :param length: Size of region, in bytes. + """ + self.fh = file + self.pos = 0 + self.offset = offset + self.length = length + self.fh.seek(offset) + + ## + # Always false. + + def isatty(self): + return False + + def seek(self, offset, mode=io.SEEK_SET): + """ + 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): + """ + Get current file pointer. + + :returns: Offset from start of region, in bytes. + """ + return self.pos + + def read(self, n=0): + """ + 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 "" + self.pos = self.pos + n + return self.fh.read(n) + + def readline(self): + """ + Read a line of text. + + :returns: An 8-bit string. + """ + s = b"" if "b" in self.fh.mode else "" + 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): + """ + 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/site-packages/PIL/CurImagePlugin.py b/.venv/Lib/site-packages/PIL/CurImagePlugin.py new file mode 100644 index 00000000..94efff34 --- /dev/null +++ b/.venv/Lib/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 . import BmpImagePlugin, Image +from ._binary import i16le as i16 +from ._binary import i32le as i32 + +# +# -------------------------------------------------------------------- + + +def _accept(prefix): + 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): + 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 + + return + + +# +# -------------------------------------------------------------------- + +Image.register_open(CurImageFile.format, CurImageFile, _accept) + +Image.register_extension(CurImageFile.format, ".cur") diff --git a/.venv/Lib/site-packages/PIL/DcxImagePlugin.py b/.venv/Lib/site-packages/PIL/DcxImagePlugin.py new file mode 100644 index 00000000..cde9d42f --- /dev/null +++ b/.venv/Lib/site-packages/PIL/DcxImagePlugin.py @@ -0,0 +1,79 @@ +# +# 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 . import Image +from ._binary import i32le as i32 +from .PcxImagePlugin import PcxImageFile + +MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? + + +def _accept(prefix): + 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): + # 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 = None + self.n_frames = len(self._offset) + self.is_animated = self.n_frames > 1 + self.seek(0) + + def seek(self, frame): + 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): + return self.frame + + +Image.register_open(DcxImageFile.format, DcxImageFile, _accept) + +Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/.venv/Lib/site-packages/PIL/DdsImagePlugin.py b/.venv/Lib/site-packages/PIL/DdsImagePlugin.py new file mode 100644 index 00000000..a946daea --- /dev/null +++ b/.venv/Lib/site-packages/PIL/DdsImagePlugin.py @@ -0,0 +1,291 @@ +""" +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/ +""" + +import struct +from io import BytesIO + +from . import Image, ImageFile +from ._binary import o32le as o32 + +# Magic ("DDS ") +DDS_MAGIC = 0x20534444 + +# DDS flags +DDSD_CAPS = 0x1 +DDSD_HEIGHT = 0x2 +DDSD_WIDTH = 0x4 +DDSD_PITCH = 0x8 +DDSD_PIXELFORMAT = 0x1000 +DDSD_MIPMAPCOUNT = 0x20000 +DDSD_LINEARSIZE = 0x80000 +DDSD_DEPTH = 0x800000 + +# DDS caps +DDSCAPS_COMPLEX = 0x8 +DDSCAPS_TEXTURE = 0x1000 +DDSCAPS_MIPMAP = 0x400000 + +DDSCAPS2_CUBEMAP = 0x200 +DDSCAPS2_CUBEMAP_POSITIVEX = 0x400 +DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800 +DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000 +DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000 +DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000 +DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000 +DDSCAPS2_VOLUME = 0x200000 + +# Pixel Format +DDPF_ALPHAPIXELS = 0x1 +DDPF_ALPHA = 0x2 +DDPF_FOURCC = 0x4 +DDPF_PALETTEINDEXED8 = 0x20 +DDPF_RGB = 0x40 +DDPF_LUMINANCE = 0x20000 + + +# dds.h + +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 +DXT1_FOURCC = 0x31545844 + +# DXT3 +DXT3_FOURCC = 0x33545844 + +# DXT5 +DXT5_FOURCC = 0x35545844 + + +# dxgiformat.h + +DXGI_FORMAT_R8G8B8A8_TYPELESS = 27 +DXGI_FORMAT_R8G8B8A8_UNORM = 28 +DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29 +DXGI_FORMAT_BC5_TYPELESS = 82 +DXGI_FORMAT_BC5_UNORM = 83 +DXGI_FORMAT_BC5_SNORM = 84 +DXGI_FORMAT_BC6H_UF16 = 95 +DXGI_FORMAT_BC6H_SF16 = 96 +DXGI_FORMAT_BC7_TYPELESS = 97 +DXGI_FORMAT_BC7_UNORM = 98 +DXGI_FORMAT_BC7_UNORM_SRGB = 99 + + +class DdsImageFile(ImageFile.ImageFile): + format = "DDS" + format_description = "DirectDraw Surface" + + def _open(self): + if not _accept(self.fp.read(4)): + msg = "not a DDS file" + raise SyntaxError(msg) + (header_size,) = struct.unpack(" 0: + s = fp.read(min(lengthfile, 100 * 1024)) + if not s: + break + lengthfile -= len(s) + f.write(s) + + device = "pngalpha" if transparency else "ppmraw" + + # Build Ghostscript command + command = [ + "gs", + "-q", # quiet mode + "-g%dx%d" % size, # set output geometry (pixels) + "-r%fx%f" % res, # set input DPI (dots per inch) + "-dBATCH", # exit after processing + "-dNOPAUSE", # don't pause between pages + "-dSAFER", # safe mode + f"-sDEVICE={device}", + f"-sOutputFile={outfile}", # output file + # adjust for image origin + "-c", + f"{-bbox[0]} {-bbox[1]} translate", + "-f", + infile, # input file + # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) + "-c", + "showpage", + ] + + if gs_windows_binary is not None: + if not gs_windows_binary: + msg = "Unable to locate Ghostscript on paths" + raise OSError(msg) + command[0] = gs_windows_binary + + # push data through Ghostscript + try: + startupinfo = None + if sys.platform.startswith("win"): + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + subprocess.check_call(command, startupinfo=startupinfo) + out_im = Image.open(outfile) + out_im.load() + finally: + try: + os.unlink(outfile) + if infile_temp: + os.unlink(infile_temp) + except OSError: + pass + + im = out_im.im.copy() + out_im.close() + return im + + +class PSFile: + """ + Wrapper for bytesio object that treats either CR or LF as end of line. + This class is no longer used internally, but kept for backwards compatibility. + """ + + def __init__(self, fp): + deprecate( + "PSFile", + 11, + action="If you need the functionality of this class " + "you will need to implement it yourself.", + ) + self.fp = fp + self.char = None + + def seek(self, offset, whence=io.SEEK_SET): + self.char = None + self.fp.seek(offset, whence) + + def readline(self): + s = [self.char or b""] + self.char = None + + c = self.fp.read(1) + while (c not in b"\r\n") and len(c): + s.append(c) + c = self.fp.read(1) + + self.char = self.fp.read(1) + # line endings can be 1 or 2 of \r \n, in either order + if self.char in b"\r\n": + self.char = None + + return b"".join(s).decode("latin-1") + + +def _accept(prefix): + return prefix[:4] == b"%!PS" or (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5) + + +## +# Image plugin for Encapsulated PostScript. This plugin supports only +# a few variants of this format. + + +class EpsImageFile(ImageFile.ImageFile): + """EPS File Parser for the Python Imaging Library""" + + format = "EPS" + format_description = "Encapsulated Postscript" + + mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} + + def _open(self): + (length, offset) = self._find_offset(self.fp) + + # go to offset - start of "%!PS" + self.fp.seek(offset) + + self.mode = "RGB" + self._size = None + + byte_arr = bytearray(255) + bytes_mv = memoryview(byte_arr) + bytes_read = 0 + reading_comments = True + + def check_required_header_comments(): + if "PS-Adobe" not in self.info: + msg = 'EPS header missing "%!PS-Adobe" comment' + raise SyntaxError(msg) + if "BoundingBox" not in self.info: + msg = 'EPS header missing "%%BoundingBox" comment' + raise SyntaxError(msg) + + while True: + byte = self.fp.read(1) + if byte == b"": + # if we didn't read a byte we must be at the end of the file + if bytes_read == 0: + break + elif byte in b"\r\n": + # if we read a line ending character, ignore it and parse what + # we have already read. if we haven't read any other characters, + # continue reading + if bytes_read == 0: + continue + else: + # ASCII/hexadecimal lines in an EPS file must not exceed + # 255 characters, not including line ending characters + if bytes_read >= 255: + # only enforce this for lines starting with a "%", + # otherwise assume it's binary data + if byte_arr[0] == ord("%"): + msg = "not an EPS file" + raise SyntaxError(msg) + else: + if reading_comments: + check_required_header_comments() + reading_comments = False + # reset bytes_read so we can keep reading + # data until the end of the line + bytes_read = 0 + byte_arr[bytes_read] = byte[0] + bytes_read += 1 + continue + + if reading_comments: + # Load EPS header + + # if this line doesn't start with a "%", + # or does start with "%%EndComments", + # then we've reached the end of the header/comments + if byte_arr[0] != ord("%") or bytes_mv[:13] == b"%%EndComments": + check_required_header_comments() + reading_comments = False + continue + + s = str(bytes_mv[:bytes_read], "latin-1") + + try: + m = split.match(s) + except re.error as e: + msg = "not an EPS file" + raise SyntaxError(msg) from e + + if m: + k, v = m.group(1, 2) + self.info[k] = v + if k == "BoundingBox": + try: + # Note: The DSC spec says that BoundingBox + # fields should be integers, but some drivers + # put floating point values there anyway. + box = [int(float(i)) for i in v.split()] + self._size = box[2] - box[0], box[3] - box[1] + self.tile = [ + ("eps", (0, 0) + self.size, offset, (length, box)) + ] + except Exception: + pass + else: + m = field.match(s) + if m: + k = m.group(1) + if k[:8] == "PS-Adobe": + self.info["PS-Adobe"] = k[9:] + else: + self.info[k] = "" + elif s[0] == "%": + # handle non-DSC PostScript comments that some + # tools mistakenly put in the Comments section + pass + else: + msg = "bad EPS header" + raise OSError(msg) + elif bytes_mv[:11] == b"%ImageData:": + # Check for an "ImageData" descriptor + # https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577413_pgfId-1035096 + + # Values: + # columns + # rows + # bit depth (1 or 8) + # mode (1: L, 2: LAB, 3: RGB, 4: CMYK) + # number of padding channels + # block size (number of bytes per row per channel) + # binary/ascii (1: binary, 2: ascii) + # data start identifier (the image data follows after a single line + # consisting only of this quoted value) + image_data_values = byte_arr[11:bytes_read].split(None, 7) + columns, rows, bit_depth, mode_id = [ + int(value) for value in image_data_values[:4] + ] + + if bit_depth == 1: + self.mode = "1" + elif bit_depth == 8: + try: + self.mode = self.mode_map[mode_id] + except ValueError: + break + else: + break + + self._size = columns, rows + return + + bytes_read = 0 + + check_required_header_comments() + + if not self._size: + self._size = 1, 1 # errors if this isn't set. why (1,1)? + msg = "cannot determine EPS bounding box" + raise OSError(msg) + + def _find_offset(self, fp): + s = fp.read(4) + + if s == b"%!PS": + # for HEAD without binary preview + fp.seek(0, io.SEEK_END) + length = fp.tell() + offset = 0 + elif i32(s) == 0xC6D3D0C5: + # FIX for: Some EPS file not handled correctly / issue #302 + # EPS can contain binary data + # or start directly with latin coding + # more info see: + # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf + s = fp.read(8) + offset = i32(s) + length = i32(s, 4) + else: + msg = "not an EPS file" + raise SyntaxError(msg) + + return length, offset + + def load(self, scale=1, transparency=False): + # Load EPS via Ghostscript + if self.tile: + self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency) + self.mode = self.im.mode + self._size = self.im.size + self.tile = [] + return Image.Image.load(self) + + def load_seek(self, *args, **kwargs): + # we can't incrementally load, so force ImageFile.parser to + # use our custom load method by defining this method. + pass + + +# -------------------------------------------------------------------- + + +def _save(im, fp, filename, eps=1): + """EPS Writer for the Python Imaging Library.""" + + # make sure image data is available + im.load() + + # determine PostScript image mode + if im.mode == "L": + operator = (8, 1, b"image") + elif im.mode == "RGB": + operator = (8, 3, b"false 3 colorimage") + elif im.mode == "CMYK": + operator = (8, 4, b"false 4 colorimage") + else: + msg = "image mode is not supported" + raise ValueError(msg) + + if eps: + # write EPS header + fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") + fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") + # fp.write("%%CreationDate: %s"...) + fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) + fp.write(b"%%Pages: 1\n") + fp.write(b"%%EndComments\n") + fp.write(b"%%Page: 1 1\n") + fp.write(b"%%ImageData: %d %d " % im.size) + fp.write(b'%d %d 0 1 1 "%s"\n' % operator) + + # image header + fp.write(b"gsave\n") + fp.write(b"10 dict begin\n") + fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) + fp.write(b"%d %d scale\n" % im.size) + fp.write(b"%d %d 8\n" % im.size) # <= bits + fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) + fp.write(b"{ currentfile buf readhexstring pop } bind\n") + fp.write(operator[2] + b"\n") + if hasattr(fp, "flush"): + fp.flush() + + ImageFile._save(im, fp, [("eps", (0, 0) + im.size, 0, None)]) + + fp.write(b"\n%%%%EndBinary\n") + fp.write(b"grestore end\n") + if hasattr(fp, "flush"): + fp.flush() + + +# -------------------------------------------------------------------- + + +Image.register_open(EpsImageFile.format, EpsImageFile, _accept) + +Image.register_save(EpsImageFile.format, _save) + +Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) + +Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/.venv/Lib/site-packages/PIL/ExifTags.py b/.venv/Lib/site-packages/PIL/ExifTags.py new file mode 100644 index 00000000..2347c6d4 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ExifTags.py @@ -0,0 +1,380 @@ +# +# 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 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 + RleatedImageHeight = 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/site-packages/PIL/FitsImagePlugin.py b/.venv/Lib/site-packages/PIL/FitsImagePlugin.py new file mode 100644 index 00000000..1359aeb1 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/FitsImagePlugin.py @@ -0,0 +1,73 @@ +# +# The Python Imaging Library +# $Id$ +# +# FITS file handling +# +# Copyright (c) 1998-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import math + +from . import Image, ImageFile + + +def _accept(prefix): + return prefix[:6] == b"SIMPLE" + + +class FitsImageFile(ImageFile.ImageFile): + format = "FITS" + format_description = "FITS" + + def _open(self): + headers = {} + while True: + header = self.fp.read(80) + if not header: + msg = "Truncated FITS file" + raise OSError(msg) + keyword = header[:8].strip() + if keyword == b"END": + break + value = header[8:].split(b"/")[0].strip() + if value.startswith(b"="): + value = value[1:].strip() + if not headers and (not _accept(keyword) or value != b"T"): + msg = "Not a FITS file" + raise SyntaxError(msg) + headers[keyword] = value + + naxis = int(headers[b"NAXIS"]) + if naxis == 0: + msg = "No image data" + raise ValueError(msg) + elif naxis == 1: + self._size = 1, int(headers[b"NAXIS1"]) + else: + self._size = int(headers[b"NAXIS1"]), int(headers[b"NAXIS2"]) + + number_of_bits = int(headers[b"BITPIX"]) + if number_of_bits == 8: + self.mode = "L" + elif number_of_bits == 16: + self.mode = "I" + # rawmode = "I;16S" + elif number_of_bits == 32: + self.mode = "I" + elif number_of_bits in (-32, -64): + self.mode = "F" + # rawmode = "F" if number_of_bits == -32 else "F;64F" + + offset = math.ceil(self.fp.tell() / 2880) * 2880 + self.tile = [("raw", (0, 0) + self.size, offset, (self.mode, 0, -1))] + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(FitsImageFile.format, FitsImageFile, _accept) + +Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) diff --git a/.venv/Lib/site-packages/PIL/FitsStubImagePlugin.py b/.venv/Lib/site-packages/PIL/FitsStubImagePlugin.py new file mode 100644 index 00000000..50948ec4 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/FitsStubImagePlugin.py @@ -0,0 +1,76 @@ +# +# The Python Imaging Library +# $Id$ +# +# FITS stub adapter +# +# Copyright (c) 1998-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import FitsImagePlugin, Image, ImageFile +from ._deprecate import deprecate + +_handler = None + + +def register_handler(handler): + """ + Install application-specific FITS image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + deprecate( + "FitsStubImagePlugin", + 10, + action="FITS images can now be read without " + "a handler through FitsImagePlugin instead", + ) + + # Override FitsImagePlugin with this handler + # for backwards compatibility + try: + Image.ID.remove(FITSStubImageFile.format) + except ValueError: + pass + + Image.register_open( + FITSStubImageFile.format, FITSStubImageFile, FitsImagePlugin._accept + ) + + +class FITSStubImageFile(ImageFile.StubImageFile): + format = FitsImagePlugin.FitsImageFile.format + format_description = FitsImagePlugin.FitsImageFile.format_description + + def _open(self): + offset = self.fp.tell() + + im = FitsImagePlugin.FitsImageFile(self.fp) + self._size = im.size + self.mode = im.mode + self.tile = [] + + self.fp.seek(offset) + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + msg = "FITS save handler not installed" + raise OSError(msg) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_save(FITSStubImageFile.format, _save) diff --git a/.venv/Lib/site-packages/PIL/FliImagePlugin.py b/.venv/Lib/site-packages/PIL/FliImagePlugin.py new file mode 100644 index 00000000..f4e89a03 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/FliImagePlugin.py @@ -0,0 +1,171 @@ +# +# The Python Imaging Library. +# $Id$ +# +# FLI/FLC file handling. +# +# History: +# 95-09-01 fl Created +# 97-01-03 fl Fixed parser, setup decoder tile +# 98-07-15 fl Renamed offset attribute to avoid name clash +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# + +import os + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import i32le as i32 +from ._binary import o8 + +# +# decoder + + +def _accept(prefix): + return ( + len(prefix) >= 6 + and i16(prefix, 4) in [0xAF11, 0xAF12] + and i16(prefix, 14) in [0, 3] # flags + ) + + +## +# Image plugin for the FLI/FLC animation format. Use the seek +# method to load individual frames. + + +class FliImageFile(ImageFile.ImageFile): + format = "FLI" + format_description = "Autodesk FLI/FLC Animation" + _close_exclusive_fp_after_loading = False + + def _open(self): + # HEAD + s = self.fp.read(128) + if not (_accept(s) and s[20:22] == b"\x00\x00"): + msg = "not an FLI/FLC file" + raise SyntaxError(msg) + + # frames + self.n_frames = i16(s, 6) + self.is_animated = self.n_frames > 1 + + # image characteristics + self.mode = "P" + self._size = i16(s, 8), i16(s, 10) + + # animation speed + duration = i32(s, 16) + magic = i16(s, 4) + if magic == 0xAF11: + duration = (duration * 1000) // 70 + self.info["duration"] = duration + + # look for palette + palette = [(a, a, a) for a in range(256)] + + s = self.fp.read(16) + + self.__offset = 128 + + if i16(s, 4) == 0xF100: + # prefix chunk; ignore it + self.__offset = self.__offset + i32(s) + s = self.fp.read(16) + + if i16(s, 4) == 0xF1FA: + # look for palette chunk + number_of_subchunks = i16(s, 6) + chunk_size = None + for _ in range(number_of_subchunks): + if chunk_size is not None: + self.fp.seek(chunk_size - 6, os.SEEK_CUR) + s = self.fp.read(6) + chunk_type = i16(s, 4) + if chunk_type in (4, 11): + self._palette(palette, 2 if chunk_type == 11 else 0) + break + chunk_size = i32(s) + if not chunk_size: + break + + palette = [o8(r) + o8(g) + o8(b) for (r, g, b) in palette] + self.palette = ImagePalette.raw("RGB", b"".join(palette)) + + # set things up to decode first frame + self.__frame = -1 + self._fp = self.fp + self.__rewind = self.fp.tell() + self.seek(0) + + def _palette(self, palette, shift): + # load palette + + i = 0 + for e in range(i16(self.fp.read(2))): + s = self.fp.read(2) + i = i + s[0] + n = s[1] + if n == 0: + n = 256 + s = self.fp.read(n * 3) + for n in range(0, len(s), 3): + r = s[n] << shift + g = s[n + 1] << shift + b = s[n + 2] << shift + palette[i] = (r, g, b) + i += 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0) + + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + + def _seek(self, frame): + if frame == 0: + self.__frame = -1 + self._fp.seek(self.__rewind) + self.__offset = 128 + else: + # ensure that the previous frame was loaded + self.load() + + if frame != self.__frame + 1: + msg = f"cannot seek to frame {frame}" + raise ValueError(msg) + self.__frame = frame + + # move to next frame + self.fp = self._fp + self.fp.seek(self.__offset) + + s = self.fp.read(4) + if not s: + raise EOFError + + framesize = i32(s) + + self.decodermaxblock = framesize + self.tile = [("fli", (0, 0) + self.size, self.__offset, None)] + + self.__offset += framesize + + def tell(self): + return self.__frame + + +# +# registry + +Image.register_open(FliImageFile.format, FliImageFile, _accept) + +Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/.venv/Lib/site-packages/PIL/FontFile.py b/.venv/Lib/site-packages/PIL/FontFile.py new file mode 100644 index 00000000..5ec0a663 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/FontFile.py @@ -0,0 +1,110 @@ +# +# 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. +# + + +import os + +from . import Image, _binary + +WIDTH = 800 + + +def puti16(fp, values): + """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 = None + + def __init__(self): + self.info = {} + self.glyph = [None] * 256 + + def __getitem__(self, ix): + return self.glyph[ix] + + def compile(self): + """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: + 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 = [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] + # yy = src[3] - src[1] + 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): + """Save font""" + + self.compile() + + # font data + 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/site-packages/PIL/FpxImagePlugin.py b/.venv/Lib/site-packages/PIL/FpxImagePlugin.py new file mode 100644 index 00000000..2450c67e --- /dev/null +++ b/.venv/Lib/site-packages/PIL/FpxImagePlugin.py @@ -0,0 +1,253 @@ +# +# 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. +# +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): + 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=1): + # + # 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] + + colors = [] + bands = i32(s, 4) + if bands > 4: + msg = "Invalid number of bands" + raise OSError(msg) + for i in range(bands): + # note: for now, we ignore the "uncalibrated" flag + colors.append(i32(s, 8 + i * 4) & 0x7FFFFFFF) + + self.mode, self.rawmode = MODES[tuple(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=1, subimage=0): + # + # 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 = 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): + self.ole.close() + super().close() + + def __exit__(self, *args): + self.ole.close() + super().__exit__() + + +# +# -------------------------------------------------------------------- + + +Image.register_open(FpxImageFile.format, FpxImageFile, _accept) + +Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/.venv/Lib/site-packages/PIL/FtexImagePlugin.py b/.venv/Lib/site-packages/PIL/FtexImagePlugin.py new file mode 100644 index 00000000..c7c32252 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/FtexImagePlugin.py @@ -0,0 +1,125 @@ +""" +A Pillow loader for .ftc and .ftu files (FTEX) +Jerome Leclanche + +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/ + +Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 + +The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a +packed custom format called FTEX. This file format uses file extensions FTC +and FTU. +* FTC files are compressed textures (using standard texture compression). +* FTU files are not compressed. +Texture File Format +The FTC and FTU texture files both use the same format. This +has the following structure: +{header} +{format_directory} +{data} +Where: +{header} = { + u32:magic, + u32:version, + u32:width, + u32:height, + u32:mipmap_count, + u32:format_count +} + +* The "magic" number is "FTEX". +* "width" and "height" are the dimensions of the texture. +* "mipmap_count" is the number of mipmaps in the texture. +* "format_count" is the number of texture formats (different versions of the +same texture) in this file. + +{format_directory} = format_count * { u32:format, u32:where } + +The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB +uncompressed textures. +The texture data for a format starts at the position "where" in the file. + +Each set of texture data in the file has the following structure: +{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } +* "mipmap_size" is the number of bytes in that mip level. For compressed +textures this is the size of the texture data compressed with DXT1. For 24 bit +uncompressed textures, this is 3 * width * height. Following this are the image +bytes for that mipmap level. + +Note: All data is stored in little-Endian (Intel) byte order. +""" + +import struct +from enum import IntEnum +from io import BytesIO + +from . import Image, ImageFile +from ._deprecate import deprecate + +MAGIC = b"FTEX" + + +class Format(IntEnum): + DXT1 = 0 + UNCOMPRESSED = 1 + + +def __getattr__(name): + for enum, prefix in {Format: "FORMAT_"}.items(): + if name.startswith(prefix): + name = name[len(prefix) :] + if name in enum.__members__: + deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") + return enum[name] + msg = f"module '{__name__}' has no attribute '{name}'" + raise AttributeError(msg) + + +class FtexImageFile(ImageFile.ImageFile): + format = "FTEX" + format_description = "Texture File Format (IW2:EOC)" + + def _open(self): + if not _accept(self.fp.read(4)): + msg = "not an FTEX file" + raise SyntaxError(msg) + struct.unpack("= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) + + +## +# Image plugin for the GIMP brush format. + + +class GbrImageFile(ImageFile.ImageFile): + format = "GBR" + format_description = "GIMP brush file" + + def _open(self): + header_size = i32(self.fp.read(4)) + if header_size < 20: + msg = "not a GIMP brush" + raise SyntaxError(msg) + version = i32(self.fp.read(4)) + if version not in (1, 2): + msg = f"Unsupported GIMP brush version: {version}" + raise SyntaxError(msg) + + width = i32(self.fp.read(4)) + height = i32(self.fp.read(4)) + color_depth = i32(self.fp.read(4)) + if width <= 0 or height <= 0: + msg = "not a GIMP brush" + raise SyntaxError(msg) + if color_depth not in (1, 4): + msg = f"Unsupported GIMP brush color depth: {color_depth}" + raise SyntaxError(msg) + + if version == 1: + comment_length = header_size - 20 + else: + comment_length = header_size - 28 + magic_number = self.fp.read(4) + if magic_number != b"GIMP": + msg = "not a GIMP brush, bad magic number" + raise SyntaxError(msg) + self.info["spacing"] = i32(self.fp.read(4)) + + comment = self.fp.read(comment_length)[:-1] + + if color_depth == 1: + self.mode = "L" + else: + self.mode = "RGBA" + + self._size = width, height + + self.info["comment"] = comment + + # Image might not be small + Image._decompression_bomb_check(self.size) + + # Data is an uncompressed block of w * h * bytes/pixel + self._data_size = width * height * color_depth + + def load(self): + if not self.im: + self.im = Image.core.new(self.mode, self.size) + self.frombytes(self.fp.read(self._data_size)) + return Image.Image.load(self) + + +# +# registry + + +Image.register_open(GbrImageFile.format, GbrImageFile, _accept) +Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/.venv/Lib/site-packages/PIL/GdImageFile.py b/.venv/Lib/site-packages/PIL/GdImageFile.py new file mode 100644 index 00000000..7dda4f14 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/GdImageFile.py @@ -0,0 +1,97 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GD file handling +# +# History: +# 1996-04-12 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +""" +.. note:: + This format cannot be automatically recognized, so the + class is not registered for use with :py:func:`PIL.Image.open()`. To open a + gd file, use the :py:func:`PIL.GdImageFile.open()` function instead. + +.. warning:: + THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This + implementation is provided for convenience and demonstrational + purposes only. +""" + + +from . import ImageFile, ImagePalette, UnidentifiedImageError +from ._binary import i16be as i16 +from ._binary import i32be as i32 + + +class GdImageFile(ImageFile.ImageFile): + """ + Image plugin for the GD uncompressed format. Note that this format + is not supported by the standard :py:func:`PIL.Image.open()` function. To use + this plugin, you have to import the :py:mod:`PIL.GdImageFile` module and + use the :py:func:`PIL.GdImageFile.open()` function. + """ + + format = "GD" + format_description = "GD uncompressed images" + + def _open(self): + # Header + s = self.fp.read(1037) + + if not i16(s) in [65534, 65535]: + msg = "Not a valid GD 2.x .gd file" + raise SyntaxError(msg) + + self.mode = "L" # FIXME: "P" + self._size = i16(s, 2), i16(s, 4) + + true_color = s[6] + true_color_offset = 2 if true_color else 0 + + # transparency index + tindex = i32(s, 7 + true_color_offset) + if tindex < 256: + self.info["transparency"] = tindex + + self.palette = ImagePalette.raw( + "XBGR", s[7 + true_color_offset + 4 : 7 + true_color_offset + 4 + 256 * 4] + ) + + self.tile = [ + ( + "raw", + (0, 0) + self.size, + 7 + true_color_offset + 4 + 256 * 4, + ("L", 0, 1), + ) + ] + + +def open(fp, mode="r"): + """ + Load texture from a GD image file. + + :param fp: GD file name, or an opened file handle. + :param mode: Optional mode. In this version, if the mode argument + is given, it must be "r". + :returns: An image instance. + :raises OSError: If the image could not be read. + """ + if mode != "r": + msg = "bad mode" + raise ValueError(msg) + + try: + return GdImageFile(fp) + except SyntaxError as e: + msg = "cannot identify this image file" + raise UnidentifiedImageError(msg) from e diff --git a/.venv/Lib/site-packages/PIL/GifImagePlugin.py b/.venv/Lib/site-packages/PIL/GifImagePlugin.py new file mode 100644 index 00000000..eadee156 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/GifImagePlugin.py @@ -0,0 +1,1064 @@ +# +# 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. +# + +import itertools +import math +import os +import subprocess +from enum import IntEnum + +from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence +from ._binary import i16le as i16 +from ._binary import o8 +from ._binary import o16le as o16 + + +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): + 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): + s = self.fp.read(1) + if s and s[0]: + return self.fp.read(s[0]) + return None + + def _is_palette_needed(self, p): + 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): + # 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 = None + self._is_animated = None + self._seek(0) # get ready to read first frame + + @property + def n_frames(self): + 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 + + @property + def is_animated(self): + if self._is_animated is None: + if self._n_frames is not None: + self._is_animated = self._n_frames != 1 + else: + current = self.tell() + if current: + self._is_animated = True + else: + try: + self._seek(1, False) + self._is_animated = True + except EOFError: + self._is_animated = False + + self.seek(current) + return self._is_animated + + def seek(self, frame): + 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, update_image=True): + if frame == 0: + # rewind + self.__offset = 0 + self.dispose = 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";": + raise EOFError + + palette = None + + info = {} + 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: + # + # 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: + # + # application extension + # + info["extension"] = block, self.fp.tell() + if block[:11] == b"NETSCAPE2.0": + block = self.data() + if 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 + + else: + pass + # raise OSError, "illegal GIF tag `%x`" % s[0] + s = None + + if interlace is None: + # self._fp = None + raise EOFError + + 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): + if self._frame_palette: + color = tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]) + else: + color = (color, color, color) + return color + + self.dispose_extent = frame_dispose_extent + try: + if self.disposal_method < 2: + # do not dispose or none specified + self.dispose = None + elif 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): + 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(*self._frame_palette.getdata()) + else: + self.im = None + self.mode = temp_mode + self._frame_palette = None + + super().load_prepare() + + def load_end(self): + 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") + 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): + return self.__frame + + +# -------------------------------------------------------------------- +# Write GIF files + + +RAWMODE = {"1": "L", "L": "L", "P": "P"} + + +def _normalize_mode(im): + """ + 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") + + +def _normalize_palette(im, palette, info): + """ + 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) + + if palette: + used_palette_colors = [] + 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: + return im.remap_palette(used_palette_colors, source_palette) + + im.palette.palette = source_palette + return im + + +def _write_single_frame(im, fp, palette): + 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, im_frame): + if _get_palette_bytes(im_frame) == _get_palette_bytes(base_im): + delta = ImageChops.subtract_modulo(im_frame, base_im) + else: + delta = ImageChops.subtract_modulo( + im_frame.convert("RGB"), base_im.convert("RGB") + ) + return delta.getbbox() + + +def _write_multiple_frames(im, fp, palette): + duration = im.encoderinfo.get("duration") + disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) + + im_frames = [] + 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() + im_frame = _normalize_palette(im_frame, palette, encoderinfo) + if "transparency" in im_frame.info: + encoderinfo.setdefault("transparency", im_frame.info["transparency"]) + 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 + + if im_frames: + # delta frame + previous = im_frames[-1] + bbox = _getbbox(previous["im"], im_frame) + if not bbox: + # This frame is identical to the previous frame + if encoderinfo.get("duration"): + previous["encoderinfo"]["duration"] += encoderinfo["duration"] + continue + if 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) + else: + bbox = None + im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) + + if len(im_frames) > 1: + 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 + elif "duration" in im.encoderinfo and isinstance( + im.encoderinfo["duration"], (list, tuple) + ): + # Since multiple frames will not be written, add together the frame durations + im.encoderinfo["duration"] = sum(im.encoderinfo["duration"]) + + +def _save_all(im, fp, filename): + _save(im, fp, filename, save_all=True) + + +def _save(im, fp, filename, save_all=False): + # 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["optimize"] = im.encoderinfo.get("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): + interlace = im.encoderinfo.get("interlace", 1) + + # workaround for @PIL153 + if min(im.size) < 16: + interlace = 0 + + return interlace + + +def _write_local_header(fp, im, offset, flags): + transparent_color_exists = False + try: + if "transparency" in im.encoderinfo: + transparency = im.encoderinfo["transparency"] + else: + transparency = im.info["transparency"] + transparency = int(transparency) + except (KeyError, ValueError): + pass + else: + # optimize the block away if transparent color is not used + transparent_color_exists = True + + used_palette_colors = _get_optimize(im, im.encoderinfo) + if used_palette_colors is not None: + # adjust the transparency index after optimize + try: + transparency = used_palette_colors.index(transparency) + except ValueError: + transparent_color_exists = False + + if "duration" in im.encoderinfo: + duration = int(im.encoderinfo["duration"] / 10) + else: + duration = 0 + + disposal = int(im.encoderinfo.get("disposal", 0)) + + if transparent_color_exists or duration != 0 or disposal: + packed_flag = 1 if transparent_color_exists else 0 + packed_flag |= disposal << 2 + if not transparent_color_exists: + transparency = 0 + + fp.write( + b"!" + + o8(249) # extension intro + + o8(4) # length + + o8(packed_flag) # packed fields + + o16(duration) # duration + + o8(transparency) # 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, fp, filename): + # 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 + 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, info): + """ + 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", 0): + # 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 + + +def _get_color_table_size(palette_bytes): + # 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): + """ + 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): + """ + 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 + + +def _get_background(im, info_background): + 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, info): + """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 "loop" in info + 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 "loop" in info: + 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, im_frame, offset, params): + 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, palette=None, info=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) + + """ + used_palette_colors = _get_optimize(im, info) + + if info is None: + 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, offset=(0, 0), **params): + """ + 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 + + """ + + class Collector: + data = [] + + def write(self, data): + self.data.append(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/site-packages/PIL/GimpGradientFile.py b/.venv/Lib/site-packages/PIL/GimpGradientFile.py new file mode 100644 index 00000000..8e801be0 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/GimpGradientFile.py @@ -0,0 +1,137 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read (and render) GIMP gradient 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. +# + +""" +Stuff to translate curve segments to palette values (derived from +the corresponding code in GIMP, written by Federico Mena Quintero. +See the GIMP distribution for more information.) +""" + + +from math import log, pi, sin, sqrt + +from ._binary import o8 + +EPSILON = 1e-10 +"""""" # Enable auto-doc for data member + + +def linear(middle, pos): + if pos <= middle: + if middle < EPSILON: + return 0.0 + else: + return 0.5 * pos / middle + else: + pos = pos - middle + middle = 1.0 - middle + if middle < EPSILON: + return 1.0 + else: + return 0.5 + 0.5 * pos / middle + + +def curved(middle, pos): + return pos ** (log(0.5) / log(max(middle, EPSILON))) + + +def sine(middle, pos): + return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 + + +def sphere_increasing(middle, pos): + return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) + + +def sphere_decreasing(middle, pos): + return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) + + +SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] +"""""" # Enable auto-doc for data member + + +class GradientFile: + gradient = None + + def getpalette(self, entries=256): + palette = [] + + ix = 0 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + for i in range(entries): + x = i / (entries - 1) + + while x1 < x: + ix += 1 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + w = x1 - x0 + + if w < EPSILON: + scale = segment(0.5, 0.5) + else: + scale = segment((xm - x0) / w, (x - x0) / w) + + # expand to RGBA + r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) + g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) + b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) + a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) + + # add to palette + palette.append(r + g + b + a) + + return b"".join(palette), "RGBA" + + +class GimpGradientFile(GradientFile): + """File handler for GIMP's gradient format.""" + + def __init__(self, fp): + if fp.readline()[:13] != b"GIMP Gradient": + msg = "not a GIMP gradient file" + raise SyntaxError(msg) + + line = fp.readline() + + # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do + if line.startswith(b"Name: "): + line = fp.readline().strip() + + count = int(line) + + gradient = [] + + for i in range(count): + s = fp.readline().split() + w = [float(x) for x in s[:11]] + + x0, x1 = w[0], w[2] + xm = w[1] + rgb0 = w[3:7] + rgb1 = w[7:11] + + segment = SEGMENTS[int(s[11])] + cspace = int(s[12]) + + if cspace != 0: + msg = "cannot handle HSV colour space" + raise OSError(msg) + + gradient.append((x0, x1, xm, rgb0, rgb1, segment)) + + self.gradient = gradient diff --git a/.venv/Lib/site-packages/PIL/GimpPaletteFile.py b/.venv/Lib/site-packages/PIL/GimpPaletteFile.py new file mode 100644 index 00000000..d3889289 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/GimpPaletteFile.py @@ -0,0 +1,56 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read GIMP palette files +# +# History: +# 1997-08-23 fl Created +# 2004-09-07 fl Support GIMP 2.0 palette files. +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1997-2004. +# +# See the README file for information on usage and redistribution. +# + +import re + +from ._binary import o8 + + +class GimpPaletteFile: + """File handler for GIMP's palette format.""" + + rawmode = "RGB" + + def __init__(self, fp): + self.palette = [o8(i) * 3 for i in range(256)] + + if fp.readline()[:12] != b"GIMP Palette": + msg = "not a GIMP palette file" + raise SyntaxError(msg) + + for i in range(256): + s = fp.readline() + if not s: + break + + # skip fields and comment lines + if re.match(rb"\w+:|#", s): + continue + if len(s) > 100: + msg = "bad palette file" + raise SyntaxError(msg) + + v = tuple(map(int, s.split()[:3])) + if len(v) != 3: + msg = "bad palette entry" + raise ValueError(msg) + + self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) + + self.palette = b"".join(self.palette) + + def getpalette(self): + return self.palette, self.rawmode diff --git a/.venv/Lib/site-packages/PIL/GribStubImagePlugin.py b/.venv/Lib/site-packages/PIL/GribStubImagePlugin.py new file mode 100644 index 00000000..8a799f19 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/GribStubImagePlugin.py @@ -0,0 +1,73 @@ +# +# The Python Imaging Library +# $Id$ +# +# GRIB stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific GRIB image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix): + return prefix[:4] == b"GRIB" and prefix[7] == 1 + + +class GribStubImageFile(ImageFile.StubImageFile): + format = "GRIB" + format_description = "GRIB" + + def _open(self): + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + msg = "Not a GRIB 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): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr(_handler, "save"): + msg = "GRIB save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) +Image.register_save(GribStubImageFile.format, _save) + +Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/.venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py b/.venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py new file mode 100644 index 00000000..bba05ed6 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py @@ -0,0 +1,73 @@ +# +# The Python Imaging Library +# $Id$ +# +# HDF5 stub adapter +# +# Copyright (c) 2000-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific HDF5 image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix): + return prefix[:8] == b"\x89HDF\r\n\x1a\n" + + +class HDF5StubImageFile(ImageFile.StubImageFile): + format = "HDF5" + format_description = "HDF5" + + def _open(self): + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + msg = "Not an HDF 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): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr(_handler, "save"): + msg = "HDF5 save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) +Image.register_save(HDF5StubImageFile.format, _save) + +Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/.venv/Lib/site-packages/PIL/IcnsImagePlugin.py b/.venv/Lib/site-packages/PIL/IcnsImagePlugin.py new file mode 100644 index 00000000..c2f050ed --- /dev/null +++ b/.venv/Lib/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. +# + +import io +import os +import struct +import sys + +from PIL import Image, ImageFile, PngImagePlugin, features + +enable_jpeg2k = features.check_codec("jpg_2000") +if enable_jpeg2k: + from PIL 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): + 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, fp, filename): + """ + 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": type, "size": HEADERSIZE + len(stream), "stream": stream} + ) + + # Header + fp.write(MAGIC) + file_length = HEADERSIZE # Header + file_length += HEADERSIZE + 8 * len(entries) # TOC + file_length += sum(entry["size"] 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["type"]) + fp.write(struct.pack(">i", entry["size"])) + + # Data + for entry in entries: + fp.write(entry["type"]) + fp.write(struct.pack(">i", entry["size"])) + fp.write(entry["stream"]) + + if hasattr(fp, "flush"): + fp.flush() + + +def _accept(prefix): + 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"]: + imf.size = size + imf.save("out-%s-%s-%s.png" % size) + 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/site-packages/PIL/IcoImagePlugin.py b/.venv/Lib/site-packages/PIL/IcoImagePlugin.py new file mode 100644 index 00000000..a188f8fd --- /dev/null +++ b/.venv/Lib/site-packages/PIL/IcoImagePlugin.py @@ -0,0 +1,358 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Icon support for PIL +# +# 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. +# + +# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis +# . +# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki +# +# Icon format references: +# * https://en.wikipedia.org/wiki/ICO_(file_format) +# * https://msdn.microsoft.com/en-us/library/ms997538.aspx + + +import warnings +from io import BytesIO +from math import ceil, log + +from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin +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 + +# +# -------------------------------------------------------------------- + +_MAGIC = b"\0\0\1\0" + + +def _save(im, fp, filename): + fp.write(_MAGIC) # (2+2) + bmp = im.encoderinfo.get("bitmap_format") == "bmp" + sizes = im.encoderinfo.get( + "sizes", + [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], + ) + frames = [] + provided_ims = [im] + im.encoderinfo.get("append_images", []) + width, height = im.size + for size in sorted(set(sizes)): + if size[0] > width or size[1] > height or size[0] > 256 or size[1] > 256: + continue + + for provided_im in provided_ims: + if provided_im.size != size: + continue + frames.append(provided_im) + if bmp: + bits = BmpImagePlugin.SAVE[provided_im.mode][1] + bits_used = [bits] + for other_im in provided_ims: + if other_im.size != size: + continue + bits = BmpImagePlugin.SAVE[other_im.mode][1] + if bits not in bits_used: + # Another image has been supplied for this size + # with a different bit depth + frames.append(other_im) + bits_used.append(bits) + break + else: + # TODO: invent a more convenient method for proportional scalings + frame = provided_im.copy() + frame.thumbnail(size, Image.Resampling.LANCZOS, reducing_gap=None) + frames.append(frame) + fp.write(o16(len(frames))) # idCount(2) + offset = fp.tell() + len(frames) * 16 + for frame in frames: + width, height = frame.size + # 0 means 256 + fp.write(o8(width if width < 256 else 0)) # bWidth(1) + fp.write(o8(height if height < 256 else 0)) # bHeight(1) + + bits, colors = BmpImagePlugin.SAVE[frame.mode][1:] if bmp else (32, 0) + fp.write(o8(colors)) # bColorCount(1) + fp.write(b"\0") # bReserved(1) + fp.write(b"\0\0") # wPlanes(2) + fp.write(o16(bits)) # wBitCount(2) + + image_io = BytesIO() + if bmp: + frame.save(image_io, "dib") + + if bits != 32: + and_mask = Image.new("1", size) + ImageFile._save( + and_mask, image_io, [("raw", (0, 0) + size, 0, ("1", 0, -1))] + ) + else: + frame.save(image_io, "png") + image_io.seek(0) + image_bytes = image_io.read() + if bmp: + image_bytes = image_bytes[:8] + o32(height * 2) + image_bytes[12:] + bytes_len = len(image_bytes) + fp.write(o32(bytes_len)) # dwBytesInRes(4) + fp.write(o32(offset)) # dwImageOffset(4) + current = fp.tell() + fp.seek(offset) + fp.write(image_bytes) + offset = offset + bytes_len + fp.seek(current) + + +def _accept(prefix): + return prefix[:4] == _MAGIC + + +class IcoFile: + def __init__(self, buf): + """ + Parse image from file-like object containing ico file data + """ + + # check magic + s = buf.read(6) + if not _accept(s): + msg = "not an ICO file" + raise SyntaxError(msg) + + self.buf = buf + self.entry = [] + + # Number of items in file + self.nb_items = i16(s, 4) + + # Get headers for each item + for i in range(self.nb_items): + s = buf.read(16) + + icon_header = { + "width": s[0], + "height": s[1], + "nb_color": s[2], # No. of colors in image (0 if >=8bpp) + "reserved": s[3], + "planes": i16(s, 4), + "bpp": i16(s, 6), + "size": i32(s, 8), + "offset": i32(s, 12), + } + + # See Wikipedia + for j in ("width", "height"): + if not icon_header[j]: + icon_header[j] = 256 + + # See Wikipedia notes about color depth. + # We need this just to differ images with equal sizes + icon_header["color_depth"] = ( + icon_header["bpp"] + or ( + icon_header["nb_color"] != 0 + and ceil(log(icon_header["nb_color"], 2)) + ) + or 256 + ) + + icon_header["dim"] = (icon_header["width"], icon_header["height"]) + icon_header["square"] = icon_header["width"] * icon_header["height"] + + self.entry.append(icon_header) + + self.entry = sorted(self.entry, key=lambda x: x["color_depth"]) + # ICO images are usually squares + # self.entry = sorted(self.entry, key=lambda x: x['width']) + self.entry = sorted(self.entry, key=lambda x: x["square"]) + self.entry.reverse() + + def sizes(self): + """ + Get a list of all available icon sizes and color depths. + """ + return {(h["width"], h["height"]) for h in self.entry} + + def getentryindex(self, size, bpp=False): + for i, h in enumerate(self.entry): + if size == h["dim"] and (bpp is False or bpp == h["color_depth"]): + return i + return 0 + + def getimage(self, size, bpp=False): + """ + Get an image from the icon + """ + return self.frame(self.getentryindex(size, bpp)) + + def frame(self, idx): + """ + Get an image from frame idx + """ + + header = self.entry[idx] + + self.buf.seek(header["offset"]) + data = self.buf.read(8) + self.buf.seek(header["offset"]) + + if data[:8] == PngImagePlugin._MAGIC: + # png frame + im = PngImagePlugin.PngImageFile(self.buf) + Image._decompression_bomb_check(im.size) + else: + # XOR + AND mask bmp frame + im = BmpImagePlugin.DibImageFile(self.buf) + Image._decompression_bomb_check(im.size) + + # change tile dimension to only encompass XOR image + im._size = (im.size[0], int(im.size[1] / 2)) + d, e, o, a = im.tile[0] + im.tile[0] = d, (0, 0) + im.size, o, a + + # figure out where AND mask image starts + bpp = header["bpp"] + if 32 == bpp: + # 32-bit color depth icon image allows semitransparent areas + # PIL's DIB format ignores transparency bits, recover them. + # The DIB is packed in BGRX byte order where X is the alpha + # channel. + + # Back up to start of bmp data + self.buf.seek(o) + # extract every 4th byte (eg. 3,7,11,15,...) + alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] + + # convert to an 8bpp grayscale image + mask = Image.frombuffer( + "L", # 8bpp + im.size, # (w, h) + alpha_bytes, # source chars + "raw", # raw decoder + ("L", 0, -1), # 8bpp inverted, unpadded, reversed + ) + else: + # get AND image from end of bitmap + w = im.size[0] + if (w % 32) > 0: + # bitmap row data is aligned to word boundaries + w += 32 - (im.size[0] % 32) + + # the total mask data is + # padded row size * height / bits per char + + total_bytes = int((w * im.size[1]) / 8) + and_mask_offset = header["offset"] + header["size"] - total_bytes + + self.buf.seek(and_mask_offset) + mask_data = self.buf.read(total_bytes) + + # convert raw data to image + mask = Image.frombuffer( + "1", # 1 bpp + im.size, # (w, h) + mask_data, # source chars + "raw", # raw decoder + ("1;I", int(w / 8), -1), # 1bpp inverted, padded, reversed + ) + + # now we have two images, im is XOR image and mask is AND image + + # apply mask image as alpha channel + im = im.convert("RGBA") + im.putalpha(mask) + + return im + + +## +# Image plugin for Windows Icon files. + + +class IcoImageFile(ImageFile.ImageFile): + """ + PIL read-only image support for Microsoft Windows .ico files. + + By default the largest resolution image in the file will be loaded. This + can be changed by altering the 'size' attribute before calling 'load'. + + The info dictionary has a key 'sizes' that is a list of the sizes available + in the icon file. + + Handles classic, XP and Vista icon formats. + + When saving, PNG compression is used. Support for this was only added in + Windows Vista. If you are unable to view the icon in Windows, convert the + image to "RGBA" mode before saving. + + This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis + . + https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki + """ + + format = "ICO" + format_description = "Windows Icon" + + def _open(self): + self.ico = IcoFile(self.fp) + self.info["sizes"] = self.ico.sizes() + self.size = self.ico.entry[0]["dim"] + self.load() + + @property + def size(self): + return self._size + + @size.setter + def size(self, value): + if value 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 self.im is not None and self.im.size == self.size: + # Already loaded + return Image.Image.load(self) + im = self.ico.getimage(self.size) + # if tile is PNG, it won't really be loaded yet + im.load() + self.im = im.im + self.pyaccess = None + self.mode = im.mode + if im.size != self.size: + warnings.warn("Image was not the expected size") + + index = self.ico.getentryindex(self.size) + sizes = list(self.info["sizes"]) + sizes[index] = im.size + self.info["sizes"] = set(sizes) + + self.size = im.size + + def load_seek(self): + # Flag the ImageFile.Parser so that it + # just does all the decode at the end. + pass + + +# +# -------------------------------------------------------------------- + + +Image.register_open(IcoImageFile.format, IcoImageFile, _accept) +Image.register_save(IcoImageFile.format, _save) +Image.register_extension(IcoImageFile.format, ".ico") + +Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/.venv/Lib/site-packages/PIL/ImImagePlugin.py b/.venv/Lib/site-packages/PIL/ImImagePlugin.py new file mode 100644 index 00000000..746743f6 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImImagePlugin.py @@ -0,0 +1,371 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IFUNC IM file handling for PIL +# +# history: +# 1995-09-01 fl Created. +# 1997-01-03 fl Save palette images +# 1997-01-08 fl Added sequence support +# 1997-01-23 fl Added P and RGB save support +# 1997-05-31 fl Read floating point images +# 1997-06-22 fl Save floating point images +# 1997-08-27 fl Read and save 1-bit images +# 1998-06-25 fl Added support for RGB+LUT images +# 1998-07-02 fl Added support for YCC images +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 1998-12-29 fl Added I;16 support +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# 2003-09-26 fl Added LA/PA support +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +import os +import re + +from . import Image, ImageFile, ImagePalette + +# -------------------------------------------------------------------- +# Standard tags + +COMMENT = "Comment" +DATE = "Date" +EQUIPMENT = "Digitalization equipment" +FRAMES = "File size (no of images)" +LUT = "Lut" +NAME = "Name" +SCALE = "Scale (x,y)" +SIZE = "Image size (x*y)" +MODE = "Image type" + +TAGS = { + COMMENT: 0, + DATE: 0, + EQUIPMENT: 0, + FRAMES: 0, + LUT: 0, + NAME: 0, + SCALE: 0, + SIZE: 0, + MODE: 0, +} + +OPEN = { + # ifunc93/p3cfunc formats + "0 1 image": ("1", "1"), + "L 1 image": ("1", "1"), + "Greyscale image": ("L", "L"), + "Grayscale image": ("L", "L"), + "RGB image": ("RGB", "RGB;L"), + "RLB image": ("RGB", "RLB"), + "RYB image": ("RGB", "RLB"), + "B1 image": ("1", "1"), + "B2 image": ("P", "P;2"), + "B4 image": ("P", "P;4"), + "X 24 image": ("RGB", "RGB"), + "L 32 S image": ("I", "I;32"), + "L 32 F image": ("F", "F;32"), + # old p3cfunc formats + "RGB3 image": ("RGB", "RGB;T"), + "RYB3 image": ("RGB", "RYB;T"), + # extensions + "LA image": ("LA", "LA;L"), + "PA image": ("LA", "PA;L"), + "RGBA image": ("RGBA", "RGBA;L"), + "RGBX image": ("RGBX", "RGBX;L"), + "CMYK image": ("CMYK", "CMYK;L"), + "YCC image": ("YCbCr", "YCbCr;L"), +} + +# ifunc95 extensions +for i in ["8", "8S", "16", "16S", "32", "32F"]: + OPEN[f"L {i} image"] = ("F", f"F;{i}") + OPEN[f"L*{i} image"] = ("F", f"F;{i}") +for i in ["16", "16L", "16B"]: + OPEN[f"L {i} image"] = (f"I;{i}", f"I;{i}") + OPEN[f"L*{i} image"] = (f"I;{i}", f"I;{i}") +for i in ["32S"]: + OPEN[f"L {i} image"] = ("I", f"I;{i}") + OPEN[f"L*{i} image"] = ("I", f"I;{i}") +for i in range(2, 33): + OPEN[f"L*{i} image"] = ("F", f"F;{i}") + + +# -------------------------------------------------------------------- +# Read IM directory + +split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") + + +def number(s): + try: + return int(s) + except ValueError: + return float(s) + + +## +# Image plugin for the IFUNC IM file format. + + +class ImImageFile(ImageFile.ImageFile): + format = "IM" + format_description = "IFUNC Image Memory" + _close_exclusive_fp_after_loading = False + + def _open(self): + # Quick rejection: if there's not an LF among the first + # 100 bytes, this is (probably) not a text header. + + if b"\n" not in self.fp.read(100): + msg = "not an IM file" + raise SyntaxError(msg) + self.fp.seek(0) + + n = 0 + + # Default values + self.info[MODE] = "L" + self.info[SIZE] = (512, 512) + self.info[FRAMES] = 1 + + self.rawmode = "L" + + while True: + s = self.fp.read(1) + + # Some versions of IFUNC uses \n\r instead of \r\n... + if s == b"\r": + continue + + if not s or s == b"\0" or s == b"\x1A": + break + + # FIXME: this may read whole file if not a text file + s = s + self.fp.readline() + + if len(s) > 100: + msg = "not an IM file" + raise SyntaxError(msg) + + if s[-2:] == b"\r\n": + s = s[:-2] + elif s[-1:] == b"\n": + s = s[:-1] + + try: + m = split.match(s) + except re.error as e: + msg = "not an IM file" + raise SyntaxError(msg) from e + + if m: + k, v = m.group(1, 2) + + # Don't know if this is the correct encoding, + # but a decent guess (I guess) + k = k.decode("latin-1", "replace") + v = v.decode("latin-1", "replace") + + # Convert value as appropriate + if k in [FRAMES, SCALE, SIZE]: + v = v.replace("*", ",") + v = tuple(map(number, v.split(","))) + if len(v) == 1: + v = v[0] + elif k == MODE and v in OPEN: + v, self.rawmode = OPEN[v] + + # Add to dictionary. Note that COMMENT tags are + # combined into a list of strings. + if k == COMMENT: + if k in self.info: + self.info[k].append(v) + else: + self.info[k] = [v] + else: + self.info[k] = v + + if k in TAGS: + n += 1 + + else: + msg = "Syntax error in IM header: " + s.decode("ascii", "replace") + raise SyntaxError(msg) + + if not n: + msg = "Not an IM file" + raise SyntaxError(msg) + + # Basic attributes + self._size = self.info[SIZE] + self.mode = self.info[MODE] + + # Skip forward to start of image data + while s and s[:1] != b"\x1A": + s = self.fp.read(1) + if not s: + msg = "File truncated" + raise SyntaxError(msg) + + if LUT in self.info: + # convert lookup table to palette or lut attribute + palette = self.fp.read(768) + greyscale = 1 # greyscale palette + linear = 1 # linear greyscale palette + for i in range(256): + if palette[i] == palette[i + 256] == palette[i + 512]: + if palette[i] != i: + linear = 0 + else: + greyscale = 0 + if self.mode in ["L", "LA", "P", "PA"]: + if greyscale: + if not linear: + self.lut = list(palette[:256]) + else: + if self.mode in ["L", "P"]: + self.mode = self.rawmode = "P" + elif self.mode in ["LA", "PA"]: + self.mode = "PA" + self.rawmode = "PA;L" + self.palette = ImagePalette.raw("RGB;L", palette) + elif self.mode == "RGB": + if not greyscale or not linear: + self.lut = list(palette) + + self.frame = 0 + + self.__offset = offs = self.fp.tell() + + self._fp = self.fp # FIXME: hack + + if self.rawmode[:2] == "F;": + # ifunc95 formats + try: + # use bit decoder (if necessary) + bits = int(self.rawmode[2:]) + if bits not in [8, 16, 32]: + self.tile = [("bit", (0, 0) + self.size, offs, (bits, 8, 3, 0, -1))] + return + except ValueError: + pass + + if self.rawmode in ["RGB;T", "RYB;T"]: + # Old LabEye/3PC files. Would be very surprised if anyone + # ever stumbled upon such a file ;-) + size = self.size[0] * self.size[1] + self.tile = [ + ("raw", (0, 0) + self.size, offs, ("G", 0, -1)), + ("raw", (0, 0) + self.size, offs + size, ("R", 0, -1)), + ("raw", (0, 0) + self.size, offs + 2 * size, ("B", 0, -1)), + ] + else: + # LabEye/IFUNC files + self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))] + + @property + def n_frames(self): + return self.info[FRAMES] + + @property + def is_animated(self): + return self.info[FRAMES] > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + + self.frame = frame + + if self.mode == "1": + bits = 1 + else: + bits = 8 * len(self.mode) + + size = ((self.size[0] * bits + 7) // 8) * self.size[1] + offs = self.__offset + frame * size + + self.fp = self._fp + + self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))] + + def tell(self): + return self.frame + + +# +# -------------------------------------------------------------------- +# Save IM files + + +SAVE = { + # mode: (im type, raw mode) + "1": ("0 1", "1"), + "L": ("Greyscale", "L"), + "LA": ("LA", "LA;L"), + "P": ("Greyscale", "P"), + "PA": ("LA", "PA;L"), + "I": ("L 32S", "I;32S"), + "I;16": ("L 16", "I;16"), + "I;16L": ("L 16L", "I;16L"), + "I;16B": ("L 16B", "I;16B"), + "F": ("L 32F", "F;32F"), + "RGB": ("RGB", "RGB;L"), + "RGBA": ("RGBA", "RGBA;L"), + "RGBX": ("RGBX", "RGBX;L"), + "CMYK": ("CMYK", "CMYK;L"), + "YCbCr": ("YCC", "YCbCr;L"), +} + + +def _save(im, fp, filename): + try: + image_type, rawmode = SAVE[im.mode] + except KeyError as e: + msg = f"Cannot save {im.mode} images as IM" + raise ValueError(msg) from e + + frames = im.encoderinfo.get("frames", 1) + + fp.write(f"Image type: {image_type} image\r\n".encode("ascii")) + if filename: + # Each line must be 100 characters or less, + # or: SyntaxError("not an IM file") + # 8 characters are used for "Name: " and "\r\n" + # Keep just the filename, ditch the potentially overlong path + name, ext = os.path.splitext(os.path.basename(filename)) + name = "".join([name[: 92 - len(ext)], ext]) + + fp.write(f"Name: {name}\r\n".encode("ascii")) + fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode("ascii")) + fp.write(f"File size (no of images): {frames}\r\n".encode("ascii")) + if im.mode in ["P", "PA"]: + fp.write(b"Lut: 1\r\n") + fp.write(b"\000" * (511 - fp.tell()) + b"\032") + if im.mode in ["P", "PA"]: + im_palette = im.im.getpalette("RGB", "RGB;L") + colors = len(im_palette) // 3 + palette = b"" + for i in range(3): + palette += im_palette[colors * i : colors * (i + 1)] + palette += b"\x00" * (256 - colors) + fp.write(palette) # 768 bytes + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, -1))]) + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(ImImageFile.format, ImImageFile) +Image.register_save(ImImageFile.format, _save) + +Image.register_extension(ImImageFile.format, ".im") diff --git a/.venv/Lib/site-packages/PIL/Image.py b/.venv/Lib/site-packages/PIL/Image.py new file mode 100644 index 00000000..4a142a00 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/Image.py @@ -0,0 +1,3928 @@ +# +# 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. +# + +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 pathlib import Path + +try: + import defusedxml.ElementTree as ElementTree +except ImportError: + ElementTree = None + +# 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 ._util import DeferredError, is_path + + +def __getattr__(name): + categories = {"NORMAL": 0, "SEQUENCE": 1, "CONTAINER": 2} + if name in categories: + deprecate("Image categories", 10, "is_animated", plural=True) + return categories[name] + old_resampling = { + "LINEAR": "BILINEAR", + "CUBIC": "BICUBIC", + "ANTIALIAS": "LANCZOS", + } + if name in old_resampling: + deprecate( + name, 10, f"{old_resampling[name]} or Resampling.{old_resampling[name]}" + ) + return Resampling[old_resampling[name]] + msg = f"module '{__name__}' has no attribute '{name}'" + raise AttributeError(msg) + + +logger = logging.getLogger(__name__) + + +class DecompressionBombWarning(RuntimeWarning): + pass + + +class DecompressionBombError(Exception): + pass + + +# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image +MAX_IMAGE_PIXELS = 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(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 + + +# works everywhere, win for pypy, not cpython +USE_CFFI_ACCESS = hasattr(sys, "pypy_version_info") +try: + import cffi +except ImportError: + cffi = None + + +def isImageType(t): + """ + 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 + +ID = [] +OPEN = {} +MIME = {} +SAVE = {} +SAVE_ALL = {} +EXTENSION = {} +DECODERS = {} +ENCODERS = {} + +# -------------------------------------------------------------------- +# 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", "L", "LAB", "P", "RGB", "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): + """ + 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): + """ + 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): + """ + 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): + """ + 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(): + """Explicitly load standard file format drivers.""" + + 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 + # try: + # import TiffImagePlugin + # assert TiffImagePlugin + # except ImportError: + # pass + + _initialized = 1 + + +def init(): + """ + Explicitly initializes the Python Imaging Library. This function + loads all available file format drivers. + """ + + global _initialized + if _initialized >= 2: + return 0 + + for plugin in _plugins: + try: + logger.debug("Importing %s", plugin) + __import__(f"PIL.{plugin}", globals(), locals(), []) + except ImportError as e: + logger.debug("Image: failed to import %s: %s", plugin, e) + + if OPEN or SAVE: + _initialized = 2 + return 1 + + +# -------------------------------------------------------------------- +# Codec factories (used by tobytes/frombytes and ImageFile.load) + + +def _getdecoder(mode, decoder_name, args, extra=()): + # 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, 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, encoder_name, args, extra=()): + # 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, 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 + + +def coerce_e(value): + deprecate("coerce_e", 10) + return value if isinstance(value, _E) else _E(1, value) + + +# _E(scale, offset) represents the affine transformation scale * x + offset. +# The "data" field is named for compatibility with the old implementation, +# and should be renamed once coerce_e is removed. +class _E: + def __init__(self, scale, data): + self.scale = scale + self.data = data + + def __neg__(self): + return _E(-self.scale, -self.data) + + def __add__(self, other): + if isinstance(other, _E): + return _E(self.scale + other.scale, self.data + other.data) + return _E(self.scale, self.data + 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.data * other) + + __rmul__ = __mul__ + + def __truediv__(self, other): + if isinstance(other, _E): + return NotImplemented + return _E(self.scale / other, self.data / other) + + +def _getscaleoffset(expr): + a = expr(_E(1, 0)) + return (a.scale, a.data) if isinstance(a, _E) else (0, a) + + +# -------------------------------------------------------------------- +# Implementation wrapper + + +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 = None + format_description = 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._category = 0 + self.readonly = 0 + self.pyaccess = None + self._exif = None + + def __getattr__(self, name): + if name == "category": + deprecate("Image categories", 10, "is_animated", plural=True) + return self._category + raise AttributeError(name) + + @property + def width(self): + return self.size[0] + + @property + def height(self): + return self.size[1] + + @property + def size(self): + return self._size + + def _new(self, im): + 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 __exit__(self, *args): + if hasattr(self, "fp") and getattr(self, "_exclusive_fp", False): + 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() + self.fp = None + + def close(self): + """ + 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. + """ + try: + 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() + 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): + self.load() + self.im = self.im.copy() + self.pyaccess = None + self.readonly = 0 + + def _ensure_mutable(self): + if self.readonly: + self._copy() + else: + self.load() + + def _dump(self, file=None, format=None, **options): + suffix = "" + if format: + suffix = "." + 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): + return ( + self.__class__ is other.__class__ + and self.mode == other.mode + and self.size == other.size + and self.info == other.info + and self._category == other._category + and self.getpalette() == other.getpalette() + and self.tobytes() == other.tobytes() + ) + + def __repr__(self): + 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): + """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_png_(self): + """iPython display hook support + + :returns: png version of the image as bytes + """ + b = io.BytesIO() + try: + self.save(b, "PNG") + except Exception as e: + msg = "Could not save to PNG for display" + raise ValueError(msg) from e + return b.getvalue() + + @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(e) + raise + new["shape"], new["typestr"] = _conv_type_shape(self) + return new + + def __getstate__(self): + return [self.info, self.mode, self.size, self.getpalette(), self.tobytes()] + + def __setstate__(self, state): + 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="raw", *args): + """ + 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. + """ + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if encoder_name == "raw" and args == (): + args = self.mode + + self.load() + + if self.width == 0 or self.height == 0: + return b"" + + # unpack data + e = _getencoder(self.mode, encoder_name, 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="image"): + """ + 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, decoder_name="raw", *args): + """ + 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. + """ + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + # default format + if decoder_name == "raw" and args == (): + args = self.mode + + # unpack data + d = _getdecoder(self.mode, decoder_name, 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): + """ + 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: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` + """ + if self.im is not None and self.palette and self.palette.dirty: + # realize palette + mode, arr = self.palette.getdata() + self.im.putpalette(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: + palette_mode = "RGBA" if mode.startswith("RGBA") else "RGB" + self.palette.mode = palette_mode + self.palette.palette = self.im.getpalette(palette_mode, 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) + + def verify(self): + """ + 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=None, matrix=None, dither=None, palette=Palette.WEB, colors=256 + ): + """ + 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. + + The current version supports all possible conversions between + "L", "RGB" and "CMYK". The ``matrix`` argument only supports "L" + and "RGB". + + When translating a color image to greyscale (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 greyscale ("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. + """ + + self.load() + + has_transparency = self.info.get("transparency") is not None + 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 = self._new(im) + if has_transparency and self.im.bands == 3: + transparency = new.info["transparency"] + + def convert_transparency(m, v): + v = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 + return max(0, min(255, int(v))) + + 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.info["transparency"] = transparency + return new + + 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") and mode in ("LA", "RGBA")) or ( + self.mode == "RGB" and mode == "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 = Image()._new(core.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 = self._new(im) + from . import ImagePalette + + new.palette = ImagePalette.ImagePalette("RGB", new.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.info["transparency"] + if trns is not None: + try: + new.info["transparency"] = new.palette.getcolor(trns, new) + except Exception: + # if we can't make a transparent color, don't leave the old + # transparency hanging around to mess us up. + del new.info["transparency"] + warnings.warn("Couldn't allocate palette entry for transparency") + return new + + 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", list(range(256)) * 3) + 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": + 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=256, + method=None, + kmeans=0, + palette=None, + dither=Dither.FLOYDSTEINBERG, + ): + """ + 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 + :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 != "RGB" and self.mode != "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 + + 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): + """ + 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=None): + """ + 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, box): + """ + 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, size): + """ + 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 greyscale 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, ymargin=None): + if ymargin is None: + ymargin = xmargin + self.load() + return self._new(self.im.expand(xmargin, ymargin, 0)) + + def filter(self, filter): + """ + 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 isinstance(filter, Callable): + 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 = [] + for c in range(self.im.bands): + ims.append(self._new(filter.filter(self.im.getband(c)))) + return merge(self.mode, ims) + + def getbands(self): + """ + 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): + """ + Calculates the bounding box of the non-zero regions in the + image. + + :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() + + def getcolors(self, maxcolors=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 = [] + for i in range(256): + if h[i]: + out.append((h[i], i)) + if len(out) > maxcolors: + return None + return out + return self.im.getcolors(maxcolors) + + def getdata(self, band=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): + """ + 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: + extrema = [] + for i in range(self.im.bands): + extrema.append(self.im.getband(i).getextrema()) + return tuple(extrema) + return self.im.getextrema() + + def _getxmp(self, xmp_tags): + def get_name(tag): + return tag.split("}")[1] + + 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 {} + else: + root = ElementTree.fromstring(xmp_tags) + return {get_name(root.tag): get_value(root)} + + def getexif(self): + """ + Gets EXIF data from the image. + + :returns: an :py:class:`~PIL.Image.Exif` object. + """ + if self._exif is None: + self._exif = Exif() + self._exif._loaded = False + 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 0x0112 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[0x0112] = int(match[2]) + + return self._exif + + def _reload_exif(self): + if self._exif is None or not self._exif._loaded: + return + self._exif._loaded = False + self.getexif() + + def get_child_images(self): + 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: + try: + thumbnail_offset += self._exif_offset + except AttributeError: + pass + self.fp.seek(thumbnail_offset) + data = self.fp.read(ifd.get(514)) + fp = io.BytesIO(data) + + with open(fp) as im: + if thumbnail_offset is None: + 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="RGB"): + """ + 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)) + + def apply_transparency(self): + """ + 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") + 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): + """ + 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(xy) + + def getprojection(self): + """ + 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=None, extrema=None): + """ + 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 greyscale ("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 greyscale 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 greyscale ("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 greyscale 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, box=None, mask=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 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) and mask is None: + # abbreviated paste(im, mask) syntax + mask = box + box = None + + 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, dest=(0, 0), source=(0, 0)): + """'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 tuple" + raise ValueError(msg) + if not isinstance(dest, (list, tuple)): + msg = "Destination must be a tuple" + raise ValueError(msg) + if not len(source) in (2, 4): + msg = "Source must be a 2 or 4-tuple" + raise ValueError(msg) + if not len(dest) == 2: + msg = "Destination must be a 2-tuple" + raise ValueError(msg) + if min(source) < 0: + msg = "Source must be non-negative" + raise ValueError(msg) + + if len(source) == 2: + source = source + im.size + + # over image, crop if it's not the whole thing. + if source == (0, 0) + im.size: + overlay = im + else: + overlay = im.crop(source) + + # target for the paste + box = 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, mode=None): + """ + 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). In the + current version, 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 + lut = [lut(i) for i in range(256)] * self.im.bands + + 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": + lut = [round(i) for i in lut] + return self._new(self.im.point(lut, mode)) + + def putalpha(self, alpha): + """ + 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 or + other color value. + """ + + 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"): + raise ValueError 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 + 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, scale=1.0, offset=0.0): + """ + 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"): + """ + 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 = "RGB" + self.load() # install new palette + + def putpixel(self, xy, value): + """ + 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] + value = self.palette.getcolor(value, self) + if self.mode == "PA": + value = (value, alpha) + 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 + ";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, resample=None, box=None, reducing_gap=None): + """ + 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 += " 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) + + size = tuple(size) + + self.load() + if box is None: + box = (0, 0) + self.size + else: + box = tuple(box) + + 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) + if callable(self.reduce): + self = self.reduce(factor, box=reduce_box) + else: + self = 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, box=None): + """ + 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 + else: + box = tuple(box) + + 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, + resample=Resampling.NEAREST, + expand=0, + center=None, + translate=None, + fillcolor=None, + ): + """ + 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: + # FIXME These should be rounded to ints? + rotn_center = (w / 2.0, h / 2.0) + else: + rotn_center = center + + 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( + -rotn_center[0] - post_trans[0], -rotn_center[1] - post_trans[1], matrix + ) + matrix[2] += rotn_center[0] + matrix[5] += rotn_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, format=None, **params): + """ + 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), pathlib.Path 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 = "" + open_fp = False + if isinstance(fp, Path): + filename = str(fp) + open_fp = True + elif is_path(fp): + filename = 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 = fp.name + + # may mutate self! + self._ensure_mutable() + + save_all = params.pop("save_all", False) + self.encoderinfo = params + self.encoderconfig = () + + preinit() + + ext = os.path.splitext(filename)[1].lower() + + 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") + + 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): + """ + 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: + raise EOFError + + def show(self, title=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 **display**, **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): + """ + 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: + ims = [self.copy()] + else: + ims = map(self._new, self.im.split()) + return tuple(ims) + + def getchannel(self, channel): + """ + 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): + """ + 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, resample=Resampling.BICUBIC, reducing_gap=2.0): + """ + 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(): + 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 + + 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 + if reducing_gap is not None: + size = preserve_aspect_ratio() + if size is None: + return + + res = self.draft(None, (size[0] * reducing_gap, 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 + size = preserve_aspect_ratio() + if size is None: + return + + if self.size != size: + im = self.resize(size, resample, box=box, reducing_gap=reducing_gap) + + self.im = im.im + self._size = 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, + method, + data=None, + resample=Resampling.NEAREST, + fill=1, + fillcolor=None, + ): + """ + 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 + + 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 += " 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.transform2(box, image.im, method, data, resample, fill) + + def transpose(self, method): + """ + 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): + """ + 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`) + """ + + pass + + +class ImageTransformHandler: + """ + Used as a mixin by geometry transforms + (for use with :py:meth:`~PIL.Image.Image.transform`) + """ + + pass + + +# -------------------------------------------------------------------- +# Factories + +# +# Debugging + + +def _wedge(): + """Create greyscale wedge (for debugging only)""" + + return Image()._new(core.wedge("L")) + + +def _check_size(size): + """ + Common check to enforce type and sanity check on size tuples + + :param size: Should be a 2 tuple of (width, height) + :returns: True, or raises a ValueError + """ + + if not isinstance(size, (list, tuple)): + msg = "Size must be a tuple" + raise ValueError(msg) + if len(size) != 2: + msg = "Size must be a tuple of length 2" + raise ValueError(msg) + if size[0] < 0 or size[1] < 0: + msg = "Width and height must be >= 0" + raise ValueError(msg) + + return True + + +def new(mode, size, color=0): + """ + 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 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. + """ + + _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 len(color) in [3, 4]: + # RGB or RGBA value for a P image + from . import ImagePalette + + im.palette = ImagePalette.ImagePalette() + color = im.palette.getcolor(color) + return im._new(core.fill(mode, size, color)) + + +def frombytes(mode, size, data, decoder_name="raw", *args): + """ + 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) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw" and args == (): + args = mode + + im = new(mode, size) + im.frombytes(data, decoder_name, args) + return im + + +def frombuffer(mode, size, data, decoder_name="raw", *args): + """ + 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. + + In the current version, 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, (1, 1)) + 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) + + +def fromarray(obj, mode=None): + """ + 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: + msg = "Cannot handle this data type: %s, %s" % typekey + 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() + else: + obj = obj.tostring() + + 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), _ENDIAN + "i4"): ("I", "I"), + ((1, 1), _ENDIAN + "f4"): ("F", "F"), +} + + +def _decompression_bomb_check(size): + if MAX_IMAGE_PIXELS is None: + return + + pixels = size[0] * 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, mode="r", formats=None): + """ + 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), pathlib.Path object or a file object. + The file object must implement ``file.read``, + ``file.seek``, and ``file.tell`` methods, + and be opened in binary mode. + :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)}" + raise ValueError(msg) + elif isinstance(fp, io.StringIO): + msg = ( + "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" + raise TypeError(msg) + + exclusive_fp = False + filename = "" + if isinstance(fp, Path): + filename = str(fp.resolve()) + elif is_path(fp): + filename = fp + + if filename: + fp = builtins.open(filename, "rb") + exclusive_fp = True + + try: + fp.seek(0) + except (AttributeError, io.UnsupportedOperation): + fp = io.BytesIO(fp.read()) + exclusive_fp = True + + prefix = fp.read(16) + + preinit() + + accept_warnings = [] + + def _open_core(fp, filename, prefix, formats): + 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 type(result) in [str, bytes]: + accept_warnings.append(result) + elif result: + fp.seek(0) + im = factory(fp, filename) + _decompression_bomb_check(im.size) + return im + except (SyntaxError, IndexError, TypeError, struct.error): + # Leave disabled by default, spams the logs with image + # opening failures that are entirely expected. + # logger.debug("", exc_info=True) + continue + 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 = formats.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 accept_warnings: + warnings.warn(message) + msg = "cannot identify image file %r" % (filename if filename else fp) + raise UnidentifiedImageError(msg) + + +# +# Image processing. + + +def alpha_composite(im1, im2): + """ + 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, im2, alpha): + """ + 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, image2, mask): + """ + 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, bands): + """ + 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, factory, accept=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, mimetype): + """ + Registers an image MIME type. This function should not be used + in application code. + + :param id: An image format identifier. + :param mimetype: The image MIME type for this format. + """ + MIME[id.upper()] = mimetype + + +def register_save(id, driver): + """ + 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, driver): + """ + 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, extension): + """ + 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, extensions): + """ + 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(): + """ + Returns a dictionary containing all file extensions belonging + to registered plugins + """ + init() + return EXTENSION + + +def register_decoder(name, decoder): + """ + Registers an image decoder. This function should not be + used in application code. + + :param name: The name of the decoder + :param decoder: A callable(mode, args) that returns an + ImageFile.PyDecoder object + + .. versionadded:: 4.1.0 + """ + DECODERS[name] = decoder + + +def register_encoder(name, encoder): + """ + Registers an image encoder. This function should not be + used in application code. + + :param name: The name of the encoder + :param encoder: A callable(mode, args) that returns an + ImageFile.PyEncoder object + + .. versionadded:: 4.1.0 + """ + ENCODERS[name] = encoder + + +# -------------------------------------------------------------------- +# Simple display support. + + +def _show(image, **options): + from . import ImageShow + + ImageShow.show(image, **options) + + +# -------------------------------------------------------------------- +# Effects + + +def effect_mandelbrot(size, extent, quality): + """ + 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, sigma): + """ + 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): + """ + 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): + """ + 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=None): + if env is None: + env = 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: + continue + + var = env[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(var) * units + except ValueError: + warnings.warn(f"{var_name} is not int") + continue + + try: + setter(var) + except ValueError as e: + warnings.warn(f"{var_name}: {e}") + + +_apply_env_variables() +atexit.register(core.clear_cache) + + +class Exif(MutableMapping): + """ + 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 + + 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): + 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) + 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.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]) + 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] + ) + + return merged_dict + + def tobytes(self, offset=8): + 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) + 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) + 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): + 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): + 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): + 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): + return tag in self._data or (self._info is not None and tag in self._info) + + def __setitem__(self, tag, value): + if self._info is not None and tag in self._info: + del self._info[tag] + self._data[tag] = value + + def __delitem__(self, tag): + 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/site-packages/PIL/ImageChops.py b/.venv/Lib/site-packages/PIL/ImageChops.py new file mode 100644 index 00000000..70120031 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageChops.py @@ -0,0 +1,303 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard channel operations +# +# History: +# 1996-03-24 fl Created +# 1996-08-13 fl Added logical operations (for "1" images) +# 2000-10-12 fl Added offset method (from Image.py) +# +# Copyright (c) 1997-2000 by Secret Labs AB +# Copyright (c) 1996-2000 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +def constant(image, value): + """Fill a channel with a given grey level. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.new("L", image.size, value) + + +def duplicate(image): + """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return image.copy() + + +def invert(image): + """ + Invert an image (channel). :: + + out = MAX - image + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image.load() + return image._new(image.im.chop_invert()) + + +def lighter(image1, image2): + """ + Compares the two images, pixel by pixel, and returns a new image containing + the lighter values. :: + + out = max(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_lighter(image2.im)) + + +def darker(image1, image2): + """ + Compares the two images, pixel by pixel, and returns a new image containing + the darker values. :: + + out = min(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_darker(image2.im)) + + +def difference(image1, image2): + """ + Returns the absolute value of the pixel-by-pixel difference between the two + images. :: + + out = abs(image1 - image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_difference(image2.im)) + + +def multiply(image1, image2): + """ + Superimposes two images on top of each other. + + If you multiply an image with a solid black image, the result is black. If + you multiply with a solid white image, the image is unaffected. :: + + out = image1 * image2 / MAX + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_multiply(image2.im)) + + +def screen(image1, image2): + """ + Superimposes two inverted images on top of each other. :: + + out = MAX - ((MAX - image1) * (MAX - image2) / MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_screen(image2.im)) + + +def soft_light(image1, image2): + """ + Superimposes two images on top of each other using the Soft Light algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_soft_light(image2.im)) + + +def hard_light(image1, image2): + """ + Superimposes two images on top of each other using the Hard Light algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_hard_light(image2.im)) + + +def overlay(image1, image2): + """ + Superimposes two images on top of each other using the Overlay algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_overlay(image2.im)) + + +def add(image1, image2, scale=1.0, offset=0): + """ + Adds two images, dividing the result by scale and adding the + offset. If omitted, scale defaults to 1.0, and offset to 0.0. :: + + out = ((image1 + image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add(image2.im, scale, offset)) + + +def subtract(image1, image2, scale=1.0, offset=0): + """ + Subtracts two images, dividing the result by scale and adding the offset. + If omitted, scale defaults to 1.0, and offset to 0.0. :: + + out = ((image1 - image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) + + +def add_modulo(image1, image2): + """Add two images, without clipping the result. :: + + out = ((image1 + image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add_modulo(image2.im)) + + +def subtract_modulo(image1, image2): + """Subtract two images, without clipping the result. :: + + out = ((image1 - image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract_modulo(image2.im)) + + +def logical_and(image1, image2): + """Logical AND between two images. + + Both of the images must have mode "1". If you would like to perform a + logical AND on an image with a mode other than "1", try + :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask + as the second image. :: + + out = ((image1 and image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_and(image2.im)) + + +def logical_or(image1, image2): + """Logical OR between two images. + + Both of the images must have mode "1". :: + + out = ((image1 or image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_or(image2.im)) + + +def logical_xor(image1, image2): + """Logical XOR between two images. + + Both of the images must have mode "1". :: + + out = ((bool(image1) != bool(image2)) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_xor(image2.im)) + + +def blend(image1, image2, alpha): + """Blend images using constant transparency weight. Alias for + :py:func:`PIL.Image.blend`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.blend(image1, image2, alpha) + + +def composite(image1, image2, mask): + """Create composite using transparency mask. Alias for + :py:func:`PIL.Image.composite`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.composite(image1, image2, mask) + + +def offset(image, xoffset, yoffset=None): + """Returns a copy of the image where data has been offset by the given + distances. Data wraps around the edges. If ``yoffset`` is omitted, it + is assumed to be equal to ``xoffset``. + + :param image: Input image. + :param xoffset: The horizontal distance. + :param yoffset: The vertical distance. If omitted, both + distances are set to the same value. + :rtype: :py:class:`~PIL.Image.Image` + """ + + if yoffset is None: + yoffset = xoffset + image.load() + return image._new(image.im.offset(xoffset, yoffset)) diff --git a/.venv/Lib/site-packages/PIL/ImageCms.py b/.venv/Lib/site-packages/PIL/ImageCms.py new file mode 100644 index 00000000..f8784968 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageCms.py @@ -0,0 +1,1026 @@ +# The Python Imaging Library. +# $Id$ + +# Optional color management support, based on Kevin Cazabon's PyCMS +# library. + +# 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. + +import sys +from enum import IntEnum + +from PIL import Image + +from ._deprecate import deprecate + +try: + from PIL import _imagingcms +except ImportError as ex: + # Allow error import for doc purposes, but error out when accessing + # anything in core. + from ._util import DeferredError + + _imagingcms = DeferredError(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" + +# --------------------------------------------------------------------. + +core = _imagingcms + +# +# 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 + + +def __getattr__(name): + for enum, prefix in {Intent: "INTENT_", Direction: "DIRECTION_"}.items(): + if name.startswith(prefix): + name = name[len(prefix) :] + if name in enum.__members__: + deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") + return enum[name] + msg = f"module '{__name__}' has no attribute '{name}'" + raise AttributeError(msg) + + +# +# 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 +} + +_MAX_FLAG = 0 +for flag in FLAGS.values(): + if isinstance(flag, int): + _MAX_FLAG = _MAX_FLAG | flag + + +# --------------------------------------------------------------------. +# Experimental PIL-level API +# --------------------------------------------------------------------. + +## +# Profile. + + +class ImageCmsProfile: + def __init__(self, profile): + """ + :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, _imagingcms.CmsProfile): + self._set(profile) + else: + msg = "Invalid type for Profile" + raise TypeError(msg) + + def _set(self, profile, filename=None): + self.profile = profile + self.filename = filename + if profile: + self.product_name = None # profile.product_name + self.product_info = None # profile.product_info + else: + self.product_name = None + self.product_info = None + + def tobytes(self): + """ + 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, + output, + input_mode, + output_mode, + intent=Intent.PERCEPTUAL, + proof=None, + proof_intent=Intent.ABSOLUTE_COLORIMETRIC, + flags=0, + ): + 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): + return self.apply(im) + + def apply(self, im, imOut=None): + 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): + 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=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 PIL import ImageWin + + if isinstance(handle, ImageWin.HDC): + profile = core.get_display_profile_win32(handle, 1) + else: + profile = core.get_display_profile_win32(handle or 0) + if profile is None: + return None + return ImageCmsProfile(profile) + + +# --------------------------------------------------------------------. +# pyCMS compatible layer +# --------------------------------------------------------------------. + + +class PyCMSError(Exception): + + """(pyCMS) Exception class. + This is used for all errors in the pyCMS API.""" + + pass + + +def profileToProfile( + im, + inputProfile, + outputProfile, + renderingIntent=Intent.PERCEPTUAL, + outputMode=None, + inPlace=False, + flags=0, +): + """ + (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): + """ + (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, + outputProfile, + inMode, + outMode, + renderingIntent=Intent.PERCEPTUAL, + flags=0, +): + """ + (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 = "flags must be an integer between 0 and %s" + _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, + outputProfile, + proofProfile, + inMode, + outMode, + renderingIntent=Intent.PERCEPTUAL, + proofRenderingIntent=Intent.ABSOLUTE_COLORIMETRIC, + flags=FLAGS["SOFTPROOFING"], +): + """ + (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 = "flags must be an integer between 0 and %s" + _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, transform, inPlace=False): + """ + (pyCMS) Applies a transform to a given image. + + If ``im.mode != transform.inMode``, a :exc:`PyCMSError` is raised. + + If ``inPlace`` is ``True`` and ``transform.inMode != transform.outMode``, a + :exc:`PyCMSError` is raised. + + If ``im.mode``, ``transform.inMode`` or ``transform.outMode`` 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.inMode`` and ``transform.outMode`` 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.outMode``. + + :param im: An :py:class:`~PIL.Image.Image` object, and im.mode must be the same + as the ``inMode`` 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, colorTemp=-1): + """ + (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 integer 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): + """ + + (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 len(model) > 30: + return model + "\n" + return f"{model} - {manufacturer}\n" + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileInfo(profile): + """ + (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 + arr = [] + for elt in (description, cpright): + if elt: + arr.append(elt) + return "\r\n\r\n".join(arr) + "\r\n\r\n" + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileCopyright(profile): + """ + (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): + """ + (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): + """ + (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): + """ + (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): + """ + (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, intent, direction): + """ + (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(): + """ + (pyCMS) Fetches versions. + """ + + return VERSION, core.littlecms_version, sys.version.split()[0], Image.__version__ diff --git a/.venv/Lib/site-packages/PIL/ImageColor.py b/.venv/Lib/site-packages/PIL/ImageColor.py new file mode 100644 index 00000000..e184ed68 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageColor.py @@ -0,0 +1,305 @@ +# +# 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. +# + +import re + +from . import Image + + +def getrgb(color): + """ + 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 + colormap[color] = rgb = getrgb(rgb) + return rgb + + # 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 = hls_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(3)) / 100.0, + float(m.group(2)) / 100.0, + ) + return ( + int(rgb[0] * 255 + 0.5), + int(rgb[1] * 255 + 0.5), + int(rgb[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 = hsv_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(2)) / 100.0, + float(m.group(3)) / 100.0, + ) + return ( + int(rgb[0] * 255 + 0.5), + int(rgb[1] * 255 + 0.5), + int(rgb[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) + + +def getcolor(color, mode): + """ + Same as :py:func:`~PIL.ImageColor.getrgb`, but converts the RGB value to a + greyscale value if ``mode`` is not color or a palette image. 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[, alpha]) or (red, green, blue[, alpha])`` + """ + # same as getrgb, but converts the result to the given mode + color, alpha = getrgb(color), 255 + if len(color) == 4: + color, alpha = color[:3], color[3] + + if Image.getmodebase(mode) == "L": + r, g, b = color + # ITU-R Recommendation 601-2 for nonlinear RGB + # scaled to 24 bits to match the convert's implementation. + color = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 + if mode[-1] == "A": + return color, alpha + else: + if mode[-1] == "A": + return color + (alpha,) + return color + + +colormap = { + # 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/site-packages/PIL/ImageDraw.py b/.venv/Lib/site-packages/PIL/ImageDraw.py new file mode 100644 index 00000000..8adcc87d --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageDraw.py @@ -0,0 +1,1127 @@ +# +# The Python Imaging Library +# $Id$ +# +# drawing interface operations +# +# History: +# 1996-04-13 fl Created (experimental) +# 1996-08-07 fl Filled polygons, ellipses. +# 1996-08-13 fl Added text support +# 1998-06-28 fl Handle I and F images +# 1998-12-29 fl Added arc; use arc primitive to draw ellipses +# 1999-01-10 fl Added shape stuff (experimental) +# 1999-02-06 fl Added bitmap support +# 1999-02-11 fl Changed all primitives to take options +# 1999-02-20 fl Fixed backwards compatibility +# 2000-10-12 fl Copy on write, when necessary +# 2001-02-18 fl Use default ink for bitmap/text also in fill mode +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing +# 2002-12-11 fl Refactored low-level drawing API (work in progress) +# 2004-08-26 fl Made Draw() a factory function, added getdraw() support +# 2004-09-04 fl Added width support to line primitive +# 2004-09-10 fl Added font mode handling +# 2006-06-19 fl Added font bearing support (getmask2) +# +# Copyright (c) 1997-2006 by Secret Labs AB +# Copyright (c) 1996-2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import math +import numbers +import warnings + +from . import Image, ImageColor +from ._deprecate import deprecate + +""" +A simple 2D drawing interface for PIL images. +

+Application code should use the Draw factory, instead of +directly. +""" + + +class ImageDraw: + font = None + + def __init__(self, im, mode=None): + """ + Create a drawing instance. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + im.load() + if im.readonly: + im._copy() # make it writeable + blend = 0 + if mode is None: + mode = im.mode + if mode != im.mode: + if mode == "RGBA" and im.mode == "RGB": + blend = 1 + else: + msg = "mode mismatch" + raise ValueError(msg) + if mode == "P": + self.palette = im.palette + else: + self.palette = None + self._image = im + self.im = im.im + self.draw = Image.core.draw(self.im, blend) + self.mode = mode + if mode in ("I", "F"): + self.ink = self.draw.draw_ink(1) + else: + self.ink = self.draw.draw_ink(-1) + if mode in ("1", "P", "I", "F"): + # FIXME: fix Fill2 to properly support matte for I+F images + self.fontmode = "1" + else: + self.fontmode = "L" # aliasing is okay for other modes + self.fill = False + + def getfont(self): + """ + Get the current default font. + + To set the default font for this ImageDraw instance:: + + from PIL import ImageDraw, ImageFont + draw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") + + To set the default font for all future ImageDraw instances:: + + from PIL import ImageDraw, ImageFont + ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") + + If the current default font is ``None``, + it is initialized with ``ImageFont.load_default()``. + + :returns: An image font.""" + if not self.font: + # FIXME: should add a font repository + from . import ImageFont + + self.font = ImageFont.load_default() + return self.font + + def _getink(self, ink, fill=None): + if ink is None and fill is None: + if self.fill: + fill = self.ink + else: + ink = self.ink + else: + if ink is not None: + if isinstance(ink, str): + ink = ImageColor.getcolor(ink, self.mode) + if self.palette and not isinstance(ink, numbers.Number): + ink = self.palette.getcolor(ink, self._image) + ink = self.draw.draw_ink(ink) + if fill is not None: + if isinstance(fill, str): + fill = ImageColor.getcolor(fill, self.mode) + if self.palette and not isinstance(fill, numbers.Number): + fill = self.palette.getcolor(fill, self._image) + fill = self.draw.draw_ink(fill) + return ink, fill + + def arc(self, xy, start, end, fill=None, width=1): + """Draw an arc.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_arc(xy, start, end, ink, width) + + def bitmap(self, xy, bitmap, fill=None): + """Draw a bitmap.""" + bitmap.load() + ink, fill = self._getink(fill) + if ink is None: + ink = fill + if ink is not None: + self.draw.draw_bitmap(xy, bitmap.im, ink) + + def chord(self, xy, start, end, fill=None, outline=None, width=1): + """Draw a chord.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_chord(xy, start, end, fill, 1) + if ink is not None and ink != fill and width != 0: + self.draw.draw_chord(xy, start, end, ink, 0, width) + + def ellipse(self, xy, fill=None, outline=None, width=1): + """Draw an ellipse.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_ellipse(xy, fill, 1) + if ink is not None and ink != fill and width != 0: + self.draw.draw_ellipse(xy, ink, 0, width) + + def line(self, xy, fill=None, width=0, joint=None): + """Draw a line, or a connected sequence of line segments.""" + ink = self._getink(fill)[0] + if ink is not None: + self.draw.draw_lines(xy, ink, width) + if joint == "curve" and width > 4: + if not isinstance(xy[0], (list, tuple)): + xy = [tuple(xy[i : i + 2]) for i in range(0, len(xy), 2)] + for i in range(1, len(xy) - 1): + point = xy[i] + angles = [ + math.degrees(math.atan2(end[0] - start[0], start[1] - end[1])) + % 360 + for start, end in ((xy[i - 1], point), (point, xy[i + 1])) + ] + if angles[0] == angles[1]: + # This is a straight line, so no joint is required + continue + + def coord_at_angle(coord, angle): + x, y = coord + angle -= 90 + distance = width / 2 - 1 + return tuple( + p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) + for p, p_d in ( + (x, distance * math.cos(math.radians(angle))), + (y, distance * math.sin(math.radians(angle))), + ) + ) + + flipped = ( + angles[1] > angles[0] and angles[1] - 180 > angles[0] + ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0]) + coords = [ + (point[0] - width / 2 + 1, point[1] - width / 2 + 1), + (point[0] + width / 2 - 1, point[1] + width / 2 - 1), + ] + if flipped: + start, end = (angles[1] + 90, angles[0] + 90) + else: + start, end = (angles[0] - 90, angles[1] - 90) + self.pieslice(coords, start - 90, end - 90, fill) + + if width > 8: + # Cover potential gaps between the line and the joint + if flipped: + gap_coords = [ + coord_at_angle(point, angles[0] + 90), + point, + coord_at_angle(point, angles[1] + 90), + ] + else: + gap_coords = [ + coord_at_angle(point, angles[0] - 90), + point, + coord_at_angle(point, angles[1] - 90), + ] + self.line(gap_coords, fill, width=3) + + def shape(self, shape, fill=None, outline=None): + """(Experimental) Draw a shape.""" + shape.close() + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_outline(shape, fill, 1) + if ink is not None and ink != fill: + self.draw.draw_outline(shape, ink, 0) + + def pieslice(self, xy, start, end, fill=None, outline=None, width=1): + """Draw a pieslice.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_pieslice(xy, start, end, fill, 1) + if ink is not None and ink != fill and width != 0: + self.draw.draw_pieslice(xy, start, end, ink, 0, width) + + def point(self, xy, fill=None): + """Draw one or more individual pixels.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_points(xy, ink) + + def polygon(self, xy, fill=None, outline=None, width=1): + """Draw a polygon.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_polygon(xy, fill, 1) + if ink is not None and ink != fill and width != 0: + if width == 1: + self.draw.draw_polygon(xy, ink, 0, width) + else: + # To avoid expanding the polygon outwards, + # use the fill as a mask + mask = Image.new("1", self.im.size) + mask_ink = self._getink(1)[0] + + fill_im = mask.copy() + draw = Draw(fill_im) + draw.draw.draw_polygon(xy, mask_ink, 1) + + ink_im = mask.copy() + draw = Draw(ink_im) + width = width * 2 - 1 + draw.draw.draw_polygon(xy, mask_ink, 0, width) + + mask.paste(ink_im, mask=fill_im) + + im = Image.new(self.mode, self.im.size) + draw = Draw(im) + draw.draw.draw_polygon(xy, ink, 0, width) + self.im.paste(im.im, (0, 0) + im.size, mask.im) + + def regular_polygon( + self, bounding_circle, n_sides, rotation=0, fill=None, outline=None + ): + """Draw a regular polygon.""" + xy = _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) + self.polygon(xy, fill, outline) + + def rectangle(self, xy, fill=None, outline=None, width=1): + """Draw a rectangle.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_rectangle(xy, fill, 1) + if ink is not None and ink != fill and width != 0: + self.draw.draw_rectangle(xy, ink, 0, width) + + def rounded_rectangle( + self, xy, radius=0, fill=None, outline=None, width=1, *, corners=None + ): + """Draw a rounded rectangle.""" + if isinstance(xy[0], (list, tuple)): + (x0, y0), (x1, y1) = xy + else: + x0, y0, x1, y1 = xy + if x1 < x0: + msg = "x1 must be greater than or equal to x0" + raise ValueError(msg) + if y1 < y0: + msg = "y1 must be greater than or equal to y0" + raise ValueError(msg) + if corners is None: + corners = (True, True, True, True) + + d = radius * 2 + + full_x, full_y = False, False + if all(corners): + full_x = d >= x1 - x0 + if full_x: + # The two left and two right corners are joined + d = x1 - x0 + full_y = d >= y1 - y0 + if full_y: + # The two top and two bottom corners are joined + d = y1 - y0 + if full_x and full_y: + # If all corners are joined, that is a circle + return self.ellipse(xy, fill, outline, width) + + if d == 0 or not any(corners): + # If the corners have no curve, + # or there are no corners, + # that is a rectangle + return self.rectangle(xy, fill, outline, width) + + r = d // 2 + ink, fill = self._getink(outline, fill) + + def draw_corners(pieslice): + if full_x: + # Draw top and bottom halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 180, 360), + ((x0, y1 - d, x0 + d, y1), 0, 180), + ) + elif full_y: + # Draw left and right halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 90, 270), + ((x1 - d, y0, x1, y0 + d), 270, 90), + ) + else: + # Draw four separate corners + parts = [] + for i, part in enumerate( + ( + ((x0, y0, x0 + d, y0 + d), 180, 270), + ((x1 - d, y0, x1, y0 + d), 270, 360), + ((x1 - d, y1 - d, x1, y1), 0, 90), + ((x0, y1 - d, x0 + d, y1), 90, 180), + ) + ): + if corners[i]: + parts.append(part) + for part in parts: + if pieslice: + self.draw.draw_pieslice(*(part + (fill, 1))) + else: + self.draw.draw_arc(*(part + (ink, width))) + + if fill is not None: + draw_corners(True) + + if full_x: + self.draw.draw_rectangle((x0, y0 + r + 1, x1, y1 - r - 1), fill, 1) + else: + self.draw.draw_rectangle((x0 + r + 1, y0, x1 - r - 1, y1), fill, 1) + if not full_x and not full_y: + left = [x0, y0, x0 + r, y1] + if corners[0]: + left[1] += r + 1 + if corners[3]: + left[3] -= r + 1 + self.draw.draw_rectangle(left, fill, 1) + + right = [x1 - r, y0, x1, y1] + if corners[1]: + right[1] += r + 1 + if corners[2]: + right[3] -= r + 1 + self.draw.draw_rectangle(right, fill, 1) + if ink is not None and ink != fill and width != 0: + draw_corners(False) + + if not full_x: + top = [x0, y0, x1, y0 + width - 1] + if corners[0]: + top[0] += r + 1 + if corners[1]: + top[2] -= r + 1 + self.draw.draw_rectangle(top, ink, 1) + + bottom = [x0, y1 - width + 1, x1, y1] + if corners[3]: + bottom[0] += r + 1 + if corners[2]: + bottom[2] -= r + 1 + self.draw.draw_rectangle(bottom, ink, 1) + if not full_y: + left = [x0, y0, x0 + width - 1, y1] + if corners[0]: + left[1] += r + 1 + if corners[3]: + left[3] -= r + 1 + self.draw.draw_rectangle(left, ink, 1) + + right = [x1 - width + 1, y0, x1, y1] + if corners[1]: + right[1] += r + 1 + if corners[2]: + right[3] -= r + 1 + self.draw.draw_rectangle(right, ink, 1) + + def _multiline_check(self, text): + split_character = "\n" if isinstance(text, str) else b"\n" + + return split_character in text + + def _multiline_split(self, text): + split_character = "\n" if isinstance(text, str) else b"\n" + + return text.split(split_character) + + def _multiline_spacing(self, font, spacing, stroke_width): + # this can be replaced with self.textbbox(...)[3] when textsize is removed + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + return ( + self.textsize( + "A", + font=font, + stroke_width=stroke_width, + )[1] + + spacing + ) + + def text( + self, + xy, + text, + fill=None, + font=None, + anchor=None, + spacing=4, + align="left", + direction=None, + features=None, + language=None, + stroke_width=0, + stroke_fill=None, + embedded_color=False, + *args, + **kwargs, + ): + """Draw text.""" + if self._multiline_check(text): + return self.multiline_text( + xy, + text, + fill, + font, + anchor, + spacing, + align, + direction, + features, + language, + stroke_width, + stroke_fill, + embedded_color, + ) + + if embedded_color and self.mode not in ("RGB", "RGBA"): + msg = "Embedded color supported only in RGB and RGBA modes" + raise ValueError(msg) + + if font is None: + font = self.getfont() + + def getink(fill): + ink, fill = self._getink(fill) + if ink is None: + return fill + return ink + + def draw_text(ink, stroke_width=0, stroke_offset=None): + mode = self.fontmode + if stroke_width == 0 and embedded_color: + mode = "RGBA" + coord = [] + start = [] + for i in range(2): + coord.append(int(xy[i])) + start.append(math.modf(xy[i])[0]) + try: + mask, offset = font.getmask2( + text, + mode, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + anchor=anchor, + ink=ink, + start=start, + *args, + **kwargs, + ) + coord = coord[0] + offset[0], coord[1] + offset[1] + except AttributeError: + try: + mask = font.getmask( + text, + mode, + direction, + features, + language, + stroke_width, + anchor, + ink, + start=start, + *args, + **kwargs, + ) + except TypeError: + mask = font.getmask(text) + if stroke_offset: + coord = coord[0] + stroke_offset[0], coord[1] + stroke_offset[1] + if mode == "RGBA": + # font.getmask2(mode="RGBA") returns color in RGB bands and mask in A + # extract mask and set text alpha + color, mask = mask, mask.getband(3) + color.fillband(3, (ink >> 24) & 0xFF) + x, y = coord + self.im.paste(color, (x, y, x + mask.size[0], y + mask.size[1]), mask) + else: + self.draw.draw_bitmap(coord, mask, ink) + + ink = getink(fill) + if ink is not None: + stroke_ink = None + if stroke_width: + stroke_ink = getink(stroke_fill) if stroke_fill is not None else ink + + if stroke_ink is not None: + # Draw stroked text + draw_text(stroke_ink, stroke_width) + + # Draw normal text + draw_text(ink, 0) + else: + # Only draw normal text + draw_text(ink) + + def multiline_text( + self, + xy, + text, + fill=None, + font=None, + anchor=None, + spacing=4, + align="left", + direction=None, + features=None, + language=None, + stroke_width=0, + stroke_fill=None, + embedded_color=False, + ): + if direction == "ttb": + msg = "ttb direction is unsupported for multiline text" + raise ValueError(msg) + + if anchor is None: + anchor = "la" + elif len(anchor) != 2: + msg = "anchor must be a 2 character string" + raise ValueError(msg) + elif anchor[1] in "tb": + msg = "anchor not supported for multiline text" + raise ValueError(msg) + + widths = [] + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self._multiline_spacing(font, spacing, stroke_width) + for line in lines: + line_width = self.textlength( + line, font, direction=direction, features=features, language=language + ) + widths.append(line_width) + max_width = max(max_width, line_width) + + top = xy[1] + if anchor[1] == "m": + top -= (len(lines) - 1) * line_spacing / 2.0 + elif anchor[1] == "d": + top -= (len(lines) - 1) * line_spacing + + for idx, line in enumerate(lines): + left = xy[0] + width_difference = max_width - widths[idx] + + # first align left by anchor + if anchor[0] == "m": + left -= width_difference / 2.0 + elif anchor[0] == "r": + left -= width_difference + + # then align by align parameter + if align == "left": + pass + elif align == "center": + left += width_difference / 2.0 + elif align == "right": + left += width_difference + else: + msg = 'align must be "left", "center" or "right"' + raise ValueError(msg) + + self.text( + (left, top), + line, + fill, + font, + anchor, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + stroke_fill=stroke_fill, + embedded_color=embedded_color, + ) + top += line_spacing + + def textsize( + self, + text, + font=None, + spacing=4, + direction=None, + features=None, + language=None, + stroke_width=0, + ): + """Get the size of a given string, in pixels.""" + deprecate("textsize", 10, "textbbox or textlength") + if self._multiline_check(text): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + return self.multiline_textsize( + text, + font, + spacing, + direction, + features, + language, + stroke_width, + ) + + if font is None: + font = self.getfont() + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + return font.getsize( + text, + direction, + features, + language, + stroke_width, + ) + + def multiline_textsize( + self, + text, + font=None, + spacing=4, + direction=None, + features=None, + language=None, + stroke_width=0, + ): + deprecate("multiline_textsize", 10, "multiline_textbbox") + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self._multiline_spacing(font, spacing, stroke_width) + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + for line in lines: + line_width, line_height = self.textsize( + line, + font, + spacing, + direction, + features, + language, + stroke_width, + ) + max_width = max(max_width, line_width) + return max_width, len(lines) * line_spacing - spacing + + def textlength( + self, + text, + font=None, + direction=None, + features=None, + language=None, + embedded_color=False, + ): + """Get the length of a given string, in pixels with 1/64 precision.""" + if self._multiline_check(text): + msg = "can't measure length of multiline text" + raise ValueError(msg) + if embedded_color and self.mode not in ("RGB", "RGBA"): + msg = "Embedded color supported only in RGB and RGBA modes" + raise ValueError(msg) + + if font is None: + font = self.getfont() + mode = "RGBA" if embedded_color else self.fontmode + try: + return font.getlength(text, mode, direction, features, language) + except AttributeError: + deprecate("textlength support for fonts without getlength", 10) + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + size = self.textsize( + text, + font, + direction=direction, + features=features, + language=language, + ) + if direction == "ttb": + return size[1] + return size[0] + + def textbbox( + self, + xy, + text, + font=None, + anchor=None, + spacing=4, + align="left", + direction=None, + features=None, + language=None, + stroke_width=0, + embedded_color=False, + ): + """Get the bounding box of a given string, in pixels.""" + if embedded_color and self.mode not in ("RGB", "RGBA"): + msg = "Embedded color supported only in RGB and RGBA modes" + raise ValueError(msg) + + if self._multiline_check(text): + return self.multiline_textbbox( + xy, + text, + font, + anchor, + spacing, + align, + direction, + features, + language, + stroke_width, + embedded_color, + ) + + if font is None: + font = self.getfont() + mode = "RGBA" if embedded_color else self.fontmode + bbox = font.getbbox( + text, mode, direction, features, language, stroke_width, anchor + ) + return bbox[0] + xy[0], bbox[1] + xy[1], bbox[2] + xy[0], bbox[3] + xy[1] + + def multiline_textbbox( + self, + xy, + text, + font=None, + anchor=None, + spacing=4, + align="left", + direction=None, + features=None, + language=None, + stroke_width=0, + embedded_color=False, + ): + if direction == "ttb": + msg = "ttb direction is unsupported for multiline text" + raise ValueError(msg) + + if anchor is None: + anchor = "la" + elif len(anchor) != 2: + msg = "anchor must be a 2 character string" + raise ValueError(msg) + elif anchor[1] in "tb": + msg = "anchor not supported for multiline text" + raise ValueError(msg) + + widths = [] + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self._multiline_spacing(font, spacing, stroke_width) + for line in lines: + line_width = self.textlength( + line, + font, + direction=direction, + features=features, + language=language, + embedded_color=embedded_color, + ) + widths.append(line_width) + max_width = max(max_width, line_width) + + top = xy[1] + if anchor[1] == "m": + top -= (len(lines) - 1) * line_spacing / 2.0 + elif anchor[1] == "d": + top -= (len(lines) - 1) * line_spacing + + bbox = None + + for idx, line in enumerate(lines): + left = xy[0] + width_difference = max_width - widths[idx] + + # first align left by anchor + if anchor[0] == "m": + left -= width_difference / 2.0 + elif anchor[0] == "r": + left -= width_difference + + # then align by align parameter + if align == "left": + pass + elif align == "center": + left += width_difference / 2.0 + elif align == "right": + left += width_difference + else: + msg = 'align must be "left", "center" or "right"' + raise ValueError(msg) + + bbox_line = self.textbbox( + (left, top), + line, + font, + anchor, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + embedded_color=embedded_color, + ) + if bbox is None: + bbox = bbox_line + else: + bbox = ( + min(bbox[0], bbox_line[0]), + min(bbox[1], bbox_line[1]), + max(bbox[2], bbox_line[2]), + max(bbox[3], bbox_line[3]), + ) + + top += line_spacing + + if bbox is None: + return xy[0], xy[1], xy[0], xy[1] + return bbox + + +def Draw(im, mode=None): + """ + A simple 2D drawing interface for PIL images. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + try: + return im.getdraw(mode) + except AttributeError: + return ImageDraw(im, mode) + + +# experimental access to the outline API +try: + Outline = Image.core.outline +except AttributeError: + Outline = None + + +def getdraw(im=None, hints=None): + """ + (Experimental) A more advanced 2D drawing interface for PIL images, + based on the WCK interface. + + :param im: The image to draw in. + :param hints: An optional list of hints. + :returns: A (drawing context, drawing resource factory) tuple. + """ + # FIXME: this needs more work! + # FIXME: come up with a better 'hints' scheme. + handler = None + if not hints or "nicest" in hints: + try: + from . import _imagingagg as handler + except ImportError: + pass + if handler is None: + from . import ImageDraw2 as handler + if im: + im = handler.Draw(im) + return im, handler + + +def floodfill(image, xy, value, border=None, thresh=0): + """ + (experimental) Fills a bounded region with a given color. + + :param image: Target image. + :param xy: Seed position (a 2-item coordinate tuple). See + :ref:`coordinate-system`. + :param value: Fill color. + :param border: Optional border value. If given, the region consists of + pixels with a color different from the border color. If not given, + the region consists of pixels having the same color as the seed + pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of + non-homogeneous, but similar, colors. + """ + # based on an implementation by Eric S. Raymond + # amended by yo1995 @20180806 + pixel = image.load() + x, y = xy + try: + background = pixel[x, y] + if _color_diff(value, background) <= thresh: + return # seed point already has fill color + pixel[x, y] = value + except (ValueError, IndexError): + return # seed point outside image + edge = {(x, y)} + # use a set to keep record of current and previous edge pixels + # to reduce memory consumption + full_edge = set() + while edge: + new_edge = set() + for x, y in edge: # 4 adjacent method + for s, t in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): + # If already processed, or if a coordinate is negative, skip + if (s, t) in full_edge or s < 0 or t < 0: + continue + try: + p = pixel[s, t] + except (ValueError, IndexError): + pass + else: + full_edge.add((s, t)) + if border is None: + fill = _color_diff(p, background) <= thresh + else: + fill = p != value and p != border + if fill: + pixel[s, t] = value + new_edge.add((s, t)) + full_edge = edge # discard pixels processed + edge = new_edge + + +def _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation): + """ + Generate a list of vertices for a 2D regular polygon. + + :param bounding_circle: The bounding circle is a tuple defined + by a point and radius. The polygon is inscribed in this circle. + (e.g. ``bounding_circle=(x, y, r)`` or ``((x, y), r)``) + :param n_sides: Number of sides + (e.g. ``n_sides=3`` for a triangle, ``6`` for a hexagon) + :param rotation: Apply an arbitrary rotation to the polygon + (e.g. ``rotation=90``, applies a 90 degree rotation) + :return: List of regular polygon vertices + (e.g. ``[(25, 50), (50, 50), (50, 25), (25, 25)]``) + + How are the vertices computed? + 1. Compute the following variables + - theta: Angle between the apothem & the nearest polygon vertex + - side_length: Length of each polygon edge + - centroid: Center of bounding circle (1st, 2nd elements of bounding_circle) + - polygon_radius: Polygon radius (last element of bounding_circle) + - angles: Location of each polygon vertex in polar grid + (e.g. A square with 0 degree rotation => [225.0, 315.0, 45.0, 135.0]) + + 2. For each angle in angles, get the polygon vertex at that angle + The vertex is computed using the equation below. + X= xcos(φ) + ysin(φ) + Y= −xsin(φ) + ycos(φ) + + Note: + φ = angle in degrees + x = 0 + y = polygon_radius + + The formula above assumes rotation around the origin. + In our case, we are rotating around the centroid. + To account for this, we use the formula below + X = xcos(φ) + ysin(φ) + centroid_x + Y = −xsin(φ) + ycos(φ) + centroid_y + """ + # 1. Error Handling + # 1.1 Check `n_sides` has an appropriate value + if not isinstance(n_sides, int): + msg = "n_sides should be an int" + raise TypeError(msg) + if n_sides < 3: + msg = "n_sides should be an int > 2" + raise ValueError(msg) + + # 1.2 Check `bounding_circle` has an appropriate value + if not isinstance(bounding_circle, (list, tuple)): + msg = "bounding_circle should be a tuple" + raise TypeError(msg) + + if len(bounding_circle) == 3: + *centroid, polygon_radius = bounding_circle + elif len(bounding_circle) == 2: + centroid, polygon_radius = bounding_circle + else: + msg = ( + "bounding_circle should contain 2D coordinates " + "and a radius (e.g. (x, y, r) or ((x, y), r) )" + ) + raise ValueError(msg) + + if not all(isinstance(i, (int, float)) for i in (*centroid, polygon_radius)): + msg = "bounding_circle should only contain numeric data" + raise ValueError(msg) + + if not len(centroid) == 2: + msg = "bounding_circle centre should contain 2D coordinates (e.g. (x, y))" + raise ValueError(msg) + + if polygon_radius <= 0: + msg = "bounding_circle radius should be > 0" + raise ValueError(msg) + + # 1.3 Check `rotation` has an appropriate value + if not isinstance(rotation, (int, float)): + msg = "rotation should be an int or float" + raise ValueError(msg) + + # 2. Define Helper Functions + def _apply_rotation(point, degrees, centroid): + return ( + round( + point[0] * math.cos(math.radians(360 - degrees)) + - point[1] * math.sin(math.radians(360 - degrees)) + + centroid[0], + 2, + ), + round( + point[1] * math.cos(math.radians(360 - degrees)) + + point[0] * math.sin(math.radians(360 - degrees)) + + centroid[1], + 2, + ), + ) + + def _compute_polygon_vertex(centroid, polygon_radius, angle): + start_point = [polygon_radius, 0] + return _apply_rotation(start_point, angle, centroid) + + def _get_angles(n_sides, rotation): + angles = [] + degrees = 360 / n_sides + # Start with the bottom left polygon vertex + current_angle = (270 - 0.5 * degrees) + rotation + for _ in range(0, n_sides): + angles.append(current_angle) + current_angle += degrees + if current_angle > 360: + current_angle -= 360 + return angles + + # 3. Variable Declarations + angles = _get_angles(n_sides, rotation) + + # 4. Compute Vertices + return [ + _compute_polygon_vertex(centroid, polygon_radius, angle) for angle in angles + ] + + +def _color_diff(color1, color2): + """ + Uses 1-norm distance to calculate difference between two values. + """ + if isinstance(color2, tuple): + return sum(abs(color1[i] - color2[i]) for i in range(0, len(color2))) + else: + return abs(color1 - color2) diff --git a/.venv/Lib/site-packages/PIL/ImageDraw2.py b/.venv/Lib/site-packages/PIL/ImageDraw2.py new file mode 100644 index 00000000..2667b77d --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageDraw2.py @@ -0,0 +1,209 @@ +# +# The Python Imaging Library +# $Id$ +# +# WCK-style drawing interface operations +# +# History: +# 2003-12-07 fl created +# 2005-05-15 fl updated; added to PIL as ImageDraw2 +# 2005-05-15 fl added text support +# 2005-05-20 fl added arc/chord/pieslice support +# +# Copyright (c) 2003-2005 by Secret Labs AB +# Copyright (c) 2003-2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +""" +(Experimental) WCK-style drawing interface operations + +.. seealso:: :py:mod:`PIL.ImageDraw` +""" + + +import warnings + +from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath +from ._deprecate import deprecate + + +class Pen: + """Stores an outline color and width.""" + + def __init__(self, color, width=1, opacity=255): + self.color = ImageColor.getrgb(color) + self.width = width + + +class Brush: + """Stores a fill color""" + + def __init__(self, color, opacity=255): + self.color = ImageColor.getrgb(color) + + +class Font: + """Stores a TrueType font and color""" + + def __init__(self, color, file, size=12): + # FIXME: add support for bitmap fonts + self.color = ImageColor.getrgb(color) + self.font = ImageFont.truetype(file, size) + + +class Draw: + """ + (Experimental) WCK-style drawing interface + """ + + def __init__(self, image, size=None, color=None): + if not hasattr(image, "im"): + image = Image.new(image, size, color) + self.draw = ImageDraw.Draw(image) + self.image = image + self.transform = None + + def flush(self): + return self.image + + def render(self, op, xy, pen, brush=None): + # handle color arguments + outline = fill = None + width = 1 + if isinstance(pen, Pen): + outline = pen.color + width = pen.width + elif isinstance(brush, Pen): + outline = brush.color + width = brush.width + if isinstance(brush, Brush): + fill = brush.color + elif isinstance(pen, Brush): + fill = pen.color + # handle transformation + if self.transform: + xy = ImagePath.Path(xy) + xy.transform(self.transform) + # render the item + if op == "line": + self.draw.line(xy, fill=outline, width=width) + else: + getattr(self.draw, op)(xy, fill=fill, outline=outline) + + def settransform(self, offset): + """Sets a transformation offset.""" + (xoffset, yoffset) = offset + self.transform = (1, 0, xoffset, 0, 1, yoffset) + + def arc(self, xy, start, end, *options): + """ + Draws an arc (a portion of a circle outline) between the start and end + angles, inside the given bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` + """ + self.render("arc", xy, start, end, *options) + + def chord(self, xy, start, end, *options): + """ + Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points + with a straight line. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` + """ + self.render("chord", xy, start, end, *options) + + def ellipse(self, xy, *options): + """ + Draws an ellipse inside the given bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` + """ + self.render("ellipse", xy, *options) + + def line(self, xy, *options): + """ + Draws a line between the coordinates in the ``xy`` list. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` + """ + self.render("line", xy, *options) + + def pieslice(self, xy, start, end, *options): + """ + Same as arc, but also draws straight lines between the end points and the + center of the bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` + """ + self.render("pieslice", xy, start, end, *options) + + def polygon(self, xy, *options): + """ + Draws a polygon. + + The polygon outline consists of straight lines between the given + coordinates, plus a straight line between the last and the first + coordinate. + + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` + """ + self.render("polygon", xy, *options) + + def rectangle(self, xy, *options): + """ + Draws a rectangle. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` + """ + self.render("rectangle", xy, *options) + + def text(self, xy, text, font): + """ + Draws the string at the given position. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` + """ + if self.transform: + xy = ImagePath.Path(xy) + xy.transform(self.transform) + self.draw.text(xy, text, font=font.font, fill=font.color) + + def textsize(self, text, font): + """ + .. deprecated:: 9.2.0 + + Return the size of the given string, in pixels. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textsize` + """ + deprecate("textsize", 10, "textbbox or textlength") + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + return self.draw.textsize(text, font=font.font) + + def textbbox(self, xy, text, font): + """ + Returns bounding box (in pixels) of given text. + + :return: ``(left, top, right, bottom)`` bounding box + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textbbox` + """ + if self.transform: + xy = ImagePath.Path(xy) + xy.transform(self.transform) + return self.draw.textbbox(xy, text, font=font.font) + + def textlength(self, text, font): + """ + Returns length (in pixels) of given text. + This is the amount by which following text should be offset. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textlength` + """ + return self.draw.textlength(text, font=font.font) diff --git a/.venv/Lib/site-packages/PIL/ImageEnhance.py b/.venv/Lib/site-packages/PIL/ImageEnhance.py new file mode 100644 index 00000000..3b79d5c4 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageEnhance.py @@ -0,0 +1,103 @@ +# +# 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 . import Image, ImageFilter, ImageStat + + +class _Enhance: + def enhance(self, factor): + """ + 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): + 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 grey image. A factor of 1.0 gives the original image. + """ + + def __init__(self, image): + 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): + 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): + 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/site-packages/PIL/ImageFile.py b/.venv/Lib/site-packages/PIL/ImageFile.py new file mode 100644 index 00000000..8e4f7dfb --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageFile.py @@ -0,0 +1,773 @@ +# +# 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. +# + +import io +import itertools +import struct +import sys + +from . import Image +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 raise_oserror(error): + try: + msg = Image.core.getcodecstatus(error) + except AttributeError: + msg = ERRORS.get(error) + if not msg: + msg = f"decoder error {error}" + msg += " when reading image file" + raise OSError(msg) + + +def _tilesort(t): + # sort on offset + return t[2] + + +# +# -------------------------------------------------------------------- +# 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): + if self.custom_mimetype: + return self.custom_mimetype + if self.format is not None: + return Image.MIME.get(self.format.upper()) + + def __setstate__(self, state): + self.tile = [] + super().__setstate__(state) + + def verify(self): + """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 ( + 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(): + # buffer is not large enough + raise OSError + 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_oserror(err_code) + + return Image.Image.load(self) + + def load_prepare(self): + # 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): + # may be overridden + pass + + # may be defined for contained formats + # def load_seek(self, pos): + # pass + + # may be defined for blocked formats (e.g. PNG) + # def load_read(self, 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 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): + 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): + """(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 = None + data = None + decoder = None + offset = 0 + finished = 0 + + def reset(self): + """ + (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_oserror(e) + 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: + # traceback.print_exc() + 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): + 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): + """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, bufsize, fh, exc=None): + for e, b, o, a in tile: + if o > 0: + fp.seek(o) + encoder = Image._getencoder(im.mode, e, a, im.encoderconfig) + try: + encoder.setimage(im.im, b) + 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: + msg = f"encoder error {errcode} when writing image file" + raise OSError(msg) 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): + self.xsize = 0 + self.ysize = 0 + self.xoff = 0 + self.yoff = 0 + + def extents(self): + return self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize + + +class PyCodec: + 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): + """ + 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=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): + return self._pulls_fd + + def decode(self, buffer): + """ + 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`. + """ + raise NotImplementedError() + + def set_as_raw(self, data, rawmode=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) + 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): + return self._pushes_fd + + def encode(self, bufsize): + """ + 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`. + """ + raise NotImplementedError() + + def encode_to_pyfd(self): + """ + 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: + 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/site-packages/PIL/ImageFilter.py b/.venv/Lib/site-packages/PIL/ImageFilter.py new file mode 100644 index 00000000..63d6dcf5 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageFilter.py @@ -0,0 +1,549 @@ +# +# 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. +# +import functools + + +class Filter: + pass + + +class MultibandFilter(Filter): + pass + + +class BuiltinFilter(MultibandFilter): + def filter(self, image): + if image.mode == "P": + msg = "cannot filter palette images" + raise ValueError(msg) + return image.filter(*self.filterargs) + + +class Kernel(BuiltinFilter): + """ + Create a convolution kernel. The current version only + supports 3x3 and 5x5 integer and floating point kernels. + + In the current version, kernels can only be applied to + "L" and "RGB" images. + + :param size: Kernel size, given as (width, height). In the current + version, this must be (3,3) or (5,5). + :param kernel: A sequence containing kernel weights. + :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, kernel, scale=None, offset=0): + 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, rank): + self.size = size + self.rank = rank + + def filter(self, image): + 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=3): + 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=3): + 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=3): + 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=3): + self.size = size + + def filter(self, image): + 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. + """ + + name = "GaussianBlur" + + def __init__(self, radius=2): + self.radius = radius + + def filter(self, image): + return image.gaussian_blur(self.radius) + + +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 one direction. 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): + if radius < 0: + msg = "radius must be >= 0" + raise ValueError(msg) + self.radius = radius + + def filter(self, image): + return image.box_blur(self.radius) + + +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 + + """ # noqa: E501 + + name = "UnsharpMask" + + def __init__(self, radius=2, percent=150, threshold=3): + self.radius = radius + self.percent = percent + self.threshold = threshold + + def filter(self, image): + 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, table, channels=3, target_mode=None, **kwargs): + 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 = None + if hasattr(table, "shape"): + try: + import numpy + except ImportError: # pragma: no cover + pass + + if numpy and isinstance(table, numpy.ndarray): + if copy_table: + table = table.copy() + + if table.shape in [ + (items * channels,), + (items, channels), + (size[2], size[1], size[0], channels), + ]: + table = 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)): + table, raw_table = [], table + 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) + table.extend(pixel) + + 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): + 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 = [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, callback, channels=3, target_mode=None): + """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 = [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, with_normals=False, channels=None, target_mode=None): + """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): + 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): + 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/site-packages/PIL/ImageFont.py b/.venv/Lib/site-packages/PIL/ImageFont.py new file mode 100644 index 00000000..9cdad296 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageFont.py @@ -0,0 +1,1202 @@ +# +# 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. +# + +import base64 +import math +import os +import sys +import warnings +from enum import IntEnum +from io import BytesIO + +from . import Image +from ._deprecate import deprecate +from ._util import is_directory, is_path + + +class Layout(IntEnum): + BASIC = 0 + RAQM = 1 + + +def __getattr__(name): + for enum, prefix in {Layout: "LAYOUT_"}.items(): + if name.startswith(prefix): + name = name[len(prefix) :] + if name in enum.__members__: + deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") + return enum[name] + msg = f"module '{__name__}' has no attribute '{name}'" + raise AttributeError(msg) + + +try: + from . import _imagingft as core +except ImportError as ex: + from ._util import DeferredError + + core = DeferredError(ex) + + +_UNSPECIFIED = object() + + +# 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""" + + def _load_pilfont(self, filename): + with open(filename, "rb") as fp: + image = 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, image): + # 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 getsize(self, text, *args, **kwargs): + """ + .. deprecated:: 9.2.0 + + Use :py:meth:`.getbbox` or :py:meth:`.getlength` instead. + + See :ref:`deprecations ` for more information. + + Returns width and height (in pixels) of given text. + + :param text: Text to measure. + + :return: (width, height) + """ + deprecate("getsize", 10, "getbbox or getlength") + return self.font.getsize(text) + + 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. + """ + return self.font.getmask(text, mode) + + def getbbox(self, text, *args, **kwargs): + """ + Returns bounding box (in pixels) of given text. + + .. versionadded:: 9.2.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. + + :return: ``(left, top, right, bottom)`` bounding box + """ + width, height = self.font.getsize(text) + return 0, 0, width, height + + def getlength(self, text, *args, **kwargs): + """ + Returns length (in pixels) of given text. + This is the amount by which following text should be offset. + + .. versionadded:: 9.2.0 + """ + 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)""" + + def __init__(self, font=None, size=10, index=0, encoding="", layout_engine=None): + # FIXME: use service provider instead + + 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): + 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 _multiline_split(self, text): + split_character = "\n" if isinstance(text, str) else b"\n" + return text.split(split_character) + + def getname(self): + """ + :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): + """ + :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, mode="", direction=None, features=None, language=None): + """ + 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: Width for horizontal, height for vertical text. + """ + return self.font.getlength(text, mode, direction, features, language) / 64 + + def getbbox( + self, + text, + mode="", + direction=None, + features=None, + language=None, + stroke_width=0, + anchor=None, + ): + """ + 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. + See :ref:`text-anchors` for valid values. + + :return: ``(left, top, right, bottom)`` bounding box + """ + 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 getsize( + self, + text, + direction=None, + features=None, + language=None, + stroke_width=0, + ): + """ + .. deprecated:: 9.2.0 + + Use :py:meth:`getlength()` to measure the offset of following text with + 1/64 pixel precision. + Use :py:meth:`getbbox()` to get the exact bounding box based on an anchor. + + See :ref:`deprecations ` for more information. + + Returns width and height (in pixels) of given text if rendered in font with + provided direction, features, and language. + + .. note:: For historical reasons this function measures text height from + the ascender line instead of the top, see :ref:`text-anchors`. + If you wish to measure text height from the top, it is recommended + to use the bottom value of :meth:`getbbox` with ``anchor='lt'`` instead. + + :param text: Text to measure. + + :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 + + :return: (width, height) + """ + deprecate("getsize", 10, "getbbox or getlength") + # vertical offset is added for historical reasons + # see https://github.com/python-pillow/Pillow/pull/4910#discussion_r486682929 + size, offset = self.font.getsize(text, "L", direction, features, language) + return ( + size[0] + stroke_width * 2, + size[1] + stroke_width * 2 + offset[1], + ) + + def getsize_multiline( + self, + text, + direction=None, + spacing=4, + features=None, + language=None, + stroke_width=0, + ): + """ + .. deprecated:: 9.2.0 + + Use :py:meth:`.ImageDraw.multiline_textbbox` instead. + + See :ref:`deprecations ` for more information. + + Returns width and height (in pixels) of given text if rendered in font + with provided direction, features, and language, while respecting + newline characters. + + :param text: Text to measure. + + :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 spacing: The vertical gap between lines, defaulting to 4 pixels. + + :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. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :return: (width, height) + """ + deprecate("getsize_multiline", 10, "ImageDraw.multiline_textbbox") + max_width = 0 + lines = self._multiline_split(text) + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + line_spacing = self.getsize("A", stroke_width=stroke_width)[1] + spacing + for line in lines: + line_width, line_height = self.getsize( + line, direction, features, language, stroke_width + ) + max_width = max(max_width, line_width) + + return max_width, len(lines) * line_spacing - spacing + + def getoffset(self, text): + """ + .. deprecated:: 9.2.0 + + Use :py:meth:`.getbbox` instead. + + See :ref:`deprecations ` for more information. + + Returns the offset of given text. This is the gap between the + starting coordinate and the first marking. Note that this gap is + included in the result of :py:func:`~PIL.ImageFont.FreeTypeFont.getsize`. + + :param text: Text to measure. + + :return: A tuple of the x and y offset + """ + deprecate("getoffset", 10, "getbbox") + return self.font.getsize(text)[1] + + 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. + See :ref:`text-anchors` for valid values. + + .. 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, + mode="", + fill=_UNSPECIFIED, + 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 fill: Optional fill function. By default, an internal Pillow function + will be used. + + Deprecated. This parameter will be removed in Pillow 10 + (2023-07-01). + + :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. + See :ref:`text-anchors` for valid values. + + .. 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 + """ + if fill is _UNSPECIFIED: + fill = Image.core.fill + else: + deprecate("fill", 10) + size, offset = self.font.getsize( + text, mode, direction, features, language, anchor + ) + if start is None: + start = (0, 0) + size = tuple(math.ceil(size[i] + stroke_width * 2 + start[i]) for i in range(2)) + offset = offset[0] - stroke_width, offset[1] - stroke_width + Image._decompression_bomb_check(size) + im = fill("RGBA" if mode == "RGBA" else "L", size, 0) + if min(size): + self.font.render( + text, + im.id, + mode, + direction, + features, + language, + stroke_width, + ink, + start[0], + start[1], + ) + return im, offset + + 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): + """ + :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: + axis["name"] = axis["name"].replace(b"\x00", b"") + return axes + + def set_variation_by_axes(self, axes): + """ + :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 getsize(self, text, *args, **kwargs): + """ + .. deprecated:: 9.2.0 + + Use :py:meth:`.getbbox` or :py:meth:`.getlength` instead. + + See :ref:`deprecations ` for more information. + """ + deprecate("getsize", 10, "getbbox or getlength") + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + w, h = self.font.getsize(text) + if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): + return h, w + return w, h + + 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, *args, **kwargs): + 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): + """ + 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=None, size=10, index=0, encoding="", layout_engine=None): + """ + 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 or :file:`/Library/Fonts/`, + :file:`/System/Library/Fonts/` and :file:`~/Library/Fonts/` on + macOS. + + :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: + :data:`.ImageFont.Layout.BASIC` or :data:`.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. + """ + + def freetype(font): + 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"): + lindirs = os.environ.get("XDG_DATA_DIRS") + if not lindirs: + # According to the freedesktop spec, XDG_DATA_DIRS should + # default to /usr/share + lindirs = "/usr/share" + dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")] + 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): + """ + 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. + """ + for directory in sys.path: + if is_directory(directory): + if not isinstance(filename, str): + filename = filename.decode("utf-8") + try: + return load(os.path.join(directory, filename)) + except OSError: + pass + msg = "cannot find font file" + raise OSError(msg) + + +def load_default(): + """Load a "better than nothing" default font. + + .. versionadded:: 1.1.4 + + :return: A font object. + """ + 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 diff --git a/.venv/Lib/site-packages/PIL/ImageGrab.py b/.venv/Lib/site-packages/PIL/ImageGrab.py new file mode 100644 index 00000000..982f77f2 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageGrab.py @@ -0,0 +1,149 @@ +# +# The Python Imaging Library +# $Id$ +# +# screen grabber +# +# History: +# 2001-04-26 fl created +# 2001-09-17 fl use builtin driver, if present +# 2002-11-19 fl added grabclipboard support +# +# Copyright (c) 2001-2002 by Secret Labs AB +# Copyright (c) 2001-2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import os +import shutil +import subprocess +import sys +import tempfile + +from . import Image + + +def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None): + if xdisplay is None: + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp(".png") + os.close(fh) + args = ["screencapture"] + if bbox: + left, top, right, bottom = bbox + args += ["-R", f"{left},{top},{right-left},{bottom-top}"] + subprocess.call(args + ["-x", filepath]) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + if bbox: + im_resized = im.resize((right - left, bottom - top)) + im.close() + return im_resized + return im + elif sys.platform == "win32": + offset, size, data = Image.core.grabscreen_win32( + include_layered_windows, all_screens + ) + im = Image.frombytes( + "RGB", + size, + data, + # RGB, 32-bit line padding, origin lower left corner + "raw", + "BGR", + (size[0] * 3 + 3) & -4, + -1, + ) + if bbox: + x0, y0 = offset + left, top, right, bottom = bbox + im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) + return im + elif shutil.which("gnome-screenshot"): + fh, filepath = tempfile.mkstemp(".png") + os.close(fh) + subprocess.call(["gnome-screenshot", "-f", filepath]) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + if bbox: + im_cropped = im.crop(bbox) + im.close() + return im_cropped + return im + # use xdisplay=None for default display on non-win32/macOS systems + if not Image.core.HAVE_XCB: + msg = "Pillow was built without XCB support" + raise OSError(msg) + size, data = Image.core.grabscreen_x11(xdisplay) + im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) + if bbox: + im = im.crop(bbox) + return im + + +def grabclipboard(): + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp(".jpg") + os.close(fh) + commands = [ + 'set theFile to (open for access POSIX file "' + + filepath + + '" with write permission)', + "try", + " write (the clipboard as JPEG picture) to theFile", + "end try", + "close access theFile", + ] + script = ["osascript"] + for command in commands: + script += ["-e", command] + subprocess.call(script) + + im = None + if os.stat(filepath).st_size != 0: + im = Image.open(filepath) + im.load() + os.unlink(filepath) + return im + elif sys.platform == "win32": + fmt, data = Image.core.grabclipboard_win32() + if fmt == "file": # CF_HDROP + import struct + + o = struct.unpack_from("I", data)[0] + if data[16] != 0: + files = data[o:].decode("utf-16le").split("\0") + else: + files = data[o:].decode("mbcs").split("\0") + return files[: files.index("")] + if isinstance(data, bytes): + import io + + data = io.BytesIO(data) + if fmt == "png": + from . import PngImagePlugin + + return PngImagePlugin.PngImageFile(data) + elif fmt == "DIB": + from . import BmpImagePlugin + + return BmpImagePlugin.DibImageFile(data) + return None + else: + if shutil.which("wl-paste"): + args = ["wl-paste"] + elif shutil.which("xclip"): + args = ["xclip", "-selection", "clipboard", "-t", "image/png", "-o"] + else: + msg = "wl-paste or xclip is required for ImageGrab.grabclipboard() on Linux" + raise NotImplementedError(msg) + fh, filepath = tempfile.mkstemp() + subprocess.call(args, stdout=fh) + os.close(fh) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + return im diff --git a/.venv/Lib/site-packages/PIL/ImageMath.py b/.venv/Lib/site-packages/PIL/ImageMath.py new file mode 100644 index 00000000..ac7d36b6 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageMath.py @@ -0,0 +1,263 @@ +# +# The Python Imaging Library +# $Id$ +# +# a simple math add-on for the Python Imaging Library +# +# History: +# 1999-02-15 fl Original PIL Plus release +# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 +# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 +# +# Copyright (c) 1999-2005 by Secret Labs AB +# Copyright (c) 2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import builtins + +from . import Image, _imagingmath + + +def _isconstant(v): + return isinstance(v, (int, float)) + + +class _Operand: + """Wraps an image operand, providing standard operators""" + + def __init__(self, im): + self.im = im + + def __fixup(self, im1): + # convert image to suitable mode + if isinstance(im1, _Operand): + # argument was an image. + if im1.im.mode in ("1", "L"): + return im1.im.convert("I") + elif im1.im.mode in ("I", "F"): + return im1.im + else: + msg = f"unsupported mode: {im1.im.mode}" + raise ValueError(msg) + else: + # argument was a constant + if _isconstant(im1) and self.im.mode in ("1", "L", "I"): + return Image.new("I", self.im.size, im1) + else: + return Image.new("F", self.im.size, im1) + + def apply(self, op, im1, im2=None, mode=None): + im1 = self.__fixup(im1) + if im2 is None: + # unary operation + out = Image.new(mode or im1.mode, im1.size, None) + im1.load() + try: + op = getattr(_imagingmath, op + "_" + im1.mode) + except AttributeError as e: + msg = f"bad operand type for '{op}'" + raise TypeError(msg) from e + _imagingmath.unop(op, out.im.id, im1.im.id) + else: + # binary operation + im2 = self.__fixup(im2) + if im1.mode != im2.mode: + # convert both arguments to floating point + if im1.mode != "F": + im1 = im1.convert("F") + if im2.mode != "F": + im2 = im2.convert("F") + if im1.size != im2.size: + # crop both arguments to a common size + size = (min(im1.size[0], im2.size[0]), min(im1.size[1], im2.size[1])) + if im1.size != size: + im1 = im1.crop((0, 0) + size) + if im2.size != size: + im2 = im2.crop((0, 0) + size) + out = Image.new(mode or im1.mode, im1.size, None) + im1.load() + im2.load() + try: + op = getattr(_imagingmath, op + "_" + im1.mode) + except AttributeError as e: + msg = f"bad operand type for '{op}'" + raise TypeError(msg) from e + _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id) + return _Operand(out) + + # unary operators + def __bool__(self): + # an image is "true" if it contains at least one non-zero pixel + return self.im.getbbox() is not None + + def __abs__(self): + return self.apply("abs", self) + + def __pos__(self): + return self + + def __neg__(self): + return self.apply("neg", self) + + # binary operators + def __add__(self, other): + return self.apply("add", self, other) + + def __radd__(self, other): + return self.apply("add", other, self) + + def __sub__(self, other): + return self.apply("sub", self, other) + + def __rsub__(self, other): + return self.apply("sub", other, self) + + def __mul__(self, other): + return self.apply("mul", self, other) + + def __rmul__(self, other): + return self.apply("mul", other, self) + + def __truediv__(self, other): + return self.apply("div", self, other) + + def __rtruediv__(self, other): + return self.apply("div", other, self) + + def __mod__(self, other): + return self.apply("mod", self, other) + + def __rmod__(self, other): + return self.apply("mod", other, self) + + def __pow__(self, other): + return self.apply("pow", self, other) + + def __rpow__(self, other): + return self.apply("pow", other, self) + + # bitwise + def __invert__(self): + return self.apply("invert", self) + + def __and__(self, other): + return self.apply("and", self, other) + + def __rand__(self, other): + return self.apply("and", other, self) + + def __or__(self, other): + return self.apply("or", self, other) + + def __ror__(self, other): + return self.apply("or", other, self) + + def __xor__(self, other): + return self.apply("xor", self, other) + + def __rxor__(self, other): + return self.apply("xor", other, self) + + def __lshift__(self, other): + return self.apply("lshift", self, other) + + def __rshift__(self, other): + return self.apply("rshift", self, other) + + # logical + def __eq__(self, other): + return self.apply("eq", self, other) + + def __ne__(self, other): + return self.apply("ne", self, other) + + def __lt__(self, other): + return self.apply("lt", self, other) + + def __le__(self, other): + return self.apply("le", self, other) + + def __gt__(self, other): + return self.apply("gt", self, other) + + def __ge__(self, other): + return self.apply("ge", self, other) + + +# conversions +def imagemath_int(self): + return _Operand(self.im.convert("I")) + + +def imagemath_float(self): + return _Operand(self.im.convert("F")) + + +# logical +def imagemath_equal(self, other): + return self.apply("eq", self, other, mode="I") + + +def imagemath_notequal(self, other): + return self.apply("ne", self, other, mode="I") + + +def imagemath_min(self, other): + return self.apply("min", self, other) + + +def imagemath_max(self, other): + return self.apply("max", self, other) + + +def imagemath_convert(self, mode): + return _Operand(self.im.convert(mode)) + + +ops = {} +for k, v in list(globals().items()): + if k[:10] == "imagemath_": + ops[k[10:]] = v + + +def eval(expression, _dict={}, **kw): + """ + Evaluates an image expression. + + :param expression: A string containing a Python-style expression. + :param options: Values to add to the evaluation context. You + can either use a dictionary, or one or more keyword + arguments. + :return: The evaluated expression. This is usually an image object, but can + also be an integer, a floating point value, or a pixel tuple, + depending on the expression. + """ + + # build execution namespace + args = ops.copy() + args.update(_dict) + args.update(kw) + for k, v in list(args.items()): + if hasattr(v, "im"): + args[k] = _Operand(v) + + compiled_code = compile(expression, "", "eval") + + def scan(code): + for const in code.co_consts: + if type(const) == type(compiled_code): + scan(const) + + for name in code.co_names: + if name not in args and name != "abs": + msg = f"'{name}' not allowed" + raise ValueError(msg) + + scan(compiled_code) + out = builtins.eval(expression, {"__builtins": {"abs": abs}}, args) + try: + return out.im + except AttributeError: + return out diff --git a/.venv/Lib/site-packages/PIL/ImageMode.py b/.venv/Lib/site-packages/PIL/ImageMode.py new file mode 100644 index 00000000..a0b33514 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageMode.py @@ -0,0 +1,90 @@ +# +# 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. +# + +import sys + +# mode descriptor cache +_modes = None + + +class ModeDescriptor: + """Wrapper for mode strings.""" + + def __init__(self, mode, bands, basemode, basetype, typestr): + self.mode = mode + self.bands = bands + self.basemode = basemode + self.basetype = basetype + self.typestr = typestr + + def __str__(self): + return self.mode + + +def getmode(mode): + """Gets a mode descriptor for the given mode.""" + global _modes + if not _modes: + # initialize mode cache + modes = {} + endian = "<" if sys.byteorder == "little" else ">" + for m, (basemode, basetype, bands, typestr) in { + # core modes + # Bits need to be extended to bytes + "1": ("L", "L", ("1",), "|b1"), + "L": ("L", "L", ("L",), "|u1"), + "I": ("L", "I", ("I",), endian + "i4"), + "F": ("L", "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"), + }.items(): + modes[m] = ModeDescriptor(m, bands, basemode, basetype, typestr) + # mapping modes + for i16mode, typestr in { + # I;16 == I;16L, and I;32 == I;32L + "I;16": "u2", + "I;16BS": ">i2", + "I;16N": endian + "u2", + "I;16NS": endian + "i2", + "I;32": "u4", + "I;32L": "i4", + "I;32LS": " + +import re + +from . import Image, _imagingmorph + +LUT_SIZE = 1 << 9 + +# fmt: off +ROTATION_MATRIX = [ + 6, 3, 0, + 7, 4, 1, + 8, 5, 2, +] +MIRROR_MATRIX = [ + 2, 1, 0, + 5, 4, 3, + 8, 7, 6, +] +# fmt: on + + +class LutBuilder: + """A class for building a MorphLut from a descriptive language + + The input patterns is a list of a strings sequences like these:: + + 4:(... + .1. + 111)->1 + + (whitespaces including linebreaks are ignored). The option 4 + describes a series of symmetry operations (in this case a + 4-rotation), the pattern is described by: + + - . or X - Ignore + - 1 - Pixel is on + - 0 - Pixel is off + + The result of the operation is described after "->" string. + + The default is to return the current pixel value, which is + returned if no other match is found. + + Operations: + + - 4 - 4 way rotation + - N - Negate + - 1 - Dummy op for no other operation (an op must always be given) + - M - Mirroring + + Example:: + + lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) + lut = lb.build_lut() + + """ + + def __init__(self, patterns=None, op_name=None): + if patterns is not None: + self.patterns = patterns + else: + self.patterns = [] + self.lut = None + if op_name is not None: + known_patterns = { + "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"], + "dilation4": ["4:(... .0. .1.)->1"], + "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"], + "erosion4": ["4:(... .1. .0.)->0"], + "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"], + "edge": [ + "1:(... ... ...)->0", + "4:(.0. .1. ...)->1", + "4:(01. .1. ...)->1", + ], + } + if op_name not in known_patterns: + msg = "Unknown pattern " + op_name + "!" + raise Exception(msg) + + self.patterns = known_patterns[op_name] + + def add_patterns(self, patterns): + self.patterns += patterns + + def build_default_lut(self): + symbols = [0, 1] + m = 1 << 4 # pos of current pixel + self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) + + def get_lut(self): + return self.lut + + def _string_permute(self, pattern, permutation): + """string_permute takes a pattern and a permutation and returns the + string permuted according to the permutation list. + """ + assert len(permutation) == 9 + return "".join(pattern[p] for p in permutation) + + def _pattern_permute(self, basic_pattern, options, basic_result): + """pattern_permute takes a basic pattern and its result and clones + the pattern according to the modifications described in the $options + parameter. It returns a list of all cloned patterns.""" + patterns = [(basic_pattern, basic_result)] + + # rotations + if "4" in options: + res = patterns[-1][1] + for i in range(4): + patterns.append( + (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res) + ) + # mirror + if "M" in options: + n = len(patterns) + for pattern, res in patterns[:n]: + patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) + + # negate + if "N" in options: + n = len(patterns) + for pattern, res in patterns[:n]: + # Swap 0 and 1 + pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1") + res = 1 - int(res) + patterns.append((pattern, res)) + + return patterns + + def build_lut(self): + """Compile all patterns into a morphology lut. + + TBD :Build based on (file) morphlut:modify_lut + """ + self.build_default_lut() + patterns = [] + + # Parse and create symmetries of the patterns strings + for p in self.patterns: + m = re.search(r"(\w*):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", "")) + if not m: + msg = 'Syntax error in pattern "' + p + '"' + raise Exception(msg) + options = m.group(1) + pattern = m.group(2) + result = int(m.group(3)) + + # Get rid of spaces + pattern = pattern.replace(" ", "").replace("\n", "") + + patterns += self._pattern_permute(pattern, options, result) + + # compile the patterns into regular expressions for speed + for i, pattern in enumerate(patterns): + p = pattern[0].replace(".", "X").replace("X", "[01]") + p = re.compile(p) + patterns[i] = (p, pattern[1]) + + # Step through table and find patterns that match. + # Note that all the patterns are searched. The last one + # caught overrides + for i in range(LUT_SIZE): + # Build the bit pattern + bitpattern = bin(i)[2:] + bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1] + + for p, r in patterns: + if p.match(bitpattern): + self.lut[i] = [0, 1][r] + + return self.lut + + +class MorphOp: + """A class for binary morphological operators""" + + def __init__(self, lut=None, op_name=None, patterns=None): + """Create a binary morphological operator""" + self.lut = lut + if op_name is not None: + self.lut = LutBuilder(op_name=op_name).build_lut() + elif patterns is not None: + self.lut = LutBuilder(patterns=patterns).build_lut() + + def apply(self, image): + """Run a single morphological operation on an image + + Returns a tuple of the number of changed pixels and the + morphed image""" + if self.lut is None: + msg = "No operator loaded" + raise Exception(msg) + + if image.mode != "L": + msg = "Image mode must be L" + raise ValueError(msg) + outimage = Image.new(image.mode, image.size, None) + count = _imagingmorph.apply(bytes(self.lut), image.im.id, outimage.im.id) + return count, outimage + + def match(self, image): + """Get a list of coordinates matching the morphological operation on + an image. + + Returns a list of tuples of (x,y) coordinates + of all matching pixels. See :ref:`coordinate-system`.""" + if self.lut is None: + msg = "No operator loaded" + raise Exception(msg) + + if image.mode != "L": + msg = "Image mode must be L" + raise ValueError(msg) + return _imagingmorph.match(bytes(self.lut), image.im.id) + + def get_on_pixels(self, image): + """Get a list of all turned on pixels in a binary image + + Returns a list of tuples of (x,y) coordinates + of all matching pixels. See :ref:`coordinate-system`.""" + + if image.mode != "L": + msg = "Image mode must be L" + raise ValueError(msg) + return _imagingmorph.get_on_pixels(image.im.id) + + def load_lut(self, filename): + """Load an operator from an mrl file""" + with open(filename, "rb") as f: + self.lut = bytearray(f.read()) + + if len(self.lut) != LUT_SIZE: + self.lut = None + msg = "Wrong size operator file!" + raise Exception(msg) + + def save_lut(self, filename): + """Save an operator to an mrl file""" + if self.lut is None: + msg = "No operator loaded" + raise Exception(msg) + with open(filename, "wb") as f: + f.write(self.lut) + + def set_lut(self, lut): + """Set the lut from an external source""" + self.lut = lut diff --git a/.venv/Lib/site-packages/PIL/ImageOps.py b/.venv/Lib/site-packages/PIL/ImageOps.py new file mode 100644 index 00000000..301c593c --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageOps.py @@ -0,0 +1,621 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard image operations +# +# History: +# 2001-10-20 fl Created +# 2001-10-23 fl Added autocontrast operator +# 2001-12-18 fl Added Kevin's fit operator +# 2004-03-14 fl Fixed potential division by zero in equalize +# 2005-05-05 fl Fixed equalize for low number of values +# +# Copyright (c) 2001-2004 by Secret Labs AB +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import functools +import operator +import re + +from . import Image, ImagePalette + +# +# helpers + + +def _border(border): + if isinstance(border, tuple): + if len(border) == 2: + left, top = right, bottom = border + elif len(border) == 4: + left, top, right, bottom = border + else: + left = top = right = bottom = border + return left, top, right, bottom + + +def _color(color, mode): + if isinstance(color, str): + from . import ImageColor + + color = ImageColor.getcolor(color, mode) + return color + + +def _lut(image, lut): + if image.mode == "P": + # FIXME: apply to lookup table, not image data + msg = "mode P support coming soon" + raise NotImplementedError(msg) + elif image.mode in ("L", "RGB"): + if image.mode == "RGB" and len(lut) == 256: + lut = lut + lut + lut + return image.point(lut) + else: + msg = "not supported for this image mode" + raise OSError(msg) + + +# +# actions + + +def autocontrast(image, cutoff=0, ignore=None, mask=None, preserve_tone=False): + """ + Maximize (normalize) image contrast. This function calculates a + histogram of the input image (or mask region), removes ``cutoff`` percent of the + lightest and darkest pixels from the histogram, and remaps the image + so that the darkest pixel becomes black (0), and the lightest + becomes white (255). + + :param image: The image to process. + :param cutoff: The percent to cut off from the histogram on the low and + high ends. Either a tuple of (low, high), or a single + number for both. + :param ignore: The background pixel value (use None for no background). + :param mask: Histogram used in contrast operation is computed using pixels + within the mask. If no mask is given the entire image is used + for histogram computation. + :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. + + .. versionadded:: 8.2.0 + + :return: An image. + """ + if preserve_tone: + histogram = image.convert("L").histogram(mask) + else: + histogram = image.histogram(mask) + + lut = [] + for layer in range(0, len(histogram), 256): + h = histogram[layer : layer + 256] + if ignore is not None: + # get rid of outliers + try: + h[ignore] = 0 + except TypeError: + # assume sequence + for ix in ignore: + h[ix] = 0 + if cutoff: + # cut off pixels from both ends of the histogram + if not isinstance(cutoff, tuple): + cutoff = (cutoff, cutoff) + # get number of pixels + n = 0 + for ix in range(256): + n = n + h[ix] + # remove cutoff% pixels from the low end + cut = n * cutoff[0] // 100 + for lo in range(256): + if cut > h[lo]: + cut = cut - h[lo] + h[lo] = 0 + else: + h[lo] -= cut + cut = 0 + if cut <= 0: + break + # remove cutoff% samples from the high end + cut = n * cutoff[1] // 100 + for hi in range(255, -1, -1): + if cut > h[hi]: + cut = cut - h[hi] + h[hi] = 0 + else: + h[hi] -= cut + cut = 0 + if cut <= 0: + break + # find lowest/highest samples after preprocessing + for lo in range(256): + if h[lo]: + break + for hi in range(255, -1, -1): + if h[hi]: + break + if hi <= lo: + # don't bother + lut.extend(list(range(256))) + else: + scale = 255.0 / (hi - lo) + offset = -lo * scale + for ix in range(256): + ix = int(ix * scale + offset) + if ix < 0: + ix = 0 + elif ix > 255: + ix = 255 + lut.append(ix) + return _lut(image, lut) + + +def colorize(image, black, white, mid=None, blackpoint=0, whitepoint=255, midpoint=127): + """ + Colorize grayscale image. + This function calculates a color wedge which maps all black pixels in + the source image to the first color and all white pixels to the + second color. If ``mid`` is specified, it uses three-color mapping. + The ``black`` and ``white`` arguments should be RGB tuples or color names; + optionally you can use three-color mapping by also specifying ``mid``. + Mapping positions for any of the colors can be specified + (e.g. ``blackpoint``), where these parameters are the integer + value corresponding to where the corresponding color should be mapped. + These parameters must have logical order, such that + ``blackpoint <= midpoint <= whitepoint`` (if ``mid`` is specified). + + :param image: The image to colorize. + :param black: The color to use for black input pixels. + :param white: The color to use for white input pixels. + :param mid: The color to use for midtone input pixels. + :param blackpoint: an int value [0, 255] for the black mapping. + :param whitepoint: an int value [0, 255] for the white mapping. + :param midpoint: an int value [0, 255] for the midtone mapping. + :return: An image. + """ + + # Initial asserts + assert image.mode == "L" + if mid is None: + assert 0 <= blackpoint <= whitepoint <= 255 + else: + assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 + + # Define colors from arguments + black = _color(black, "RGB") + white = _color(white, "RGB") + if mid is not None: + mid = _color(mid, "RGB") + + # Empty lists for the mapping + red = [] + green = [] + blue = [] + + # Create the low-end values + for i in range(0, blackpoint): + red.append(black[0]) + green.append(black[1]) + blue.append(black[2]) + + # Create the mapping (2-color) + if mid is None: + range_map = range(0, whitepoint - blackpoint) + + for i in range_map: + red.append(black[0] + i * (white[0] - black[0]) // len(range_map)) + green.append(black[1] + i * (white[1] - black[1]) // len(range_map)) + blue.append(black[2] + i * (white[2] - black[2]) // len(range_map)) + + # Create the mapping (3-color) + else: + range_map1 = range(0, midpoint - blackpoint) + range_map2 = range(0, whitepoint - midpoint) + + for i in range_map1: + red.append(black[0] + i * (mid[0] - black[0]) // len(range_map1)) + green.append(black[1] + i * (mid[1] - black[1]) // len(range_map1)) + blue.append(black[2] + i * (mid[2] - black[2]) // len(range_map1)) + for i in range_map2: + red.append(mid[0] + i * (white[0] - mid[0]) // len(range_map2)) + green.append(mid[1] + i * (white[1] - mid[1]) // len(range_map2)) + blue.append(mid[2] + i * (white[2] - mid[2]) // len(range_map2)) + + # Create the high-end values + for i in range(0, 256 - whitepoint): + red.append(white[0]) + green.append(white[1]) + blue.append(white[2]) + + # Return converted image + image = image.convert("RGB") + return _lut(image, red + green + blue) + + +def contain(image, size, method=Image.Resampling.BICUBIC): + """ + Returns a resized version of the image, set to the maximum width and height + within the requested size, while maintaining the original aspect ratio. + + :param image: The image to resize and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :return: An image. + """ + + im_ratio = image.width / image.height + dest_ratio = size[0] / size[1] + + if im_ratio != dest_ratio: + if im_ratio > dest_ratio: + new_height = round(image.height / image.width * size[0]) + if new_height != size[1]: + size = (size[0], new_height) + else: + new_width = round(image.width / image.height * size[1]) + if new_width != size[0]: + size = (new_width, size[1]) + return image.resize(size, resample=method) + + +def pad(image, size, method=Image.Resampling.BICUBIC, color=None, centering=(0.5, 0.5)): + """ + Returns a resized and padded version of the image, expanded to fill the + requested aspect ratio and size. + + :param image: The image to resize and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :param color: The background color of the padded image. + :param centering: Control the position of the original image within the + padded version. + + (0.5, 0.5) will keep the image centered + (0, 0) will keep the image aligned to the top left + (1, 1) will keep the image aligned to the bottom + right + :return: An image. + """ + + resized = contain(image, size, method) + if resized.size == size: + out = resized + else: + out = Image.new(image.mode, size, color) + if resized.palette: + out.putpalette(resized.getpalette()) + if resized.width != size[0]: + x = round((size[0] - resized.width) * max(0, min(centering[0], 1))) + out.paste(resized, (x, 0)) + else: + y = round((size[1] - resized.height) * max(0, min(centering[1], 1))) + out.paste(resized, (0, y)) + return out + + +def crop(image, border=0): + """ + Remove border from image. The same amount of pixels are removed + from all four sides. This function works on all image modes. + + .. seealso:: :py:meth:`~PIL.Image.Image.crop` + + :param image: The image to crop. + :param border: The number of pixels to remove. + :return: An image. + """ + left, top, right, bottom = _border(border) + return image.crop((left, top, image.size[0] - right, image.size[1] - bottom)) + + +def scale(image, factor, resample=Image.Resampling.BICUBIC): + """ + Returns a rescaled image by a specific factor given in parameter. + A factor greater than 1 expands the image, between 0 and 1 contracts the + image. + + :param image: The image to rescale. + :param factor: The expansion factor, as a float. + :param resample: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + if factor == 1: + return image.copy() + elif factor <= 0: + msg = "the factor must be greater than 0" + raise ValueError(msg) + else: + size = (round(factor * image.width), round(factor * image.height)) + return image.resize(size, resample) + + +def deform(image, deformer, resample=Image.Resampling.BILINEAR): + """ + Deform the image. + + :param image: The image to deform. + :param deformer: A deformer object. Any object that implements a + ``getmesh`` method can be used. + :param resample: An optional resampling filter. Same values possible as + in the PIL.Image.transform function. + :return: An image. + """ + return image.transform( + image.size, Image.Transform.MESH, deformer.getmesh(image), resample + ) + + +def equalize(image, mask=None): + """ + Equalize the image histogram. This function applies a non-linear + mapping to the input image, in order to create a uniform + distribution of grayscale values in the output image. + + :param image: The image to equalize. + :param mask: An optional mask. If given, only the pixels selected by + the mask are included in the analysis. + :return: An image. + """ + if image.mode == "P": + image = image.convert("RGB") + h = image.histogram(mask) + lut = [] + for b in range(0, len(h), 256): + histo = [_f for _f in h[b : b + 256] if _f] + if len(histo) <= 1: + lut.extend(list(range(256))) + else: + step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 + if not step: + lut.extend(list(range(256))) + else: + n = step // 2 + for i in range(256): + lut.append(n // step) + n = n + h[i + b] + return _lut(image, lut) + + +def expand(image, border=0, fill=0): + """ + Add border to the image + + :param image: The image to expand. + :param border: Border width, in pixels. + :param fill: Pixel fill value (a color value). Default is 0 (black). + :return: An image. + """ + left, top, right, bottom = _border(border) + width = left + image.size[0] + right + height = top + image.size[1] + bottom + color = _color(fill, image.mode) + if image.palette: + palette = ImagePalette.ImagePalette(palette=image.getpalette()) + if isinstance(color, tuple): + color = palette.getcolor(color) + else: + palette = None + out = Image.new(image.mode, (width, height), color) + if palette: + out.putpalette(palette.palette) + out.paste(image, (left, top)) + return out + + +def fit(image, size, method=Image.Resampling.BICUBIC, bleed=0.0, centering=(0.5, 0.5)): + """ + Returns a resized and cropped version of the image, cropped to the + requested aspect ratio and size. + + This function was contributed by Kevin Cazabon. + + :param image: The image to resize and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :param bleed: Remove a border around the outside of the image from all + four edges. The value is a decimal percentage (use 0.01 for + one percent). The default value is 0 (no border). + Cannot be greater than or equal to 0.5. + :param centering: Control the cropping position. Use (0.5, 0.5) for + center cropping (e.g. if cropping the width, take 50% off + of the left side, and therefore 50% off the right side). + (0.0, 0.0) will crop from the top left corner (i.e. if + cropping the width, take all of the crop off of the right + side, and if cropping the height, take all of it off the + bottom). (1.0, 0.0) will crop from the bottom left + corner, etc. (i.e. if cropping the width, take all of the + crop off the left side, and if cropping the height take + none from the top, and therefore all off the bottom). + :return: An image. + """ + + # by Kevin Cazabon, Feb 17/2000 + # kevin@cazabon.com + # https://www.cazabon.com + + # ensure centering is mutable + centering = list(centering) + + if not 0.0 <= centering[0] <= 1.0: + centering[0] = 0.5 + if not 0.0 <= centering[1] <= 1.0: + centering[1] = 0.5 + + if not 0.0 <= bleed < 0.5: + bleed = 0.0 + + # calculate the area to use for resizing and cropping, subtracting + # the 'bleed' around the edges + + # number of pixels to trim off on Top and Bottom, Left and Right + bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) + + live_size = ( + image.size[0] - bleed_pixels[0] * 2, + image.size[1] - bleed_pixels[1] * 2, + ) + + # calculate the aspect ratio of the live_size + live_size_ratio = live_size[0] / live_size[1] + + # calculate the aspect ratio of the output image + output_ratio = size[0] / size[1] + + # figure out if the sides or top/bottom will be cropped off + if live_size_ratio == output_ratio: + # live_size is already the needed ratio + crop_width = live_size[0] + crop_height = live_size[1] + elif live_size_ratio >= output_ratio: + # live_size is wider than what's needed, crop the sides + crop_width = output_ratio * live_size[1] + crop_height = live_size[1] + else: + # live_size is taller than what's needed, crop the top and bottom + crop_width = live_size[0] + crop_height = live_size[0] / output_ratio + + # make the crop + crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering[0] + crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering[1] + + crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) + + # resize the image and return it + return image.resize(size, method, box=crop) + + +def flip(image): + """ + Flip the image vertically (top to bottom). + + :param image: The image to flip. + :return: An image. + """ + return image.transpose(Image.Transpose.FLIP_TOP_BOTTOM) + + +def grayscale(image): + """ + Convert the image to grayscale. + + :param image: The image to convert. + :return: An image. + """ + return image.convert("L") + + +def invert(image): + """ + Invert (negate) the image. + + :param image: The image to invert. + :return: An image. + """ + lut = [] + for i in range(256): + lut.append(255 - i) + return image.point(lut) if image.mode == "1" else _lut(image, lut) + + +def mirror(image): + """ + Flip image horizontally (left to right). + + :param image: The image to mirror. + :return: An image. + """ + return image.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + + +def posterize(image, bits): + """ + Reduce the number of bits for each color channel. + + :param image: The image to posterize. + :param bits: The number of bits to keep for each channel (1-8). + :return: An image. + """ + lut = [] + mask = ~(2 ** (8 - bits) - 1) + for i in range(256): + lut.append(i & mask) + return _lut(image, lut) + + +def solarize(image, threshold=128): + """ + Invert all pixel values above a threshold. + + :param image: The image to solarize. + :param threshold: All pixels above this greyscale level are inverted. + :return: An image. + """ + lut = [] + for i in range(256): + if i < threshold: + lut.append(i) + else: + lut.append(255 - i) + return _lut(image, lut) + + +def exif_transpose(image): + """ + If an image has an EXIF Orientation tag, other than 1, return a new image + that is transposed accordingly. The new image will have the orientation + data removed. + + Otherwise, return a copy of the image. + + :param image: The image to transpose. + :return: An image. + """ + exif = image.getexif() + orientation = exif.get(0x0112) + method = { + 2: Image.Transpose.FLIP_LEFT_RIGHT, + 3: Image.Transpose.ROTATE_180, + 4: Image.Transpose.FLIP_TOP_BOTTOM, + 5: Image.Transpose.TRANSPOSE, + 6: Image.Transpose.ROTATE_270, + 7: Image.Transpose.TRANSVERSE, + 8: Image.Transpose.ROTATE_90, + }.get(orientation) + if method is not None: + transposed_image = image.transpose(method) + transposed_exif = transposed_image.getexif() + if 0x0112 in transposed_exif: + del transposed_exif[0x0112] + if "exif" in transposed_image.info: + transposed_image.info["exif"] = transposed_exif.tobytes() + elif "Raw profile type exif" in transposed_image.info: + transposed_image.info[ + "Raw profile type exif" + ] = transposed_exif.tobytes().hex() + elif "XML:com.adobe.xmp" in transposed_image.info: + for pattern in ( + r'tiff:Orientation="([0-9])"', + r"([0-9])", + ): + transposed_image.info["XML:com.adobe.xmp"] = re.sub( + pattern, "", transposed_image.info["XML:com.adobe.xmp"] + ) + return transposed_image + return image.copy() diff --git a/.venv/Lib/site-packages/PIL/ImagePalette.py b/.venv/Lib/site-packages/PIL/ImagePalette.py new file mode 100644 index 00000000..e455c045 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImagePalette.py @@ -0,0 +1,272 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image palette object +# +# History: +# 1996-03-11 fl Rewritten. +# 1997-01-03 fl Up and running. +# 1997-08-23 fl Added load hack +# 2001-04-16 fl Fixed randint shadow bug in random() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import array + +from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile +from ._deprecate import deprecate + + +class ImagePalette: + """ + Color palette for palette mapped images + + :param mode: The mode to use for the palette. See: + :ref:`concept-modes`. Defaults to "RGB" + :param palette: An optional palette. If given, it must be a bytearray, + an array or a list of ints between 0-255. The list must consist of + all channels for one color followed by the next color (e.g. RGBRGBRGB). + Defaults to an empty palette. + """ + + def __init__(self, mode="RGB", palette=None, size=0): + self.mode = mode + self.rawmode = None # if set, palette contains raw data + self.palette = palette or bytearray() + self.dirty = None + if size != 0: + deprecate("The size parameter", 10, None) + if size != len(self.palette): + msg = "wrong palette size" + raise ValueError(msg) + + @property + def palette(self): + return self._palette + + @palette.setter + def palette(self, palette): + self._colors = None + self._palette = palette + + @property + def colors(self): + if self._colors is None: + mode_len = len(self.mode) + self._colors = {} + for i in range(0, len(self.palette), mode_len): + color = tuple(self.palette[i : i + mode_len]) + if color in self._colors: + continue + self._colors[color] = i // mode_len + return self._colors + + @colors.setter + def colors(self, colors): + self._colors = colors + + def copy(self): + new = ImagePalette() + + new.mode = self.mode + new.rawmode = self.rawmode + if self.palette is not None: + new.palette = self.palette[:] + new.dirty = self.dirty + + return new + + def getdata(self): + """ + Get palette contents in format suitable for the low-level + ``im.putpalette`` primitive. + + .. warning:: This method is experimental. + """ + if self.rawmode: + return self.rawmode, self.palette + return self.mode, self.tobytes() + + def tobytes(self): + """Convert palette to bytes. + + .. warning:: This method is experimental. + """ + if self.rawmode: + msg = "palette contains raw palette data" + raise ValueError(msg) + if isinstance(self.palette, bytes): + return self.palette + arr = array.array("B", self.palette) + return arr.tobytes() + + # Declare tostring as an alias for tobytes + tostring = tobytes + + def getcolor(self, color, image=None): + """Given an rgb tuple, allocate palette entry. + + .. warning:: This method is experimental. + """ + if self.rawmode: + msg = "palette contains raw palette data" + raise ValueError(msg) + if isinstance(color, tuple): + if self.mode == "RGB": + if len(color) == 4: + if color[3] != 255: + msg = "cannot add non-opaque RGBA color to RGB palette" + raise ValueError(msg) + color = color[:3] + elif self.mode == "RGBA": + if len(color) == 3: + color += (255,) + try: + return self.colors[color] + except KeyError as e: + # allocate new color slot + if not isinstance(self.palette, bytearray): + self._palette = bytearray(self.palette) + index = len(self.palette) // 3 + special_colors = () + if image: + special_colors = ( + image.info.get("background"), + image.info.get("transparency"), + ) + while index in special_colors: + index += 1 + if index >= 256: + if image: + # Search for an unused index + for i, count in reversed(list(enumerate(image.histogram()))): + if count == 0 and i not in special_colors: + index = i + break + if index >= 256: + msg = "cannot allocate more than 256 colors" + raise ValueError(msg) from e + self.colors[color] = index + if index * 3 < len(self.palette): + self._palette = ( + self.palette[: index * 3] + + bytes(color) + + self.palette[index * 3 + 3 :] + ) + else: + self._palette += bytes(color) + self.dirty = 1 + return index + else: + msg = f"unknown color specifier: {repr(color)}" + raise ValueError(msg) + + def save(self, fp): + """Save palette to text file. + + .. warning:: This method is experimental. + """ + if self.rawmode: + msg = "palette contains raw palette data" + raise ValueError(msg) + if isinstance(fp, str): + fp = open(fp, "w") + fp.write("# Palette\n") + fp.write(f"# Mode: {self.mode}\n") + for i in range(256): + fp.write(f"{i}") + for j in range(i * len(self.mode), (i + 1) * len(self.mode)): + try: + fp.write(f" {self.palette[j]}") + except IndexError: + fp.write(" 0") + fp.write("\n") + fp.close() + + +# -------------------------------------------------------------------- +# Internal + + +def raw(rawmode, data): + palette = ImagePalette() + palette.rawmode = rawmode + palette.palette = data + palette.dirty = 1 + return palette + + +# -------------------------------------------------------------------- +# Factories + + +def make_linear_lut(black, white): + lut = [] + if black == 0: + for i in range(256): + lut.append(white * i // 255) + else: + raise NotImplementedError # FIXME + return lut + + +def make_gamma_lut(exp): + lut = [] + for i in range(256): + lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5)) + return lut + + +def negative(mode="RGB"): + palette = list(range(256 * len(mode))) + palette.reverse() + return ImagePalette(mode, [i // len(mode) for i in palette]) + + +def random(mode="RGB"): + from random import randint + + palette = [] + for i in range(256 * len(mode)): + palette.append(randint(0, 255)) + return ImagePalette(mode, palette) + + +def sepia(white="#fff0c0"): + bands = [make_linear_lut(0, band) for band in ImageColor.getrgb(white)] + return ImagePalette("RGB", [bands[i % 3][i // 3] for i in range(256 * 3)]) + + +def wedge(mode="RGB"): + palette = list(range(256 * len(mode))) + return ImagePalette(mode, [i // len(mode) for i in palette]) + + +def load(filename): + # FIXME: supports GIMP gradients only + + with open(filename, "rb") as fp: + for paletteHandler in [ + GimpPaletteFile.GimpPaletteFile, + GimpGradientFile.GimpGradientFile, + PaletteFile.PaletteFile, + ]: + try: + fp.seek(0) + lut = paletteHandler(fp).getpalette() + if lut: + break + except (SyntaxError, ValueError): + # import traceback + # traceback.print_exc() + pass + else: + msg = "cannot load palette" + raise OSError(msg) + + return lut # data, rawmode diff --git a/.venv/Lib/site-packages/PIL/ImagePath.py b/.venv/Lib/site-packages/PIL/ImagePath.py new file mode 100644 index 00000000..3d3538c9 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImagePath.py @@ -0,0 +1,19 @@ +# +# The Python Imaging Library +# $Id$ +# +# path interface +# +# History: +# 1996-11-04 fl Created +# 2002-04-14 fl Added documentation stub class +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +from . import Image + +Path = Image.core.path diff --git a/.venv/Lib/site-packages/PIL/ImageQt.py b/.venv/Lib/site-packages/PIL/ImageQt.py new file mode 100644 index 00000000..ad607a97 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageQt.py @@ -0,0 +1,229 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a simple Qt image interface. +# +# history: +# 2006-06-03 fl: created +# 2006-06-04 fl: inherit from QImage instead of wrapping it +# 2006-06-05 fl: removed toimage helper; move string support to ImageQt +# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) +# +# Copyright (c) 2006 by Secret Labs AB +# Copyright (c) 2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import sys +from io import BytesIO + +from . import Image +from ._deprecate import deprecate +from ._util import is_path + +qt_versions = [ + ["6", "PyQt6"], + ["side6", "PySide6"], + ["5", "PyQt5"], + ["side2", "PySide2"], +] + +# If a version has already been imported, attempt it first +qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules, reverse=True) +for qt_version, qt_module in qt_versions: + try: + if qt_module == "PyQt6": + from PyQt6.QtCore import QBuffer, QIODevice + from PyQt6.QtGui import QImage, QPixmap, qRgba + elif qt_module == "PySide6": + from PySide6.QtCore import QBuffer, QIODevice + from PySide6.QtGui import QImage, QPixmap, qRgba + elif qt_module == "PyQt5": + from PyQt5.QtCore import QBuffer, QIODevice + from PyQt5.QtGui import QImage, QPixmap, qRgba + + deprecate("Support for PyQt5", 10, "PyQt6 or PySide6") + elif qt_module == "PySide2": + from PySide2.QtCore import QBuffer, QIODevice + from PySide2.QtGui import QImage, QPixmap, qRgba + + deprecate("Support for PySide2", 10, "PyQt6 or PySide6") + except (ImportError, RuntimeError): + continue + qt_is_installed = True + break +else: + qt_is_installed = False + qt_version = None + + +def rgb(r, g, b, a=255): + """(Internal) Turns an RGB color into a Qt compatible color integer.""" + # use qRgb to pack the colors, and then turn the resulting long + # into a negative integer with the same bitpattern. + return qRgba(r, g, b, a) & 0xFFFFFFFF + + +def fromqimage(im): + """ + :param im: QImage or PIL ImageQt object + """ + buffer = QBuffer() + if qt_version == "6": + try: + qt_openmode = QIODevice.OpenModeFlag + except AttributeError: + qt_openmode = QIODevice.OpenMode + else: + qt_openmode = QIODevice + buffer.open(qt_openmode.ReadWrite) + # preserve alpha channel with png + # otherwise ppm is more friendly with Image.open + if im.hasAlphaChannel(): + im.save(buffer, "png") + else: + im.save(buffer, "ppm") + + b = BytesIO() + b.write(buffer.data()) + buffer.close() + b.seek(0) + + return Image.open(b) + + +def fromqpixmap(im): + return fromqimage(im) + # buffer = QBuffer() + # buffer.open(QIODevice.ReadWrite) + # # im.save(buffer) + # # What if png doesn't support some image features like animation? + # im.save(buffer, 'ppm') + # bytes_io = BytesIO() + # bytes_io.write(buffer.data()) + # buffer.close() + # bytes_io.seek(0) + # return Image.open(bytes_io) + + +def align8to32(bytes, width, mode): + """ + converts each scanline of data from 8 bit to 32 bit aligned + """ + + bits_per_pixel = {"1": 1, "L": 8, "P": 8, "I;16": 16}[mode] + + # calculate bytes per line and the extra padding if needed + bits_per_line = bits_per_pixel * width + full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) + bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) + + extra_padding = -bytes_per_line % 4 + + # already 32 bit aligned by luck + if not extra_padding: + return bytes + + new_data = [] + for i in range(len(bytes) // bytes_per_line): + new_data.append( + bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + + b"\x00" * extra_padding + ) + + return b"".join(new_data) + + +def _toqclass_helper(im): + data = None + colortable = None + exclusive_fp = False + + # handle filename, if given instead of image name + if hasattr(im, "toUtf8"): + # FIXME - is this really the best way to do this? + im = str(im.toUtf8(), "utf-8") + if is_path(im): + im = Image.open(im) + exclusive_fp = True + + qt_format = QImage.Format if qt_version == "6" else QImage + if im.mode == "1": + format = qt_format.Format_Mono + elif im.mode == "L": + format = qt_format.Format_Indexed8 + colortable = [] + for i in range(256): + colortable.append(rgb(i, i, i)) + elif im.mode == "P": + format = qt_format.Format_Indexed8 + colortable = [] + palette = im.getpalette() + for i in range(0, len(palette), 3): + colortable.append(rgb(*palette[i : i + 3])) + elif im.mode == "RGB": + # Populate the 4th channel with 255 + im = im.convert("RGBA") + + data = im.tobytes("raw", "BGRA") + format = qt_format.Format_RGB32 + elif im.mode == "RGBA": + data = im.tobytes("raw", "BGRA") + format = qt_format.Format_ARGB32 + elif im.mode == "I;16" and hasattr(qt_format, "Format_Grayscale16"): # Qt 5.13+ + im = im.point(lambda i: i * 256) + + format = qt_format.Format_Grayscale16 + else: + if exclusive_fp: + im.close() + msg = f"unsupported image mode {repr(im.mode)}" + raise ValueError(msg) + + size = im.size + __data = data or align8to32(im.tobytes(), size[0], im.mode) + if exclusive_fp: + im.close() + return {"data": __data, "size": size, "format": format, "colortable": colortable} + + +if qt_is_installed: + + class ImageQt(QImage): + def __init__(self, im): + """ + An PIL image wrapper for Qt. This is a subclass of PyQt's QImage + class. + + :param im: A PIL Image object, or a file name (given either as + Python string or a PyQt string object). + """ + im_data = _toqclass_helper(im) + # must keep a reference, or Qt will crash! + # All QImage constructors that take data operate on an existing + # buffer, so this buffer has to hang on for the life of the image. + # Fixes https://github.com/python-pillow/Pillow/issues/1370 + self.__data = im_data["data"] + super().__init__( + self.__data, + im_data["size"][0], + im_data["size"][1], + im_data["format"], + ) + if im_data["colortable"]: + self.setColorTable(im_data["colortable"]) + + +def toqimage(im): + return ImageQt(im) + + +def toqpixmap(im): + # # This doesn't work. For now using a dumb approach. + # im_data = _toqclass_helper(im) + # result = QPixmap(im_data["size"][0], im_data["size"][1]) + # result.loadFromData(im_data["data"]) + qimage = toqimage(im) + return QPixmap.fromImage(qimage) diff --git a/.venv/Lib/site-packages/PIL/ImageSequence.py b/.venv/Lib/site-packages/PIL/ImageSequence.py new file mode 100644 index 00000000..c4bb6334 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageSequence.py @@ -0,0 +1,76 @@ +# +# The Python Imaging Library. +# $Id$ +# +# sequence support classes +# +# history: +# 1997-02-20 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## + + +class Iterator: + """ + This class implements an iterator object that can be used to loop + over an image sequence. + + You can use the ``[]`` operator to access elements by index. This operator + will raise an :py:exc:`IndexError` if you try to access a nonexistent + frame. + + :param im: An image object. + """ + + def __init__(self, im): + if not hasattr(im, "seek"): + msg = "im must have seek method" + raise AttributeError(msg) + self.im = im + self.position = getattr(self.im, "_min_frame", 0) + + def __getitem__(self, ix): + try: + self.im.seek(ix) + return self.im + except EOFError as e: + raise IndexError from e # end of sequence + + def __iter__(self): + return self + + def __next__(self): + try: + self.im.seek(self.position) + self.position += 1 + return self.im + except EOFError as e: + raise StopIteration from e + + +def all_frames(im, func=None): + """ + Applies a given function to all frames in an image or a list of images. + The frames are returned as a list of separate images. + + :param im: An image, or a list of images. + :param func: The function to apply to all of the image frames. + :returns: A list of images. + """ + if not isinstance(im, list): + im = [im] + + ims = [] + for imSequence in im: + current = imSequence.tell() + + ims += [im_frame.copy() for im_frame in Iterator(imSequence)] + + imSequence.seek(current) + return [func(im) for im in ims] if func else ims diff --git a/.venv/Lib/site-packages/PIL/ImageShow.py b/.venv/Lib/site-packages/PIL/ImageShow.py new file mode 100644 index 00000000..f0e73fb9 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageShow.py @@ -0,0 +1,398 @@ +# +# The Python Imaging Library. +# $Id$ +# +# im.show() drivers +# +# History: +# 2008-04-06 fl Created +# +# Copyright (c) Secret Labs AB 2008. +# +# See the README file for information on usage and redistribution. +# +import os +import shutil +import subprocess +import sys +from shlex import quote + +from PIL import Image + +from ._deprecate import deprecate + +_viewers = [] + + +def register(viewer, order=1): + """ + 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, title=None, **options): + 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, **options): + """ + 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 = None + """The format to convert the image into.""" + options = {} + """Additional options used to convert the image.""" + + def get_format(self, image): + """Return format name, or ``None`` to save as PGM/PPM.""" + return self.format + + def get_command(self, file, **options): + """ + Returns the command used to display the file. + Not implemented in the base class. + """ + raise NotImplementedError + + def save_image(self, image): + """Save to temporary file and return filename.""" + return image._dump(format=self.get_format(image), **self.options) + + def show_image(self, image, **options): + """Display the given image.""" + return self.show_file(self.save_image(image), **options) + + def show_file(self, path=None, **options): + """ + Display given file. + + Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, + and will be removed in Pillow 10.0.0 (2023-07-01). ``path`` should be used + instead. + """ + if path is None: + if "file" in options: + deprecate("The 'file' argument", 10, "'path'") + path = options.pop("file") + else: + msg = "Missing required argument: 'path'" + raise TypeError(msg) + 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, **options): + return ( + f'start "Pillow" /WAIT "{file}" ' + "&& ping -n 4 127.0.0.1 >NUL " + f'&& del /f "{file}"' + ) + + +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, **options): + # 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=None, **options): + """ + Display given file. + + Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, + and will be removed in Pillow 10.0.0 (2023-07-01). ``path`` should be used + instead. + """ + if path is None: + if "file" in options: + deprecate("The 'file' argument", 10, "'path'") + path = options.pop("file") + else: + msg = "Missing required argument: 'path'" + raise TypeError(msg) + 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} + + def get_command(self, file, **options): + 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, **options): + command = executable = "xdg-open" + return command, executable + + def show_file(self, path=None, **options): + """ + Display given file. + + Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, + and will be removed in Pillow 10.0.0 (2023-07-01). ``path`` should be used + instead. + """ + if path is None: + if "file" in options: + deprecate("The 'file' argument", 10, "'path'") + path = options.pop("file") + else: + msg = "Missing required argument: 'path'" + raise TypeError(msg) + 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, title=None, **options): + command = executable = "display" + if title: + command += f" -title {quote(title)}" + return command, executable + + def show_file(self, path=None, **options): + """ + Display given file. + + Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, + and ``path`` should be used instead. + """ + if path is None: + if "file" in options: + deprecate("The 'file' argument", 10, "'path'") + path = options.pop("file") + else: + msg = "Missing required argument: 'path'" + raise TypeError(msg) + 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, **options): + executable = "gm" + command = "gm display" + return command, executable + + def show_file(self, path=None, **options): + """ + Display given file. + + Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, + and ``path`` should be used instead. + """ + if path is None: + if "file" in options: + deprecate("The 'file' argument", 10, "'path'") + path = options.pop("file") + else: + msg = "Missing required argument: 'path'" + raise TypeError(msg) + subprocess.Popen(["gm", "display", path]) + return 1 + + +class EogViewer(UnixViewer): + """The GNOME Image Viewer ``eog`` command.""" + + def get_command_ex(self, file, **options): + executable = "eog" + command = "eog -n" + return command, executable + + def show_file(self, path=None, **options): + """ + Display given file. + + Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, + and ``path`` should be used instead. + """ + if path is None: + if "file" in options: + deprecate("The 'file' argument", 10, "'path'") + path = options.pop("file") + else: + msg = "Missing required argument: 'path'" + raise TypeError(msg) + 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, title=None, **options): + # 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=None, **options): + """ + Display given file. + + Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, + and ``path`` should be used instead. + """ + if path is None: + if "file" in options: + deprecate("The 'file' argument", 10, "'path'") + path = options.pop("file") + else: + msg = "Missing required argument: 'path'" + raise TypeError(msg) + 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, **options): + 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/site-packages/PIL/ImageStat.py b/.venv/Lib/site-packages/PIL/ImageStat.py new file mode 100644 index 00000000..b7ebddf0 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageStat.py @@ -0,0 +1,148 @@ +# +# 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. +# + +import functools +import math +import operator + + +class Stat: + def __init__(self, image_or_list, mask=None): + try: + if mask: + self.h = image_or_list.histogram(mask) + else: + self.h = image_or_list.histogram() + except AttributeError: + self.h = image_or_list # assume it to be a histogram list + if not isinstance(self.h, list): + msg = "first argument must be image or list" + raise TypeError(msg) + self.bands = list(range(len(self.h) // 256)) + + def __getattr__(self, id): + """Calculate missing attribute""" + if id[:4] == "_get": + raise AttributeError(id) + # calculate missing attribute + v = getattr(self, "_get" + id)() + setattr(self, id, v) + return v + + def _getextrema(self): + """Get min/max values for each band in the image""" + + def minmax(histogram): + n = 255 + x = 0 + for i in range(256): + if histogram[i]: + n = min(n, i) + x = max(x, i) + return n, x # returns (255, 0) if there's no data in the histogram + + v = [] + for i in range(0, len(self.h), 256): + v.append(minmax(self.h[i:])) + return v + + def _getcount(self): + """Get total number of pixels in each layer""" + + v = [] + for i in range(0, len(self.h), 256): + v.append(functools.reduce(operator.add, self.h[i : i + 256])) + return v + + def _getsum(self): + """Get sum of all pixels in each layer""" + + 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 + + def _getsum2(self): + """Get squared sum of all pixels in each layer""" + + 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 + + def _getmean(self): + """Get average pixel level for each layer""" + + v = [] + for i in self.bands: + v.append(self.sum[i] / self.count[i]) + return v + + def _getmedian(self): + """Get median pixel level for each layer""" + + 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 + + def _getrms(self): + """Get RMS for each layer""" + + v = [] + for i in self.bands: + v.append(math.sqrt(self.sum2[i] / self.count[i])) + return v + + def _getvar(self): + """Get variance for each layer""" + + v = [] + for i in self.bands: + n = self.count[i] + v.append((self.sum2[i] - (self.sum[i] ** 2.0) / n) / n) + return v + + def _getstddev(self): + """Get standard deviation for each layer""" + + v = [] + for i in self.bands: + v.append(math.sqrt(self.var[i])) + return v + + +Global = Stat # compatibility diff --git a/.venv/Lib/site-packages/PIL/ImageTk.py b/.venv/Lib/site-packages/PIL/ImageTk.py new file mode 100644 index 00000000..ef569ed2 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageTk.py @@ -0,0 +1,290 @@ +# +# 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. +# + +import tkinter +from io import BytesIO + +from . import Image +from ._deprecate import deprecate + +# -------------------------------------------------------------------- +# Check for Tkinter interface hooks + +_pilbitmap_ok = None + + +def _pilbitmap_check(): + 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): + 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): + """ + 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): + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self): + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def paste(self, im, box=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. + :param box: Deprecated. This parameter will be removed in Pillow 10 + (2023-07-01). + """ + + if box is not None: + deprecate("The box parameter", 10, None) + + # 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): + 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): + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self): + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def __str__(self): + """ + 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): + """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/site-packages/PIL/ImageTransform.py b/.venv/Lib/site-packages/PIL/ImageTransform.py new file mode 100644 index 00000000..7881f0d2 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageTransform.py @@ -0,0 +1,102 @@ +# +# 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 . import Image + + +class Transform(Image.ImageTransformHandler): + def __init__(self, data): + self.data = data + + def getdata(self): + return self.method, self.data + + def transform(self, size, image, **options): + # 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:`~PIL.Image.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 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:`~PIL.Image.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:`~PIL.Image.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:`~PIL.Image.Image.transform` + + :param data: A list of (bbox, quad) tuples. + """ + + method = Image.Transform.MESH diff --git a/.venv/Lib/site-packages/PIL/ImageWin.py b/.venv/Lib/site-packages/PIL/ImageWin.py new file mode 100644 index 00000000..ca9b14c8 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImageWin.py @@ -0,0 +1,230 @@ +# +# 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 . 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): + self.dc = dc + + def __int__(self): + 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): + self.wnd = wnd + + def __int__(self): + 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 greylevels + are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together + with 20 greylevels. + + 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, size=None): + if hasattr(image, "mode") and hasattr(image, "size"): + mode = image.mode + size = image.size + else: + mode = image + image = None + 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: + 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, box=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): + """ + Load display memory contents from byte data. + + :param buffer: A buffer containing display data (usually + data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) + """ + return self.image.frombytes(buffer) + + def tobytes(self): + """ + 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="PIL", width=None, height=None): + self.hwnd = Image.core.createwindow( + title, self.__dispatcher, width or 0, height or 0 + ) + + def __dispatcher(self, action, *args): + return getattr(self, "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): + pass + + def ui_handle_repair(self, dc, x0, y0, x1, y1): + pass + + def ui_handle_resize(self, width, height): + pass + + def mainloop(self): + 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/site-packages/PIL/ImtImagePlugin.py b/.venv/Lib/site-packages/PIL/ImtImagePlugin.py new file mode 100644 index 00000000..ac267457 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/ImtImagePlugin.py @@ -0,0 +1,101 @@ +# +# 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. +# + + +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): + # Quick rejection: if there's not a LF among the first + # 100 bytes, this is (probably) not a text header. + + 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/site-packages/PIL/IptcImagePlugin.py b/.venv/Lib/site-packages/PIL/IptcImagePlugin.py new file mode 100644 index 00000000..4c47b55c --- /dev/null +++ b/.venv/Lib/site-packages/PIL/IptcImagePlugin.py @@ -0,0 +1,230 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IPTC/NAA file handling +# +# history: +# 1995-10-01 fl Created +# 1998-03-09 fl Cleaned up and added to PIL +# 2002-06-18 fl Added getiptcinfo helper +# +# Copyright (c) Secret Labs AB 1997-2002. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# +import os +import tempfile + +from . import Image, ImageFile +from ._binary import i8 +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 + +COMPRESSION = {1: "raw", 5: "jpeg"} + +PAD = o8(0) * 4 + + +# +# Helpers + + +def i(c): + return i32((PAD + c)[-4:]) + + +def dump(c): + for i in c: + print("%02x" % i8(i), end=" ") + print() + + +## +# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields +# from TIFF and JPEG files, use the getiptcinfo function. + + +class IptcImageFile(ImageFile.ImageFile): + format = "IPTC" + format_description = "IPTC/NAA" + + def getint(self, key): + return i(self.info[key]) + + def field(self): + # + # get a IPTC field header + s = self.fp.read(5) + if not len(s): + return None, 0 + + tag = s[1], s[2] + + # syntax + if s[0] != 0x1C or tag[0] < 1 or tag[0] > 9: + msg = "invalid IPTC/NAA file" + raise SyntaxError(msg) + + # field size + size = s[3] + if size > 132: + msg = "illegal field length in IPTC/NAA file" + raise OSError(msg) + elif size == 128: + size = 0 + elif size > 128: + size = i(self.fp.read(size - 128)) + else: + size = i16(s, 3) + + return tag, size + + def _open(self): + # load descriptive fields + while True: + offset = self.fp.tell() + tag, size = self.field() + if not tag or tag == (8, 10): + break + if size: + tagdata = self.fp.read(size) + else: + tagdata = None + if tag in self.info: + if isinstance(self.info[tag], list): + self.info[tag].append(tagdata) + else: + self.info[tag] = [self.info[tag], tagdata] + else: + self.info[tag] = tagdata + + # mode + layers = i8(self.info[(3, 60)][0]) + component = i8(self.info[(3, 60)][1]) + if (3, 65) in self.info: + id = i8(self.info[(3, 65)][0]) - 1 + else: + id = 0 + if layers == 1 and not component: + self.mode = "L" + elif layers == 3 and component: + self.mode = "RGB"[id] + elif layers == 4 and component: + self.mode = "CMYK"[id] + + # size + self._size = self.getint((3, 20)), self.getint((3, 30)) + + # compression + try: + compression = COMPRESSION[self.getint((3, 120))] + except KeyError as e: + msg = "Unknown IPTC image compression" + raise OSError(msg) from e + + # tile + if tag == (8, 10): + self.tile = [ + ("iptc", (compression, offset), (0, 0, self.size[0], self.size[1])) + ] + + def load(self): + if len(self.tile) != 1 or self.tile[0][0] != "iptc": + return ImageFile.ImageFile.load(self) + + type, tile, box = self.tile[0] + + encoding, offset = tile + + self.fp.seek(offset) + + # Copy image data to temporary file + o_fd, outfile = tempfile.mkstemp(text=False) + o = os.fdopen(o_fd) + if encoding == "raw": + # To simplify access to the extracted file, + # prepend a PPM header + o.write("P5\n%d %d\n255\n" % self.size) + while True: + type, size = self.field() + if type != (8, 10): + break + while size > 0: + s = self.fp.read(min(size, 8192)) + if not s: + break + o.write(s) + size -= len(s) + o.close() + + try: + with Image.open(outfile) as _im: + _im.load() + self.im = _im.im + finally: + try: + os.unlink(outfile) + except OSError: + pass + + +Image.register_open(IptcImageFile.format, IptcImageFile) + +Image.register_extension(IptcImageFile.format, ".iim") + + +def getiptcinfo(im): + """ + Get IPTC information from TIFF, JPEG, or IPTC file. + + :param im: An image containing IPTC data. + :returns: A dictionary containing IPTC information, or None if + no IPTC information block was found. + """ + import io + + from . import JpegImagePlugin, TiffImagePlugin + + data = None + + if isinstance(im, IptcImageFile): + # return info dictionary right away + return im.info + + elif isinstance(im, JpegImagePlugin.JpegImageFile): + # extract the IPTC/NAA resource + photoshop = im.info.get("photoshop") + if photoshop: + data = photoshop.get(0x0404) + + elif isinstance(im, TiffImagePlugin.TiffImageFile): + # get raw data from the IPTC/NAA tag (PhotoShop tags the data + # as 4-byte integers, so we cannot use the get method...) + try: + data = im.tag.tagdata[TiffImagePlugin.IPTC_NAA_CHUNK] + except (AttributeError, KeyError): + pass + + if data is None: + return None # no properties + + # create an IptcImagePlugin object without initializing it + class FakeImage: + pass + + im = FakeImage() + im.__class__ = IptcImageFile + + # parse the IPTC information chunk + im.info = {} + im.fp = io.BytesIO(data) + + try: + im._open() + except (IndexError, KeyError): + pass # expected failure + + return im.info diff --git a/.venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py b/.venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py new file mode 100644 index 00000000..9309768b --- /dev/null +++ b/.venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py @@ -0,0 +1,399 @@ +# +# 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. +# +import io +import os +import struct + +from . import Image, ImageFile, _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): + 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): + 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): + size = struct.calcsize(field_format) + data = self._read_bytes(size) + return struct.unpack(field_format, data) + + def read_boxes(self): + size = self.remaining_in_box + data = self._read_bytes(size) + return BoxReader(io.BytesIO(data), size) + + def has_next_box(self): + if self.has_length: + return self.fp.tell() + self.remaining_in_box < self.length + else: + return True + + def next_box_type(self): + # 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 = self.read_fields(">I4s") + if lbox == 1: + lbox = 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): + """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 + ) + ssiz = [None] * csiz + xrsiz = [None] * csiz + yrsiz = [None] * csiz + for i in range(csiz): + ssiz[i], xrsiz[i], yrsiz[i] = struct.unpack_from(">BBB", siz, 36 + 3 * i) + + size = (xsiz - xosiz, ysiz - yosiz) + if csiz == 1: + if (yrsiz[0] & 0x7F) > 8: + mode = "I;16" + else: + mode = "L" + elif csiz == 2: + mode = "LA" + elif csiz == 3: + mode = "RGB" + elif csiz == 4: + mode = "RGBA" + else: + mode = None + + return size, mode + + +def _res_to_dpi(num, denom, exp): + """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 (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 + + 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"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 + + +## +# Image plugin for JPEG2000 images. + + +class Jpeg2KImageFile(ImageFile.ImageFile): + format = "JPEG2000" + format_description = "JPEG 2000 (ISO 15444)" + + def _open(self): + 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 = 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) + + if self.size is None or self.mode is None: + msg = "unable to determine size/mode" + 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): + 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): + 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, fp, filename): + # Get the keyword arguments + info = im.encoderinfo + + if filename.endswith(".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/site-packages/PIL/JpegImagePlugin.py b/.venv/Lib/site-packages/PIL/JpegImagePlugin.py new file mode 100644 index 00000000..71ae84c0 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/JpegImagePlugin.py @@ -0,0 +1,850 @@ +# +# The Python Imaging Library. +# $Id$ +# +# JPEG (JFIF) file handling +# +# See "Digital Compression and Coding of Continuous-Tone Still Images, +# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) +# +# History: +# 1995-09-09 fl Created +# 1995-09-13 fl Added full parser +# 1996-03-25 fl Added hack to use the IJG command line utilities +# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug +# 1996-05-28 fl Added draft support, JFIF version (0.1) +# 1996-12-30 fl Added encoder options, added progression property (0.2) +# 1997-08-27 fl Save mode 1 images as BW (0.3) +# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) +# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) +# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) +# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) +# 2003-04-25 fl Added experimental EXIF decoder (0.5) +# 2003-06-06 fl Added experimental EXIF GPSinfo decoder +# 2003-09-13 fl Extract COM markers +# 2009-09-06 fl Added icc_profile support (from Florian Hoech) +# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) +# 2009-03-08 fl Added subsampling support (from Justin Huff). +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +import array +import io +import math +import os +import struct +import subprocess +import sys +import tempfile +import warnings + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +from ._binary import o16be as o16 +from ._deprecate import deprecate +from .JpegPresets import presets + +# +# Parser + + +def Skip(self, marker): + n = i16(self.fp.read(2)) - 2 + ImageFile._safe_read(self.fp, n) + + +def APP(self, marker): + # + # Application marker. Store these in the APP dictionary. + # Also look for well-known application markers. + + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + + app = "APP%d" % (marker & 15) + + self.app[app] = s # compatibility + self.applist.append((app, s)) + + if marker == 0xFFE0 and s[:4] == b"JFIF": + # extract JFIF information + self.info["jfif"] = version = i16(s, 5) # version + self.info["jfif_version"] = divmod(version, 256) + # extract JFIF properties + try: + jfif_unit = s[7] + jfif_density = i16(s, 8), i16(s, 10) + except Exception: + pass + else: + if jfif_unit == 1: + self.info["dpi"] = jfif_density + self.info["jfif_unit"] = jfif_unit + self.info["jfif_density"] = jfif_density + elif marker == 0xFFE1 and s[:5] == b"Exif\0": + if "exif" not in self.info: + # extract EXIF information (incomplete) + self.info["exif"] = s # FIXME: value will change + self._exif_offset = self.fp.tell() - n + 6 + elif marker == 0xFFE2 and s[:5] == b"FPXR\0": + # extract FlashPix information (incomplete) + self.info["flashpix"] = s # FIXME: value will change + elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0": + # Since an ICC profile can be larger than the maximum size of + # a JPEG marker (64K), we need provisions to split it into + # multiple markers. The format defined by the ICC specifies + # one or more APP2 markers containing the following data: + # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) + # Marker sequence number 1, 2, etc (1 byte) + # Number of markers Total of APP2's used (1 byte) + # Profile data (remainder of APP2 data) + # Decoders should use the marker sequence numbers to + # reassemble the profile, rather than assuming that the APP2 + # markers appear in the correct sequence. + self.icclist.append(s) + elif marker == 0xFFED and s[:14] == b"Photoshop 3.0\x00": + # parse the image resource block + offset = 14 + photoshop = self.info.setdefault("photoshop", {}) + while s[offset : offset + 4] == b"8BIM": + try: + offset += 4 + # resource code + code = i16(s, offset) + offset += 2 + # resource name (usually empty) + name_len = s[offset] + # name = s[offset+1:offset+1+name_len] + offset += 1 + name_len + offset += offset & 1 # align + # resource data block + size = i32(s, offset) + offset += 4 + data = s[offset : offset + size] + if code == 0x03ED: # ResolutionInfo + data = { + "XResolution": i32(data, 0) / 65536, + "DisplayedUnitsX": i16(data, 4), + "YResolution": i32(data, 8) / 65536, + "DisplayedUnitsY": i16(data, 12), + } + photoshop[code] = data + offset += size + offset += offset & 1 # align + except struct.error: + break # insufficient data + + elif marker == 0xFFEE and s[:5] == b"Adobe": + self.info["adobe"] = i16(s, 5) + # extract Adobe custom properties + try: + adobe_transform = s[11] + except IndexError: + pass + else: + self.info["adobe_transform"] = adobe_transform + elif marker == 0xFFE2 and s[:4] == b"MPF\0": + # extract MPO information + self.info["mp"] = s[4:] + # offset is current location minus buffer size + # plus constant header size + self.info["mpoffset"] = self.fp.tell() - n + 4 + + # If DPI isn't in JPEG header, fetch from EXIF + if "dpi" not in self.info and "exif" in self.info: + try: + exif = self.getexif() + resolution_unit = exif[0x0128] + x_resolution = exif[0x011A] + try: + dpi = float(x_resolution[0]) / x_resolution[1] + except TypeError: + dpi = x_resolution + if math.isnan(dpi): + raise ValueError + if resolution_unit == 3: # cm + # 1 dpcm = 2.54 dpi + dpi *= 2.54 + self.info["dpi"] = dpi, dpi + except (TypeError, KeyError, SyntaxError, ValueError, ZeroDivisionError): + # SyntaxError for invalid/unreadable EXIF + # KeyError for dpi not included + # ZeroDivisionError for invalid dpi rational value + # ValueError or TypeError for dpi being an invalid float + self.info["dpi"] = 72, 72 + + +def COM(self, marker): + # + # Comment marker. Store these in the APP dictionary. + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + + self.info["comment"] = s + self.app["COM"] = s # compatibility + self.applist.append(("COM", s)) + + +def SOF(self, marker): + # + # Start of frame marker. Defines the size and mode of the + # image. JPEG is colour blind, so we use some simple + # heuristics to map the number of layers to an appropriate + # mode. Note that this could be made a bit brighter, by + # looking for JFIF and Adobe APP markers. + + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + self._size = i16(s, 3), i16(s, 1) + + self.bits = s[0] + if self.bits != 8: + msg = f"cannot handle {self.bits}-bit layers" + raise SyntaxError(msg) + + self.layers = s[5] + if self.layers == 1: + self.mode = "L" + elif self.layers == 3: + self.mode = "RGB" + elif self.layers == 4: + self.mode = "CMYK" + else: + msg = f"cannot handle {self.layers}-layer images" + raise SyntaxError(msg) + + if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: + self.info["progressive"] = self.info["progression"] = 1 + + if self.icclist: + # fixup icc profile + self.icclist.sort() # sort by sequence number + if self.icclist[0][13] == len(self.icclist): + profile = [] + for p in self.icclist: + profile.append(p[14:]) + icc_profile = b"".join(profile) + else: + icc_profile = None # wrong number of fragments + self.info["icc_profile"] = icc_profile + self.icclist = [] + + for i in range(6, len(s), 3): + t = s[i : i + 3] + # 4-tuples: id, vsamp, hsamp, qtable + self.layer.append((t[0], t[1] // 16, t[1] & 15, t[2])) + + +def DQT(self, marker): + # + # Define quantization table. Note that there might be more + # than one table in each marker. + + # FIXME: The quantization tables can be used to estimate the + # compression quality. + + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + while len(s): + v = s[0] + precision = 1 if (v // 16 == 0) else 2 # in bytes + qt_length = 1 + precision * 64 + if len(s) < qt_length: + msg = "bad quantization table marker" + raise SyntaxError(msg) + data = array.array("B" if precision == 1 else "H", s[1:qt_length]) + if sys.byteorder == "little" and precision > 1: + data.byteswap() # the values are always big-endian + self.quantization[v & 15] = [data[i] for i in zigzag_index] + s = s[qt_length:] + + +# +# JPEG marker table + +MARKER = { + 0xFFC0: ("SOF0", "Baseline DCT", SOF), + 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), + 0xFFC2: ("SOF2", "Progressive DCT", SOF), + 0xFFC3: ("SOF3", "Spatial lossless", SOF), + 0xFFC4: ("DHT", "Define Huffman table", Skip), + 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), + 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), + 0xFFC7: ("SOF7", "Differential spatial", SOF), + 0xFFC8: ("JPG", "Extension", None), + 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), + 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), + 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), + 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), + 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), + 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), + 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), + 0xFFD0: ("RST0", "Restart 0", None), + 0xFFD1: ("RST1", "Restart 1", None), + 0xFFD2: ("RST2", "Restart 2", None), + 0xFFD3: ("RST3", "Restart 3", None), + 0xFFD4: ("RST4", "Restart 4", None), + 0xFFD5: ("RST5", "Restart 5", None), + 0xFFD6: ("RST6", "Restart 6", None), + 0xFFD7: ("RST7", "Restart 7", None), + 0xFFD8: ("SOI", "Start of image", None), + 0xFFD9: ("EOI", "End of image", None), + 0xFFDA: ("SOS", "Start of scan", Skip), + 0xFFDB: ("DQT", "Define quantization table", DQT), + 0xFFDC: ("DNL", "Define number of lines", Skip), + 0xFFDD: ("DRI", "Define restart interval", Skip), + 0xFFDE: ("DHP", "Define hierarchical progression", SOF), + 0xFFDF: ("EXP", "Expand reference component", Skip), + 0xFFE0: ("APP0", "Application segment 0", APP), + 0xFFE1: ("APP1", "Application segment 1", APP), + 0xFFE2: ("APP2", "Application segment 2", APP), + 0xFFE3: ("APP3", "Application segment 3", APP), + 0xFFE4: ("APP4", "Application segment 4", APP), + 0xFFE5: ("APP5", "Application segment 5", APP), + 0xFFE6: ("APP6", "Application segment 6", APP), + 0xFFE7: ("APP7", "Application segment 7", APP), + 0xFFE8: ("APP8", "Application segment 8", APP), + 0xFFE9: ("APP9", "Application segment 9", APP), + 0xFFEA: ("APP10", "Application segment 10", APP), + 0xFFEB: ("APP11", "Application segment 11", APP), + 0xFFEC: ("APP12", "Application segment 12", APP), + 0xFFED: ("APP13", "Application segment 13", APP), + 0xFFEE: ("APP14", "Application segment 14", APP), + 0xFFEF: ("APP15", "Application segment 15", APP), + 0xFFF0: ("JPG0", "Extension 0", None), + 0xFFF1: ("JPG1", "Extension 1", None), + 0xFFF2: ("JPG2", "Extension 2", None), + 0xFFF3: ("JPG3", "Extension 3", None), + 0xFFF4: ("JPG4", "Extension 4", None), + 0xFFF5: ("JPG5", "Extension 5", None), + 0xFFF6: ("JPG6", "Extension 6", None), + 0xFFF7: ("JPG7", "Extension 7", None), + 0xFFF8: ("JPG8", "Extension 8", None), + 0xFFF9: ("JPG9", "Extension 9", None), + 0xFFFA: ("JPG10", "Extension 10", None), + 0xFFFB: ("JPG11", "Extension 11", None), + 0xFFFC: ("JPG12", "Extension 12", None), + 0xFFFD: ("JPG13", "Extension 13", None), + 0xFFFE: ("COM", "Comment", COM), +} + + +def _accept(prefix): + # Magic number was taken from https://en.wikipedia.org/wiki/JPEG + return prefix[:3] == b"\xFF\xD8\xFF" + + +## +# Image plugin for JPEG and JFIF images. + + +class JpegImageFile(ImageFile.ImageFile): + format = "JPEG" + format_description = "JPEG (ISO 10918)" + + def _open(self): + s = self.fp.read(3) + + if not _accept(s): + msg = "not a JPEG file" + raise SyntaxError(msg) + s = b"\xFF" + + # Create attributes + self.bits = self.layers = 0 + + # JPEG specifics (internal) + self.layer = [] + self.huffman_dc = {} + self.huffman_ac = {} + self.quantization = {} + self.app = {} # compatibility + self.applist = [] + self.icclist = [] + + while True: + i = s[0] + if i == 0xFF: + s = s + self.fp.read(1) + i = i16(s) + else: + # Skip non-0xFF junk + s = self.fp.read(1) + continue + + if i in MARKER: + name, description, handler = MARKER[i] + if handler is not None: + handler(self, i) + if i == 0xFFDA: # start of scan + rawmode = self.mode + if self.mode == "CMYK": + rawmode = "CMYK;I" # assume adobe conventions + self.tile = [("jpeg", (0, 0) + self.size, 0, (rawmode, ""))] + # self.__offset = self.fp.tell() + break + s = self.fp.read(1) + elif i == 0 or i == 0xFFFF: + # padded marker or junk; move on + s = b"\xff" + elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) + s = self.fp.read(1) + else: + msg = "no marker found" + raise SyntaxError(msg) + + def load_read(self, read_bytes): + """ + internal: read more image data + For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker + so libjpeg can finish decoding + """ + s = self.fp.read(read_bytes) + + if not s and ImageFile.LOAD_TRUNCATED_IMAGES and not hasattr(self, "_ended"): + # Premature EOF. + # Pretend file is finished adding EOI marker + self._ended = True + return b"\xFF\xD9" + + return s + + def draft(self, mode, size): + if len(self.tile) != 1: + return + + # Protect from second call + if self.decoderconfig: + return + + d, e, o, a = self.tile[0] + scale = 1 + original_size = self.size + + if a[0] == "RGB" and mode in ["L", "YCbCr"]: + self.mode = mode + a = mode, "" + + if size: + scale = min(self.size[0] // size[0], self.size[1] // size[1]) + for s in [8, 4, 2, 1]: + if scale >= s: + break + e = ( + e[0], + e[1], + (e[2] - e[0] + s - 1) // s + e[0], + (e[3] - e[1] + s - 1) // s + e[1], + ) + self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s) + scale = s + + self.tile = [(d, e, o, a)] + self.decoderconfig = (scale, 0) + + box = (0, 0, original_size[0] / scale, original_size[1] / scale) + return self.mode, box + + def load_djpeg(self): + # ALTERNATIVE: handle JPEGs via the IJG command line utilities + + f, path = tempfile.mkstemp() + os.close(f) + if os.path.exists(self.filename): + subprocess.check_call(["djpeg", "-outfile", path, self.filename]) + else: + msg = "Invalid Filename" + raise ValueError(msg) + + try: + with Image.open(path) as _im: + _im.load() + self.im = _im.im + finally: + try: + os.unlink(path) + except OSError: + pass + + self.mode = self.im.mode + self._size = self.im.size + + self.tile = [] + + def _getexif(self): + return _getexif(self) + + def _getmp(self): + return _getmp(self) + + def getxmp(self): + """ + Returns a dictionary containing the XMP tags. + Requires defusedxml to be installed. + + :returns: XMP tags in a dictionary. + """ + + for segment, content in self.applist: + if segment == "APP1": + marker, xmp_tags = content.rsplit(b"\x00", 1) + if marker == b"http://ns.adobe.com/xap/1.0/": + return self._getxmp(xmp_tags) + return {} + + +def _getexif(self): + if "exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + +def _getmp(self): + # Extract MP information. This method was inspired by the "highly + # experimental" _getexif version that's been in use for years now, + # itself based on the ImageFileDirectory class in the TIFF plugin. + + # The MP record essentially consists of a TIFF file embedded in a JPEG + # application marker. + try: + data = self.info["mp"] + except KeyError: + return None + file_contents = io.BytesIO(data) + head = file_contents.read(8) + endianness = ">" if head[:4] == b"\x4d\x4d\x00\x2a" else "<" + # process dictionary + from . import TiffImagePlugin + + try: + info = TiffImagePlugin.ImageFileDirectory_v2(head) + file_contents.seek(info.next) + info.load(file_contents) + mp = dict(info) + except Exception as e: + msg = "malformed MP Index (unreadable directory)" + raise SyntaxError(msg) from e + # it's an error not to have a number of images + try: + quant = mp[0xB001] + except KeyError as e: + msg = "malformed MP Index (no number of images)" + raise SyntaxError(msg) from e + # get MP entries + mpentries = [] + try: + rawmpentries = mp[0xB002] + for entrynum in range(0, quant): + unpackedentry = struct.unpack_from( + f"{endianness}LLLHH", rawmpentries, entrynum * 16 + ) + labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2") + mpentry = dict(zip(labels, unpackedentry)) + mpentryattr = { + "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)), + "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)), + "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)), + "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27, + "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24, + "MPType": mpentry["Attribute"] & 0x00FFFFFF, + } + if mpentryattr["ImageDataFormat"] == 0: + mpentryattr["ImageDataFormat"] = "JPEG" + else: + msg = "unsupported picture format in MPO" + raise SyntaxError(msg) + mptypemap = { + 0x000000: "Undefined", + 0x010001: "Large Thumbnail (VGA Equivalent)", + 0x010002: "Large Thumbnail (Full HD Equivalent)", + 0x020001: "Multi-Frame Image (Panorama)", + 0x020002: "Multi-Frame Image: (Disparity)", + 0x020003: "Multi-Frame Image: (Multi-Angle)", + 0x030000: "Baseline MP Primary Image", + } + mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown") + mpentry["Attribute"] = mpentryattr + mpentries.append(mpentry) + mp[0xB002] = mpentries + except KeyError as e: + msg = "malformed MP Index (bad MP Entry)" + raise SyntaxError(msg) from e + # Next we should try and parse the individual image unique ID list; + # we don't because I've never seen this actually used in a real MPO + # file and so can't test it. + return mp + + +# -------------------------------------------------------------------- +# stuff to save JPEG files + +RAWMODE = { + "1": "L", + "L": "L", + "RGB": "RGB", + "RGBX": "RGB", + "CMYK": "CMYK;I", # assume adobe conventions + "YCbCr": "YCbCr", +} + +# fmt: off +zigzag_index = ( + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63, +) + +samplings = { + (1, 1, 1, 1, 1, 1): 0, + (2, 1, 1, 1, 1, 1): 1, + (2, 2, 1, 1, 1, 1): 2, +} +# fmt: on + + +def convert_dict_qtables(qtables): + deprecate("convert_dict_qtables", 10, action="Conversion is no longer needed") + return qtables + + +def get_sampling(im): + # There's no subsampling when images have only 1 layer + # (grayscale images) or when they are CMYK (4 layers), + # so set subsampling to the default value. + # + # NOTE: currently Pillow can't encode JPEG to YCCK format. + # If YCCK support is added in the future, subsampling code will have + # to be updated (here and in JpegEncode.c) to deal with 4 layers. + if not hasattr(im, "layers") or im.layers in (1, 4): + return -1 + sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] + return samplings.get(sampling, -1) + + +def _save(im, fp, filename): + if im.width == 0 or im.height == 0: + msg = "cannot write empty image as JPEG" + raise ValueError(msg) + + try: + rawmode = RAWMODE[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as JPEG" + raise OSError(msg) from e + + info = im.encoderinfo + + dpi = [round(x) for x in info.get("dpi", (0, 0))] + + quality = info.get("quality", -1) + subsampling = info.get("subsampling", -1) + qtables = info.get("qtables") + + if quality == "keep": + quality = -1 + subsampling = "keep" + qtables = "keep" + elif quality in presets: + preset = presets[quality] + quality = -1 + subsampling = preset.get("subsampling", -1) + qtables = preset.get("quantization") + elif not isinstance(quality, int): + msg = "Invalid quality setting" + raise ValueError(msg) + else: + if subsampling in presets: + subsampling = presets[subsampling].get("subsampling", -1) + if isinstance(qtables, str) and qtables in presets: + qtables = presets[qtables].get("quantization") + + if subsampling == "4:4:4": + subsampling = 0 + elif subsampling == "4:2:2": + subsampling = 1 + elif subsampling == "4:2:0": + subsampling = 2 + elif subsampling == "4:1:1": + # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. + # Set 4:2:0 if someone is still using that value. + subsampling = 2 + elif subsampling == "keep": + if im.format != "JPEG": + msg = "Cannot use 'keep' when original image is not a JPEG" + raise ValueError(msg) + subsampling = get_sampling(im) + + def validate_qtables(qtables): + if qtables is None: + return qtables + if isinstance(qtables, str): + try: + lines = [ + int(num) + for line in qtables.splitlines() + for num in line.split("#", 1)[0].split() + ] + except ValueError as e: + msg = "Invalid quantization table" + raise ValueError(msg) from e + else: + qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] + if isinstance(qtables, (tuple, list, dict)): + if isinstance(qtables, dict): + qtables = [ + qtables[key] for key in range(len(qtables)) if key in qtables + ] + elif isinstance(qtables, tuple): + qtables = list(qtables) + if not (0 < len(qtables) < 5): + msg = "None or too many quantization tables" + raise ValueError(msg) + for idx, table in enumerate(qtables): + try: + if len(table) != 64: + raise TypeError + table = array.array("H", table) + except TypeError as e: + msg = "Invalid quantization table" + raise ValueError(msg) from e + else: + qtables[idx] = list(table) + return qtables + + if qtables == "keep": + if im.format != "JPEG": + msg = "Cannot use 'keep' when original image is not a JPEG" + raise ValueError(msg) + qtables = getattr(im, "quantization", None) + qtables = validate_qtables(qtables) + + extra = info.get("extra", b"") + + MAX_BYTES_IN_MARKER = 65533 + icc_profile = info.get("icc_profile") + if icc_profile: + ICC_OVERHEAD_LEN = 14 + MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN + markers = [] + while icc_profile: + markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER]) + icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:] + i = 1 + for marker in markers: + size = o16(2 + ICC_OVERHEAD_LEN + len(marker)) + extra += ( + b"\xFF\xE2" + + size + + b"ICC_PROFILE\0" + + o8(i) + + o8(len(markers)) + + marker + ) + i += 1 + + comment = info.get("comment", im.info.get("comment")) + + # "progressive" is the official name, but older documentation + # says "progression" + # FIXME: issue a warning if the wrong form is used (post-1.1.7) + progressive = info.get("progressive", False) or info.get("progression", False) + + optimize = info.get("optimize", False) + + exif = info.get("exif", b"") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + if len(exif) > MAX_BYTES_IN_MARKER: + msg = "EXIF data is too long" + raise ValueError(msg) + + # get keyword arguments + im.encoderconfig = ( + quality, + progressive, + info.get("smooth", 0), + optimize, + info.get("streamtype", 0), + dpi[0], + dpi[1], + subsampling, + qtables, + comment, + extra, + exif, + ) + + # if we optimize, libjpeg needs a buffer big enough to hold the whole image + # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is + # channels*size, this is a value that's been used in a django patch. + # https://github.com/matthewwithanm/django-imagekit/issues/50 + bufsize = 0 + if optimize or progressive: + # CMYK can be bigger + if im.mode == "CMYK": + bufsize = 4 * im.size[0] * im.size[1] + # keep sets quality to -1, but the actual value may be high. + elif quality >= 95 or quality == -1: + bufsize = 2 * im.size[0] * im.size[1] + else: + bufsize = im.size[0] * im.size[1] + + # The EXIF info needs to be written as one block, + APP1, + one spare byte. + # Ensure that our buffer is big enough. Same with the icc_profile block. + bufsize = max(ImageFile.MAXBLOCK, bufsize, len(exif) + 5, len(extra) + 1) + + ImageFile._save(im, fp, [("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize) + + +def _save_cjpeg(im, fp, filename): + # ALTERNATIVE: handle JPEGs via the IJG command line utilities. + tempfile = im._dump() + subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) + try: + os.unlink(tempfile) + except OSError: + pass + + +## +# Factory for making JPEG and MPO instances +def jpeg_factory(fp=None, filename=None): + im = JpegImageFile(fp, filename) + try: + mpheader = im._getmp() + if mpheader[45057] > 1: + # It's actually an MPO + from .MpoImagePlugin import MpoImageFile + + # Don't reload everything, just convert it. + im = MpoImageFile.adopt(im, mpheader) + except (TypeError, IndexError): + # It is really a JPEG + pass + except SyntaxError: + warnings.warn( + "Image appears to be a malformed MPO file, it will be " + "interpreted as a base JPEG file" + ) + return im + + +# --------------------------------------------------------------------- +# Registry stuff + +Image.register_open(JpegImageFile.format, jpeg_factory, _accept) +Image.register_save(JpegImageFile.format, _save) + +Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) + +Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/.venv/Lib/site-packages/PIL/JpegPresets.py b/.venv/Lib/site-packages/PIL/JpegPresets.py new file mode 100644 index 00000000..a678e248 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/JpegPresets.py @@ -0,0 +1,240 @@ +""" +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://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 + +""" + +# 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/site-packages/PIL/McIdasImagePlugin.py b/.venv/Lib/site-packages/PIL/McIdasImagePlugin.py new file mode 100644 index 00000000..17c008b9 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/McIdasImagePlugin.py @@ -0,0 +1,75 @@ +# +# 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. +# + +import struct + +from . import Image, ImageFile + + +def _accept(s): + return s[: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): + # parse area file directory + 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/site-packages/PIL/MicImagePlugin.py b/.venv/Lib/site-packages/PIL/MicImagePlugin.py new file mode 100644 index 00000000..58f7327b --- /dev/null +++ b/.venv/Lib/site-packages/PIL/MicImagePlugin.py @@ -0,0 +1,106 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Microsoft Image Composer support for PIL +# +# Notes: +# uses TiffImagePlugin.py to read the actual image streams +# +# History: +# 97-01-20 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + + +import olefile + +from . import Image, TiffImagePlugin + +# +# -------------------------------------------------------------------- + + +def _accept(prefix): + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for Microsoft's Image Composer file format. + + +class MicImageFile(TiffImagePlugin.TiffImageFile): + format = "MIC" + format_description = "Microsoft Image Composer" + _close_exclusive_fp_after_loading = False + + def _open(self): + # read the OLE directory and see if this is a likely + # to be a Microsoft Image Composer file + + try: + self.ole = olefile.OleFileIO(self.fp) + except OSError as e: + msg = "not an MIC file; invalid OLE file" + raise SyntaxError(msg) from e + + # find ACI subfiles with Image members (maybe not the + # best way to identify MIC files, but what the... ;-) + + self.images = [] + for path in self.ole.listdir(): + if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image": + self.images.append(path) + + # if we didn't find any images, this is probably not + # an MIC file. + if not self.images: + msg = "not an MIC file; no image entries" + raise SyntaxError(msg) + + self.frame = None + self._n_frames = len(self.images) + self.is_animated = self._n_frames > 1 + + if len(self.images) > 1: + self._category = Image.CONTAINER + + self.seek(0) + + def seek(self, frame): + if not self._seek_check(frame): + return + try: + filename = self.images[frame] + except IndexError as e: + msg = "no such frame" + raise EOFError(msg) from e + + self.fp = self.ole.openstream(filename) + + TiffImagePlugin.TiffImageFile._open(self) + + self.frame = frame + + def tell(self): + return self.frame + + def close(self): + self.ole.close() + super().close() + + def __exit__(self, *args): + self.ole.close() + super().__exit__() + + +# +# -------------------------------------------------------------------- + +Image.register_open(MicImageFile.format, MicImageFile, _accept) + +Image.register_extension(MicImageFile.format, ".mic") diff --git a/.venv/Lib/site-packages/PIL/MpegImagePlugin.py b/.venv/Lib/site-packages/PIL/MpegImagePlugin.py new file mode 100644 index 00000000..d96d3a11 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/MpegImagePlugin.py @@ -0,0 +1,82 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPEG file handling +# +# History: +# 95-09-09 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile +from ._binary import i8 + +# +# Bitstream parser + + +class BitStream: + def __init__(self, fp): + self.fp = fp + self.bits = 0 + self.bitbuffer = 0 + + def next(self): + return i8(self.fp.read(1)) + + def peek(self, bits): + while self.bits < bits: + c = self.next() + if c < 0: + self.bits = 0 + continue + self.bitbuffer = (self.bitbuffer << 8) + c + self.bits += 8 + return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 + + def skip(self, bits): + while self.bits < bits: + self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) + self.bits += 8 + self.bits = self.bits - bits + + def read(self, bits): + v = self.peek(bits) + self.bits = self.bits - bits + return v + + +## +# Image plugin for MPEG streams. This plugin can identify a stream, +# but it cannot read it. + + +class MpegImageFile(ImageFile.ImageFile): + format = "MPEG" + format_description = "MPEG" + + def _open(self): + s = BitStream(self.fp) + + if s.read(32) != 0x1B3: + msg = "not an MPEG file" + raise SyntaxError(msg) + + self.mode = "RGB" + self._size = s.read(12), s.read(12) + + +# -------------------------------------------------------------------- +# Registry stuff + +Image.register_open(MpegImageFile.format, MpegImageFile) + +Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) + +Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/.venv/Lib/site-packages/PIL/MpoImagePlugin.py b/.venv/Lib/site-packages/PIL/MpoImagePlugin.py new file mode 100644 index 00000000..f9261c77 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/MpoImagePlugin.py @@ -0,0 +1,197 @@ +# +# 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. +# + +import itertools +import os +import struct + +from . import ( + ExifTags, + Image, + ImageFile, + ImageSequence, + JpegImagePlugin, + TiffImagePlugin, +) +from ._binary import i16be as i16 +from ._binary import o32le + +# def _accept(prefix): +# return JpegImagePlugin._accept(prefix) + + +def _save(im, fp, filename): + JpegImagePlugin._save(im, fp, filename) + + +def _save_all(im, fp, filename): + append_images = im.encoderinfo.get("append_images", []) + if not append_images: + try: + animated = im.is_animated + except AttributeError: + animated = False + if not animated: + _save(im, fp, filename) + return + + mpf_offset = 28 + offsets = [] + 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(" 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): + self._fp.seek(pos) + + def seek(self, frame): + if not self._seek_check(frame): + return + self.fp = self._fp + self.offset = self.__mpoffsets[frame] + + self.fp.seek(self.offset + 2) # skip SOI marker + segment = self.fp.read(2) + if not segment: + msg = "No data found for frame" + raise ValueError(msg) + self._size = self._initial_size + if i16(segment) == 0xFFE1: # APP1 + n = i16(self.fp.read(2)) - 2 + self.info["exif"] = ImageFile._safe_read(self.fp, n) + self._reload_exif() + + mptype = self.mpinfo[0xB002][frame]["Attribute"]["MPType"] + if mptype.startswith("Large Thumbnail"): + exif = self.getexif().get_ifd(ExifTags.IFD.Exif) + if 40962 in exif and 40963 in exif: + self._size = (exif[40962], exif[40963]) + elif "exif" in self.info: + del self.info["exif"] + self._reload_exif() + + self.tile = [("jpeg", (0, 0) + self.size, self.offset, (self.mode, ""))] + self.__frame = frame + + def tell(self): + 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/site-packages/PIL/MspImagePlugin.py b/.venv/Lib/site-packages/PIL/MspImagePlugin.py new file mode 100644 index 00000000..c6567b2a --- /dev/null +++ b/.venv/Lib/site-packages/PIL/MspImagePlugin.py @@ -0,0 +1,194 @@ +# +# 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 + +import io +import struct + +from . import Image, ImageFile +from ._binary import i16le as i16 +from ._binary import o16le as o16 + +# +# read MSP files + + +def _accept(prefix): + 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): + # Header + 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): + 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, fp, filename): + 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/site-packages/PIL/PSDraw.py b/.venv/Lib/site-packages/PIL/PSDraw.py new file mode 100644 index 00000000..13b3048f --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PSDraw.py @@ -0,0 +1,229 @@ +# +# The Python Imaging Library +# $Id$ +# +# Simple PostScript graphics interface +# +# History: +# 1996-04-20 fl Created +# 1999-01-10 fl Added gsave/grestore to image method +# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) +# +# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +import sys + +from . import EpsImagePlugin + +## +# Simple PostScript graphics interface. + + +class PSDraw: + """ + Sets up printing to the given file. If ``fp`` is omitted, + ``sys.stdout.buffer`` or ``sys.stdout`` is assumed. + """ + + def __init__(self, fp=None): + if not fp: + try: + fp = sys.stdout.buffer + except AttributeError: + fp = sys.stdout + self.fp = fp + + def begin_document(self, id=None): + """Set up printing of a document. (Write PostScript DSC header.)""" + # FIXME: incomplete + self.fp.write( + b"%!PS-Adobe-3.0\n" + b"save\n" + b"/showpage { } def\n" + b"%%EndComments\n" + b"%%BeginDocument\n" + ) + # self.fp.write(ERROR_PS) # debugging! + self.fp.write(EDROFF_PS) + self.fp.write(VDI_PS) + self.fp.write(b"%%EndProlog\n") + self.isofont = {} + + def end_document(self): + """Ends printing. (Write PostScript DSC footer.)""" + self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") + if hasattr(self.fp, "flush"): + self.fp.flush() + + def setfont(self, font, size): + """ + Selects which font to use. + + :param font: A PostScript font name + :param size: Size in points. + """ + font = bytes(font, "UTF-8") + if font not in self.isofont: + # reencode font + self.fp.write(b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font, font)) + self.isofont[font] = 1 + # rough + self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font)) + + def line(self, xy0, xy1): + """ + Draws a line between the two points. Coordinates are given in + PostScript point coordinates (72 points per inch, (0, 0) is the lower + left corner of the page). + """ + self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) + + def rectangle(self, box): + """ + Draws a rectangle. + + :param box: A tuple of four integers, specifying left, bottom, width and + height. + """ + self.fp.write(b"%d %d M 0 %d %d Vr\n" % box) + + def text(self, xy, text): + """ + Draws text at the given position. You must use + :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. + """ + text = bytes(text, "UTF-8") + text = b"\\(".join(text.split(b"(")) + text = b"\\)".join(text.split(b")")) + xy += (text,) + self.fp.write(b"%d %d M (%s) S\n" % xy) + + def image(self, box, im, dpi=None): + """Draw a PIL image, centered in the given box.""" + # default resolution depends on mode + if not dpi: + if im.mode == "1": + dpi = 200 # fax + else: + dpi = 100 # greyscale + # image size (on paper) + x = im.size[0] * 72 / dpi + y = im.size[1] * 72 / dpi + # max allowed size + xmax = float(box[2] - box[0]) + ymax = float(box[3] - box[1]) + if x > xmax: + y = y * xmax / x + x = xmax + if y > ymax: + x = x * ymax / y + y = ymax + dx = (xmax - x) / 2 + box[0] + dy = (ymax - y) / 2 + box[1] + self.fp.write(b"gsave\n%f %f translate\n" % (dx, dy)) + if (x, y) != im.size: + # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) + sx = x / im.size[0] + sy = y / im.size[1] + self.fp.write(b"%f %f scale\n" % (sx, sy)) + EpsImagePlugin._save(im, self.fp, None, 0) + self.fp.write(b"\ngrestore\n") + + +# -------------------------------------------------------------------- +# PostScript driver + +# +# EDROFF.PS -- PostScript driver for Edroff 2 +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + + +EDROFF_PS = b"""\ +/S { show } bind def +/P { moveto show } bind def +/M { moveto } bind def +/X { 0 rmoveto } bind def +/Y { 0 exch rmoveto } bind def +/E { findfont + dup maxlength dict begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + /Encoding exch def + dup /FontName exch def + currentdict end definefont pop +} bind def +/F { findfont exch scalefont dup setfont + [ exch /setfont cvx ] cvx bind def +} bind def +""" + +# +# VDI.PS -- PostScript driver for VDI meta commands +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + +VDI_PS = b"""\ +/Vm { moveto } bind def +/Va { newpath arcn stroke } bind def +/Vl { moveto lineto stroke } bind def +/Vc { newpath 0 360 arc closepath } bind def +/Vr { exch dup 0 rlineto + exch dup 0 exch rlineto + exch neg 0 rlineto + 0 exch neg rlineto + setgray fill } bind def +/Tm matrix def +/Ve { Tm currentmatrix pop + translate scale newpath 0 0 .5 0 360 arc closepath + Tm setmatrix +} bind def +/Vf { currentgray exch setgray fill setgray } bind def +""" + +# +# ERROR.PS -- Error handler +# +# History: +# 89-11-21 fl: created (pslist 1.10) +# + +ERROR_PS = b"""\ +/landscape false def +/errorBUF 200 string def +/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def +errordict begin /handleerror { + initmatrix /Courier findfont 10 scalefont setfont + newpath 72 720 moveto $error begin /newerror false def + (PostScript Error) show errorNL errorNL + (Error: ) show + /errorname load errorBUF cvs show errorNL errorNL + (Command: ) show + /command load dup type /stringtype ne { errorBUF cvs } if show + errorNL errorNL + (VMstatus: ) show + vmstatus errorBUF cvs show ( bytes available, ) show + errorBUF cvs show ( bytes used at level ) show + errorBUF cvs show errorNL errorNL + (Operand stargck: ) show errorNL /ostargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall errorNL + (Execution stargck: ) show errorNL /estargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall + end showpage +} def end +""" diff --git a/.venv/Lib/site-packages/PIL/PaletteFile.py b/.venv/Lib/site-packages/PIL/PaletteFile.py new file mode 100644 index 00000000..4a2c497f --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PaletteFile.py @@ -0,0 +1,51 @@ +# +# 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 ._binary import o8 + + +class PaletteFile: + """File handler for Teragon-style palette files.""" + + rawmode = "RGB" + + def __init__(self, fp): + self.palette = [(i, i, i) 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: + self.palette[i] = o8(r) + o8(g) + o8(b) + + self.palette = b"".join(self.palette) + + def getpalette(self): + return self.palette, self.rawmode diff --git a/.venv/Lib/site-packages/PIL/PalmImagePlugin.py b/.venv/Lib/site-packages/PIL/PalmImagePlugin.py new file mode 100644 index 00000000..a88a9079 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PalmImagePlugin.py @@ -0,0 +1,225 @@ +# +# The Python Imaging Library. +# $Id$ +# + +## +# Image plugin for Palm pixmap images (output only). +## + +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.new("L", (1, len(_Palm8BitColormapValues))) + image.putdata(list(range(len(_Palm8BitColormapValues)))) + palettedata = () + 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, fp, filename): + 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 greyscale from white (0) to black (1) + bpp = im.encoderinfo["bpp"] + im = im.point( + lambda x, shift=8 - bpp, maxval=(1 << bpp) - 1: 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"] + im = im.point(lambda x, maxval=(1 << bpp) - 1: 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 = "P;" + str(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/site-packages/PIL/PcdImagePlugin.py b/.venv/Lib/site-packages/PIL/PcdImagePlugin.py new file mode 100644 index 00000000..e390f3fe --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PcdImagePlugin.py @@ -0,0 +1,62 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCD file handling +# +# History: +# 96-05-10 fl Created +# 96-05-27 fl Added draft mode (128x192, 256x384) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile + +## +# Image plugin for PhotoCD images. This plugin only reads the 768x512 +# image from the file; higher resolutions are encoded in a proprietary +# encoding. + + +class PcdImageFile(ImageFile.ImageFile): + format = "PCD" + format_description = "Kodak PhotoCD" + + def _open(self): + # rough + self.fp.seek(2048) + s = self.fp.read(2048) + + if s[:4] != b"PCD_": + msg = "not a PCD file" + raise SyntaxError(msg) + + orientation = s[1538] & 3 + self.tile_post_rotate = None + if orientation == 1: + self.tile_post_rotate = 90 + elif orientation == 3: + self.tile_post_rotate = -90 + + self.mode = "RGB" + self._size = 768, 512 # FIXME: not correct for rotated images! + self.tile = [("pcd", (0, 0) + self.size, 96 * 2048, None)] + + def load_end(self): + if self.tile_post_rotate: + # Handle rotated PCDs + self.im = self.im.rotate(self.tile_post_rotate) + self._size = self.im.size + + +# +# registry + +Image.register_open(PcdImageFile.format, PcdImageFile) + +Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/.venv/Lib/site-packages/PIL/PcfFontFile.py b/.venv/Lib/site-packages/PIL/PcfFontFile.py new file mode 100644 index 00000000..8db5822f --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PcfFontFile.py @@ -0,0 +1,256 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library +# $Id$ +# +# portable compiled font file parser +# +# history: +# 1997-08-19 fl created +# 2003-09-13 fl fixed loading of unicode fonts +# +# 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. +# + +import io + +from . import FontFile, Image +from ._binary import i8 +from ._binary import i16be as b16 +from ._binary import i16le as l16 +from ._binary import i32be as b32 +from ._binary import i32le as l32 + +# -------------------------------------------------------------------- +# declarations + +PCF_MAGIC = 0x70636601 # "\x01fcp" + +PCF_PROPERTIES = 1 << 0 +PCF_ACCELERATORS = 1 << 1 +PCF_METRICS = 1 << 2 +PCF_BITMAPS = 1 << 3 +PCF_INK_METRICS = 1 << 4 +PCF_BDF_ENCODINGS = 1 << 5 +PCF_SWIDTHS = 1 << 6 +PCF_GLYPH_NAMES = 1 << 7 +PCF_BDF_ACCELERATORS = 1 << 8 + +BYTES_PER_ROW = [ + lambda bits: ((bits + 7) >> 3), + lambda bits: ((bits + 15) >> 3) & ~1, + lambda bits: ((bits + 31) >> 3) & ~3, + lambda bits: ((bits + 63) >> 3) & ~7, +] + + +def sz(s, o): + return s[o : s.index(b"\0", o)] + + +class PcfFontFile(FontFile.FontFile): + """Font file plugin for the X11 PCF format.""" + + name = "name" + + def __init__(self, fp, charset_encoding="iso8859-1"): + self.charset_encoding = charset_encoding + + magic = l32(fp.read(4)) + if magic != PCF_MAGIC: + msg = "not a PCF file" + raise SyntaxError(msg) + + super().__init__() + + count = l32(fp.read(4)) + self.toc = {} + for i in range(count): + type = l32(fp.read(4)) + self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) + + self.fp = fp + + self.info = self._load_properties() + + metrics = self._load_metrics() + bitmaps = self._load_bitmaps(metrics) + encoding = self._load_encoding() + + # + # create glyph structure + + for ch, ix in enumerate(encoding): + if ix is not None: + ( + xsize, + ysize, + left, + right, + width, + ascent, + descent, + attributes, + ) = metrics[ix] + self.glyph[ch] = ( + (width, 0), + (left, descent - ysize, xsize + left, descent), + (0, 0, xsize, ysize), + bitmaps[ix], + ) + + def _getformat(self, tag): + format, size, offset = self.toc[tag] + + fp = self.fp + fp.seek(offset) + + format = l32(fp.read(4)) + + if format & 4: + i16, i32 = b16, b32 + else: + i16, i32 = l16, l32 + + return fp, format, i16, i32 + + def _load_properties(self): + # + # font properties + + properties = {} + + fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) + + nprops = i32(fp.read(4)) + + # read property description + p = [] + for i in range(nprops): + p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4)))) + if nprops & 3: + fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad + + data = fp.read(i32(fp.read(4))) + + for k, s, v in p: + k = sz(data, k) + if s: + v = sz(data, v) + properties[k] = v + + return properties + + def _load_metrics(self): + # + # font metrics + + metrics = [] + + fp, format, i16, i32 = self._getformat(PCF_METRICS) + + append = metrics.append + + if (format & 0xFF00) == 0x100: + # "compressed" metrics + for i in range(i16(fp.read(2))): + left = i8(fp.read(1)) - 128 + right = i8(fp.read(1)) - 128 + width = i8(fp.read(1)) - 128 + ascent = i8(fp.read(1)) - 128 + descent = i8(fp.read(1)) - 128 + xsize = right - left + ysize = ascent + descent + append((xsize, ysize, left, right, width, ascent, descent, 0)) + + else: + # "jumbo" metrics + for i in range(i32(fp.read(4))): + left = i16(fp.read(2)) + right = i16(fp.read(2)) + width = i16(fp.read(2)) + ascent = i16(fp.read(2)) + descent = i16(fp.read(2)) + attributes = i16(fp.read(2)) + xsize = right - left + ysize = ascent + descent + append((xsize, ysize, left, right, width, ascent, descent, attributes)) + + return metrics + + def _load_bitmaps(self, metrics): + # + # bitmap data + + bitmaps = [] + + fp, format, i16, i32 = self._getformat(PCF_BITMAPS) + + nbitmaps = i32(fp.read(4)) + + if nbitmaps != len(metrics): + msg = "Wrong number of bitmaps" + raise OSError(msg) + + offsets = [] + for i in range(nbitmaps): + offsets.append(i32(fp.read(4))) + + bitmap_sizes = [] + for i in range(4): + bitmap_sizes.append(i32(fp.read(4))) + + # byteorder = format & 4 # non-zero => MSB + bitorder = format & 8 # non-zero => MSB + padindex = format & 3 + + bitmapsize = bitmap_sizes[padindex] + offsets.append(bitmapsize) + + data = fp.read(bitmapsize) + + pad = BYTES_PER_ROW[padindex] + mode = "1;R" + if bitorder: + mode = "1" + + for i in range(nbitmaps): + xsize, ysize = metrics[i][:2] + b, e = offsets[i : i + 2] + bitmaps.append( + Image.frombytes("1", (xsize, ysize), data[b:e], "raw", mode, pad(xsize)) + ) + + return bitmaps + + def _load_encoding(self): + fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) + + first_col, last_col = i16(fp.read(2)), i16(fp.read(2)) + first_row, last_row = i16(fp.read(2)), i16(fp.read(2)) + + i16(fp.read(2)) # default + + nencoding = (last_col - first_col + 1) * (last_row - first_row + 1) + + # map character code to bitmap index + encoding = [None] * min(256, nencoding) + + encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)] + + for i in range(first_col, len(encoding)): + try: + encoding_offset = encoding_offsets[ + ord(bytearray([i]).decode(self.charset_encoding)) + ] + if encoding_offset != 0xFFFF: + encoding[i] = encoding_offset + except UnicodeDecodeError: + # character is not supported in selected encoding + pass + + return encoding diff --git a/.venv/Lib/site-packages/PIL/PcxImagePlugin.py b/.venv/Lib/site-packages/PIL/PcxImagePlugin.py new file mode 100644 index 00000000..f42c2456 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PcxImagePlugin.py @@ -0,0 +1,221 @@ +# +# 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. +# + +import io +import logging + +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): + 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): + # header + 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 greyscale + 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, fp, filename): + 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 + 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": + # greyscale 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/site-packages/PIL/PdfImagePlugin.py b/.venv/Lib/site-packages/PIL/PdfImagePlugin.py new file mode 100644 index 00000000..c41f8aee --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PdfImagePlugin.py @@ -0,0 +1,284 @@ +# +# 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). +## + +import io +import math +import os +import time + +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, fp, filename): + _save(im, fp, filename, save_all=True) + + +## +# (Internal) Image save plugin for the PDF format. + + +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)) + 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: + # FIXME: Should replace ASCIIHexDecode with RunLengthDecode + # (packbits) or LZWDecode (tiff/lzw compression). Note that + # PDF 1.2 also supports Flatedecode (zip compression). + + bits = 8 + params = None + decode = None + + # + # Get image characteristics + + width, height = im.size + + if im.mode == "1": + if features.check("libtiff"): + filter = "CCITTFaxDecode" + bits = 1 + params = PdfParser.PdfArray( + [ + PdfParser.PdfDict( + { + "K": -1, + "BlackIs1": True, + "Columns": width, + "Rows": height, + } + ) + ] + ) + else: + filter = "DCTDecode" + colorspace = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "L": + filter = "DCTDecode" + # params = f"<< /Predictor 15 /Columns {width-2} >>" + colorspace = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "P": + filter = "ASCIIHexDecode" + palette = im.getpalette() + colorspace = [ + PdfParser.PdfName("Indexed"), + PdfParser.PdfName("DeviceRGB"), + 255, + PdfParser.PdfBinary(palette), + ] + procset = "ImageI" # indexed color + elif im.mode == "RGB": + filter = "DCTDecode" + colorspace = PdfParser.PdfName("DeviceRGB") + procset = "ImageC" # color images + elif im.mode == "RGBA": + filter = "JPXDecode" + colorspace = PdfParser.PdfName("DeviceRGB") + procset = "ImageC" # color images + elif im.mode == "CMYK": + filter = "DCTDecode" + 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(im.width / 8) * im.height, + ) + elif filter == "DCTDecode": + Image.SAVE["JPEG"](im, op, filename) + elif filter == "JPXDecode": + Image.SAVE["JPEG2000"](im, op, filename) + elif filter == "FlateDecode": + ImageFile._save(im, op, [("zip", (0, 0) + im.size, 0, im.mode)]) + elif filter == "RunLengthDecode": + ImageFile._save(im, op, [("packbits", (0, 0) + im.size, 0, im.mode)]) + 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) + + existing_pdf.write_obj( + image_refs[page_number], + stream=stream, + Type=PdfParser.PdfName("XObject"), + Subtype=PdfParser.PdfName("Image"), + Width=width, # * 72.0 / x_resolution, + Height=height, # * 72.0 / y_resolution, + Filter=filter, + BitsPerComponent=bits, + Decode=decode, + DecodeParms=params, + ColorSpace=colorspace, + ) + + # + # page + + existing_pdf.write_page( + page_refs[page_number], + Resources=PdfParser.PdfDict( + ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], + XObject=PdfParser.PdfDict(image=image_refs[page_number]), + ), + MediaBox=[ + 0, + 0, + width * 72.0 / x_resolution, + 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" % ( + width * 72.0 / x_resolution, + 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/site-packages/PIL/PdfParser.py b/.venv/Lib/site-packages/PIL/PdfParser.py new file mode 100644 index 00000000..1b3cb52a --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PdfParser.py @@ -0,0 +1,999 @@ +import calendar +import codecs +import collections +import mmap +import os +import re +import time +import zlib + + +# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set +# on page 656 +def encode_text(s): + 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, error_message): + if not condition: + raise PdfFormatError(error_message) + + +class IndirectReference( + collections.namedtuple("IndirectReferenceTuple", ["object_id", "generation"]) +): + def __str__(self): + return "%s %s R" % self + + def __bytes__(self): + return self.__str__().encode("us-ascii") + + def __eq__(self, other): + return ( + other.__class__ is self.__class__ + and other.object_id == self.object_id + and other.generation == self.generation + ) + + def __ne__(self, other): + return not (self == other) + + def __hash__(self): + return hash((self.object_id, self.generation)) + + +class IndirectObjectDef(IndirectReference): + def __str__(self): + return "%s %s obj" % self + + +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 = ( + "object ID " + str(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): + 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): + 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): + return hash(self.name) + + def __repr__(self): + return f"PdfName({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): + 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): + def __bytes__(self): + return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" + + +class PdfDict(collections.UserDict): + 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): + 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): + 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): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + return False # do not suppress exceptions + + def start_writing(self): + self.close_buf() + self.seek_end() + + def close_buf(self): + try: + self.buf.close() + except AttributeError: + pass + self.buf = None + + def close(self): + 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): + self.f.seek(0, os.SEEK_END) + + def write_header(self): + self.f.write(b"%PDF-1.4\n") + + def write_comment(self, s): + self.f.write(f"% {s}\n".encode()) + + def write_catalog(self): + 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): + 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): + 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): + 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 = int(result[b"Length"]) + except (TypeError, KeyError, ValueError) as e: + msg = "bad or missing Length in stream dict (%r)" % result.get( + b"Length", None + ) + 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 = "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" + generation = int(m.group(2)) + if not is_free: + new_entry = (int(m.group(1)), generation) + check_format_condition( + i not in self.xref_table or self.xref_table[i] == new_entry, + "xref entry duplicated (and not identical)", + ) + 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/site-packages/PIL/PixarImagePlugin.py b/.venv/Lib/site-packages/PIL/PixarImagePlugin.py new file mode 100644 index 00000000..7eb82228 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PixarImagePlugin.py @@ -0,0 +1,69 @@ +# +# 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 . import Image, ImageFile +from ._binary import i16le as i16 + +# +# helpers + + +def _accept(prefix): + 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): + # assuming a 4-byte magic label + 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/site-packages/PIL/PngImagePlugin.py b/.venv/Lib/site-packages/PIL/PngImagePlugin.py new file mode 100644 index 00000000..15a3c829 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PngImagePlugin.py @@ -0,0 +1,1465 @@ +# +# 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. +# + +import itertools +import logging +import re +import struct +import warnings +import zlib +from enum import IntEnum + +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 +from ._deprecate import deprecate + +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 + # Greyscale + (1, 0): ("1", "1"), + (2, 0): ("L", "L;2"), + (4, 0): ("L", "L;4"), + (8, 0): ("L", "L"), + (16, 0): ("I", "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"), + # Greyscale 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 __getattr__(name): + for enum, prefix in {Disposal: "APNG_DISPOSE_", Blend: "APNG_BLEND_"}.items(): + if name.startswith(prefix): + name = name[len(prefix) :] + if name in enum.__members__: + deprecate(f"{prefix}{name}", 10, f"{enum.__name__}.{name}") + return enum[name] + msg = f"module '{__name__}' has no attribute '{name}'" + raise AttributeError(msg) + + +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): + self.fp = fp + self.queue = [] + + def read(self): + """Fetch a new chunk. Returns header information.""" + cid = 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): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + self.queue = self.fp = None + + def push(self, cid, pos, length): + 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, "chunk_" + cid.decode("ascii"))(pos, length) + + def crc(self, cid, data): + """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 + + 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, data): + """Read checksum""" + + self.fp.read(4) + + def verify(self, endchunk=b"IEND"): + # 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 + + """ + + @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): + self.chunks = [] + + def add(self, cid, data, after_idat=False): + """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 + + """ + + chunk = [cid, data] + if after_idat: + chunk.append(True) + self.chunks.append(tuple(chunk)) + + def add_itxt(self, key, value, lang="", tkey="", zip=False): + """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, value, zip=False): + """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, value.tkey, 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): + 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): + self.rewind_state = { + "info": self.im_info.copy(), + "tile": self.im_tile, + "seq_num": self._seq_num, + } + + def rewind(self): + self.im_info = self.rewind_state["info"] + self.im_tile = self.rewind_state["tile"] + self._seq_num = self.rewind_state["seq_num"] + + def chunk_iCCP(self, pos, length): + # 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]) + logger.debug("Compression method %s", s[i]) + comp_method = s[i] + 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, length): + # 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, length): + # 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 + raise EOFError + + def chunk_IEND(self, pos, length): + # end of PNG image + raise EOFError + + def chunk_PLTE(self, pos, length): + # 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, length): + # 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"): + 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, length): + # gamma setting + s = ImageFile._safe_read(self.fp, length) + self.im_info["gamma"] = i32(s) / 100000.0 + return s + + def chunk_cHRM(self, pos, length): + # 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, length): + # 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, length): + # 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, length): + # 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, length): + # 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, length): + # 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 + 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, length): + 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, length): + 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, length): + 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, length): + 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): + return prefix[:8] == _MAGIC + + +## +# Image plugin for PNG images. + + +class PngImageFile(ImageFile.ImageFile): + format = "PNG" + format_description = "Portable network graphics" + + def _open(self): + 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 = [] + self.png = 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): + """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) + + self.png.verify() + self.png.close() + + if self._exclusive_fp: + self.fp.close() + self.fp = None + + def seek(self, frame): + 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, rewind=False): + 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: + raise EOFError + + # 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 + + if self.dispose_op == Disposal.OP_PREVIOUS: + 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) + else: + self.dispose = None + + def tell(self): + return self.__frame + + def load_prepare(self): + """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): + """internal: read more image data""" + + 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): + """internal: finished reading image data""" + 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 + ImageFile._safe_read(self.fp, length) + 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): + 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): + if "exif" not in self.info: + self.load() + + return super().getexif() + + def getxmp(self): + """ + Returns a dictionary containing the XMP tags. + Requires defusedxml to be installed. + + :returns: XMP tags in a dictionary. + """ + return ( + self._getxmp(self.info["XML:com.adobe.xmp"]) + if "XML:com.adobe.xmp" in self.info + else {} + ) + + +# -------------------------------------------------------------------- +# PNG writer + +_OUTMODES = { + # supported PIL modes, and corresponding rawmodes/bits/color combinations + "1": ("1", b"\x01\x00"), + "L;1": ("L;1", b"\x01\x00"), + "L;2": ("L;2", b"\x02\x00"), + "L;4": ("L;4", b"\x04\x00"), + "L": ("L", b"\x08\x00"), + "LA": ("LA", b"\x08\x04"), + "I": ("I;16B", b"\x10\x00"), + "I;16": ("I;16B", b"\x10\x00"), + "P;1": ("P;1", b"\x01\x03"), + "P;2": ("P;2", b"\x02\x03"), + "P;4": ("P;4", b"\x04\x03"), + "P": ("P", b"\x08\x03"), + "RGB": ("RGB", b"\x08\x02"), + "RGBA": ("RGBA", b"\x08\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): + 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): + self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) + self.seq_num += 1 + + +def _write_multiple_frames(im, fp, chunk, rawmode, default_image, append_images): + duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) + 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 == rawmode: + im_frame = im_frame.copy() + else: + if rawmode == "P": + im_frame = im_frame.convert(rawmode, palette=im.palette) + else: + im_frame = im_frame.convert(rawmode) + encoderinfo = im.encoderinfo.copy() + if isinstance(duration, (list, tuple)): + encoderinfo["duration"] = duration[frame_count] + 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("RGB"), base_im.convert("RGB") + ) + bbox = delta.getbbox() + if ( + not bbox + and prev_disposal == encoderinfo.get("disposal") + and prev_blend == encoderinfo.get("blend") + ): + if isinstance(duration, (list, tuple)): + previous["encoderinfo"]["duration"] += encoderinfo["duration"] + continue + else: + bbox = None + im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) + + # 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: + 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", duration))) + 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, fp, filename): + _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() + append_images = im.encoderinfo.get("append_images", []) + if default_image: + chain = itertools.chain(append_images) + else: + chain = itertools.chain([im], append_images) + for im_seq in chain: + for im_frame in ImageSequence.Iterator(im_seq): + modes.add(im_frame.mode) + for mode in ("RGBA", "RGB", "P"): + if mode in modes: + break + else: + mode = modes.pop() + else: + mode = im.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 + mode = f"{mode};{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, mode = _OUTMODES[mode] + 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(im.size[0]), # 0: size + o32(im.size[1]), + mode, # 8: depth/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 = info_chunk[2:3] + 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"): + 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: + _write_multiple_frames(im, fp, chunk, rawmode, default_image, append_images) + else: + 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 = info_chunk[2:3] + 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): + pass + + def append(self, chunk): + 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/site-packages/PIL/PpmImagePlugin.py b/.venv/Lib/site-packages/PIL/PpmImagePlugin.py new file mode 100644 index 00000000..2cb1e563 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PpmImagePlugin.py @@ -0,0 +1,347 @@ +# +# 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 . 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", + # PIL extensions (for test purposes only) + b"PyP": "P", + b"PyRGBA": "RGBA", + b"PyCMYK": "CMYK", +} + + +def _accept(prefix): + return prefix[0:1] == b"P" and prefix[1] in b"0123456y" + + +## +# Image plugin for PBM, PGM, and PPM images. + + +class PpmImageFile(ImageFile.ImageFile): + format = "PPM" + format_description = "Pbmplus image" + + def _read_magic(self): + 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): + 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): + magic_number = self._read_magic() + try: + mode = MODES[magic_number] + except KeyError: + msg = "not a PPM file" + raise SyntaxError(msg) + + 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" + + maxval = None + decoder_name = "raw" + if magic_number in (b"P1", b"P2", b"P3"): + decoder_name = "ppm_plain" + for ix in range(3): + token = int(self._read_token()) + if ix == 0: # token is the x size + xsize = token + elif ix == 1: # token is the y size + ysize = token + if mode == "1": + self.mode = "1" + rawmode = "1;I" + break + else: + self.mode = rawmode = mode + elif ix == 2: # token is maxval + maxval = 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" + + 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, 0, 1) if decoder_name == "raw" else (rawmode, maxval) + self._size = xsize, ysize + self.tile = [(decoder_name, (0, 0, xsize, ysize), self.fp.tell(), args)] + + +# +# -------------------------------------------------------------------- + + +class PpmPlainDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def _read_block(self): + return self.fd.read(ImageFile.SAFEBLOCK) + + def _find_comment_end(self, block, start=0): + 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): + 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): + """ + 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): + 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 = False + 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 = False + + 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 > maxval: + msg = f"Channel value too large for this mode: {value}" + raise ValueError(msg) + 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): + 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): + 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) + while len(data) < self.state.xsize * self.state.ysize * bands * out_byte_count: + 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, fp, filename): + 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" + 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") + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) + + # ALTERNATIVE: save via builtin debug function + # im._dump(filename) + + +# +# -------------------------------------------------------------------- + + +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"]) + +Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/.venv/Lib/site-packages/PIL/PsdImagePlugin.py b/.venv/Lib/site-packages/PIL/PsdImagePlugin.py new file mode 100644 index 00000000..5a5d60d5 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PsdImagePlugin.py @@ -0,0 +1,303 @@ +# +# 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. +# + +import io + +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 + +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): + 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): + 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 = [] + + size = i32(read(4)) + if size: + end = self.fp.tell() + size + size = i32(read(4)) + if size: + _layer_data = io.BytesIO(ImageFile._safe_read(self.fp, size)) + self.layers = _layerinfo(_layer_data, size) + self.fp.seek(end) + self.n_frames = len(self.layers) + self.is_animated = self.n_frames > 1 + + # + # 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 + + def seek(self, layer): + if not self._seek_check(layer): + return + + # seek to given layer (1..max) + try: + name, mode, bbox, tile = self.layers[layer - 1] + self.mode = mode + self.tile = tile + self.frame = layer + self.fp = self._fp + return name, bbox + except IndexError as e: + msg = "no such layer" + raise EOFError(msg) from e + + def tell(self): + # 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 = i32(read(4)) + x0 = i32(read(4)) + y1 = i32(read(4)) + x1 = i32(read(4)) + + # image info + mode = [] + ct_types = i16(read(2)) + types = list(range(ct_types)) + if len(types) > 4: + continue + + for _ in 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/site-packages/PIL/PyAccess.py b/.venv/Lib/site-packages/PIL/PyAccess.py new file mode 100644 index 00000000..39747b4f --- /dev/null +++ b/.venv/Lib/site-packages/PIL/PyAccess.py @@ -0,0 +1,360 @@ +# +# 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. +# + +import logging +import sys + +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(ex) + +logger = logging.getLogger(__name__) + + +class PyAccess: + def __init__(self, img, readonly=False): + 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): + pass + + def __setitem__(self, xy, color): + """ + 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 + + :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] + color = self._palette.getcolor(color, self._img) + if self._im.mode == "PA": + color = (color, alpha) + + return self.set_pixel(x, y, color) + + def __getitem__(self, xy): + """ + 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): + (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 + + +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, y): + 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, y): + 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, y): + 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, y): + 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, y): + 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, y): + 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 # noqa: E741 + 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, y): + 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 # noqa: E741 + 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, y): + 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, y): + 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, y): + 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, readonly=False): + 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/site-packages/PIL/QoiImagePlugin.py b/.venv/Lib/site-packages/PIL/QoiImagePlugin.py new file mode 100644 index 00000000..ef91b90a --- /dev/null +++ b/.venv/Lib/site-packages/PIL/QoiImagePlugin.py @@ -0,0 +1,105 @@ +# +# The Python Imaging Library. +# +# QOI support for PIL +# +# See the README file for information on usage and redistribution. +# + +import os + +from . import Image, ImageFile +from ._binary import i32be as i32 +from ._binary import o8 + + +def _accept(prefix): + return prefix[:4] == b"qoif" + + +class QoiImageFile(ImageFile.ImageFile): + format = "QOI" + format_description = "Quite OK Image" + + def _open(self): + 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 + + def _add_to_previous_pixels(self, value): + 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): + self._previously_seen_pixels = {} + self._previous_pixel = None + self._add_to_previous_pixels(b"".join(o8(i) for i in (0, 0, 0, 255))) + + data = bytearray() + bands = Image.getmodebands(self.mode) + while len(data) < self.state.xsize * self.state.ysize * bands: + byte = self.fd.read(1)[0] + if byte == 0b11111110: # QOI_OP_RGB + value = self.fd.read(3) + o8(255) + 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, (0, 0, 0, 0)) + elif op == 1: # QOI_OP_DIFF + value = ( + (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, + ) + value += (self._previous_pixel[3],) + elif op == 2: # 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 = 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: # QOI_OP_RUN + run_length = (byte & 0b00111111) + 1 + value = self._previous_pixel + if bands == 3: + value = value[:3] + data += value * run_length + continue + value = b"".join(o8(i) for i in value) + self._add_to_previous_pixels(value) + + if bands == 3: + value = value[:3] + data += value + self.set_as_raw(bytes(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/site-packages/PIL/SgiImagePlugin.py b/.venv/Lib/site-packages/PIL/SgiImagePlugin.py new file mode 100644 index 00000000..3662ffd1 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/SgiImagePlugin.py @@ -0,0 +1,231 @@ +# +# 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. +# + + +import os +import struct + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import o8 + + +def _accept(prefix): + 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): + # HEAD + 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, fp, filename): + if im.mode != "RGB" and im.mode != "RGBA" and im.mode != "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 == 1 or dim == 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] + 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): + 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/site-packages/PIL/SpiderImagePlugin.py b/.venv/Lib/site-packages/PIL/SpiderImagePlugin.py new file mode 100644 index 00000000..eac27e67 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/SpiderImagePlugin.py @@ -0,0 +1,318 @@ +# +# The Python Imaging Library. +# +# SPIDER image file handling +# +# History: +# 2004-08-02 Created BB +# 2006-03-02 added save method +# 2006-03-13 added support for stack images +# +# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. +# Copyright (c) 2004 by William Baxter. +# Copyright (c) 2004 by Secret Labs AB. +# Copyright (c) 2004 by Fredrik Lundh. +# + +## +# Image plugin for the Spider image format. This format is used +# by the SPIDER software, in processing image data from electron +# microscopy and tomography. +## + +# +# SpiderImagePlugin.py +# +# The Spider image format is used by SPIDER software, in processing +# image data from electron microscopy and tomography. +# +# Spider home page: +# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html +# +# Details about the Spider image format: +# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html +# +import os +import struct +import sys + +from PIL import Image, ImageFile + + +def isInt(f): + try: + i = int(f) + if f - i == 0: + return 1 + else: + return 0 + except (ValueError, OverflowError): + return 0 + + +iforms = [1, 3, -11, -12, -21, -22] + + +# There is no magic number to identify Spider files, so just check a +# series of header locations to see if they have reasonable values. +# Returns no. of bytes in the header, if it is a valid Spider header, +# otherwise returns 0 + + +def isSpiderHeader(t): + h = (99,) + t # add 1 value so can use spider header index start=1 + # header values 1,2,5,12,13,22,23 should be integers + for i in [1, 2, 5, 12, 13, 22, 23]: + if not isInt(h[i]): + return 0 + # check iform + iform = int(h[5]) + if iform not in iforms: + return 0 + # check other header values + labrec = int(h[13]) # no. records in file header + labbyt = int(h[22]) # total no. of bytes in header + lenbyt = int(h[23]) # record length in bytes + if labbyt != (labrec * lenbyt): + return 0 + # looks like a valid header + return labbyt + + +def isSpiderImage(filename): + with open(filename, "rb") as fp: + f = fp.read(92) # read 23 * 4 bytes + t = struct.unpack(">23f", f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + t = struct.unpack("<23f", f) # little-endian + hdrlen = isSpiderHeader(t) + return hdrlen + + +class SpiderImageFile(ImageFile.ImageFile): + format = "SPIDER" + format_description = "Spider 2D image" + _close_exclusive_fp_after_loading = False + + def _open(self): + # check header + n = 27 * 4 # read 27 float values + f = self.fp.read(n) + + try: + self.bigendian = 1 + t = struct.unpack(">27f", f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + self.bigendian = 0 + t = struct.unpack("<27f", f) # little-endian + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + msg = "not a valid Spider file" + raise SyntaxError(msg) + except struct.error as e: + msg = "not a valid Spider file" + raise SyntaxError(msg) from e + + h = (99,) + t # add 1 value : spider header index starts at 1 + iform = int(h[5]) + if iform != 1: + msg = "not a Spider 2D image" + raise SyntaxError(msg) + + self._size = int(h[12]), int(h[2]) # size in pixels (width, height) + self.istack = int(h[24]) + self.imgnumber = int(h[27]) + + if self.istack == 0 and self.imgnumber == 0: + # stk=0, img=0: a regular 2D image + offset = hdrlen + self._nimages = 1 + elif self.istack > 0 and self.imgnumber == 0: + # stk>0, img=0: Opening the stack for the first time + self.imgbytes = int(h[12]) * int(h[2]) * 4 + self.hdrlen = hdrlen + self._nimages = int(h[26]) + # Point to the first image in the stack + offset = hdrlen * 2 + self.imgnumber = 1 + elif self.istack == 0 and self.imgnumber > 0: + # stk=0, img>0: an image within the stack + offset = hdrlen + self.stkoffset + self.istack = 2 # So Image knows it's still a stack + else: + msg = "inconsistent stack header values" + raise SyntaxError(msg) + + if self.bigendian: + self.rawmode = "F;32BF" + else: + self.rawmode = "F;32F" + self.mode = "F" + + self.tile = [("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1))] + self._fp = self.fp # FIXME: hack + + @property + def n_frames(self): + return self._nimages + + @property + def is_animated(self): + return self._nimages > 1 + + # 1st image index is zero (although SPIDER imgnumber starts at 1) + def tell(self): + if self.imgnumber < 1: + return 0 + else: + return self.imgnumber - 1 + + def seek(self, frame): + if self.istack == 0: + msg = "attempt to seek in a non-stack file" + raise EOFError(msg) + if not self._seek_check(frame): + return + self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) + self.fp = self._fp + self.fp.seek(self.stkoffset) + self._open() + + # returns a byte image after rescaling to 0..255 + def convert2byte(self, depth=255): + (minimum, maximum) = self.getextrema() + m = 1 + if maximum != minimum: + m = depth / (maximum - minimum) + b = -m * minimum + return self.point(lambda i, m=m, b=b: i * m + b).convert("L") + + # returns a ImageTk.PhotoImage object, after rescaling to 0..255 + def tkPhotoImage(self): + from PIL import ImageTk + + return ImageTk.PhotoImage(self.convert2byte(), palette=256) + + +# -------------------------------------------------------------------- +# Image series + + +# given a list of filenames, return a list of images +def loadImageSeries(filelist=None): + """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" + if filelist is None or len(filelist) < 1: + return + + imglist = [] + for img in filelist: + if not os.path.exists(img): + print(f"unable to find {img}") + continue + try: + with Image.open(img) as im: + im = im.convert2byte() + except Exception: + if not isSpiderImage(img): + print(img + " is not a Spider image file") + continue + im.info["filename"] = img + imglist.append(im) + return imglist + + +# -------------------------------------------------------------------- +# For saving images in Spider format + + +def makeSpiderHeader(im): + nsam, nrow = im.size + lenbyt = nsam * 4 # There are labrec records in the header + labrec = int(1024 / lenbyt) + if 1024 % lenbyt != 0: + labrec += 1 + labbyt = labrec * lenbyt + nvalues = int(labbyt / 4) + if nvalues < 23: + return [] + + hdr = [] + for i in range(nvalues): + hdr.append(0.0) + + # NB these are Fortran indices + hdr[1] = 1.0 # nslice (=1 for an image) + hdr[2] = float(nrow) # number of rows per slice + hdr[3] = float(nrow) # number of records in the image + hdr[5] = 1.0 # iform for 2D image + hdr[12] = float(nsam) # number of pixels per line + hdr[13] = float(labrec) # number of records in file header + hdr[22] = float(labbyt) # total number of bytes in header + hdr[23] = float(lenbyt) # record length in bytes + + # adjust for Fortran indexing + hdr = hdr[1:] + hdr.append(0.0) + # pack binary data into a string + return [struct.pack("f", v) for v in hdr] + + +def _save(im, fp, filename): + if im.mode[0] != "F": + im = im.convert("F") + + hdr = makeSpiderHeader(im) + if len(hdr) < 256: + msg = "Error creating Spider header" + raise OSError(msg) + + # write the SPIDER header + fp.writelines(hdr) + + rawmode = "F;32NF" # 32-bit native floating point + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) + + +def _save_spider(im, fp, filename): + # get the filename extension and register it with Image + ext = os.path.splitext(filename)[1] + Image.register_extension(SpiderImageFile.format, ext) + _save(im, fp, filename) + + +# -------------------------------------------------------------------- + + +Image.register_open(SpiderImageFile.format, SpiderImageFile) +Image.register_save(SpiderImageFile.format, _save_spider) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") + sys.exit() + + filename = sys.argv[1] + if not isSpiderImage(filename): + print("input image must be in Spider format") + sys.exit() + + with Image.open(filename) as im: + print("image: " + str(im)) + print("format: " + str(im.format)) + print("size: " + str(im.size)) + print("mode: " + str(im.mode)) + print("max, min: ", end=" ") + print(im.getextrema()) + + if len(sys.argv) > 2: + outfile = sys.argv[2] + + # perform some image operation + im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + print( + f"saving a flipped version of {os.path.basename(filename)} " + f"as {outfile} " + ) + im.save(outfile, SpiderImageFile.format) diff --git a/.venv/Lib/site-packages/PIL/SunImagePlugin.py b/.venv/Lib/site-packages/PIL/SunImagePlugin.py new file mode 100644 index 00000000..6712583d --- /dev/null +++ b/.venv/Lib/site-packages/PIL/SunImagePlugin.py @@ -0,0 +1,139 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Sun image file handling +# +# History: +# 1995-09-10 fl Created +# 1996-05-28 fl Fixed 32-bit alignment +# 1998-12-29 fl Import ImagePalette module +# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995-1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i32be as i32 + + +def _accept(prefix): + return len(prefix) >= 4 and i32(prefix) == 0x59A66A95 + + +## +# Image plugin for Sun raster files. + + +class SunImageFile(ImageFile.ImageFile): + format = "SUN" + format_description = "Sun Raster File" + + def _open(self): + # The Sun Raster file header is 32 bytes in length + # and has the following format: + + # typedef struct _SunRaster + # { + # DWORD MagicNumber; /* Magic (identification) number */ + # DWORD Width; /* Width of image in pixels */ + # DWORD Height; /* Height of image in pixels */ + # DWORD Depth; /* Number of bits per pixel */ + # DWORD Length; /* Size of image data in bytes */ + # DWORD Type; /* Type of raster file */ + # DWORD ColorMapType; /* Type of color map */ + # DWORD ColorMapLength; /* Size of the color map in bytes */ + # } SUNRASTER; + + # HEAD + s = self.fp.read(32) + if not _accept(s): + msg = "not an SUN raster file" + raise SyntaxError(msg) + + offset = 32 + + self._size = i32(s, 4), i32(s, 8) + + depth = i32(s, 12) + # data_length = i32(s, 16) # unreliable, ignore. + file_type = i32(s, 20) + palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary + palette_length = i32(s, 28) + + if depth == 1: + self.mode, rawmode = "1", "1;I" + elif depth == 4: + self.mode, rawmode = "L", "L;4" + elif depth == 8: + self.mode = rawmode = "L" + elif depth == 24: + if file_type == 3: + self.mode, rawmode = "RGB", "RGB" + else: + self.mode, rawmode = "RGB", "BGR" + elif depth == 32: + if file_type == 3: + self.mode, rawmode = "RGB", "RGBX" + else: + self.mode, rawmode = "RGB", "BGRX" + else: + msg = "Unsupported Mode/Bit Depth" + raise SyntaxError(msg) + + if palette_length: + if palette_length > 1024: + msg = "Unsupported Color Palette Length" + raise SyntaxError(msg) + + if palette_type != 1: + msg = "Unsupported Palette Type" + raise SyntaxError(msg) + + offset = offset + palette_length + self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) + if self.mode == "L": + self.mode = "P" + rawmode = rawmode.replace("L", "P") + + # 16 bit boundaries on stride + stride = ((self.size[0] * depth + 15) // 16) * 2 + + # file type: Type is the version (or flavor) of the bitmap + # file. The following values are typically found in the Type + # field: + # 0000h Old + # 0001h Standard + # 0002h Byte-encoded + # 0003h RGB format + # 0004h TIFF format + # 0005h IFF format + # FFFFh Experimental + + # Old and standard are the same, except for the length tag. + # byte-encoded is run-length-encoded + # RGB looks similar to standard, but RGB byte order + # TIFF and IFF mean that they were converted from T/IFF + # Experimental means that it's something else. + # (https://www.fileformat.info/format/sunraster/egff.htm) + + if file_type in (0, 1, 3, 4, 5): + self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride))] + elif file_type == 2: + self.tile = [("sun_rle", (0, 0) + self.size, offset, rawmode)] + else: + msg = "Unsupported Sun Raster file type" + raise SyntaxError(msg) + + +# +# registry + + +Image.register_open(SunImageFile.format, SunImageFile, _accept) + +Image.register_extension(SunImageFile.format, ".ras") diff --git a/.venv/Lib/site-packages/PIL/TarIO.py b/.venv/Lib/site-packages/PIL/TarIO.py new file mode 100644 index 00000000..32928f6a --- /dev/null +++ b/.venv/Lib/site-packages/PIL/TarIO.py @@ -0,0 +1,66 @@ +# +# The Python Imaging Library. +# $Id$ +# +# read files from within a tar file +# +# History: +# 95-06-18 fl Created +# 96-05-28 fl Open files in binary mode +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-96. +# +# See the README file for information on usage and redistribution. +# + +import io + +from . import ContainerIO + + +class TarIO(ContainerIO.ContainerIO): + """A file object that provides read access to a given member of a TAR file.""" + + def __init__(self, tarfile, file): + """ + Create file object. + + :param tarfile: Name of TAR file. + :param file: Name of member file. + """ + self.fh = open(tarfile, "rb") + + while True: + s = self.fh.read(512) + if len(s) != 512: + msg = "unexpected end of tar file" + raise OSError(msg) + + name = s[:100].decode("utf-8") + i = name.find("\0") + if i == 0: + msg = "cannot find subfile" + raise OSError(msg) + if i > 0: + name = name[:i] + + size = int(s[124:135], 8) + + if file == name: + break + + self.fh.seek((size + 511) & (~511), io.SEEK_CUR) + + # Open region + super().__init__(self.fh, self.fh.tell(), size) + + # Context manager support + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + self.fh.close() diff --git a/.venv/Lib/site-packages/PIL/TgaImagePlugin.py b/.venv/Lib/site-packages/PIL/TgaImagePlugin.py new file mode 100644 index 00000000..67dfc3d3 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/TgaImagePlugin.py @@ -0,0 +1,255 @@ +# +# 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. +# + + +import warnings + +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): "BGR;5", + (2, 24): "BGR", + (2, 32): "BGRA", +} + + +## +# Image plugin for Targa files. + + +class TgaImageFile(ImageFile.ImageFile): + format = "TGA" + format_description = "Targa" + + def _open(self): + # process header + 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" + elif imagetype in (2, 10): + self.mode = "RGB" + if depth == 32: + self.mode = "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( + "BGR;15", b"\0" * 2 * start + self.fp.read(2 * size) + ) + elif mapdepth == 24: + self.palette = ImagePalette.raw( + "BGR", b"\0" * 3 * start + self.fp.read(3 * size) + ) + elif mapdepth == 32: + self.palette = ImagePalette.raw( + "BGRA", b"\0" * 4 * start + self.fp.read(4 * size) + ) + + # 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): + if self._flip_horizontally: + 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, fp, filename): + 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: + 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/site-packages/PIL/TiffImagePlugin.py b/.venv/Lib/site-packages/PIL/TiffImagePlugin.py new file mode 100644 index 00000000..3d4d0910 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/TiffImagePlugin.py @@ -0,0 +1,2165 @@ +# +# 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. +# +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 . import Image, ImageFile, ImageOps, ImagePalette, TiffTags +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +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 +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, (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,)): ("RGBX", "RGBX"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "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,)): ("RGBX", "RGBX;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "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), (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"), + # 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 +] + + +def _accept(prefix): + 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 = {} + + +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): + return str(float(self._val)) + + def __hash__(self): + return self._val.__hash__() + + def __eq__(self, other): + 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 + + def _delegate(op): + def delegate(self, *args): + return getattr(self._val, op)(*args) + + return delegate + + """ 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__") + + +class ImageFileDirectory_v2(MutableMapping): + """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``. + + """ + + def __init__(self, ifh=b"II\052\0\0\0\0\0", prefix=None, group=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 = {} + """ 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) + legacy_api = property(lambda self: self._legacy_api) + + @legacy_api.setter + def legacy_api(self, value): + msg = "Not allowing setting of legacy api" + raise Exception(msg) + + def reset(self): + self._tags_v1 = {} # will remain empty if legacy_api is false + self._tags_v2 = {} # main tag storage + self._tagdata = {} + self.tagtype = {} # added 2008-06-05 by Florian Hoech + self._next = None + self._offset = None + + def __str__(self): + 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): + 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): + 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) + + 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("=" + 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) + ) + + 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, 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(msg + f" - unsupported type {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(f"Tag {tag}, Type: {typ}, Value: {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(f"{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, "load_" + name, _load_dispatch[idx][1]) + setattr(ImageFileDirectory_v2, "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 + """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): + """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): + 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): + """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 = [] + self._n_frames = None + + logger.debug("*** TiffImageFile._open ***") + logger.debug(f"- __first: {self.__first}") + logger.debug(f"- ifh: {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): + """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): + 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( + f"Seeking to frame {frame}, on frame {self.__frame}, " + f"__next {self.__next}, location: {self.fp.tell()}" + ) + 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) + 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): + """Return the current frame number""" + return self.__frame + + def getxmp(self): + """ + Returns a dictionary containing the XMP tags. + Requires defusedxml to be installed. + + :returns: XMP tags in a dictionary. + """ + return self._getxmp(self.tag_v2[XMP]) if XMP in self.tag_v2 else {} + + 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(0x8649) + 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): + if self._tile_orientation: + method = { + 2: Image.Transpose.FLIP_LEFT_RIGHT, + 3: Image.Transpose.ROTATE_180, + 4: Image.Transpose.FLIP_TOP_BOTTOM, + 5: Image.Transpose.TRANSPOSE, + 6: Image.Transpose.ROTATE_270, + 7: Image.Transpose.TRANSVERSE, + 8: Image.Transpose.ROTATE_90, + }.get(self._tile_orientation) + if method is not None: + self.im = self.im.transpose(method) + self._size = self.im.size + + # 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) + + 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. + # libtiff closes the file descriptor, so pass in a dup. + try: + fp = hasattr(self.fp, "fileno") and os.dup(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()) + + if fp: + try: + os.close(fp) + except OSError: + pass + + self.tile = [] + self.readonly = 0 + + self.load_end() + + # libtiff closed the fp in a, we need to close self.fp, if possible + 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(f"- compression: {self._compression}") + logger.debug(f"- photometric_interpretation: {photo}") + logger.debug(f"- planar_configuration: {self._planar_configuration}") + logger.debug(f"- fill_order: {fillorder}") + logger.debug(f"- YCbCr subsampling: {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(f"- size: {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(f"format key: {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(f"- raw mode: {rawmode}") + logger.debug(f"- pil mode: {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(f"format key: {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)) + + self._tile_orientation = self.tag_v2.get(0x0112) + + +# +# -------------------------------------------------------------------- +# 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 + + # 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: + 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 + stride = len(bits) * ((im.size[0] * bits[0] + 7) // 8) + # 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, im.size[1]) + # JPEG encoder expects multiple of 8 rows + if compression == "jpeg": + rows_per_strip = min(((rows_per_strip + 7) // 8) * 8, im.size[1]) + else: + rows_per_strip = im.size[1] + if rows_per_strip == 0: + rows_per_strip = 1 + strip_byte_counts = 1 if stride == 0 else stride * rows_per_strip + strips_per_image = (im.size[1] + rows_per_strip - 1) // rows_per_strip + ifd[ROWSPERSTRIP] = rows_per_strip + if strip_byte_counts >= 2**16: + ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG + ifd[STRIPBYTECOUNTS] = (strip_byte_counts,) * (strips_per_image - 1) + ( + stride * im.size[1] - 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. + # 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 += [ + 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. + legacy_ifd = {} + if hasattr(im, "tag"): + legacy_ifd = im.tag.to_v2() + + # SAMPLEFORMAT is determined by the image format and should not be copied + # from legacy_ifd. + supplied_tags = {**getattr(im, "tag_v2", {}), **legacy_ifd} + if SAMPLEFORMAT in supplied_tags: + del supplied_tags[SAMPLEFORMAT] + + 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) + e = Image._getencoder(im.mode, "libtiff", a, encoderconfig) + e.setimage(im.im, (0, 0) + im.size) + while True: + # undone, change to self.decodermaxblock: + errcode, data = e.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 + ] + + # StripOffsets = 273 + # FreeOffsets = 288 + # TileOffsets = 324 + # JPEGQTables = 519 + # JPEGDCTables = 520 + # JPEGACTables = 521 + Tags = {273, 288, 324, 519, 520, 521} + + 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): + # 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): + if self.isFirst: + return + + # fix offsets + self.f.seek(self.offsetOfNewPage) + + iimm = self.f.read(4) + if not iimm: + # msg = "nothing written into new page" + # raise RuntimeError(msg) + # 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): + # Call this to finish a frame. + self.finalize() + self.setup() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.close_fp: + self.close() + return False + + def tell(self): + 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): + 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): + self.endian = endian + self.longFmt = self.endian + "L" + self.shortFmt = self.endian + "H" + self.tagFormat = self.endian + "HHL" + + def skipIFDs(self): + 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): + return self.f.write(data) + + def readShort(self): + (value,) = struct.unpack(self.shortFmt, self.f.read(2)) + return value + + def readLong(self): + (value,) = struct.unpack(self.longFmt, self.f.read(4)) + return value + + def rewriteLastShortToLong(self, value): + 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): + 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): + 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): + 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): + 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): + self.finalize() + self.f.close() + + def fixIFD(self): + 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 + if not is_local: + offset = self.readLong() + offset += 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, isShort=False, isLong=False): + 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, fp, filename): + 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/site-packages/PIL/TiffTags.py b/.venv/Lib/site-packages/PIL/TiffTags.py new file mode 100644 index 00000000..30b05e4e --- /dev/null +++ b/.venv/Lib/site-packages/PIL/TiffTags.py @@ -0,0 +1,560 @@ +# +# 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 collections import namedtuple + + +class TagInfo(namedtuple("_TagInfo", "value name type length enum")): + __slots__ = [] + + 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", +} + + +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 group, tags in TAGS_V2_GROUPS.items(): + for k, v in tags.items(): + tags[k] = TagInfo(k, *v) + + +_populate() +## +# Map type numbers to type names -- defined in ImageFileDirectory. + +TYPES = {} + +# was: +# TYPES = { +# 1: "byte", +# 2: "ascii", +# 3: "short", +# 4: "long", +# 5: "rational", +# 6: "signed byte", +# 7: "undefined", +# 8: "signed short", +# 9: "signed long", +# 10: "signed rational", +# 11: "float", +# 12: "double", +# } + +# +# 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/site-packages/PIL/WalImageFile.py b/.venv/Lib/site-packages/PIL/WalImageFile.py new file mode 100644 index 00000000..e4f47aa0 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/WalImageFile.py @@ -0,0 +1,123 @@ +# +# 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 . import Image, ImageFile +from ._binary import i32le as i32 + + +class WalImageFile(ImageFile.ImageFile): + format = "WAL" + format_description = "Quake2 Texture" + + def _open(self): + 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/site-packages/PIL/WebPImagePlugin.py b/.venv/Lib/site-packages/PIL/WebPImagePlugin.py new file mode 100644 index 00000000..ce8e05fc --- /dev/null +++ b/.venv/Lib/site-packages/PIL/WebPImagePlugin.py @@ -0,0 +1,366 @@ +from io import BytesIO + +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): + 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 + + +class WebPImageFile(ImageFile.ImageFile): + format = "WEBP" + format_description = "WebP image" + __loaded = 0 + __logical_frame = 0 + + def _open(self): + 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): + if "exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + def getxmp(self): + """ + Returns a dictionary containing the XMP tags. + Requires defusedxml to be installed. + + :returns: XMP tags in a dictionary. + """ + return self._getxmp(self.info["xmp"]) if "xmp" in self.info else {} + + def seek(self, frame): + if not self._seek_check(frame): + return + + # Set logical frame to requested position + self.__logical_frame = frame + + def _reset(self, reset=True): + 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): + 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 tell(self): + if not _webp.HAVE_WEBPANIM: + return super().tell() + + return self.__logical_frame + + +def _save_all(im, fp, filename): + 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 = (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) + 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, + 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, 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, fp, filename): + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + 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: + alpha = ( + "A" in im.mode + or "a" in im.mode + or (im.mode == "P" and "transparency" in im.info) + ) + im = im.convert("RGBA" if alpha else "RGB") + + data = _webp.WebPEncode( + im.tobytes(), + im.size[0], + im.size[1], + lossless, + float(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/site-packages/PIL/WmfImagePlugin.py b/.venv/Lib/site-packages/PIL/WmfImagePlugin.py new file mode 100644 index 00000000..0ecab56a --- /dev/null +++ b/.venv/Lib/site-packages/PIL/WmfImagePlugin.py @@ -0,0 +1,178 @@ +# +# 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 . 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): + """ + 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: + def open(self, im): + im.mode = "RGB" + self.bbox = im.info["wmf_bbox"] + + def load(self, im): + 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): + 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): + 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): + 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, fp, filename): + 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/site-packages/PIL/XVThumbImagePlugin.py b/.venv/Lib/site-packages/PIL/XVThumbImagePlugin.py new file mode 100644 index 00000000..aa4a01f4 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/XVThumbImagePlugin.py @@ -0,0 +1,78 @@ +# +# 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 . 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): + return prefix[:6] == _MAGIC + + +## +# Image plugin for XV thumbnail images. + + +class XVThumbImageFile(ImageFile.ImageFile): + format = "XVThumb" + format_description = "XV thumbnail image" + + def _open(self): + # check magic + 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/site-packages/PIL/XbmImagePlugin.py b/.venv/Lib/site-packages/PIL/XbmImagePlugin.py new file mode 100644 index 00000000..3c12564c --- /dev/null +++ b/.venv/Lib/site-packages/PIL/XbmImagePlugin.py @@ -0,0 +1,94 @@ +# +# 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. +# + +import re + +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): + return prefix.lstrip()[:7] == b"#define" + + +## +# Image plugin for X11 bitmaps. + + +class XbmImageFile(ImageFile.ImageFile): + format = "XBM" + format_description = "X11 Bitmap" + + def _open(self): + 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, fp, filename): + 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/site-packages/PIL/XpmImagePlugin.py b/.venv/Lib/site-packages/PIL/XpmImagePlugin.py new file mode 100644 index 00000000..5d5bdc3e --- /dev/null +++ b/.venv/Lib/site-packages/PIL/XpmImagePlugin.py @@ -0,0 +1,128 @@ +# +# 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. +# + + +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): + 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): + 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, bytes): + # + # load all image data in one chunk + + xsize, ysize = self.size + + s = [None] * ysize + + for i in range(ysize): + s[i] = self.fp.readline()[1 : xsize + 1].ljust(xsize) + + 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/site-packages/PIL/__init__.py b/.venv/Lib/site-packages/PIL/__init__.py new file mode 100644 index 00000000..32d2381f --- /dev/null +++ b/.venv/Lib/site-packages/PIL/__init__.py @@ -0,0 +1,85 @@ +"""Pillow (Fork of the Python Imaging Library) + +Pillow is the friendly PIL fork by Jeffrey A. Clark (Alex) and contributors. + https://github.com/python-pillow/Pillow/ + +Pillow is forked from PIL 1.1.7. + +PIL is the Python Imaging Library by Fredrik Lundh and contributors. +Copyright (c) 1999 by Secret Labs AB. + +Use PIL.__version__ for this Pillow version. + +;-) +""" + +from . import _version + +# VERSION was removed in Pillow 6.0.0. +# PILLOW_VERSION was removed in Pillow 9.0.0. +# Use __version__ instead. +__version__ = _version.__version__ +del _version + + +_plugins = [ + "BlpImagePlugin", + "BmpImagePlugin", + "BufrStubImagePlugin", + "CurImagePlugin", + "DcxImagePlugin", + "DdsImagePlugin", + "EpsImagePlugin", + "FitsImagePlugin", + "FitsStubImagePlugin", + "FliImagePlugin", + "FpxImagePlugin", + "FtexImagePlugin", + "GbrImagePlugin", + "GifImagePlugin", + "GribStubImagePlugin", + "Hdf5StubImagePlugin", + "IcnsImagePlugin", + "IcoImagePlugin", + "ImImagePlugin", + "ImtImagePlugin", + "IptcImagePlugin", + "JpegImagePlugin", + "Jpeg2KImagePlugin", + "McIdasImagePlugin", + "MicImagePlugin", + "MpegImagePlugin", + "MpoImagePlugin", + "MspImagePlugin", + "PalmImagePlugin", + "PcdImagePlugin", + "PcxImagePlugin", + "PdfImagePlugin", + "PixarImagePlugin", + "PngImagePlugin", + "PpmImagePlugin", + "PsdImagePlugin", + "QoiImagePlugin", + "SgiImagePlugin", + "SpiderImagePlugin", + "SunImagePlugin", + "TgaImagePlugin", + "TiffImagePlugin", + "WebPImagePlugin", + "WmfImagePlugin", + "XbmImagePlugin", + "XpmImagePlugin", + "XVThumbImagePlugin", +] + + +class UnidentifiedImageError(OSError): + """ + Raised in :py:meth:`PIL.Image.open` if an image cannot be opened and identified. + + If a PNG image raises this error, setting :data:`.ImageFile.LOAD_TRUNCATED_IMAGES` + to true may allow the image to be opened after all. The setting will ignore missing + data and checksum failures. + """ + + pass diff --git a/.venv/Lib/site-packages/PIL/__main__.py b/.venv/Lib/site-packages/PIL/__main__.py new file mode 100644 index 00000000..a05323f9 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/__main__.py @@ -0,0 +1,3 @@ +from .features import pilinfo + +pilinfo() diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc new file mode 100644 index 00000000..9c9a8d2b Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..330a3733 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..2fd49953 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..7930658d Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc new file mode 100644 index 00000000..39cd3a97 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..72f72847 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..4b9e3727 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..d403285d Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..8b2d17be Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc new file mode 100644 index 00000000..e4d59a54 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..a89ac8f4 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FitsStubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FitsStubImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..50d1156a Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/FitsStubImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..9437b962 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc new file mode 100644 index 00000000..1faa727a Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..915d8bfc Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..4a04bb93 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..d7c1889c Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc new file mode 100644 index 00000000..1fdf9c3c Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..f1bff2c7 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-311.pyc new file mode 100644 index 00000000..5e224a3b Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc new file mode 100644 index 00000000..34fe755e Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..5a0f8212 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..4449951e Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..6a034cfd Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..add66f88 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..f9dc7420 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc new file mode 100644 index 00000000..84d62165 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-311.pyc new file mode 100644 index 00000000..ddd42a49 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-311.pyc new file mode 100644 index 00000000..46554178 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc new file mode 100644 index 00000000..6b2ee617 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc new file mode 100644 index 00000000..ca44c30e Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-311.pyc new file mode 100644 index 00000000..934c22d6 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc new file mode 100644 index 00000000..d1ea88ca Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-311.pyc new file mode 100644 index 00000000..c19b0e9d Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-311.pyc new file mode 100644 index 00000000..2a3bb7f9 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc new file mode 100644 index 00000000..fdd15d55 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc new file mode 100644 index 00000000..069b290f Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc new file mode 100644 index 00000000..239e39d2 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc new file mode 100644 index 00000000..e636e26a Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc new file mode 100644 index 00000000..c8c18039 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc new file mode 100644 index 00000000..1475bfa4 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc new file mode 100644 index 00000000..37744fb9 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc new file mode 100644 index 00000000..24b2283f Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc new file mode 100644 index 00000000..07402173 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-311.pyc new file mode 100644 index 00000000..398ed092 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-311.pyc new file mode 100644 index 00000000..95bf44f8 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-311.pyc new file mode 100644 index 00000000..13f4e6ae Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc new file mode 100644 index 00000000..e6ca359e Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-311.pyc new file mode 100644 index 00000000..c95dfab9 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc new file mode 100644 index 00000000..7b52c4ac Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..963e36ff Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..6c244d9f Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..d632bdd1 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..52f181e7 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-311.pyc new file mode 100644 index 00000000..f7f93eac Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..e8e9ed52 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..bbd5dd1d Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..acc8d0b4 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..c8c52c4a Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..361c4e22 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc new file mode 100644 index 00000000..d91cd32b Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc new file mode 100644 index 00000000..3d81ffad Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..5e150873 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..7fba2713 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc new file mode 100644 index 00000000..fe05d4c5 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..04bc6dce Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..272afd51 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-311.pyc new file mode 100644 index 00000000..eb81c9db Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..1d99b913 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..bc2169f1 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..a0a3c283 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..694609f7 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-311.pyc new file mode 100644 index 00000000..7f6922fa Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..bb2fb31a Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..7c1f0bc6 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..900d72b0 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..c0273dfc Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc new file mode 100644 index 00000000..fa4cada7 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..3939fe26 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..cde4adf1 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc new file mode 100644 index 00000000..0c71a9fe Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc new file mode 100644 index 00000000..8b01f617 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..47867463 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..36436d58 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..a8a86229 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..cc2c2735 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-311.pyc new file mode 100644 index 00000000..9ad38513 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 00000000..fce5b4ce Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc new file mode 100644 index 00000000..f060a4da Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_binary.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_binary.cpython-311.pyc new file mode 100644 index 00000000..53876499 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/_binary.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc new file mode 100644 index 00000000..8c7d6b30 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-311.pyc new file mode 100644 index 00000000..68258494 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_util.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_util.cpython-311.pyc new file mode 100644 index 00000000..92a4775e Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/_util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_version.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_version.cpython-311.pyc new file mode 100644 index 00000000..4d6d3bda Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/_version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc new file mode 100644 index 00000000..49fdd7b9 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/_binary.py b/.venv/Lib/site-packages/PIL/_binary.py new file mode 100644 index 00000000..a74ee9eb --- /dev/null +++ b/.venv/Lib/site-packages/PIL/_binary.py @@ -0,0 +1,102 @@ +# +# 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 struct import pack, unpack_from + + +def i8(c): + return c if c.__class__ is int else c[0] + + +def o8(i): + return bytes((i & 255,)) + + +# Input, le = little endian, be = big endian +def i16le(c, o=0): + """ + 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("h", c, o)[0] + + +def i32le(c, o=0): + """ + 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("H", c, o)[0] + + +def i32be(c, o=0): + return unpack_from(">I", c, o)[0] + + +# Output, le = little endian, be = big endian +def o16le(i): + return pack("H", i) + + +def o32be(i): + return pack(">I", i) diff --git a/.venv/Lib/site-packages/PIL/_deprecate.py b/.venv/Lib/site-packages/PIL/_deprecate.py new file mode 100644 index 00000000..81f2189d --- /dev/null +++ b/.venv/Lib/site-packages/PIL/_deprecate.py @@ -0,0 +1,71 @@ +from __future__ import annotations + +import warnings + +from . import __version__ + + +def deprecate( + deprecated: str, + when: int | None, + replacement: str | None = None, + *, + action: str | None = None, + plural: bool = False, +) -> None: + """ + Deprecations helper. + + :param deprecated: Name of thing to be deprecated. + :param when: Pillow major version to be removed in. + :param replacement: Name of replacement. + :param action: Instead of "replacement", give a custom call to action + e.g. "Upgrade to new thing". + :param plural: if the deprecated thing is plural, needing "are" instead of "is". + + Usually of the form: + + "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). + Use [replacement] instead." + + You can leave out the replacement sentence: + + "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)" + + Or with another call to action: + + "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). + [action]." + """ + + is_ = "are" if plural else "is" + + if when is None: + removed = "a future version" + elif when <= int(__version__.split(".")[0]): + msg = f"{deprecated} {is_} deprecated and should be removed." + raise RuntimeError(msg) + elif when == 10: + removed = "Pillow 10 (2023-07-01)" + elif when == 11: + removed = "Pillow 11 (2024-10-15)" + else: + msg = f"Unknown removal version: {when}. Update {__name__}?" + raise ValueError(msg) + + if replacement and action: + msg = "Use only one of 'replacement' and 'action'" + raise ValueError(msg) + + if replacement: + action = f". Use {replacement} instead." + elif action: + action = f". {action.rstrip('.')}." + else: + action = "" + + warnings.warn( + f"{deprecated} {is_} deprecated and will be removed in {removed}{action}", + DeprecationWarning, + stacklevel=3, + ) diff --git a/.venv/Lib/site-packages/PIL/_imaging.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imaging.cp311-win_amd64.pyd new file mode 100644 index 00000000..bda57bc4 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/_imaging.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/PIL/_imagingcms.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingcms.cp311-win_amd64.pyd new file mode 100644 index 00000000..a0cab418 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/_imagingcms.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/PIL/_imagingft.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingft.cp311-win_amd64.pyd new file mode 100644 index 00000000..91019c0e Binary files /dev/null and b/.venv/Lib/site-packages/PIL/_imagingft.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/PIL/_imagingmath.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingmath.cp311-win_amd64.pyd new file mode 100644 index 00000000..9b63382a Binary files /dev/null and b/.venv/Lib/site-packages/PIL/_imagingmath.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/PIL/_imagingmorph.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingmorph.cp311-win_amd64.pyd new file mode 100644 index 00000000..02efa485 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/_imagingmorph.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/PIL/_imagingtk.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingtk.cp311-win_amd64.pyd new file mode 100644 index 00000000..4c46092e Binary files /dev/null and b/.venv/Lib/site-packages/PIL/_imagingtk.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/PIL/_tkinter_finder.py b/.venv/Lib/site-packages/PIL/_tkinter_finder.py new file mode 100644 index 00000000..5cd7e9b1 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/_tkinter_finder.py @@ -0,0 +1,23 @@ +""" Find compiled module linking to Tcl / Tk libraries +""" +import sys +import tkinter +from tkinter import _tkinter as tk + +from ._deprecate import deprecate + +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) +if tk_version == "8.4": + deprecate( + "Support for Tk/Tcl 8.4", 10, action="Please upgrade to Tk/Tcl 8.5 or newer" + ) diff --git a/.venv/Lib/site-packages/PIL/_util.py b/.venv/Lib/site-packages/PIL/_util.py new file mode 100644 index 00000000..ba27b7e4 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/_util.py @@ -0,0 +1,19 @@ +import os +from pathlib import Path + + +def is_path(f): + return isinstance(f, (bytes, str, Path)) + + +def is_directory(f): + """Checks if an object is a string, and that it points to a directory.""" + return is_path(f) and os.path.isdir(f) + + +class DeferredError: + def __init__(self, ex): + self.ex = ex + + def __getattr__(self, elt): + raise self.ex diff --git a/.venv/Lib/site-packages/PIL/_version.py b/.venv/Lib/site-packages/PIL/_version.py new file mode 100644 index 00000000..d94d3593 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/_version.py @@ -0,0 +1,2 @@ +# Master version for Pillow +__version__ = "9.5.0" diff --git a/.venv/Lib/site-packages/PIL/_webp.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_webp.cp311-win_amd64.pyd new file mode 100644 index 00000000..7a6bd043 Binary files /dev/null and b/.venv/Lib/site-packages/PIL/_webp.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/PIL/features.py b/.venv/Lib/site-packages/PIL/features.py new file mode 100644 index 00000000..80a16a75 --- /dev/null +++ b/.venv/Lib/site-packages/PIL/features.py @@ -0,0 +1,329 @@ +import collections +import os +import sys +import warnings + +import PIL + +from . import Image + +modules = { + "pil": ("PIL._imaging", "PILLOW_VERSION"), + "tkinter": ("PIL._tkinter_finder", "tk_version"), + "freetype2": ("PIL._imagingft", "freetype2_version"), + "littlecms2": ("PIL._imagingcms", "littlecms_version"), + "webp": ("PIL._webp", "webpdecoder_version"), +} + + +def check_module(feature): + """ + Checks if a module is available. + + :param feature: The module to check for. + :returns: ``True`` if available, ``False`` otherwise. + :raises ValueError: If the module is not defined in this version of Pillow. + """ + if not (feature in modules): + msg = f"Unknown module {feature}" + raise ValueError(msg) + + module, ver = modules[feature] + + try: + __import__(module) + return True + except ModuleNotFoundError: + return False + except ImportError as ex: + warnings.warn(str(ex)) + return False + + +def version_module(feature): + """ + :param feature: The module to check for. + :returns: + The loaded version number as a string, or ``None`` if unknown or not available. + :raises ValueError: If the module is not defined in this version of Pillow. + """ + if not check_module(feature): + return None + + module, ver = modules[feature] + + if ver is None: + return None + + return getattr(__import__(module, fromlist=[ver]), ver) + + +def get_supported_modules(): + """ + :returns: A list of all supported modules. + """ + return [f for f in modules if check_module(f)] + + +codecs = { + "jpg": ("jpeg", "jpeglib"), + "jpg_2000": ("jpeg2k", "jp2klib"), + "zlib": ("zip", "zlib"), + "libtiff": ("libtiff", "libtiff"), +} + + +def check_codec(feature): + """ + Checks if a codec is available. + + :param feature: The codec to check for. + :returns: ``True`` if available, ``False`` otherwise. + :raises ValueError: If the codec is not defined in this version of Pillow. + """ + if feature not in codecs: + msg = f"Unknown codec {feature}" + raise ValueError(msg) + + codec, lib = codecs[feature] + + return codec + "_encoder" in dir(Image.core) + + +def version_codec(feature): + """ + :param feature: The codec to check for. + :returns: + The version number as a string, or ``None`` if not available. + Checked at compile time for ``jpg``, run-time otherwise. + :raises ValueError: If the codec is not defined in this version of Pillow. + """ + if not check_codec(feature): + return None + + codec, lib = codecs[feature] + + version = getattr(Image.core, lib + "_version") + + if feature == "libtiff": + return version.split("\n")[0].split("Version ")[1] + + return version + + +def get_supported_codecs(): + """ + :returns: A list of all supported codecs. + """ + return [f for f in codecs if check_codec(f)] + + +features = { + "webp_anim": ("PIL._webp", "HAVE_WEBPANIM", None), + "webp_mux": ("PIL._webp", "HAVE_WEBPMUX", None), + "transp_webp": ("PIL._webp", "HAVE_TRANSPARENCY", None), + "raqm": ("PIL._imagingft", "HAVE_RAQM", "raqm_version"), + "fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"), + "harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"), + "libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO", "libjpeg_turbo_version"), + "libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT", "imagequant_version"), + "xcb": ("PIL._imaging", "HAVE_XCB", None), +} + + +def check_feature(feature): + """ + Checks if a feature is available. + + :param feature: The feature to check for. + :returns: ``True`` if available, ``False`` if unavailable, ``None`` if unknown. + :raises ValueError: If the feature is not defined in this version of Pillow. + """ + if feature not in features: + msg = f"Unknown feature {feature}" + raise ValueError(msg) + + module, flag, ver = features[feature] + + try: + imported_module = __import__(module, fromlist=["PIL"]) + return getattr(imported_module, flag) + except ModuleNotFoundError: + return None + except ImportError as ex: + warnings.warn(str(ex)) + return None + + +def version_feature(feature): + """ + :param feature: The feature to check for. + :returns: The version number as a string, or ``None`` if not available. + :raises ValueError: If the feature is not defined in this version of Pillow. + """ + if not check_feature(feature): + return None + + module, flag, ver = features[feature] + + if ver is None: + return None + + return getattr(__import__(module, fromlist=[ver]), ver) + + +def get_supported_features(): + """ + :returns: A list of all supported features. + """ + return [f for f in features if check_feature(f)] + + +def check(feature): + """ + :param feature: A module, codec, or feature name. + :returns: + ``True`` if the module, codec, or feature is available, + ``False`` or ``None`` otherwise. + """ + + if feature in modules: + return check_module(feature) + if feature in codecs: + return check_codec(feature) + if feature in features: + return check_feature(feature) + warnings.warn(f"Unknown feature '{feature}'.", stacklevel=2) + return False + + +def version(feature): + """ + :param feature: + The module, codec, or feature to check for. + :returns: + The version number as a string, or ``None`` if unknown or not available. + """ + if feature in modules: + return version_module(feature) + if feature in codecs: + return version_codec(feature) + if feature in features: + return version_feature(feature) + return None + + +def get_supported(): + """ + :returns: A list of all supported modules, features, and codecs. + """ + + ret = get_supported_modules() + ret.extend(get_supported_features()) + ret.extend(get_supported_codecs()) + return ret + + +def pilinfo(out=None, supported_formats=True): + """ + Prints information about this installation of Pillow. + This function can be called with ``python3 -m PIL``. + + :param out: + The output stream to print to. Defaults to ``sys.stdout`` if ``None``. + :param supported_formats: + If ``True``, a list of all supported image file formats will be printed. + """ + + if out is None: + out = sys.stdout + + Image.init() + + print("-" * 68, file=out) + print(f"Pillow {PIL.__version__}", file=out) + py_version = sys.version.splitlines() + print(f"Python {py_version[0].strip()}", file=out) + for py_version in py_version[1:]: + print(f" {py_version.strip()}", file=out) + print("-" * 68, file=out) + print( + f"Python modules loaded from {os.path.dirname(Image.__file__)}", + file=out, + ) + print( + f"Binary modules loaded from {os.path.dirname(Image.core.__file__)}", + file=out, + ) + print("-" * 68, file=out) + + for name, feature in [ + ("pil", "PIL CORE"), + ("tkinter", "TKINTER"), + ("freetype2", "FREETYPE2"), + ("littlecms2", "LITTLECMS2"), + ("webp", "WEBP"), + ("transp_webp", "WEBP Transparency"), + ("webp_mux", "WEBPMUX"), + ("webp_anim", "WEBP Animation"), + ("jpg", "JPEG"), + ("jpg_2000", "OPENJPEG (JPEG2000)"), + ("zlib", "ZLIB (PNG/ZIP)"), + ("libtiff", "LIBTIFF"), + ("raqm", "RAQM (Bidirectional Text)"), + ("libimagequant", "LIBIMAGEQUANT (Quantization method)"), + ("xcb", "XCB (X protocol)"), + ]: + if check(name): + if name == "jpg" and check_feature("libjpeg_turbo"): + v = "libjpeg-turbo " + version_feature("libjpeg_turbo") + else: + v = version(name) + if v is not None: + version_static = name in ("pil", "jpg") + if name == "littlecms2": + # this check is also in src/_imagingcms.c:setup_module() + version_static = tuple(int(x) for x in v.split(".")) < (2, 7) + t = "compiled for" if version_static else "loaded" + if name == "raqm": + for f in ("fribidi", "harfbuzz"): + v2 = version_feature(f) + if v2 is not None: + v += f", {f} {v2}" + print("---", feature, "support ok,", t, v, file=out) + else: + print("---", feature, "support ok", file=out) + else: + print("***", feature, "support not installed", file=out) + print("-" * 68, file=out) + + if supported_formats: + extensions = collections.defaultdict(list) + for ext, i in Image.EXTENSION.items(): + extensions[i].append(ext) + + for i in sorted(Image.ID): + line = f"{i}" + if i in Image.MIME: + line = f"{line} {Image.MIME[i]}" + print(line, file=out) + + if i in extensions: + print( + "Extensions: {}".format(", ".join(sorted(extensions[i]))), file=out + ) + + features = [] + if i in Image.OPEN: + features.append("open") + if i in Image.SAVE: + features.append("save") + if i in Image.SAVE_ALL: + features.append("save_all") + if i in Image.DECODERS: + features.append("decode") + if i in Image.ENCODERS: + features.append("encode") + + print("Features: {}".format(", ".join(features)), file=out) + print("-" * 68, file=out) diff --git a/.venv/Lib/site-packages/pip-22.3.dist-info/INSTALLER b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/INSTALLER similarity index 100% rename from .venv/Lib/site-packages/pip-22.3.dist-info/INSTALLER rename to .venv/Lib/site-packages/Pillow-9.5.0.dist-info/INSTALLER diff --git a/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/LICENSE b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/LICENSE new file mode 100644 index 00000000..f58781bf --- /dev/null +++ b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/LICENSE @@ -0,0 +1,1215 @@ +The Python Imaging Library (PIL) is + + Copyright © 1997-2011 by Secret Labs AB + Copyright © 1995-2011 by Fredrik Lundh + +Pillow is the friendly PIL fork. It is + + Copyright © 2010-2023 by Jeffrey A. Clark (Alex) and contributors. + +Like PIL, Pillow is licensed under the open source HPND License: + +By obtaining, using, and/or copying this software and/or its associated +documentation, you agree that you have read, understood, and will comply +with the following terms and conditions: + +Permission to use, copy, modify and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appears in all copies, and that +both that copyright notice and this permission notice appear in supporting +documentation, and that the name of Secret Labs AB or the author not be +used in advertising or publicity pertaining to distribution of the software +without specific, written prior permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +===== brotli-1.0.9 ===== + +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +===== freetype-2.13.0 ===== + +FREETYPE LICENSES +----------------- + +The FreeType 2 font engine is copyrighted work and cannot be used +legally without a software license. In order to make this project +usable to a vast majority of developers, we distribute it under two +mutually exclusive open-source licenses. + +This means that *you* must choose *one* of the two licenses described +below, then obey all its terms and conditions when using FreeType 2 in +any of your projects or products. + + - The FreeType License, found in the file `docs/FTL.TXT`, which is + similar to the original BSD license *with* an advertising clause + that forces you to explicitly cite the FreeType project in your + product's documentation. All details are in the license file. + This license is suited to products which don't use the GNU General + Public License. + + Note that this license is compatible to the GNU General Public + License version 3, but not version 2. + + - The GNU General Public License version 2, found in + `docs/GPLv2.TXT` (any later version can be used also), for + programs which already use the GPL. Note that the FTL is + incompatible with GPLv2 due to its advertisement clause. + +The contributed BDF and PCF drivers come with a license similar to +that of the X Window System. It is compatible to the above two +licenses (see files `src/bdf/README` and `src/pcf/README`). The same +holds for the source code files `src/base/fthash.c` and +`include/freetype/internal/fthash.h`; they were part of the BDF driver +in earlier FreeType versions. + +The gzip module uses the zlib license (see `src/gzip/zlib.h`) which +too is compatible to the above two licenses. + +The files `src/autofit/ft-hb.c` and `src/autofit/ft-hb.h` contain code +taken almost verbatim from the HarfBuzz file `hb-ft.cc`, which uses +the 'Old MIT' license, compatible to the above two licenses. + +The MD5 checksum support (only used for debugging in development +builds) is in the public domain. + + +--- end of LICENSE.TXT --- + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + https://www.freetype.org + + +--- end of FTL.TXT --- + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +===== harfbuzz-7.1.0 ===== + +HarfBuzz is licensed under the so-called "Old MIT" license. Details follow. +For parts of HarfBuzz that are licensed under different licenses see individual +files names COPYING in subdirectories where applicable. + +Copyright © 2010-2022 Google, Inc. +Copyright © 2015-2020 Ebrahim Byagowi +Copyright © 2019,2020 Facebook, Inc. +Copyright © 2012,2015 Mozilla Foundation +Copyright © 2011 Codethink Limited +Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies) +Copyright © 2009 Keith Stribley +Copyright © 2011 Martin Hosken and SIL International +Copyright © 2007 Chris Wilson +Copyright © 2005,2006,2020,2021,2022,2023 Behdad Esfahbod +Copyright © 2004,2007,2008,2009,2010,2013,2021,2022,2023 Red Hat, Inc. +Copyright © 1998-2005 David Turner and Werner Lemberg +Copyright © 2016 Igalia S.L. +Copyright © 2022 Matthias Clasen +Copyright © 2018,2021 Khaled Hosny +Copyright © 2018,2019,2020 Adobe, Inc +Copyright © 2013-2015 Alexei Podtelezhnikov + +For full copyright notices consult the individual files in the package. + + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +===== lcms2-2.15 ===== + +Little CMS +Copyright (c) 1998-2020 Marti Maria Saguer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject +to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +===== libjpeg-turbo-2.1.5.1 ===== + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + +libjpeg-turbo Licenses +====================== + +libjpeg-turbo is covered by three compatible BSD-style open source licenses: + +- The IJG (Independent JPEG Group) License, which is listed in + [README.ijg](README.ijg) + + This license applies to the libjpeg API library and associated programs + (any code inherited from libjpeg, and any modifications to that code.) + +- The Modified (3-clause) BSD License, which is listed below + + This license covers the TurboJPEG API library and associated programs, as + well as the build system. + +- The [zlib License](https://opensource.org/licenses/Zlib) + + This license is a subset of the other two, and it covers the libjpeg-turbo + SIMD extensions. + + +Complying with the libjpeg-turbo Licenses +========================================= + +This section provides a roll-up of the libjpeg-turbo licensing terms, to the +best of our understanding. + +1. If you are distributing a modified version of the libjpeg-turbo source, + then: + + 1. You cannot alter or remove any existing copyright or license notices + from the source. + + **Origin** + - Clause 1 of the IJG License + - Clause 1 of the Modified BSD License + - Clauses 1 and 3 of the zlib License + + 2. You must add your own copyright notice to the header of each source + file you modified, so others can tell that you modified that file (if + there is not an existing copyright header in that file, then you can + simply add a notice stating that you modified the file.) + + **Origin** + - Clause 1 of the IJG License + - Clause 2 of the zlib License + + 3. You must include the IJG README file, and you must not alter any of the + copyright or license text in that file. + + **Origin** + - Clause 1 of the IJG License + +2. If you are distributing only libjpeg-turbo binaries without the source, or + if you are distributing an application that statically links with + libjpeg-turbo, then: + + 1. Your product documentation must include a message stating: + + This software is based in part on the work of the Independent JPEG + Group. + + **Origin** + - Clause 2 of the IJG license + + 2. If your binary distribution includes or uses the TurboJPEG API, then + your product documentation must include the text of the Modified BSD + License (see below.) + + **Origin** + - Clause 2 of the Modified BSD License + +3. You cannot use the name of the IJG or The libjpeg-turbo Project or the + contributors thereof in advertising, publicity, etc. + + **Origin** + - IJG License + - Clause 3 of the Modified BSD License + +4. The IJG and The libjpeg-turbo Project do not warrant libjpeg-turbo to be + free of defects, nor do we accept any liability for undesirable + consequences resulting from your use of the software. + + **Origin** + - IJG License + - Modified BSD License + - zlib License + + +The Modified (3-clause) BSD License +=================================== + +Copyright (C)2009-2023 D. R. Commander. All Rights Reserved.
+Copyright (C)2015 Viktor Szathmáry. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the libjpeg-turbo Project nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +Why Three Licenses? +=================== + +The zlib License could have been used instead of the Modified (3-clause) BSD +License, and since the IJG License effectively subsumes the distribution +conditions of the zlib License, this would have effectively placed +libjpeg-turbo binary distributions under the IJG License. However, the IJG +License specifically refers to the Independent JPEG Group and does not extend +attribution and endorsement protections to other entities. Thus, it was +desirable to choose a license that granted us the same protections for new code +that were granted to the IJG for code derived from their software. + +===== libwebp-1.3.0 ===== + +Copyright (c) 2010, Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +===== lpng1639 ===== + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE +========================================= + +PNG Reference Library License version 2 +--------------------------------------- + + * Copyright (c) 1995-2022 The PNG Reference Library Authors. + * Copyright (c) 2018-2022 Cosmin Truta. + * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + * Copyright (c) 1996-1997 Andreas Dilger. + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +The software is supplied "as is", without warranty of any kind, +express or implied, including, without limitation, the warranties +of merchantability, fitness for a particular purpose, title, and +non-infringement. In no event shall the Copyright owners, or +anyone distributing the software, be liable for any damages or +other liability, whether in contract, tort or otherwise, arising +from, out of, or in connection with the software, or the use or +other dealings in the software, even if advised of the possibility +of such damage. + +Permission is hereby granted to use, copy, modify, and distribute +this software, or portions hereof, for any purpose, without fee, +subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you + use this software in a product, an acknowledgment in the product + documentation would be appreciated, but is not required. + + 2. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + + +PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) +----------------------------------------------------------------------- + +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are +Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: + + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + Mandar Sahastrabuddhe + Google Inc. + Vadim Barkov + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of + the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is + with the user. + +Some files in the "contrib" directory and some configure-generated +files that are distributed with libpng have other copyright owners, and +are released under other open source licenses. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the +list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +Some files in the "scripts" directory have other copyright owners, +but are released under this license. + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing +Authors and Group 42, Inc. disclaim all warranties, expressed or +implied, including, without limitation, the warranties of +merchantability and of fitness for any purpose. The Contributing +Authors and Group 42, Inc. assume no liability for direct, indirect, +incidental, special, exemplary, or consequential damages, which may +result from the use of the PNG Reference Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + + 1. The origin of this source code must not be misrepresented. + + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, +without fee, and encourage the use of this source code as a component +to supporting the PNG file format in commercial products. If you use +this source code in a product, acknowledgment is not required but would +be appreciated. + +===== openjpeg-2.5.0 ===== + +/* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +===== tiff-4.5.0 ===== + +# LibTIFF license + +Copyright © 1988-1997 Sam Leffler\ +Copyright © 1991-1997 Silicon Graphics, Inc. + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, provided +that (i) the above copyright notices and this permission notice appear in +all copies of the software and related documentation, and (ii) the names of +Sam Leffler and Silicon Graphics may not be used in any advertising or +publicity relating to the software without the specific, prior written +permission of Sam Leffler and Silicon Graphics. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. + +===== xz-5.4.2 ===== + + +XZ Utils Licensing +================== + + Different licenses apply to different files in this package. Here + is a rough summary of which licenses apply to which parts of this + package (but check the individual files to be sure!): + + - liblzma is in the public domain. + + - xz, xzdec, and lzmadec command line tools are in the public + domain unless GNU getopt_long had to be compiled and linked + in from the lib directory. The getopt_long code is under + GNU LGPLv2.1+. + + - The scripts to grep, diff, and view compressed files have been + adapted from gzip. These scripts and their documentation are + under GNU GPLv2+. + + - All the documentation in the doc directory and most of the + XZ Utils specific documentation files in other directories + are in the public domain. + + Note: The JavaScript files (under the MIT license) have + been removed from the Doxygen-generated HTML version of the + liblzma API documentation. Doxygen itself is under the GNU GPL + but the remaining files generated by Doxygen are not affected + by the licenses used in Doxygen because Doxygen licensing has + the following exception: + + "Documents produced by doxygen are derivative works + derived from the input used in their production; + they are not affected by this license." + + - Translated messages are in the public domain. + + - The build system contains public domain files, and files that + are under GNU GPLv2+ or GNU GPLv3+. None of these files end up + in the binaries being built. + + - Test files and test code in the tests directory, and debugging + utilities in the debug directory are in the public domain. + + - The extra directory may contain public domain files, and files + that are under various free software licenses. + + You can do whatever you want with the files that have been put into + the public domain. If you find public domain legally problematic, + take the previous sentence as a license grant. If you still find + the lack of copyright legally problematic, you have too many + lawyers. + + As usual, this software is provided "as is", without any warranty. + + If you copy significant amounts of public domain code from XZ Utils + into your project, acknowledging this somewhere in your software is + polite (especially if it is proprietary, non-free software), but + naturally it is not legally required. Here is an example of a good + notice to put into "about box" or into documentation: + + This software includes code from XZ Utils . + + The following license texts are included in the following files: + - COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1 + - COPYING.GPLv2: GNU General Public License version 2 + - COPYING.GPLv3: GNU General Public License version 3 + + Note that the toolchain (compiler, linker etc.) may add some code + pieces that are copyrighted. Thus, it is possible that e.g. liblzma + binary wouldn't actually be in the public domain in its entirety + even though it contains no copyrighted code from the XZ Utils source + package. + + If you have questions, don't hesitate to ask the author(s) for more + information. + + +===== zlib-1.2.13 ===== + + (C) 1995-2022 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. We make all +contributions to and distributions of this project solely in our personal +capacity, and are not conveying any rights to any intellectual property of +any third parties. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/METADATA b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/METADATA new file mode 100644 index 00000000..34a4d04f --- /dev/null +++ b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/METADATA @@ -0,0 +1,176 @@ +Metadata-Version: 2.1 +Name: Pillow +Version: 9.5.0 +Summary: Python Imaging Library (Fork) +Home-page: https://python-pillow.org +Author: Jeffrey A. Clark (Alex) +Author-email: aclark@aclark.net +License: HPND +Project-URL: Documentation, https://pillow.readthedocs.io +Project-URL: Source, https://github.com/python-pillow/Pillow +Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=pypi +Project-URL: Release notes, https://pillow.readthedocs.io/en/stable/releasenotes/index.html +Project-URL: Changelog, https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst +Project-URL: Twitter, https://twitter.com/PythonPillow +Project-URL: Mastodon, https://fosstodon.org/@pillow +Keywords: Imaging +Classifier: Development Status :: 6 - Mature +Classifier: License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND) +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Multimedia :: Graphics +Classifier: Topic :: Multimedia :: Graphics :: Capture :: Digital Camera +Classifier: Topic :: Multimedia :: Graphics :: Capture :: Screen Capture +Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion +Classifier: Topic :: Multimedia :: Graphics :: Viewers +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: docs +Requires-Dist: furo ; extra == 'docs' +Requires-Dist: olefile ; extra == 'docs' +Requires-Dist: sphinx (>=2.4) ; extra == 'docs' +Requires-Dist: sphinx-copybutton ; extra == 'docs' +Requires-Dist: sphinx-inline-tabs ; extra == 'docs' +Requires-Dist: sphinx-removed-in ; extra == 'docs' +Requires-Dist: sphinxext-opengraph ; extra == 'docs' +Provides-Extra: tests +Requires-Dist: check-manifest ; extra == 'tests' +Requires-Dist: coverage ; extra == 'tests' +Requires-Dist: defusedxml ; extra == 'tests' +Requires-Dist: markdown2 ; extra == 'tests' +Requires-Dist: olefile ; extra == 'tests' +Requires-Dist: packaging ; extra == 'tests' +Requires-Dist: pyroma ; extra == 'tests' +Requires-Dist: pytest ; extra == 'tests' +Requires-Dist: pytest-cov ; extra == 'tests' +Requires-Dist: pytest-timeout ; extra == 'tests' + +

+ Pillow logo +

+ +# Pillow + +## Python Imaging Library (Fork) + +Pillow is the friendly PIL fork by [Jeffrey A. Clark (Alex) and +contributors](https://github.com/python-pillow/Pillow/graphs/contributors). +PIL is the Python Imaging Library by Fredrik Lundh and Contributors. +As of 2019, Pillow development is +[supported by Tidelift](https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=readme&utm_campaign=enterprise). + + + + + + + + + + + + + + + + + + +
docs + Documentation Status +
tests + GitHub Actions build status (Lint) + GitHub Actions build status (Test Linux and macOS) + GitHub Actions build status (Test Windows) + GitHub Actions build status (Test MinGW) + GitHub Actions build status (Test Cygwin) + GitHub Actions build status (Test Docker) + AppVeyor CI build status (Windows) + GitHub Actions wheels build status (Wheels) + Travis CI wheels build status (aarch64) + Code coverage + Fuzzing Status +
package + Zenodo + Tidelift + Newest PyPI version + Number of PyPI downloads + OpenSSF Best Practices +
social + Join the chat at https://gitter.im/python-pillow/Pillow + Follow on https://twitter.com/PythonPillow + Follow on https://fosstodon.org/@pillow +
+ +## Overview + +The Python Imaging Library adds image processing capabilities to your Python interpreter. + +This library provides extensive file format support, an efficient internal representation, and fairly powerful image processing capabilities. + +The core image library is designed for fast access to data stored in a few basic pixel formats. It should provide a solid foundation for a general image processing tool. + +## More Information + +- [Documentation](https://pillow.readthedocs.io/) + - [Installation](https://pillow.readthedocs.io/en/latest/installation.html) + - [Handbook](https://pillow.readthedocs.io/en/latest/handbook/index.html) +- [Contribute](https://github.com/python-pillow/Pillow/blob/main/.github/CONTRIBUTING.md) + - [Issues](https://github.com/python-pillow/Pillow/issues) + - [Pull requests](https://github.com/python-pillow/Pillow/pulls) +- [Release notes](https://pillow.readthedocs.io/en/stable/releasenotes/index.html) +- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) + - [Pre-fork](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst#pre-fork) + +## Report a Vulnerability + +To report a security vulnerability, please follow the procedure described in the [Tidelift security policy](https://tidelift.com/docs/security). diff --git a/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/RECORD b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/RECORD new file mode 100644 index 00000000..1ffaed63 --- /dev/null +++ b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/RECORD @@ -0,0 +1,205 @@ +PIL/BdfFontFile.py,sha256=7tb9V0PYmpXMySmPPMiScnkMPoFvMAd1Oez8houmWUM,3359 +PIL/BlpImagePlugin.py,sha256=-nNUlAswu3S33X5-rkJXTWFQARz1r1oZeuZq3OeZVn8,16483 +PIL/BmpImagePlugin.py,sha256=XOHw5_ZerT7vpH3djZvARU6ARiOUOWwVgp-6vpfua48,18138 +PIL/BufrStubImagePlugin.py,sha256=Pc-ukDILRS2Knqtogyumr74CwI1-f5w9GChmkEgXiD0,1629 +PIL/ContainerIO.py,sha256=NmRN9naqGy3KuR9nup6o1ihJRStbBHk-vyNpJb6oQF8,3003 +PIL/CurImagePlugin.py,sha256=4DOiIo2AhLI95foB8E0DWhnomyEwWwEtSAP5wgWxyHM,1796 +PIL/DcxImagePlugin.py,sha256=RwMLnvYc_CsQVgRYABQr7afzRyuGL0RfyH5PFo0dMC0,2037 +PIL/DdsImagePlugin.py,sha256=fuih_I4DEoGtwbJ1FezlFgmGJg3yzJSF3PAvnn-Jisk,9637 +PIL/EpsImagePlugin.py,sha256=P5nvS5R1HrHCOEHRwKyXbGkP21xvW7h_Ue2lQeFjy_8,15413 +PIL/ExifTags.py,sha256=6HINw53r9dPBMb9d7B43zZ-gNtrMRqoRk3LthY_FDpo,10098 +PIL/FitsImagePlugin.py,sha256=fBOm3G8ldckUuMw0qrYBwFHdtrytQ0nYutWEVD4KlhI,2132 +PIL/FitsStubImagePlugin.py,sha256=iG1ma5iu38bIdqyqfWzCAAY4dyBilmZbj4bXtgQ0OJ8,1749 +PIL/FliImagePlugin.py,sha256=S1Ein3U7MEE6MyM-V2opkCG5MQRQzAFYPckP9mLC40s,4614 +PIL/FontFile.py,sha256=btTE3c7rQJXwM9Ndz3_IV9Q-h2sM2Bj3t_4UuoQld34,2874 +PIL/FpxImagePlugin.py,sha256=j4wEE1BGKTDiR15Ww_yoHRqhQ6zZ3v0zzlFkNW_HSkk,7214 +PIL/FtexImagePlugin.py,sha256=BK5WxU9t_CY7Gj_FYSWncm1hEUlu169OoQiul_rsog0,3980 +PIL/GbrImagePlugin.py,sha256=6xofx5s2ghUqtbYLjpERIZR_73RGC78xbTL0UcX7ggU,3010 +PIL/GdImageFile.py,sha256=aPaS1uHNdlsLrdCMw58I3iB_Su8fR9ZHQ1HiLfWFW1E,2704 +PIL/GifImagePlugin.py,sha256=vINF0Y9qGxREdUCetlhTVUF_rNurTwJg8MpyEDAuN58,36797 +PIL/GimpGradientFile.py,sha256=gmeJv2hu0EegYmkoN7ULuf0HPtj6PPqV1F-sPUsruco,3533 +PIL/GimpPaletteFile.py,sha256=IfG8kYjL76X3sK7Sxr9DFz7FrSaSrebWYNid8bdBIaQ,1401 +PIL/GribStubImagePlugin.py,sha256=txA0r1XgUhIjXnTOqxC8DbhvzpdN1IZsGw8IfJVO9gs,1623 +PIL/Hdf5StubImagePlugin.py,sha256=MIxZmNNV9plZcKgNapzrIUnG5ob_tKjCOBT8Z3N50FU,1626 +PIL/IcnsImagePlugin.py,sha256=9FOF3-_t30DR3A-JcSPiPq3kLLrbQUPNQ0gJ5vu5Adw,12329 +PIL/IcoImagePlugin.py,sha256=nGeXfmEDX8VxXNVVNzZ4fzpaBWv9it2jMLo81bqzD50,11980 +PIL/ImImagePlugin.py,sha256=0AieXMOlie5qH5psVJOHYlbzDlgED1wFqYubSGLbX6w,11238 +PIL/Image.py,sha256=LXwA6imgpFEWkWovkijlxDtofR7cnGDgRDkpz3uIOEA,137510 +PIL/ImageChops.py,sha256=xfHglbl9ENPlsehI9tBeiod1lVUy_5AKN949WL2uRlM,7306 +PIL/ImageCms.py,sha256=boeqsW0-3vG6NOUrDx54blotUpsVQOxY27Js5Ms3zFg,38772 +PIL/ImageColor.py,sha256=TJUOQu-ydwq_v9t6-hoIOCye2AnYiCduP8sz4uzrLu0,9097 +PIL/ImageDraw.py,sha256=_Txn89wfgLteL9MdM08ONZzmJBI8UsNyf6oqQvyDhrk,39813 +PIL/ImageDraw2.py,sha256=qvNpBIQlq_TP3dyLNTb8rjB-QtY1rWbXq9z0TAaVYZo,6210 +PIL/ImageEnhance.py,sha256=tHMwYy_knQ_tice_c5MzDShwkFVL5DyJ1EVm1KHiDDI,3293 +PIL/ImageFile.py,sha256=tieTgFwl9L15kiKyOE7syh0jjOARZe2wp1MAi-XJJdU,24312 +PIL/ImageFilter.py,sha256=2vR-Mkyfsa1CGqR6MYPxis1Wa_nPzxvkHz9HfGzpaQU,17019 +PIL/ImageFont.py,sha256=krZbfy55Q0X21z9DUEeEZuCpEsjfHkGWNDnuPctMV_0,51659 +PIL/ImageGrab.py,sha256=Cj4Ivg2BQg_ut7q5Mc8Z53AvKCgANM4QJ_c_8lmMgq0,4834 +PIL/ImageMath.py,sha256=oyM5Sjlu0cV7y2yc_G_axId3Dp4DaOKUTZ7frtNsweE,7620 +PIL/ImageMode.py,sha256=VAdsoGIHDNkQeg5FU92bf3ROHIA9KK2J7HQpgLWyyls,3004 +PIL/ImageMorph.py,sha256=JrTMGN0WyGjur-We0qmGl0Pb_S_F60s4ADPGvrmOH2c,8231 +PIL/ImageOps.py,sha256=xcGldbwrB5MZxAUGXFngGIa6oKkTs6dF8uh8uMTGs9U,21590 +PIL/ImagePalette.py,sha256=KdFQfozTSdonshM0DzCs6wFxjCkDlULe1Lta6QSrpic,8421 +PIL/ImagePath.py,sha256=IZ7vxarm_tI2DuV7QPchZe1P4U52ypHbO-v3JkcGm44,355 +PIL/ImageQt.py,sha256=r11fHtTzC9j0D_jL8Q0FM1odqNCWMk3APnye83qdfvw,7119 +PIL/ImageSequence.py,sha256=4Rn6Jx4fc2oNu3vKUCjMhCEBwBoaRfExmrJGpjrJmHI,1948 +PIL/ImageShow.py,sha256=4P0JaQgIN0vJKPQHw3cgBMH9iJ4EMDKQ0iOOAcMi_J8,11813 +PIL/ImageStat.py,sha256=Tr4x_f_wE6wM2l6RtSmPxWXjkbtD63HSrHAKeR1j9Ps,4072 +PIL/ImageTk.py,sha256=h6oVY8cQdQN-1qM8wGDCELGx4pJR_X2zqYa7aK0DxBo,8988 +PIL/ImageTransform.py,sha256=EsgO8FV2Gnm1hBMVx-8i7I3bhehRfMlwHIsV7QQ7FjM,2985 +PIL/ImageWin.py,sha256=qklIa-nlezkM_BUVRaIOgjSqRDWjQq8Qxe_r3sQy3Ro,7421 +PIL/ImtImagePlugin.py,sha256=NbxZVUDuWSFTKt2RMyPufE5niVtLDLnGb-xjWIyg4io,2680 +PIL/IptcImagePlugin.py,sha256=ryKOSjjK73lQfJoP5b52wdE4yNHwcH7eH_Be3j2LiYE,6007 +PIL/Jpeg2KImagePlugin.py,sha256=6pLs8Hslm2fFFXwV4YEviP-scd7JBSWUHmct-RZIP9Y,11982 +PIL/JpegImagePlugin.py,sha256=KmiY6xdRsAxo3ZfaXz3ksQ6Ol4Bn270rwi-jsnPwX-0,30012 +PIL/JpegPresets.py,sha256=7lEumxxIdQrdc4Eync4R8IItvu7WyP6KKY9vaR3RHfY,12583 +PIL/McIdasImagePlugin.py,sha256=x9p4xEMhso9z2H8wMlxg_pFJ4OxIEGnq_7tAgxe4-NE,1871 +PIL/MicImagePlugin.py,sha256=TiJbCd4YFelTSlZq3juzU8bzQRinEcDcUFCLfoT2rD0,2699 +PIL/MpegImagePlugin.py,sha256=hDlxjupy7q-55sGCJfTQCZU3QBcd72SA34Nmn3s4RDQ,1905 +PIL/MpoImagePlugin.py,sha256=uhDiuxP_j7teKZwTFkDh7eF93iofseoVhB8hDvQiCjE,6486 +PIL/MspImagePlugin.py,sha256=-7WU5orL01Z1hlYBx6Uou-87hl_1jOz8qUGQ8VTfmpA,5806 +PIL/PSDraw.py,sha256=rxUa015jdjOMgQFsIi8DPaHxCNaBN-l0FIWMB03Let0,6754 +PIL/PaletteFile.py,sha256=JuiaGSo0Kt7P_R2alJ4iALW93cTM_J7KLAdqgZwWyrQ,1179 +PIL/PalmImagePlugin.py,sha256=vVD0dymsz8RLhavbcua_x6z4VvpWyG_UqBfeZqno3EM,9369 +PIL/PcdImagePlugin.py,sha256=x6_E8hPLAPy70VxPg6SKUi2xDT8OhgiSIZx0pXdNDhw,1558 +PIL/PcfFontFile.py,sha256=sRkDm6QE_7iByrCJABM8BRu8D3xrxX-nudj0tZfFT6M,7013 +PIL/PcxImagePlugin.py,sha256=HTh7xqcQBpOo7GK_NEEDCeDbb0Cqge6mwA_vpWKWDk0,6242 +PIL/PdfImagePlugin.py,sha256=Q-vtat694jtAFQiuMi_5aCD8r_o_92XY2oHhj1sbZmo,9264 +PIL/PdfParser.py,sha256=mtgy10DcGk-1HLSbDzZY8OO-fsNniTVg5x-5kW2n5Po,35563 +PIL/PixarImagePlugin.py,sha256=uYA7SlJJuhsUtU99WlJJNXcRTdYh6sA7uNI0eWlfZMI,1720 +PIL/PngImagePlugin.py,sha256=MpDMMPMWblQyFKADexIuNFjP45cRmrADYi819gNNmpM,48199 +PIL/PpmImagePlugin.py,sha256=0df52CDB6dYk-RVO0pTd2uk1UvFd3USoBtO8azpa4HM,11746 +PIL/PsdImagePlugin.py,sha256=KXU50GsaUWpDP9G--zZVjFflM5sdt9CDKCL9yzEZnyk,7838 +PIL/PyAccess.py,sha256=JeLmYg6po04-ryoNQZRufMmv4wDtl1DV0AdNVFhUeXM,10189 +PIL/QoiImagePlugin.py,sha256=VvipOI8cyMtlgB_8Tk7OxevxO0AadmJSj1kFMiR_ZxM,3722 +PIL/SgiImagePlugin.py,sha256=aI17mrrJN6aT54UIGHvHJB0Kxg4IyRt5sSllBLvbceU,6409 +PIL/SpiderImagePlugin.py,sha256=MbtvXpMFpiQuuP6KX90n6l0AYfkE_tC1v6eBdT5nYDQ,9792 +PIL/SunImagePlugin.py,sha256=POGY2SGN-lFDSU6XqlsrShLEBNHgtI6ykn8_ml3sb5E,4537 +PIL/TarIO.py,sha256=7VMckCocQZ-tbUngzJcFovYSH8nq-p_dKt0NLYAdsR8,1557 +PIL/TgaImagePlugin.py,sha256=6nOa32pGp8llE7SzdYj82y7EiFVa4-ektCiDS1K3sjU,6830 +PIL/TiffImagePlugin.py,sha256=7kvaJeMS1jjRwtsUmEEBR7XGl8Zwh_850dNq1080qDo,79211 +PIL/TiffTags.py,sha256=7hsZaJPN097IFRzSHTCYjUa8GRcm3ty-lIcby80leHM,17374 +PIL/WalImageFile.py,sha256=Cgn656zZJZhISDbg4-J2JAOIb8-wISJsLgrrg6mmskQ,5642 +PIL/WebPImagePlugin.py,sha256=K32JaSOiIDYa7BpGlZQ5xBjlCx4vHM8ent52hKFX5MY,11732 +PIL/WmfImagePlugin.py,sha256=xBbiVDKcQJqgc-c95N9Q4I6AF_ZW2JKjqt6zKpaO1Q8,4867 +PIL/XVThumbImagePlugin.py,sha256=6HP8nFu5K-qE3uCx_nWhr2O4YGTmeYLLjkXmPk18rsg,2064 +PIL/XbmImagePlugin.py,sha256=Q8DWHtG9tE0KDeAYGJRvjBd_Ak1C96QTLGtzDz4nPC4,2581 +PIL/XpmImagePlugin.py,sha256=z0H6dU183TIOHbwzZfURc_N8oNipz6Nm-Q-s2Q_nQJM,3312 +PIL/__init__.py,sha256=SOGBVqgf0bqKUcjkfXxuIuJ47LNj4ufAsE7LFGP2dJA,2091 +PIL/__main__.py,sha256=hOw0dx7KqDFGy9lxphlkL6NmaCbj8lp294vXH4n35ko,44 +PIL/__pycache__/BdfFontFile.cpython-311.pyc,, +PIL/__pycache__/BlpImagePlugin.cpython-311.pyc,, +PIL/__pycache__/BmpImagePlugin.cpython-311.pyc,, +PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc,, +PIL/__pycache__/ContainerIO.cpython-311.pyc,, +PIL/__pycache__/CurImagePlugin.cpython-311.pyc,, +PIL/__pycache__/DcxImagePlugin.cpython-311.pyc,, +PIL/__pycache__/DdsImagePlugin.cpython-311.pyc,, +PIL/__pycache__/EpsImagePlugin.cpython-311.pyc,, +PIL/__pycache__/ExifTags.cpython-311.pyc,, +PIL/__pycache__/FitsImagePlugin.cpython-311.pyc,, +PIL/__pycache__/FitsStubImagePlugin.cpython-311.pyc,, +PIL/__pycache__/FliImagePlugin.cpython-311.pyc,, +PIL/__pycache__/FontFile.cpython-311.pyc,, +PIL/__pycache__/FpxImagePlugin.cpython-311.pyc,, +PIL/__pycache__/FtexImagePlugin.cpython-311.pyc,, +PIL/__pycache__/GbrImagePlugin.cpython-311.pyc,, +PIL/__pycache__/GdImageFile.cpython-311.pyc,, +PIL/__pycache__/GifImagePlugin.cpython-311.pyc,, +PIL/__pycache__/GimpGradientFile.cpython-311.pyc,, +PIL/__pycache__/GimpPaletteFile.cpython-311.pyc,, +PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc,, +PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc,, +PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc,, +PIL/__pycache__/IcoImagePlugin.cpython-311.pyc,, +PIL/__pycache__/ImImagePlugin.cpython-311.pyc,, +PIL/__pycache__/Image.cpython-311.pyc,, +PIL/__pycache__/ImageChops.cpython-311.pyc,, +PIL/__pycache__/ImageCms.cpython-311.pyc,, +PIL/__pycache__/ImageColor.cpython-311.pyc,, +PIL/__pycache__/ImageDraw.cpython-311.pyc,, +PIL/__pycache__/ImageDraw2.cpython-311.pyc,, +PIL/__pycache__/ImageEnhance.cpython-311.pyc,, +PIL/__pycache__/ImageFile.cpython-311.pyc,, +PIL/__pycache__/ImageFilter.cpython-311.pyc,, +PIL/__pycache__/ImageFont.cpython-311.pyc,, +PIL/__pycache__/ImageGrab.cpython-311.pyc,, +PIL/__pycache__/ImageMath.cpython-311.pyc,, +PIL/__pycache__/ImageMode.cpython-311.pyc,, +PIL/__pycache__/ImageMorph.cpython-311.pyc,, +PIL/__pycache__/ImageOps.cpython-311.pyc,, +PIL/__pycache__/ImagePalette.cpython-311.pyc,, +PIL/__pycache__/ImagePath.cpython-311.pyc,, +PIL/__pycache__/ImageQt.cpython-311.pyc,, +PIL/__pycache__/ImageSequence.cpython-311.pyc,, +PIL/__pycache__/ImageShow.cpython-311.pyc,, +PIL/__pycache__/ImageStat.cpython-311.pyc,, +PIL/__pycache__/ImageTk.cpython-311.pyc,, +PIL/__pycache__/ImageTransform.cpython-311.pyc,, +PIL/__pycache__/ImageWin.cpython-311.pyc,, +PIL/__pycache__/ImtImagePlugin.cpython-311.pyc,, +PIL/__pycache__/IptcImagePlugin.cpython-311.pyc,, +PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc,, +PIL/__pycache__/JpegImagePlugin.cpython-311.pyc,, +PIL/__pycache__/JpegPresets.cpython-311.pyc,, +PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc,, +PIL/__pycache__/MicImagePlugin.cpython-311.pyc,, +PIL/__pycache__/MpegImagePlugin.cpython-311.pyc,, +PIL/__pycache__/MpoImagePlugin.cpython-311.pyc,, +PIL/__pycache__/MspImagePlugin.cpython-311.pyc,, +PIL/__pycache__/PSDraw.cpython-311.pyc,, +PIL/__pycache__/PaletteFile.cpython-311.pyc,, +PIL/__pycache__/PalmImagePlugin.cpython-311.pyc,, +PIL/__pycache__/PcdImagePlugin.cpython-311.pyc,, +PIL/__pycache__/PcfFontFile.cpython-311.pyc,, +PIL/__pycache__/PcxImagePlugin.cpython-311.pyc,, +PIL/__pycache__/PdfImagePlugin.cpython-311.pyc,, +PIL/__pycache__/PdfParser.cpython-311.pyc,, +PIL/__pycache__/PixarImagePlugin.cpython-311.pyc,, +PIL/__pycache__/PngImagePlugin.cpython-311.pyc,, +PIL/__pycache__/PpmImagePlugin.cpython-311.pyc,, +PIL/__pycache__/PsdImagePlugin.cpython-311.pyc,, +PIL/__pycache__/PyAccess.cpython-311.pyc,, +PIL/__pycache__/QoiImagePlugin.cpython-311.pyc,, +PIL/__pycache__/SgiImagePlugin.cpython-311.pyc,, +PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc,, +PIL/__pycache__/SunImagePlugin.cpython-311.pyc,, +PIL/__pycache__/TarIO.cpython-311.pyc,, +PIL/__pycache__/TgaImagePlugin.cpython-311.pyc,, +PIL/__pycache__/TiffImagePlugin.cpython-311.pyc,, +PIL/__pycache__/TiffTags.cpython-311.pyc,, +PIL/__pycache__/WalImageFile.cpython-311.pyc,, +PIL/__pycache__/WebPImagePlugin.cpython-311.pyc,, +PIL/__pycache__/WmfImagePlugin.cpython-311.pyc,, +PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc,, +PIL/__pycache__/XbmImagePlugin.cpython-311.pyc,, +PIL/__pycache__/XpmImagePlugin.cpython-311.pyc,, +PIL/__pycache__/__init__.cpython-311.pyc,, +PIL/__pycache__/__main__.cpython-311.pyc,, +PIL/__pycache__/_binary.cpython-311.pyc,, +PIL/__pycache__/_deprecate.cpython-311.pyc,, +PIL/__pycache__/_tkinter_finder.cpython-311.pyc,, +PIL/__pycache__/_util.cpython-311.pyc,, +PIL/__pycache__/_version.cpython-311.pyc,, +PIL/__pycache__/features.cpython-311.pyc,, +PIL/_binary.py,sha256=Ts2HKoKEMc9N4DsgIYTmJM_ecjKsexxJhsL6zR0tmuQ,2145 +PIL/_deprecate.py,sha256=Azv6exyqE_fRJsRN2F155iVtRiLwLdcc3gAglT1Xr8U,2071 +PIL/_imaging.cp311-win_amd64.pyd,sha256=M42zXxQXQECuP6WyRrjdbQqCZM7BrmTqh8lEa73r8ZM,2386432 +PIL/_imagingcms.cp311-win_amd64.pyd,sha256=ckyv96dx4IAwPo2mcKZiAuWeNMnQgEiajU1ID4eRO84,256512 +PIL/_imagingft.cp311-win_amd64.pyd,sha256=hgQ3aQoI_d6tuEf9rDSS8GUpjnbNMc7K46sezkG8B9U,1715712 +PIL/_imagingmath.cp311-win_amd64.pyd,sha256=vo1UGYMdm9oan4PRE6yHcvN2ambtFOOTuPnTu4bIiYQ,24064 +PIL/_imagingmorph.cp311-win_amd64.pyd,sha256=Lenlu6PrBCUjvoetK0rd-TCBol2UCIGtRvzlfPAsdLU,13312 +PIL/_imagingtk.cp311-win_amd64.pyd,sha256=7RWmRj-Epa_kCPrDhtp2LrnSks37vwYz7B676oEV-Cw,14848 +PIL/_tkinter_finder.py,sha256=yTJvJBNR61MpDzWmKu_3C86QbtPIqacJkA23LGOlh0g,691 +PIL/_util.py,sha256=sX8hjjr5oCOQNLChyFM7lP5ZaKIpISa4Sc0vuclsR-4,388 +PIL/_version.py,sha256=EZhbGkhExLYxGRMHo0sWpmvbT_M5XAElD6bMCGY6P_k,52 +PIL/_webp.cp311-win_amd64.pyd,sha256=zTJkJr7M_o9WDiAoDYalxEzwa2BeevFa4q9o5Bk_H7s,530432 +PIL/features.py,sha256=0latlyZu0IxkkBqhnGqgbjrArAfsz8_O9OCUg4SVx2Q,9949 +Pillow-9.5.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Pillow-9.5.0.dist-info/LICENSE,sha256=xjqN48E7Qy6zoB1XXAKwTAwZ0R7wVaY1Jwq_4Z_QMqU,56523 +Pillow-9.5.0.dist-info/METADATA,sha256=E1Z_TNsiMy__GRASZW7wsSRh9wcIeG_RHIjM8qS2pTE,9679 +Pillow-9.5.0.dist-info/RECORD,, +Pillow-9.5.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Pillow-9.5.0.dist-info/WHEEL,sha256=9wvhO-5NhjjD8YmmxAvXTPQXMDOZ50W5vklzeoqFtkM,102 +Pillow-9.5.0.dist-info/top_level.txt,sha256=riZqrk-hyZqh5f1Z0Zwii3dKfxEsByhu9cU9IODF-NY,4 +Pillow-9.5.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2 diff --git a/.venv/Lib/site-packages/pip-22.3.dist-info/REQUESTED b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/REQUESTED similarity index 100% rename from .venv/Lib/site-packages/pip-22.3.dist-info/REQUESTED rename to .venv/Lib/site-packages/Pillow-9.5.0.dist-info/REQUESTED diff --git a/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/WHEEL b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/WHEEL new file mode 100644 index 00000000..30c3ff1e --- /dev/null +++ b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: false +Tag: cp311-cp311-win_amd64 + diff --git a/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/top_level.txt b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/top_level.txt new file mode 100644 index 00000000..b338169c --- /dev/null +++ b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/top_level.txt @@ -0,0 +1 @@ +PIL diff --git a/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/zip-safe b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/zip-safe new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.venv/Lib/site-packages/Pillow-9.5.0.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc index bb64dd4e..f6a597a7 100644 Binary files a/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip-22.3.dist-info/METADATA b/.venv/Lib/site-packages/pip-22.3.dist-info/METADATA deleted file mode 100644 index a0504ed2..00000000 --- a/.venv/Lib/site-packages/pip-22.3.dist-info/METADATA +++ /dev/null @@ -1,88 +0,0 @@ -Metadata-Version: 2.1 -Name: pip -Version: 22.3 -Summary: The PyPA recommended tool for installing Python packages. -Home-page: https://pip.pypa.io/ -Author: The pip developers -Author-email: distutils-sig@python.org -License: MIT -Project-URL: Documentation, https://pip.pypa.io -Project-URL: Source, https://github.com/pypa/pip -Project-URL: Changelog, https://pip.pypa.io/en/stable/news/ -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Topic :: Software Development :: Build Tools -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=3.7 -License-File: LICENSE.txt - -pip - The Python Package Installer -================================== - -.. image:: https://img.shields.io/pypi/v/pip.svg - :target: https://pypi.org/project/pip/ - -.. image:: https://readthedocs.org/projects/pip/badge/?version=latest - :target: https://pip.pypa.io/en/latest - -pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. - -Please take a look at our documentation for how to install and use pip: - -* `Installation`_ -* `Usage`_ - -We release updates regularly, with a new version every 3 months. Find more details in our documentation: - -* `Release notes`_ -* `Release process`_ - -In pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right. - -**Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3. - -If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms: - -* `Issue tracking`_ -* `Discourse channel`_ -* `User IRC`_ - -If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: - -* `GitHub page`_ -* `Development documentation`_ -* `Development IRC`_ - -Code of Conduct ---------------- - -Everyone interacting in the pip project's codebases, issue trackers, chat -rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. - -.. _package installer: https://packaging.python.org/guides/tool-recommendations/ -.. _Python Package Index: https://pypi.org -.. _Installation: https://pip.pypa.io/en/stable/installation/ -.. _Usage: https://pip.pypa.io/en/stable/ -.. _Release notes: https://pip.pypa.io/en/stable/news.html -.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ -.. _GitHub page: https://github.com/pypa/pip -.. _Development documentation: https://pip.pypa.io/en/latest/development -.. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html -.. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020 -.. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html -.. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support -.. _Issue tracking: https://github.com/pypa/pip/issues -.. _Discourse channel: https://discuss.python.org/c/packaging -.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa -.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev -.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md diff --git a/.venv/Lib/site-packages/pip-22.3.dist-info/RECORD b/.venv/Lib/site-packages/pip-22.3.dist-info/RECORD deleted file mode 100644 index 31de1ab7..00000000 --- a/.venv/Lib/site-packages/pip-22.3.dist-info/RECORD +++ /dev/null @@ -1,993 +0,0 @@ -../../Scripts/pip.exe,sha256=INxsPliUrhTp_x6YPq4m9zAsDQEIimPyvGbMnrsVNXY,108457 -../../Scripts/pip3.10.exe,sha256=INxsPliUrhTp_x6YPq4m9zAsDQEIimPyvGbMnrsVNXY,108457 -../../Scripts/pip3.11.exe,sha256=INxsPliUrhTp_x6YPq4m9zAsDQEIimPyvGbMnrsVNXY,108457 -../../Scripts/pip3.exe,sha256=INxsPliUrhTp_x6YPq4m9zAsDQEIimPyvGbMnrsVNXY,108457 -pip-22.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-22.3.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 -pip-22.3.dist-info/METADATA,sha256=CPPiEmaf6uwWzUdhKzSs4P2nVlj8OQXqNosdEf2_b2U,4070 -pip-22.3.dist-info/RECORD,, -pip-22.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip-22.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -pip-22.3.dist-info/entry_points.txt,sha256=ynZN1_707_L23Oa8_O5LOxEoccj1nDa4xHT5galfN7o,125 -pip-22.3.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/__init__.py,sha256=bsx-xKM3ixByJQTrS7rzaHCYdTO-5kimvPR8sneY56w,355 -pip/__main__.py,sha256=mXwWDftNLMKfwVqKFWGE_uuBZvGSIiUELhLkeysIuZc,1198 -pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444 -pip/__pycache__/__init__.cpython-311.pyc,, -pip/__pycache__/__main__.cpython-311.pyc,, -pip/__pycache__/__pip-runner__.cpython-311.pyc,, -pip/_internal/__init__.py,sha256=nnFCuxrPMgALrIDxSoy-H6Zj4W4UY60D-uL1aJyq0pc,573 -pip/_internal/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/__pycache__/build_env.cpython-311.pyc,, -pip/_internal/__pycache__/cache.cpython-311.pyc,, -pip/_internal/__pycache__/configuration.cpython-311.pyc,, -pip/_internal/__pycache__/exceptions.cpython-311.pyc,, -pip/_internal/__pycache__/main.cpython-311.pyc,, -pip/_internal/__pycache__/pyproject.cpython-311.pyc,, -pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc,, -pip/_internal/__pycache__/wheel_builder.cpython-311.pyc,, -pip/_internal/build_env.py,sha256=gEAT8R6SuWbg2mcrsmOTKWMw_x5pedMzvSTxQS57JZs,10234 -pip/_internal/cache.py,sha256=C3n78VnBga9rjPXZqht_4A4d-T25poC7K0qBM7FHDhU,10734 -pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 -pip/_internal/cli/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc,, -pip/_internal/cli/__pycache__/base_command.cpython-311.pyc,, -pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc,, -pip/_internal/cli/__pycache__/command_context.cpython-311.pyc,, -pip/_internal/cli/__pycache__/main.cpython-311.pyc,, -pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc,, -pip/_internal/cli/__pycache__/parser.cpython-311.pyc,, -pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc,, -pip/_internal/cli/__pycache__/req_command.cpython-311.pyc,, -pip/_internal/cli/__pycache__/spinners.cpython-311.pyc,, -pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc,, -pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676 -pip/_internal/cli/base_command.py,sha256=t1D5x40Hfn9HnPnMt-iSxvqL14nht2olBCacW74pc-k,7842 -pip/_internal/cli/cmdoptions.py,sha256=Jlarlzz9qv9tC_tCaEbcc_jVvrPreFLBBUnDgoyWflw,29381 -pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 -pip/_internal/cli/main.py,sha256=ioJ8IVlb2K1qLOxR-tXkee9lURhYV89CDM71MKag7YY,2472 -pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338 -pip/_internal/cli/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817 -pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 -pip/_internal/cli/req_command.py,sha256=ypTutLv4j_efxC2f6C6aCQufxre-zaJdi5m_tWlLeBk,18172 -pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118 -pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 -pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 -pip/_internal/commands/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/commands/__pycache__/cache.cpython-311.pyc,, -pip/_internal/commands/__pycache__/check.cpython-311.pyc,, -pip/_internal/commands/__pycache__/completion.cpython-311.pyc,, -pip/_internal/commands/__pycache__/configuration.cpython-311.pyc,, -pip/_internal/commands/__pycache__/debug.cpython-311.pyc,, -pip/_internal/commands/__pycache__/download.cpython-311.pyc,, -pip/_internal/commands/__pycache__/freeze.cpython-311.pyc,, -pip/_internal/commands/__pycache__/hash.cpython-311.pyc,, -pip/_internal/commands/__pycache__/help.cpython-311.pyc,, -pip/_internal/commands/__pycache__/index.cpython-311.pyc,, -pip/_internal/commands/__pycache__/inspect.cpython-311.pyc,, -pip/_internal/commands/__pycache__/install.cpython-311.pyc,, -pip/_internal/commands/__pycache__/list.cpython-311.pyc,, -pip/_internal/commands/__pycache__/search.cpython-311.pyc,, -pip/_internal/commands/__pycache__/show.cpython-311.pyc,, -pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc,, -pip/_internal/commands/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/commands/cache.py,sha256=muaT0mbL-ZUpn6AaushVAipzTiMwE4nV2BLbJBwt_KQ,7582 -pip/_internal/commands/check.py,sha256=0gjXR7j36xJT5cs2heYU_dfOfpnFfzX8OoPNNoKhqdM,1685 -pip/_internal/commands/completion.py,sha256=H0TJvGrdsoleuIyQKzJbicLFppYx2OZA0BLNpQDeFjI,4129 -pip/_internal/commands/configuration.py,sha256=NB5uf8HIX8-li95YLoZO09nALIWlLCHDF5aifSKcBn8,9815 -pip/_internal/commands/debug.py,sha256=kVjn-O1ixLk0webD0w9vfFFq_GCTUTd2hmLOnYtDCig,6573 -pip/_internal/commands/download.py,sha256=LwKEyYMG2L67nQRyGo8hQdNEeMU2bmGWqJfcB8JDXas,5289 -pip/_internal/commands/freeze.py,sha256=gCjoD6foBZPBAAYx5t8zZLkJhsF_ZRtnb3dPuD7beO8,2951 -pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 -pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 -pip/_internal/commands/index.py,sha256=1VVXXj5MsI2qH-N7uniQQyVkg-KCn_RdjiyiUmkUS5U,4762 -pip/_internal/commands/inspect.py,sha256=mRJ9aIkBQN0IJ7Um8pzaxAzVPIgL8KfWHx1fWKJgUAQ,3374 -pip/_internal/commands/install.py,sha256=_XbW0PyxtZCMMNqo8mDaOq3TBRiJNFM-94CR27mburc,31726 -pip/_internal/commands/list.py,sha256=Fk1TSxB33NlRS4qlLQ0xwnytnF9-zkQJbKQYv2xc4Q4,12343 -pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 -pip/_internal/commands/show.py,sha256=CJI8q4SSY0X346K1hi4Th8Nbyhl4nxPTBJUuzOlTaYE,6129 -pip/_internal/commands/uninstall.py,sha256=0JQhifYxecNrJAwoILFwjm9V1V3liXzNT-y4bgRXXPw,3680 -pip/_internal/commands/wheel.py,sha256=mbFJd4dmUfrVFJkQbK8n2zHyRcD3AI91f7EUo9l3KYg,7396 -pip/_internal/configuration.py,sha256=uBKTus43pDIO6IzT2mLWQeROmHhtnoabhniKNjPYvD0,13529 -pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 -pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/base.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/installed.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/distributions/base.py,sha256=jrF1Vi7eGyqFqMHrieh1PIOrGU7KeCxhYPZnbvtmvGY,1221 -pip/_internal/distributions/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729 -pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494 -pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164 -pip/_internal/exceptions.py,sha256=BfvcyN2iEv3Sf00SVmSk59lEeZEBHELqkuoN2KeIWKc,20942 -pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 -pip/_internal/index/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/index/__pycache__/collector.cpython-311.pyc,, -pip/_internal/index/__pycache__/package_finder.cpython-311.pyc,, -pip/_internal/index/__pycache__/sources.cpython-311.pyc,, -pip/_internal/index/collector.py,sha256=Pb9FW9STH2lwaApCIdMCivsbPP5pSYQp5bh3nLQBkDU,16503 -pip/_internal/index/package_finder.py,sha256=kmcMu5_i-BP6v3NQGY0_am1ezxM2Gk4t00arZMmm4sc,37596 -pip/_internal/index/sources.py,sha256=SVyPitv08-Qalh2_Bk5diAJ9GAA_d-a93koouQodAG0,6557 -pip/_internal/locations/__init__.py,sha256=QhB-Y6TNyaU010cimm2T4wM5loe8oRdjLwJ6xmsGc-k,17552 -pip/_internal/locations/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc,, -pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc,, -pip/_internal/locations/__pycache__/base.cpython-311.pyc,, -pip/_internal/locations/_distutils.py,sha256=wgHDvHGNZHtlcHkQjYovHzkEUBzisR0iOh7OqCIkB5g,6302 -pip/_internal/locations/_sysconfig.py,sha256=nM-DiVHXWTxippdmN0MGVl5r7OIfIMy3vgDMlo8c_oo,7867 -pip/_internal/locations/base.py,sha256=ufyDqPwZ4jLbScD44u8AwTVI-3ft8O78UGrroQI5f68,2573 -pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 -pip/_internal/metadata/__init__.py,sha256=84j1dPJaIoz5Q2ZTPi0uB1iaDAHiUNfKtYSGQCfFKpo,4280 -pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/metadata/__pycache__/_json.cpython-311.pyc,, -pip/_internal/metadata/__pycache__/base.cpython-311.pyc,, -pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc,, -pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595 -pip/_internal/metadata/base.py,sha256=vIwIo1BtoqegehWMAXhNrpLGYBq245rcaCNkBMPnTU8,25277 -pip/_internal/metadata/importlib/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107 -pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc,, -pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc,, -pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc,, -pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882 -pip/_internal/metadata/importlib/_dists.py,sha256=BUV8y6D0PePZrEN3vfJL-m1FDqZ6YPRgAiBeBinHhNg,8181 -pip/_internal/metadata/importlib/_envs.py,sha256=7BxanCh3T7arusys__O2ZHJdnmDhQXFmfU7x1-jB5xI,7457 -pip/_internal/metadata/pkg_resources.py,sha256=WjwiNdRsvxqxL4MA5Tb5a_q3Q3sUhdpbZF8wGLtPMI0,9773 -pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 -pip/_internal/models/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/models/__pycache__/candidate.cpython-311.pyc,, -pip/_internal/models/__pycache__/direct_url.cpython-311.pyc,, -pip/_internal/models/__pycache__/format_control.cpython-311.pyc,, -pip/_internal/models/__pycache__/index.cpython-311.pyc,, -pip/_internal/models/__pycache__/installation_report.cpython-311.pyc,, -pip/_internal/models/__pycache__/link.cpython-311.pyc,, -pip/_internal/models/__pycache__/scheme.cpython-311.pyc,, -pip/_internal/models/__pycache__/search_scope.cpython-311.pyc,, -pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc,, -pip/_internal/models/__pycache__/target_python.cpython-311.pyc,, -pip/_internal/models/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/models/candidate.py,sha256=6pcABsaR7CfIHlbJbr2_kMkVJFL_yrYjTx6SVWUnCPQ,990 -pip/_internal/models/direct_url.py,sha256=HLO0sL2aYB6n45bwmd72TDN05sLHJlOQI8M01l2SH3I,5877 -pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520 -pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 -pip/_internal/models/installation_report.py,sha256=ad1arqtxrSFBvWnm6mRqmG12HLV3pZZcZcHrlTFIiqU,2617 -pip/_internal/models/link.py,sha256=9HWL14UQTMxRCnY6dmAz09rGElJrMAcHn2OJZCBx0tk,18083 -pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 -pip/_internal/models/search_scope.py,sha256=iGPQQ6a4Lau8oGQ_FWj8aRLik8A21o03SMO5KnSt-Cg,4644 -pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 -pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858 -pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600 -pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 -pip/_internal/network/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/network/__pycache__/auth.cpython-311.pyc,, -pip/_internal/network/__pycache__/cache.cpython-311.pyc,, -pip/_internal/network/__pycache__/download.cpython-311.pyc,, -pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc,, -pip/_internal/network/__pycache__/session.cpython-311.pyc,, -pip/_internal/network/__pycache__/utils.cpython-311.pyc,, -pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc,, -pip/_internal/network/auth.py,sha256=a3C7Xaa8kTJjXkdi_wrUjqaySc8Z9Yz7U6QIbXfzMyc,12190 -pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145 -pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096 -pip/_internal/network/lazy_wheel.py,sha256=PbPyuleNhtEq6b2S7rufoGXZWMD15FAGL4XeiAQ8FxA,7638 -pip/_internal/network/session.py,sha256=BpDOJ7_Xw5VkgPYWsePzcaqOfcyRZcB2AW7W0HGBST0,18443 -pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 -pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791 -pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/operations/__pycache__/check.cpython-311.pyc,, -pip/_internal/operations/__pycache__/freeze.cpython-311.pyc,, -pip/_internal/operations/__pycache__/prepare.cpython-311.pyc,, -pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc,, -pip/_internal/operations/build/build_tracker.py,sha256=vf81EwomN3xe9G8qRJED0VGqNikmRQRQoobNsxi5Xrs,4133 -pip/_internal/operations/build/metadata.py,sha256=ES_uRmAvhrNm_nDTpZxshBfUsvnXtkj-g_4rZrH9Rww,1404 -pip/_internal/operations/build/metadata_editable.py,sha256=_Rai0VZjxoeJUkjkuICrq45LtjwFoDOveosMYH43rKc,1456 -pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198 -pip/_internal/operations/build/wheel.py,sha256=AO9XnTGhTgHtZmU8Dkbfo1OGr41rBuSDjIgAa4zUKgE,1063 -pip/_internal/operations/build/wheel_editable.py,sha256=TVETY-L_M_dSEKBhTIcQOP75zKVXw8tuq1U354Mm30A,1405 -pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064 -pip/_internal/operations/check.py,sha256=ca4O9CkPt9Em9sLCf3H0iVt1GIcW7M8C0U5XooaBuT4,5109 -pip/_internal/operations/freeze.py,sha256=mwTZ2uML8aQgo3k8MR79a7SZmmmvdAJqdyaknKbavmg,9784 -pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 -pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc,, -pip/_internal/operations/install/__pycache__/legacy.cpython-311.pyc,, -pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/operations/install/editable_legacy.py,sha256=ee4kfJHNuzTdKItbfAsNOSEwq_vD7DRPGkBdK48yBhU,1354 -pip/_internal/operations/install/legacy.py,sha256=cHdcHebyzf8w7OaOLwcsTNSMSSV8WBoAPFLay_9CjE8,4105 -pip/_internal/operations/install/wheel.py,sha256=ZbRGMj1VVS39coYNj4kvsTQCiABeGBJEi7gSsaL2xXU,27403 -pip/_internal/operations/prepare.py,sha256=BeYXrLFpRoV5XBnRXQHxRA2plyC36kK9Pms5D9wjCo4,25091 -pip/_internal/pyproject.py,sha256=ob0Gb0l12YLZNxjdpZGRfWHgjqhZTnSVv96RuJyNOfs,7074 -pip/_internal/req/__init__.py,sha256=rUQ9d_Sh3E5kNYqX9pkN0D06YL-LrtcbJQ-LiIonq08,2807 -pip/_internal/req/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/req/__pycache__/constructors.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_file.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_install.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_set.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc,, -pip/_internal/req/constructors.py,sha256=ypjtq1mOQ3d2mFkFPMf_6Mr8SLKeHQk3tUKHA1ddG0U,16611 -pip/_internal/req/req_file.py,sha256=N6lPO3c0to_G73YyGAnk7VUYmed5jV4Qxgmt1xtlXVg,17646 -pip/_internal/req/req_install.py,sha256=4tzyVGPHJ1-GXowm6PBT52BGIlbc4w7fhVqf-55bmRg,35600 -pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858 -pip/_internal/req/req_uninstall.py,sha256=ZFQfgSNz6H1BMsgl87nQNr2iaQCcbFcmXpW8rKVQcic,24045 -pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/resolution/__pycache__/base.cpython-311.pyc,, -pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583 -pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc,, -pip/_internal/resolution/legacy/resolver.py,sha256=9em8D5TcSsEN4xZM1WreaRShOnyM4LlvhMSHpUPsocE,24129 -pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/base.py,sha256=u1O4fkvCO4mhmu5i32xrDv9AX5NgUci_eYVyBDQhTIM,5220 -pip/_internal/resolution/resolvelib/candidates.py,sha256=6kQZeMzwibnL4lO6bW0hUQQjNEvXfADdFphRRkRvOtc,18963 -pip/_internal/resolution/resolvelib/factory.py,sha256=OnjkLIgyk5Tol7uOOqapA1D4qiRHWmPU18DF1yN5N8o,27878 -pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705 -pip/_internal/resolution/resolvelib/provider.py,sha256=Vd4jW_NnyifB-HMkPYtZIO70M3_RM0MbL5YV6XyBM-w,9914 -pip/_internal/resolution/resolvelib/reporter.py,sha256=3ZVVYrs5PqvLFJkGLcuXoMK5mTInFzl31xjUpDBpZZk,2526 -pip/_internal/resolution/resolvelib/requirements.py,sha256=B1ndvKPSuyyyTEXt9sKhbwminViSWnBrJa7qO2ln4Z0,5455 -pip/_internal/resolution/resolvelib/resolver.py,sha256=nYZ9bTFXj5c1ILKnkSgU7tUCTYyo5V5J-J0sKoA7Wzg,11533 -pip/_internal/self_outdated_check.py,sha256=R3MmjCyUt_lkUNMc6p3xVSx7vX28XiDh3VDs5OrYn6Q,8020 -pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/utils/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/utils/__pycache__/_log.cpython-311.pyc,, -pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc,, -pip/_internal/utils/__pycache__/compat.cpython-311.pyc,, -pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc,, -pip/_internal/utils/__pycache__/datetime.cpython-311.pyc,, -pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc,, -pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc,, -pip/_internal/utils/__pycache__/distutils_args.cpython-311.pyc,, -pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc,, -pip/_internal/utils/__pycache__/encoding.cpython-311.pyc,, -pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc,, -pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc,, -pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc,, -pip/_internal/utils/__pycache__/glibc.cpython-311.pyc,, -pip/_internal/utils/__pycache__/hashes.cpython-311.pyc,, -pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc,, -pip/_internal/utils/__pycache__/logging.cpython-311.pyc,, -pip/_internal/utils/__pycache__/misc.cpython-311.pyc,, -pip/_internal/utils/__pycache__/models.cpython-311.pyc,, -pip/_internal/utils/__pycache__/packaging.cpython-311.pyc,, -pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc,, -pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc,, -pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc,, -pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc,, -pip/_internal/utils/__pycache__/urls.cpython-311.pyc,, -pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc,, -pip/_internal/utils/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 -pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665 -pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 -pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 -pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 -pip/_internal/utils/deprecation.py,sha256=OLc7GzDwPob9y8jscDYCKUNBV-9CWwqFplBOJPLOpBM,5764 -pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 -pip/_internal/utils/distutils_args.py,sha256=bYUt4wfFJRaeGO4VHia6FNaA8HlYXMcKuEq1zYijY5g,1115 -pip/_internal/utils/egg_link.py,sha256=5MVlpz5LirT4iLQq86OYzjXaYF0D4Qk1dprEI7ThST4,2203 -pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 -pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064 -pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122 -pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 -pip/_internal/utils/glibc.py,sha256=tDfwVYnJCOC0BNVpItpy8CGLP9BjkxFHdl0mTS0J7fc,3110 -pip/_internal/utils/hashes.py,sha256=1WhkVNIHNfuYLafBHThIjVKGplxFJXSlQtuG2mXNlJI,4831 -pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795 -pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632 -pip/_internal/utils/misc.py,sha256=49Rs2NgrD4JGTKFt0farCm7FIAi-rjyoxgioArhCW_0,21617 -pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 -pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 -pip/_internal/utils/setuptools_build.py,sha256=4i3CuS34yNrkePnZ73rR47pyDzpZBo-SX9V5PNDSSHY,5662 -pip/_internal/utils/subprocess.py,sha256=MYySbvY7qBevRxq_RFfOsDqG4vMqrB4vDoL_eyPE6Bo,9197 -pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702 -pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 -pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759 -pip/_internal/utils/virtualenv.py,sha256=4_48qMzCwB_F5jIK5BC_ua7uiAMVifmQWU9NdaGUoVA,3459 -pip/_internal/utils/wheel.py,sha256=lXOgZyTlOm5HmK8tw5iw0A3_5A6wRzsXHOaQkIvvloU,4549 -pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 -pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/git.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc,, -pip/_internal/vcs/bazaar.py,sha256=zq-Eu2NtJffc6kOsyv2kmRTnKg9qeIXE-KH5JeKck70,3518 -pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116 -pip/_internal/vcs/mercurial.py,sha256=Bzbd518Jsx-EJI0IhIobiQqiRsUv5TWYnrmRIFWE0Gw,5238 -pip/_internal/vcs/subversion.py,sha256=AeUVE9d9qp-0QSOMiUvuFHy1TK950E3QglN7ipP13sI,11728 -pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811 -pip/_internal/wheel_builder.py,sha256=8cObBCu4mIsMJqZM7xXI9DO3vldiAnRNa1Gt6izPPTs,13079 -pip/_vendor/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966 -pip/_vendor/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/__pycache__/six.cpython-311.pyc,, -pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc,, -pip/_vendor/cachecontrol/__init__.py,sha256=hrxlv3q7upsfyMw8k3gQ9vagBax1pYHSGGqYlZ0Zk0M,465 -pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc,, -pip/_vendor/cachecontrol/_cmd.py,sha256=lxUXqfNTVx84zf6tcWbkLZHA6WVBRtJRpfeA9ZqhaAY,1379 -pip/_vendor/cachecontrol/adapter.py,sha256=ew9OYEQHEOjvGl06ZsuX8W3DAvHWsQKHwWAxISyGug8,5033 -pip/_vendor/cachecontrol/cache.py,sha256=Tty45fOjH40fColTGkqKQvQQmbYsMpk-nCyfLcv2vG4,1535 -pip/_vendor/cachecontrol/caches/__init__.py,sha256=h-1cUmOz6mhLsjTjOrJ8iPejpGdLCyG4lzTftfGZvLg,242 -pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc,, -pip/_vendor/cachecontrol/caches/file_cache.py,sha256=GpexcE29LoY4MaZwPUTcUBZaDdcsjqyLxZFznk8Hbr4,5271 -pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=mp-QWonP40I3xJGK3XVO-Gs9a3UjzlqqEmp9iLJH9F4,1033 -pip/_vendor/cachecontrol/compat.py,sha256=LNx7vqBndYdHU8YuJt53ab_8rzMGTXVrvMb7CZJkxG0,778 -pip/_vendor/cachecontrol/controller.py,sha256=bAYrt7x_VH4toNpI066LQxbHpYGpY1MxxmZAhspplvw,16416 -pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx_15MyFBpcs,3946 -pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154 -pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105 -pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774 -pip/_vendor/certifi/__init__.py,sha256=luDjIGxDSrQ9O0zthdz5Lnt069Z_7eR1GIEefEaf-Ys,94 -pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 -pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/certifi/__pycache__/core.cpython-311.pyc,, -pip/_vendor/certifi/cacert.pem,sha256=3l8CcWt_qL42030rGieD3SLufICFX0bYtGhDl_EXVPI,286370 -pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279 -pip/_vendor/chardet/__init__.py,sha256=9-r0i294avRciob2HKVcKf6GJmXPHpgMqIijVrqHBDU,3705 -pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/version.cpython-311.pyc,, -pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274 -pip/_vendor/chardet/big5prober.py,sha256=neUXIlq35507yibstiznZWFzyNcMn6EXrqJaUJVPWKg,1741 -pip/_vendor/chardet/chardistribution.py,sha256=M9NTKdM72KieFKy4TT5eml4PP0WaVcXuY5PpWSFD0FA,9608 -pip/_vendor/chardet/charsetgroupprober.py,sha256=CaIBAmNitEsYuSgMvgAsMREN4cLxMj5OYwMhVo6MAxk,3817 -pip/_vendor/chardet/charsetprober.py,sha256=Eo3w8sCmbvnVKOGNW1iy50KATVs8xV-gF7cQ0VG85dQ,4801 -pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc,, -pip/_vendor/chardet/cli/chardetect.py,sha256=1qMxT3wrp5vP6ugSf1-Zz3BWwlbCWJ0jzeCuhgX85vw,2406 -pip/_vendor/chardet/codingstatemachine.py,sha256=BiGR9kgTYbS4gJI5qBmE52HMOBOR_roDvXf7aIehdEk,3559 -pip/_vendor/chardet/cp949prober.py,sha256=kCQEaOCzMntqv7pAyXEobWTRgIUxYfoiUr0btXO1nI8,1838 -pip/_vendor/chardet/enums.py,sha256=Rodw4p61Vg9U-oCo6eUuT7uDzKwIbCaA15HwbvCoCNk,1619 -pip/_vendor/chardet/escprober.py,sha256=girD61r3NsQLnMQXsWWBU4hHuRJzTH3V7-VfTUr-nQY,3864 -pip/_vendor/chardet/escsm.py,sha256=0Vs4iPPovberMoSxxnK5pI161Xf-mtKgOl14g5Xc7zg,12021 -pip/_vendor/chardet/eucjpprober.py,sha256=pGgs4lINwCEDV2bxqIZ6hXpaj2j4l2oLsMx6kuOK_zQ,3676 -pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566 -pip/_vendor/chardet/euckrprober.py,sha256=qBuSS2zXWaoUmGdzz3owAnD1GNhuKR_8bYzDC3yxe6I,1731 -pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913 -pip/_vendor/chardet/euctwprober.py,sha256=SLnCoJC94jZL8PJio60Q8PZACJA1rVPtUdWMa1W8Pwk,1731 -pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735 -pip/_vendor/chardet/gb2312prober.py,sha256=NS_i52jZE0TnWGkKqFduvu9fzW0nMcS2XbYJ8qSX8hY,1737 -pip/_vendor/chardet/hebrewprober.py,sha256=1l1hXF8-2IWDrPkf85UvAO1GVtMfY1r11kDgOqa-gU4,13919 -pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796 -pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498 -pip/_vendor/chardet/johabprober.py,sha256=C18osd4vMPfy9facw-Y1Lor_9UrW0PeV-zxM2fu441c,1730 -pip/_vendor/chardet/jpcntx.py,sha256=m1gDpPkRca4EDwym8XSL5YdoILFnFsDbNBYMQV7_-NE,26797 -pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562 -pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484 -pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196 -pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363 -pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035 -pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774 -pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372 -pip/_vendor/chardet/latin1prober.py,sha256=u_iGcQMUcZLXvj4B_WXx4caA0C5oaE2Qj1KTpz_RQ1I,5260 -pip/_vendor/chardet/mbcharsetprober.py,sha256=iKKuB6o_FF80NynRLBDT0UtwOnpLqmL_OspRPMib7CM,3367 -pip/_vendor/chardet/mbcsgroupprober.py,sha256=1D_kp9nv2_NQRddq9I2WDvB35OJh7Tfpo-OYTnL3B5o,2056 -pip/_vendor/chardet/mbcssm.py,sha256=EfORNu1WXgnFvpFarU8uJHS8KFif63xmgrHOB4DdDdY,30068 -pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc,, -pip/_vendor/chardet/metadata/languages.py,sha256=HcaBygWtZq3gR8prIkJp_etvkhm2V4pUIToqjPZhgrc,13280 -pip/_vendor/chardet/sbcharsetprober.py,sha256=VvtWiNRLbHDZ5xgnofsmP1u8VQIkkaAuw3Ir9m1zDzQ,6199 -pip/_vendor/chardet/sbcsgroupprober.py,sha256=mekr4E3hgT4onmwi8oi1iEGW1CN-Z-BArG6kOtCunJw,4129 -pip/_vendor/chardet/sjisprober.py,sha256=sLfWS25PVFr5cDGhEf6h_s-RJsyeSteA-4ynsTl_UvA,3749 -pip/_vendor/chardet/universaldetector.py,sha256=BHeNWt1kn0yQgnR6xNtLAjiNmEQpSHYlKEvuZ9QyR1k,13288 -pip/_vendor/chardet/utf1632prober.py,sha256=N42YJEOkVDB67c38t5aJhXMG1QvnyWWDMNY5ERzniU0,8289 -pip/_vendor/chardet/utf8prober.py,sha256=mnLaSBV4gg-amt2WmxKFKWy4vVBedMNgjdbvgzBo0Dc,2709 -pip/_vendor/chardet/version.py,sha256=u_QYi-DXU1s7fyC_Rwa0I0-UcxMVmH7Co6c7QGKbe3g,242 -pip/_vendor/colorama/__init__.py,sha256=ihDoWQOkapwF7sqQ99AoDoEF3vGYm40OtmgW211cLZw,239 -pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc,, -pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 -pip/_vendor/colorama/ansitowin32.py,sha256=gGrO7MVtwc-j1Sq3jKfZpERT1JWmYSOsTVDiTnFbZU4,10830 -pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 -pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 -pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 -pip/_vendor/distlib/__init__.py,sha256=acgfseOC55dNrVAzaBKpUiH3Z6V7Q1CaxsiQ3K7pC-E,581 -pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/database.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/index.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/util.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/version.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc,, -pip/_vendor/distlib/compat.py,sha256=tfoMrj6tujk7G4UC2owL6ArgDuCKabgBxuJRGZSmpko,41259 -pip/_vendor/distlib/database.py,sha256=o_mw0fAr93NDAHHHfqG54Y1Hi9Rkfrp2BX15XWZYK50,51697 -pip/_vendor/distlib/index.py,sha256=HFiDG7LMoaBs829WuotrfIwcErOOExUOR_AeBtw_TCU,20834 -pip/_vendor/distlib/locators.py,sha256=wNzG-zERzS_XGls-nBPVVyLRHa2skUlkn0-5n0trMWA,51991 -pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 -pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-U,5058 -pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801 -pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 -pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102 -pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792 -pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784 -pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032 -pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262 -pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513 -pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648 -pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448 -pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888 -pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898 -pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 -pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 -pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/distro/__pycache__/distro.cpython-311.pyc,, -pip/_vendor/distro/distro.py,sha256=UYQG_9H_iSOt422uasA92HlY7aXeTnWKdV-IhsSAdwQ,48841 -pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 -pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/codec.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/core.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc,, -pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 -pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 -pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950 -pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375 -pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 -pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21 -pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539 -pip/_vendor/msgpack/__init__.py,sha256=NryGaKLDk_Egd58ZxXpnuI7OWO27AXz7S6CBFRM3sAY,1132 -pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc,, -pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc,, -pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 -pip/_vendor/msgpack/ext.py,sha256=TuldJPkYu8Wo_Xh0tFGL2l06-gY88NSR8tOje9fo2Wg,6080 -pip/_vendor/msgpack/fallback.py,sha256=OORDn86-fHBPlu-rPlMdM10KzkH6S_Rx9CHN1b7o4cg,34557 -pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661 -pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 -pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/version.cpython-311.pyc,, -pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488 -pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378 -pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 -pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487 -pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676 -pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110 -pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699 -pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 -pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 -pip/_vendor/pep517/__init__.py,sha256=QJpRfzTpk6YSPgjcxp9-MCAiS5dEdzf9Bh0UXophG6c,130 -pip/_vendor/pep517/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pep517/__pycache__/_compat.cpython-311.pyc,, -pip/_vendor/pep517/__pycache__/build.cpython-311.pyc,, -pip/_vendor/pep517/__pycache__/check.cpython-311.pyc,, -pip/_vendor/pep517/__pycache__/colorlog.cpython-311.pyc,, -pip/_vendor/pep517/__pycache__/dirtools.cpython-311.pyc,, -pip/_vendor/pep517/__pycache__/envbuild.cpython-311.pyc,, -pip/_vendor/pep517/__pycache__/meta.cpython-311.pyc,, -pip/_vendor/pep517/__pycache__/wrappers.cpython-311.pyc,, -pip/_vendor/pep517/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138 -pip/_vendor/pep517/build.py,sha256=VLtq0hOvNWCfX0FkdvTKEr-TmyrbaX0UqghpU7bHO1w,3443 -pip/_vendor/pep517/check.py,sha256=o0Mp_PX1yOM2WNq1ZdDph3YA7RObj2UGQUCUF-46RaU,6083 -pip/_vendor/pep517/colorlog.py,sha256=eCV1W52xzBjA-sOlKzUcvabRiFa11Y7hA791u-85_c8,3994 -pip/_vendor/pep517/dirtools.py,sha256=JiZ1Hlt2LNaLZEhNa_pm1YyG3MUoRh7KxY6hJ8ac-w0,607 -pip/_vendor/pep517/envbuild.py,sha256=nkTt1ZY7MXVgYOhPTyTr-VOxQ-q_Qc1touXfQgM56Bs,6081 -pip/_vendor/pep517/in_process/__init__.py,sha256=4yDanGyKTXQtLhqRo9eEZ1CsLFezEAEZMfqEd88xrvY,872 -pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-311.pyc,, -pip/_vendor/pep517/in_process/_in_process.py,sha256=JDpTxlKMDN1QfN_ey4IDtE6ZVSWtzP0_WLSqt1TyGaA,10801 -pip/_vendor/pep517/meta.py,sha256=budDWsV3I2OnnpSvXQ_ycuTqxh8G7DABoazAq-j8OlQ,2520 -pip/_vendor/pep517/wrappers.py,sha256=jcxIy-1Kl8I2xAZgbr6qNjF5b_6Q5gTndf9cxF0p5gM,12721 -pip/_vendor/pkg_resources/__init__.py,sha256=NnpQ3g6BCHzpMgOR_OLBmYtniY4oOzdKpwqghfq_6ug,108287 -pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-311.pyc,, -pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 -pip/_vendor/platformdirs/__init__.py,sha256=x0aUmmovXXuRFVrVQBtwIiovX12B7rUkdV4F9UlLz0Y,12831 -pip/_vendor/platformdirs/__main__.py,sha256=ZmsnTxEOxtTvwa-Y_Vfab_JN3X4XCVeN8X0yyy9-qnc,1176 -pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc,, -pip/_vendor/platformdirs/android.py,sha256=GKizhyS7ESRiU67u8UnBJLm46goau9937EchXWbPBlk,4068 -pip/_vendor/platformdirs/api.py,sha256=MXKHXOL3eh_-trSok-JUTjAR_zjmmKF3rjREVABjP8s,4910 -pip/_vendor/platformdirs/macos.py,sha256=-3UXQewbT0yMhMdkzRXfXGAntmLIH7Qt4a9Hlf8I5_Y,2655 -pip/_vendor/platformdirs/unix.py,sha256=b4aVYTz0qZ50HntwOXo8r6tp82jAa3qTjxw-WlnC2yc,6910 -pip/_vendor/platformdirs/version.py,sha256=tsBKKPDX3LLh39yHXeTYauGRbRd-AmOJr9SwKldlFIU,78 -pip/_vendor/platformdirs/windows.py,sha256=ISruopR5UGBePC0BxCxXevkZYfjJsIZc49YWU5iYfQ4,6439 -pip/_vendor/pygments/__init__.py,sha256=5oLcMLXD0cTG8YcHBPITtK1fS0JBASILEvEnWkTezgE,2999 -pip/_vendor/pygments/__main__.py,sha256=p0_rz3JZmNZMNZBOqDojaEx1cr9wmA9FQZX_TYl74lQ,353 -pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/console.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/style.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/token.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/util.cpython-311.pyc,, -pip/_vendor/pygments/cmdline.py,sha256=rc0fah4eknRqFgn1wKNEwkq0yWnSqYOGaA4PaIeOxVY,23685 -pip/_vendor/pygments/console.py,sha256=hQfqCFuOlGk7DW2lPQYepsw-wkOH1iNt9ylNA1eRymM,1697 -pip/_vendor/pygments/filter.py,sha256=NglMmMPTRRv-zuRSE_QbWid7JXd2J4AvwjCW2yWALXU,1938 -pip/_vendor/pygments/filters/__init__.py,sha256=b5YuXB9rampSy2-cMtKxGQoMDfrG4_DcvVwZrzTlB6w,40386 -pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/formatter.py,sha256=6-TS2Y8pUMeWIUolWwr1O8ruC-U6HydWDwOdbAiJgJQ,2917 -pip/_vendor/pygments/formatters/__init__.py,sha256=YTqGeHS17fNXCLMZpf7oCxBCKLB9YLsZ8IAsjGhawyg,4810 -pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc,, -pip/_vendor/pygments/formatters/_mapping.py,sha256=fCZgvsM6UEuZUG7J6lr47eVss5owKd_JyaNbDfxeqmQ,4104 -pip/_vendor/pygments/formatters/bbcode.py,sha256=JrL4ITjN-KzPcuQpPMBf1pm33eW2sDUNr8WzSoAJsJA,3314 -pip/_vendor/pygments/formatters/groff.py,sha256=xrOFoLbafSA9uHsSLRogy79_Zc4GWJ8tMK2hCdTJRsw,5086 -pip/_vendor/pygments/formatters/html.py,sha256=QNt9prPgxmbKx2M-nfDwoR1bIg06-sNouQuWnE434Wc,35441 -pip/_vendor/pygments/formatters/img.py,sha256=h75Y7IRZLZxDEIwyoOsdRLTwm7kLVPbODKkgEiJ0iKI,21938 -pip/_vendor/pygments/formatters/irc.py,sha256=iwk5tDJOxbCV64SCmOFyvk__x6RD60ay0nUn7ko9n7U,5871 -pip/_vendor/pygments/formatters/latex.py,sha256=thPbytJCIs2AUXsO3NZwqKtXJ-upOlcXP4CXsx94G4w,19351 -pip/_vendor/pygments/formatters/other.py,sha256=PczqK1Rms43lz6iucOLPeBMxIncPKOGBt-195w1ynII,5073 -pip/_vendor/pygments/formatters/pangomarkup.py,sha256=ZZzMsKJKXrsDniFeMTkIpe7aQ4VZYRHu0idWmSiUJ2U,2212 -pip/_vendor/pygments/formatters/rtf.py,sha256=abrKlWjipBkQvhIICxtjYTUNv6WME0iJJObFvqVuudE,5014 -pip/_vendor/pygments/formatters/svg.py,sha256=6MM9YyO8NhU42RTQfTWBiagWMnsf9iG5gwhqSriHORE,7335 -pip/_vendor/pygments/formatters/terminal.py,sha256=NpEGvwkC6LgMLQTjVzGrJXji3XcET1sb5JCunSCzoRo,4674 -pip/_vendor/pygments/formatters/terminal256.py,sha256=4v4OVizvsxtwWBpIy_Po30zeOzE5oJg_mOc1-rCjMDk,11753 -pip/_vendor/pygments/lexer.py,sha256=ZPB_TGn_qzrXodRFwEdPzzJk6LZBo9BlfSy3lacc6zg,32005 -pip/_vendor/pygments/lexers/__init__.py,sha256=8d80-XfL5UKDCC1wRD1a_ZBZDkZ2HOe7Zul8SsnNYFE,11174 -pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc,, -pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc,, -pip/_vendor/pygments/lexers/_mapping.py,sha256=zEiCV5FPiBioMJQJjw9kk7IJ5Y9GwknS4VJPYlcNchs,70232 -pip/_vendor/pygments/lexers/python.py,sha256=gZROs9iNSOA18YyVghP1cUCD0OwYZ04a6PCwgSOCeSA,53376 -pip/_vendor/pygments/modeline.py,sha256=gIbMSYrjSWPk0oATz7W9vMBYkUyTK2OcdVyKjioDRvA,986 -pip/_vendor/pygments/plugin.py,sha256=5rPxEoB_89qQMpOs0nI4KyLOzAHNlbQiwEMOKxqNmv8,2591 -pip/_vendor/pygments/regexopt.py,sha256=c6xcXGpGgvCET_3VWawJJqAnOp0QttFpQEdOPNY2Py0,3072 -pip/_vendor/pygments/scanner.py,sha256=F2T2G6cpkj-yZtzGQr-sOBw5w5-96UrJWveZN6va2aM,3092 -pip/_vendor/pygments/sphinxext.py,sha256=F8L0211sPnXaiWutN0lkSUajWBwlgDMIEFFAbMWOvZY,4630 -pip/_vendor/pygments/style.py,sha256=RRnussX1YiK9Z7HipIvKorImxu3-HnkdpPCO4u925T0,6257 -pip/_vendor/pygments/styles/__init__.py,sha256=iZDZ7PBKb55SpGlE1--cx9cbmWx5lVTH4bXO87t2Vok,3419 -pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/token.py,sha256=vA2yNHGJBHfq4jNQSah7C9DmIOp34MmYHPA8P-cYAHI,6184 -pip/_vendor/pygments/unistring.py,sha256=gP3gK-6C4oAFjjo9HvoahsqzuV4Qz0jl0E0OxfDerHI,63187 -pip/_vendor/pygments/util.py,sha256=KgwpWWC3By5AiNwxGTI7oI9aXupH2TyZWukafBJe0Mg,9110 -pip/_vendor/pyparsing/__init__.py,sha256=ZPdI7pPo4IYXcABw-51AcqOzsxVvDtqnQbyn_qYWZvo,9171 -pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc,, -pip/_vendor/pyparsing/actions.py,sha256=wU9i32e0y1ymxKE3OUwSHO-SFIrt1h_wv6Ws0GQjpNU,6426 -pip/_vendor/pyparsing/common.py,sha256=lFL97ooIeR75CmW5hjURZqwDCTgruqltcTCZ-ulLO2Q,12936 -pip/_vendor/pyparsing/core.py,sha256=AzTm1KFT1FIhiw2zvXZJmrpQoAwB0wOmeDCiR6SYytw,213344 -pip/_vendor/pyparsing/diagram/__init__.py,sha256=KW0PV_TvWKnL7jysz0pQbZ24nzWWu2ZfNaeyUIIywIg,23685 -pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pyparsing/exceptions.py,sha256=3LbSafD32NYb1Tzt85GHNkhEAU1eZkTtNSk24cPMemo,9023 -pip/_vendor/pyparsing/helpers.py,sha256=QpUOjW0-psvueMwWb9bQpU2noqKCv98_wnw1VSzSdVo,39129 -pip/_vendor/pyparsing/results.py,sha256=HgNvWVXBdQP-Q6PtJfoCEeOJk2nwEvG-2KVKC5sGA30,25341 -pip/_vendor/pyparsing/testing.py,sha256=7tu4Abp4uSeJV0N_yEPRmmNUhpd18ZQP3CrX41DM814,13402 -pip/_vendor/pyparsing/unicode.py,sha256=fwuhMj30SQ165Cv7HJpu-rSxGbRm93kN9L4Ei7VGc1Y,10787 -pip/_vendor/pyparsing/util.py,sha256=kq772O5YSeXOSdP-M31EWpbH_ayj7BMHImBYo9xPD5M,6805 -pip/_vendor/requests/__init__.py,sha256=3XN75ZS4slWy3TQsEGF7-Q6l2R146teU-s2_rXNhxhU,5178 -pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/api.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/auth.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/certs.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/help.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/models.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/packages.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/structures.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/utils.cpython-311.pyc,, -pip/_vendor/requests/__version__.py,sha256=nJVa3ef2yRyeYMhy7yHnRyjjpnNTDykZsE4Sp9irBC4,440 -pip/_vendor/requests/_internal_utils.py,sha256=aSPlF4uDhtfKxEayZJJ7KkAxtormeTfpwKSBSwtmAUw,1397 -pip/_vendor/requests/adapters.py,sha256=GFEz5koZaMZD86v0SHXKVB5SE9MgslEjkCQzldkNwVM,21443 -pip/_vendor/requests/api.py,sha256=dyvkDd5itC9z2g0wHl_YfD1yf6YwpGWLO7__8e21nks,6377 -pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 -pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575 -pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286 -pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 -pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 -pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879 -pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 -pip/_vendor/requests/models.py,sha256=GZRMMrGwDOLVvVfFHLUq0qTfIWDla3NcFHa1f5xs9Q8,35287 -pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 -pip/_vendor/requests/sessions.py,sha256=KUqJcRRLovNefUs7ScOXSUVCcfSayTFWtbiJ7gOSlTI,30180 -pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 -pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 -pip/_vendor/requests/utils.py,sha256=0gzSOcx9Ya4liAbHnHuwt4jM78lzCZZoDFgkmsInNUg,33240 -pip/_vendor/resolvelib/__init__.py,sha256=UL-B2BDI0_TRIqkfGwLHKLxY-LjBlomz7941wDqzB1I,537 -pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc,, -pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc,, -pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 -pip/_vendor/resolvelib/providers.py,sha256=roVmFBItQJ0TkhNua65h8LdNny7rmeqVEXZu90QiP4o,5872 -pip/_vendor/resolvelib/reporters.py,sha256=fW91NKf-lK8XN7i6Yd_rczL5QeOT3sc6AKhpaTEnP3E,1583 -pip/_vendor/resolvelib/resolvers.py,sha256=2wYzVGBGerbmcIpH8cFmgSKgLSETz8jmwBMGjCBMHG4,17592 -pip/_vendor/resolvelib/structs.py,sha256=IVIYof6sA_N4ZEiE1C1UhzTX495brCNnyCdgq6CYq28,4794 -pip/_vendor/rich/__init__.py,sha256=zREyQ22R3zKg8gMdhiikczdVQYtZNeayHNrbBg5scm0,5944 -pip/_vendor/rich/__main__.py,sha256=BmTmBWI93ytq75IEPi1uAAdeRYzFfDbgaAXjsX1ogig,8808 -pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/abc.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/align.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/bar.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/box.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/cells.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/color.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/columns.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/console.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/containers.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/control.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/errors.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/json.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/layout.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/live.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/logging.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/markup.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/measure.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/padding.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/pager.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/palette.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/panel.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/progress.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/region.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/repr.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/rule.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/scope.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/screen.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/segment.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/status.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/style.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/styled.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/table.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/text.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/theme.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/themes.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/tree.cpython-311.pyc,, -pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 -pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 -pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 -pip/_vendor/rich/_export_format.py,sha256=nHArqOljIlYn6NruhWsAsh-fHo7oJC3y9BDJyAa-QYQ,2114 -pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 -pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 -pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 -pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 -pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 -pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 -pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472 -pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 -pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 -pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 -pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820 -pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926 -pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 -pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840 -pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 -pip/_vendor/rich/align.py,sha256=FV6_GS-8uhIyViMng3hkIWSFaTgMohK1Oqyjl8I8mGE,10368 -pip/_vendor/rich/ansi.py,sha256=HtaPG7dvgL6_yo0sQmx5CM05DJ4_1goY5SWXXOYNaKs,6820 -pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 -pip/_vendor/rich/box.py,sha256=1Iv1sUWqjtp5XwLwGH-AJ8HgyXZ7dRFUkO0z3M_bRl8,9864 -pip/_vendor/rich/cells.py,sha256=zMjFI15wCpgjLR14lHdfFMVC6qMDi5OsKIB0PYZBBMk,4503 -pip/_vendor/rich/color.py,sha256=kp87L8V4-3qayE6CUxtW_nP8Ujfew_-DAhNwYMXBMOY,17957 -pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 -pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 -pip/_vendor/rich/console.py,sha256=bTT9DNX03V4cQXefg22d-gLSs_e_ZY2zdCvLIlEyU2Q,95885 -pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 -pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 -pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630 -pip/_vendor/rich/default_styles.py,sha256=WqVh-RPNEsx0Wxf3fhS_fCn-wVqgJ6Qfo-Zg7CoCsLE,7954 -pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972 -pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 -pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 -pip/_vendor/rich/file_proxy.py,sha256=4gCbGRXg0rW35Plaf0UVvj3dfENHuzc_n8I_dBqxI7o,1616 -pip/_vendor/rich/filesize.py,sha256=yShoVpARafJBreyZFaAhC4OhnJ6ydC1WXR-Ez4wU_YQ,2507 -pip/_vendor/rich/highlighter.py,sha256=3WW6PACGlq0e3YDjfqiMBQ0dYZwu7pcoFYUgJy01nb0,9585 -pip/_vendor/rich/json.py,sha256=RCm4lXBXrjvXHpqrWPH8wdGP0jEo4IohLmkddlhRY18,5051 -pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 -pip/_vendor/rich/layout.py,sha256=E3xJ4fomizUADwime3VA0lBXoMSPl9blEokIzVBjO0Q,14074 -pip/_vendor/rich/live.py,sha256=emVaLUua-FKSYqZXmtJJjBIstO99CqMOuA6vMAKVkO0,14172 -pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667 -pip/_vendor/rich/logging.py,sha256=10j13lPr-QuYqEEBz_2aRJp8gNYvSN2wmCUlUqJcPLM,11471 -pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198 -pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 -pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 -pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 -pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 -pip/_vendor/rich/panel.py,sha256=CzdojkDAjxAKgvDxis47nWzUh1V2NniOqkJJQajosG8,8744 -pip/_vendor/rich/pretty.py,sha256=CalVLVW3mvTn1hvI9Pgi2v-y4S-5zUWBK-PH7SlVs-U,36576 -pip/_vendor/rich/progress.py,sha256=zjQRwd3TmDnAvSjTPsNPHFjmqE9GOEX3bf0Lj56hIL8,59746 -pip/_vendor/rich/progress_bar.py,sha256=zHHaFPEfIhW2fq6Fnl5vBY7AUpP1N0HVGElISUHsnqw,8161 -pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303 -pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 -pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 -pip/_vendor/rich/repr.py,sha256=Je91CIrZN_av9L3FRCKCs5yoX2LvczrCNKqUbVsjUvQ,4449 -pip/_vendor/rich/rule.py,sha256=V6AWI0wCb6DB0rvN967FRMlQrdlG7HoZdfEAHyeG8CM,4773 -pip/_vendor/rich/scope.py,sha256=HX13XsJfqzQHpPfw4Jn9JmJjCsRj9uhHxXQEqjkwyLA,2842 -pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 -pip/_vendor/rich/segment.py,sha256=6XdX0MfL18tUCaUWDWncIqx0wpq3GiaqzhYP779JvRA,24224 -pip/_vendor/rich/spinner.py,sha256=7b8MCleS4fa46HX0AzF98zfu6ZM6fAL0UgYzPOoakF4,4374 -pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 -pip/_vendor/rich/style.py,sha256=4WnUEkHNMp9Tfmd8cmbxWGby7QeTk2LUTQzFSs46EQc,26240 -pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 -pip/_vendor/rich/syntax.py,sha256=_M08KbE11nNWNBPooFLKAA7lWkThPzlGUsuesxQYsuA,34697 -pip/_vendor/rich/table.py,sha256=r_lahmj45cINCWLYaIjq9yEv3gve8E6bkYTP8NDqApE,39515 -pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 -pip/_vendor/rich/text.py,sha256=oajdGIeHcLcSdOwbC48_20ylDsHAS5fsPZD_Ih0clyA,44666 -pip/_vendor/rich/theme.py,sha256=GKNtQhDBZKAzDaY0vQVQQFzbc0uWfFe6CJXA-syT7zQ,3627 -pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 -pip/_vendor/rich/traceback.py,sha256=MORQpXH7AvhAAThW8oIbtwffXb8M6XRkSkcJ52JuA3g,26060 -pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 -pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 -pip/_vendor/tenacity/__init__.py,sha256=rjcWJVq5PcNJNC42rt-TAGGskM-RUEkZbDKu1ra7IPo,18364 -pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc,, -pip/_vendor/tenacity/_asyncio.py,sha256=HEb0BVJEeBJE9P-m9XBxh1KcaF96BwoeqkJCL5sbVcQ,3314 -pip/_vendor/tenacity/_utils.py,sha256=-y68scDcyoqvTJuJJ0GTfjdSCljEYlbCYvgk7nM4NdM,1944 -pip/_vendor/tenacity/after.py,sha256=dlmyxxFy2uqpLXDr838DiEd7jgv2AGthsWHGYcGYsaI,1496 -pip/_vendor/tenacity/before.py,sha256=7XtvRmO0dRWUp8SVn24OvIiGFj8-4OP5muQRUiWgLh0,1376 -pip/_vendor/tenacity/before_sleep.py,sha256=ThyDvqKU5yle_IvYQz_b6Tp6UjUS0PhVp6zgqYl9U6Y,1908 -pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 -pip/_vendor/tenacity/retry.py,sha256=Cy504Ss3UrRV7lnYgvymF66WD1wJ2dbM869kDcjuDes,7550 -pip/_vendor/tenacity/stop.py,sha256=sKHmHaoSaW6sKu3dTxUVKr1-stVkY7lw4Y9yjZU30zQ,2790 -pip/_vendor/tenacity/tornadoweb.py,sha256=E8lWO2nwe6dJgoB-N2HhQprYLDLB_UdSgFnv-EN6wKE,2145 -pip/_vendor/tenacity/wait.py,sha256=tdLTESRm5E237VHG0SxCDXRa0DHKPKVq285kslHVURc,8011 -pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 -pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc,, -pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc,, -pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc,, -pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 -pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 -pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 -pip/_vendor/typing_extensions.py,sha256=VKZ_nHsuzDbKOVUY2CTdavwBgfZ2EXRyluZHRzUYAbg,80114 -pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333 -pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc,, -pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 -pip/_vendor/urllib3/_version.py,sha256=GhuGBUT_MtRxHEHDb-LYs5yLPeYWlCwFBPjGZmVJbVg,64 -pip/_vendor/urllib3/connection.py,sha256=8976wL6sGeVMW0JnXvx5mD00yXu87uQjxtB9_VL8dx8,20070 -pip/_vendor/urllib3/connectionpool.py,sha256=vEzk1iJEw1qR2vHBo7m3Y98iDfna6rKkUz3AyK5lJKQ,39093 -pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 -pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632 -pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 -pip/_vendor/urllib3/contrib/appengine.py,sha256=lfzpHFmJiO82shClLEm3QB62SYgHWnjpZOH_2JhU5Tc,11034 -pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=ej9gGvfAb2Gt00lafFp45SIoRz-QwrQ4WChm6gQmAlM,4538 -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=rt9NEIP8iMBLxxRhH0jLnmshW-OFP83jEayxMSqu2MU,17182 -pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448 -pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 -pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 -pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 -pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 -pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc,, -pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc,, -pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 -pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 -pip/_vendor/urllib3/poolmanager.py,sha256=0KOOJECoeLYVjUHvv-0h4Oq3FFQQ2yb-Fnjkbj8gJO0,19786 -pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985 -pip/_vendor/urllib3/response.py,sha256=p3VBYPhwBca77wCZfmoXvEDVVC3SdF7yxQ6TXuxy1BI,30109 -pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 -pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc,, -pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 -pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 -pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 -pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997 -pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 -pip/_vendor/urllib3/util/retry.py,sha256=iESg2PvViNdXBRY4MpL4h0kqwOOkHkxmLn1kkhFHPU8,22001 -pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 -pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758 -pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 -pip/_vendor/urllib3/util/timeout.py,sha256=QSbBUNOB9yh6AnDn61SrLQ0hg5oz0I9-uXEG91AJuIg,10003 -pip/_vendor/urllib3/util/url.py,sha256=49HwObaTUUjqVe4qvSUvIjZyf3ghgNA6-OLm3kmkFKM,14287 -pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 -pip/_vendor/vendor.txt,sha256=07gLL_CcEHdl1XM0g4PH2L4gsTTMlJr8WWIC11yEyMo,469 -pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 -pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc,, -pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc,, -pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc,, -pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc,, -pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 -pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 -pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 -pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 -pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/.venv/Lib/site-packages/pip-23.1.2.dist-info/AUTHORS.txt b/.venv/Lib/site-packages/pip-23.1.2.dist-info/AUTHORS.txt new file mode 100644 index 00000000..e9d3c389 --- /dev/null +++ b/.venv/Lib/site-packages/pip-23.1.2.dist-info/AUTHORS.txt @@ -0,0 +1,728 @@ +@Switch01 +A_Rog +Aakanksha Agrawal +Abhinav Sagar +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Alberto Sottile +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Hedges +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andre Aguiar +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrew Shymanel +Andrey Bienkowski +Andrey Bulgakov +Andrés Delfino +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anudit Nagar +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Arun Babu Neelicattu +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avinash Karhana +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Bodenmiller +Ben Darnell +Ben Hoyt +Ben Mares +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernard +Bernard Tyers +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bhavam Vidyarthi +Blazej Michalik +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brett Rosen +Brian Cristante +Brian Rosner +briantracy +BrownTruck +Bruno Oliveira +Bruno Renié +Bruno S +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +bwoodsend +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Pawley +Chris Pryer +Chris Wolfe +Christian Clauss +Christian Heimes +Christian Oudard +Christoph Reiter +Christopher Hunt +Christopher Snyder +cjc7373 +Clark Boylan +Claudio Jolowicz +Clay McClure +Cody +Cody Soyland +Colin Watson +Collin Anderson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Cristina +Cristina Muñoz +Curtis Doty +cytolentino +Daan De Meyer +Damian +Damian Quiroga +Damian Shaw +Dan Black +Dan Savilonis +Dan Sully +Dane Hillard +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Katz +Daniel Shaulov +Daniele Esposti +Daniele Nicolodi +Daniele Procida +Daniil Konovalenko +Danny Hermes +Danny McClanahan +Darren Kavanagh +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Caro +David D Lowe +David Evans +David Hewitt +David Linke +David Poggi +David Pursehouse +David Runge +David Tucker +David Wales +Davidovich +Deepak Sharma +Deepyaman Datta +Denise Yu +derwolfe +Desetude +Devesh Kumar Singh +Diego Caraballo +Diego Ramirez +DiegoCaraballo +Dimitri Merejkowsky +Dimitri Papadopoulos +Dirk Stolle +Dmitry Gladkov +Dmitry Volodin +Domen Kožar +Dominic Davis-Foster +Donald Stufft +Dongweiming +doron zarhi +Dos Moonen +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley +Edgar Ramírez +Ee Durbin +Eitan Adler +ekristina +elainechan +Eli Schwartz +Elisha Hollander +Ellen Marie Dash +Emil Burzo +Emil Styrke +Emmanuel Arias +Endoh Takanao +enoch +Erdinc Mutlu +Eric Cousineau +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Erwin Janssen +Eugene Vereshchagin +everdimension +Federico +Felipe Peter +Felix Yan +fiber-space +Filip Kokosiński +Filipe Laíns +Finn Womack +finnagin +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gavin +gdanielson +Geoffrey Sneddon +George Song +Georgi Valkov +Georgy Pchelkin +ghost +Giftlin Rajaiah +gizmoguy1 +gkdoc +Godefroid Chapelle +Gopinath M +GOTO Hayato +gousaiyang +gpiks +Greg Roodt +Greg Ward +Guilherme Espada +Guillaume Seguin +gutsytechster +Guy Rozendorn +Guy Tuval +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +harupy +Harutaka Kawamura +hauntsaninja +Henrich Hartzer +Henry Schreiner +Herbert Pfennig +Holly Stotelmyer +Honnix +Hsiaoming Yang +Hugo Lopes Tavares +Hugo van Kemenade +Hugues Bruant +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilan Schnell +Illia Volochii +Ilya Baryshev +Inada Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +Jacob Walls +Jaime Sanz +jakirkham +Jakub Kuczys +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Curtin +James Firth +James Gerity +James Polley +Jan Pokorný +Jannis Leidel +Jarek Potiuk +jarondl +Jason Curtis +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jesse Rittner +Jiashuo Li +Jim Fisher +Jim Garrison +Jiun Bae +Jivan Amara +Joe Michelini +John Paton +John T. Wodder II +John-Scott Atlakson +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joonatan Partanen +Joost Molenaar +Jorge Niedbalski +Joseph Bylund +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juan Luis Cano Rodríguez +Juanjo Bazán +Judah Rand +Julian Berman +Julian Gethmann +Julien Demoor +Jussi Kukkonen +jwg4 +Jyrki Pulliainen +Kai Chen +Kai Mueller +Kamal Bin Mustafa +kasium +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +Klaas van Schelven +KOLANICH +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurent LAPORTE +Laurie O +Laurie Opperman +layday +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +lorddavidiii +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Lukas Juhrich +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +M00nL1ght +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Markus Hametner +Martey Dodoo +Martin Fischer +Martin Häcker +Martin Pavlasek +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Mathieu Kniewallner +Matt Bacchi +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Feickert +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maurits van Rees +Max W Chase +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna +mdebi +memoselyk +meowmeowcat +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Mintz +Michael Williamson +michaelpacer +Michał Górny +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Muha Ajjan‮ +Nadav Wexler +Nahuel Ambrosini +Nate Coraor +Nate Prewitt +Nathan Houghton +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nguyễn Gia Phong +Nicholas Serra +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nicole Harris +Nikhil Benesch +Nikhil Ladha +Nikita Chepanov +Nikolay Korolev +Nipunn Koorapati +Nitesh Sharma +Niyas Sait +Noah +Noah Gorny +Nowell Strite +NtaleGrey +nvdv +OBITORASU +Ofek Lev +ofrinevo +Oliver Freund +Oliver Jeeves +Oliver Mannion +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +onlinejudge95 +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavel Safronov +Pavithra Eswaramoorthy +Pawel Jasinski +Paweł Szramowski +Pekka Klärck +Peter Gessler +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Elson +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +Pieter Degroote +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Prashant Sharma +Pratik Mallya +pre-commit-ci[bot] +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal +q0w +Qiangning Hong +Quentin Lee +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Reece Dunham +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Riccardo Schirone +Richard Jones +Richard Si +Ricky Ng-Adam +Rishi +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Roman Bogorodskiy +Roman Donchenko +Romuald Brunet +ronaudinho +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Ruairidh MacLeod +Russell Keith-Magee +Ryan Shepherd +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +sandeepkiran-js +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Michael Larson +Seth Woodworth +shireenrao +Shivansh-007 +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +sinscary +snook92 +socketubs +Sorin Sbarnea +Srinivas Nyayapati +Stavros Korokithakis +Stefan Scherfke +Stefano Rivera +Stephan Erb +Stephen Rosen +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul +Stéphane Bidoul (ACSONE) +Stéphane Klein +Sumana Harihareswara +Surbhi Sharma +Sviatoslav Sydorenko +Swat009 +Sylvain +Takayuki SHIMIZUKAWA +Taneli Hukkinen +tbeswick +Thiago +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Thomas VINCENT +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tobias Hermann +Tom Forbes +Tom Freudenheim +Tom V +Tomas Hrnciar +Tomas Orsava +Tomer Chachamu +Tommi Enenkel | AnB +Tomáš Hrnčiar +Tony Beswick +Tony Narlock +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +toxinu +Travis Swicegood +Tushar Sadhwani +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Vikram - Google +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo +Vipul Kumar +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William Edwards +William ML Leslie +William T Olson +William Woodruff +Wilson Mo +wim glenn +Winson Luk +Wolfgang Maier +XAMES3 +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Yusuke Hayashi +Zearin +Zhiping Deng +ziebam +Zvezdan Petkovic +Łukasz Langa +Роман Донченко +Семён Марьясин +‮rekcäH nitraM‮ diff --git a/.venv/Lib/site-packages/pip-22.3.dist-info/top_level.txt b/.venv/Lib/site-packages/pip-23.1.2.dist-info/INSTALLER similarity index 100% rename from .venv/Lib/site-packages/pip-22.3.dist-info/top_level.txt rename to .venv/Lib/site-packages/pip-23.1.2.dist-info/INSTALLER diff --git a/.venv/Lib/site-packages/pip-22.3.dist-info/LICENSE.txt b/.venv/Lib/site-packages/pip-23.1.2.dist-info/LICENSE.txt similarity index 100% rename from .venv/Lib/site-packages/pip-22.3.dist-info/LICENSE.txt rename to .venv/Lib/site-packages/pip-23.1.2.dist-info/LICENSE.txt diff --git a/.venv/Lib/site-packages/pip-23.1.2.dist-info/METADATA b/.venv/Lib/site-packages/pip-23.1.2.dist-info/METADATA new file mode 100644 index 00000000..1d78cd6b --- /dev/null +++ b/.venv/Lib/site-packages/pip-23.1.2.dist-info/METADATA @@ -0,0 +1,89 @@ +Metadata-Version: 2.1 +Name: pip +Version: 23.1.2 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: distutils-sig@python.org +License: MIT +Project-URL: Documentation, https://pip.pypa.io +Project-URL: Source, https://github.com/pypa/pip +Project-URL: Changelog, https://pip.pypa.io/en/stable/news/ +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=3.7 +License-File: LICENSE.txt +License-File: AUTHORS.txt + +pip - The Python Package Installer +================================== + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + +Please take a look at our documentation for how to install and use pip: + +* `Installation`_ +* `Usage`_ + +We release updates regularly, with a new version every 3 months. Find more details in our documentation: + +* `Release notes`_ +* `Release process`_ + +In pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right. + +**Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3. + +If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms: + +* `Issue tracking`_ +* `Discourse channel`_ +* `User IRC`_ + +If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: + +* `GitHub page`_ +* `Development documentation`_ +* `Development IRC`_ + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. + +.. _package installer: https://packaging.python.org/guides/tool-recommendations/ +.. _Python Package Index: https://pypi.org +.. _Installation: https://pip.pypa.io/en/stable/installation/ +.. _Usage: https://pip.pypa.io/en/stable/ +.. _Release notes: https://pip.pypa.io/en/stable/news.html +.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ +.. _GitHub page: https://github.com/pypa/pip +.. _Development documentation: https://pip.pypa.io/en/latest/development +.. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html +.. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020 +.. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html +.. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support +.. _Issue tracking: https://github.com/pypa/pip/issues +.. _Discourse channel: https://discuss.python.org/c/packaging +.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa +.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev +.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md diff --git a/.venv/Lib/site-packages/pip-23.1.2.dist-info/RECORD b/.venv/Lib/site-packages/pip-23.1.2.dist-info/RECORD new file mode 100644 index 00000000..d2049c98 --- /dev/null +++ b/.venv/Lib/site-packages/pip-23.1.2.dist-info/RECORD @@ -0,0 +1,1002 @@ +../../Scripts/pip.exe,sha256=Vy2Ddeyi046k-J9CA4uSBtwS9tq0DGnAwm9DrjUeqPQ,108410 +../../Scripts/pip3.10.exe,sha256=Vy2Ddeyi046k-J9CA4uSBtwS9tq0DGnAwm9DrjUeqPQ,108410 +../../Scripts/pip3.11.exe,sha256=Vy2Ddeyi046k-J9CA4uSBtwS9tq0DGnAwm9DrjUeqPQ,108410 +../../Scripts/pip3.exe,sha256=Vy2Ddeyi046k-J9CA4uSBtwS9tq0DGnAwm9DrjUeqPQ,108410 +pip-23.1.2.dist-info/AUTHORS.txt,sha256=jSm1kaQ_vyQT9okSyrkw4UwuV7pHe4YdRbe0SXlII7M,9953 +pip-23.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-23.1.2.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 +pip-23.1.2.dist-info/METADATA,sha256=JdKOqvMB-GvL6YqlpzVj8GdZWTS9McdZl1ZgrtSEG1s,4098 +pip-23.1.2.dist-info/RECORD,, +pip-23.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip-23.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +pip-23.1.2.dist-info/entry_points.txt,sha256=ynZN1_707_L23Oa8_O5LOxEoccj1nDa4xHT5galfN7o,125 +pip-23.1.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=Pv_sjuHtJzvM0jQXcdcU9-1oCl3Q8kvk9vDi1hb_NsQ,357 +pip/__main__.py,sha256=mXwWDftNLMKfwVqKFWGE_uuBZvGSIiUELhLkeysIuZc,1198 +pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444 +pip/__pycache__/__init__.cpython-311.pyc,, +pip/__pycache__/__main__.cpython-311.pyc,, +pip/__pycache__/__pip-runner__.cpython-311.pyc,, +pip/_internal/__init__.py,sha256=nnFCuxrPMgALrIDxSoy-H6Zj4W4UY60D-uL1aJyq0pc,573 +pip/_internal/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/__pycache__/build_env.cpython-311.pyc,, +pip/_internal/__pycache__/cache.cpython-311.pyc,, +pip/_internal/__pycache__/configuration.cpython-311.pyc,, +pip/_internal/__pycache__/exceptions.cpython-311.pyc,, +pip/_internal/__pycache__/main.cpython-311.pyc,, +pip/_internal/__pycache__/pyproject.cpython-311.pyc,, +pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc,, +pip/_internal/__pycache__/wheel_builder.cpython-311.pyc,, +pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243 +pip/_internal/cache.py,sha256=iNWWYOXtGLUFZQyo3ojH95kqo_nVQcenRrC-G9jmItQ,9661 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-311.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc,, +pip/_internal/cli/__pycache__/command_context.cpython-311.pyc,, +pip/_internal/cli/__pycache__/main.cpython-311.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-311.pyc,, +pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc,, +pip/_internal/cli/__pycache__/req_command.cpython-311.pyc,, +pip/_internal/cli/__pycache__/spinners.cpython-311.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc,, +pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676 +pip/_internal/cli/base_command.py,sha256=ZRv0-JMQsrTKN16CPnm49DcVxEmb7kT21m22ahdBNOg,8176 +pip/_internal/cli/cmdoptions.py,sha256=0bXhKutppZLBgAL54iK3tTrj-JRVbUB5M_2pHv_wnKk,30030 +pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 +pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816 +pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338 +pip/_internal/cli/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817 +pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 +pip/_internal/cli/req_command.py,sha256=XajWVmfnVs3LCuXea9cXq9LH76z7uau_4gYH-ykAtto,18328 +pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118 +pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 +pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 +pip/_internal/commands/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/commands/__pycache__/cache.cpython-311.pyc,, +pip/_internal/commands/__pycache__/check.cpython-311.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-311.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-311.pyc,, +pip/_internal/commands/__pycache__/debug.cpython-311.pyc,, +pip/_internal/commands/__pycache__/download.cpython-311.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-311.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-311.pyc,, +pip/_internal/commands/__pycache__/help.cpython-311.pyc,, +pip/_internal/commands/__pycache__/index.cpython-311.pyc,, +pip/_internal/commands/__pycache__/inspect.cpython-311.pyc,, +pip/_internal/commands/__pycache__/install.cpython-311.pyc,, +pip/_internal/commands/__pycache__/list.cpython-311.pyc,, +pip/_internal/commands/__pycache__/search.cpython-311.pyc,, +pip/_internal/commands/__pycache__/show.cpython-311.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/commands/cache.py,sha256=aDR3pKRRX9dHobQ2HzKryf02jgOZnGcnfEmX_288Vcg,7581 +pip/_internal/commands/check.py,sha256=mLRKTaGDmLuZbZ--kO1nNKoRMYWIsL3fNQ3vm5Fpuks,1684 +pip/_internal/commands/completion.py,sha256=H0TJvGrdsoleuIyQKzJbicLFppYx2OZA0BLNpQDeFjI,4129 +pip/_internal/commands/configuration.py,sha256=NB5uf8HIX8-li95YLoZO09nALIWlLCHDF5aifSKcBn8,9815 +pip/_internal/commands/debug.py,sha256=AesEID-4gPFDWTwPiPaGZuD4twdT-imaGuMR5ZfSn8s,6591 +pip/_internal/commands/download.py,sha256=y2cmmNjTPT6pCQk0zT576t7fquqSPyvD9UPFVYHAmOA,5182 +pip/_internal/commands/freeze.py,sha256=gCjoD6foBZPBAAYx5t8zZLkJhsF_ZRtnb3dPuD7beO8,2951 +pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 +pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 +pip/_internal/commands/index.py,sha256=cGQVSA5dAs7caQ9sz4kllYvaI4ZpGiq1WhCgaImXNSA,4793 +pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188 +pip/_internal/commands/install.py,sha256=pC2yZkVEnthpyjI15FWO7w5nLdQsxQyr-jdPX5Oareg,28722 +pip/_internal/commands/list.py,sha256=Fk1TSxB33NlRS4qlLQ0xwnytnF9-zkQJbKQYv2xc4Q4,12343 +pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 +pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419 +pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886 +pip/_internal/commands/wheel.py,sha256=2zbo8lj55F_VlGbgVcp0Wtd94IyfnXvrIUKZuyAM_Yc,6324 +pip/_internal/configuration.py,sha256=uBKTus43pDIO6IzT2mLWQeROmHhtnoabhniKNjPYvD0,13529 +pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 +pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/distributions/__pycache__/base.cpython-311.pyc,, +pip/_internal/distributions/__pycache__/installed.cpython-311.pyc,, +pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc,, +pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/distributions/base.py,sha256=jrF1Vi7eGyqFqMHrieh1PIOrGU7KeCxhYPZnbvtmvGY,1221 +pip/_internal/distributions/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729 +pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494 +pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164 +pip/_internal/exceptions.py,sha256=OlP4qYnrsv2AJ0RsPglO48fUKrbEmr0U7OBnjMJZsRM,23741 +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 +pip/_internal/index/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/index/__pycache__/collector.cpython-311.pyc,, +pip/_internal/index/__pycache__/package_finder.cpython-311.pyc,, +pip/_internal/index/__pycache__/sources.cpython-311.pyc,, +pip/_internal/index/collector.py,sha256=3OmYZ3tCoRPGOrELSgQWG-03M-bQHa2-VCA3R_nJAaU,16504 +pip/_internal/index/package_finder.py,sha256=rrUw4vj7QE_eMt022jw--wQiKznMaUgVBkJ1UCrVUxo,37873 +pip/_internal/index/sources.py,sha256=7jw9XSeeQA5K-H4I5a5034Ks2gkQqm4zPXjrhwnP1S4,6556 +pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365 +pip/_internal/locations/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc,, +pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc,, +pip/_internal/locations/__pycache__/base.cpython-311.pyc,, +pip/_internal/locations/_distutils.py,sha256=cmi6h63xYNXhQe7KEWEMaANjHFy5yQOPt_1_RCWyXMY,6100 +pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680 +pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556 +pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 +pip/_internal/metadata/__init__.py,sha256=84j1dPJaIoz5Q2ZTPi0uB1iaDAHiUNfKtYSGQCfFKpo,4280 +pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/metadata/__pycache__/_json.cpython-311.pyc,, +pip/_internal/metadata/__pycache__/base.cpython-311.pyc,, +pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc,, +pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595 +pip/_internal/metadata/base.py,sha256=vIwIo1BtoqegehWMAXhNrpLGYBq245rcaCNkBMPnTU8,25277 +pip/_internal/metadata/importlib/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107 +pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc,, +pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc,, +pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc,, +pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882 +pip/_internal/metadata/importlib/_dists.py,sha256=BUV8y6D0PePZrEN3vfJL-m1FDqZ6YPRgAiBeBinHhNg,8181 +pip/_internal/metadata/importlib/_envs.py,sha256=7BxanCh3T7arusys__O2ZHJdnmDhQXFmfU7x1-jB5xI,7457 +pip/_internal/metadata/pkg_resources.py,sha256=WjwiNdRsvxqxL4MA5Tb5a_q3Q3sUhdpbZF8wGLtPMI0,9773 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-311.pyc,, +pip/_internal/models/__pycache__/direct_url.cpython-311.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-311.pyc,, +pip/_internal/models/__pycache__/index.cpython-311.pyc,, +pip/_internal/models/__pycache__/installation_report.cpython-311.pyc,, +pip/_internal/models/__pycache__/link.cpython-311.pyc,, +pip/_internal/models/__pycache__/scheme.cpython-311.pyc,, +pip/_internal/models/__pycache__/search_scope.cpython-311.pyc,, +pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc,, +pip/_internal/models/__pycache__/target_python.cpython-311.pyc,, +pip/_internal/models/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/models/candidate.py,sha256=6pcABsaR7CfIHlbJbr2_kMkVJFL_yrYjTx6SVWUnCPQ,990 +pip/_internal/models/direct_url.py,sha256=EepBxI97j7wSZ3AmRETYyVTmR9NoTas15vc8popxVTg,6931 +pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520 +pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 +pip/_internal/models/installation_report.py,sha256=hMnB70yU3M9p_TwIMMgsRWyVrzbQAQUpDzaBReGx3Gw,2619 +pip/_internal/models/link.py,sha256=CIKGwdkZMKsEz9atYBWlA6r__W_Ay-lb0Qc-IfHTKRc,18817 +pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 +pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643 +pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 +pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858 +pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600 +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 +pip/_internal/network/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/network/__pycache__/auth.cpython-311.pyc,, +pip/_internal/network/__pycache__/cache.cpython-311.pyc,, +pip/_internal/network/__pycache__/download.cpython-311.pyc,, +pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc,, +pip/_internal/network/__pycache__/session.cpython-311.pyc,, +pip/_internal/network/__pycache__/utils.cpython-311.pyc,, +pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc,, +pip/_internal/network/auth.py,sha256=vYF_9v28qVZnKNVKppKk6CtPkJTE4ugv0HCGNLitMPg,20435 +pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145 +pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096 +pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638 +pip/_internal/network/session.py,sha256=J36m7MhXDI20J91izrQQRjZSSpe0LIJVjPWuYgIfKr0,18442 +pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 +pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/operations/__pycache__/check.cpython-311.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-311.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-311.pyc,, +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc,, +pip/_internal/operations/build/build_tracker.py,sha256=vf81EwomN3xe9G8qRJED0VGqNikmRQRQoobNsxi5Xrs,4133 +pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422 +pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474 +pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198 +pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075 +pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417 +pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064 +pip/_internal/operations/check.py,sha256=WsN7z0_QSgJjw0JsWWcqOHj4wWTaFv0J7mxgUByDCOg,5122 +pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816 +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 +pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc,, +pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282 +pip/_internal/operations/install/wheel.py,sha256=8lsVMt_FAuiGNsf_e7C7_cCSOEO7pHyjgVmRNx-WXrw,27475 +pip/_internal/operations/prepare.py,sha256=BYGWpsCLA33UO9u5t4xjuY3KkAGCySH7e__4uChd7Lc,27696 +pip/_internal/pyproject.py,sha256=ltmrXWaMXjiJHbYyzWplTdBvPYPdKk99GjKuQVypGZU,7161 +pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738 +pip/_internal/req/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-311.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-311.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-311.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-311.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc,, +pip/_internal/req/constructors.py,sha256=8YE-eNXMSZ1lgsJZg-HnIo8EdaGfiOM2t3EaLlLD5Og,16610 +pip/_internal/req/req_file.py,sha256=5PCO4GnDEnUENiFj4vD_1QmAMjHNtvN6HXbETZ9UGok,17872 +pip/_internal/req/req_install.py,sha256=2j8EO2EFmNVbTHlV2G_hlXA0IowMgl7Ss8zby5ce81A,32782 +pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858 +pip/_internal/req/req_uninstall.py,sha256=sGwa_yZ6X2NcRSUJWzUlYkf8bDEjRySAE3aQ5OewIWA,24678 +pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/resolution/__pycache__/base.cpython-311.pyc,, +pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583 +pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc,, +pip/_internal/resolution/legacy/resolver.py,sha256=th-eTPIvbecfJaUsdrbH1aHQvDV2yCE-RhrrpsJhKbE,24128 +pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/base.py,sha256=u1O4fkvCO4mhmu5i32xrDv9AX5NgUci_eYVyBDQhTIM,5220 +pip/_internal/resolution/resolvelib/candidates.py,sha256=CsMXw1Gi0YpoyoZfLL6Epr7dgJOrTCD9kbrpJ1fZGGw,18864 +pip/_internal/resolution/resolvelib/factory.py,sha256=y1Q2fsV1GKDKPitoapOLLEs75WNzEpd4l_RezCt927c,27845 +pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705 +pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824 +pip/_internal/resolution/resolvelib/reporter.py,sha256=UPwUUZNFynQaG19i41hvPtBNun1WcJYSfEXQJwJQn1o,3094 +pip/_internal/resolution/resolvelib/requirements.py,sha256=zHnERhfubmvKyM3kgdAOs0dYFiqUfzKR-DAt4y0NWOI,5454 +pip/_internal/resolution/resolvelib/resolver.py,sha256=o4YmRqMGINoEU9hJqjdAzaFMk752UOL-tABtZ--hX-4,11538 +pip/_internal/self_outdated_check.py,sha256=pnqBuKKZQ8OxKP0MaUUiDHl3AtyoMJHHG4rMQ7YcYXY,8167 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc,, +pip/_internal/utils/__pycache__/_log.cpython-311.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-311.pyc,, +pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc,, +pip/_internal/utils/__pycache__/datetime.cpython-311.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc,, +pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc,, +pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-311.pyc,, +pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc,, +pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-311.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-311.pyc,, +pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-311.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-311.pyc,, +pip/_internal/utils/__pycache__/models.cpython-311.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-311.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc,, +pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc,, +pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc,, +pip/_internal/utils/__pycache__/urls.cpython-311.pyc,, +pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc,, +pip/_internal/utils/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351 +pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 +pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665 +pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 +pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 +pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 +pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627 +pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 +pip/_internal/utils/egg_link.py,sha256=ZryCchR_yQSCsdsMkCpxQjjLbQxObA5GDtLG0RR5mGc,2118 +pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 +pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064 +pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122 +pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 +pip/_internal/utils/glibc.py,sha256=tDfwVYnJCOC0BNVpItpy8CGLP9BjkxFHdl0mTS0J7fc,3110 +pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118 +pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795 +pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632 +pip/_internal/utils/misc.py,sha256=vNaFNUvqda2K5g7tUJg8xnw40e9YBhtPQ-kvBaU3Xwo,22216 +pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 +pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 +pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435 +pip/_internal/utils/subprocess.py,sha256=0EMhgfPGFk8FZn6Qq7Hp9PN6YHuQNWiVby4DXcTCON4,9200 +pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702 +pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 +pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759 +pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456 +pip/_internal/utils/wheel.py,sha256=lXOgZyTlOm5HmK8tw5iw0A3_5A6wRzsXHOaQkIvvloU,4549 +pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 +pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc,, +pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519 +pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116 +pip/_internal/vcs/mercurial.py,sha256=Bzbd518Jsx-EJI0IhIobiQqiRsUv5TWYnrmRIFWE0Gw,5238 +pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729 +pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811 +pip/_internal/wheel_builder.py,sha256=3UlHfxQi7_AAXI7ur8aPpPbmqHhecCsubmkHEl-00KU,11842 +pip/_vendor/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966 +pip/_vendor/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/__pycache__/six.cpython-311.pyc,, +pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc,, +pip/_vendor/cachecontrol/__init__.py,sha256=hrxlv3q7upsfyMw8k3gQ9vagBax1pYHSGGqYlZ0Zk0M,465 +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=lxUXqfNTVx84zf6tcWbkLZHA6WVBRtJRpfeA9ZqhaAY,1379 +pip/_vendor/cachecontrol/adapter.py,sha256=ew9OYEQHEOjvGl06ZsuX8W3DAvHWsQKHwWAxISyGug8,5033 +pip/_vendor/cachecontrol/cache.py,sha256=Tty45fOjH40fColTGkqKQvQQmbYsMpk-nCyfLcv2vG4,1535 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=h-1cUmOz6mhLsjTjOrJ8iPejpGdLCyG4lzTftfGZvLg,242 +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=GpexcE29LoY4MaZwPUTcUBZaDdcsjqyLxZFznk8Hbr4,5271 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=mp-QWonP40I3xJGK3XVO-Gs9a3UjzlqqEmp9iLJH9F4,1033 +pip/_vendor/cachecontrol/compat.py,sha256=LNx7vqBndYdHU8YuJt53ab_8rzMGTXVrvMb7CZJkxG0,778 +pip/_vendor/cachecontrol/controller.py,sha256=bAYrt7x_VH4toNpI066LQxbHpYGpY1MxxmZAhspplvw,16416 +pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx_15MyFBpcs,3946 +pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154 +pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105 +pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774 +pip/_vendor/certifi/__init__.py,sha256=bK_nm9bLJzNvWZc2oZdiTwg2KWD4HSPBWGaM0zUDvMw,94 +pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 +pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-311.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=LBHDzgj_xA05AxnHK8ENT5COnGNElNZe0svFUHMf1SQ,275233 +pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279 +pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797 +pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-311.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274 +pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763 +pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032 +pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915 +pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420 +pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242 +pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732 +pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542 +pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860 +pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683 +pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006 +pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176 +pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934 +pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566 +pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753 +pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913 +pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753 +pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735 +pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759 +pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537 +pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796 +pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498 +pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752 +pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562 +pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484 +pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196 +pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363 +pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035 +pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774 +pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372 +pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380 +pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077 +pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131 +pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391 +pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc,, +pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560 +pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402 +pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137 +pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007 +pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848 +pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505 +pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812 +pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244 +pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 +pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 +pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128 +pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325 +pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75 +pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839 +pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678 +pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741 +pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866 +pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079 +pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709 +pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181 +pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134 +pip/_vendor/distlib/__init__.py,sha256=acgfseOC55dNrVAzaBKpUiH3Z6V7Q1CaxsiQ3K7pC-E,581 +pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc,, +pip/_vendor/distlib/compat.py,sha256=tfoMrj6tujk7G4UC2owL6ArgDuCKabgBxuJRGZSmpko,41259 +pip/_vendor/distlib/database.py,sha256=o_mw0fAr93NDAHHHfqG54Y1Hi9Rkfrp2BX15XWZYK50,51697 +pip/_vendor/distlib/index.py,sha256=HFiDG7LMoaBs829WuotrfIwcErOOExUOR_AeBtw_TCU,20834 +pip/_vendor/distlib/locators.py,sha256=wNzG-zERzS_XGls-nBPVVyLRHa2skUlkn0-5n0trMWA,51991 +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-U,5058 +pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801 +pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 +pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102 +pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792 +pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784 +pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032 +pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262 +pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513 +pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648 +pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448 +pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888 +pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898 +pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 +pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 +pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/distro/__pycache__/distro.cpython-311.pyc,, +pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330 +pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 +pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc,, +pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 +pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 +pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950 +pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375 +pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 +pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21 +pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539 +pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132 +pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc,, +pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc,, +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079 +pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544 +pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661 +pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 +pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-311.pyc,, +pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488 +pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378 +pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 +pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487 +pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676 +pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110 +pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699 +pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 +pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 +pip/_vendor/pkg_resources/__init__.py,sha256=zKwu1wVTPPaRnIoMaLnVCJYQ3ACX9m9SxwQZL2HQZwc,109388 +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/platformdirs/__init__.py,sha256=10WMIZY4jjhhbfrm5QyVt62gbkos3_EYVoChIeKQON4,18003 +pip/_vendor/platformdirs/__main__.py,sha256=KJPgN0tJGC8bxelA092iinqNMHkJezuetgtyI36ySk4,1198 +pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc,, +pip/_vendor/platformdirs/android.py,sha256=4KwH2ns2Lpd_oGjUnVPvO-I-xRlklyBAdZAtgA-ttjo,4303 +pip/_vendor/platformdirs/api.py,sha256=CSMZAv9Dz3IvTSe5nWzkx3eZeBua0-Z0lFxzUHA-LWQ,5706 +pip/_vendor/platformdirs/macos.py,sha256=7bNQBjs8ZyrBQI3CuuCExm8ifajjAq9SQgCfAHChe4o,2800 +pip/_vendor/platformdirs/unix.py,sha256=FZHi7UJN6ykNvxKhx6BxBZmR3OBNDwYlEfegQW_0-T0,7448 +pip/_vendor/platformdirs/version.py,sha256=jXprrDLc5_o9OzizdGMr92Lmhow65AreA5_ht6m6bmA,160 +pip/_vendor/platformdirs/windows.py,sha256=aWYVfjIPr_NST2H8mHfY0G7EYCyxGGxQohSVTLdkTvA,7098 +pip/_vendor/pygments/__init__.py,sha256=M8wUKMcB705YH9ykVafkQOwe3jwT2lx63tCBXFCtQeg,2999 +pip/_vendor/pygments/__main__.py,sha256=p0_rz3JZmNZMNZBOqDojaEx1cr9wmA9FQZX_TYl74lQ,353 +pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/console.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/style.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/token.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/util.cpython-311.pyc,, +pip/_vendor/pygments/cmdline.py,sha256=rc0fah4eknRqFgn1wKNEwkq0yWnSqYOGaA4PaIeOxVY,23685 +pip/_vendor/pygments/console.py,sha256=hQfqCFuOlGk7DW2lPQYepsw-wkOH1iNt9ylNA1eRymM,1697 +pip/_vendor/pygments/filter.py,sha256=NglMmMPTRRv-zuRSE_QbWid7JXd2J4AvwjCW2yWALXU,1938 +pip/_vendor/pygments/filters/__init__.py,sha256=b5YuXB9rampSy2-cMtKxGQoMDfrG4_DcvVwZrzTlB6w,40386 +pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/formatter.py,sha256=6-TS2Y8pUMeWIUolWwr1O8ruC-U6HydWDwOdbAiJgJQ,2917 +pip/_vendor/pygments/formatters/__init__.py,sha256=x21jYv50qr7GrTGy1jW3_L4GIj-2NE1i_-2kHVKIFAc,4800 +pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc,, +pip/_vendor/pygments/formatters/_mapping.py,sha256=fCZgvsM6UEuZUG7J6lr47eVss5owKd_JyaNbDfxeqmQ,4104 +pip/_vendor/pygments/formatters/bbcode.py,sha256=JrL4ITjN-KzPcuQpPMBf1pm33eW2sDUNr8WzSoAJsJA,3314 +pip/_vendor/pygments/formatters/groff.py,sha256=xrOFoLbafSA9uHsSLRogy79_Zc4GWJ8tMK2hCdTJRsw,5086 +pip/_vendor/pygments/formatters/html.py,sha256=oqxZPa6M6t-qHXjUXypmdlDSDhcJUNSOVjL1Mh0dY4M,35601 +pip/_vendor/pygments/formatters/img.py,sha256=h75Y7IRZLZxDEIwyoOsdRLTwm7kLVPbODKkgEiJ0iKI,21938 +pip/_vendor/pygments/formatters/irc.py,sha256=m5-iXloR0qfQKE-UJu8fMLBgGfgFiq1bSIw83kTGy6Q,4981 +pip/_vendor/pygments/formatters/latex.py,sha256=thPbytJCIs2AUXsO3NZwqKtXJ-upOlcXP4CXsx94G4w,19351 +pip/_vendor/pygments/formatters/other.py,sha256=PczqK1Rms43lz6iucOLPeBMxIncPKOGBt-195w1ynII,5073 +pip/_vendor/pygments/formatters/pangomarkup.py,sha256=ZZzMsKJKXrsDniFeMTkIpe7aQ4VZYRHu0idWmSiUJ2U,2212 +pip/_vendor/pygments/formatters/rtf.py,sha256=abrKlWjipBkQvhIICxtjYTUNv6WME0iJJObFvqVuudE,5014 +pip/_vendor/pygments/formatters/svg.py,sha256=6MM9YyO8NhU42RTQfTWBiagWMnsf9iG5gwhqSriHORE,7335 +pip/_vendor/pygments/formatters/terminal.py,sha256=NpEGvwkC6LgMLQTjVzGrJXji3XcET1sb5JCunSCzoRo,4674 +pip/_vendor/pygments/formatters/terminal256.py,sha256=4v4OVizvsxtwWBpIy_Po30zeOzE5oJg_mOc1-rCjMDk,11753 +pip/_vendor/pygments/lexer.py,sha256=abe1O4eGXipq-fDaWwOLvdHQ6EKEtcRCeG5hOcaMZ5k,32064 +pip/_vendor/pygments/lexers/__init__.py,sha256=DD1Exvt309gatmIvhkQYDS6KBpTrNyvoFnPdoQxHECk,11164 +pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc,, +pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc,, +pip/_vendor/pygments/lexers/_mapping.py,sha256=7WHD1MrawOc0HVrZmQDEl4TQii40DTnrVSt4trrZdlc,71556 +pip/_vendor/pygments/lexers/python.py,sha256=T0z6wL3mOZqRvZPcIEmjVNjfJE-Wj9k4nbxglrC4Hf8,53572 +pip/_vendor/pygments/modeline.py,sha256=gIbMSYrjSWPk0oATz7W9vMBYkUyTK2OcdVyKjioDRvA,986 +pip/_vendor/pygments/plugin.py,sha256=5rPxEoB_89qQMpOs0nI4KyLOzAHNlbQiwEMOKxqNmv8,2591 +pip/_vendor/pygments/regexopt.py,sha256=c6xcXGpGgvCET_3VWawJJqAnOp0QttFpQEdOPNY2Py0,3072 +pip/_vendor/pygments/scanner.py,sha256=F2T2G6cpkj-yZtzGQr-sOBw5w5-96UrJWveZN6va2aM,3092 +pip/_vendor/pygments/sphinxext.py,sha256=i4w6lo-2MHTXeaJxbiyytG-J2I15UK5zlN8E81rjcLY,6882 +pip/_vendor/pygments/style.py,sha256=RRnussX1YiK9Z7HipIvKorImxu3-HnkdpPCO4u925T0,6257 +pip/_vendor/pygments/styles/__init__.py,sha256=iZDZ7PBKb55SpGlE1--cx9cbmWx5lVTH4bXO87t2Vok,3419 +pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/token.py,sha256=vA2yNHGJBHfq4jNQSah7C9DmIOp34MmYHPA8P-cYAHI,6184 +pip/_vendor/pygments/unistring.py,sha256=gP3gK-6C4oAFjjo9HvoahsqzuV4Qz0jl0E0OxfDerHI,63187 +pip/_vendor/pygments/util.py,sha256=KgwpWWC3By5AiNwxGTI7oI9aXupH2TyZWukafBJe0Mg,9110 +pip/_vendor/pyparsing/__init__.py,sha256=ZPdI7pPo4IYXcABw-51AcqOzsxVvDtqnQbyn_qYWZvo,9171 +pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc,, +pip/_vendor/pyparsing/actions.py,sha256=wU9i32e0y1ymxKE3OUwSHO-SFIrt1h_wv6Ws0GQjpNU,6426 +pip/_vendor/pyparsing/common.py,sha256=lFL97ooIeR75CmW5hjURZqwDCTgruqltcTCZ-ulLO2Q,12936 +pip/_vendor/pyparsing/core.py,sha256=AzTm1KFT1FIhiw2zvXZJmrpQoAwB0wOmeDCiR6SYytw,213344 +pip/_vendor/pyparsing/diagram/__init__.py,sha256=KW0PV_TvWKnL7jysz0pQbZ24nzWWu2ZfNaeyUIIywIg,23685 +pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pyparsing/exceptions.py,sha256=3LbSafD32NYb1Tzt85GHNkhEAU1eZkTtNSk24cPMemo,9023 +pip/_vendor/pyparsing/helpers.py,sha256=QpUOjW0-psvueMwWb9bQpU2noqKCv98_wnw1VSzSdVo,39129 +pip/_vendor/pyparsing/results.py,sha256=HgNvWVXBdQP-Q6PtJfoCEeOJk2nwEvG-2KVKC5sGA30,25341 +pip/_vendor/pyparsing/testing.py,sha256=7tu4Abp4uSeJV0N_yEPRmmNUhpd18ZQP3CrX41DM814,13402 +pip/_vendor/pyparsing/unicode.py,sha256=fwuhMj30SQ165Cv7HJpu-rSxGbRm93kN9L4Ei7VGc1Y,10787 +pip/_vendor/pyparsing/util.py,sha256=kq772O5YSeXOSdP-M31EWpbH_ayj7BMHImBYo9xPD5M,6805 +pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491 +pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138 +pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920 +pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546 +pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927 +pip/_vendor/requests/__init__.py,sha256=64HgJ8cke-XyNrj1ErwNq0F9SqyAThUTh5lV6m7-YkI,5178 +pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-311.pyc,, +pip/_vendor/requests/__version__.py,sha256=h48zn-oFukaXrYHocdadp_hIszWyd_PGrS8Eiii6aoc,435 +pip/_vendor/requests/_internal_utils.py,sha256=aSPlF4uDhtfKxEayZJJ7KkAxtormeTfpwKSBSwtmAUw,1397 +pip/_vendor/requests/adapters.py,sha256=GFEz5koZaMZD86v0SHXKVB5SE9MgslEjkCQzldkNwVM,21443 +pip/_vendor/requests/api.py,sha256=dyvkDd5itC9z2g0wHl_YfD1yf6YwpGWLO7__8e21nks,6377 +pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 +pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575 +pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286 +pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 +pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 +pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879 +pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 +pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288 +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/sessions.py,sha256=KUqJcRRLovNefUs7ScOXSUVCcfSayTFWtbiJ7gOSlTI,30180 +pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 +pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 +pip/_vendor/requests/utils.py,sha256=0gzSOcx9Ya4liAbHnHuwt4jM78lzCZZoDFgkmsInNUg,33240 +pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537 +pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc,, +pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc,, +pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc,, +pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc,, +pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc,, +pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 +pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871 +pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601 +pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511 +pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963 +pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090 +pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478 +pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/abc.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/align.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/bar.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/box.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/cells.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/color.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/columns.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/console.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/containers.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/control.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/errors.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/json.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/layout.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/live.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/logging.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/markup.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/measure.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/padding.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/pager.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/palette.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/panel.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/progress.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/region.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/repr.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/rule.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/scope.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/screen.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/segment.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/status.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/style.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/styled.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/table.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/text.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/theme.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/themes.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/tree.cpython-311.pyc,, +pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 +pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 +pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 +pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100 +pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 +pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 +pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 +pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 +pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 +pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387 +pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 +pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 +pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472 +pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 +pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 +pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 +pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820 +pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926 +pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 +pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840 +pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 +pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368 +pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906 +pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 +pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842 +pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509 +pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224 +pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 +pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 +pip/_vendor/rich/console.py,sha256=genSBxgBjd5lCU49P1JF_VVDh4T4qBtD-SB5mKeDOyU,99195 +pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 +pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 +pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630 +pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082 +pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972 +pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 +pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 +pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 +pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508 +pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584 +pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032 +pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 +pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007 +pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273 +pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667 +pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903 +pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198 +pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 +pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 +pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 +pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 +pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574 +pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852 +pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706 +pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165 +pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303 +pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 +pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 +pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431 +pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602 +pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843 +pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 +pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247 +pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339 +pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 +pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073 +pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 +pip/_vendor/rich/syntax.py,sha256=5WylxPkL5Z3I1LKKUbdT1cIf2MF6yAhO3V9AFdmTFPc,35153 +pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684 +pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 +pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525 +pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777 +pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 +pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604 +pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 +pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 +pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493 +pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc,, +pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551 +pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179 +pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682 +pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562 +pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372 +pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 +pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746 +pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086 +pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142 +pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024 +pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 +pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc,, +pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc,, +pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc,, +pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 +pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 +pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 +pip/_vendor/typing_extensions.py,sha256=QnGB4-cRD3js3YndL-XwN3XxnsFfVKssgYHY-bEVuLQ,84101 +pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333 +pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 +pip/_vendor/urllib3/_version.py,sha256=vFwhFPO1DTzD8xawsdSDwriGSheS7LurJQL9fSgM_IM,64 +pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300 +pip/_vendor/urllib3/connectionpool.py,sha256=u7I7TzJTsicVoNjGeZkCD5LANp_GCeDNBwXZoGHHVLo,39128 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 +pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448 +pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 +pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 +pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 +pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 +pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 +pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 +pip/_vendor/urllib3/poolmanager.py,sha256=0KOOJECoeLYVjUHvv-0h4Oq3FFQQ2yb-Fnjkbj8gJO0,19786 +pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985 +pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641 +pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 +pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 +pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 +pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997 +pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 +pip/_vendor/urllib3/util/retry.py,sha256=4laWh0HpwGijLiBmdBIYtbhYekQnNzzhx2W9uys0RHA,22003 +pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 +pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758 +pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 +pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168 +pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296 +pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 +pip/_vendor/vendor.txt,sha256=5SG3FYuNQ7xCRCmKLFdeDe5LN1wz00nsFtDX2zpsfN0,476 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 +pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/.venv/Lib/site-packages/pip-23.1.2.dist-info/REQUESTED b/.venv/Lib/site-packages/pip-23.1.2.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/.venv/Lib/site-packages/pip-22.3.dist-info/WHEEL b/.venv/Lib/site-packages/pip-23.1.2.dist-info/WHEEL similarity index 100% rename from .venv/Lib/site-packages/pip-22.3.dist-info/WHEEL rename to .venv/Lib/site-packages/pip-23.1.2.dist-info/WHEEL diff --git a/.venv/Lib/site-packages/pip-22.3.dist-info/entry_points.txt b/.venv/Lib/site-packages/pip-23.1.2.dist-info/entry_points.txt similarity index 100% rename from .venv/Lib/site-packages/pip-22.3.dist-info/entry_points.txt rename to .venv/Lib/site-packages/pip-23.1.2.dist-info/entry_points.txt diff --git a/.venv/Lib/site-packages/pip-23.1.2.dist-info/top_level.txt b/.venv/Lib/site-packages/pip-23.1.2.dist-info/top_level.txt new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/.venv/Lib/site-packages/pip-23.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/.venv/Lib/site-packages/pip/__init__.py b/.venv/Lib/site-packages/pip/__init__.py index 168abe86..4ad3b2ac 100644 --- a/.venv/Lib/site-packages/pip/__init__.py +++ b/.venv/Lib/site-packages/pip/__init__.py @@ -1,6 +1,6 @@ from typing import List, Optional -__version__ = "22.3" +__version__ = "23.1.2" def main(args: Optional[List[str]] = None) -> int: diff --git a/.venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc index b6a79a4a..ddb71b30 100644 Binary files a/.venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc index bb23ddd4..b2bf4d7f 100644 Binary files a/.venv/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc b/.venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc index a3661558..e5608b72 100644 Binary files a/.venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc index a52f8c14..ea477307 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc index 57862f39..38f51f8d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc index d65c0290..2519b15f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc index 6cbd8cf5..a08f8fef 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc index 78d64a8c..a96ec76d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc index ffbd79e2..0557f514 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc index 5ba54a56..6e89350d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc index 1cc5d14f..0af96421 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc index 8b25cdeb..df845888 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/build_env.py b/.venv/Lib/site-packages/pip/_internal/build_env.py index cc2b38ba..4f704a35 100644 --- a/.venv/Lib/site-packages/pip/_internal/build_env.py +++ b/.venv/Lib/site-packages/pip/_internal/build_env.py @@ -8,9 +8,8 @@ import site import sys import textwrap from collections import OrderedDict -from sysconfig import get_paths from types import TracebackType -from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type +from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union from pip._vendor.certifi import where from pip._vendor.packaging.requirements import Requirement @@ -18,7 +17,7 @@ from pip._vendor.packaging.version import Version from pip import __file__ as pip_location from pip._internal.cli.spinners import open_spinner -from pip._internal.locations import get_platlib, get_prefixed_libs, get_purelib +from pip._internal.locations import get_platlib, get_purelib, get_scheme from pip._internal.metadata import get_default_environment, get_environment from pip._internal.utils.subprocess import call_subprocess from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds @@ -29,15 +28,17 @@ if TYPE_CHECKING: logger = logging.getLogger(__name__) +def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]: + return (a, b) if a != b else (a,) + + class _Prefix: def __init__(self, path: str) -> None: self.path = path self.setup = False - self.bin_dir = get_paths( - "nt" if os.name == "nt" else "posix_prefix", - vars={"base": path, "platbase": path}, - )["scripts"] - self.lib_dirs = get_prefixed_libs(path) + scheme = get_scheme("", prefix=path) + self.bin_dir = scheme.scripts + self.lib_dirs = _dedup(scheme.purelib, scheme.platlib) def get_runnable_pip() -> str: diff --git a/.venv/Lib/site-packages/pip/_internal/cache.py b/.venv/Lib/site-packages/pip/_internal/cache.py index c53b7f02..05f0a9ac 100644 --- a/.venv/Lib/site-packages/pip/_internal/cache.py +++ b/.venv/Lib/site-packages/pip/_internal/cache.py @@ -6,14 +6,13 @@ import json import logging import os from pathlib import Path -from typing import Any, Dict, List, Optional, Set +from typing import Any, Dict, List, Optional from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version from pip._vendor.packaging.utils import canonicalize_name from pip._internal.exceptions import InvalidWheelFilename from pip._internal.models.direct_url import DirectUrl -from pip._internal.models.format_control import FormatControl from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds @@ -33,25 +32,13 @@ def _hash_dict(d: Dict[str, str]) -> str: class Cache: """An abstract class - provides cache directories for data from links - :param cache_dir: The root of the cache. - :param format_control: An object of FormatControl class to limit - binaries being read from the cache. - :param allowed_formats: which formats of files the cache should store. - ('binary' and 'source' are the only allowed values) """ - def __init__( - self, cache_dir: str, format_control: FormatControl, allowed_formats: Set[str] - ) -> None: + def __init__(self, cache_dir: str) -> None: super().__init__() assert not cache_dir or os.path.isabs(cache_dir) self.cache_dir = cache_dir or None - self.format_control = format_control - self.allowed_formats = allowed_formats - - _valid_formats = {"source", "binary"} - assert self.allowed_formats.union(_valid_formats) == _valid_formats def _get_cache_path_parts(self, link: Link) -> List[str]: """Get parts of part that must be os.path.joined with cache_dir""" @@ -91,10 +78,6 @@ class Cache: if can_not_cache: return [] - formats = self.format_control.get_allowed_formats(canonical_package_name) - if not self.allowed_formats.intersection(formats): - return [] - candidates = [] path = self.get_path_for_link(link) if os.path.isdir(path): @@ -121,8 +104,8 @@ class Cache: class SimpleWheelCache(Cache): """A cache of wheels for future installs.""" - def __init__(self, cache_dir: str, format_control: FormatControl) -> None: - super().__init__(cache_dir, format_control, {"binary"}) + def __init__(self, cache_dir: str) -> None: + super().__init__(cache_dir) def get_path_for_link(self, link: Link) -> str: """Return a directory to store cached wheels for link @@ -191,13 +174,13 @@ class SimpleWheelCache(Cache): class EphemWheelCache(SimpleWheelCache): """A SimpleWheelCache that creates it's own temporary cache directory""" - def __init__(self, format_control: FormatControl) -> None: + def __init__(self) -> None: self._temp_dir = TempDirectory( kind=tempdir_kinds.EPHEM_WHEEL_CACHE, globally_managed=True, ) - super().__init__(self._temp_dir.path, format_control) + super().__init__(self._temp_dir.path) class CacheEntry: @@ -221,14 +204,10 @@ class WheelCache(Cache): when a certain link is not found in the simple wheel cache first. """ - def __init__( - self, cache_dir: str, format_control: Optional[FormatControl] = None - ) -> None: - if format_control is None: - format_control = FormatControl() - super().__init__(cache_dir, format_control, {"binary"}) - self._wheel_cache = SimpleWheelCache(cache_dir, format_control) - self._ephem_cache = EphemWheelCache(format_control) + def __init__(self, cache_dir: str) -> None: + super().__init__(cache_dir) + self._wheel_cache = SimpleWheelCache(cache_dir) + self._ephem_cache = EphemWheelCache() def get_path_for_link(self, link: Link) -> str: return self._wheel_cache.get_path_for_link(link) diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc index d5bbd34c..e28e0cc1 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc index a6b351d6..906dc142 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc index e349a6ec..b005528f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc index b20d6f36..5ec04cc0 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc index 3a2775dd..308f89ae 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc index d0407a5d..d65414b6 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc index 51f7f181..aa5f36e6 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc index 5257b3fe..471195a6 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc index bf5cc0be..5dbe57e9 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc index e0869052..0e8508a8 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc index 8ce57392..76a4428f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc index 3b4c189f..703bdacd 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/base_command.py b/.venv/Lib/site-packages/pip/_internal/cli/base_command.py index 5bd7e67e..637fba18 100644 --- a/.venv/Lib/site-packages/pip/_internal/cli/base_command.py +++ b/.venv/Lib/site-packages/pip/_internal/cli/base_command.py @@ -122,6 +122,15 @@ class Command(CommandContextMixIn): user_log_file=options.log, ) + always_enabled_features = set(options.features_enabled) & set( + cmdoptions.ALWAYS_ENABLED_FEATURES + ) + if always_enabled_features: + logger.warning( + "The following features are always enabled: %s. ", + ", ".join(sorted(always_enabled_features)), + ) + # TODO: Try to get these passing down from the command? # without resorting to os.environ to hold these. # This also affects isolated builds and it should. diff --git a/.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py b/.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py index b4e2560d..02ba6082 100644 --- a/.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +++ b/.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py @@ -164,6 +164,14 @@ require_virtualenv: Callable[..., Option] = partial( ), ) +override_externally_managed: Callable[..., Option] = partial( + Option, + "--break-system-packages", + dest="override_externally_managed", + action="store_true", + help="Allow pip to modify an EXTERNALLY-MANAGED Python installation", +) + python: Callable[..., Option] = partial( Option, "--python", @@ -244,6 +252,19 @@ no_input: Callable[..., Option] = partial( help="Disable prompting for input.", ) +keyring_provider: Callable[..., Option] = partial( + Option, + "--keyring-provider", + dest="keyring_provider", + choices=["auto", "disabled", "import", "subprocess"], + default="auto", + help=( + "Enable the credential lookup via the keyring library if user input is allowed." + " Specify which mechanism to use [disabled, import, subprocess]." + " (default: disabled)" + ), +) + proxy: Callable[..., Option] = partial( Option, "--proxy", @@ -762,10 +783,14 @@ def _handle_no_use_pep517( """ raise_option_error(parser, option=option, msg=msg) - # If user doesn't wish to use pep517, we check if setuptools is installed + # If user doesn't wish to use pep517, we check if setuptools and wheel are installed # and raise error if it is not. - if not importlib.util.find_spec("setuptools"): - msg = "It is not possible to use --no-use-pep517 without setuptools installed." + packages = ("setuptools", "wheel") + if not all(importlib.util.find_spec(package) for package in packages): + msg = ( + f"It is not possible to use --no-use-pep517 " + f"without {' and '.join(packages)} installed." + ) raise_option_error(parser, option=option, msg=msg) # Otherwise, --no-use-pep517 was passed via the command-line. @@ -803,11 +828,18 @@ def _handle_config_settings( if dest is None: dest = {} setattr(parser.values, option.dest, dest) - dest[key] = val + if key in dest: + if isinstance(dest[key], list): + dest[key].append(val) + else: + dest[key] = [dest[key], val] + else: + dest[key] = val config_settings: Callable[..., Option] = partial( Option, + "-C", "--config-settings", dest="config_settings", type=str, @@ -819,19 +851,6 @@ config_settings: Callable[..., Option] = partial( "to pass multiple keys to the backend.", ) -install_options: Callable[..., Option] = partial( - Option, - "--install-option", - dest="install_options", - action="append", - metavar="options", - help="Extra arguments to be supplied to the setup.py install " - 'command (use like --install-option="--install-scripts=/usr/local/' - 'bin"). Use multiple --install-option options to pass multiple ' - "options to setup.py install. If you are using an option with a " - "directory path, be sure to use absolute path.", -) - build_options: Callable[..., Option] = partial( Option, "--build-option", @@ -975,6 +994,11 @@ no_python_version_warning: Callable[..., Option] = partial( ) +# Features that are now always on. A warning is printed if they are used. +ALWAYS_ENABLED_FEATURES = [ + "no-binary-enable-wheel-cache", # always on since 23.1 +] + use_new_feature: Callable[..., Option] = partial( Option, "--use-feature", @@ -985,8 +1009,8 @@ use_new_feature: Callable[..., Option] = partial( choices=[ "fast-deps", "truststore", - "no-binary-enable-wheel-cache", - ], + ] + + ALWAYS_ENABLED_FEATURES, help="Enable new functionality, that may be backward incompatible.", ) @@ -1021,6 +1045,7 @@ general_group: Dict[str, Any] = { quiet, log, no_input, + keyring_provider, proxy, retries, timeout, diff --git a/.venv/Lib/site-packages/pip/_internal/cli/main.py b/.venv/Lib/site-packages/pip/_internal/cli/main.py index 0e312215..7e061f5b 100644 --- a/.venv/Lib/site-packages/pip/_internal/cli/main.py +++ b/.venv/Lib/site-packages/pip/_internal/cli/main.py @@ -4,6 +4,7 @@ import locale import logging import os import sys +import warnings from typing import List, Optional from pip._internal.cli.autocompletion import autocomplete @@ -46,6 +47,14 @@ def main(args: Optional[List[str]] = None) -> int: if args is None: args = sys.argv[1:] + # Suppress the pkg_resources deprecation warning + # Note - we use a module of .*pkg_resources to cover + # the normal case (pip._vendor.pkg_resources) and the + # devendored case (a bare pkg_resources) + warnings.filterwarnings( + action="ignore", category=DeprecationWarning, module=".*pkg_resources" + ) + # Configure our deprecation warnings to be sent through loggers deprecation.install_warning_logger() diff --git a/.venv/Lib/site-packages/pip/_internal/cli/req_command.py b/.venv/Lib/site-packages/pip/_internal/cli/req_command.py index 1044809f..c2f4e38b 100644 --- a/.venv/Lib/site-packages/pip/_internal/cli/req_command.py +++ b/.venv/Lib/site-packages/pip/_internal/cli/req_command.py @@ -151,6 +151,7 @@ class SessionCommandMixin(CommandContextMixIn): # Determine if we can prompt the user for authentication or not session.auth.prompting = not options.no_input + session.auth.keyring_provider = options.keyring_provider return session @@ -343,7 +344,6 @@ class RequirementCommand(IndexGroupCommand): install_req_from_req_string, isolated=options.isolated_mode, use_pep517=use_pep517, - config_settings=getattr(options, "config_settings", None), ) resolver_variant = cls.determine_resolver_variant(options) # The long import name and duplicated invocation is needed to convince @@ -410,7 +410,7 @@ class RequirementCommand(IndexGroupCommand): for req in args: req_to_add = install_req_from_line( req, - None, + comes_from=None, isolated=options.isolated_mode, use_pep517=options.use_pep517, user_supplied=True, @@ -438,6 +438,9 @@ class RequirementCommand(IndexGroupCommand): isolated=options.isolated_mode, use_pep517=options.use_pep517, user_supplied=True, + config_settings=parsed_req.options.get("config_settings") + if parsed_req.options + else None, ) requirements.append(req_to_add) diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc index 962e81fb..25d9995a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc index 8093f06d..099fdc90 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc index a3baf91f..4d0ecc8e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc index e8acb494..b2814841 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc index a705b363..4d98e547 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc index 70ee0388..aaf5cabb 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc index 721e3f7f..65f0c9c2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc index c89c00b2..70b0742d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc index f1a783d1..434e9d07 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc index 57fc4c90..4ebf25e1 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc index d5f11b80..033f3b2b 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc index 970d645b..c915a7ed 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc index ab7092a3..32bd0c70 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc index 0bfaa057..722ee6f0 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc index a2ce044e..75080f08 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc index d8826fdf..1e0897e9 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc index e6c38c43..1ee96e8c 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc index 644a1b9b..ad2f1900 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/cache.py b/.venv/Lib/site-packages/pip/_internal/commands/cache.py index c5f03302..e96d2b49 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/cache.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/cache.py @@ -37,7 +37,6 @@ class CacheCommand(Command): """ def add_options(self) -> None: - self.cmd_opts.add_option( "--format", action="store", diff --git a/.venv/Lib/site-packages/pip/_internal/commands/check.py b/.venv/Lib/site-packages/pip/_internal/commands/check.py index 3864220b..584df9f5 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/check.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/check.py @@ -20,7 +20,6 @@ class CheckCommand(Command): %prog [options]""" def run(self, options: Values, args: List[str]) -> int: - package_set, parsing_probs = create_package_set_from_installed() missing, conflicting = check_package_set(package_set) diff --git a/.venv/Lib/site-packages/pip/_internal/commands/debug.py b/.venv/Lib/site-packages/pip/_internal/commands/debug.py index 6fad1fe8..2a3e7d29 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/debug.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/debug.py @@ -48,7 +48,7 @@ def create_vendor_txt_map() -> Dict[str, str]: def get_module_from_module_name(module_name: str) -> ModuleType: # Module name can be uppercase in vendor.txt for some reason... - module_name = module_name.lower() + module_name = module_name.lower().replace("-", "_") # PATCH: setuptools is actually only pkg_resources. if module_name == "setuptools": module_name = "pkg_resources" diff --git a/.venv/Lib/site-packages/pip/_internal/commands/download.py b/.venv/Lib/site-packages/pip/_internal/commands/download.py index 4132e089..36e947c8 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/download.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/download.py @@ -8,10 +8,7 @@ from pip._internal.cli.cmdoptions import make_target_python from pip._internal.cli.req_command import RequirementCommand, with_cleanup from pip._internal.cli.status_codes import SUCCESS from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.req.req_install import ( - LegacySetupPyOptionsCheckMode, - check_legacy_setup_py_options, -) +from pip._internal.req.req_install import check_legacy_setup_py_options from pip._internal.utils.misc import ensure_dir, normalize_path, write_output from pip._internal.utils.temp_dir import TempDirectory @@ -79,7 +76,6 @@ class DownloadCommand(RequirementCommand): @with_cleanup def run(self, options: Values, args: List[str]) -> int: - options.ignore_installed = True # editable doesn't really make sense for `pip download`, but the bowels # of the RequirementSet code require that property. @@ -109,9 +105,7 @@ class DownloadCommand(RequirementCommand): ) reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options( - options, reqs, LegacySetupPyOptionsCheckMode.DOWNLOAD - ) + check_legacy_setup_py_options(options, reqs) preparer = self.make_requirement_preparer( temp_build_dir=directory, diff --git a/.venv/Lib/site-packages/pip/_internal/commands/index.py b/.venv/Lib/site-packages/pip/_internal/commands/index.py index b4bf0ac0..7267effe 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/index.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/index.py @@ -24,6 +24,7 @@ class IndexCommand(IndexGroupCommand): Inspect information available from package indexes. """ + ignore_require_venv = True usage = """ %prog versions """ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/inspect.py b/.venv/Lib/site-packages/pip/_internal/commands/inspect.py index a4e35993..27c8fa3d 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/inspect.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/inspect.py @@ -46,11 +46,6 @@ class InspectCommand(Command): self.parser.insert_option_group(0, self.cmd_opts) def run(self, options: Values, args: List[str]) -> int: - logger.warning( - "pip inspect is currently an experimental command. " - "The output format may change in a future release without prior warning." - ) - cmdoptions.check_list_path_option(options) dists = get_environment(options.path).iter_installed_distributions( local_only=options.local, @@ -58,7 +53,7 @@ class InspectCommand(Command): skip=set(stdlib_pkgs), ) output = { - "version": "0", + "version": "1", "pip_version": __version__, "installed": [self._dist_to_dict(dist) for dist in dists], "environment": default_environment(), diff --git a/.venv/Lib/site-packages/pip/_internal/commands/install.py b/.venv/Lib/site-packages/pip/_internal/commands/install.py index e081c27d..3c15ed41 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/install.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/install.py @@ -5,9 +5,8 @@ import os import shutil import site from optparse import SUPPRESS_HELP, Values -from typing import Iterable, List, Optional +from typing import List, Optional -from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.rich import print_json from pip._internal.cache import WheelCache @@ -22,25 +21,19 @@ from pip._internal.cli.status_codes import ERROR, SUCCESS from pip._internal.exceptions import CommandError, InstallationError from pip._internal.locations import get_scheme from pip._internal.metadata import get_environment -from pip._internal.models.format_control import FormatControl from pip._internal.models.installation_report import InstallationReport from pip._internal.operations.build.build_tracker import get_build_tracker from pip._internal.operations.check import ConflictDetails, check_install_conflicts from pip._internal.req import install_given_reqs from pip._internal.req.req_install import ( InstallRequirement, - LegacySetupPyOptionsCheckMode, check_legacy_setup_py_options, ) from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.deprecation import ( - LegacyInstallReasonFailedBdistWheel, - deprecated, -) -from pip._internal.utils.distutils_args import parse_distutils_args from pip._internal.utils.filesystem import test_writable_dir from pip._internal.utils.logging import getLogger from pip._internal.utils.misc import ( + check_externally_managed, ensure_dir, get_pip_version, protect_pip_from_modification_on_windows, @@ -51,26 +44,11 @@ from pip._internal.utils.virtualenv import ( running_under_virtualenv, virtualenv_no_global, ) -from pip._internal.wheel_builder import ( - BdistWheelAllowedPredicate, - build, - should_build_for_install_command, -) +from pip._internal.wheel_builder import build, should_build_for_install_command logger = getLogger(__name__) -def get_check_bdist_wheel_allowed( - format_control: FormatControl, -) -> BdistWheelAllowedPredicate: - def check_binary_allowed(req: InstallRequirement) -> bool: - canonical_name = canonicalize_name(req.name or "") - allowed_formats = format_control.get_allowed_formats(canonical_name) - return "binary" in allowed_formats - - return check_binary_allowed - - class InstallCommand(RequirementCommand): """ Install packages from: @@ -155,7 +133,12 @@ class InstallCommand(RequirementCommand): default=None, help=( "Installation prefix where lib, bin and other top-level " - "folders are placed" + "folders are placed. Note that the resulting installation may " + "contain scripts and other resources which reference the " + "Python interpreter of pip, and not that of ``--prefix``. " + "See also the ``--python`` option if the intention is to " + "install packages into another (possibly pip-free) " + "environment." ), ) @@ -214,9 +197,9 @@ class InstallCommand(RequirementCommand): self.cmd_opts.add_option(cmdoptions.use_pep517()) self.cmd_opts.add_option(cmdoptions.no_use_pep517()) self.cmd_opts.add_option(cmdoptions.check_build_deps()) + self.cmd_opts.add_option(cmdoptions.override_externally_managed()) self.cmd_opts.add_option(cmdoptions.config_settings()) - self.cmd_opts.add_option(cmdoptions.install_options()) self.cmd_opts.add_option(cmdoptions.global_options()) self.cmd_opts.add_option( @@ -284,14 +267,29 @@ class InstallCommand(RequirementCommand): if options.use_user_site and options.target_dir is not None: raise CommandError("Can not combine '--user' and '--target'") + # Check whether the environment we're installing into is externally + # managed, as specified in PEP 668. Specifying --root, --target, or + # --prefix disables the check, since there's no reliable way to locate + # the EXTERNALLY-MANAGED file for those cases. An exception is also + # made specifically for "--dry-run --report" for convenience. + installing_into_current_environment = ( + not (options.dry_run and options.json_report_file) + and options.root_path is None + and options.target_dir is None + and options.prefix_path is None + ) + if ( + installing_into_current_environment + and not options.override_externally_managed + ): + check_externally_managed() + upgrade_strategy = "to-satisfy-only" if options.upgrade: upgrade_strategy = options.upgrade_strategy cmdoptions.check_dist_restriction(options, check_target=True) - install_options = options.install_options or [] - logger.verbose("Using %s", get_pip_version()) options.use_user_site = decide_user_install( options.use_user_site, @@ -342,28 +340,9 @@ class InstallCommand(RequirementCommand): try: reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options( - options, reqs, LegacySetupPyOptionsCheckMode.INSTALL - ) + check_legacy_setup_py_options(options, reqs) - if "no-binary-enable-wheel-cache" in options.features_enabled: - # TODO: remove format_control from WheelCache when the deprecation cycle - # is over - wheel_cache = WheelCache(options.cache_dir) - else: - if options.format_control.no_binary: - deprecated( - reason=( - "--no-binary currently disables reading from " - "the cache of locally built wheels. In the future " - "--no-binary will not influence the wheel cache." - ), - replacement="to use the --no-cache-dir option", - feature_flag="no-binary-enable-wheel-cache", - issue=11453, - gone_in="23.1", - ) - wheel_cache = WheelCache(options.cache_dir, options.format_control) + wheel_cache = WheelCache(options.cache_dir) # Only when installing is it permitted to use PEP 660. # In other circumstances (pip wheel, pip download) we generate @@ -371,8 +350,6 @@ class InstallCommand(RequirementCommand): for req in reqs: req.permit_editable_wheels = True - reject_location_related_install_options(reqs, options.install_options) - preparer = self.make_requirement_preparer( temp_build_dir=directory, options=options, @@ -402,12 +379,6 @@ class InstallCommand(RequirementCommand): ) if options.json_report_file: - logger.warning( - "--report is currently an experimental option. " - "The output format may change in a future release " - "without prior warning." - ) - report = InstallationReport(requirement_set.requirements_to_install) if options.json_report_file == "-": print_json(data=report.to_dict()) @@ -437,14 +408,10 @@ class InstallCommand(RequirementCommand): modifying_pip = pip_req.satisfied_by is None protect_pip_from_modification_on_windows(modifying_pip=modifying_pip) - check_bdist_wheel_allowed = get_check_bdist_wheel_allowed( - finder.format_control - ) - reqs_to_build = [ r for r in requirement_set.requirements.values() - if should_build_for_install_command(r, check_bdist_wheel_allowed) + if should_build_for_install_command(r) ] _, build_failures = build( @@ -455,26 +422,14 @@ class InstallCommand(RequirementCommand): global_options=global_options, ) - # If we're using PEP 517, we cannot do a legacy setup.py install - # so we fail here. - pep517_build_failure_names: List[str] = [ - r.name for r in build_failures if r.use_pep517 # type: ignore - ] - if pep517_build_failure_names: + if build_failures: raise InstallationError( "Could not build wheels for {}, which is required to " "install pyproject.toml-based projects".format( - ", ".join(pep517_build_failure_names) + ", ".join(r.name for r in build_failures) # type: ignore ) ) - # For now, we just warn about failures building legacy - # requirements, as we'll fall through to a setup.py install for - # those. - for r in build_failures: - if not r.use_pep517: - r.legacy_install_reason = LegacyInstallReasonFailedBdistWheel - to_install = resolver.get_installation_order(requirement_set) # Check for conflicts in the package set we're installing. @@ -493,7 +448,6 @@ class InstallCommand(RequirementCommand): installed = install_given_reqs( to_install, - install_options, global_options, root=options.root_path, home=target_temp_dir_path, @@ -764,45 +718,6 @@ def decide_user_install( return True -def reject_location_related_install_options( - requirements: List[InstallRequirement], options: Optional[List[str]] -) -> None: - """If any location-changing --install-option arguments were passed for - requirements or on the command-line, then show a deprecation warning. - """ - - def format_options(option_names: Iterable[str]) -> List[str]: - return ["--{}".format(name.replace("_", "-")) for name in option_names] - - offenders = [] - - for requirement in requirements: - install_options = requirement.install_options - location_options = parse_distutils_args(install_options) - if location_options: - offenders.append( - "{!r} from {}".format( - format_options(location_options.keys()), requirement - ) - ) - - if options: - location_options = parse_distutils_args(options) - if location_options: - offenders.append( - "{!r} from command line".format(format_options(location_options.keys())) - ) - - if not offenders: - return - - raise CommandError( - "Location-changing options found in --install-option: {}." - " This is unsupported, use pip-level options like --user," - " --prefix, --root, and --target instead.".format("; ".join(offenders)) - ) - - def create_os_error_message( error: OSError, show_traceback: bool, using_user_site: bool ) -> str: diff --git a/.venv/Lib/site-packages/pip/_internal/commands/show.py b/.venv/Lib/site-packages/pip/_internal/commands/show.py index 212167c9..3f10701f 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/show.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/show.py @@ -53,6 +53,7 @@ class _PackageInfo(NamedTuple): name: str version: str location: str + editable_project_location: Optional[str] requires: List[str] required_by: List[str] installer: str @@ -120,6 +121,7 @@ def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None name=dist.raw_name, version=str(dist.version), location=dist.location or "", + editable_project_location=dist.editable_project_location, requires=requires, required_by=required_by, installer=dist.installer, @@ -158,6 +160,10 @@ def print_results( write_output("Author-email: %s", dist.author_email) write_output("License: %s", dist.license) write_output("Location: %s", dist.location) + if dist.editable_project_location is not None: + write_output( + "Editable project location: %s", dist.editable_project_location + ) write_output("Requires: %s", ", ".join(dist.requires)) write_output("Required-by: %s", ", ".join(dist.required_by)) diff --git a/.venv/Lib/site-packages/pip/_internal/commands/uninstall.py b/.venv/Lib/site-packages/pip/_internal/commands/uninstall.py index dea8077e..f198fc31 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/uninstall.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/uninstall.py @@ -14,7 +14,10 @@ from pip._internal.req.constructors import ( install_req_from_line, install_req_from_parsed_requirement, ) -from pip._internal.utils.misc import protect_pip_from_modification_on_windows +from pip._internal.utils.misc import ( + check_externally_managed, + protect_pip_from_modification_on_windows, +) logger = logging.getLogger(__name__) @@ -55,6 +58,7 @@ class UninstallCommand(Command, SessionCommandMixin): help="Don't ask for confirmation of uninstall deletions.", ) self.cmd_opts.add_option(cmdoptions.root_user_action()) + self.cmd_opts.add_option(cmdoptions.override_externally_managed()) self.parser.insert_option_group(0, self.cmd_opts) def run(self, options: Values, args: List[str]) -> int: @@ -90,6 +94,9 @@ class UninstallCommand(Command, SessionCommandMixin): f'"pip help {self.name}")' ) + if not options.override_externally_managed: + check_externally_managed() + protect_pip_from_modification_on_windows( modifying_pip="pip" in reqs_to_uninstall ) diff --git a/.venv/Lib/site-packages/pip/_internal/commands/wheel.py b/.venv/Lib/site-packages/pip/_internal/commands/wheel.py index 1afbd562..c6a588ff 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/wheel.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/wheel.py @@ -12,10 +12,8 @@ from pip._internal.exceptions import CommandError from pip._internal.operations.build.build_tracker import get_build_tracker from pip._internal.req.req_install import ( InstallRequirement, - LegacySetupPyOptionsCheckMode, check_legacy_setup_py_options, ) -from pip._internal.utils.deprecation import deprecated from pip._internal.utils.misc import ensure_dir, normalize_path from pip._internal.utils.temp_dir import TempDirectory from pip._internal.wheel_builder import build, should_build_for_wheel_command @@ -44,7 +42,6 @@ class WheelCommand(RequirementCommand): %prog [options] ...""" def add_options(self) -> None: - self.cmd_opts.add_option( "-w", "--wheel-dir", @@ -108,7 +105,6 @@ class WheelCommand(RequirementCommand): session = self.get_default_session(options) finder = self._build_package_finder(options, session) - wheel_cache = WheelCache(options.cache_dir, options.format_control) options.wheel_dir = normalize_path(options.wheel_dir) ensure_dir(options.wheel_dir) @@ -122,28 +118,9 @@ class WheelCommand(RequirementCommand): ) reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options( - options, reqs, LegacySetupPyOptionsCheckMode.WHEEL - ) + check_legacy_setup_py_options(options, reqs) - if "no-binary-enable-wheel-cache" in options.features_enabled: - # TODO: remove format_control from WheelCache when the deprecation cycle - # is over - wheel_cache = WheelCache(options.cache_dir) - else: - if options.format_control.no_binary: - deprecated( - reason=( - "--no-binary currently disables reading from " - "the cache of locally built wheels. In the future " - "--no-binary will not influence the wheel cache." - ), - replacement="to use the --no-cache-dir option", - feature_flag="no-binary-enable-wheel-cache", - issue=11453, - gone_in="23.1", - ) - wheel_cache = WheelCache(options.cache_dir, options.format_control) + wheel_cache = WheelCache(options.cache_dir) preparer = self.make_requirement_preparer( temp_build_dir=directory, diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc index b211d82f..86372218 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc index b7b76254..f91178be 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc index 58e9c2d0..778a4bbe 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc index 17815371..1ba3eb2d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc index 4b72158c..20985f43 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/exceptions.py b/.venv/Lib/site-packages/pip/_internal/exceptions.py index 2ab1f591..7d92ba69 100644 --- a/.venv/Lib/site-packages/pip/_internal/exceptions.py +++ b/.venv/Lib/site-packages/pip/_internal/exceptions.py @@ -6,9 +6,14 @@ subpackage and, thus, should not depend on them. """ import configparser +import contextlib +import locale +import logging +import pathlib import re +import sys from itertools import chain, groupby, repeat -from typing import TYPE_CHECKING, Dict, List, Optional, Union +from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Union from pip._vendor.requests.models import Request, Response from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult @@ -22,6 +27,8 @@ if TYPE_CHECKING: from pip._internal.metadata import BaseDistribution from pip._internal.req.req_install import InstallRequirement +logger = logging.getLogger(__name__) + # # Scaffolding @@ -354,20 +361,6 @@ class MetadataInconsistent(InstallationError): ) -class LegacyInstallFailure(DiagnosticPipError): - """Error occurred while executing `setup.py install`""" - - reference = "legacy-install-failure" - - def __init__(self, package_details: str) -> None: - super().__init__( - message="Encountered error while trying to install package.", - context=package_details, - hint_stmt="See above for output from the failure.", - note_stmt="This is an issue with the package mentioned above, not pip.", - ) - - class InstallationSubprocessError(DiagnosticPipError, InstallationError): """A subprocess call failed.""" @@ -658,3 +651,83 @@ class ConfigurationFileCouldNotBeLoaded(ConfigurationError): assert self.error is not None message_part = f".\n{self.error}\n" return f"Configuration file {self.reason}{message_part}" + + +_DEFAULT_EXTERNALLY_MANAGED_ERROR = f"""\ +The Python environment under {sys.prefix} is managed externally, and may not be +manipulated by the user. Please use specific tooling from the distributor of +the Python installation to interact with this environment instead. +""" + + +class ExternallyManagedEnvironment(DiagnosticPipError): + """The current environment is externally managed. + + This is raised when the current environment is externally managed, as + defined by `PEP 668`_. The ``EXTERNALLY-MANAGED`` configuration is checked + and displayed when the error is bubbled up to the user. + + :param error: The error message read from ``EXTERNALLY-MANAGED``. + """ + + reference = "externally-managed-environment" + + def __init__(self, error: Optional[str]) -> None: + if error is None: + context = Text(_DEFAULT_EXTERNALLY_MANAGED_ERROR) + else: + context = Text(error) + super().__init__( + message="This environment is externally managed", + context=context, + note_stmt=( + "If you believe this is a mistake, please contact your " + "Python installation or OS distribution provider. " + "You can override this, at the risk of breaking your Python " + "installation or OS, by passing --break-system-packages." + ), + hint_stmt=Text("See PEP 668 for the detailed specification."), + ) + + @staticmethod + def _iter_externally_managed_error_keys() -> Iterator[str]: + # LC_MESSAGES is in POSIX, but not the C standard. The most common + # platform that does not implement this category is Windows, where + # using other categories for console message localization is equally + # unreliable, so we fall back to the locale-less vendor message. This + # can always be re-evaluated when a vendor proposes a new alternative. + try: + category = locale.LC_MESSAGES + except AttributeError: + lang: Optional[str] = None + else: + lang, _ = locale.getlocale(category) + if lang is not None: + yield f"Error-{lang}" + for sep in ("-", "_"): + before, found, _ = lang.partition(sep) + if not found: + continue + yield f"Error-{before}" + yield "Error" + + @classmethod + def from_config( + cls, + config: Union[pathlib.Path, str], + ) -> "ExternallyManagedEnvironment": + parser = configparser.ConfigParser(interpolation=None) + try: + parser.read(config, encoding="utf-8") + section = parser["externally-managed"] + for key in cls._iter_externally_managed_error_keys(): + with contextlib.suppress(KeyError): + return cls(section[key]) + except KeyError: + pass + except (OSError, UnicodeDecodeError, configparser.ParsingError): + from pip._internal.utils._log import VERBOSE + + exc_info = logger.isEnabledFor(VERBOSE) + logger.warning("Failed to read %s", config, exc_info=exc_info) + return cls(None) diff --git a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc index 5e2cc6d2..1303c658 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc index 84667703..01c08099 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc index a8ee1e24..4aa93f62 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc index 3d70a1d3..0e563fa2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/index/collector.py b/.venv/Lib/site-packages/pip/_internal/index/collector.py index 0120610c..b3e293ea 100644 --- a/.venv/Lib/site-packages/pip/_internal/index/collector.py +++ b/.venv/Lib/site-packages/pip/_internal/index/collector.py @@ -354,7 +354,7 @@ def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexCon if not url.endswith("/"): url += "/" # TODO: In the future, it would be nice if pip supported PEP 691 - # style respones in the file:// URLs, however there's no + # style responses in the file:// URLs, however there's no # standard file extension for application/vnd.pypi.simple.v1+json # so we'll need to come up with something on our own. url = urllib.parse.urljoin(url, "index.html") diff --git a/.venv/Lib/site-packages/pip/_internal/index/package_finder.py b/.venv/Lib/site-packages/pip/_internal/index/package_finder.py index 9bf247f0..b6f8d57e 100644 --- a/.venv/Lib/site-packages/pip/_internal/index/package_finder.py +++ b/.venv/Lib/site-packages/pip/_internal/index/package_finder.py @@ -1,14 +1,11 @@ """Routines related to PyPI, indexes""" -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - import enum import functools import itertools import logging import re -from typing import FrozenSet, Iterable, List, Optional, Set, Tuple, Union +from typing import TYPE_CHECKING, FrozenSet, Iterable, List, Optional, Set, Tuple, Union from pip._vendor.packaging import specifiers from pip._vendor.packaging.tags import Tag @@ -39,6 +36,9 @@ from pip._internal.utils.misc import build_netloc from pip._internal.utils.packaging import check_requires_python from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS +if TYPE_CHECKING: + from pip._vendor.typing_extensions import TypeGuard + __all__ = ["FormatControl", "BestCandidateResult", "PackageFinder"] @@ -251,7 +251,7 @@ class LinkEvaluator: def filter_unallowed_hashes( candidates: List[InstallationCandidate], - hashes: Hashes, + hashes: Optional[Hashes], project_name: str, ) -> List[InstallationCandidate]: """ @@ -540,6 +540,7 @@ class CandidateEvaluator: binary_preference = 1 if wheel.build_tag is not None: match = re.match(r"^(\d+)(.*)$", wheel.build_tag) + assert match is not None, "guaranteed by filename validation" build_tag_groups = match.groups() build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) else: # sdist @@ -942,43 +943,46 @@ class PackageFinder: "No matching distribution found for {}".format(req) ) - best_installed = False - if installed_version and ( - best_candidate is None or best_candidate.version <= installed_version - ): - best_installed = True + def _should_install_candidate( + candidate: Optional[InstallationCandidate], + ) -> "TypeGuard[InstallationCandidate]": + if installed_version is None: + return True + if best_candidate is None: + return False + return best_candidate.version > installed_version if not upgrade and installed_version is not None: - if best_installed: - logger.debug( - "Existing installed version (%s) is most up-to-date and " - "satisfies requirement", - installed_version, - ) - else: + if _should_install_candidate(best_candidate): logger.debug( "Existing installed version (%s) satisfies requirement " "(most up-to-date version is %s)", installed_version, best_candidate.version, ) + else: + logger.debug( + "Existing installed version (%s) is most up-to-date and " + "satisfies requirement", + installed_version, + ) return None - if best_installed: - # We have an existing version, and its the best version + if _should_install_candidate(best_candidate): logger.debug( - "Installed version (%s) is most up-to-date (past versions: %s)", - installed_version, + "Using version %s (newest of versions: %s)", + best_candidate.version, _format_versions(best_candidate_result.iter_applicable()), ) - raise BestVersionAlreadyInstalled + return best_candidate + # We have an existing version, and its the best version logger.debug( - "Using version %s (newest of versions: %s)", - best_candidate.version, + "Installed version (%s) is most up-to-date (past versions: %s)", + installed_version, _format_versions(best_candidate_result.iter_applicable()), ) - return best_candidate + raise BestVersionAlreadyInstalled def _find_name_version_sep(fragment: str, canonical_name: str) -> int: diff --git a/.venv/Lib/site-packages/pip/_internal/index/sources.py b/.venv/Lib/site-packages/pip/_internal/index/sources.py index eec3f12f..cd9cb8d4 100644 --- a/.venv/Lib/site-packages/pip/_internal/index/sources.py +++ b/.venv/Lib/site-packages/pip/_internal/index/sources.py @@ -171,7 +171,6 @@ def build_source( expand_dir: bool, cache_link_parsing: bool, ) -> Tuple[Optional[str], Optional[LinkSource]]: - path: Optional[str] = None url: Optional[str] = None if os.path.exists(location): # Is a local path. diff --git a/.venv/Lib/site-packages/pip/_internal/locations/__init__.py b/.venv/Lib/site-packages/pip/_internal/locations/__init__.py index 60afe0a7..d54bc63e 100644 --- a/.venv/Lib/site-packages/pip/_internal/locations/__init__.py +++ b/.venv/Lib/site-packages/pip/_internal/locations/__init__.py @@ -4,7 +4,7 @@ import os import pathlib import sys import sysconfig -from typing import Any, Dict, Generator, List, Optional, Tuple +from typing import Any, Dict, Generator, Optional, Tuple from pip._internal.models.scheme import SCHEME_KEYS, Scheme from pip._internal.utils.compat import WINDOWS @@ -27,7 +27,6 @@ __all__ = [ "get_bin_user", "get_major_minor_version", "get_platlib", - "get_prefixed_libs", "get_purelib", "get_scheme", "get_src_prefix", @@ -466,63 +465,3 @@ def get_platlib() -> str: if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="platlib"): _log_context() return old - - -def _deduplicated(v1: str, v2: str) -> List[str]: - """Deduplicate values from a list.""" - if v1 == v2: - return [v1] - return [v1, v2] - - -def _looks_like_apple_library(path: str) -> bool: - """Apple patches sysconfig to *always* look under */Library/Python*.""" - if sys.platform[:6] != "darwin": - return False - return path == f"/Library/Python/{get_major_minor_version()}/site-packages" - - -def get_prefixed_libs(prefix: str) -> List[str]: - """Return the lib locations under ``prefix``.""" - new_pure, new_plat = _sysconfig.get_prefixed_libs(prefix) - if _USE_SYSCONFIG: - return _deduplicated(new_pure, new_plat) - - old_pure, old_plat = _distutils.get_prefixed_libs(prefix) - old_lib_paths = _deduplicated(old_pure, old_plat) - - # Apple's Python (shipped with Xcode and Command Line Tools) hard-code - # platlib and purelib to '/Library/Python/X.Y/site-packages'. This will - # cause serious build isolation bugs when Apple starts shipping 3.10 because - # pip will install build backends to the wrong location. This tells users - # who is at fault so Apple may notice it and fix the issue in time. - if all(_looks_like_apple_library(p) for p in old_lib_paths): - deprecated( - reason=( - "Python distributed by Apple's Command Line Tools incorrectly " - "patches sysconfig to always point to '/Library/Python'. This " - "will cause build isolation to operate incorrectly on Python " - "3.10 or later. Please help report this to Apple so they can " - "fix this. https://developer.apple.com/bug-reporting/" - ), - replacement=None, - gone_in=None, - ) - return old_lib_paths - - warned = [ - _warn_if_mismatch( - pathlib.Path(old_pure), - pathlib.Path(new_pure), - key="prefixed-purelib", - ), - _warn_if_mismatch( - pathlib.Path(old_plat), - pathlib.Path(new_plat), - key="prefixed-platlib", - ), - ] - if any(warned): - _log_context(prefix=prefix) - - return old_lib_paths diff --git a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc index 739070e4..f8dcabeb 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc index 55c47256..fc75e806 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc index dfd890cd..6a18a12e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc index 9380826b..8237efd2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/locations/_distutils.py b/.venv/Lib/site-packages/pip/_internal/locations/_distutils.py index c7712f01..92bd9317 100644 --- a/.venv/Lib/site-packages/pip/_internal/locations/_distutils.py +++ b/.venv/Lib/site-packages/pip/_internal/locations/_distutils.py @@ -21,7 +21,7 @@ from distutils.cmd import Command as DistutilsCommand from distutils.command.install import SCHEME_KEYS from distutils.command.install import install as distutils_install_command from distutils.sysconfig import get_python_lib -from typing import Dict, List, Optional, Tuple, Union, cast +from typing import Dict, List, Optional, Union, cast from pip._internal.models.scheme import Scheme from pip._internal.utils.compat import WINDOWS @@ -171,10 +171,3 @@ def get_purelib() -> str: def get_platlib() -> str: return get_python_lib(plat_specific=True) - - -def get_prefixed_libs(prefix: str) -> Tuple[str, str]: - return ( - get_python_lib(plat_specific=False, prefix=prefix), - get_python_lib(plat_specific=True, prefix=prefix), - ) diff --git a/.venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py b/.venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py index 0bbc9283..97aef1f1 100644 --- a/.venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +++ b/.venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py @@ -211,8 +211,3 @@ def get_purelib() -> str: def get_platlib() -> str: return sysconfig.get_paths()["platlib"] - - -def get_prefixed_libs(prefix: str) -> typing.Tuple[str, str]: - paths = sysconfig.get_paths(vars={"base": prefix, "platbase": prefix}) - return (paths["purelib"], paths["platlib"]) diff --git a/.venv/Lib/site-packages/pip/_internal/locations/base.py b/.venv/Lib/site-packages/pip/_internal/locations/base.py index 3f7de006..3f9f896e 100644 --- a/.venv/Lib/site-packages/pip/_internal/locations/base.py +++ b/.venv/Lib/site-packages/pip/_internal/locations/base.py @@ -13,7 +13,7 @@ from pip._internal.utils.virtualenv import running_under_virtualenv USER_CACHE_DIR = appdirs.user_cache_dir("pip") # FIXME doesn't account for venv linked to global site-packages -site_packages: typing.Optional[str] = sysconfig.get_path("purelib") +site_packages: str = sysconfig.get_path("purelib") def get_major_minor_version() -> str: diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc index d3da4bb6..75bb1bc7 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc index 73e831de..33f41574 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc index f0b5c0a4..0d54da0a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc index dcbb1571..56c20674 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc index 65794fa3..963cacd5 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc index 861889d2..ced287d5 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc index aeec4148..59ec646c 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc index 04facfdf..f8c6a2f6 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc index 193cfbe1..f730f81b 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc index 9e1b8030..0d6ad1dc 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc index f0489b9f..1a530564 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc index d8adf1e8..b9b96fd7 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc index f00470f3..6ba9d4db 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc index 2170735f..f7542278 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc index 7840dc5a..08b2b8a3 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc index e445a367..ccffbe5d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc index 69b68c9f..b5496254 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc index 85d0fb3b..adcf1edd 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc index a6fc76e4..33ef87e0 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc index 514fe76e..b9ed8893 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/direct_url.py b/.venv/Lib/site-packages/pip/_internal/models/direct_url.py index e75feda9..e219d738 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/direct_url.py +++ b/.venv/Lib/site-packages/pip/_internal/models/direct_url.py @@ -103,17 +103,42 @@ class ArchiveInfo: def __init__( self, hash: Optional[str] = None, + hashes: Optional[Dict[str, str]] = None, ) -> None: + # set hashes before hash, since the hash setter will further populate hashes + self.hashes = hashes self.hash = hash + @property + def hash(self) -> Optional[str]: + return self._hash + + @hash.setter + def hash(self, value: Optional[str]) -> None: + if value is not None: + # Auto-populate the hashes key to upgrade to the new format automatically. + # We don't back-populate the legacy hash key from hashes. + try: + hash_name, hash_value = value.split("=", 1) + except ValueError: + raise DirectUrlValidationError( + f"invalid archive_info.hash format: {value!r}" + ) + if self.hashes is None: + self.hashes = {hash_name: hash_value} + elif hash_name not in self.hashes: + self.hashes = self.hashes.copy() + self.hashes[hash_name] = hash_value + self._hash = value + @classmethod def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["ArchiveInfo"]: if d is None: return None - return cls(hash=_get(d, str, "hash")) + return cls(hash=_get(d, str, "hash"), hashes=_get(d, dict, "hashes")) def _to_dict(self) -> Dict[str, Any]: - return _filter_none(hash=self.hash) + return _filter_none(hash=self.hash, hashes=self.hashes) class DirInfo: diff --git a/.venv/Lib/site-packages/pip/_internal/models/installation_report.py b/.venv/Lib/site-packages/pip/_internal/models/installation_report.py index 965f0952..fef3757f 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/installation_report.py +++ b/.venv/Lib/site-packages/pip/_internal/models/installation_report.py @@ -14,7 +14,7 @@ class InstallationReport: def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]: assert ireq.download_info, f"No download_info for {ireq}" res = { - # PEP 610 json for the download URL. download_info.archive_info.hash may + # PEP 610 json for the download URL. download_info.archive_info.hashes may # be absent when the requirement was installed from the wheel cache # and the cache entry was populated by an older pip version that did not # record origin.json. @@ -38,7 +38,7 @@ class InstallationReport: def to_dict(self) -> Dict[str, Any]: return { - "version": "0", + "version": "1", "pip_version": __version__, "install": [ self._install_req_to_dict(ireq) for ireq in self._install_requirements diff --git a/.venv/Lib/site-packages/pip/_internal/models/link.py b/.venv/Lib/site-packages/pip/_internal/models/link.py index c792d128..e741c328 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/link.py +++ b/.venv/Lib/site-packages/pip/_internal/models/link.py @@ -18,6 +18,7 @@ from typing import ( Union, ) +from pip._internal.utils.deprecation import deprecated from pip._internal.utils.filetypes import WHEEL_EXTENSION from pip._internal.utils.hashes import Hashes from pip._internal.utils.misc import ( @@ -54,30 +55,45 @@ class LinkHash: name: str value: str - _hash_re = re.compile( + _hash_url_fragment_re = re.compile( # NB: we do not validate that the second group (.*) is a valid hex # digest. Instead, we simply keep that string in this class, and then check it # against Hashes when hash-checking is needed. This is easier to debug than # proactively discarding an invalid hex digest, as we handle incorrect hashes # and malformed hashes in the same place. - r"({choices})=(.*)".format( + r"[#&]({choices})=([^&]*)".format( choices="|".join(re.escape(hash_name) for hash_name in _SUPPORTED_HASHES) ), ) def __post_init__(self) -> None: - assert self._hash_re.match(f"{self.name}={self.value}") + assert self.name in _SUPPORTED_HASHES + + @classmethod + def parse_pep658_hash(cls, dist_info_metadata: str) -> Optional["LinkHash"]: + """Parse a PEP 658 data-dist-info-metadata hash.""" + if dist_info_metadata == "true": + return None + name, sep, value = dist_info_metadata.partition("=") + if not sep: + return None + if name not in _SUPPORTED_HASHES: + return None + return cls(name=name, value=value) @classmethod @functools.lru_cache(maxsize=None) - def split_hash_name_and_value(cls, url: str) -> Optional["LinkHash"]: + def find_hash_url_fragment(cls, url: str) -> Optional["LinkHash"]: """Search a string for a checksum algorithm name and encoded output value.""" - match = cls._hash_re.search(url) + match = cls._hash_url_fragment_re.search(url) if match is None: return None name, value = match.groups() return cls(name=name, value=value) + def as_dict(self) -> Dict[str, str]: + return {self.name: self.value} + def as_hashes(self) -> Hashes: """Return a Hashes instance which checks only for the current hash.""" return Hashes({self.name: [self.value]}) @@ -164,8 +180,8 @@ class Link(KeyBasedCompareMixin): "requires_python", "yanked_reason", "dist_info_metadata", - "link_hash", "cache_link_parsing", + "egg_fragment", ] def __init__( @@ -175,7 +191,6 @@ class Link(KeyBasedCompareMixin): requires_python: Optional[str] = None, yanked_reason: Optional[str] = None, dist_info_metadata: Optional[str] = None, - link_hash: Optional[LinkHash] = None, cache_link_parsing: bool = True, hashes: Optional[Mapping[str, str]] = None, ) -> None: @@ -198,16 +213,11 @@ class Link(KeyBasedCompareMixin): attribute, if present, in a simple repository HTML link. This may be parsed into its own `Link` by `self.metadata_link()`. See PEP 658 for more information and the specification. - :param link_hash: a checksum for the content the link points to. If not - provided, this will be extracted from the link URL, if the URL has - any checksum. :param cache_link_parsing: A flag that is used elsewhere to determine - whether resources retrieved from this link - should be cached. PyPI index urls should - generally have this set to False, for - example. + whether resources retrieved from this link should be cached. PyPI + URLs should generally have this set to False, for example. :param hashes: A mapping of hash names to digests to allow us to - determine the validity of a download. + determine the validity of a download. """ # url can be a UNC windows share @@ -218,17 +228,23 @@ class Link(KeyBasedCompareMixin): # Store the url as a private attribute to prevent accidentally # trying to set a new value. self._url = url - self._hashes = hashes if hashes is not None else {} + + link_hash = LinkHash.find_hash_url_fragment(url) + hashes_from_link = {} if link_hash is None else link_hash.as_dict() + if hashes is None: + self._hashes = hashes_from_link + else: + self._hashes = {**hashes, **hashes_from_link} self.comes_from = comes_from self.requires_python = requires_python if requires_python else None self.yanked_reason = yanked_reason self.dist_info_metadata = dist_info_metadata - self.link_hash = link_hash or LinkHash.split_hash_name_and_value(self._url) super().__init__(key=url, defining_class=Link) self.cache_link_parsing = cache_link_parsing + self.egg_fragment = self._egg_fragment() @classmethod def from_json( @@ -358,12 +374,28 @@ class Link(KeyBasedCompareMixin): _egg_fragment_re = re.compile(r"[#&]egg=([^&]*)") - @property - def egg_fragment(self) -> Optional[str]: + # Per PEP 508. + _project_name_re = re.compile( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE + ) + + def _egg_fragment(self) -> Optional[str]: match = self._egg_fragment_re.search(self._url) if not match: return None - return match.group(1) + + # An egg fragment looks like a PEP 508 project name, along with + # an optional extras specifier. Anything else is invalid. + project_name = match.group(1) + if not self._project_name_re.match(project_name): + deprecated( + reason=f"{self} contains an egg fragment with a non-PEP 508 name", + replacement="to use the req @ url syntax, and remove the egg fragment", + gone_in="25.0", + issue=11617, + ) + + return project_name _subdirectory_fragment_re = re.compile(r"[#&]subdirectory=([^&]*)") @@ -382,29 +414,21 @@ class Link(KeyBasedCompareMixin): if self.dist_info_metadata is None: return None metadata_url = f"{self.url_without_fragment}.metadata" - link_hash: Optional[LinkHash] = None - # If data-dist-info-metadata="true" is set, then the metadata file exists, - # but there is no information about its checksum or anything else. - if self.dist_info_metadata != "true": - link_hash = LinkHash.split_hash_name_and_value(self.dist_info_metadata) - return Link(metadata_url, link_hash=link_hash) + metadata_link_hash = LinkHash.parse_pep658_hash(self.dist_info_metadata) + if metadata_link_hash is None: + return Link(metadata_url) + return Link(metadata_url, hashes=metadata_link_hash.as_dict()) - def as_hashes(self) -> Optional[Hashes]: - if self.link_hash is not None: - return self.link_hash.as_hashes() - return None + def as_hashes(self) -> Hashes: + return Hashes({k: [v] for k, v in self._hashes.items()}) @property def hash(self) -> Optional[str]: - if self.link_hash is not None: - return self.link_hash.value - return None + return next(iter(self._hashes.values()), None) @property def hash_name(self) -> Optional[str]: - if self.link_hash is not None: - return self.link_hash.name - return None + return next(iter(self._hashes), None) @property def show_url(self) -> str: @@ -433,15 +457,15 @@ class Link(KeyBasedCompareMixin): @property def has_hash(self) -> bool: - return self.link_hash is not None + return bool(self._hashes) def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool: """ Return True if the link has a hash and it is allowed by `hashes`. """ - if self.link_hash is None: + if hashes is None: return False - return self.link_hash.is_hash_allowed(hashes) + return any(hashes.is_hash_allowed(k, v) for k, v in self._hashes.items()) class _CleanResult(NamedTuple): diff --git a/.venv/Lib/site-packages/pip/_internal/models/search_scope.py b/.venv/Lib/site-packages/pip/_internal/models/search_scope.py index a64af738..fe61e811 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/search_scope.py +++ b/.venv/Lib/site-packages/pip/_internal/models/search_scope.py @@ -79,7 +79,6 @@ class SearchScope: redacted_index_urls = [] if self.index_urls and self.index_urls != [PyPI.simple_url]: for url in self.index_urls: - redacted_index_url = redact_auth_from_url(url) # Parse the URL diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc index 81fe3aeb..b61a0e66 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc index 534da8a2..9e097f6f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc index 1e725609..3d312def 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc index 51ca7bbe..9d825700 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc index e26e904b..ed9cc2a3 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc index 64cb9dd6..55422708 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc index 26d44d3a..18953d9b 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc index 2eff395b..fcb1ac78 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/auth.py b/.venv/Lib/site-packages/pip/_internal/network/auth.py index ca42798b..c0efa765 100644 --- a/.venv/Lib/site-packages/pip/_internal/network/auth.py +++ b/.venv/Lib/site-packages/pip/_internal/network/auth.py @@ -3,9 +3,18 @@ Contains interface (MultiDomainBasicAuth) and associated glue code for providing credentials in the context of network requests. """ - +import logging +import os +import shutil +import subprocess +import sysconfig +import typing import urllib.parse -from typing import Any, Dict, List, Optional, Tuple +from abc import ABC, abstractmethod +from functools import lru_cache +from os.path import commonprefix +from pathlib import Path +from typing import Any, Dict, List, NamedTuple, Optional, Tuple from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth from pip._vendor.requests.models import Request, Response @@ -23,59 +32,204 @@ from pip._internal.vcs.versioncontrol import AuthInfo logger = getLogger(__name__) -Credentials = Tuple[str, str, str] - -try: - import keyring -except ImportError: - keyring = None # type: ignore[assignment] -except Exception as exc: - logger.warning( - "Keyring is skipped due to an exception: %s", - str(exc), - ) - keyring = None # type: ignore[assignment] +KEYRING_DISABLED = False -def get_keyring_auth(url: Optional[str], username: Optional[str]) -> Optional[AuthInfo]: - """Return the tuple auth for a given url from keyring.""" - global keyring - if not url or not keyring: +class Credentials(NamedTuple): + url: str + username: str + password: str + + +class KeyRingBaseProvider(ABC): + """Keyring base provider interface""" + + has_keyring: bool + + @abstractmethod + def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: + ... + + @abstractmethod + def save_auth_info(self, url: str, username: str, password: str) -> None: + ... + + +class KeyRingNullProvider(KeyRingBaseProvider): + """Keyring null provider""" + + has_keyring = False + + def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: return None - try: - try: - get_credential = keyring.get_credential - except AttributeError: - pass - else: + def save_auth_info(self, url: str, username: str, password: str) -> None: + return None + + +class KeyRingPythonProvider(KeyRingBaseProvider): + """Keyring interface which uses locally imported `keyring`""" + + has_keyring = True + + def __init__(self) -> None: + import keyring + + self.keyring = keyring + + def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: + # Support keyring's get_credential interface which supports getting + # credentials without a username. This is only available for + # keyring>=15.2.0. + if hasattr(self.keyring, "get_credential"): logger.debug("Getting credentials from keyring for %s", url) - cred = get_credential(url, username) + cred = self.keyring.get_credential(url, username) if cred is not None: return cred.username, cred.password return None - if username: + if username is not None: logger.debug("Getting password from keyring for %s", url) - password = keyring.get_password(url, username) + password = self.keyring.get_password(url, username) if password: return username, password + return None - except Exception as exc: - logger.warning( - "Keyring is skipped due to an exception: %s", - str(exc), + def save_auth_info(self, url: str, username: str, password: str) -> None: + self.keyring.set_password(url, username, password) + + +class KeyRingCliProvider(KeyRingBaseProvider): + """Provider which uses `keyring` cli + + Instead of calling the keyring package installed alongside pip + we call keyring on the command line which will enable pip to + use which ever installation of keyring is available first in + PATH. + """ + + has_keyring = True + + def __init__(self, cmd: str) -> None: + self.keyring = cmd + + def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: + # This is the default implementation of keyring.get_credential + # https://github.com/jaraco/keyring/blob/97689324abcf01bd1793d49063e7ca01e03d7d07/keyring/backend.py#L134-L139 + if username is not None: + password = self._get_password(url, username) + if password is not None: + return username, password + return None + + def save_auth_info(self, url: str, username: str, password: str) -> None: + return self._set_password(url, username, password) + + def _get_password(self, service_name: str, username: str) -> Optional[str]: + """Mirror the implementation of keyring.get_password using cli""" + if self.keyring is None: + return None + + cmd = [self.keyring, "get", service_name, username] + env = os.environ.copy() + env["PYTHONIOENCODING"] = "utf-8" + res = subprocess.run( + cmd, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + env=env, ) - keyring = None # type: ignore[assignment] - return None + if res.returncode: + return None + return res.stdout.decode("utf-8").strip(os.linesep) + + def _set_password(self, service_name: str, username: str, password: str) -> None: + """Mirror the implementation of keyring.set_password using cli""" + if self.keyring is None: + return None + env = os.environ.copy() + env["PYTHONIOENCODING"] = "utf-8" + subprocess.run( + [self.keyring, "set", service_name, username], + input=f"{password}{os.linesep}".encode("utf-8"), + env=env, + check=True, + ) + return None + + +@lru_cache(maxsize=None) +def get_keyring_provider(provider: str) -> KeyRingBaseProvider: + logger.verbose("Keyring provider requested: %s", provider) + + # keyring has previously failed and been disabled + if KEYRING_DISABLED: + provider = "disabled" + if provider in ["import", "auto"]: + try: + impl = KeyRingPythonProvider() + logger.verbose("Keyring provider set: import") + return impl + except ImportError: + pass + except Exception as exc: + # In the event of an unexpected exception + # we should warn the user + msg = "Installed copy of keyring fails with exception %s" + if provider == "auto": + msg = msg + ", trying to find a keyring executable as a fallback" + logger.warning(msg, exc, exc_info=logger.isEnabledFor(logging.DEBUG)) + if provider in ["subprocess", "auto"]: + cli = shutil.which("keyring") + if cli and cli.startswith(sysconfig.get_path("scripts")): + # all code within this function is stolen from shutil.which implementation + @typing.no_type_check + def PATH_as_shutil_which_determines_it() -> str: + path = os.environ.get("PATH", None) + if path is None: + try: + path = os.confstr("CS_PATH") + except (AttributeError, ValueError): + # os.confstr() or CS_PATH is not available + path = os.defpath + # bpo-35755: Don't use os.defpath if the PATH environment variable is + # set to an empty string + + return path + + scripts = Path(sysconfig.get_path("scripts")) + + paths = [] + for path in PATH_as_shutil_which_determines_it().split(os.pathsep): + p = Path(path) + try: + if not p.samefile(scripts): + paths.append(path) + except FileNotFoundError: + pass + + path = os.pathsep.join(paths) + + cli = shutil.which("keyring", path=path) + + if cli: + logger.verbose("Keyring provider set: subprocess with executable %s", cli) + return KeyRingCliProvider(cli) + + logger.verbose("Keyring provider set: disabled") + return KeyRingNullProvider() class MultiDomainBasicAuth(AuthBase): def __init__( - self, prompting: bool = True, index_urls: Optional[List[str]] = None + self, + prompting: bool = True, + index_urls: Optional[List[str]] = None, + keyring_provider: str = "auto", ) -> None: self.prompting = prompting self.index_urls = index_urls + self.keyring_provider = keyring_provider # type: ignore[assignment] self.passwords: Dict[str, AuthInfo] = {} # When the user is prompted to enter credentials and keyring is # available, we will offer to save them. If the user accepts, @@ -84,6 +238,47 @@ class MultiDomainBasicAuth(AuthBase): # ``save_credentials`` to save these. self._credentials_to_save: Optional[Credentials] = None + @property + def keyring_provider(self) -> KeyRingBaseProvider: + return get_keyring_provider(self._keyring_provider) + + @keyring_provider.setter + def keyring_provider(self, provider: str) -> None: + # The free function get_keyring_provider has been decorated with + # functools.cache. If an exception occurs in get_keyring_auth that + # cache will be cleared and keyring disabled, take that into account + # if you want to remove this indirection. + self._keyring_provider = provider + + @property + def use_keyring(self) -> bool: + # We won't use keyring when --no-input is passed unless + # a specific provider is requested because it might require + # user interaction + return self.prompting or self._keyring_provider not in ["auto", "disabled"] + + def _get_keyring_auth( + self, + url: Optional[str], + username: Optional[str], + ) -> Optional[AuthInfo]: + """Return the tuple auth for a given url from keyring.""" + # Do nothing if no url was provided + if not url: + return None + + try: + return self.keyring_provider.get_auth_info(url, username) + except Exception as exc: + logger.warning( + "Keyring is skipped due to an exception: %s", + str(exc), + ) + global KEYRING_DISABLED + KEYRING_DISABLED = True + get_keyring_provider.cache_clear() + return None + def _get_index_url(self, url: str) -> Optional[str]: """Return the original index URL matching the requested URL. @@ -100,15 +295,42 @@ class MultiDomainBasicAuth(AuthBase): if not url or not self.index_urls: return None - for u in self.index_urls: - prefix = remove_auth_from_url(u).rstrip("/") + "/" - if url.startswith(prefix): - return u - return None + url = remove_auth_from_url(url).rstrip("/") + "/" + parsed_url = urllib.parse.urlsplit(url) + + candidates = [] + + for index in self.index_urls: + index = index.rstrip("/") + "/" + parsed_index = urllib.parse.urlsplit(remove_auth_from_url(index)) + if parsed_url == parsed_index: + return index + + if parsed_url.netloc != parsed_index.netloc: + continue + + candidate = urllib.parse.urlsplit(index) + candidates.append(candidate) + + if not candidates: + return None + + candidates.sort( + reverse=True, + key=lambda candidate: commonprefix( + [ + parsed_url.path, + candidate.path, + ] + ).rfind("/"), + ) + + return urllib.parse.urlunsplit(candidates[0]) def _get_new_credentials( self, original_url: str, + *, allow_netrc: bool = True, allow_keyring: bool = False, ) -> AuthInfo: @@ -152,8 +374,8 @@ class MultiDomainBasicAuth(AuthBase): # The index url is more specific than the netloc, so try it first # fmt: off kr_auth = ( - get_keyring_auth(index_url, username) or - get_keyring_auth(netloc, username) + self._get_keyring_auth(index_url, username) or + self._get_keyring_auth(netloc, username) ) # fmt: on if kr_auth: @@ -230,18 +452,23 @@ class MultiDomainBasicAuth(AuthBase): def _prompt_for_password( self, netloc: str ) -> Tuple[Optional[str], Optional[str], bool]: - username = ask_input(f"User for {netloc}: ") + username = ask_input(f"User for {netloc}: ") if self.prompting else None if not username: return None, None, False - auth = get_keyring_auth(netloc, username) - if auth and auth[0] is not None and auth[1] is not None: - return auth[0], auth[1], False + if self.use_keyring: + auth = self._get_keyring_auth(netloc, username) + if auth and auth[0] is not None and auth[1] is not None: + return auth[0], auth[1], False password = ask_password("Password: ") return username, password, True # Factored out to allow for easy patching in tests def _should_save_password_to_keyring(self) -> bool: - if not keyring: + if ( + not self.prompting + or not self.use_keyring + or not self.keyring_provider.has_keyring + ): return False return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y" @@ -251,19 +478,22 @@ class MultiDomainBasicAuth(AuthBase): if resp.status_code != 401: return resp + username, password = None, None + + # Query the keyring for credentials: + if self.use_keyring: + username, password = self._get_new_credentials( + resp.url, + allow_netrc=False, + allow_keyring=True, + ) + # We are not able to prompt the user so simply return the response - if not self.prompting: + if not self.prompting and not username and not password: return resp parsed = urllib.parse.urlparse(resp.url) - # Query the keyring for credentials: - username, password = self._get_new_credentials( - resp.url, - allow_netrc=False, - allow_keyring=True, - ) - # Prompt the user for a new username and password save = False if not username and not password: @@ -276,7 +506,11 @@ class MultiDomainBasicAuth(AuthBase): # Prompt to save the password to keyring if save and self._should_save_password_to_keyring(): - self._credentials_to_save = (parsed.netloc, username, password) + self._credentials_to_save = Credentials( + url=parsed.netloc, + username=username, + password=password, + ) # Consume content and release the original connection to allow our new # request to reuse the same one. @@ -309,15 +543,17 @@ class MultiDomainBasicAuth(AuthBase): def save_credentials(self, resp: Response, **kwargs: Any) -> None: """Response callback to save credentials on success.""" - assert keyring is not None, "should never reach here without keyring" - if not keyring: - return + assert ( + self.keyring_provider.has_keyring + ), "should never reach here without keyring" creds = self._credentials_to_save self._credentials_to_save = None if creds and resp.status_code < 400: try: logger.info("Saving credentials to keyring") - keyring.set_password(*creds) + self.keyring_provider.save_auth_info( + creds.url, creds.username, creds.password + ) except Exception: logger.exception("Failed to save credentials") diff --git a/.venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py b/.venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py index 854a6fa1..82ec50d5 100644 --- a/.venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +++ b/.venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py @@ -6,7 +6,7 @@ from bisect import bisect_left, bisect_right from contextlib import contextmanager from tempfile import NamedTemporaryFile from typing import Any, Dict, Generator, List, Optional, Tuple -from zipfile import BadZipfile, ZipFile +from zipfile import BadZipFile, ZipFile from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response @@ -160,7 +160,7 @@ class LazyZipOverHTTP: # For read-only ZIP files, ZipFile only needs # methods read, seek, seekable and tell. ZipFile(self) # type: ignore - except BadZipfile: + except BadZipFile: pass else: break diff --git a/.venv/Lib/site-packages/pip/_internal/network/session.py b/.venv/Lib/site-packages/pip/_internal/network/session.py index e512ac78..6c40ade1 100644 --- a/.venv/Lib/site-packages/pip/_internal/network/session.py +++ b/.venv/Lib/site-packages/pip/_internal/network/session.py @@ -316,7 +316,6 @@ class InsecureCacheControlAdapter(CacheControlAdapter): class PipSession(requests.Session): - timeout: Optional[int] = None def __init__( diff --git a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc index 8883ec62..ba993b09 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc index 161616ef..e0c01bc7 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc index 6ed3539e..09c2853f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc index 8963dcef..0e0102f2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc index fb329933..b9d4772e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc index dfcc086f..c7cf4b27 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc index ac9de6b5..5e6fb0e3 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc index f74f21f4..678ca78c 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc index f6bcafad..cde65a4c 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc index 5c9d3ed1..6fa2f5d1 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc index 831d144c..0712afb1 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc index 570b5618..9520c0d5 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/metadata.py b/.venv/Lib/site-packages/pip/_internal/operations/build/metadata.py index e2b7b444..c66ac354 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/build/metadata.py @@ -3,7 +3,7 @@ import os -from pip._vendor.pep517.wrappers import Pep517HookCaller +from pip._vendor.pyproject_hooks import BuildBackendHookCaller from pip._internal.build_env import BuildEnvironment from pip._internal.exceptions import ( @@ -15,7 +15,7 @@ from pip._internal.utils.temp_dir import TempDirectory def generate_metadata( - build_env: BuildEnvironment, backend: Pep517HookCaller, details: str + build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str ) -> str: """Generate metadata using mechanisms described in PEP 517. @@ -26,7 +26,7 @@ def generate_metadata( metadata_dir = metadata_tmpdir.path with build_env: - # Note that Pep517HookCaller implements a fallback for + # Note that BuildBackendHookCaller implements a fallback for # prepare_metadata_for_build_wheel, so we don't have to # consider the possibility that this hook doesn't exist. runner = runner_with_spinner_message("Preparing metadata (pyproject.toml)") diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py b/.venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py index 4c3f48b6..27c69f0d 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py @@ -3,7 +3,7 @@ import os -from pip._vendor.pep517.wrappers import Pep517HookCaller +from pip._vendor.pyproject_hooks import BuildBackendHookCaller from pip._internal.build_env import BuildEnvironment from pip._internal.exceptions import ( @@ -15,7 +15,7 @@ from pip._internal.utils.temp_dir import TempDirectory def generate_editable_metadata( - build_env: BuildEnvironment, backend: Pep517HookCaller, details: str + build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str ) -> str: """Generate metadata using mechanisms described in PEP 660. @@ -26,7 +26,7 @@ def generate_editable_metadata( metadata_dir = metadata_tmpdir.path with build_env: - # Note that Pep517HookCaller implements a fallback for + # Note that BuildBackendHookCaller implements a fallback for # prepare_metadata_for_build_wheel/editable, so we don't have to # consider the possibility that this hook doesn't exist. runner = runner_with_spinner_message( diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/wheel.py b/.venv/Lib/site-packages/pip/_internal/operations/build/wheel.py index b0d2fc9e..064811ad 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/build/wheel.py @@ -2,7 +2,7 @@ import logging import os from typing import Optional -from pip._vendor.pep517.wrappers import Pep517HookCaller +from pip._vendor.pyproject_hooks import BuildBackendHookCaller from pip._internal.utils.subprocess import runner_with_spinner_message @@ -11,7 +11,7 @@ logger = logging.getLogger(__name__) def build_wheel_pep517( name: str, - backend: Pep517HookCaller, + backend: BuildBackendHookCaller, metadata_directory: str, tempd: str, ) -> Optional[str]: diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py b/.venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py index cf7b01ae..719d69dd 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py @@ -2,7 +2,7 @@ import logging import os from typing import Optional -from pip._vendor.pep517.wrappers import HookMissing, Pep517HookCaller +from pip._vendor.pyproject_hooks import BuildBackendHookCaller, HookMissing from pip._internal.utils.subprocess import runner_with_spinner_message @@ -11,7 +11,7 @@ logger = logging.getLogger(__name__) def build_wheel_editable( name: str, - backend: Pep517HookCaller, + backend: BuildBackendHookCaller, metadata_directory: str, tempd: str, ) -> Optional[str]: diff --git a/.venv/Lib/site-packages/pip/_internal/operations/check.py b/.venv/Lib/site-packages/pip/_internal/operations/check.py index fb3ac8b9..e3bce69b 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/check.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/check.py @@ -75,7 +75,7 @@ def check_package_set( if name not in package_set: missed = True if req.marker is not None: - missed = req.marker.evaluate() + missed = req.marker.evaluate({"extra": ""}) if missed: missing_deps.add((name, req)) continue diff --git a/.venv/Lib/site-packages/pip/_internal/operations/freeze.py b/.venv/Lib/site-packages/pip/_internal/operations/freeze.py index 930d4c60..35445684 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/freeze.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/freeze.py @@ -145,9 +145,10 @@ def freeze( def _format_as_name_version(dist: BaseDistribution) -> str: - if isinstance(dist.version, Version): - return f"{dist.raw_name}=={dist.version}" - return f"{dist.raw_name}==={dist.version}" + dist_version = dist.version + if isinstance(dist_version, Version): + return f"{dist.raw_name}=={dist_version}" + return f"{dist.raw_name}==={dist_version}" def _get_editable_info(dist: BaseDistribution) -> _EditableInfo: diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc index 8fcbbfb8..bfd1d723 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc index 6661c12e..f807da0e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-311.pyc deleted file mode 100644 index 790236e2..00000000 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc index 370dedc6..a672ecf0 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py b/.venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py index bb548cdc..bebe24e6 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py @@ -1,7 +1,7 @@ """Legacy editable installation process, i.e. `setup.py develop`. """ import logging -from typing import List, Optional, Sequence +from typing import Optional, Sequence from pip._internal.build_env import BuildEnvironment from pip._internal.utils.logging import indent_log @@ -12,7 +12,7 @@ logger = logging.getLogger(__name__) def install_editable( - install_options: List[str], + *, global_options: Sequence[str], prefix: Optional[str], home: Optional[str], @@ -31,7 +31,6 @@ def install_editable( args = make_setuptools_develop_args( setup_py_path, global_options=global_options, - install_options=install_options, no_user_config=isolated, prefix=prefix, home=home, diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/legacy.py b/.venv/Lib/site-packages/pip/_internal/operations/install/legacy.py deleted file mode 100644 index 290967dd..00000000 --- a/.venv/Lib/site-packages/pip/_internal/operations/install/legacy.py +++ /dev/null @@ -1,120 +0,0 @@ -"""Legacy installation process, i.e. `setup.py install`. -""" - -import logging -import os -from typing import List, Optional, Sequence - -from pip._internal.build_env import BuildEnvironment -from pip._internal.exceptions import InstallationError, LegacyInstallFailure -from pip._internal.locations.base import change_root -from pip._internal.models.scheme import Scheme -from pip._internal.utils.misc import ensure_dir -from pip._internal.utils.setuptools_build import make_setuptools_install_args -from pip._internal.utils.subprocess import runner_with_spinner_message -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -def write_installed_files_from_setuptools_record( - record_lines: List[str], - root: Optional[str], - req_description: str, -) -> None: - def prepend_root(path: str) -> str: - if root is None or not os.path.isabs(path): - return path - else: - return change_root(root, path) - - for line in record_lines: - directory = os.path.dirname(line) - if directory.endswith(".egg-info"): - egg_info_dir = prepend_root(directory) - break - else: - message = ( - "{} did not indicate that it installed an " - ".egg-info directory. Only setup.py projects " - "generating .egg-info directories are supported." - ).format(req_description) - raise InstallationError(message) - - new_lines = [] - for line in record_lines: - filename = line.strip() - if os.path.isdir(filename): - filename += os.path.sep - new_lines.append(os.path.relpath(prepend_root(filename), egg_info_dir)) - new_lines.sort() - ensure_dir(egg_info_dir) - inst_files_path = os.path.join(egg_info_dir, "installed-files.txt") - with open(inst_files_path, "w") as f: - f.write("\n".join(new_lines) + "\n") - - -def install( - install_options: List[str], - global_options: Sequence[str], - root: Optional[str], - home: Optional[str], - prefix: Optional[str], - use_user_site: bool, - pycompile: bool, - scheme: Scheme, - setup_py_path: str, - isolated: bool, - req_name: str, - build_env: BuildEnvironment, - unpacked_source_directory: str, - req_description: str, -) -> bool: - - header_dir = scheme.headers - - with TempDirectory(kind="record") as temp_dir: - try: - record_filename = os.path.join(temp_dir.path, "install-record.txt") - install_args = make_setuptools_install_args( - setup_py_path, - global_options=global_options, - install_options=install_options, - record_filename=record_filename, - root=root, - prefix=prefix, - header_dir=header_dir, - home=home, - use_user_site=use_user_site, - no_user_config=isolated, - pycompile=pycompile, - ) - - runner = runner_with_spinner_message( - f"Running setup.py install for {req_name}" - ) - with build_env: - runner( - cmd=install_args, - cwd=unpacked_source_directory, - ) - - if not os.path.exists(record_filename): - logger.debug("Record file %s not found", record_filename) - # Signal to the caller that we didn't install the new package - return False - - except Exception as e: - # Signal to the caller that we didn't install the new package - raise LegacyInstallFailure(package_details=req_name) from e - - # At this point, we have successfully installed the requirement. - - # We intentionally do not use any encoding to read the file because - # setuptools writes the file using distutils.file_util.write_file, - # which does not specify an encoding. - with open(record_filename) as f: - record_lines = f.read().splitlines() - - write_installed_files_from_setuptools_record(record_lines, root, req_description) - return True diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/wheel.py b/.venv/Lib/site-packages/pip/_internal/operations/install/wheel.py index 1650d59a..a8cd1330 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/install/wheel.py @@ -143,16 +143,18 @@ def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]: # We don't want to warn for directories that are on PATH. not_warn_dirs = [ - os.path.normcase(i).rstrip(os.sep) + os.path.normcase(os.path.normpath(i)).rstrip(os.sep) for i in os.environ.get("PATH", "").split(os.pathsep) ] # If an executable sits with sys.executable, we don't warn for it. # This covers the case of venv invocations without activating the venv. - not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) + not_warn_dirs.append( + os.path.normcase(os.path.normpath(os.path.dirname(sys.executable))) + ) warn_for: Dict[str, Set[str]] = { parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() - if os.path.normcase(parent_dir) not in not_warn_dirs + if os.path.normcase(os.path.normpath(parent_dir)) not in not_warn_dirs } if not warn_for: return None @@ -325,7 +327,7 @@ def get_console_script_specs(console: Dict[str, str]) -> List[str]: scripts_to_generate.append(f"pip{get_major_minor_version()} = {pip_script}") # Delete any other versioned pip entry points - pip_ep = [k for k in console if re.match(r"pip(\d(\.\d)?)?$", k)] + pip_ep = [k for k in console if re.match(r"pip(\d+(\.\d+)?)?$", k)] for k in pip_ep: del console[k] easy_install_script = console.pop("easy_install", None) @@ -340,7 +342,7 @@ def get_console_script_specs(console: Dict[str, str]) -> List[str]: ) # Delete any other versioned easy_install entry points easy_install_ep = [ - k for k in console if re.match(r"easy_install(-\d\.\d)?$", k) + k for k in console if re.match(r"easy_install(-\d+\.\d+)?$", k) ] for k in easy_install_ep: del console[k] diff --git a/.venv/Lib/site-packages/pip/_internal/operations/prepare.py b/.venv/Lib/site-packages/pip/_internal/operations/prepare.py index 4bf414cb..22733152 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/prepare.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/prepare.py @@ -179,7 +179,10 @@ def unpack_url( def _check_download_dir( - link: Link, download_dir: str, hashes: Optional[Hashes] + link: Link, + download_dir: str, + hashes: Optional[Hashes], + warn_on_hash_mismatch: bool = True, ) -> Optional[str]: """Check download_dir for previously downloaded file with correct hash If a correct file is found return its path else None @@ -195,10 +198,11 @@ def _check_download_dir( try: hashes.check_against_path(download_path) except HashMismatch: - logger.warning( - "Previously-downloaded file %s has bad hash. Re-downloading.", - download_path, - ) + if warn_on_hash_mismatch: + logger.warning( + "Previously-downloaded file %s has bad hash. Re-downloading.", + download_path, + ) os.unlink(download_path) return None return download_path @@ -263,18 +267,28 @@ class RequirementPreparer: def _log_preparing_link(self, req: InstallRequirement) -> None: """Provide context for the requirement being prepared.""" - if req.link.is_file and not req.original_link_is_in_wheel_cache: + if req.link.is_file and not req.is_wheel_from_cache: message = "Processing %s" information = str(display_path(req.link.file_path)) else: message = "Collecting %s" information = str(req.req or req) + # If we used req.req, inject requirement source if available (this + # would already be included if we used req directly) + if req.req and req.comes_from: + if isinstance(req.comes_from, str): + comes_from: Optional[str] = req.comes_from + else: + comes_from = req.comes_from.from_path() + if comes_from: + information += f" (from {comes_from})" + if (message, information) != self._previous_requirement_header: self._previous_requirement_header = (message, information) logger.info(message, information) - if req.original_link_is_in_wheel_cache: + if req.is_wheel_from_cache: with indent_log(): logger.info("Using cached %s", req.link.filename) @@ -475,7 +489,18 @@ class RequirementPreparer: file_path = None if self.download_dir is not None and req.link.is_wheel: hashes = self._get_linked_req_hashes(req) - file_path = _check_download_dir(req.link, self.download_dir, hashes) + file_path = _check_download_dir( + req.link, + self.download_dir, + hashes, + # When a locally built wheel has been found in cache, we don't warn + # about re-downloading when the already downloaded wheel hash does + # not match. This is because the hash must be checked against the + # original link, not the cached link. It that case the already + # downloaded file will be removed and re-fetched from cache (which + # implies a hash check against the cache entry's origin.json). + warn_on_hash_mismatch=not req.is_wheel_from_cache, + ) if file_path is not None: # The file is already available, so mark it as downloaded @@ -526,9 +551,35 @@ class RequirementPreparer: assert req.link link = req.link - self._ensure_link_req_src_dir(req, parallel_builds) hashes = self._get_linked_req_hashes(req) + if hashes and req.is_wheel_from_cache: + assert req.download_info is not None + assert link.is_wheel + assert link.is_file + # We need to verify hashes, and we have found the requirement in the cache + # of locally built wheels. + if ( + isinstance(req.download_info.info, ArchiveInfo) + and req.download_info.info.hashes + and hashes.has_one_of(req.download_info.info.hashes) + ): + # At this point we know the requirement was built from a hashable source + # artifact, and we verified that the cache entry's hash of the original + # artifact matches one of the hashes we expect. We don't verify hashes + # against the cached wheel, because the wheel is not the original. + hashes = None + else: + logger.warning( + "The hashes of the source archive found in cache entry " + "don't match, ignoring cached built wheel " + "and re-downloading source." + ) + req.link = req.cached_wheel_source_link + link = req.link + + self._ensure_link_req_src_dir(req, parallel_builds) + if link.is_existing_dir(): local_file = None elif link.url not in self._downloaded: @@ -561,12 +612,15 @@ class RequirementPreparer: # Make sure we have a hash in download_info. If we got it as part of the # URL, it will have been verified and we can rely on it. Otherwise we # compute it from the downloaded file. + # FIXME: https://github.com/pypa/pip/issues/11943 if ( isinstance(req.download_info.info, ArchiveInfo) - and not req.download_info.info.hash + and not req.download_info.info.hashes and local_file ): hash = hash_file(local_file.path)[0].hexdigest() + # We populate info.hash for backward compatibility. + # This will automatically populate info.hashes. req.download_info.info.hash = f"sha256={hash}" # For use in later processing, diff --git a/.venv/Lib/site-packages/pip/_internal/pyproject.py b/.venv/Lib/site-packages/pip/_internal/pyproject.py index 1e9119f3..eb8e12b2 100644 --- a/.venv/Lib/site-packages/pip/_internal/pyproject.py +++ b/.venv/Lib/site-packages/pip/_internal/pyproject.py @@ -91,14 +91,19 @@ def load_pyproject_toml( # If we haven't worked out whether to use PEP 517 yet, # and the user hasn't explicitly stated a preference, # we do so if the project has a pyproject.toml file - # or if we cannot import setuptools. + # or if we cannot import setuptools or wheels. - # We fallback to PEP 517 when without setuptools, + # We fallback to PEP 517 when without setuptools or without the wheel package, # so setuptools can be installed as a default build backend. # For more info see: # https://discuss.python.org/t/pip-without-setuptools-could-the-experience-be-improved/11810/9 + # https://github.com/pypa/pip/issues/8559 elif use_pep517 is None: - use_pep517 = has_pyproject or not importlib.util.find_spec("setuptools") + use_pep517 = ( + has_pyproject + or not importlib.util.find_spec("setuptools") + or not importlib.util.find_spec("wheel") + ) # At this point, we know whether we're going to use PEP 517. assert use_pep517 is not None @@ -159,9 +164,8 @@ def load_pyproject_toml( if backend is None: # If the user didn't specify a backend, we assume they want to use # the setuptools backend. But we can't be sure they have included - # a version of setuptools which supplies the backend, or wheel - # (which is needed by the backend) in their requirements. So we - # make a note to check that those requirements are present once + # a version of setuptools which supplies the backend. So we + # make a note to check that this requirement is present once # we have set up the environment. # This is quite a lot of work to check for a very specific case. But # the problem is, that case is potentially quite common - projects that @@ -170,6 +174,6 @@ def load_pyproject_toml( # tools themselves. The original PEP 518 code had a similar check (but # implemented in a different way). backend = "setuptools.build_meta:__legacy__" - check = ["setuptools>=40.8.0", "wheel"] + check = ["setuptools>=40.8.0"] return BuildSystemDetails(requires, backend, check, backend_path) diff --git a/.venv/Lib/site-packages/pip/_internal/req/__init__.py b/.venv/Lib/site-packages/pip/_internal/req/__init__.py index 8d563596..16de903a 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/__init__.py +++ b/.venv/Lib/site-packages/pip/_internal/req/__init__.py @@ -36,7 +36,6 @@ def _validate_requirements( def install_given_reqs( requirements: List[InstallRequirement], - install_options: List[str], global_options: Sequence[str], root: Optional[str], home: Optional[str], @@ -71,7 +70,6 @@ def install_given_reqs( try: requirement.install( - install_options, global_options, root=root, home=home, diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc index 83e9f6ad..f5f31063 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc index 452fac9f..754aaf4a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc index 778ed882..00f27a55 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc index ec41d8c0..48f6b312 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc index 1f34a1b2..68acc6f7 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc index 36e44b90..4bc5550e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/constructors.py b/.venv/Lib/site-packages/pip/_internal/req/constructors.py index dea7c3b0..c5ca2d85 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/constructors.py +++ b/.venv/Lib/site-packages/pip/_internal/req/constructors.py @@ -11,7 +11,7 @@ InstallRequirement. import logging import os import re -from typing import Any, Dict, Optional, Set, Tuple, Union +from typing import Dict, List, Optional, Set, Tuple, Union from pip._vendor.packaging.markers import Marker from pip._vendor.packaging.requirements import InvalidRequirement, Requirement @@ -201,15 +201,16 @@ def parse_req_from_editable(editable_req: str) -> RequirementParts: def install_req_from_editable( editable_req: str, comes_from: Optional[Union[InstallRequirement, str]] = None, + *, use_pep517: Optional[bool] = None, isolated: bool = False, - options: Optional[Dict[str, Any]] = None, + global_options: Optional[List[str]] = None, + hash_options: Optional[Dict[str, List[str]]] = None, constraint: bool = False, user_supplied: bool = False, permit_editable_wheels: bool = False, - config_settings: Optional[Dict[str, str]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, ) -> InstallRequirement: - parts = parse_req_from_editable(editable_req) return InstallRequirement( @@ -222,9 +223,8 @@ def install_req_from_editable( constraint=constraint, use_pep517=use_pep517, isolated=isolated, - install_options=options.get("install_options", []) if options else [], - global_options=options.get("global_options", []) if options else [], - hash_options=options.get("hashes", {}) if options else {}, + global_options=global_options, + hash_options=hash_options, config_settings=config_settings, extras=parts.extras, ) @@ -376,13 +376,15 @@ def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementPar def install_req_from_line( name: str, comes_from: Optional[Union[str, InstallRequirement]] = None, + *, use_pep517: Optional[bool] = None, isolated: bool = False, - options: Optional[Dict[str, Any]] = None, + global_options: Optional[List[str]] = None, + hash_options: Optional[Dict[str, List[str]]] = None, constraint: bool = False, line_source: Optional[str] = None, user_supplied: bool = False, - config_settings: Optional[Dict[str, str]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, ) -> InstallRequirement: """Creates an InstallRequirement from a name, which might be a requirement, directory containing 'setup.py', filename, or URL. @@ -399,9 +401,8 @@ def install_req_from_line( markers=parts.markers, use_pep517=use_pep517, isolated=isolated, - install_options=options.get("install_options", []) if options else [], - global_options=options.get("global_options", []) if options else [], - hash_options=options.get("hashes", {}) if options else {}, + global_options=global_options, + hash_options=hash_options, config_settings=config_settings, constraint=constraint, extras=parts.extras, @@ -415,7 +416,6 @@ def install_req_from_req_string( isolated: bool = False, use_pep517: Optional[bool] = None, user_supplied: bool = False, - config_settings: Optional[Dict[str, str]] = None, ) -> InstallRequirement: try: req = get_requirement(req_string) @@ -445,7 +445,6 @@ def install_req_from_req_string( isolated=isolated, use_pep517=use_pep517, user_supplied=user_supplied, - config_settings=config_settings, ) @@ -454,7 +453,7 @@ def install_req_from_parsed_requirement( isolated: bool = False, use_pep517: Optional[bool] = None, user_supplied: bool = False, - config_settings: Optional[Dict[str, str]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, ) -> InstallRequirement: if parsed_req.is_editable: req = install_req_from_editable( @@ -473,7 +472,14 @@ def install_req_from_parsed_requirement( comes_from=parsed_req.comes_from, use_pep517=use_pep517, isolated=isolated, - options=parsed_req.options, + global_options=( + parsed_req.options.get("global_options", []) + if parsed_req.options + else [] + ), + hash_options=( + parsed_req.options.get("hashes", {}) if parsed_req.options else {} + ), constraint=parsed_req.constraint, line_source=parsed_req.line_source, user_supplied=user_supplied, @@ -493,7 +499,6 @@ def install_req_from_link_and_ireq( markers=ireq.markers, use_pep517=ireq.use_pep517, isolated=ireq.isolated, - install_options=ireq.install_options, global_options=ireq.global_options, hash_options=ireq.hash_options, config_settings=ireq.config_settings, diff --git a/.venv/Lib/site-packages/pip/_internal/req/req_file.py b/.venv/Lib/site-packages/pip/_internal/req/req_file.py index 11ec699a..f717c1cc 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/req_file.py +++ b/.venv/Lib/site-packages/pip/_internal/req/req_file.py @@ -2,6 +2,7 @@ Requirements file parsing """ +import logging import optparse import os import re @@ -69,14 +70,16 @@ SUPPORTED_OPTIONS: List[Callable[..., optparse.Option]] = [ # options to be passed to requirements SUPPORTED_OPTIONS_REQ: List[Callable[..., optparse.Option]] = [ - cmdoptions.install_options, cmdoptions.global_options, cmdoptions.hash, + cmdoptions.config_settings, ] # the 'dest' string values SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] +logger = logging.getLogger(__name__) + class ParsedRequirement: def __init__( @@ -166,7 +169,6 @@ def handle_requirement_line( line: ParsedLine, options: Optional[optparse.Values] = None, ) -> ParsedRequirement: - # preserve for the nested code path line_comes_from = "{} {} (line {})".format( "-c" if line.constraint else "-r", @@ -211,6 +213,12 @@ def handle_option_line( options: Optional[optparse.Values] = None, session: Optional[PipSession] = None, ) -> None: + if opts.hashes: + logger.warning( + "%s line %s has --hash but no requirement, and will be ignored.", + filename, + lineno, + ) if options: # percolate options upward diff --git a/.venv/Lib/site-packages/pip/_internal/req/req_install.py b/.venv/Lib/site-packages/pip/_internal/req/req_install.py index 5f29261c..d01b24a9 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/req_install.py +++ b/.venv/Lib/site-packages/pip/_internal/req/req_install.py @@ -8,7 +8,6 @@ import shutil import sys import uuid import zipfile -from enum import Enum from optparse import Values from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union @@ -18,10 +17,10 @@ from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.packaging.version import Version from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.pep517.wrappers import Pep517HookCaller +from pip._vendor.pyproject_hooks import BuildBackendHookCaller from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment -from pip._internal.exceptions import InstallationError, LegacyInstallFailure +from pip._internal.exceptions import InstallationError from pip._internal.locations import get_scheme from pip._internal.metadata import ( BaseDistribution, @@ -40,18 +39,13 @@ from pip._internal.operations.build.metadata_legacy import ( from pip._internal.operations.install.editable_legacy import ( install_editable as install_editable_legacy, ) -from pip._internal.operations.install.legacy import install as install_legacy from pip._internal.operations.install.wheel import install_wheel from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path from pip._internal.req.req_uninstall import UninstallPathSet -from pip._internal.utils.deprecation import LegacyInstallReason, deprecated -from pip._internal.utils.direct_url_helpers import ( - direct_url_for_editable, - direct_url_from_link, -) +from pip._internal.utils.deprecation import deprecated from pip._internal.utils.hashes import Hashes from pip._internal.utils.misc import ( - ConfiguredPep517HookCaller, + ConfiguredBuildBackendHookCaller, ask_path_exists, backup_dir, display_path, @@ -83,10 +77,10 @@ class InstallRequirement: markers: Optional[Marker] = None, use_pep517: Optional[bool] = None, isolated: bool = False, - install_options: Optional[List[str]] = None, + *, global_options: Optional[List[str]] = None, hash_options: Optional[Dict[str, List[str]]] = None, - config_settings: Optional[Dict[str, str]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, constraint: bool = False, extras: Collection[str] = (), user_supplied: bool = False, @@ -98,7 +92,6 @@ class InstallRequirement: self.constraint = constraint self.editable = editable self.permit_editable_wheels = permit_editable_wheels - self.legacy_install_reason: Optional[LegacyInstallReason] = None # source_dir is the local directory where the linked requirement is # located, or unpacked. In case unpacking is needed, creating and @@ -115,7 +108,11 @@ class InstallRequirement: # PEP 508 URL requirement link = Link(req.url) self.link = self.original_link = link - self.original_link_is_in_wheel_cache = False + + # When this InstallRequirement is a wheel obtained from the cache of locally + # built wheels, this is the source link corresponding to the cache entry, which + # was used to download and build the cached wheel. + self.cached_wheel_source_link: Optional[Link] = None # Information about the location of the artifact that was downloaded . This # property is guaranteed to be set in resolver results. @@ -146,7 +143,6 @@ class InstallRequirement: # Set to True after successful installation self.install_succeeded: Optional[bool] = None # Supplied options - self.install_options = install_options if install_options else [] self.global_options = global_options if global_options else [] self.hash_options = hash_options if hash_options else {} self.config_settings = config_settings @@ -173,7 +169,7 @@ class InstallRequirement: self.requirements_to_check: List[str] = [] # The PEP 517 backend we should use to build the project - self.pep517_backend: Optional[Pep517HookCaller] = None + self.pep517_backend: Optional[BuildBackendHookCaller] = None # Are we using PEP 517 for this requirement? # After pyproject.toml has been loaded, the only valid values are True @@ -195,7 +191,11 @@ class InstallRequirement: else: s = "" if self.satisfied_by is not None: - s += " in {}".format(display_path(self.satisfied_by.location)) + if self.satisfied_by.location is not None: + location = display_path(self.satisfied_by.location) + else: + location = "" + s += f" in {location}" if self.comes_from: if isinstance(self.comes_from, str): comes_from: Optional[str] = self.comes_from @@ -291,7 +291,12 @@ class InstallRequirement: """ good_hashes = self.hash_options.copy() - link = self.link if trust_internet else self.original_link + if trust_internet: + link = self.link + elif self.original_link and self.user_supplied: + link = self.original_link + else: + link = None if link and link.hash: good_hashes.setdefault(link.hash_name, []).append(link.hash) return Hashes(good_hashes) @@ -436,6 +441,12 @@ class InstallRequirement: return False return self.link.is_wheel + @property + def is_wheel_from_cache(self) -> bool: + # When True, it means that this InstallRequirement is a local wheel file in the + # cache of locally built wheels. + return self.cached_wheel_source_link is not None + # Things valid for sdists @property def unpacked_source_directory(self) -> str: @@ -475,6 +486,15 @@ class InstallRequirement: ) if pyproject_toml_data is None: + if self.config_settings: + deprecated( + reason=f"Config settings are ignored for project {self}.", + replacement=( + "to use --use-pep517 or add a " + "pyproject.toml file to the project" + ), + gone_in="23.3", + ) self.use_pep517 = False return @@ -482,7 +502,7 @@ class InstallRequirement: requires, backend, check, backend_path = pyproject_toml_data self.requirements_to_check = check self.pyproject_requires = requires - self.pep517_backend = ConfiguredPep517HookCaller( + self.pep517_backend = ConfiguredBuildBackendHookCaller( self, self.unpacked_source_directory, backend, @@ -742,7 +762,6 @@ class InstallRequirement: def install( self, - install_options: List[str], global_options: Optional[Sequence[str]] = None, root: Optional[str] = None, home: Optional[str] = None, @@ -760,11 +779,9 @@ class InstallRequirement: prefix=prefix, ) - global_options = global_options if global_options is not None else [] if self.editable and not self.is_wheel: install_editable_legacy( - install_options, - global_options, + global_options=global_options if global_options is not None else [], prefix=prefix, home=home, use_user_site=use_user_site, @@ -777,82 +794,23 @@ class InstallRequirement: self.install_succeeded = True return - if self.is_wheel: - assert self.local_file_path - direct_url = None - # TODO this can be refactored to direct_url = self.download_info - if self.editable: - direct_url = direct_url_for_editable(self.unpacked_source_directory) - elif self.original_link: - direct_url = direct_url_from_link( - self.original_link, - self.source_dir, - self.original_link_is_in_wheel_cache, - ) - install_wheel( - self.name, - self.local_file_path, - scheme=scheme, - req_description=str(self.req), - pycompile=pycompile, - warn_script_location=warn_script_location, - direct_url=direct_url, - requested=self.user_supplied, - ) - self.install_succeeded = True - return + assert self.is_wheel + assert self.local_file_path - # TODO: Why don't we do this for editable installs? - - # Extend the list of global and install options passed on to - # the setup.py call with the ones from the requirements file. - # Options specified in requirements file override those - # specified on the command line, since the last option given - # to setup.py is the one that is used. - global_options = list(global_options) + self.global_options - install_options = list(install_options) + self.install_options - - try: - if ( - self.legacy_install_reason is not None - and self.legacy_install_reason.emit_before_install - ): - self.legacy_install_reason.emit_deprecation(self.name) - success = install_legacy( - install_options=install_options, - global_options=global_options, - root=root, - home=home, - prefix=prefix, - use_user_site=use_user_site, - pycompile=pycompile, - scheme=scheme, - setup_py_path=self.setup_py_path, - isolated=self.isolated, - req_name=self.name, - build_env=self.build_env, - unpacked_source_directory=self.unpacked_source_directory, - req_description=str(self.req), - ) - except LegacyInstallFailure as exc: - self.install_succeeded = False - raise exc - except Exception: - self.install_succeeded = True - raise - - self.install_succeeded = success - - if ( - success - and self.legacy_install_reason is not None - and self.legacy_install_reason.emit_after_success - ): - self.legacy_install_reason.emit_deprecation(self.name) + install_wheel( + self.name, + self.local_file_path, + scheme=scheme, + req_description=str(self.req), + pycompile=pycompile, + warn_script_location=warn_script_location, + direct_url=self.download_info if self.original_link else None, + requested=self.user_supplied, + ) + self.install_succeeded = True def check_invalid_constraint_type(req: InstallRequirement) -> str: - # Check for unsupported forms problem = "" if not req.name: @@ -889,54 +847,21 @@ def _has_option(options: Values, reqs: List[InstallRequirement], option: str) -> return False -def _install_option_ignored( - install_options: List[str], reqs: List[InstallRequirement] -) -> bool: - for req in reqs: - if (install_options or req.install_options) and not req.use_pep517: - return False - return True - - -class LegacySetupPyOptionsCheckMode(Enum): - INSTALL = 1 - WHEEL = 2 - DOWNLOAD = 3 - - def check_legacy_setup_py_options( options: Values, reqs: List[InstallRequirement], - mode: LegacySetupPyOptionsCheckMode, ) -> None: - has_install_options = _has_option(options, reqs, "install_options") has_build_options = _has_option(options, reqs, "build_options") has_global_options = _has_option(options, reqs, "global_options") - legacy_setup_py_options_present = ( - has_install_options or has_build_options or has_global_options - ) - if not legacy_setup_py_options_present: - return - - options.format_control.disallow_binaries() - logger.warning( - "Implying --no-binary=:all: due to the presence of " - "--build-option / --global-option / --install-option. " - "Consider using --config-settings for more flexibility.", - ) - if mode == LegacySetupPyOptionsCheckMode.INSTALL and has_install_options: - if _install_option_ignored(options.install_options, reqs): - logger.warning( - "Ignoring --install-option when building using PEP 517", - ) - else: - deprecated( - reason=( - "--install-option is deprecated because " - "it forces pip to use the 'setup.py install' " - "command which is itself deprecated." - ), - issue=11358, - replacement="to use --config-settings", - gone_in="23.1", - ) + if has_build_options or has_global_options: + deprecated( + reason="--build-option and --global-option are deprecated.", + issue=11859, + replacement="to use --config-settings", + gone_in="23.3", + ) + logger.warning( + "Implying --no-binary=:all: due to the presence of " + "--build-option / --global-option. " + ) + options.format_control.disallow_binaries() diff --git a/.venv/Lib/site-packages/pip/_internal/req/req_uninstall.py b/.venv/Lib/site-packages/pip/_internal/req/req_uninstall.py index 15b67385..ad5178e7 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +++ b/.venv/Lib/site-packages/pip/_internal/req/req_uninstall.py @@ -11,8 +11,9 @@ from pip._internal.metadata import BaseDistribution from pip._internal.utils.compat import WINDOWS from pip._internal.utils.egg_link import egg_link_path_from_location from pip._internal.utils.logging import getLogger, indent_log -from pip._internal.utils.misc import ask, is_local, normalize_path, renames, rmtree +from pip._internal.utils.misc import ask, normalize_path, renames, rmtree from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory +from pip._internal.utils.virtualenv import running_under_virtualenv logger = getLogger(__name__) @@ -312,6 +313,10 @@ class UninstallPathSet: self._pth: Dict[str, UninstallPthEntries] = {} self._dist = dist self._moved_paths = StashedUninstallPathSet() + # Create local cache of normalize_path results. Creating an UninstallPathSet + # can result in hundreds/thousands of redundant calls to normalize_path with + # the same args, which hurts performance. + self._normalize_path_cached = functools.lru_cache()(normalize_path) def _permitted(self, path: str) -> bool: """ @@ -319,14 +324,17 @@ class UninstallPathSet: remove/modify, False otherwise. """ - return is_local(path) + # aka is_local, but caching normalized sys.prefix + if not running_under_virtualenv(): + return True + return path.startswith(self._normalize_path_cached(sys.prefix)) def add(self, path: str) -> None: head, tail = os.path.split(path) # we normalize the head to resolve parent directory symlinks, but not # the tail, since we only want to uninstall symlinks, not their targets - path = os.path.join(normalize_path(head), os.path.normcase(tail)) + path = os.path.join(self._normalize_path_cached(head), os.path.normcase(tail)) if not os.path.exists(path): return @@ -341,7 +349,7 @@ class UninstallPathSet: self.add(cache_from_source(path)) def add_pth(self, pth_file: str, entry: str) -> None: - pth_file = normalize_path(pth_file) + pth_file = self._normalize_path_cached(pth_file) if self._permitted(pth_file): if pth_file not in self._pth: self._pth[pth_file] = UninstallPthEntries(pth_file) @@ -531,12 +539,14 @@ class UninstallPathSet: # above, so this only covers the setuptools-style editable. with open(develop_egg_link) as fh: link_pointer = os.path.normcase(fh.readline().strip()) - normalized_link_pointer = normalize_path(link_pointer) + normalized_link_pointer = paths_to_remove._normalize_path_cached( + link_pointer + ) assert os.path.samefile( normalized_link_pointer, normalized_dist_location ), ( - f"Egg-link {link_pointer} does not match installed location of " - f"{dist.raw_name} (at {dist_location})" + f"Egg-link {develop_egg_link} (to {link_pointer}) does not match " + f"installed location of {dist.raw_name} (at {dist_location})" ) paths_to_remove.add(develop_egg_link) easy_install_pth = os.path.join( diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc index ae412cd0..8aca8c76 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc index 6d2e85ca..c97a2e9f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc index e3d2f905..a0d9a013 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc index ac6a416c..9c343ab3 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py index fb49d416..b17b7e45 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py @@ -431,12 +431,12 @@ class Resolver(BaseResolver): if cache_entry is not None: logger.debug("Using cached wheel link: %s", cache_entry.link) if req.link is req.original_link and cache_entry.persistent: - req.original_link_is_in_wheel_cache = True + req.cached_wheel_source_link = req.link if cache_entry.origin is not None: req.download_info = cache_entry.origin else: # Legacy cache entry that does not have origin.json. - # download_info may miss the archive_info.hash field. + # download_info may miss the archive_info.hashes field. req.download_info = direct_url_from_link( req.link, link_is_in_wheel_cache=cache_entry.persistent ) diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc index 8b19aaee..41edf828 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc index 82b10719..335e4a85 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc index 9d7ca6a1..03e1a8db 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc index d82e1121..21246c6f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc index 3054c3da..c70ca53a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc index 7ffde9c1..1404f80c 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc index 24aabfda..555ee845 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc index 57c0ea43..c8873a8e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc index ef4eb1c6..63b08484 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py index f5bc343b..31020e27 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py @@ -65,15 +65,13 @@ def make_install_req_from_link( use_pep517=template.use_pep517, isolated=template.isolated, constraint=template.constraint, - options=dict( - install_options=template.install_options, - global_options=template.global_options, - hashes=template.hash_options, - ), + global_options=template.global_options, + hash_options=template.hash_options, config_settings=template.config_settings, ) ireq.original_link = template.original_link ireq.link = link + ireq.extras = template.extras return ireq @@ -81,7 +79,7 @@ def make_install_req_from_editable( link: Link, template: InstallRequirement ) -> InstallRequirement: assert template.editable, "template not editable" - return install_req_from_editable( + ireq = install_req_from_editable( link.url, user_supplied=template.user_supplied, comes_from=template.comes_from, @@ -89,13 +87,12 @@ def make_install_req_from_editable( isolated=template.isolated, constraint=template.constraint, permit_editable_wheels=template.permit_editable_wheels, - options=dict( - install_options=template.install_options, - global_options=template.global_options, - hashes=template.hash_options, - ), + global_options=template.global_options, + hash_options=template.hash_options, config_settings=template.config_settings, ) + ireq.extras = template.extras + return ireq def _make_install_req_from_dist( @@ -114,11 +111,8 @@ def _make_install_req_from_dist( use_pep517=template.use_pep517, isolated=template.isolated, constraint=template.constraint, - options=dict( - install_options=template.install_options, - global_options=template.global_options, - hashes=template.hash_options, - ), + global_options=template.global_options, + hash_options=template.hash_options, config_settings=template.config_settings, ) ireq.satisfied_by = dist @@ -265,7 +259,7 @@ class LinkCandidate(_InstallRequirementBackedCandidate): version: Optional[CandidateVersion] = None, ) -> None: source_link = link - cache_entry = factory.get_wheel_cache_entry(link, name) + cache_entry = factory.get_wheel_cache_entry(source_link, name) if cache_entry is not None: logger.debug("Using cached wheel link: %s", cache_entry.link) link = cache_entry.link @@ -283,13 +277,15 @@ class LinkCandidate(_InstallRequirementBackedCandidate): ) if cache_entry is not None: + assert ireq.link.is_wheel + assert ireq.link.is_file if cache_entry.persistent and template.link is template.original_link: - ireq.original_link_is_in_wheel_cache = True + ireq.cached_wheel_source_link = source_link if cache_entry.origin is not None: ireq.download_info = cache_entry.origin else: # Legacy cache entry that does not have origin.json. - # download_info may miss the archive_info.hash field. + # download_info may miss the archive_info.hashes field. ireq.download_info = direct_url_from_link( source_link, link_is_in_wheel_cache=cache_entry.persistent ) diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py index a4c24b52..0331297b 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py @@ -535,7 +535,7 @@ class Factory: hash mismatches. Furthermore, cached wheels at present have nondeterministic contents due to file modification times. """ - if self._wheel_cache is None or self.preparer.require_hashes: + if self._wheel_cache is None: return None return self._wheel_cache.get_cache_entry( link=link, @@ -632,7 +632,6 @@ class Factory: e: "ResolutionImpossible[Requirement, Candidate]", constraints: Dict[str, Constraint], ) -> InstallationError: - assert e.causes, "Installation error reported with no cause" # If one of the things we can't solve is "we need Python X.Y", diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py index 6300dfc5..315fb9c8 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py @@ -104,7 +104,7 @@ class PipProvider(_ProviderBase): def identify(self, requirement_or_candidate: Union[Requirement, Candidate]) -> str: return requirement_or_candidate.name - def get_preference( # type: ignore + def get_preference( self, identifier: str, resolutions: Mapping[str, Candidate], @@ -124,14 +124,29 @@ class PipProvider(_ProviderBase): * If equal, prefer if any requirement is "pinned", i.e. contains operator ``===`` or ``==``. * If equal, calculate an approximate "depth" and resolve requirements - closer to the user-specified requirements first. + closer to the user-specified requirements first. If the depth cannot + by determined (eg: due to no matching parents), it is considered + infinite. * Order user-specified requirements by the order they are specified. * If equal, prefers "non-free" requirements, i.e. contains at least one operator, such as ``>=`` or ``<``. * If equal, order alphabetically for consistency (helps debuggability). """ - lookups = (r.get_candidate_lookup() for r, _ in information[identifier]) - candidate, ireqs = zip(*lookups) + try: + next(iter(information[identifier])) + except StopIteration: + # There is no information for this identifier, so there's no known + # candidates. + has_information = False + else: + has_information = True + + if has_information: + lookups = (r.get_candidate_lookup() for r, _ in information[identifier]) + candidate, ireqs = zip(*lookups) + else: + candidate, ireqs = None, () + operators = [ specifier.operator for specifier_set in (ireq.specifier for ireq in ireqs if ireq) @@ -146,11 +161,14 @@ class PipProvider(_ProviderBase): requested_order: Union[int, float] = self._user_requested[identifier] except KeyError: requested_order = math.inf - parent_depths = ( - self._known_depths[parent.name] if parent is not None else 0.0 - for _, parent in information[identifier] - ) - inferred_depth = min(d for d in parent_depths) + 1.0 + if has_information: + parent_depths = ( + self._known_depths[parent.name] if parent is not None else 0.0 + for _, parent in information[identifier] + ) + inferred_depth = min(d for d in parent_depths) + 1.0 + else: + inferred_depth = math.inf else: inferred_depth = 1.0 self._known_depths[identifier] = inferred_depth @@ -161,16 +179,6 @@ class PipProvider(_ProviderBase): # free, so we always do it first to avoid needless work if it fails. requires_python = identifier == REQUIRES_PYTHON_IDENTIFIER - # HACK: Setuptools have a very long and solid backward compatibility - # track record, and extremely few projects would request a narrow, - # non-recent version range of it since that would break a lot things. - # (Most projects specify it only to request for an installer feature, - # which does not work, but that's another topic.) Intentionally - # delaying Setuptools helps reduce branches the resolver has to check. - # This serves as a temporary fix for issues like "apache-airflow[all]" - # while we work on "proper" branch pruning techniques. - delay_this = identifier == "setuptools" - # Prefer the causes of backtracking on the assumption that the problem # resolving the dependency tree is related to the failures that caused # the backtracking @@ -178,7 +186,6 @@ class PipProvider(_ProviderBase): return ( not requires_python, - delay_this, not direct, not pinned, not backtrack_cause, diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py index 6ced5329..3c724238 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py @@ -11,9 +11,9 @@ logger = getLogger(__name__) class PipReporter(BaseReporter): def __init__(self) -> None: - self.backtracks_by_package: DefaultDict[str, int] = defaultdict(int) + self.reject_count_by_package: DefaultDict[str, int] = defaultdict(int) - self._messages_at_backtrack = { + self._messages_at_reject_count = { 1: ( "pip is looking at multiple versions of {package_name} to " "determine which version is compatible with other " @@ -32,16 +32,28 @@ class PipReporter(BaseReporter): ), } - def backtracking(self, candidate: Candidate) -> None: - self.backtracks_by_package[candidate.name] += 1 + def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None: + self.reject_count_by_package[candidate.name] += 1 - count = self.backtracks_by_package[candidate.name] - if count not in self._messages_at_backtrack: + count = self.reject_count_by_package[candidate.name] + if count not in self._messages_at_reject_count: return - message = self._messages_at_backtrack[count] + message = self._messages_at_reject_count[count] logger.info("INFO: %s", message.format(package_name=candidate.name)) + msg = "Will try a different candidate, due to conflict:" + for req_info in criterion.information: + req, parent = req_info.requirement, req_info.parent + # Inspired by Factory.get_installation_error + msg += "\n " + if parent: + msg += f"{parent.name} {parent.version} depends on " + else: + msg += "The user requested " + msg += req.format_for_error() + logger.debug(msg) + class PipDebuggingReporter(BaseReporter): """A reporter that does an info log for every event it sees.""" @@ -61,8 +73,8 @@ class PipDebuggingReporter(BaseReporter): def adding_requirement(self, requirement: Requirement, parent: Candidate) -> None: logger.info("Reporter.adding_requirement(%r, %r)", requirement, parent) - def backtracking(self, candidate: Candidate) -> None: - logger.info("Reporter.backtracking(%r)", candidate) + def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None: + logger.info("Reporter.rejecting_candidate(%r, %r)", criterion, candidate) def pinning(self, candidate: Candidate) -> None: logger.info("Reporter.pinning(%r)", candidate) diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py index f561f1f1..06addc0d 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py @@ -64,7 +64,6 @@ class SpecifierRequirement(Requirement): return format_name(self.project_name, self._extras) def format_for_error(self) -> str: - # Convert comma-separated specifiers into "A, B, ..., F and G" # This makes the specifier a bit more "human readable", without # risking a change in meaning. (Hopefully! Not all edge cases have diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py index a605d6c2..47bbfecc 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py @@ -88,9 +88,9 @@ class Resolver(BaseResolver): ) try: - try_to_avoid_resolution_too_deep = 2000000 + limit_how_complex_resolution_can_be = 200000 result = self._result = resolver.resolve( - collected.requirements, max_rounds=try_to_avoid_resolution_too_deep + collected.requirements, max_rounds=limit_how_complex_resolution_can_be ) except ResolutionImpossible as e: diff --git a/.venv/Lib/site-packages/pip/_internal/self_outdated_check.py b/.venv/Lib/site-packages/pip/_internal/self_outdated_check.py index 9e2149c5..41cc42c5 100644 --- a/.venv/Lib/site-packages/pip/_internal/self_outdated_check.py +++ b/.venv/Lib/site-packages/pip/_internal/self_outdated_check.py @@ -133,7 +133,7 @@ class UpgradePrompt: return Group( Text(), Text.from_markup( - f"{notice} A new release of pip available: " + f"{notice} A new release of pip is available: " f"[red]{self.old}[reset] -> [green]{self.new}[reset]" ), Text.from_markup( @@ -155,7 +155,7 @@ def was_installed_by_pip(pkg: str) -> bool: def _get_current_remote_pip_version( session: PipSession, options: optparse.Values -) -> str: +) -> Optional[str]: # Lets use PackageFinder to see what the latest pip version is link_collector = LinkCollector.create( session, @@ -176,7 +176,7 @@ def _get_current_remote_pip_version( ) best_candidate = finder.find_best_candidate("pip").best_candidate if best_candidate is None: - return + return None return str(best_candidate.version) @@ -186,11 +186,14 @@ def _self_version_check_logic( state: SelfCheckState, current_time: datetime.datetime, local_version: DistributionVersion, - get_remote_version: Callable[[], str], + get_remote_version: Callable[[], Optional[str]], ) -> Optional[UpgradePrompt]: remote_version_str = state.get(current_time) if remote_version_str is None: remote_version_str = get_remote_version() + if remote_version_str is None: + logger.debug("No remote pip version found") + return None state.set(remote_version_str, current_time) remote_version = parse_version(remote_version_str) diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc index 3f97b74d..cc0800f9 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc new file mode 100644 index 00000000..0233abe7 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc index aef8caa1..caf27f62 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc index a5e3c811..38a0897e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc index 55e31dc0..e06df53e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc index e30344aa..5e68b7d3 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc index 9b73bf18..ca5ba4e6 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc index 3f75f99b..9b565959 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc index 344f8f39..5afb847e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-311.pyc deleted file mode 100644 index de63644d..00000000 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc index ac68d618..4c3996ec 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc index f3c0b515..eeed8414 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc index 8a11c6c6..824c994a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc index d967f9a0..a2a6258a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc index ca41add7..5d3d5c44 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc index 2e141d91..e3b2632b 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc index a71d05be..fd38170b 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc index 5be03428..23129295 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc index 57b45564..ec9520d0 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc index 83a68c7f..3f29029f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc index 5acd8cca..63a3d87e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc index 0e151853..ca674199 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc index 2fa5a6e3..3427b184 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc index f09b7ed4..2279a8e3 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc index 3d8c94ec..5517315d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc index 259da499..027e9d9f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc index fe768288..88edfd55 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc index b8cf66c2..2f4a4b0a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc index 5001fbe3..ff13f047 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py b/.venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py new file mode 100644 index 00000000..e06947c0 --- /dev/null +++ b/.venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py @@ -0,0 +1,109 @@ +"""Functions brought over from jaraco.text. + +These functions are not supposed to be used within `pip._internal`. These are +helper functions brought over from `jaraco.text` to enable vendoring newer +copies of `pkg_resources` without having to vendor `jaraco.text` and its entire +dependency cone; something that our vendoring setup is not currently capable of +handling. + +License reproduced from original source below: + +Copyright Jason R. Coombs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +import functools +import itertools + + +def _nonblank(str): + return str and not str.startswith("#") + + +@functools.singledispatch +def yield_lines(iterable): + r""" + Yield valid lines of a string or iterable. + + >>> list(yield_lines('')) + [] + >>> list(yield_lines(['foo', 'bar'])) + ['foo', 'bar'] + >>> list(yield_lines('foo\nbar')) + ['foo', 'bar'] + >>> list(yield_lines('\nfoo\n#bar\nbaz #comment')) + ['foo', 'baz #comment'] + >>> list(yield_lines(['foo\nbar', 'baz', 'bing\n\n\n'])) + ['foo', 'bar', 'baz', 'bing'] + """ + return itertools.chain.from_iterable(map(yield_lines, iterable)) + + +@yield_lines.register(str) +def _(text): + return filter(_nonblank, map(str.strip, text.splitlines())) + + +def drop_comment(line): + """ + Drop comments. + + >>> drop_comment('foo # bar') + 'foo' + + A hash without a space may be in a URL. + + >>> drop_comment('http://example.com/foo#bar') + 'http://example.com/foo#bar' + """ + return line.partition(" #")[0] + + +def join_continuation(lines): + r""" + Join lines continued by a trailing backslash. + + >>> list(join_continuation(['foo \\', 'bar', 'baz'])) + ['foobar', 'baz'] + >>> list(join_continuation(['foo \\', 'bar', 'baz'])) + ['foobar', 'baz'] + >>> list(join_continuation(['foo \\', 'bar \\', 'baz'])) + ['foobarbaz'] + + Not sure why, but... + The character preceeding the backslash is also elided. + + >>> list(join_continuation(['goo\\', 'dly'])) + ['godly'] + + A terrible idea, but... + If no line is available to continue, suppress the lines. + + >>> list(join_continuation(['foo', 'bar\\', 'baz\\'])) + ['foo'] + """ + lines = iter(lines) + for item in lines: + while item.endswith("\\"): + try: + item = item[:-2].strip() + next(lines) + except StopIteration: + return + yield item diff --git a/.venv/Lib/site-packages/pip/_internal/utils/deprecation.py b/.venv/Lib/site-packages/pip/_internal/utils/deprecation.py index 18e9be9f..72bd6f25 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/deprecation.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/deprecation.py @@ -118,71 +118,3 @@ def deprecated( raise PipDeprecationWarning(message) warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) - - -class LegacyInstallReason: - def __init__( - self, - reason: str, - replacement: Optional[str] = None, - gone_in: Optional[str] = None, - feature_flag: Optional[str] = None, - issue: Optional[int] = None, - emit_after_success: bool = False, - emit_before_install: bool = False, - ): - self._reason = reason - self._replacement = replacement - self._gone_in = gone_in - self._feature_flag = feature_flag - self._issue = issue - self.emit_after_success = emit_after_success - self.emit_before_install = emit_before_install - - def emit_deprecation(self, name: str) -> None: - deprecated( - reason=self._reason.format(name=name), - replacement=self._replacement, - gone_in=self._gone_in, - feature_flag=self._feature_flag, - issue=self._issue, - ) - - -LegacyInstallReasonFailedBdistWheel = LegacyInstallReason( - reason=( - "{name} was installed using the legacy 'setup.py install' " - "method, because a wheel could not be built for it." - ), - replacement="to fix the wheel build issue reported above", - gone_in="23.1", - issue=8368, - emit_after_success=True, -) - - -LegacyInstallReasonMissingWheelPackage = LegacyInstallReason( - reason=( - "{name} is being installed using the legacy " - "'setup.py install' method, because it does not have a " - "'pyproject.toml' and the 'wheel' package " - "is not installed." - ), - replacement="to enable the '--use-pep517' option", - gone_in="23.1", - issue=8559, - emit_before_install=True, -) - -LegacyInstallReasonNoBinaryForcesSetuptoolsInstall = LegacyInstallReason( - reason=( - "{name} is being installed using the legacy " - "'setup.py install' method, because the '--no-binary' option was enabled " - "for it and this currently disables local wheel building for projects that " - "don't have a 'pyproject.toml' file." - ), - replacement="to enable the '--use-pep517' option", - gone_in="23.1", - issue=11451, - emit_before_install=True, -) diff --git a/.venv/Lib/site-packages/pip/_internal/utils/distutils_args.py b/.venv/Lib/site-packages/pip/_internal/utils/distutils_args.py deleted file mode 100644 index 2fd18620..00000000 --- a/.venv/Lib/site-packages/pip/_internal/utils/distutils_args.py +++ /dev/null @@ -1,43 +0,0 @@ -from getopt import GetoptError, getopt -from typing import Dict, List - -_options = [ - "exec-prefix=", - "home=", - "install-base=", - "install-data=", - "install-headers=", - "install-lib=", - "install-platlib=", - "install-purelib=", - "install-scripts=", - "prefix=", - "root=", - "user", -] - - -def parse_distutils_args(args: List[str]) -> Dict[str, str]: - """Parse provided arguments, returning an object that has the matched arguments. - - Any unknown arguments are ignored. - """ - result = {} - for arg in args: - try: - parsed_opt, _ = getopt(args=[arg], shortopts="", longopts=_options) - except GetoptError: - # We don't care about any other options, which here may be - # considered unrecognized since our option list is not - # exhaustive. - continue - - if not parsed_opt: - continue - - option = parsed_opt[0] - name_from_parsed = option[0][2:].replace("-", "_") - value_from_parsed = option[1] or "true" - result[name_from_parsed] = value_from_parsed - - return result diff --git a/.venv/Lib/site-packages/pip/_internal/utils/egg_link.py b/.venv/Lib/site-packages/pip/_internal/utils/egg_link.py index 9e0da8d2..eb57ed15 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/egg_link.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/egg_link.py @@ -1,10 +1,7 @@ -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - import os import re import sys -from typing import Optional +from typing import List, Optional from pip._internal.locations import site_packages, user_site from pip._internal.utils.virtualenv import ( @@ -57,7 +54,7 @@ def egg_link_path_from_location(raw_name: str) -> Optional[str]: This method will just return the first one found. """ - sites = [] + sites: List[str] = [] if running_under_virtualenv(): sites.append(site_packages) if not virtualenv_no_global() and user_site: diff --git a/.venv/Lib/site-packages/pip/_internal/utils/hashes.py b/.venv/Lib/site-packages/pip/_internal/utils/hashes.py index 76727306..843cffc6 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/hashes.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/hashes.py @@ -105,6 +105,13 @@ class Hashes: with open(path, "rb") as file: return self.check_against_file(file) + def has_one_of(self, hashes: Dict[str, str]) -> bool: + """Return whether any of the given hashes are allowed.""" + for hash_name, hex_digest in hashes.items(): + if self.is_hash_allowed(hash_name, hex_digest): + return True + return False + def __bool__(self) -> bool: """Return whether I know any known-good hashes.""" return bool(self._allowed) diff --git a/.venv/Lib/site-packages/pip/_internal/utils/misc.py b/.venv/Lib/site-packages/pip/_internal/utils/misc.py index a8f4cb5c..bfed8270 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/misc.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/misc.py @@ -12,6 +12,7 @@ import posixpath import shutil import stat import sys +import sysconfig import urllib.parse from io import StringIO from itertools import filterfalse, tee, zip_longest @@ -31,14 +32,15 @@ from typing import ( Tuple, Type, TypeVar, + Union, cast, ) -from pip._vendor.pep517 import Pep517HookCaller +from pip._vendor.pyproject_hooks import BuildBackendHookCaller from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed from pip import __version__ -from pip._internal.exceptions import CommandError +from pip._internal.exceptions import CommandError, ExternallyManagedEnvironment from pip._internal.locations import get_major_minor_version from pip._internal.utils.compat import WINDOWS from pip._internal.utils.virtualenv import running_under_virtualenv @@ -57,10 +59,10 @@ __all__ = [ "captured_stdout", "ensure_dir", "remove_auth_from_url", - "ConfiguredPep517HookCaller", + "check_externally_managed", + "ConfiguredBuildBackendHookCaller", ] - logger = logging.getLogger(__name__) T = TypeVar("T") @@ -581,6 +583,21 @@ def protect_pip_from_modification_on_windows(modifying_pip: bool) -> None: ) +def check_externally_managed() -> None: + """Check whether the current environment is externally managed. + + If the ``EXTERNALLY-MANAGED`` config file is found, the current environment + is considered externally managed, and an ExternallyManagedEnvironment is + raised. + """ + if running_under_virtualenv(): + return + marker = os.path.join(sysconfig.get_path("stdlib"), "EXTERNALLY-MANAGED") + if not os.path.isfile(marker): + return + raise ExternallyManagedEnvironment.from_config(marker) + + def is_console_interactive() -> bool: """Is this console interactive?""" return sys.stdin is not None and sys.stdin.isatty() @@ -598,18 +615,6 @@ def hash_file(path: str, blocksize: int = 1 << 20) -> Tuple[Any, int]: return h, length -def is_wheel_installed() -> bool: - """ - Return whether the wheel package is installed. - """ - try: - import wheel # noqa: F401 - except ImportError: - return False - - return True - - def pairwise(iterable: Iterable[Any]) -> Iterator[Tuple[Any, Any]]: """ Return paired elements. @@ -635,7 +640,7 @@ def partition( return filterfalse(pred, t1), filter(pred, t2) -class ConfiguredPep517HookCaller(Pep517HookCaller): +class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller): def __init__( self, config_holder: Any, @@ -653,7 +658,7 @@ class ConfiguredPep517HookCaller(Pep517HookCaller): def build_wheel( self, wheel_directory: str, - config_settings: Optional[Dict[str, str]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, metadata_directory: Optional[str] = None, ) -> str: cs = self.config_holder.config_settings @@ -662,7 +667,9 @@ class ConfiguredPep517HookCaller(Pep517HookCaller): ) def build_sdist( - self, sdist_directory: str, config_settings: Optional[Dict[str, str]] = None + self, + sdist_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, ) -> str: cs = self.config_holder.config_settings return super().build_sdist(sdist_directory, config_settings=cs) @@ -670,7 +677,7 @@ class ConfiguredPep517HookCaller(Pep517HookCaller): def build_editable( self, wheel_directory: str, - config_settings: Optional[Dict[str, str]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, metadata_directory: Optional[str] = None, ) -> str: cs = self.config_holder.config_settings @@ -679,19 +686,19 @@ class ConfiguredPep517HookCaller(Pep517HookCaller): ) def get_requires_for_build_wheel( - self, config_settings: Optional[Dict[str, str]] = None + self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None ) -> List[str]: cs = self.config_holder.config_settings return super().get_requires_for_build_wheel(config_settings=cs) def get_requires_for_build_sdist( - self, config_settings: Optional[Dict[str, str]] = None + self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None ) -> List[str]: cs = self.config_holder.config_settings return super().get_requires_for_build_sdist(config_settings=cs) def get_requires_for_build_editable( - self, config_settings: Optional[Dict[str, str]] = None + self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None ) -> List[str]: cs = self.config_holder.config_settings return super().get_requires_for_build_editable(config_settings=cs) @@ -699,7 +706,7 @@ class ConfiguredPep517HookCaller(Pep517HookCaller): def prepare_metadata_for_build_wheel( self, metadata_directory: str, - config_settings: Optional[Dict[str, str]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, _allow_fallback: bool = True, ) -> str: cs = self.config_holder.config_settings @@ -712,7 +719,7 @@ class ConfiguredPep517HookCaller(Pep517HookCaller): def prepare_metadata_for_build_editable( self, metadata_directory: str, - config_settings: Optional[Dict[str, str]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, _allow_fallback: bool = True, ) -> str: cs = self.config_holder.config_settings diff --git a/.venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py b/.venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py index 01ef4a4c..96d1b246 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py @@ -103,8 +103,8 @@ def make_setuptools_clean_args( def make_setuptools_develop_args( setup_py_path: str, + *, global_options: Sequence[str], - install_options: Sequence[str], no_user_config: bool, prefix: Optional[str], home: Optional[str], @@ -120,8 +120,6 @@ def make_setuptools_develop_args( args += ["develop", "--no-deps"] - args += install_options - if prefix: args += ["--prefix", prefix] if home is not None: @@ -146,50 +144,3 @@ def make_setuptools_egg_info_args( args += ["--egg-base", egg_info_dir] return args - - -def make_setuptools_install_args( - setup_py_path: str, - global_options: Sequence[str], - install_options: Sequence[str], - record_filename: str, - root: Optional[str], - prefix: Optional[str], - header_dir: Optional[str], - home: Optional[str], - use_user_site: bool, - no_user_config: bool, - pycompile: bool, -) -> List[str]: - assert not (use_user_site and prefix) - assert not (use_user_site and root) - - args = make_setuptools_shim_args( - setup_py_path, - global_options=global_options, - no_user_config=no_user_config, - unbuffered_output=True, - ) - args += ["install", "--record", record_filename] - args += ["--single-version-externally-managed"] - - if root is not None: - args += ["--root", root] - if prefix is not None: - args += ["--prefix", prefix] - if home is not None: - args += ["--home", home] - if use_user_site: - args += ["--user", "--prefix="] - - if pycompile: - args += ["--compile"] - else: - args += ["--no-compile"] - - if header_dir: - args += ["--install-headers", header_dir] - - args += install_options - - return args diff --git a/.venv/Lib/site-packages/pip/_internal/utils/subprocess.py b/.venv/Lib/site-packages/pip/_internal/utils/subprocess.py index cf5bf6be..1e8ff50e 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/subprocess.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/subprocess.py @@ -239,8 +239,8 @@ def call_subprocess( def runner_with_spinner_message(message: str) -> Callable[..., None]: """Provide a subprocess_runner that shows a spinner message. - Intended for use with for pep517's Pep517HookCaller. Thus, the runner has - an API that matches what's expected by Pep517HookCaller.subprocess_runner. + Intended for use with for BuildBackendHookCaller. Thus, the runner has + an API that matches what's expected by BuildBackendHookCaller.subprocess_runner. """ def runner( diff --git a/.venv/Lib/site-packages/pip/_internal/utils/virtualenv.py b/.venv/Lib/site-packages/pip/_internal/utils/virtualenv.py index c926db4c..882e36f5 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/virtualenv.py @@ -19,7 +19,7 @@ def _running_under_venv() -> bool: return sys.prefix != getattr(sys, "base_prefix", sys.prefix) -def _running_under_regular_virtualenv() -> bool: +def _running_under_legacy_virtualenv() -> bool: """Checks if sys.real_prefix is set. This handles virtual environments created with pypa's virtualenv. @@ -29,8 +29,8 @@ def _running_under_regular_virtualenv() -> bool: def running_under_virtualenv() -> bool: - """Return True if we're running inside a virtualenv, False otherwise.""" - return _running_under_venv() or _running_under_regular_virtualenv() + """True if we're running inside a virtual environment, False otherwise.""" + return _running_under_venv() or _running_under_legacy_virtualenv() def _get_pyvenv_cfg_lines() -> Optional[List[str]]: @@ -77,7 +77,7 @@ def _no_global_under_venv() -> bool: return False -def _no_global_under_regular_virtualenv() -> bool: +def _no_global_under_legacy_virtualenv() -> bool: """Check if "no-global-site-packages.txt" exists beside site.py This mirrors logic in pypa/virtualenv for determining whether system @@ -98,7 +98,7 @@ def virtualenv_no_global() -> bool: if _running_under_venv(): return _no_global_under_venv() - if _running_under_regular_virtualenv(): - return _no_global_under_regular_virtualenv() + if _running_under_legacy_virtualenv(): + return _no_global_under_legacy_virtualenv() return False diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc index 0c9950c8..6dfaf3f5 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc index 2d02f9ff..72718424 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc index f458bf2e..91e40f72 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc index 23647b65..cbd28999 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc index d4862ac9..6746b5d2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc index ccd141a5..ffe8d7af 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/bazaar.py b/.venv/Lib/site-packages/pip/_internal/vcs/bazaar.py index 06c80e48..20a17ed0 100644 --- a/.venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +++ b/.venv/Lib/site-packages/pip/_internal/vcs/bazaar.py @@ -72,7 +72,7 @@ class Bazaar(VersionControl): @classmethod def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: - # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// re-add it url, rev, user_pass = super().get_url_rev_and_auth(url) if url.startswith("ssh://"): url = "bzr+" + url diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/subversion.py b/.venv/Lib/site-packages/pip/_internal/vcs/subversion.py index 2cd6f0ae..16d93a67 100644 --- a/.venv/Lib/site-packages/pip/_internal/vcs/subversion.py +++ b/.venv/Lib/site-packages/pip/_internal/vcs/subversion.py @@ -87,7 +87,7 @@ class Subversion(VersionControl): @classmethod def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: - # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + # hotfix the URL scheme after removing svn+ from svn+ssh:// re-add it url, rev, user_pass = super().get_url_rev_and_auth(url) if url.startswith("ssh://"): url = "svn+" + url diff --git a/.venv/Lib/site-packages/pip/_internal/wheel_builder.py b/.venv/Lib/site-packages/pip/_internal/wheel_builder.py index 15b30af5..60d75dd1 100644 --- a/.venv/Lib/site-packages/pip/_internal/wheel_builder.py +++ b/.venv/Lib/site-packages/pip/_internal/wheel_builder.py @@ -5,7 +5,7 @@ import logging import os.path import re import shutil -from typing import Callable, Iterable, List, Optional, Tuple +from typing import Iterable, List, Optional, Tuple from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version from pip._vendor.packaging.version import InvalidVersion, Version @@ -19,12 +19,8 @@ from pip._internal.operations.build.wheel import build_wheel_pep517 from pip._internal.operations.build.wheel_editable import build_wheel_editable from pip._internal.operations.build.wheel_legacy import build_wheel_legacy from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.deprecation import ( - LegacyInstallReasonMissingWheelPackage, - LegacyInstallReasonNoBinaryForcesSetuptoolsInstall, -) from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed +from pip._internal.utils.misc import ensure_dir, hash_file from pip._internal.utils.setuptools_build import make_setuptools_clean_args from pip._internal.utils.subprocess import call_subprocess from pip._internal.utils.temp_dir import TempDirectory @@ -35,7 +31,6 @@ logger = logging.getLogger(__name__) _egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE) -BdistWheelAllowedPredicate = Callable[[InstallRequirement], bool] BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] @@ -50,7 +45,6 @@ def _contains_egg_info(s: str) -> bool: def _should_build( req: InstallRequirement, need_wheel: bool, - check_bdist_wheel: Optional[BdistWheelAllowedPredicate] = None, ) -> bool: """Return whether an InstallRequirement should be built into a wheel.""" if req.constraint: @@ -78,24 +72,6 @@ def _should_build( # we only build PEP 660 editable requirements return req.supports_pyproject_editable() - if req.use_pep517: - return True - - assert check_bdist_wheel is not None - if not check_bdist_wheel(req): - # /!\ When we change this to unconditionally return True, we must also remove - # support for `--install-option`. Indeed, `--install-option` implies - # `--no-binary` so we can return False here and run `setup.py install`. - # `--global-option` and `--build-option` can remain until we drop support for - # building with `setup.py bdist_wheel`. - req.legacy_install_reason = LegacyInstallReasonNoBinaryForcesSetuptoolsInstall - return False - - if not is_wheel_installed(): - # we don't build legacy requirements if wheel is not installed - req.legacy_install_reason = LegacyInstallReasonMissingWheelPackage - return False - return True @@ -107,11 +83,8 @@ def should_build_for_wheel_command( def should_build_for_install_command( req: InstallRequirement, - check_bdist_wheel_allowed: BdistWheelAllowedPredicate, ) -> bool: - return _should_build( - req, need_wheel=False, check_bdist_wheel=check_bdist_wheel_allowed - ) + return _should_build(req, need_wheel=False) def _should_cache( diff --git a/.venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc index 09402a28..43b68243 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc index d85fffe0..565484ed 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc index 4a6b2957..5f065fa3 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc index a19d908d..0aea3c5d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc index 2713b9a8..976fa44a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc index 064b778f..40891e2b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc index c5b57798..bfa275a4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc index 98044b31..8d02066d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc index e64887ba..fc915a05 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc index 90cc3ec7..7a041c77 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc index 9d6c4268..cf8e562e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc index bdba7f18..fb14d223 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc index 99750f9b..913e5aef 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc index 2394e3c7..9d7347bf 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc index 97ec4eb0..849b78b8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc index 51ed5c39..ef2ca6a4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/__init__.py b/.venv/Lib/site-packages/pip/_vendor/certifi/__init__.py index af4bcc15..a3546f12 100644 --- a/.venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/certifi/__init__.py @@ -1,4 +1,4 @@ from .core import contents, where __all__ = ["contents", "where"] -__version__ = "2022.09.24" +__version__ = "2022.12.07" diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc index 6c70a7d0..b4980ba6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc index 15305dc9..4deb0bcc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc index d05e0795..7107c55c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem b/.venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem index 40051551..df9e4e3c 100644 --- a/.venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem +++ b/.venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem @@ -636,37 +636,6 @@ BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB ZQ== -----END CERTIFICATE----- -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - # Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Label: "COMODO ECC Certification Authority" @@ -2204,46 +2173,6 @@ KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg xwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - # Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust # Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust # Label: "IdenTrust Commercial Root CA 1" @@ -2851,116 +2780,6 @@ T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - # Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation # Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation # Label: "SSL.com Root Certification Authority RSA" diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__init__.py b/.venv/Lib/site-packages/pip/_vendor/chardet/__init__.py index e91ad618..fe581623 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/__init__.py @@ -15,19 +15,29 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import List, Union + +from .charsetgroupprober import CharSetGroupProber +from .charsetprober import CharSetProber from .enums import InputState +from .resultdict import ResultDict from .universaldetector import UniversalDetector from .version import VERSION, __version__ __all__ = ["UniversalDetector", "detect", "detect_all", "__version__", "VERSION"] -def detect(byte_str): +def detect( + byte_str: Union[bytes, bytearray], should_rename_legacy: bool = False +) -> ResultDict: """ Detect the encoding of the given byte string. :param byte_str: The byte sequence to examine. :type byte_str: ``bytes`` or ``bytearray`` + :param should_rename_legacy: Should we rename legacy encodings + to their more modern equivalents? + :type should_rename_legacy: ``bool`` """ if not isinstance(byte_str, bytearray): if not isinstance(byte_str, bytes): @@ -35,12 +45,16 @@ def detect(byte_str): f"Expected object of type bytes or bytearray, got: {type(byte_str)}" ) byte_str = bytearray(byte_str) - detector = UniversalDetector() + detector = UniversalDetector(should_rename_legacy=should_rename_legacy) detector.feed(byte_str) return detector.close() -def detect_all(byte_str, ignore_threshold=False): +def detect_all( + byte_str: Union[bytes, bytearray], + ignore_threshold: bool = False, + should_rename_legacy: bool = False, +) -> List[ResultDict]: """ Detect all the possible encodings of the given byte string. @@ -50,6 +64,9 @@ def detect_all(byte_str, ignore_threshold=False): ``UniversalDetector.MINIMUM_THRESHOLD`` in results. :type ignore_threshold: ``bool`` + :param should_rename_legacy: Should we rename legacy encodings + to their more modern equivalents? + :type should_rename_legacy: ``bool`` """ if not isinstance(byte_str, bytearray): if not isinstance(byte_str, bytes): @@ -58,15 +75,15 @@ def detect_all(byte_str, ignore_threshold=False): ) byte_str = bytearray(byte_str) - detector = UniversalDetector() + detector = UniversalDetector(should_rename_legacy=should_rename_legacy) detector.feed(byte_str) detector.close() if detector.input_state == InputState.HIGH_BYTE: - results = [] - probers = [] + results: List[ResultDict] = [] + probers: List[CharSetProber] = [] for prober in detector.charset_probers: - if hasattr(prober, "probers"): + if isinstance(prober, CharSetGroupProber): probers.extend(p for p in prober.probers) else: probers.append(prober) @@ -80,6 +97,11 @@ def detect_all(byte_str, ignore_threshold=False): charset_name = detector.ISO_WIN_MAP.get( lower_charset_name, charset_name ) + # Rename legacy encodings with superset encodings if asked + if should_rename_legacy: + charset_name = detector.LEGACY_MAP.get( + charset_name.lower(), charset_name + ) results.append( { "encoding": charset_name, diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc index 357203a8..4f8974fa 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc index d4160170..3a42423b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc index 5f1a680a..e8d2b3ef 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc index 8a104d9c..bf25f0a8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc index 83e4583f..88a73cea 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc index cee65d8e..e9ff440a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc index adb048a1..b25bde74 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc new file mode 100644 index 00000000..da3275b3 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc index 926fd41a..32dc3015 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc index 551bb9ad..cdc0265d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc index c629a5c7..f84c49c7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc index ebb0b98e..497e0d91 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc index 537b4f4f..b092ebe3 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc index 757a342a..a40637dd 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc index 218de6c2..bf4bf37a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc index 010837a5..007a0857 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc index 8a168fdc..99a84460 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc index 3bed9fc3..8a11760f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc index 3aec9a36..d80f82a9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc index fc0d4743..1efbab47 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc index 4b761310..4d53f990 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc index 4ea1ef22..7878b34a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc index 3a3b1e75..ef9f4eb5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc index 28849bca..4c1a8ff1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc index 978afe65..0fc77911 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc index 598c1b7f..9f3fb024 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc index 1d2c8941..11bca8df 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc index f0bece7b..22a753f2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc index d7c9f2f0..1bcb87c0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc index 1545f500..bfbe554a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc index 14fcfe3f..e9a9ea33 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc index c108aaef..e4b00480 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc new file mode 100644 index 00000000..f72e9546 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc index fa7e2287..16d31c36 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc index d860562d..e38c3123 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc index 8f554cf7..ae4ffb40 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc new file mode 100644 index 00000000..dd38776b Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc index 4335e73e..a2104ad0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc index 7c499321..58d36202 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc index 1b7de687..14361a1e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc index 0f4de890..366da48e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc index 6759d501..d1bc82ef 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc index 0332580e..535d27ee 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc index 41dbc496..4398a814 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py index e4dfa7aa..ef09c60e 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py @@ -32,16 +32,16 @@ from .mbcssm import BIG5_SM_MODEL class Big5Prober(MultiByteCharSetProber): - def __init__(self): + def __init__(self) -> None: super().__init__() self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) self.distribution_analyzer = Big5DistributionAnalysis() self.reset() @property - def charset_name(self): + def charset_name(self) -> str: return "Big5" @property - def language(self): + def language(self) -> str: return "Chinese" diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py b/.venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py index 27b4a293..176cb996 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py @@ -25,6 +25,8 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import Tuple, Union + from .big5freq import ( BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, @@ -59,22 +61,22 @@ class CharDistributionAnalysis: SURE_NO = 0.01 MINIMUM_DATA_THRESHOLD = 3 - def __init__(self): + def __init__(self) -> None: # Mapping table to get frequency order from char order (get from # GetOrder()) - self._char_to_freq_order = tuple() - self._table_size = None # Size of above table + self._char_to_freq_order: Tuple[int, ...] = tuple() + self._table_size = 0 # Size of above table # This is a constant value which varies from language to language, # used in calculating confidence. See # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html # for further detail. - self.typical_distribution_ratio = None - self._done = None - self._total_chars = None - self._freq_chars = None + self.typical_distribution_ratio = 0.0 + self._done = False + self._total_chars = 0 + self._freq_chars = 0 self.reset() - def reset(self): + def reset(self) -> None: """reset analyser, clear any state""" # If this flag is set to True, detection is done and conclusion has # been made @@ -83,7 +85,7 @@ class CharDistributionAnalysis: # The number of characters whose frequency order is less than 512 self._freq_chars = 0 - def feed(self, char, char_len): + def feed(self, char: Union[bytes, bytearray], char_len: int) -> None: """feed a character with known length""" if char_len == 2: # we only care about 2-bytes character in our distribution analysis @@ -97,7 +99,7 @@ class CharDistributionAnalysis: if 512 > self._char_to_freq_order[order]: self._freq_chars += 1 - def get_confidence(self): + def get_confidence(self) -> float: """return confidence based on existing data""" # if we didn't receive any character in our consideration range, # return negative answer @@ -114,12 +116,12 @@ class CharDistributionAnalysis: # normalize confidence (we don't want to be 100% sure) return self.SURE_YES - def got_enough_data(self): + def got_enough_data(self) -> bool: # It is not necessary to receive all data to draw conclusion. # For charset detection, certain amount of data is enough return self._total_chars > self.ENOUGH_DATA_THRESHOLD - def get_order(self, _): + def get_order(self, _: Union[bytes, bytearray]) -> int: # We do not handle characters based on the original encoding string, # but convert this encoding string to a number, here called order. # This allows multiple encodings of a language to share one frequency @@ -128,13 +130,13 @@ class CharDistributionAnalysis: class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): + def __init__(self) -> None: super().__init__() self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER self._table_size = EUCTW_TABLE_SIZE self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, byte_str): + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for euc-TW encoding, we are interested # first byte range: 0xc4 -- 0xfe # second byte range: 0xa1 -- 0xfe @@ -146,13 +148,13 @@ class EUCTWDistributionAnalysis(CharDistributionAnalysis): class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): + def __init__(self) -> None: super().__init__() self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER self._table_size = EUCKR_TABLE_SIZE self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, byte_str): + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for euc-KR encoding, we are interested # first byte range: 0xb0 -- 0xfe # second byte range: 0xa1 -- 0xfe @@ -164,13 +166,13 @@ class EUCKRDistributionAnalysis(CharDistributionAnalysis): class JOHABDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): + def __init__(self) -> None: super().__init__() self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER self._table_size = EUCKR_TABLE_SIZE self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, byte_str): + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: first_char = byte_str[0] if 0x88 <= first_char < 0xD4: code = first_char * 256 + byte_str[1] @@ -179,13 +181,13 @@ class JOHABDistributionAnalysis(CharDistributionAnalysis): class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): + def __init__(self) -> None: super().__init__() self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER self._table_size = GB2312_TABLE_SIZE self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, byte_str): + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for GB2312 encoding, we are interested # first byte range: 0xb0 -- 0xfe # second byte range: 0xa1 -- 0xfe @@ -197,13 +199,13 @@ class GB2312DistributionAnalysis(CharDistributionAnalysis): class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): + def __init__(self) -> None: super().__init__() self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER self._table_size = BIG5_TABLE_SIZE self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, byte_str): + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for big5 encoding, we are interested # first byte range: 0xa4 -- 0xfe # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe @@ -217,13 +219,13 @@ class Big5DistributionAnalysis(CharDistributionAnalysis): class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): + def __init__(self) -> None: super().__init__() self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER self._table_size = JIS_TABLE_SIZE self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, byte_str): + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for sjis encoding, we are interested # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe @@ -242,13 +244,13 @@ class SJISDistributionAnalysis(CharDistributionAnalysis): class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): + def __init__(self) -> None: super().__init__() self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER self._table_size = JIS_TABLE_SIZE self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, byte_str): + def get_order(self, byte_str: Union[bytes, bytearray]) -> int: # for euc-JP encoding, we are interested # first byte range: 0xa0 -- 0xfe # second byte range: 0xa1 -- 0xfe diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py index 778ff332..6def56b4 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -25,29 +25,30 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import List, Optional, Union + from .charsetprober import CharSetProber -from .enums import ProbingState +from .enums import LanguageFilter, ProbingState class CharSetGroupProber(CharSetProber): - def __init__(self, lang_filter=None): + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: super().__init__(lang_filter=lang_filter) self._active_num = 0 - self.probers = [] - self._best_guess_prober = None + self.probers: List[CharSetProber] = [] + self._best_guess_prober: Optional[CharSetProber] = None - def reset(self): + def reset(self) -> None: super().reset() self._active_num = 0 for prober in self.probers: - if prober: - prober.reset() - prober.active = True - self._active_num += 1 + prober.reset() + prober.active = True + self._active_num += 1 self._best_guess_prober = None @property - def charset_name(self): + def charset_name(self) -> Optional[str]: if not self._best_guess_prober: self.get_confidence() if not self._best_guess_prober: @@ -55,17 +56,15 @@ class CharSetGroupProber(CharSetProber): return self._best_guess_prober.charset_name @property - def language(self): + def language(self) -> Optional[str]: if not self._best_guess_prober: self.get_confidence() if not self._best_guess_prober: return None return self._best_guess_prober.language - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: for prober in self.probers: - if not prober: - continue if not prober.active: continue state = prober.feed(byte_str) @@ -83,7 +82,7 @@ class CharSetGroupProber(CharSetProber): return self.state return self.state - def get_confidence(self): + def get_confidence(self) -> float: state = self.state if state == ProbingState.FOUND_IT: return 0.99 @@ -92,8 +91,6 @@ class CharSetGroupProber(CharSetProber): best_conf = 0.0 self._best_guess_prober = None for prober in self.probers: - if not prober: - continue if not prober.active: self.logger.debug("%s not active", prober.charset_name) continue diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py index 9f1afd99..a103ca11 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py @@ -28,8 +28,9 @@ import logging import re +from typing import Optional, Union -from .enums import ProbingState +from .enums import LanguageFilter, ProbingState INTERNATIONAL_WORDS_PATTERN = re.compile( b"[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?" @@ -40,35 +41,40 @@ class CharSetProber: SHORTCUT_THRESHOLD = 0.95 - def __init__(self, lang_filter=None): - self._state = None + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: + self._state = ProbingState.DETECTING + self.active = True self.lang_filter = lang_filter self.logger = logging.getLogger(__name__) - def reset(self): + def reset(self) -> None: self._state = ProbingState.DETECTING @property - def charset_name(self): + def charset_name(self) -> Optional[str]: return None - def feed(self, byte_str): + @property + def language(self) -> Optional[str]: + raise NotImplementedError + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: raise NotImplementedError @property - def state(self): + def state(self) -> ProbingState: return self._state - def get_confidence(self): + def get_confidence(self) -> float: return 0.0 @staticmethod - def filter_high_byte_only(buf): + def filter_high_byte_only(buf: Union[bytes, bytearray]) -> bytes: buf = re.sub(b"([\x00-\x7F])+", b" ", buf) return buf @staticmethod - def filter_international_words(buf): + def filter_international_words(buf: Union[bytes, bytearray]) -> bytearray: """ We define three types of bytes: alphabet: english alphabets [a-zA-Z] @@ -102,7 +108,7 @@ class CharSetProber: return filtered @staticmethod - def remove_xml_tags(buf): + def remove_xml_tags(buf: Union[bytes, bytearray]) -> bytes: """ Returns a copy of ``buf`` that retains only the sequences of English alphabet and high byte characters that are not between <> characters. @@ -117,10 +123,13 @@ class CharSetProber: for curr, buf_char in enumerate(buf): # Check if we're coming out of or entering an XML tag - if buf_char == b">": + + # https://github.com/python/typeshed/issues/8182 + if buf_char == b">": # type: ignore[comparison-overlap] prev = curr + 1 in_tag = False - elif buf_char == b"<": + # https://github.com/python/typeshed/issues/8182 + elif buf_char == b"<": # type: ignore[comparison-overlap] if curr > prev and not in_tag: # Keep everything after last non-extended-ASCII, # non-alphabetic character diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc index 61d00944..8fa326df 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc index 2a512fcd..d21a0f64 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py index 7926fa37..43f6e144 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -15,12 +15,18 @@ If no paths are provided, it takes its input from stdin. import argparse import sys +from typing import Iterable, List, Optional from .. import __version__ from ..universaldetector import UniversalDetector -def description_of(lines, name="stdin"): +def description_of( + lines: Iterable[bytes], + name: str = "stdin", + minimal: bool = False, + should_rename_legacy: bool = False, +) -> Optional[str]: """ Return a string describing the probable encoding of a file or list of strings. @@ -29,8 +35,11 @@ def description_of(lines, name="stdin"): :type lines: Iterable of bytes :param name: Name of file or collection of lines :type name: str + :param should_rename_legacy: Should we rename legacy encodings to + their more modern equivalents? + :type should_rename_legacy: ``bool`` """ - u = UniversalDetector() + u = UniversalDetector(should_rename_legacy=should_rename_legacy) for line in lines: line = bytearray(line) u.feed(line) @@ -39,12 +48,14 @@ def description_of(lines, name="stdin"): break u.close() result = u.result + if minimal: + return result["encoding"] if result["encoding"]: return f'{name}: {result["encoding"]} with confidence {result["confidence"]}' return f"{name}: no result" -def main(argv=None): +def main(argv: Optional[List[str]] = None) -> None: """ Handles command line arguments and gets things started. @@ -54,17 +65,28 @@ def main(argv=None): """ # Get command line arguments parser = argparse.ArgumentParser( - description="Takes one or more file paths and reports their detected \ - encodings" + description=( + "Takes one or more file paths and reports their detected encodings" + ) ) parser.add_argument( "input", - help="File whose encoding we would like to determine. \ - (default: stdin)", + help="File whose encoding we would like to determine. (default: stdin)", type=argparse.FileType("rb"), nargs="*", default=[sys.stdin.buffer], ) + parser.add_argument( + "--minimal", + help="Print only the encoding to standard output", + action="store_true", + ) + parser.add_argument( + "-l", + "--legacy", + help="Rename legacy encodings to more modern ones.", + action="store_true", + ) parser.add_argument( "--version", action="version", version=f"%(prog)s {__version__}" ) @@ -79,7 +101,11 @@ def main(argv=None): "--help\n", file=sys.stderr, ) - print(description_of(f, f.name)) + print( + description_of( + f, f.name, minimal=args.minimal, should_rename_legacy=args.legacy + ) + ) if __name__ == "__main__": diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py b/.venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py index d3e3e825..8ed4a877 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py @@ -27,6 +27,7 @@ import logging +from .codingstatemachinedict import CodingStateMachineDict from .enums import MachineState @@ -53,18 +54,19 @@ class CodingStateMachine: encoding from consideration from here on. """ - def __init__(self, sm): + def __init__(self, sm: CodingStateMachineDict) -> None: self._model = sm self._curr_byte_pos = 0 self._curr_char_len = 0 - self._curr_state = None + self._curr_state = MachineState.START + self.active = True self.logger = logging.getLogger(__name__) self.reset() - def reset(self): + def reset(self) -> None: self._curr_state = MachineState.START - def next_state(self, c): + def next_state(self, c: int) -> int: # for each byte we get its class # if it is first byte, we also get byte length byte_class = self._model["class_table"][c] @@ -77,12 +79,12 @@ class CodingStateMachine: self._curr_byte_pos += 1 return self._curr_state - def get_current_charlen(self): + def get_current_charlen(self) -> int: return self._curr_char_len - def get_coding_state_machine(self): + def get_coding_state_machine(self) -> str: return self._model["name"] @property - def language(self): + def language(self) -> str: return self._model["language"] diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachinedict.py b/.venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachinedict.py new file mode 100644 index 00000000..7a3c4c7e --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachinedict.py @@ -0,0 +1,19 @@ +from typing import TYPE_CHECKING, Tuple + +if TYPE_CHECKING: + # TypedDict was introduced in Python 3.8. + # + # TODO: Remove the else block and TYPE_CHECKING check when dropping support + # for Python 3.7. + from typing import TypedDict + + class CodingStateMachineDict(TypedDict, total=False): + class_table: Tuple[int, ...] + class_factor: int + state_table: Tuple[int, ...] + char_len_table: Tuple[int, ...] + name: str + language: str # Optional key + +else: + CodingStateMachineDict = dict diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py index 28a1f3db..fa7307ed 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py @@ -32,7 +32,7 @@ from .mbcssm import CP949_SM_MODEL class CP949Prober(MultiByteCharSetProber): - def __init__(self): + def __init__(self) -> None: super().__init__() self.coding_sm = CodingStateMachine(CP949_SM_MODEL) # NOTE: CP949 is a superset of EUC-KR, so the distribution should be @@ -41,9 +41,9 @@ class CP949Prober(MultiByteCharSetProber): self.reset() @property - def charset_name(self): + def charset_name(self) -> str: return "CP949" @property - def language(self): + def language(self) -> str: return "Korean" diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/enums.py b/.venv/Lib/site-packages/pip/_vendor/chardet/enums.py index 32a77e76..5e3e1982 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/enums.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/enums.py @@ -4,6 +4,8 @@ All of the Enums that are used throughout the chardet package. :author: Dan Blanchard (dan.blanchard@gmail.com) """ +from enum import Enum, Flag + class InputState: """ @@ -15,12 +17,13 @@ class InputState: HIGH_BYTE = 2 -class LanguageFilter: +class LanguageFilter(Flag): """ This enum represents the different language filters we can apply to a ``UniversalDetector``. """ + NONE = 0x00 CHINESE_SIMPLIFIED = 0x01 CHINESE_TRADITIONAL = 0x02 JAPANESE = 0x04 @@ -31,7 +34,7 @@ class LanguageFilter: CJK = CHINESE | JAPANESE | KOREAN -class ProbingState: +class ProbingState(Enum): """ This enum represents the different states a prober can be in. """ @@ -62,7 +65,7 @@ class SequenceLikelihood: POSITIVE = 3 @classmethod - def get_num_categories(cls): + def get_num_categories(cls) -> int: """:returns: The number of likelihood categories in the enum.""" return 4 diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/escprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/escprober.py index d9926115..fd713830 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/escprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/escprober.py @@ -25,6 +25,8 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import Optional, Union + from .charsetprober import CharSetProber from .codingstatemachine import CodingStateMachine from .enums import LanguageFilter, MachineState, ProbingState @@ -43,7 +45,7 @@ class EscCharSetProber(CharSetProber): identify these encodings. """ - def __init__(self, lang_filter=None): + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: super().__init__(lang_filter=lang_filter) self.coding_sm = [] if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: @@ -53,17 +55,15 @@ class EscCharSetProber(CharSetProber): self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) if self.lang_filter & LanguageFilter.KOREAN: self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) - self.active_sm_count = None - self._detected_charset = None - self._detected_language = None - self._state = None + self.active_sm_count = 0 + self._detected_charset: Optional[str] = None + self._detected_language: Optional[str] = None + self._state = ProbingState.DETECTING self.reset() - def reset(self): + def reset(self) -> None: super().reset() for coding_sm in self.coding_sm: - if not coding_sm: - continue coding_sm.active = True coding_sm.reset() self.active_sm_count = len(self.coding_sm) @@ -71,20 +71,20 @@ class EscCharSetProber(CharSetProber): self._detected_language = None @property - def charset_name(self): + def charset_name(self) -> Optional[str]: return self._detected_charset @property - def language(self): + def language(self) -> Optional[str]: return self._detected_language - def get_confidence(self): + def get_confidence(self) -> float: return 0.99 if self._detected_charset else 0.00 - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: for c in byte_str: for coding_sm in self.coding_sm: - if not coding_sm or not coding_sm.active: + if not coding_sm.active: continue coding_state = coding_sm.next_state(c) if coding_state == MachineState.ERROR: diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/escsm.py b/.venv/Lib/site-packages/pip/_vendor/chardet/escsm.py index 3aa0f4d9..11d4adf7 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/escsm.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/escsm.py @@ -25,6 +25,7 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from .codingstatemachinedict import CodingStateMachineDict from .enums import MachineState # fmt: off @@ -75,7 +76,7 @@ MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) -HZ_SM_MODEL = { +HZ_SM_MODEL: CodingStateMachineDict = { "class_table": HZ_CLS, "class_factor": 6, "state_table": HZ_ST, @@ -134,7 +135,7 @@ ISO2022CN_ST = ( ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) -ISO2022CN_SM_MODEL = { +ISO2022CN_SM_MODEL: CodingStateMachineDict = { "class_table": ISO2022CN_CLS, "class_factor": 9, "state_table": ISO2022CN_ST, @@ -194,7 +195,7 @@ ISO2022JP_ST = ( ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) -ISO2022JP_SM_MODEL = { +ISO2022JP_SM_MODEL: CodingStateMachineDict = { "class_table": ISO2022JP_CLS, "class_factor": 10, "state_table": ISO2022JP_ST, @@ -250,7 +251,7 @@ ISO2022KR_ST = ( ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) -ISO2022KR_SM_MODEL = { +ISO2022KR_SM_MODEL: CodingStateMachineDict = { "class_table": ISO2022KR_CLS, "class_factor": 6, "state_table": ISO2022KR_ST, diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py index abf2e66e..39487f40 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -25,6 +25,8 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import Union + from .chardistribution import EUCJPDistributionAnalysis from .codingstatemachine import CodingStateMachine from .enums import MachineState, ProbingState @@ -34,26 +36,29 @@ from .mbcssm import EUCJP_SM_MODEL class EUCJPProber(MultiByteCharSetProber): - def __init__(self): + def __init__(self) -> None: super().__init__() self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) self.distribution_analyzer = EUCJPDistributionAnalysis() self.context_analyzer = EUCJPContextAnalysis() self.reset() - def reset(self): + def reset(self) -> None: super().reset() self.context_analyzer.reset() @property - def charset_name(self): + def charset_name(self) -> str: return "EUC-JP" @property - def language(self): + def language(self) -> str: return "Japanese" - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + assert self.coding_sm is not None + assert self.distribution_analyzer is not None + for i, byte in enumerate(byte_str): # PY3K: byte_str is a byte array, so byte is an int, not a byte coding_state = self.coding_sm.next_state(byte) @@ -89,7 +94,9 @@ class EUCJPProber(MultiByteCharSetProber): return self.state - def get_confidence(self): + def get_confidence(self) -> float: + assert self.distribution_analyzer is not None + context_conf = self.context_analyzer.get_confidence() distrib_conf = self.distribution_analyzer.get_confidence() return max(context_conf, distrib_conf) diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py index 154a6d21..1fc5de04 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py @@ -32,16 +32,16 @@ from .mbcssm import EUCKR_SM_MODEL class EUCKRProber(MultiByteCharSetProber): - def __init__(self): + def __init__(self) -> None: super().__init__() self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) self.distribution_analyzer = EUCKRDistributionAnalysis() self.reset() @property - def charset_name(self): + def charset_name(self) -> str: return "EUC-KR" @property - def language(self): + def language(self) -> str: return "Korean" diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py index ca10a23c..a37ab189 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py @@ -32,16 +32,16 @@ from .mbcssm import EUCTW_SM_MODEL class EUCTWProber(MultiByteCharSetProber): - def __init__(self): + def __init__(self) -> None: super().__init__() self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) self.distribution_analyzer = EUCTWDistributionAnalysis() self.reset() @property - def charset_name(self): + def charset_name(self) -> str: return "EUC-TW" @property - def language(self): + def language(self) -> str: return "Taiwan" diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py index 251c0429..d423e731 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -32,16 +32,16 @@ from .mbcssm import GB2312_SM_MODEL class GB2312Prober(MultiByteCharSetProber): - def __init__(self): + def __init__(self) -> None: super().__init__() self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) self.distribution_analyzer = GB2312DistributionAnalysis() self.reset() @property - def charset_name(self): + def charset_name(self) -> str: return "GB2312" @property - def language(self): + def language(self) -> str: return "Chinese" diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py index 3ca634bf..785d0057 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -25,8 +25,11 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import Optional, Union + from .charsetprober import CharSetProber from .enums import ProbingState +from .sbcharsetprober import SingleByteCharSetProber # This prober doesn't actually recognize a language or a charset. # It is a helper prober for the use of the Hebrew model probers @@ -127,6 +130,7 @@ from .enums import ProbingState class HebrewProber(CharSetProber): + SPACE = 0x20 # windows-1255 / ISO-8859-8 code points of interest FINAL_KAF = 0xEA NORMAL_KAF = 0xEB @@ -152,31 +156,35 @@ class HebrewProber(CharSetProber): VISUAL_HEBREW_NAME = "ISO-8859-8" LOGICAL_HEBREW_NAME = "windows-1255" - def __init__(self): + def __init__(self) -> None: super().__init__() - self._final_char_logical_score = None - self._final_char_visual_score = None - self._prev = None - self._before_prev = None - self._logical_prober = None - self._visual_prober = None + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + self._prev = self.SPACE + self._before_prev = self.SPACE + self._logical_prober: Optional[SingleByteCharSetProber] = None + self._visual_prober: Optional[SingleByteCharSetProber] = None self.reset() - def reset(self): + def reset(self) -> None: self._final_char_logical_score = 0 self._final_char_visual_score = 0 # The two last characters seen in the previous buffer, # mPrev and mBeforePrev are initialized to space in order to simulate # a word delimiter at the beginning of the data - self._prev = " " - self._before_prev = " " + self._prev = self.SPACE + self._before_prev = self.SPACE # These probers are owned by the group prober. - def set_model_probers(self, logical_prober, visual_prober): + def set_model_probers( + self, + logical_prober: SingleByteCharSetProber, + visual_prober: SingleByteCharSetProber, + ) -> None: self._logical_prober = logical_prober self._visual_prober = visual_prober - def is_final(self, c): + def is_final(self, c: int) -> bool: return c in [ self.FINAL_KAF, self.FINAL_MEM, @@ -185,7 +193,7 @@ class HebrewProber(CharSetProber): self.FINAL_TSADI, ] - def is_non_final(self, c): + def is_non_final(self, c: int) -> bool: # The normal Tsadi is not a good Non-Final letter due to words like # 'lechotet' (to chat) containing an apostrophe after the tsadi. This # apostrophe is converted to a space in FilterWithoutEnglishLetters @@ -198,7 +206,7 @@ class HebrewProber(CharSetProber): # since these words are quite rare. return c in [self.NORMAL_KAF, self.NORMAL_MEM, self.NORMAL_NUN, self.NORMAL_PE] - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: # Final letter analysis for logical-visual decision. # Look for evidence that the received buffer is either logical Hebrew # or visual Hebrew. @@ -232,9 +240,9 @@ class HebrewProber(CharSetProber): byte_str = self.filter_high_byte_only(byte_str) for cur in byte_str: - if cur == " ": + if cur == self.SPACE: # We stand on a space - a word just ended - if self._before_prev != " ": + if self._before_prev != self.SPACE: # next-to-last char was not a space so self._prev is not a # 1 letter word if self.is_final(self._prev): @@ -247,9 +255,9 @@ class HebrewProber(CharSetProber): else: # Not standing on a space if ( - (self._before_prev == " ") + (self._before_prev == self.SPACE) and (self.is_final(self._prev)) - and (cur != " ") + and (cur != self.SPACE) ): # case (3) [-2:space][-1:final letter][cur:not space] self._final_char_visual_score += 1 @@ -261,7 +269,10 @@ class HebrewProber(CharSetProber): return ProbingState.DETECTING @property - def charset_name(self): + def charset_name(self) -> str: + assert self._logical_prober is not None + assert self._visual_prober is not None + # Make the decision: is it Logical or Visual? # If the final letter score distance is dominant enough, rely on it. finalsub = self._final_char_logical_score - self._final_char_visual_score @@ -289,11 +300,14 @@ class HebrewProber(CharSetProber): return self.LOGICAL_HEBREW_NAME @property - def language(self): + def language(self) -> str: return "Hebrew" @property - def state(self): + def state(self) -> ProbingState: + assert self._logical_prober is not None + assert self._visual_prober is not None + # Remain active as long as any of the model probers are active. if (self._logical_prober.state == ProbingState.NOT_ME) and ( self._visual_prober.state == ProbingState.NOT_ME diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/johabprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/johabprober.py index 6f359d19..d7364ba6 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/johabprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/johabprober.py @@ -32,16 +32,16 @@ from .mbcssm import JOHAB_SM_MODEL class JOHABProber(MultiByteCharSetProber): - def __init__(self): + def __init__(self) -> None: super().__init__() self.coding_sm = CodingStateMachine(JOHAB_SM_MODEL) self.distribution_analyzer = JOHABDistributionAnalysis() self.reset() @property - def charset_name(self): + def charset_name(self) -> str: return "Johab" @property - def language(self): + def language(self) -> str: return "Korean" diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py b/.venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py index 7a8e5be0..2f53bdda 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py @@ -25,6 +25,7 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import List, Tuple, Union # This is hiragana 2-char sequence table, the number in each cell represents its frequency category # fmt: off @@ -123,15 +124,15 @@ class JapaneseContextAnalysis: MAX_REL_THRESHOLD = 1000 MINIMUM_DATA_THRESHOLD = 4 - def __init__(self): - self._total_rel = None - self._rel_sample = None - self._need_to_skip_char_num = None - self._last_char_order = None - self._done = None + def __init__(self) -> None: + self._total_rel = 0 + self._rel_sample: List[int] = [] + self._need_to_skip_char_num = 0 + self._last_char_order = -1 + self._done = False self.reset() - def reset(self): + def reset(self) -> None: self._total_rel = 0 # total sequence received # category counters, each integer counts sequence in its category self._rel_sample = [0] * self.NUM_OF_CATEGORY @@ -143,7 +144,7 @@ class JapaneseContextAnalysis: # been made self._done = False - def feed(self, byte_str, num_bytes): + def feed(self, byte_str: Union[bytes, bytearray], num_bytes: int) -> None: if self._done: return @@ -172,29 +173,29 @@ class JapaneseContextAnalysis: ] += 1 self._last_char_order = order - def got_enough_data(self): + def got_enough_data(self) -> bool: return self._total_rel > self.ENOUGH_REL_THRESHOLD - def get_confidence(self): + def get_confidence(self) -> float: # This is just one way to calculate confidence. It works well for me. if self._total_rel > self.MINIMUM_DATA_THRESHOLD: return (self._total_rel - self._rel_sample[0]) / self._total_rel return self.DONT_KNOW - def get_order(self, _): + def get_order(self, _: Union[bytes, bytearray]) -> Tuple[int, int]: return -1, 1 class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self): + def __init__(self) -> None: super().__init__() self._charset_name = "SHIFT_JIS" @property - def charset_name(self): + def charset_name(self) -> str: return self._charset_name - def get_order(self, byte_str): + def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]: if not byte_str: return -1, 1 # find out current char's byte length @@ -216,7 +217,7 @@ class SJISContextAnalysis(JapaneseContextAnalysis): class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, byte_str): + def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]: if not byte_str: return -1, 1 # find out current char's byte length diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py index 241f14ab..59a01d91 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py @@ -26,6 +26,8 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import List, Union + from .charsetprober import CharSetProber from .enums import ProbingState @@ -96,26 +98,26 @@ Latin1ClassModel = ( class Latin1Prober(CharSetProber): - def __init__(self): + def __init__(self) -> None: super().__init__() - self._last_char_class = None - self._freq_counter = None + self._last_char_class = OTH + self._freq_counter: List[int] = [] self.reset() - def reset(self): + def reset(self) -> None: self._last_char_class = OTH self._freq_counter = [0] * FREQ_CAT_NUM super().reset() @property - def charset_name(self): + def charset_name(self) -> str: return "ISO-8859-1" @property - def language(self): + def language(self) -> str: return "" - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: byte_str = self.remove_xml_tags(byte_str) for c in byte_str: char_class = Latin1_CharToClass[c] @@ -128,7 +130,7 @@ class Latin1Prober(CharSetProber): return self.state - def get_confidence(self): + def get_confidence(self) -> float: if self.state == ProbingState.NOT_ME: return 0.01 diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/macromanprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/macromanprober.py new file mode 100644 index 00000000..1425d10e --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/macromanprober.py @@ -0,0 +1,162 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This code was modified from latin1prober.py by Rob Speer . +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Rob Speer - adapt to MacRoman encoding +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from typing import List, Union + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +ODD = 8 # character that is unlikely to appear +CLASS_NUM = 9 # total classes + +# The change from Latin1 is that we explicitly look for extended characters +# that are infrequently-occurring symbols, and consider them to always be +# improbable. This should let MacRoman get out of the way of more likely +# encodings in most situations. + +# fmt: off +MacRoman_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + ACV, ACV, ACO, ACV, ACO, ACV, ACV, ASV, # 80 - 87 + ASV, ASV, ASV, ASV, ASV, ASO, ASV, ASV, # 88 - 8F + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASV, # 90 - 97 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, ASO, # A0 - A7 + OTH, OTH, ODD, ODD, OTH, OTH, ACV, ACV, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, ASV, ASV, # B8 - BF + OTH, OTH, ODD, OTH, ODD, OTH, OTH, OTH, # C0 - C7 + OTH, OTH, OTH, ACV, ACV, ACV, ACV, ASV, # C8 - CF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, ODD, # D0 - D7 + ASV, ACV, ODD, OTH, OTH, OTH, OTH, OTH, # D8 - DF + OTH, OTH, OTH, OTH, OTH, ACV, ACV, ACV, # E0 - E7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # E8 - EF + ODD, ACV, ACV, ACV, ACV, ASV, ODD, ODD, # F0 - F7 + ODD, ODD, ODD, ODD, ODD, ODD, ODD, ODD, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +MacRomanClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO ODD + 0, 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, 1, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, 1, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, 1, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, 1, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, 1, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, 1, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, 1, # ASO + 0, 1, 1, 1, 1, 1, 1, 1, 1, # ODD +) +# fmt: on + + +class MacRomanProber(CharSetProber): + def __init__(self) -> None: + super().__init__() + self._last_char_class = OTH + self._freq_counter: List[int] = [] + self.reset() + + def reset(self) -> None: + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + + # express the prior that MacRoman is a somewhat rare encoding; + # this can be done by starting out in a slightly improbable state + # that must be overcome + self._freq_counter[2] = 10 + + super().reset() + + @property + def charset_name(self) -> str: + return "MacRoman" + + @property + def language(self) -> str: + return "" + + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + byte_str = self.remove_xml_tags(byte_str) + for c in byte_str: + char_class = MacRoman_CharToClass[c] + freq = MacRomanClassModel[(self._last_char_class * CLASS_NUM) + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self) -> float: + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + confidence = ( + 0.0 + if total < 0.01 + else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total + ) + confidence = max(confidence, 0.0) + # lower the confidence of MacRoman so that other more accurate + # detector can take priority. + confidence *= 0.73 + return confidence diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py index bf96ad5d..666307e8 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -27,8 +27,12 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import Optional, Union + +from .chardistribution import CharDistributionAnalysis from .charsetprober import CharSetProber -from .enums import MachineState, ProbingState +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, MachineState, ProbingState class MultiByteCharSetProber(CharSetProber): @@ -36,29 +40,24 @@ class MultiByteCharSetProber(CharSetProber): MultiByteCharSetProber """ - def __init__(self, lang_filter=None): + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: super().__init__(lang_filter=lang_filter) - self.distribution_analyzer = None - self.coding_sm = None - self._last_char = [0, 0] + self.distribution_analyzer: Optional[CharDistributionAnalysis] = None + self.coding_sm: Optional[CodingStateMachine] = None + self._last_char = bytearray(b"\0\0") - def reset(self): + def reset(self) -> None: super().reset() if self.coding_sm: self.coding_sm.reset() if self.distribution_analyzer: self.distribution_analyzer.reset() - self._last_char = [0, 0] + self._last_char = bytearray(b"\0\0") - @property - def charset_name(self): - raise NotImplementedError + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + assert self.coding_sm is not None + assert self.distribution_analyzer is not None - @property - def language(self): - raise NotImplementedError - - def feed(self, byte_str): for i, byte in enumerate(byte_str): coding_state = self.coding_sm.next_state(byte) if coding_state == MachineState.ERROR: @@ -91,5 +90,6 @@ class MultiByteCharSetProber(CharSetProber): return self.state - def get_confidence(self): + def get_confidence(self) -> float: + assert self.distribution_analyzer is not None return self.distribution_analyzer.get_confidence() diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py index 94488360..6cb9cc7b 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py @@ -30,6 +30,7 @@ from .big5prober import Big5Prober from .charsetgroupprober import CharSetGroupProber from .cp949prober import CP949Prober +from .enums import LanguageFilter from .eucjpprober import EUCJPProber from .euckrprober import EUCKRProber from .euctwprober import EUCTWProber @@ -40,7 +41,7 @@ from .utf8prober import UTF8Prober class MBCSGroupProber(CharSetGroupProber): - def __init__(self, lang_filter=None): + def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: super().__init__(lang_filter=lang_filter) self.probers = [ UTF8Prober(), diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py b/.venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py index d3b9c4b7..7bbe97e6 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py @@ -25,6 +25,7 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from .codingstatemachinedict import CodingStateMachineDict from .enums import MachineState # BIG5 @@ -74,7 +75,7 @@ BIG5_ST = ( BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) -BIG5_SM_MODEL = { +BIG5_SM_MODEL: CodingStateMachineDict = { "class_table": BIG5_CLS, "class_factor": 5, "state_table": BIG5_ST, @@ -117,7 +118,7 @@ CP949_ST = ( CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) -CP949_SM_MODEL = { +CP949_SM_MODEL: CodingStateMachineDict = { "class_table": CP949_CLS, "class_factor": 10, "state_table": CP949_ST, @@ -173,7 +174,7 @@ EUCJP_ST = ( EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) -EUCJP_SM_MODEL = { +EUCJP_SM_MODEL: CodingStateMachineDict = { "class_table": EUCJP_CLS, "class_factor": 6, "state_table": EUCJP_ST, @@ -226,7 +227,7 @@ EUCKR_ST = ( EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) -EUCKR_SM_MODEL = { +EUCKR_SM_MODEL: CodingStateMachineDict = { "class_table": EUCKR_CLS, "class_factor": 4, "state_table": EUCKR_ST, @@ -283,7 +284,7 @@ JOHAB_ST = ( JOHAB_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 0, 0, 2, 2, 2) -JOHAB_SM_MODEL = { +JOHAB_SM_MODEL: CodingStateMachineDict = { "class_table": JOHAB_CLS, "class_factor": 10, "state_table": JOHAB_ST, @@ -340,7 +341,7 @@ EUCTW_ST = ( EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) -EUCTW_SM_MODEL = { +EUCTW_SM_MODEL: CodingStateMachineDict = { "class_table": EUCTW_CLS, "class_factor": 7, "state_table": EUCTW_ST, @@ -402,7 +403,7 @@ GB2312_ST = ( # 2 here. GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) -GB2312_SM_MODEL = { +GB2312_SM_MODEL: CodingStateMachineDict = { "class_table": GB2312_CLS, "class_factor": 7, "state_table": GB2312_ST, @@ -458,7 +459,7 @@ SJIS_ST = ( SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) -SJIS_SM_MODEL = { +SJIS_SM_MODEL: CodingStateMachineDict = { "class_table": SJIS_CLS, "class_factor": 6, "state_table": SJIS_ST, @@ -516,7 +517,7 @@ UCS2BE_ST = ( UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) -UCS2BE_SM_MODEL = { +UCS2BE_SM_MODEL: CodingStateMachineDict = { "class_table": UCS2BE_CLS, "class_factor": 6, "state_table": UCS2BE_ST, @@ -574,7 +575,7 @@ UCS2LE_ST = ( UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) -UCS2LE_SM_MODEL = { +UCS2LE_SM_MODEL: CodingStateMachineDict = { "class_table": UCS2LE_CLS, "class_factor": 6, "state_table": UCS2LE_ST, @@ -651,7 +652,7 @@ UTF8_ST = ( UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) -UTF8_SM_MODEL = { +UTF8_SM_MODEL: CodingStateMachineDict = { "class_table": UTF8_CLS, "class_factor": 16, "state_table": UTF8_ST, diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc index 718c66d9..0c0c01c6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc index b0b5fb04..c34012cf 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py index 1d37884c..eb40c5f0 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py @@ -6,6 +6,7 @@ This code is based on the language metadata from the uchardet project. """ from string import ascii_letters +from typing import List, Optional # TODO: Add Ukrainian (KOI8-U) @@ -33,13 +34,13 @@ class Language: def __init__( self, - name=None, - iso_code=None, - use_ascii=True, - charsets=None, - alphabet=None, - wiki_start_pages=None, - ): + name: Optional[str] = None, + iso_code: Optional[str] = None, + use_ascii: bool = True, + charsets: Optional[List[str]] = None, + alphabet: Optional[str] = None, + wiki_start_pages: Optional[List[str]] = None, + ) -> None: super().__init__() self.name = name self.iso_code = iso_code @@ -55,7 +56,7 @@ class Language: self.alphabet = "".join(sorted(set(alphabet))) if alphabet else None self.wiki_start_pages = wiki_start_pages - def __repr__(self): + def __repr__(self) -> str: param_str = ", ".join( f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_") ) @@ -103,7 +104,7 @@ LANGUAGES = { name="Danish", iso_code="da", use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252"], + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], alphabet="æøåÆØÅ", wiki_start_pages=["Forside"], ), @@ -111,8 +112,8 @@ LANGUAGES = { name="German", iso_code="de", use_ascii=True, - charsets=["ISO-8859-1", "WINDOWS-1252"], - alphabet="äöüßÄÖÜ", + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], + alphabet="äöüßẞÄÖÜ", wiki_start_pages=["Wikipedia:Hauptseite"], ), "Greek": Language( @@ -127,7 +128,7 @@ LANGUAGES = { name="English", iso_code="en", use_ascii=True, - charsets=["ISO-8859-1", "WINDOWS-1252"], + charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"], wiki_start_pages=["Main_Page"], ), "Esperanto": Language( @@ -143,7 +144,7 @@ LANGUAGES = { name="Spanish", iso_code="es", use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252"], + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], alphabet="ñáéíóúüÑÁÉÍÓÚÜ", wiki_start_pages=["Wikipedia:Portada"], ), @@ -161,7 +162,7 @@ LANGUAGES = { name="Finnish", iso_code="fi", use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252"], + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], alphabet="ÅÄÖŠŽåäöšž", wiki_start_pages=["Wikipedia:Etusivu"], ), @@ -169,7 +170,7 @@ LANGUAGES = { name="French", iso_code="fr", use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252"], + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], alphabet="œàâçèéîïùûêŒÀÂÇÈÉÎÏÙÛÊ", wiki_start_pages=["Wikipédia:Accueil_principal", "Bœuf (animal)"], ), @@ -203,7 +204,7 @@ LANGUAGES = { name="Italian", iso_code="it", use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252"], + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], alphabet="ÀÈÉÌÒÓÙàèéìòóù", wiki_start_pages=["Pagina_principale"], ), @@ -237,7 +238,7 @@ LANGUAGES = { name="Dutch", iso_code="nl", use_ascii=True, - charsets=["ISO-8859-1", "WINDOWS-1252"], + charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"], wiki_start_pages=["Hoofdpagina"], ), "Polish": Language( @@ -253,7 +254,7 @@ LANGUAGES = { name="Portuguese", iso_code="pt", use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252"], + charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], alphabet="ÁÂÃÀÇÉÊÍÓÔÕÚáâãàçéêíóôõú", wiki_start_pages=["Wikipédia:Página_principal"], ), diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/resultdict.py b/.venv/Lib/site-packages/pip/_vendor/chardet/resultdict.py new file mode 100644 index 00000000..7d36e64c --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/resultdict.py @@ -0,0 +1,16 @@ +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + # TypedDict was introduced in Python 3.8. + # + # TODO: Remove the else block and TYPE_CHECKING check when dropping support + # for Python 3.7. + from typing import TypedDict + + class ResultDict(TypedDict): + encoding: Optional[str] + confidence: float + language: Optional[str] + +else: + ResultDict = dict diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py index 31d70e15..0ffbcdd2 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py @@ -26,23 +26,20 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from collections import namedtuple +from typing import Dict, List, NamedTuple, Optional, Union from .charsetprober import CharSetProber from .enums import CharacterCategory, ProbingState, SequenceLikelihood -SingleByteCharSetModel = namedtuple( - "SingleByteCharSetModel", - [ - "charset_name", - "language", - "char_to_order_map", - "language_model", - "typical_positive_ratio", - "keep_ascii_letters", - "alphabet", - ], -) + +class SingleByteCharSetModel(NamedTuple): + charset_name: str + language: str + char_to_order_map: Dict[int, int] + language_model: Dict[int, Dict[int, int]] + typical_positive_ratio: float + keep_ascii_letters: bool + alphabet: str class SingleByteCharSetProber(CharSetProber): @@ -51,22 +48,27 @@ class SingleByteCharSetProber(CharSetProber): POSITIVE_SHORTCUT_THRESHOLD = 0.95 NEGATIVE_SHORTCUT_THRESHOLD = 0.05 - def __init__(self, model, is_reversed=False, name_prober=None): + def __init__( + self, + model: SingleByteCharSetModel, + is_reversed: bool = False, + name_prober: Optional[CharSetProber] = None, + ) -> None: super().__init__() self._model = model # TRUE if we need to reverse every pair in the model lookup self._reversed = is_reversed # Optional auxiliary prober for name decision self._name_prober = name_prober - self._last_order = None - self._seq_counters = None - self._total_seqs = None - self._total_char = None - self._control_char = None - self._freq_char = None + self._last_order = 255 + self._seq_counters: List[int] = [] + self._total_seqs = 0 + self._total_char = 0 + self._control_char = 0 + self._freq_char = 0 self.reset() - def reset(self): + def reset(self) -> None: super().reset() # char order of last character self._last_order = 255 @@ -78,18 +80,18 @@ class SingleByteCharSetProber(CharSetProber): self._freq_char = 0 @property - def charset_name(self): + def charset_name(self) -> Optional[str]: if self._name_prober: return self._name_prober.charset_name return self._model.charset_name @property - def language(self): + def language(self) -> Optional[str]: if self._name_prober: return self._name_prober.language return self._model.language - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: # TODO: Make filter_international_words keep things in self.alphabet if not self._model.keep_ascii_letters: byte_str = self.filter_international_words(byte_str) @@ -139,7 +141,7 @@ class SingleByteCharSetProber(CharSetProber): return self.state - def get_confidence(self): + def get_confidence(self) -> float: r = 0.01 if self._total_seqs > 0: r = ( diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py index cad001cb..890ae846 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -48,7 +48,7 @@ from .sbcharsetprober import SingleByteCharSetProber class SBCSGroupProber(CharSetGroupProber): - def __init__(self): + def __init__(self) -> None: super().__init__() hebrew_prober = HebrewProber() logical_hebrew_prober = SingleByteCharSetProber( diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py index 3bcbdb71..91df0779 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py @@ -25,6 +25,8 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import Union + from .chardistribution import SJISDistributionAnalysis from .codingstatemachine import CodingStateMachine from .enums import MachineState, ProbingState @@ -34,26 +36,29 @@ from .mbcssm import SJIS_SM_MODEL class SJISProber(MultiByteCharSetProber): - def __init__(self): + def __init__(self) -> None: super().__init__() self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) self.distribution_analyzer = SJISDistributionAnalysis() self.context_analyzer = SJISContextAnalysis() self.reset() - def reset(self): + def reset(self) -> None: super().reset() self.context_analyzer.reset() @property - def charset_name(self): + def charset_name(self) -> str: return self.context_analyzer.charset_name @property - def language(self): + def language(self) -> str: return "Japanese" - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: + assert self.coding_sm is not None + assert self.distribution_analyzer is not None + for i, byte in enumerate(byte_str): coding_state = self.coding_sm.next_state(byte) if coding_state == MachineState.ERROR: @@ -92,7 +97,9 @@ class SJISProber(MultiByteCharSetProber): return self.state - def get_confidence(self): + def get_confidence(self) -> float: + assert self.distribution_analyzer is not None + context_conf = self.context_analyzer.get_confidence() distrib_conf = self.distribution_analyzer.get_confidence() return max(context_conf, distrib_conf) diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py b/.venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py index 22fcf829..30c441dc 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py @@ -39,12 +39,16 @@ class a user of ``chardet`` should use. import codecs import logging import re +from typing import List, Optional, Union from .charsetgroupprober import CharSetGroupProber +from .charsetprober import CharSetProber from .enums import InputState, LanguageFilter, ProbingState from .escprober import EscCharSetProber from .latin1prober import Latin1Prober +from .macromanprober import MacRomanProber from .mbcsgroupprober import MBCSGroupProber +from .resultdict import ResultDict from .sbcsgroupprober import SBCSGroupProber from .utf1632prober import UTF1632Prober @@ -80,34 +84,55 @@ class UniversalDetector: "iso-8859-9": "Windows-1254", "iso-8859-13": "Windows-1257", } + # Based on https://encoding.spec.whatwg.org/#names-and-labels + # but altered to match Python names for encodings and remove mappings + # that break tests. + LEGACY_MAP = { + "ascii": "Windows-1252", + "iso-8859-1": "Windows-1252", + "tis-620": "ISO-8859-11", + "iso-8859-9": "Windows-1254", + "gb2312": "GB18030", + "euc-kr": "CP949", + "utf-16le": "UTF-16", + } - def __init__(self, lang_filter=LanguageFilter.ALL): - self._esc_charset_prober = None - self._utf1632_prober = None - self._charset_probers = [] - self.result = None - self.done = None - self._got_data = None - self._input_state = None - self._last_char = None + def __init__( + self, + lang_filter: LanguageFilter = LanguageFilter.ALL, + should_rename_legacy: bool = False, + ) -> None: + self._esc_charset_prober: Optional[EscCharSetProber] = None + self._utf1632_prober: Optional[UTF1632Prober] = None + self._charset_probers: List[CharSetProber] = [] + self.result: ResultDict = { + "encoding": None, + "confidence": 0.0, + "language": None, + } + self.done = False + self._got_data = False + self._input_state = InputState.PURE_ASCII + self._last_char = b"" self.lang_filter = lang_filter self.logger = logging.getLogger(__name__) - self._has_win_bytes = None + self._has_win_bytes = False + self.should_rename_legacy = should_rename_legacy self.reset() @property - def input_state(self): + def input_state(self) -> int: return self._input_state @property - def has_win_bytes(self): + def has_win_bytes(self) -> bool: return self._has_win_bytes @property - def charset_probers(self): + def charset_probers(self) -> List[CharSetProber]: return self._charset_probers - def reset(self): + def reset(self) -> None: """ Reset the UniversalDetector and all of its probers back to their initial states. This is called by ``__init__``, so you only need to @@ -126,7 +151,7 @@ class UniversalDetector: for prober in self._charset_probers: prober.reset() - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> None: """ Takes a chunk of a document and feeds it through all of the relevant charset probers. @@ -166,6 +191,7 @@ class UniversalDetector: elif byte_str.startswith(b"\xFE\xFF\x00\x00"): # FE FF 00 00 UCS-4, unusual octet order BOM (3412) self.result = { + # TODO: This encoding is not supported by Python. Should remove? "encoding": "X-ISO-10646-UCS-4-3412", "confidence": 1.0, "language": "", @@ -173,6 +199,7 @@ class UniversalDetector: elif byte_str.startswith(b"\x00\x00\xFF\xFE"): # 00 00 FF FE UCS-4, unusual octet order BOM (2143) self.result = { + # TODO: This encoding is not supported by Python. Should remove? "encoding": "X-ISO-10646-UCS-4-2143", "confidence": 1.0, "language": "", @@ -242,6 +269,7 @@ class UniversalDetector: if self.lang_filter & LanguageFilter.NON_CJK: self._charset_probers.append(SBCSGroupProber()) self._charset_probers.append(Latin1Prober()) + self._charset_probers.append(MacRomanProber()) for prober in self._charset_probers: if prober.feed(byte_str) == ProbingState.FOUND_IT: self.result = { @@ -254,7 +282,7 @@ class UniversalDetector: if self.WIN_BYTE_DETECTOR.search(byte_str): self._has_win_bytes = True - def close(self): + def close(self) -> ResultDict: """ Stop analyzing the current document and come up with a final prediction. @@ -288,7 +316,8 @@ class UniversalDetector: max_prober = prober if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): charset_name = max_prober.charset_name - lower_charset_name = max_prober.charset_name.lower() + assert charset_name is not None + lower_charset_name = charset_name.lower() confidence = max_prober.get_confidence() # Use Windows encoding name instead of ISO-8859 if we saw any # extra Windows-specific bytes @@ -297,6 +326,11 @@ class UniversalDetector: charset_name = self.ISO_WIN_MAP.get( lower_charset_name, charset_name ) + # Rename legacy encodings with superset encodings if asked + if self.should_rename_legacy: + charset_name = self.LEGACY_MAP.get( + (charset_name or "").lower(), charset_name + ) self.result = { "encoding": charset_name, "confidence": confidence, diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py index 9fd1580b..6bdec63d 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py @@ -18,6 +18,8 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import List, Union + from .charsetprober import CharSetProber from .enums import ProbingState @@ -36,7 +38,7 @@ class UTF1632Prober(CharSetProber): # a fixed constant ratio of expected zeros or non-zeros in modulo-position. EXPECTED_RATIO = 0.94 - def __init__(self): + def __init__(self) -> None: super().__init__() self.position = 0 self.zeros_at_mod = [0] * 4 @@ -51,7 +53,7 @@ class UTF1632Prober(CharSetProber): self.first_half_surrogate_pair_detected_16le = False self.reset() - def reset(self): + def reset(self) -> None: super().reset() self.position = 0 self.zeros_at_mod = [0] * 4 @@ -66,7 +68,7 @@ class UTF1632Prober(CharSetProber): self.quad = [0, 0, 0, 0] @property - def charset_name(self): + def charset_name(self) -> str: if self.is_likely_utf32be(): return "utf-32be" if self.is_likely_utf32le(): @@ -79,16 +81,16 @@ class UTF1632Prober(CharSetProber): return "utf-16" @property - def language(self): + def language(self) -> str: return "" - def approx_32bit_chars(self): + def approx_32bit_chars(self) -> float: return max(1.0, self.position / 4.0) - def approx_16bit_chars(self): + def approx_16bit_chars(self) -> float: return max(1.0, self.position / 2.0) - def is_likely_utf32be(self): + def is_likely_utf32be(self) -> bool: approx_chars = self.approx_32bit_chars() return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( self.zeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO @@ -98,7 +100,7 @@ class UTF1632Prober(CharSetProber): and not self.invalid_utf32be ) - def is_likely_utf32le(self): + def is_likely_utf32le(self) -> bool: approx_chars = self.approx_32bit_chars() return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( self.nonzeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO @@ -108,7 +110,7 @@ class UTF1632Prober(CharSetProber): and not self.invalid_utf32le ) - def is_likely_utf16be(self): + def is_likely_utf16be(self) -> bool: approx_chars = self.approx_16bit_chars() return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( (self.nonzeros_at_mod[1] + self.nonzeros_at_mod[3]) / approx_chars @@ -118,7 +120,7 @@ class UTF1632Prober(CharSetProber): and not self.invalid_utf16be ) - def is_likely_utf16le(self): + def is_likely_utf16le(self) -> bool: approx_chars = self.approx_16bit_chars() return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( (self.nonzeros_at_mod[0] + self.nonzeros_at_mod[2]) / approx_chars @@ -128,7 +130,7 @@ class UTF1632Prober(CharSetProber): and not self.invalid_utf16le ) - def validate_utf32_characters(self, quad): + def validate_utf32_characters(self, quad: List[int]) -> None: """ Validate if the quad of bytes is valid UTF-32. @@ -150,7 +152,7 @@ class UTF1632Prober(CharSetProber): ): self.invalid_utf32le = True - def validate_utf16_characters(self, pair): + def validate_utf16_characters(self, pair: List[int]) -> None: """ Validate if the pair of bytes is valid UTF-16. @@ -182,7 +184,7 @@ class UTF1632Prober(CharSetProber): else: self.invalid_utf16le = True - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: for c in byte_str: mod4 = self.position % 4 self.quad[mod4] = c @@ -198,7 +200,7 @@ class UTF1632Prober(CharSetProber): return self.state @property - def state(self): + def state(self) -> ProbingState: if self._state in {ProbingState.NOT_ME, ProbingState.FOUND_IT}: # terminal, decided states return self._state @@ -210,7 +212,7 @@ class UTF1632Prober(CharSetProber): self._state = ProbingState.NOT_ME return self._state - def get_confidence(self): + def get_confidence(self) -> float: return ( 0.85 if ( diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py b/.venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py index 3aae09e8..d96354d9 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py @@ -25,6 +25,8 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +from typing import Union + from .charsetprober import CharSetProber from .codingstatemachine import CodingStateMachine from .enums import MachineState, ProbingState @@ -34,26 +36,26 @@ from .mbcssm import UTF8_SM_MODEL class UTF8Prober(CharSetProber): ONE_CHAR_PROB = 0.5 - def __init__(self): + def __init__(self) -> None: super().__init__() self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) - self._num_mb_chars = None + self._num_mb_chars = 0 self.reset() - def reset(self): + def reset(self) -> None: super().reset() self.coding_sm.reset() self._num_mb_chars = 0 @property - def charset_name(self): + def charset_name(self) -> str: return "utf-8" @property - def language(self): + def language(self) -> str: return "" - def feed(self, byte_str): + def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: for c in byte_str: coding_state = self.coding_sm.next_state(c) if coding_state == MachineState.ERROR: @@ -72,7 +74,7 @@ class UTF8Prober(CharSetProber): return self.state - def get_confidence(self): + def get_confidence(self) -> float: unlike = 0.99 if self._num_mb_chars < 6: unlike *= self.ONE_CHAR_PROB**self._num_mb_chars diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/version.py b/.venv/Lib/site-packages/pip/_vendor/chardet/version.py index a08a06b9..c5e9d85c 100644 --- a/.venv/Lib/site-packages/pip/_vendor/chardet/version.py +++ b/.venv/Lib/site-packages/pip/_vendor/chardet/version.py @@ -1,9 +1,9 @@ """ This module exists only to simplify retrieving the version number of chardet -from within setup.py and from chardet subpackages. +from within setuptools and from chardet subpackages. :author: Dan Blanchard (dan.blanchard@gmail.com) """ -__version__ = "5.0.0" +__version__ = "5.1.0" VERSION = __version__.split(".") diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__init__.py b/.venv/Lib/site-packages/pip/_vendor/colorama/__init__.py index 9138a8cc..383101cd 100644 --- a/.venv/Lib/site-packages/pip/_vendor/colorama/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/__init__.py @@ -1,6 +1,7 @@ # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from .initialise import init, deinit, reinit, colorama_text +from .initialise import init, deinit, reinit, colorama_text, just_fix_windows_console from .ansi import Fore, Back, Style, Cursor from .ansitowin32 import AnsiToWin32 -__version__ = '0.4.5' +__version__ = '0.4.6' + diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc index a0b3652a..1528c238 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc index a044f42c..1c1c9bf2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc index 6089cbca..021abac9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc index d3dfb7f4..b935afee 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc index 8000c894..6ef2c783 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc index ecd559ae..22faef8e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py b/.venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py index 3db248ba..abf209e6 100644 --- a/.venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -4,7 +4,7 @@ import sys import os from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL -from .winterm import WinTerm, WinColor, WinStyle +from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle from .win32 import windll, winapi_test @@ -94,15 +94,22 @@ class AnsiToWin32(object): # (e.g. Cygwin Terminal). In this case it's up to the terminal # to support the ANSI codes. conversion_supported = on_windows and winapi_test() + try: + fd = wrapped.fileno() + except Exception: + fd = -1 + system_has_native_ansi = not on_windows or enable_vt_processing(fd) + have_tty = not self.stream.closed and self.stream.isatty() + need_conversion = conversion_supported and not system_has_native_ansi # should we strip ANSI sequences from our output? if strip is None: - strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) + strip = need_conversion or not have_tty self.strip = strip # should we should convert ANSI sequences into win32 calls? if convert is None: - convert = conversion_supported and not self.stream.closed and self.stream.isatty() + convert = need_conversion and have_tty self.convert = convert # dict of ansi codes to win32 functions and parameters @@ -264,3 +271,7 @@ class AnsiToWin32(object): if params[0] in '02': winterm.set_title(params[1]) return text + + + def flush(self): + self.wrapped.flush() diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/initialise.py b/.venv/Lib/site-packages/pip/_vendor/colorama/initialise.py index 430d0668..d5fd4b71 100644 --- a/.venv/Lib/site-packages/pip/_vendor/colorama/initialise.py +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/initialise.py @@ -6,13 +6,27 @@ import sys from .ansitowin32 import AnsiToWin32 -orig_stdout = None -orig_stderr = None +def _wipe_internal_state_for_tests(): + global orig_stdout, orig_stderr + orig_stdout = None + orig_stderr = None -wrapped_stdout = None -wrapped_stderr = None + global wrapped_stdout, wrapped_stderr + wrapped_stdout = None + wrapped_stderr = None -atexit_done = False + global atexit_done + atexit_done = False + + global fixed_windows_console + fixed_windows_console = False + + try: + # no-op if it wasn't registered + atexit.unregister(reset_all) + except AttributeError: + # python 2: no atexit.unregister. Oh well, we did our best. + pass def reset_all(): @@ -55,6 +69,29 @@ def deinit(): sys.stderr = orig_stderr +def just_fix_windows_console(): + global fixed_windows_console + + if sys.platform != "win32": + return + if fixed_windows_console: + return + if wrapped_stdout is not None or wrapped_stderr is not None: + # Someone already ran init() and it did stuff, so we won't second-guess them + return + + # On newer versions of Windows, AnsiToWin32.__init__ will implicitly enable the + # native ANSI support in the console as a side-effect. We only need to actually + # replace sys.stdout/stderr if we're in the old-style conversion mode. + new_stdout = AnsiToWin32(sys.stdout, convert=None, strip=None, autoreset=False) + if new_stdout.convert: + sys.stdout = new_stdout + new_stderr = AnsiToWin32(sys.stderr, convert=None, strip=None, autoreset=False) + if new_stderr.convert: + sys.stderr = new_stderr + + fixed_windows_console = True + @contextlib.contextmanager def colorama_text(*args, **kwargs): init(*args, **kwargs) @@ -78,3 +115,7 @@ def wrap_stream(stream, convert, strip, autoreset, wrap): if wrapper.should_wrap(): stream = wrapper.stream return stream + + +# Use this for initial setup as well, to reduce code duplication +_wipe_internal_state_for_tests() diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__init__.py b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__init__.py new file mode 100644 index 00000000..8c5661e9 --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__init__.py @@ -0,0 +1 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 00000000..34908a04 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc new file mode 100644 index 00000000..81f6a353 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc new file mode 100644 index 00000000..9ad3840d Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc new file mode 100644 index 00000000..75247413 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc new file mode 100644 index 00000000..02e7ec1b Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc new file mode 100644 index 00000000..5082e13a Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc new file mode 100644 index 00000000..9259b402 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/ansi_test.py b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/ansi_test.py new file mode 100644 index 00000000..0a20c80f --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/ansi_test.py @@ -0,0 +1,76 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main + +from ..ansi import Back, Fore, Style +from ..ansitowin32 import AnsiToWin32 + +stdout_orig = sys.stdout +stderr_orig = sys.stderr + + +class AnsiTest(TestCase): + + def setUp(self): + # sanity check: stdout should be a file or StringIO object. + # It will only be AnsiToWin32 if init() has previously wrapped it + self.assertNotEqual(type(sys.stdout), AnsiToWin32) + self.assertNotEqual(type(sys.stderr), AnsiToWin32) + + def tearDown(self): + sys.stdout = stdout_orig + sys.stderr = stderr_orig + + + def testForeAttributes(self): + self.assertEqual(Fore.BLACK, '\033[30m') + self.assertEqual(Fore.RED, '\033[31m') + self.assertEqual(Fore.GREEN, '\033[32m') + self.assertEqual(Fore.YELLOW, '\033[33m') + self.assertEqual(Fore.BLUE, '\033[34m') + self.assertEqual(Fore.MAGENTA, '\033[35m') + self.assertEqual(Fore.CYAN, '\033[36m') + self.assertEqual(Fore.WHITE, '\033[37m') + self.assertEqual(Fore.RESET, '\033[39m') + + # Check the light, extended versions. + self.assertEqual(Fore.LIGHTBLACK_EX, '\033[90m') + self.assertEqual(Fore.LIGHTRED_EX, '\033[91m') + self.assertEqual(Fore.LIGHTGREEN_EX, '\033[92m') + self.assertEqual(Fore.LIGHTYELLOW_EX, '\033[93m') + self.assertEqual(Fore.LIGHTBLUE_EX, '\033[94m') + self.assertEqual(Fore.LIGHTMAGENTA_EX, '\033[95m') + self.assertEqual(Fore.LIGHTCYAN_EX, '\033[96m') + self.assertEqual(Fore.LIGHTWHITE_EX, '\033[97m') + + + def testBackAttributes(self): + self.assertEqual(Back.BLACK, '\033[40m') + self.assertEqual(Back.RED, '\033[41m') + self.assertEqual(Back.GREEN, '\033[42m') + self.assertEqual(Back.YELLOW, '\033[43m') + self.assertEqual(Back.BLUE, '\033[44m') + self.assertEqual(Back.MAGENTA, '\033[45m') + self.assertEqual(Back.CYAN, '\033[46m') + self.assertEqual(Back.WHITE, '\033[47m') + self.assertEqual(Back.RESET, '\033[49m') + + # Check the light, extended versions. + self.assertEqual(Back.LIGHTBLACK_EX, '\033[100m') + self.assertEqual(Back.LIGHTRED_EX, '\033[101m') + self.assertEqual(Back.LIGHTGREEN_EX, '\033[102m') + self.assertEqual(Back.LIGHTYELLOW_EX, '\033[103m') + self.assertEqual(Back.LIGHTBLUE_EX, '\033[104m') + self.assertEqual(Back.LIGHTMAGENTA_EX, '\033[105m') + self.assertEqual(Back.LIGHTCYAN_EX, '\033[106m') + self.assertEqual(Back.LIGHTWHITE_EX, '\033[107m') + + + def testStyleAttributes(self): + self.assertEqual(Style.DIM, '\033[2m') + self.assertEqual(Style.NORMAL, '\033[22m') + self.assertEqual(Style.BRIGHT, '\033[1m') + + +if __name__ == '__main__': + main() diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py new file mode 100644 index 00000000..91ca551f --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py @@ -0,0 +1,294 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from io import StringIO, TextIOWrapper +from unittest import TestCase, main +try: + from contextlib import ExitStack +except ImportError: + # python 2 + from contextlib2 import ExitStack + +try: + from unittest.mock import MagicMock, Mock, patch +except ImportError: + from mock import MagicMock, Mock, patch + +from ..ansitowin32 import AnsiToWin32, StreamWrapper +from ..win32 import ENABLE_VIRTUAL_TERMINAL_PROCESSING +from .utils import osname + + +class StreamWrapperTest(TestCase): + + def testIsAProxy(self): + mockStream = Mock() + wrapper = StreamWrapper(mockStream, None) + self.assertTrue( wrapper.random_attr is mockStream.random_attr ) + + def testDelegatesWrite(self): + mockStream = Mock() + mockConverter = Mock() + wrapper = StreamWrapper(mockStream, mockConverter) + wrapper.write('hello') + self.assertTrue(mockConverter.write.call_args, (('hello',), {})) + + def testDelegatesContext(self): + mockConverter = Mock() + s = StringIO() + with StreamWrapper(s, mockConverter) as fp: + fp.write(u'hello') + self.assertTrue(s.closed) + + def testProxyNoContextManager(self): + mockStream = MagicMock() + mockStream.__enter__.side_effect = AttributeError() + mockConverter = Mock() + with self.assertRaises(AttributeError) as excinfo: + with StreamWrapper(mockStream, mockConverter) as wrapper: + wrapper.write('hello') + + def test_closed_shouldnt_raise_on_closed_stream(self): + stream = StringIO() + stream.close() + wrapper = StreamWrapper(stream, None) + self.assertEqual(wrapper.closed, True) + + def test_closed_shouldnt_raise_on_detached_stream(self): + stream = TextIOWrapper(StringIO()) + stream.detach() + wrapper = StreamWrapper(stream, None) + self.assertEqual(wrapper.closed, True) + +class AnsiToWin32Test(TestCase): + + def testInit(self): + mockStdout = Mock() + auto = Mock() + stream = AnsiToWin32(mockStdout, autoreset=auto) + self.assertEqual(stream.wrapped, mockStdout) + self.assertEqual(stream.autoreset, auto) + + @patch('colorama.ansitowin32.winterm', None) + @patch('colorama.ansitowin32.winapi_test', lambda *_: True) + def testStripIsTrueOnWindows(self): + with osname('nt'): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout) + self.assertTrue(stream.strip) + + def testStripIsFalseOffWindows(self): + with osname('posix'): + mockStdout = Mock(closed=False) + stream = AnsiToWin32(mockStdout) + self.assertFalse(stream.strip) + + def testWriteStripsAnsi(self): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout) + stream.wrapped = Mock() + stream.write_and_convert = Mock() + stream.strip = True + + stream.write('abc') + + self.assertFalse(stream.wrapped.write.called) + self.assertEqual(stream.write_and_convert.call_args, (('abc',), {})) + + def testWriteDoesNotStripAnsi(self): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout) + stream.wrapped = Mock() + stream.write_and_convert = Mock() + stream.strip = False + stream.convert = False + + stream.write('abc') + + self.assertFalse(stream.write_and_convert.called) + self.assertEqual(stream.wrapped.write.call_args, (('abc',), {})) + + def assert_autoresets(self, convert, autoreset=True): + stream = AnsiToWin32(Mock()) + stream.convert = convert + stream.reset_all = Mock() + stream.autoreset = autoreset + stream.winterm = Mock() + + stream.write('abc') + + self.assertEqual(stream.reset_all.called, autoreset) + + def testWriteAutoresets(self): + self.assert_autoresets(convert=True) + self.assert_autoresets(convert=False) + self.assert_autoresets(convert=True, autoreset=False) + self.assert_autoresets(convert=False, autoreset=False) + + def testWriteAndConvertWritesPlainText(self): + stream = AnsiToWin32(Mock()) + stream.write_and_convert( 'abc' ) + self.assertEqual( stream.wrapped.write.call_args, (('abc',), {}) ) + + def testWriteAndConvertStripsAllValidAnsi(self): + stream = AnsiToWin32(Mock()) + stream.call_win32 = Mock() + data = [ + 'abc\033[mdef', + 'abc\033[0mdef', + 'abc\033[2mdef', + 'abc\033[02mdef', + 'abc\033[002mdef', + 'abc\033[40mdef', + 'abc\033[040mdef', + 'abc\033[0;1mdef', + 'abc\033[40;50mdef', + 'abc\033[50;30;40mdef', + 'abc\033[Adef', + 'abc\033[0Gdef', + 'abc\033[1;20;128Hdef', + ] + for datum in data: + stream.wrapped.write.reset_mock() + stream.write_and_convert( datum ) + self.assertEqual( + [args[0] for args in stream.wrapped.write.call_args_list], + [ ('abc',), ('def',) ] + ) + + def testWriteAndConvertSkipsEmptySnippets(self): + stream = AnsiToWin32(Mock()) + stream.call_win32 = Mock() + stream.write_and_convert( '\033[40m\033[41m' ) + self.assertFalse( stream.wrapped.write.called ) + + def testWriteAndConvertCallsWin32WithParamsAndCommand(self): + stream = AnsiToWin32(Mock()) + stream.convert = True + stream.call_win32 = Mock() + stream.extract_params = Mock(return_value='params') + data = { + 'abc\033[adef': ('a', 'params'), + 'abc\033[;;bdef': ('b', 'params'), + 'abc\033[0cdef': ('c', 'params'), + 'abc\033[;;0;;Gdef': ('G', 'params'), + 'abc\033[1;20;128Hdef': ('H', 'params'), + } + for datum, expected in data.items(): + stream.call_win32.reset_mock() + stream.write_and_convert( datum ) + self.assertEqual( stream.call_win32.call_args[0], expected ) + + def test_reset_all_shouldnt_raise_on_closed_orig_stdout(self): + stream = StringIO() + converter = AnsiToWin32(stream) + stream.close() + + converter.reset_all() + + def test_wrap_shouldnt_raise_on_closed_orig_stdout(self): + stream = StringIO() + stream.close() + with \ + patch("colorama.ansitowin32.os.name", "nt"), \ + patch("colorama.ansitowin32.winapi_test", lambda: True): + converter = AnsiToWin32(stream) + self.assertTrue(converter.strip) + self.assertFalse(converter.convert) + + def test_wrap_shouldnt_raise_on_missing_closed_attr(self): + with \ + patch("colorama.ansitowin32.os.name", "nt"), \ + patch("colorama.ansitowin32.winapi_test", lambda: True): + converter = AnsiToWin32(object()) + self.assertTrue(converter.strip) + self.assertFalse(converter.convert) + + def testExtractParams(self): + stream = AnsiToWin32(Mock()) + data = { + '': (0,), + ';;': (0,), + '2': (2,), + ';;002;;': (2,), + '0;1': (0, 1), + ';;003;;456;;': (3, 456), + '11;22;33;44;55': (11, 22, 33, 44, 55), + } + for datum, expected in data.items(): + self.assertEqual(stream.extract_params('m', datum), expected) + + def testCallWin32UsesLookup(self): + listener = Mock() + stream = AnsiToWin32(listener) + stream.win32_calls = { + 1: (lambda *_, **__: listener(11),), + 2: (lambda *_, **__: listener(22),), + 3: (lambda *_, **__: listener(33),), + } + stream.call_win32('m', (3, 1, 99, 2)) + self.assertEqual( + [a[0][0] for a in listener.call_args_list], + [33, 11, 22] ) + + def test_osc_codes(self): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout, convert=True) + with patch('colorama.ansitowin32.winterm') as winterm: + data = [ + '\033]0\x07', # missing arguments + '\033]0;foo\x08', # wrong OSC command + '\033]0;colorama_test_title\x07', # should work + '\033]1;colorama_test_title\x07', # wrong set command + '\033]2;colorama_test_title\x07', # should work + '\033]' + ';' * 64 + '\x08', # see issue #247 + ] + for code in data: + stream.write(code) + self.assertEqual(winterm.set_title.call_count, 2) + + def test_native_windows_ansi(self): + with ExitStack() as stack: + def p(a, b): + stack.enter_context(patch(a, b, create=True)) + # Pretend to be on Windows + p("colorama.ansitowin32.os.name", "nt") + p("colorama.ansitowin32.winapi_test", lambda: True) + p("colorama.win32.winapi_test", lambda: True) + p("colorama.winterm.win32.windll", "non-None") + p("colorama.winterm.get_osfhandle", lambda _: 1234) + + # Pretend that our mock stream has native ANSI support + p( + "colorama.winterm.win32.GetConsoleMode", + lambda _: ENABLE_VIRTUAL_TERMINAL_PROCESSING, + ) + SetConsoleMode = Mock() + p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) + + stdout = Mock() + stdout.closed = False + stdout.isatty.return_value = True + stdout.fileno.return_value = 1 + + # Our fake console says it has native vt support, so AnsiToWin32 should + # enable that support and do nothing else. + stream = AnsiToWin32(stdout) + SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) + self.assertFalse(stream.strip) + self.assertFalse(stream.convert) + self.assertFalse(stream.should_wrap()) + + # Now let's pretend we're on an old Windows console, that doesn't have + # native ANSI support. + p("colorama.winterm.win32.GetConsoleMode", lambda _: 0) + SetConsoleMode = Mock() + p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) + + stream = AnsiToWin32(stdout) + SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) + self.assertTrue(stream.strip) + self.assertTrue(stream.convert) + self.assertTrue(stream.should_wrap()) + + +if __name__ == '__main__': + main() diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/initialise_test.py b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/initialise_test.py new file mode 100644 index 00000000..89f9b075 --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/initialise_test.py @@ -0,0 +1,189 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main, skipUnless + +try: + from unittest.mock import patch, Mock +except ImportError: + from mock import patch, Mock + +from ..ansitowin32 import StreamWrapper +from ..initialise import init, just_fix_windows_console, _wipe_internal_state_for_tests +from .utils import osname, replace_by + +orig_stdout = sys.stdout +orig_stderr = sys.stderr + + +class InitTest(TestCase): + + @skipUnless(sys.stdout.isatty(), "sys.stdout is not a tty") + def setUp(self): + # sanity check + self.assertNotWrapped() + + def tearDown(self): + _wipe_internal_state_for_tests() + sys.stdout = orig_stdout + sys.stderr = orig_stderr + + def assertWrapped(self): + self.assertIsNot(sys.stdout, orig_stdout, 'stdout should be wrapped') + self.assertIsNot(sys.stderr, orig_stderr, 'stderr should be wrapped') + self.assertTrue(isinstance(sys.stdout, StreamWrapper), + 'bad stdout wrapper') + self.assertTrue(isinstance(sys.stderr, StreamWrapper), + 'bad stderr wrapper') + + def assertNotWrapped(self): + self.assertIs(sys.stdout, orig_stdout, 'stdout should not be wrapped') + self.assertIs(sys.stderr, orig_stderr, 'stderr should not be wrapped') + + @patch('colorama.initialise.reset_all') + @patch('colorama.ansitowin32.winapi_test', lambda *_: True) + @patch('colorama.ansitowin32.enable_vt_processing', lambda *_: False) + def testInitWrapsOnWindows(self, _): + with osname("nt"): + init() + self.assertWrapped() + + @patch('colorama.initialise.reset_all') + @patch('colorama.ansitowin32.winapi_test', lambda *_: False) + def testInitDoesntWrapOnEmulatedWindows(self, _): + with osname("nt"): + init() + self.assertNotWrapped() + + def testInitDoesntWrapOnNonWindows(self): + with osname("posix"): + init() + self.assertNotWrapped() + + def testInitDoesntWrapIfNone(self): + with replace_by(None): + init() + # We can't use assertNotWrapped here because replace_by(None) + # changes stdout/stderr already. + self.assertIsNone(sys.stdout) + self.assertIsNone(sys.stderr) + + def testInitAutoresetOnWrapsOnAllPlatforms(self): + with osname("posix"): + init(autoreset=True) + self.assertWrapped() + + def testInitWrapOffDoesntWrapOnWindows(self): + with osname("nt"): + init(wrap=False) + self.assertNotWrapped() + + def testInitWrapOffIncompatibleWithAutoresetOn(self): + self.assertRaises(ValueError, lambda: init(autoreset=True, wrap=False)) + + @patch('colorama.win32.SetConsoleTextAttribute') + @patch('colorama.initialise.AnsiToWin32') + def testAutoResetPassedOn(self, mockATW32, _): + with osname("nt"): + init(autoreset=True) + self.assertEqual(len(mockATW32.call_args_list), 2) + self.assertEqual(mockATW32.call_args_list[1][1]['autoreset'], True) + self.assertEqual(mockATW32.call_args_list[0][1]['autoreset'], True) + + @patch('colorama.initialise.AnsiToWin32') + def testAutoResetChangeable(self, mockATW32): + with osname("nt"): + init() + + init(autoreset=True) + self.assertEqual(len(mockATW32.call_args_list), 4) + self.assertEqual(mockATW32.call_args_list[2][1]['autoreset'], True) + self.assertEqual(mockATW32.call_args_list[3][1]['autoreset'], True) + + init() + self.assertEqual(len(mockATW32.call_args_list), 6) + self.assertEqual( + mockATW32.call_args_list[4][1]['autoreset'], False) + self.assertEqual( + mockATW32.call_args_list[5][1]['autoreset'], False) + + + @patch('colorama.initialise.atexit.register') + def testAtexitRegisteredOnlyOnce(self, mockRegister): + init() + self.assertTrue(mockRegister.called) + mockRegister.reset_mock() + init() + self.assertFalse(mockRegister.called) + + +class JustFixWindowsConsoleTest(TestCase): + def _reset(self): + _wipe_internal_state_for_tests() + sys.stdout = orig_stdout + sys.stderr = orig_stderr + + def tearDown(self): + self._reset() + + @patch("colorama.ansitowin32.winapi_test", lambda: True) + def testJustFixWindowsConsole(self): + if sys.platform != "win32": + # just_fix_windows_console should be a no-op + just_fix_windows_console() + self.assertIs(sys.stdout, orig_stdout) + self.assertIs(sys.stderr, orig_stderr) + else: + def fake_std(): + # Emulate stdout=not a tty, stderr=tty + # to check that we handle both cases correctly + stdout = Mock() + stdout.closed = False + stdout.isatty.return_value = False + stdout.fileno.return_value = 1 + sys.stdout = stdout + + stderr = Mock() + stderr.closed = False + stderr.isatty.return_value = True + stderr.fileno.return_value = 2 + sys.stderr = stderr + + for native_ansi in [False, True]: + with patch( + 'colorama.ansitowin32.enable_vt_processing', + lambda *_: native_ansi + ): + self._reset() + fake_std() + + # Regular single-call test + prev_stdout = sys.stdout + prev_stderr = sys.stderr + just_fix_windows_console() + self.assertIs(sys.stdout, prev_stdout) + if native_ansi: + self.assertIs(sys.stderr, prev_stderr) + else: + self.assertIsNot(sys.stderr, prev_stderr) + + # second call without resetting is always a no-op + prev_stdout = sys.stdout + prev_stderr = sys.stderr + just_fix_windows_console() + self.assertIs(sys.stdout, prev_stdout) + self.assertIs(sys.stderr, prev_stderr) + + self._reset() + fake_std() + + # If init() runs first, just_fix_windows_console should be a no-op + init() + prev_stdout = sys.stdout + prev_stderr = sys.stderr + just_fix_windows_console() + self.assertIs(prev_stdout, sys.stdout) + self.assertIs(prev_stderr, sys.stderr) + + +if __name__ == '__main__': + main() diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/isatty_test.py b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/isatty_test.py new file mode 100644 index 00000000..0f84e4be --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/isatty_test.py @@ -0,0 +1,57 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main + +from ..ansitowin32 import StreamWrapper, AnsiToWin32 +from .utils import pycharm, replace_by, replace_original_by, StreamTTY, StreamNonTTY + + +def is_a_tty(stream): + return StreamWrapper(stream, None).isatty() + +class IsattyTest(TestCase): + + def test_TTY(self): + tty = StreamTTY() + self.assertTrue(is_a_tty(tty)) + with pycharm(): + self.assertTrue(is_a_tty(tty)) + + def test_nonTTY(self): + non_tty = StreamNonTTY() + self.assertFalse(is_a_tty(non_tty)) + with pycharm(): + self.assertFalse(is_a_tty(non_tty)) + + def test_withPycharm(self): + with pycharm(): + self.assertTrue(is_a_tty(sys.stderr)) + self.assertTrue(is_a_tty(sys.stdout)) + + def test_withPycharmTTYOverride(self): + tty = StreamTTY() + with pycharm(), replace_by(tty): + self.assertTrue(is_a_tty(tty)) + + def test_withPycharmNonTTYOverride(self): + non_tty = StreamNonTTY() + with pycharm(), replace_by(non_tty): + self.assertFalse(is_a_tty(non_tty)) + + def test_withPycharmNoneOverride(self): + with pycharm(): + with replace_by(None), replace_original_by(None): + self.assertFalse(is_a_tty(None)) + self.assertFalse(is_a_tty(StreamNonTTY())) + self.assertTrue(is_a_tty(StreamTTY())) + + def test_withPycharmStreamWrapped(self): + with pycharm(): + self.assertTrue(AnsiToWin32(StreamTTY()).stream.isatty()) + self.assertFalse(AnsiToWin32(StreamNonTTY()).stream.isatty()) + self.assertTrue(AnsiToWin32(sys.stdout).stream.isatty()) + self.assertTrue(AnsiToWin32(sys.stderr).stream.isatty()) + + +if __name__ == '__main__': + main() diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/utils.py b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/utils.py new file mode 100644 index 00000000..472fafb4 --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/utils.py @@ -0,0 +1,49 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from contextlib import contextmanager +from io import StringIO +import sys +import os + + +class StreamTTY(StringIO): + def isatty(self): + return True + +class StreamNonTTY(StringIO): + def isatty(self): + return False + +@contextmanager +def osname(name): + orig = os.name + os.name = name + yield + os.name = orig + +@contextmanager +def replace_by(stream): + orig_stdout = sys.stdout + orig_stderr = sys.stderr + sys.stdout = stream + sys.stderr = stream + yield + sys.stdout = orig_stdout + sys.stderr = orig_stderr + +@contextmanager +def replace_original_by(stream): + orig_stdout = sys.__stdout__ + orig_stderr = sys.__stderr__ + sys.__stdout__ = stream + sys.__stderr__ = stream + yield + sys.__stdout__ = orig_stdout + sys.__stderr__ = orig_stderr + +@contextmanager +def pycharm(): + os.environ["PYCHARM_HOSTED"] = "1" + non_tty = StreamNonTTY() + with replace_by(non_tty), replace_original_by(non_tty): + yield + del os.environ["PYCHARM_HOSTED"] diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/winterm_test.py b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/winterm_test.py new file mode 100644 index 00000000..d0955f9e --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/winterm_test.py @@ -0,0 +1,131 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main, skipUnless + +try: + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch + +from ..winterm import WinColor, WinStyle, WinTerm + + +class WinTermTest(TestCase): + + @patch('colorama.winterm.win32') + def testInit(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 7 + 6 * 16 + 8 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + self.assertEqual(term._fore, 7) + self.assertEqual(term._back, 6) + self.assertEqual(term._style, 8) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testGetAttrs(self): + term = WinTerm() + + term._fore = 0 + term._back = 0 + term._style = 0 + self.assertEqual(term.get_attrs(), 0) + + term._fore = WinColor.YELLOW + self.assertEqual(term.get_attrs(), WinColor.YELLOW) + + term._back = WinColor.MAGENTA + self.assertEqual( + term.get_attrs(), + WinColor.YELLOW + WinColor.MAGENTA * 16) + + term._style = WinStyle.BRIGHT + self.assertEqual( + term.get_attrs(), + WinColor.YELLOW + WinColor.MAGENTA * 16 + WinStyle.BRIGHT) + + @patch('colorama.winterm.win32') + def testResetAll(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 1 + 2 * 16 + 8 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + + term.set_console = Mock() + term._fore = -1 + term._back = -1 + term._style = -1 + + term.reset_all() + + self.assertEqual(term._fore, 1) + self.assertEqual(term._back, 2) + self.assertEqual(term._style, 8) + self.assertEqual(term.set_console.called, True) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testFore(self): + term = WinTerm() + term.set_console = Mock() + term._fore = 0 + + term.fore(5) + + self.assertEqual(term._fore, 5) + self.assertEqual(term.set_console.called, True) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testBack(self): + term = WinTerm() + term.set_console = Mock() + term._back = 0 + + term.back(5) + + self.assertEqual(term._back, 5) + self.assertEqual(term.set_console.called, True) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testStyle(self): + term = WinTerm() + term.set_console = Mock() + term._style = 0 + + term.style(22) + + self.assertEqual(term._style, 22) + self.assertEqual(term.set_console.called, True) + + @patch('colorama.winterm.win32') + def testSetConsole(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 0 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + term.windll = Mock() + + term.set_console() + + self.assertEqual( + mockWin32.SetConsoleTextAttribute.call_args, + ((mockWin32.STDOUT, term.get_attrs()), {}) + ) + + @patch('colorama.winterm.win32') + def testSetConsoleOnStderr(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 0 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + term.windll = Mock() + + term.set_console(on_stderr=True) + + self.assertEqual( + mockWin32.SetConsoleTextAttribute.call_args, + ((mockWin32.STDERR, term.get_attrs()), {}) + ) + + +if __name__ == '__main__': + main() diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/win32.py b/.venv/Lib/site-packages/pip/_vendor/colorama/win32.py index c2d83603..841b0e27 100644 --- a/.venv/Lib/site-packages/pip/_vendor/colorama/win32.py +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/win32.py @@ -4,6 +4,8 @@ STDOUT = -11 STDERR = -12 +ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 + try: import ctypes from ctypes import LibraryLoader @@ -89,6 +91,20 @@ else: ] _SetConsoleTitleW.restype = wintypes.BOOL + _GetConsoleMode = windll.kernel32.GetConsoleMode + _GetConsoleMode.argtypes = [ + wintypes.HANDLE, + POINTER(wintypes.DWORD) + ] + _GetConsoleMode.restype = wintypes.BOOL + + _SetConsoleMode = windll.kernel32.SetConsoleMode + _SetConsoleMode.argtypes = [ + wintypes.HANDLE, + wintypes.DWORD + ] + _SetConsoleMode.restype = wintypes.BOOL + def _winapi_test(handle): csbi = CONSOLE_SCREEN_BUFFER_INFO() success = _GetConsoleScreenBufferInfo( @@ -150,3 +166,15 @@ else: def SetConsoleTitle(title): return _SetConsoleTitleW(title) + + def GetConsoleMode(handle): + mode = wintypes.DWORD() + success = _GetConsoleMode(handle, byref(mode)) + if not success: + raise ctypes.WinError() + return mode.value + + def SetConsoleMode(handle, mode): + success = _SetConsoleMode(handle, mode) + if not success: + raise ctypes.WinError() diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/winterm.py b/.venv/Lib/site-packages/pip/_vendor/colorama/winterm.py index 0fdb4ec4..aad867e8 100644 --- a/.venv/Lib/site-packages/pip/_vendor/colorama/winterm.py +++ b/.venv/Lib/site-packages/pip/_vendor/colorama/winterm.py @@ -1,7 +1,13 @@ # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from . import win32 +try: + from msvcrt import get_osfhandle +except ImportError: + def get_osfhandle(_): + raise OSError("This isn't windows!") +from . import win32 + # from wincon.h class WinColor(object): BLACK = 0 @@ -167,3 +173,23 @@ class WinTerm(object): def set_title(self, title): win32.SetConsoleTitle(title) + + +def enable_vt_processing(fd): + if win32.windll is None or not win32.winapi_test(): + return False + + try: + handle = get_osfhandle(fd) + mode = win32.GetConsoleMode(handle) + win32.SetConsoleMode( + handle, + mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING, + ) + + mode = win32.GetConsoleMode(handle) + if mode & win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING: + return True + # Can get TypeError in testsuite where 'fd' is a Mock() + except (OSError, TypeError): + return False diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc index b0c8f0a8..3eb61657 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc index eaf8d647..a505e649 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc index b15d0c68..15048363 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc index 5bc6de99..20467d4e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc index c511e41c..4d79040f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc index bcb0b6c3..29e0083b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc index 47bb8480..586520b9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc index 258dcf6e..314b2dd2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc index 166d2df5..68084cfc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc index 34c1cd2a..1859cc0a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc index 0ded90bd..2cdd69bd 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc index f999347f..b5e5658e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc index f16892e8..dd1b112d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc index bc9a3433..5b61879b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc index 76ed71ae..c21bd465 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc index 6f161892..7e147ea4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distro/distro.py b/.venv/Lib/site-packages/pip/_vendor/distro/distro.py index 49066ae8..89e18680 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distro/distro.py +++ b/.venv/Lib/site-packages/pip/_vendor/distro/distro.py @@ -55,7 +55,7 @@ except ImportError: # Python 3.7 TypedDict = dict -__version__ = "1.7.0" +__version__ = "1.8.0" class VersionDict(TypedDict): @@ -122,6 +122,26 @@ _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( # Pattern for base file name of distro release file _DISTRO_RELEASE_BASENAME_PATTERN = re.compile(r"(\w+)[-_](release|version)$") +# Base file names to be looked up for if _UNIXCONFDIR is not readable. +_DISTRO_RELEASE_BASENAMES = [ + "SuSE-release", + "arch-release", + "base-release", + "centos-release", + "fedora-release", + "gentoo-release", + "mageia-release", + "mandrake-release", + "mandriva-release", + "mandrivalinux-release", + "manjaro-release", + "oracle-release", + "redhat-release", + "rocky-release", + "sl-release", + "slackware-version", +] + # Base file names to be ignored when searching for distro release file _DISTRO_RELEASE_IGNORE_BASENAMES = ( "debian_version", @@ -200,6 +220,7 @@ def id() -> str: "opensuse" openSUSE "amzn" Amazon Linux "arch" Arch Linux + "buildroot" Buildroot "cloudlinux" CloudLinux OS "exherbo" Exherbo Linux "gentoo" GenToo Linux @@ -221,6 +242,7 @@ def id() -> str: "midnightbsd" MidnightBSD "rocky" Rocky Linux "aix" AIX + "guix" Guix System ============== ========================================= If you have a need to get distros for reliable IDs added into this set, @@ -876,6 +898,9 @@ class LinuxDistribution: if self.uname_attr("id").startswith("aix"): # On AIX platforms, prefer oslevel command output. versions.insert(0, self.oslevel_info()) + elif self.id() == "debian" or "debian" in self.like().split(): + # On Debian-like, add debian_version file content to candidates list. + versions.append(self._debian_version) version = "" if best: # This algorithm uses the last version in priority order that has @@ -1186,6 +1211,16 @@ class LinuxDistribution: return "" return self._to_str(stdout).strip() + @cached_property + def _debian_version(self) -> str: + try: + with open( + os.path.join(self.etc_dir, "debian_version"), encoding="ascii" + ) as fp: + return fp.readline().rstrip() + except FileNotFoundError: + return "" + @staticmethod def _parse_uname_content(lines: Sequence[str]) -> Dict[str, str]: if not lines: @@ -1228,14 +1263,14 @@ class LinuxDistribution: # file), because we want to use what was specified as best as # possible. match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if "name" in distro_info and "cloudlinux" in distro_info["name"].lower(): - distro_info["id"] = "cloudlinux" - elif match: - distro_info["id"] = match.group(1) - return distro_info else: try: - basenames = os.listdir(self.etc_dir) + basenames = [ + basename + for basename in os.listdir(self.etc_dir) + if basename not in _DISTRO_RELEASE_IGNORE_BASENAMES + and os.path.isfile(os.path.join(self.etc_dir, basename)) + ] # We sort for repeatability in cases where there are multiple # distro specific files; e.g. CentOS, Oracle, Enterprise all # containing `redhat-release` on top of their own. @@ -1245,39 +1280,29 @@ class LinuxDistribution: # sure about the *-release files. Check common entries of # /etc for information. If they turn out to not be there the # error is handled in `_parse_distro_release_file()`. - basenames = [ - "SuSE-release", - "arch-release", - "base-release", - "centos-release", - "fedora-release", - "gentoo-release", - "mageia-release", - "mandrake-release", - "mandriva-release", - "mandrivalinux-release", - "manjaro-release", - "oracle-release", - "redhat-release", - "rocky-release", - "sl-release", - "slackware-version", - ] + basenames = _DISTRO_RELEASE_BASENAMES for basename in basenames: - if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: - continue match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if match: - filepath = os.path.join(self.etc_dir, basename) - distro_info = self._parse_distro_release_file(filepath) - if "name" in distro_info: - # The name is always present if the pattern matches - self.distro_release_file = filepath - distro_info["id"] = match.group(1) - if "cloudlinux" in distro_info["name"].lower(): - distro_info["id"] = "cloudlinux" - return distro_info - return {} + if match is None: + continue + filepath = os.path.join(self.etc_dir, basename) + distro_info = self._parse_distro_release_file(filepath) + # The name is always present if the pattern matches. + if "name" not in distro_info: + continue + self.distro_release_file = filepath + break + else: # the loop didn't "break": no candidate. + return {} + + if match is not None: + distro_info["id"] = match.group(1) + + # CloudLinux < 7: manually enrich info with proper id. + if "cloudlinux" in distro_info.get("name", "").lower(): + distro_info["id"] = "cloudlinux" + + return distro_info def _parse_distro_release_file(self, filepath: str) -> Dict[str, str]: """ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc index 044c7303..632db509 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc index 7a2d927a..650cd9da 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc index 2b5f6a74..fde5db5a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc index 6868c723..ac5d4500 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc index 252189f3..1d6cd139 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc index 7b184345..977feab6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc index 8df4bc68..e327c7db 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc index 3ae984e5..1804b8c3 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py b/.venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py index 50710218..1300b866 100644 --- a/.venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py @@ -6,8 +6,8 @@ import os import sys -version = (1, 0, 4) -__version__ = "1.0.4" +version = (1, 0, 5) +__version__ = "1.0.5" if os.environ.get("MSGPACK_PUREPYTHON") or sys.version_info[0] == 2: diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc index 3f1f396a..304a0687 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc index e0b9acd9..a7c2250a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc index 62f860f2..2f29c892 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc index 35046024..3407e233 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/ext.py b/.venv/Lib/site-packages/pip/_vendor/msgpack/ext.py index 25544c55..23e0d6b4 100644 --- a/.venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +++ b/.venv/Lib/site-packages/pip/_vendor/msgpack/ext.py @@ -56,7 +56,7 @@ class Timestamp(object): Note: Negative times (before the UNIX epoch) are represented as negative seconds + positive ns. """ if not isinstance(seconds, int_types): - raise TypeError("seconds must be an interger") + raise TypeError("seconds must be an integer") if not isinstance(nanoseconds, int_types): raise TypeError("nanoseconds must be an integer") if not (0 <= nanoseconds < 10**9): diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py b/.venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py index f560c7b5..e8cebc1b 100644 --- a/.venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +++ b/.venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py @@ -814,7 +814,7 @@ class Packer(object): self._pack_raw_header(n) return self._buffer.write(obj) if check(obj, memoryview): - n = len(obj) * obj.itemsize + n = obj.nbytes if n >= 2**32: raise ValueError("Memoryview is too large") self._pack_bin_header(n) diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc index 96b95c26..299e138c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc index d952aa27..d6817d9c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc index 642d9a98..7fe96cc0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc index 699c9a22..55147846 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc index 800e0f01..c90ec724 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc index 7f3fe3f8..905a2f2b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc index 38bbf3da..f3d413fc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc index 63701ad0..045d0391 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc index 713e6745..4bed78b7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc index 996f6e3c..8ea353a1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc index 94825595..77956ba9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__init__.py b/.venv/Lib/site-packages/pip/_vendor/pep517/__init__.py deleted file mode 100644 index 38ea0f5f..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Wrappers to build Python packages using PEP 517 hooks -""" - -__version__ = '0.13.0' - -from .wrappers import * # noqa: F401, F403 diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 10d560b4..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/_compat.cpython-311.pyc deleted file mode 100644 index 5a8682ad..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/_compat.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-311.pyc deleted file mode 100644 index e791a455..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-311.pyc deleted file mode 100644 index c3c1a34c..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-311.pyc deleted file mode 100644 index 491675ff..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-311.pyc deleted file mode 100644 index 645f01c8..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-311.pyc deleted file mode 100644 index 01a152ac..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-311.pyc deleted file mode 100644 index 597da59c..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-311.pyc deleted file mode 100644 index 7071e786..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/build.py b/.venv/Lib/site-packages/pip/_vendor/pep517/build.py deleted file mode 100644 index b30909c8..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/build.py +++ /dev/null @@ -1,126 +0,0 @@ -"""Build a project using PEP 517 hooks. -""" -import argparse -import logging -import os -import shutil -import tempfile - -from ._compat import tomllib -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def validate_system(system): - """ - Ensure build system has the requisite fields. - """ - required = {'requires', 'build-backend'} - if not (required <= set(system)): - message = "Missing required fields: {missing}".format( - missing=required-set(system), - ) - raise ValueError(message) - - -def load_system(source_dir): - """ - Load the build system from a source dir (pyproject.toml). - """ - pyproject = os.path.join(source_dir, 'pyproject.toml') - with open(pyproject, 'rb') as f: - pyproject_data = tomllib.load(f) - return pyproject_data['build-system'] - - -def compat_system(source_dir): - """ - Given a source dir, attempt to get a build system backend - and requirements from pyproject.toml. Fallback to - setuptools but only if the file was not found or a build - system was not indicated. - """ - try: - system = load_system(source_dir) - except (FileNotFoundError, KeyError): - system = {} - system.setdefault( - 'build-backend', - 'setuptools.build_meta:__legacy__', - ) - system.setdefault('requires', ['setuptools', 'wheel']) - return system - - -def _do_build(hooks, env, dist, dest): - get_requires_name = 'get_requires_for_build_{dist}'.format(**locals()) - get_requires = getattr(hooks, get_requires_name) - reqs = get_requires({}) - log.info('Got build requires: %s', reqs) - - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - - with tempfile.TemporaryDirectory() as td: - log.info('Trying to build %s in %s', dist, td) - build_name = 'build_{dist}'.format(**locals()) - build = getattr(hooks, build_name) - filename = build(td, {}) - source = os.path.join(td, filename) - shutil.move(source, os.path.join(dest, os.path.basename(filename))) - - -def build(source_dir, dist, dest=None, system=None): - system = system or load_system(source_dir) - dest = os.path.join(source_dir, dest or 'dist') - os.makedirs(dest, exist_ok=True) - - validate_system(system) - hooks = Pep517HookCaller( - source_dir, system['build-backend'], system.get('backend-path') - ) - - with BuildEnvironment() as env: - env.pip_install(system['requires']) - _do_build(hooks, env, dist, dest) - - -parser = argparse.ArgumentParser() -parser.add_argument( - 'source_dir', - help="A directory containing pyproject.toml", -) -parser.add_argument( - '--binary', '-b', - action='store_true', - default=False, -) -parser.add_argument( - '--source', '-s', - action='store_true', - default=False, -) -parser.add_argument( - '--out-dir', '-o', - help="Destination in which to save the builds relative to source dir", -) - - -def main(args): - log.warning('pep517.build is deprecated. ' - 'Consider switching to https://pypi.org/project/build/') - - # determine which dists to build - dists = list(filter(None, ( - 'sdist' if args.source or not args.binary else None, - 'wheel' if args.binary or not args.source else None, - ))) - - for dist in dists: - build(args.source_dir, dist, args.out_dir) - - -if __name__ == '__main__': - main(parser.parse_args()) diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/check.py b/.venv/Lib/site-packages/pip/_vendor/pep517/check.py deleted file mode 100644 index b79f6270..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/check.py +++ /dev/null @@ -1,207 +0,0 @@ -"""Check a project and backend by attempting to build using PEP 517 hooks. -""" -import argparse -import logging -import os -import shutil -import sys -import tarfile -import zipfile -from os.path import isfile -from os.path import join as pjoin -from subprocess import CalledProcessError -from tempfile import mkdtemp - -from ._compat import tomllib -from .colorlog import enable_colourful_output -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def check_build_sdist(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_sdist({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build sdist in %s', td) - try: - try: - filename = hooks.build_sdist(td, {}) - log.info('build_sdist returned %r', filename) - except Exception: - log.info('Failure in build_sdist', exc_info=True) - return False - - if not filename.endswith('.tar.gz'): - log.error( - "Filename %s doesn't have .tar.gz extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if tarfile.is_tarfile(path): - log.info("Output file is a tar file") - else: - log.error("Output file is not a tar file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check_build_wheel(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_wheel({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build wheel in %s', td) - try: - try: - filename = hooks.build_wheel(td, {}) - log.info('build_wheel returned %r', filename) - except Exception: - log.info('Failure in build_wheel', exc_info=True) - return False - - if not filename.endswith('.whl'): - log.error("Filename %s doesn't have .whl extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if zipfile.is_zipfile(path): - log.info("Output file is a zip file") - else: - log.error("Output file is not a zip file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check(source_dir): - pyproject = pjoin(source_dir, 'pyproject.toml') - if isfile(pyproject): - log.info('Found pyproject.toml') - else: - log.error('Missing pyproject.toml') - return False - - try: - with open(pyproject, 'rb') as f: - pyproject_data = tomllib.load(f) - # Ensure the mandatory data can be loaded - buildsys = pyproject_data['build-system'] - requires = buildsys['requires'] - backend = buildsys['build-backend'] - backend_path = buildsys.get('backend-path') - log.info('Loaded pyproject.toml') - except (tomllib.TOMLDecodeError, KeyError): - log.error("Invalid pyproject.toml", exc_info=True) - return False - - hooks = Pep517HookCaller(source_dir, backend, backend_path) - - sdist_ok = check_build_sdist(hooks, requires) - wheel_ok = check_build_wheel(hooks, requires) - - if not sdist_ok: - log.warning('Sdist checks failed; scroll up to see') - if not wheel_ok: - log.warning('Wheel checks failed') - - return sdist_ok - - -def main(argv=None): - log.warning('pep517.check is deprecated. ' - 'Consider switching to https://pypi.org/project/build/') - - ap = argparse.ArgumentParser() - ap.add_argument( - 'source_dir', - help="A directory containing pyproject.toml") - args = ap.parse_args(argv) - - enable_colourful_output() - - ok = check(args.source_dir) - - if ok: - print(ansi('Checks passed', 'green')) - else: - print(ansi('Checks failed', 'red')) - sys.exit(1) - - -ansi_codes = { - 'reset': '\x1b[0m', - 'bold': '\x1b[1m', - 'red': '\x1b[31m', - 'green': '\x1b[32m', -} - - -def ansi(s, attr): - if os.name != 'nt' and sys.stdout.isatty(): - return ansi_codes[attr] + str(s) + ansi_codes['reset'] - else: - return str(s) - - -if __name__ == '__main__': - main() diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py b/.venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py deleted file mode 100644 index 66310a79..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py +++ /dev/null @@ -1,113 +0,0 @@ -"""Nicer log formatting with colours. - -Code copied from Tornado, Apache licensed. -""" -# Copyright 2012 Facebook -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import sys - -try: - import curses -except ImportError: - curses = None - - -def _stderr_supports_color(): - color = False - if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): - try: - curses.setupterm() - if curses.tigetnum("colors") > 0: - color = True - except Exception: - pass - return color - - -class LogFormatter(logging.Formatter): - """Log formatter with colour support - """ - DEFAULT_COLORS = { - logging.INFO: 2, # Green - logging.WARNING: 3, # Yellow - logging.ERROR: 1, # Red - logging.CRITICAL: 1, - } - - def __init__(self, color=True, datefmt=None): - r""" - :arg bool color: Enables color support. - :arg string fmt: Log message format. - It will be applied to the attributes dict of log records. The - text between ``%(color)s`` and ``%(end_color)s`` will be colored - depending on the level if color support is on. - :arg dict colors: color mappings from logging level to terminal color - code - :arg string datefmt: Datetime format. - Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. - .. versionchanged:: 3.2 - Added ``fmt`` and ``datefmt`` arguments. - """ - logging.Formatter.__init__(self, datefmt=datefmt) - self._colors = {} - if color and _stderr_supports_color(): - # The curses module has some str/bytes confusion in - # python3. Until version 3.2.3, most methods return - # bytes, but only accept strings. In addition, we want to - # output these strings with the logging module, which - # works with unicode strings. The explicit calls to - # unicode() below are harmless in python2 but will do the - # right conversion in python 3. - fg_color = (curses.tigetstr("setaf") or - curses.tigetstr("setf") or "") - - for levelno, code in self.DEFAULT_COLORS.items(): - self._colors[levelno] = str( - curses.tparm(fg_color, code), "ascii") - self._normal = str(curses.tigetstr("sgr0"), "ascii") - - scr = curses.initscr() - self.termwidth = scr.getmaxyx()[1] - curses.endwin() - else: - self._normal = '' - # Default width is usually 80, but too wide is - # worse than too narrow - self.termwidth = 70 - - def formatMessage(self, record): - mlen = len(record.message) - right_text = '{initial}-{name}'.format(initial=record.levelname[0], - name=record.name) - if mlen + len(right_text) < self.termwidth: - space = ' ' * (self.termwidth - (mlen + len(right_text))) - else: - space = ' ' - - if record.levelno in self._colors: - start_color = self._colors[record.levelno] - end_color = self._normal - else: - start_color = end_color = '' - - return record.message + space + start_color + right_text + end_color - - -def enable_colourful_output(level=logging.INFO): - handler = logging.StreamHandler() - handler.setFormatter(LogFormatter()) - logging.root.addHandler(handler) - logging.root.setLevel(level) diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py b/.venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py deleted file mode 100644 index 3eff4d80..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py +++ /dev/null @@ -1,19 +0,0 @@ -import io -import os -import zipfile - - -def dir_to_zipfile(root): - """Construct an in-memory zip file for a directory.""" - buffer = io.BytesIO() - zip_file = zipfile.ZipFile(buffer, 'w') - for root, dirs, files in os.walk(root): - for path in dirs: - fs_path = os.path.join(root, path) - rel_path = os.path.relpath(fs_path, root) - zip_file.writestr(rel_path + '/', '') - for path in files: - fs_path = os.path.join(root, path) - rel_path = os.path.relpath(fs_path, root) - zip_file.write(fs_path, rel_path) - return zip_file diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py b/.venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py deleted file mode 100644 index c0415c4d..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py +++ /dev/null @@ -1,170 +0,0 @@ -"""Build wheels/sdists by installing build deps to a temporary environment. -""" - -import logging -import os -import shutil -import sys -from subprocess import check_call -from sysconfig import get_paths -from tempfile import mkdtemp - -from ._compat import tomllib -from .wrappers import LoggerWrapper, Pep517HookCaller - -log = logging.getLogger(__name__) - - -def _load_pyproject(source_dir): - with open( - os.path.join(source_dir, 'pyproject.toml'), - 'rb', - ) as f: - pyproject_data = tomllib.load(f) - buildsys = pyproject_data['build-system'] - return ( - buildsys['requires'], - buildsys['build-backend'], - buildsys.get('backend-path'), - ) - - -class BuildEnvironment: - """Context manager to install build deps in a simple temporary environment - - Based on code I wrote for pip, which is MIT licensed. - """ - # Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) - # - # Permission is hereby granted, free of charge, to any person obtaining - # a copy of this software and associated documentation files (the - # "Software"), to deal in the Software without restriction, including - # without limitation the rights to use, copy, modify, merge, publish, - # distribute, sublicense, and/or sell copies of the Software, and to - # permit persons to whom the Software is furnished to do so, subject to - # the following conditions: - # - # The above copyright notice and this permission notice shall be - # included in all copies or substantial portions of the Software. - # - # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - path = None - - def __init__(self, cleanup=True): - self._cleanup = cleanup - - def __enter__(self): - self.path = mkdtemp(prefix='pep517-build-env-') - log.info('Temporary build environment: %s', self.path) - - self.save_path = os.environ.get('PATH', None) - self.save_pythonpath = os.environ.get('PYTHONPATH', None) - - install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' - install_dirs = get_paths(install_scheme, vars={ - 'base': self.path, - 'platbase': self.path, - }) - - scripts = install_dirs['scripts'] - if self.save_path: - os.environ['PATH'] = scripts + os.pathsep + self.save_path - else: - os.environ['PATH'] = scripts + os.pathsep + os.defpath - - if install_dirs['purelib'] == install_dirs['platlib']: - lib_dirs = install_dirs['purelib'] - else: - lib_dirs = install_dirs['purelib'] + os.pathsep + \ - install_dirs['platlib'] - if self.save_pythonpath: - os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ - self.save_pythonpath - else: - os.environ['PYTHONPATH'] = lib_dirs - - return self - - def pip_install(self, reqs): - """Install dependencies into this env by calling pip in a subprocess""" - if not reqs: - return - log.info('Calling pip to install %s', reqs) - cmd = [ - sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--prefix', self.path] + list(reqs) - check_call( - cmd, - stdout=LoggerWrapper(log, logging.INFO), - stderr=LoggerWrapper(log, logging.ERROR), - ) - - def __exit__(self, exc_type, exc_val, exc_tb): - needs_cleanup = ( - self._cleanup and - self.path is not None and - os.path.isdir(self.path) - ) - if needs_cleanup: - shutil.rmtree(self.path) - - if self.save_path is None: - os.environ.pop('PATH', None) - else: - os.environ['PATH'] = self.save_path - - if self.save_pythonpath is None: - os.environ.pop('PYTHONPATH', None) - else: - os.environ['PYTHONPATH'] = self.save_pythonpath - - -def build_wheel(source_dir, wheel_dir, config_settings=None): - """Build a wheel from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str wheel_dir: Target directory to create wheel in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend, backend_path = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend, backend_path) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_wheel(config_settings) - env.pip_install(reqs) - return hooks.build_wheel(wheel_dir, config_settings) - - -def build_sdist(source_dir, sdist_dir, config_settings=None): - """Build an sdist from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str sdist_dir: Target directory to place sdist in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend, backend_path = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend, backend_path) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_sdist(config_settings) - env.pip_install(reqs) - return hooks.build_sdist(sdist_dir, config_settings) diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py b/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py deleted file mode 100644 index 281a356c..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -"""This is a subpackage because the directory is on sys.path for _in_process.py - -The subpackage should stay as empty as possible to avoid shadowing modules that -the backend might import. -""" -from contextlib import contextmanager -from os.path import abspath, dirname -from os.path import join as pjoin - -try: - import importlib.resources as resources - try: - resources.files - except AttributeError: - # Python 3.8 compatibility - def _in_proc_script_path(): - return resources.path(__package__, '_in_process.py') - else: - def _in_proc_script_path(): - return resources.as_file( - resources.files(__package__).joinpath('_in_process.py')) -except ImportError: - # Python 3.6 compatibility - @contextmanager - def _in_proc_script_path(): - yield pjoin(dirname(abspath(__file__)), '_in_process.py') diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index bbcbbdf6..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-311.pyc deleted file mode 100644 index 340a33db..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py b/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py deleted file mode 100644 index ae4cf9e9..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py +++ /dev/null @@ -1,351 +0,0 @@ -"""This is invoked in a subprocess to call the build backend hooks. - -It expects: -- Command line args: hook_name, control_dir -- Environment variables: - PEP517_BUILD_BACKEND=entry.point:spec - PEP517_BACKEND_PATH=paths (separated with os.pathsep) -- control_dir/input.json: - - {"kwargs": {...}} - -Results: -- control_dir/output.json - - {"return_val": ...} -""" -import json -import os -import os.path -import re -import shutil -import sys -import traceback -from glob import glob -from importlib import import_module -from os.path import join as pjoin - -# This file is run as a script, and `import wrappers` is not zip-safe, so we -# include write_json() and read_json() from wrappers.py. - - -def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - -def read_json(path): - with open(path, encoding='utf-8') as f: - return json.load(f) - - -class BackendUnavailable(Exception): - """Raised if we cannot import the backend""" - def __init__(self, traceback): - self.traceback = traceback - - -class BackendInvalid(Exception): - """Raised if the backend is invalid""" - def __init__(self, message): - self.message = message - - -class HookMissing(Exception): - """Raised if a hook is missing and we are not executing the fallback""" - def __init__(self, hook_name=None): - super().__init__(hook_name) - self.hook_name = hook_name - - -def contained_in(filename, directory): - """Test if a file is located within the given directory.""" - filename = os.path.normcase(os.path.abspath(filename)) - directory = os.path.normcase(os.path.abspath(directory)) - return os.path.commonprefix([filename, directory]) == directory - - -def _build_backend(): - """Find and load the build backend""" - # Add in-tree backend directories to the front of sys.path. - backend_path = os.environ.get('PEP517_BACKEND_PATH') - if backend_path: - extra_pathitems = backend_path.split(os.pathsep) - sys.path[:0] = extra_pathitems - - ep = os.environ['PEP517_BUILD_BACKEND'] - mod_path, _, obj_path = ep.partition(':') - try: - obj = import_module(mod_path) - except ImportError: - raise BackendUnavailable(traceback.format_exc()) - - if backend_path: - if not any( - contained_in(obj.__file__, path) - for path in extra_pathitems - ): - raise BackendInvalid("Backend was not loaded from backend-path") - - if obj_path: - for path_part in obj_path.split('.'): - obj = getattr(obj, path_part) - return obj - - -def _supported_features(): - """Return the list of options features supported by the backend. - - Returns a list of strings. - The only possible value is 'build_editable'. - """ - backend = _build_backend() - features = [] - if hasattr(backend, "build_editable"): - features.append("build_editable") - return features - - -def get_requires_for_build_wheel(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_wheel - except AttributeError: - return [] - else: - return hook(config_settings) - - -def get_requires_for_build_editable(config_settings): - """Invoke the optional get_requires_for_build_editable hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_editable - except AttributeError: - return [] - else: - return hook(config_settings) - - -def prepare_metadata_for_build_wheel( - metadata_directory, config_settings, _allow_fallback): - """Invoke optional prepare_metadata_for_build_wheel - - Implements a fallback by building a wheel if the hook isn't defined, - unless _allow_fallback is False in which case HookMissing is raised. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_wheel - except AttributeError: - if not _allow_fallback: - raise HookMissing() - whl_basename = backend.build_wheel(metadata_directory, config_settings) - return _get_wheel_metadata_from_wheel(whl_basename, metadata_directory, - config_settings) - else: - return hook(metadata_directory, config_settings) - - -def prepare_metadata_for_build_editable( - metadata_directory, config_settings, _allow_fallback): - """Invoke optional prepare_metadata_for_build_editable - - Implements a fallback by building an editable wheel if the hook isn't - defined, unless _allow_fallback is False in which case HookMissing is - raised. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_editable - except AttributeError: - if not _allow_fallback: - raise HookMissing() - try: - build_hook = backend.build_editable - except AttributeError: - raise HookMissing(hook_name='build_editable') - else: - whl_basename = build_hook(metadata_directory, config_settings) - return _get_wheel_metadata_from_wheel(whl_basename, - metadata_directory, - config_settings) - else: - return hook(metadata_directory, config_settings) - - -WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' - - -def _dist_info_files(whl_zip): - """Identify the .dist-info folder inside a wheel ZipFile.""" - res = [] - for path in whl_zip.namelist(): - m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) - if m: - res.append(path) - if res: - return res - raise Exception("No .dist-info folder found in wheel") - - -def _get_wheel_metadata_from_wheel( - whl_basename, metadata_directory, config_settings): - """Extract the metadata from a wheel. - - Fallback for when the build backend does not - define the 'get_wheel_metadata' hook. - """ - from zipfile import ZipFile - with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): - pass # Touch marker file - - whl_file = os.path.join(metadata_directory, whl_basename) - with ZipFile(whl_file) as zipf: - dist_info = _dist_info_files(zipf) - zipf.extractall(path=metadata_directory, members=dist_info) - return dist_info[0].split('/')[0] - - -def _find_already_built_wheel(metadata_directory): - """Check for a wheel already built during the get_wheel_metadata hook. - """ - if not metadata_directory: - return None - metadata_parent = os.path.dirname(metadata_directory) - if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): - return None - - whl_files = glob(os.path.join(metadata_parent, '*.whl')) - if not whl_files: - print('Found wheel built marker, but no .whl files') - return None - if len(whl_files) > 1: - print('Found multiple .whl files; unspecified behaviour. ' - 'Will call build_wheel.') - return None - - # Exactly one .whl file - return whl_files[0] - - -def build_wheel(wheel_directory, config_settings, metadata_directory=None): - """Invoke the mandatory build_wheel hook. - - If a wheel was already built in the - prepare_metadata_for_build_wheel fallback, this - will copy it rather than rebuilding the wheel. - """ - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return _build_backend().build_wheel(wheel_directory, config_settings, - metadata_directory) - - -def build_editable(wheel_directory, config_settings, metadata_directory=None): - """Invoke the optional build_editable hook. - - If a wheel was already built in the - prepare_metadata_for_build_editable fallback, this - will copy it rather than rebuilding the wheel. - """ - backend = _build_backend() - try: - hook = backend.build_editable - except AttributeError: - raise HookMissing() - else: - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return hook(wheel_directory, config_settings, metadata_directory) - - -def get_requires_for_build_sdist(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_sdist - except AttributeError: - return [] - else: - return hook(config_settings) - - -class _DummyException(Exception): - """Nothing should ever raise this exception""" - - -class GotUnsupportedOperation(Exception): - """For internal use when backend raises UnsupportedOperation""" - def __init__(self, traceback): - self.traceback = traceback - - -def build_sdist(sdist_directory, config_settings): - """Invoke the mandatory build_sdist hook.""" - backend = _build_backend() - try: - return backend.build_sdist(sdist_directory, config_settings) - except getattr(backend, 'UnsupportedOperation', _DummyException): - raise GotUnsupportedOperation(traceback.format_exc()) - - -HOOK_NAMES = { - 'get_requires_for_build_wheel', - 'prepare_metadata_for_build_wheel', - 'build_wheel', - 'get_requires_for_build_editable', - 'prepare_metadata_for_build_editable', - 'build_editable', - 'get_requires_for_build_sdist', - 'build_sdist', - '_supported_features', -} - - -def main(): - if len(sys.argv) < 3: - sys.exit("Needs args: hook_name, control_dir") - hook_name = sys.argv[1] - control_dir = sys.argv[2] - if hook_name not in HOOK_NAMES: - sys.exit("Unknown hook: %s" % hook_name) - hook = globals()[hook_name] - - hook_input = read_json(pjoin(control_dir, 'input.json')) - - json_out = {'unsupported': False, 'return_val': None} - try: - json_out['return_val'] = hook(**hook_input['kwargs']) - except BackendUnavailable as e: - json_out['no_backend'] = True - json_out['traceback'] = e.traceback - except BackendInvalid as e: - json_out['backend_invalid'] = True - json_out['backend_error'] = e.message - except GotUnsupportedOperation as e: - json_out['unsupported'] = True - json_out['traceback'] = e.traceback - except HookMissing as e: - json_out['hook_missing'] = True - json_out['missing_hook_name'] = e.hook_name or hook_name - - write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) - - -if __name__ == '__main__': - main() diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/meta.py b/.venv/Lib/site-packages/pip/_vendor/pep517/meta.py deleted file mode 100644 index 4afc3c04..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/meta.py +++ /dev/null @@ -1,93 +0,0 @@ -"""Build metadata for a project using PEP 517 hooks. -""" -import argparse -import functools -import logging -import os -import shutil -import tempfile - -try: - import importlib.metadata as imp_meta -except ImportError: - import importlib_metadata as imp_meta - -try: - from zipfile import Path -except ImportError: - from zipp import Path - -from .build import compat_system, load_system, validate_system -from .dirtools import dir_to_zipfile -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller, quiet_subprocess_runner - -log = logging.getLogger(__name__) - - -def _prep_meta(hooks, env, dest): - reqs = hooks.get_requires_for_build_wheel({}) - log.info('Got build requires: %s', reqs) - - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - - with tempfile.TemporaryDirectory() as td: - log.info('Trying to build metadata in %s', td) - filename = hooks.prepare_metadata_for_build_wheel(td, {}) - source = os.path.join(td, filename) - shutil.move(source, os.path.join(dest, os.path.basename(filename))) - - -def build(source_dir='.', dest=None, system=None): - system = system or load_system(source_dir) - dest = os.path.join(source_dir, dest or 'dist') - os.makedirs(dest, exist_ok=True) - validate_system(system) - hooks = Pep517HookCaller( - source_dir, system['build-backend'], system.get('backend-path') - ) - - with hooks.subprocess_runner(quiet_subprocess_runner): - with BuildEnvironment() as env: - env.pip_install(system['requires']) - _prep_meta(hooks, env, dest) - - -def build_as_zip(builder=build): - with tempfile.TemporaryDirectory() as out_dir: - builder(dest=out_dir) - return dir_to_zipfile(out_dir) - - -def load(root): - """ - Given a source directory (root) of a package, - return an importlib.metadata.Distribution object - with metadata build from that package. - """ - root = os.path.expanduser(root) - system = compat_system(root) - builder = functools.partial(build, source_dir=root, system=system) - path = Path(build_as_zip(builder)) - return imp_meta.PathDistribution(path) - - -parser = argparse.ArgumentParser() -parser.add_argument( - 'source_dir', - help="A directory containing pyproject.toml", -) -parser.add_argument( - '--out-dir', '-o', - help="Destination in which to save the builds relative to source dir", -) - - -def main(): - args = parser.parse_args() - build(args.source_dir, args.out_dir) - - -if __name__ == '__main__': - main() diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py b/.venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py deleted file mode 100644 index 987a62aa..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py +++ /dev/null @@ -1,362 +0,0 @@ -import json -import os -import sys -import tempfile -import threading -from contextlib import contextmanager -from os.path import abspath -from os.path import join as pjoin -from subprocess import STDOUT, check_call, check_output - -from .in_process import _in_proc_script_path - -__all__ = [ - 'BackendUnavailable', - 'BackendInvalid', - 'HookMissing', - 'UnsupportedOperation', - 'default_subprocess_runner', - 'quiet_subprocess_runner', - 'Pep517HookCaller', -] - - -def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - -def read_json(path): - with open(path, encoding='utf-8') as f: - return json.load(f) - - -class BackendUnavailable(Exception): - """Will be raised if the backend cannot be imported in the hook process.""" - def __init__(self, traceback): - self.traceback = traceback - - -class BackendInvalid(Exception): - """Will be raised if the backend is invalid.""" - def __init__(self, backend_name, backend_path, message): - self.backend_name = backend_name - self.backend_path = backend_path - self.message = message - - -class HookMissing(Exception): - """Will be raised on missing hooks.""" - def __init__(self, hook_name): - super().__init__(hook_name) - self.hook_name = hook_name - - -class UnsupportedOperation(Exception): - """May be raised by build_sdist if the backend indicates that it can't.""" - def __init__(self, traceback): - self.traceback = traceback - - -def default_subprocess_runner(cmd, cwd=None, extra_environ=None): - """The default method of calling the wrapper subprocess.""" - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_call(cmd, cwd=cwd, env=env) - - -def quiet_subprocess_runner(cmd, cwd=None, extra_environ=None): - """A method of calling the wrapper subprocess while suppressing output.""" - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_output(cmd, cwd=cwd, env=env, stderr=STDOUT) - - -def norm_and_check(source_tree, requested): - """Normalise and check a backend path. - - Ensure that the requested backend path is specified as a relative path, - and resolves to a location under the given source tree. - - Return an absolute version of the requested path. - """ - if os.path.isabs(requested): - raise ValueError("paths must be relative") - - abs_source = os.path.abspath(source_tree) - abs_requested = os.path.normpath(os.path.join(abs_source, requested)) - # We have to use commonprefix for Python 2.7 compatibility. So we - # normalise case to avoid problems because commonprefix is a character - # based comparison :-( - norm_source = os.path.normcase(abs_source) - norm_requested = os.path.normcase(abs_requested) - if os.path.commonprefix([norm_source, norm_requested]) != norm_source: - raise ValueError("paths must be inside source tree") - - return abs_requested - - -class Pep517HookCaller: - """A wrapper around a source directory to be built with a PEP 517 backend. - - :param source_dir: The path to the source directory, containing - pyproject.toml. - :param build_backend: The build backend spec, as per PEP 517, from - pyproject.toml. - :param backend_path: The backend path, as per PEP 517, from pyproject.toml. - :param runner: A callable that invokes the wrapper subprocess. - :param python_executable: The Python executable used to invoke the backend - - The 'runner', if provided, must expect the following: - - - cmd: a list of strings representing the command and arguments to - execute, as would be passed to e.g. 'subprocess.check_call'. - - cwd: a string representing the working directory that must be - used for the subprocess. Corresponds to the provided source_dir. - - extra_environ: a dict mapping environment variable names to values - which must be set for the subprocess execution. - """ - def __init__( - self, - source_dir, - build_backend, - backend_path=None, - runner=None, - python_executable=None, - ): - if runner is None: - runner = default_subprocess_runner - - self.source_dir = abspath(source_dir) - self.build_backend = build_backend - if backend_path: - backend_path = [ - norm_and_check(self.source_dir, p) for p in backend_path - ] - self.backend_path = backend_path - self._subprocess_runner = runner - if not python_executable: - python_executable = sys.executable - self.python_executable = python_executable - - @contextmanager - def subprocess_runner(self, runner): - """A context manager for temporarily overriding the default subprocess - runner. - """ - prev = self._subprocess_runner - self._subprocess_runner = runner - try: - yield - finally: - self._subprocess_runner = prev - - def _supported_features(self): - """Return the list of optional features supported by the backend.""" - return self._call_hook('_supported_features', {}) - - def get_requires_for_build_wheel(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.:: - - ["wheel >= 0.25", "setuptools"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_wheel', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_wheel( - self, metadata_directory, config_settings=None, - _allow_fallback=True): - """Prepare a ``*.dist-info`` folder with metadata for this project. - - Returns the name of the newly created folder. - - If the build backend defines a hook with this name, it will be called - in a subprocess. If not, the backend will be asked to build a wheel, - and the dist-info extracted from that (unless _allow_fallback is - False). - """ - return self._call_hook('prepare_metadata_for_build_wheel', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - '_allow_fallback': _allow_fallback, - }) - - def build_wheel( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build a wheel from this project. - - Returns the name of the newly created file. - - In general, this will call the 'build_wheel' hook in the backend. - However, if that was previously called by - 'prepare_metadata_for_build_wheel', and the same metadata_directory is - used, the previously built wheel will be copied to wheel_directory. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_wheel', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_editable(self, config_settings=None): - """Identify packages required for building an editable wheel - - Returns a list of dependency specifications, e.g.:: - - ["wheel >= 0.25", "setuptools"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_editable', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_editable( - self, metadata_directory, config_settings=None, - _allow_fallback=True): - """Prepare a ``*.dist-info`` folder with metadata for this project. - - Returns the name of the newly created folder. - - If the build backend defines a hook with this name, it will be called - in a subprocess. If not, the backend will be asked to build an editable - wheel, and the dist-info extracted from that (unless _allow_fallback is - False). - """ - return self._call_hook('prepare_metadata_for_build_editable', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - '_allow_fallback': _allow_fallback, - }) - - def build_editable( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build an editable wheel from this project. - - Returns the name of the newly created file. - - In general, this will call the 'build_editable' hook in the backend. - However, if that was previously called by - 'prepare_metadata_for_build_editable', and the same metadata_directory - is used, the previously built wheel will be copied to wheel_directory. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_editable', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_sdist(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.:: - - ["setuptools >= 26"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_sdist', { - 'config_settings': config_settings - }) - - def build_sdist(self, sdist_directory, config_settings=None): - """Build an sdist from this project. - - Returns the name of the newly created file. - - This calls the 'build_sdist' backend hook in a subprocess. - """ - return self._call_hook('build_sdist', { - 'sdist_directory': abspath(sdist_directory), - 'config_settings': config_settings, - }) - - def _call_hook(self, hook_name, kwargs): - extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend} - - if self.backend_path: - backend_path = os.pathsep.join(self.backend_path) - extra_environ['PEP517_BACKEND_PATH'] = backend_path - - with tempfile.TemporaryDirectory() as td: - hook_input = {'kwargs': kwargs} - write_json(hook_input, pjoin(td, 'input.json'), indent=2) - - # Run the hook in a subprocess - with _in_proc_script_path() as script: - python = self.python_executable - self._subprocess_runner( - [python, abspath(str(script)), hook_name, td], - cwd=self.source_dir, - extra_environ=extra_environ - ) - - data = read_json(pjoin(td, 'output.json')) - if data.get('unsupported'): - raise UnsupportedOperation(data.get('traceback', '')) - if data.get('no_backend'): - raise BackendUnavailable(data.get('traceback', '')) - if data.get('backend_invalid'): - raise BackendInvalid( - backend_name=self.build_backend, - backend_path=self.backend_path, - message=data.get('backend_error', '') - ) - if data.get('hook_missing'): - raise HookMissing(data.get('missing_hook_name') or hook_name) - return data['return_val'] - - -class LoggerWrapper(threading.Thread): - """ - Read messages from a pipe and redirect them - to a logger (see python's logging module). - """ - - def __init__(self, logger, level): - threading.Thread.__init__(self) - self.daemon = True - - self.logger = logger - self.level = level - - # create the pipe and reader - self.fd_read, self.fd_write = os.pipe() - self.reader = os.fdopen(self.fd_read) - - self.start() - - def fileno(self): - return self.fd_write - - @staticmethod - def remove_newline(msg): - return msg[:-1] if msg.endswith(os.linesep) else msg - - def run(self): - for line in self.reader: - self._write(self.remove_newline(line)) - - def _write(self, message): - self.logger.log(self.level, message) diff --git a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py b/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py index 4cd562cf..1bf26a94 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py @@ -1,4 +1,3 @@ -# coding: utf-8 """ Package resource API -------------------- @@ -13,9 +12,13 @@ The package resource API is designed to work with normal filesystem packages, .egg files, and unpacked .egg files. It can also work in a limited way with .zip files and with custom PEP 302 loaders that support the ``get_data()`` method. -""" -from __future__ import absolute_import +This module is deprecated. Users are directed to +`importlib.resources `_ +and +`importlib.metadata `_ +instead. +""" import sys import os @@ -37,10 +40,10 @@ import email.parser import errno import tempfile import textwrap -import itertools import inspect import ntpath import posixpath +import importlib from pkgutil import get_importer try: @@ -54,13 +57,12 @@ try: except NameError: FileExistsError = OSError -from pip._vendor import six -from pip._vendor.six.moves import urllib, map, filter - # capture these to bypass sandboxing from os import utime + try: from os import mkdir, rename, unlink + WRITE_SUPPORT = True except ImportError: # no write support, probably under GAE @@ -71,31 +73,30 @@ from os.path import isdir, split try: import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. importlib_machinery.__name__ except ImportError: importlib_machinery = None -from . import py31compat +from pip._internal.utils._jaraco_text import ( + yield_lines, + drop_comment, + join_continuation, +) + from pip._vendor import platformdirs from pip._vendor import packaging + __import__('pip._vendor.packaging.version') __import__('pip._vendor.packaging.specifiers') __import__('pip._vendor.packaging.requirements') __import__('pip._vendor.packaging.markers') +__import__('pip._vendor.packaging.utils') - -__metaclass__ = type - - -if (3, 0) < sys.version_info < (3, 5): +if sys.version_info < (3, 5): raise RuntimeError("Python 3.5 or later is required") -if six.PY2: - # Those builtin exceptions are only defined in Python 3 - PermissionError = None - NotADirectoryError = None - # declare some globals that will be defined later to # satisfy the linters. require = None @@ -117,6 +118,12 @@ _namespace_handlers = None _namespace_packages = None +warnings.warn("pkg_resources is deprecated as an API", DeprecationWarning) + + +_PEP440_FALLBACK = re.compile(r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.I) + + class PEP440Warning(RuntimeWarning): """ Used when there is an issue with a version or specifier not complying with @@ -124,11 +131,7 @@ class PEP440Warning(RuntimeWarning): """ -def parse_version(v): - try: - return packaging.version.Version(v) - except packaging.version.InvalidVersion: - return packaging.version.LegacyVersion(v) +parse_version = packaging.version.Version _state_vars = {} @@ -178,10 +181,10 @@ def get_supported_platform(): """Return this platform's maximum compatible version. distutils.util.get_platform() normally reports the minimum version - of Mac OS X that would be required to *use* extensions produced by + of macOS that would be required to *use* extensions produced by distutils. But what we want when checking compatibility is to know the - version of Mac OS X that we are *running*. To allow usage of packages that - explicitly require a newer version of Mac OS X, we must also know the + version of macOS that we are *running*. To allow usage of packages that + explicitly require a newer version of macOS, we must also know the current version of the OS. If this condition occurs for any other platform with a version in its @@ -191,60 +194,96 @@ def get_supported_platform(): m = macosVersionString.match(plat) if m is not None and sys.platform == "darwin": try: - plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + plat = 'macosx-%s-%s' % ('.'.join(_macos_vers()[:2]), m.group(3)) except ValueError: - # not Mac OS X + # not macOS pass return plat __all__ = [ # Basic resource access and distribution/entry point discovery - 'require', 'run_script', 'get_provider', 'get_distribution', - 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'require', + 'run_script', + 'get_provider', + 'get_distribution', + 'load_entry_point', + 'get_entry_map', + 'get_entry_info', 'iter_entry_points', - 'resource_string', 'resource_stream', 'resource_filename', - 'resource_listdir', 'resource_exists', 'resource_isdir', - + 'resource_string', + 'resource_stream', + 'resource_filename', + 'resource_listdir', + 'resource_exists', + 'resource_isdir', # Environmental control - 'declare_namespace', 'working_set', 'add_activation_listener', - 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'declare_namespace', + 'working_set', + 'add_activation_listener', + 'find_distributions', + 'set_extraction_path', + 'cleanup_resources', 'get_default_cache', - # Primary implementation classes - 'Environment', 'WorkingSet', 'ResourceManager', - 'Distribution', 'Requirement', 'EntryPoint', - + 'Environment', + 'WorkingSet', + 'ResourceManager', + 'Distribution', + 'Requirement', + 'EntryPoint', # Exceptions - 'ResolutionError', 'VersionConflict', 'DistributionNotFound', - 'UnknownExtra', 'ExtractionError', - + 'ResolutionError', + 'VersionConflict', + 'DistributionNotFound', + 'UnknownExtra', + 'ExtractionError', # Warnings 'PEP440Warning', - # Parsing functions and string utilities - 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', - 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', - 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', - + 'parse_requirements', + 'parse_version', + 'safe_name', + 'safe_version', + 'get_platform', + 'compatible_platforms', + 'yield_lines', + 'split_sections', + 'safe_extra', + 'to_filename', + 'invalid_marker', + 'evaluate_marker', # filesystem utilities - 'ensure_directory', 'normalize_path', - + 'ensure_directory', + 'normalize_path', # Distribution "precedence" constants - 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', - + 'EGG_DIST', + 'BINARY_DIST', + 'SOURCE_DIST', + 'CHECKOUT_DIST', + 'DEVELOP_DIST', # "Provider" interfaces, implementations, and registration/lookup APIs - 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', - 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', - 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', - 'register_finder', 'register_namespace_handler', 'register_loader_type', - 'fixup_namespace_packages', 'get_importer', - + 'IMetadataProvider', + 'IResourceProvider', + 'FileMetadata', + 'PathMetadata', + 'EggMetadata', + 'EmptyProvider', + 'empty_provider', + 'NullProvider', + 'EggProvider', + 'DefaultProvider', + 'ZipProvider', + 'register_finder', + 'register_namespace_handler', + 'register_loader_type', + 'fixup_namespace_packages', + 'get_importer', # Warnings 'PkgResourcesDeprecationWarning', - # Deprecated/backward compatibility only - 'run_main', 'AvailableDistributions', + 'run_main', + 'AvailableDistributions', ] @@ -303,8 +342,10 @@ class ContextualVersionConflict(VersionConflict): class DistributionNotFound(ResolutionError): """A requested distribution was not found""" - _template = ("The '{self.req}' distribution was not found " - "and is required by {self.requirers_str}") + _template = ( + "The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}" + ) @property def req(self): @@ -364,7 +405,7 @@ def get_provider(moduleOrReq): return _find_adapter(_provider_factories, loader)(module) -def _macosx_vers(_cache=[]): +def _macos_vers(_cache=[]): if not _cache: version = platform.mac_ver()[0] # fallback for MacPorts @@ -380,7 +421,7 @@ def _macosx_vers(_cache=[]): return _cache[0] -def _macosx_arch(machine): +def _macos_arch(machine): return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) @@ -388,18 +429,19 @@ def get_build_platform(): """Return this platform's string for platform-specific distributions XXX Currently this is the same as ``distutils.util.get_platform()``, but it - needs some hacks for Linux and Mac OS X. + needs some hacks for Linux and macOS. """ from sysconfig import get_platform plat = get_platform() if sys.platform == "darwin" and not plat.startswith('macosx-'): try: - version = _macosx_vers() + version = _macos_vers() machine = os.uname()[4].replace(" ", "_") return "macosx-%d.%d-%s" % ( - int(version[0]), int(version[1]), - _macosx_arch(machine), + int(version[0]), + int(version[1]), + _macos_arch(machine), ) except ValueError: # if someone is running a non-Mac darwin system, this will fall @@ -425,7 +467,7 @@ def compatible_platforms(provided, required): # easy case return True - # Mac OS X special cases + # macOS special cases reqMac = macosVersionString.match(required) if reqMac: provMac = macosVersionString.match(provided) @@ -434,20 +476,23 @@ def compatible_platforms(provided, required): if not provMac: # this is backwards compatibility for packages built before # setuptools 0.6. All packages built after this point will - # use the new macosx designation. + # use the new macOS designation. provDarwin = darwinVersionString.match(provided) if provDarwin: dversion = int(provDarwin.group(1)) macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) - if dversion == 7 and macosversion >= "10.3" or \ - dversion == 8 and macosversion >= "10.4": + if ( + dversion == 7 + and macosversion >= "10.3" + or dversion == 8 + and macosversion >= "10.4" + ): return True - # egg isn't macosx or legacy darwin + # egg isn't macOS or legacy darwin return False # are they the same major version and machine type? - if provMac.group(1) != reqMac.group(1) or \ - provMac.group(3) != reqMac.group(3): + if provMac.group(1) != reqMac.group(1) or provMac.group(3) != reqMac.group(3): return False # is the required OS major update >= the provided one? @@ -475,7 +520,7 @@ run_main = run_script def get_distribution(dist): """Return a current distribution object for a Requirement or string""" - if isinstance(dist, six.string_types): + if isinstance(dist, str): dist = Requirement.parse(dist) if isinstance(dist, Requirement): dist = get_provider(dist) @@ -509,8 +554,8 @@ class IMetadataProvider: def get_metadata_lines(name): """Yield named metadata resource as list of non-blank non-comment lines - Leading and trailing whitespace is stripped from each line, and lines - with ``#`` as the first non-blank character are omitted.""" + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" def metadata_isdir(name): """Is the named metadata a directory? (like ``os.path.isdir()``)""" @@ -558,6 +603,7 @@ class WorkingSet: self.entries = [] self.entry_keys = {} self.by_key = {} + self.normalized_to_canonical_keys = {} self.callbacks = [] if entries is None: @@ -638,6 +684,14 @@ class WorkingSet: is returned. """ dist = self.by_key.get(req.key) + + if dist is None: + canonical_key = self.normalized_to_canonical_keys.get(req.key) + + if canonical_key is not None: + req.key = canonical_key + dist = self.by_key.get(canonical_key) + if dist is not None and dist not in req: # XXX add more info raise VersionConflict(dist, req) @@ -706,14 +760,22 @@ class WorkingSet: return self.by_key[dist.key] = dist + normalized_name = packaging.utils.canonicalize_name(dist.key) + self.normalized_to_canonical_keys[normalized_name] = dist.key if dist.key not in keys: keys.append(dist.key) if dist.key not in keys2: keys2.append(dist.key) self._added_new(dist) - def resolve(self, requirements, env=None, installer=None, - replace_conflicting=False, extras=None): + def resolve( + self, + requirements, + env=None, + installer=None, + replace_conflicting=False, + extras=None, + ): """List all distributions needed to (recursively) meet `requirements` `requirements` must be a sequence of ``Requirement`` objects. `env`, @@ -762,33 +824,9 @@ class WorkingSet: if not req_extras.markers_pass(req, extras): continue - dist = best.get(req.key) - if dist is None: - # Find the best distribution and add it to the map - dist = self.by_key.get(req.key) - if dist is None or (dist not in req and replace_conflicting): - ws = self - if env is None: - if dist is None: - env = Environment(self.entries) - else: - # Use an empty environment and workingset to avoid - # any further conflicts with the conflicting - # distribution - env = Environment([]) - ws = WorkingSet([]) - dist = best[req.key] = env.best_match( - req, ws, installer, - replace_conflicting=replace_conflicting - ) - if dist is None: - requirers = required_by.get(req, None) - raise DistributionNotFound(req, requirers) - to_activate.append(dist) - if dist not in req: - # Oops, the "best" so far conflicts with a dependency - dependent_req = required_by[req] - raise VersionConflict(dist, req).with_context(dependent_req) + dist = self._resolve_dist( + req, best, replace_conflicting, env, installer, required_by, to_activate + ) # push the new requirements onto the stack new_requirements = dist.requires(req.extras)[::-1] @@ -804,8 +842,38 @@ class WorkingSet: # return list of distros to activate return to_activate - def find_plugins( - self, plugin_env, full_env=None, installer=None, fallback=True): + def _resolve_dist( + self, req, best, replace_conflicting, env, installer, required_by, to_activate + ): + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match( + req, ws, installer, replace_conflicting=replace_conflicting + ) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + return dist + + def find_plugins(self, plugin_env, full_env=None, installer=None, fallback=True): """Find all activatable distributions in `plugin_env` Example usage:: @@ -858,9 +926,7 @@ class WorkingSet: list(map(shadow_set.add, self)) for project_name in plugin_projects: - for dist in plugin_env[project_name]: - req = [dist.as_requirement()] try: @@ -924,15 +990,19 @@ class WorkingSet: def __getstate__(self): return ( - self.entries[:], self.entry_keys.copy(), self.by_key.copy(), - self.callbacks[:] + self.entries[:], + self.entry_keys.copy(), + self.by_key.copy(), + self.normalized_to_canonical_keys.copy(), + self.callbacks[:], ) - def __setstate__(self, e_k_b_c): - entries, keys, by_key, callbacks = e_k_b_c + def __setstate__(self, e_k_b_n_c): + entries, keys, by_key, normalized_to_canonical_keys, callbacks = e_k_b_n_c self.entries = entries[:] self.entry_keys = keys.copy() self.by_key = by_key.copy() + self.normalized_to_canonical_keys = normalized_to_canonical_keys.copy() self.callbacks = callbacks[:] @@ -960,8 +1030,8 @@ class Environment: """Searchable snapshot of distributions on a search path""" def __init__( - self, search_path=None, platform=get_supported_platform(), - python=PY_MAJOR): + self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR + ): """Snapshot distributions available on a search path Any distributions found on `search_path` are added to the environment. @@ -1028,16 +1098,14 @@ class Environment: return self._distmap.get(distribution_key, []) def add(self, dist): - """Add `dist` if we ``can_add()`` it and it has not already been added - """ + """Add `dist` if we ``can_add()`` it and it has not already been added""" if self.can_add(dist) and dist.has_version(): dists = self._distmap.setdefault(dist.key, []) if dist not in dists: dists.append(dist) dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) - def best_match( - self, req, working_set, installer=None, replace_conflicting=False): + def best_match(self, req, working_set, installer=None, replace_conflicting=False): """Find distribution best matching `req` and usable on `working_set` This calls the ``find(req)`` method of the `working_set` to see if a @@ -1124,6 +1192,7 @@ class ExtractionError(RuntimeError): class ResourceManager: """Manage resource extraction and packages""" + extraction_path = None def __init__(self): @@ -1135,9 +1204,7 @@ class ResourceManager: def resource_isdir(self, package_or_requirement, resource_name): """Is the named resource an existing directory?""" - return get_provider(package_or_requirement).resource_isdir( - resource_name - ) + return get_provider(package_or_requirement).resource_isdir(resource_name) def resource_filename(self, package_or_requirement, resource_name): """Return a true filesystem path for specified resource""" @@ -1159,9 +1226,7 @@ class ResourceManager: def resource_listdir(self, package_or_requirement, resource_name): """List the contents of the named resource directory""" - return get_provider(package_or_requirement).resource_listdir( - resource_name - ) + return get_provider(package_or_requirement).resource_listdir(resource_name) def extraction_error(self): """Give an error message for problems extracting file(s)""" @@ -1169,7 +1234,8 @@ class ResourceManager: old_exc = sys.exc_info()[1] cache_path = self.extraction_path or get_default_cache() - tmpl = textwrap.dedent(""" + tmpl = textwrap.dedent( + """ Can't extract file(s) to egg cache The following error occurred while trying to extract file(s) @@ -1184,7 +1250,8 @@ class ResourceManager: Perhaps your account does not have write access to this directory? You can change the cache directory by setting the PYTHON_EGG_CACHE environment variable to point to an accessible directory. - """).lstrip() + """ + ).lstrip() err = ExtractionError(tmpl.format(**locals())) err.manager = self err.cache_path = cache_path @@ -1234,12 +1301,13 @@ class ResourceManager: mode = os.stat(path).st_mode if mode & stat.S_IWOTH or mode & stat.S_IWGRP: msg = ( - "%s is writable by group/others and vulnerable to attack " - "when " - "used with get_resource_filename. Consider a more secure " + "Extraction path is writable by group/others " + "and vulnerable to attack when " + "used with get_resource_filename ({path}). " + "Consider a more secure " "location (set with .set_extraction_path or the " - "PYTHON_EGG_CACHE environment variable)." % path - ) + "PYTHON_EGG_CACHE environment variable)." + ).format(**locals()) warnings.warn(msg, UserWarning) def postprocess(self, tempname, filename): @@ -1282,9 +1350,7 @@ class ResourceManager: ``cleanup_resources()``.) """ if self.cached_files: - raise ValueError( - "Can't change extraction path, files already extracted" - ) + raise ValueError("Can't change extraction path, files already extracted") self.extraction_path = path @@ -1308,9 +1374,8 @@ def get_default_cache(): or a platform-relevant user cache dir for an app named "Python-Eggs". """ - return ( - os.environ.get('PYTHON_EGG_CACHE') - or platformdirs.user_cache_dir(appname='Python-Eggs') + return os.environ.get('PYTHON_EGG_CACHE') or platformdirs.user_cache_dir( + appname='Python-Eggs' ) @@ -1334,6 +1399,38 @@ def safe_version(version): return re.sub('[^A-Za-z0-9.]+', '-', version) +def _forgiving_version(version): + """Fallback when ``safe_version`` is not safe enough + >>> parse_version(_forgiving_version('0.23ubuntu1')) + + >>> parse_version(_forgiving_version('0.23-')) + + >>> parse_version(_forgiving_version('0.-_')) + + >>> parse_version(_forgiving_version('42.+?1')) + + >>> parse_version(_forgiving_version('hello world')) + + """ + version = version.replace(' ', '.') + match = _PEP440_FALLBACK.search(version) + if match: + safe = match["safe"] + rest = version[len(safe):] + else: + safe = "0" + rest = version + local = f"sanitized.{_safe_segment(rest)}".strip(".") + return f"{safe}.dev0+{local}" + + +def _safe_segment(segment): + """Convert an arbitrary string into a safe segment""" + segment = re.sub('[^A-Za-z0-9.]+', '-', segment) + segment = re.sub('-[^A-Za-z0-9]+', '-', segment) + return re.sub(r'\.[^A-Za-z0-9]+', '.', segment).strip(".-") + + def safe_extra(extra): """Convert an arbitrary string to a standard 'extra' name @@ -1377,7 +1474,7 @@ def evaluate_marker(text, extra=None): marker = packaging.markers.Marker(text) return marker.evaluate() except packaging.markers.InvalidMarker as e: - raise SyntaxError(e) + raise SyntaxError(e) from e class NullProvider: @@ -1418,8 +1515,6 @@ class NullProvider: return "" path = self._get_metadata_path(name) value = self._get(path) - if six.PY2: - return value try: return value.decode('utf-8') except UnicodeDecodeError as exc: @@ -1449,21 +1544,27 @@ class NullProvider: script = 'scripts/' + script_name if not self.has_metadata(script): raise ResolutionError( - "Script {script!r} not found in metadata at {self.egg_info!r}" - .format(**locals()), + "Script {script!r} not found in metadata at {self.egg_info!r}".format( + **locals() + ), ) script_text = self.get_metadata(script).replace('\r\n', '\n') script_text = script_text.replace('\r', '\n') script_filename = self._fn(self.egg_info, script) namespace['__file__'] = script_filename if os.path.exists(script_filename): - source = open(script_filename).read() + with open(script_filename) as fid: + source = fid.read() code = compile(source, script_filename, 'exec') exec(code, namespace, namespace) else: from linecache import cache + cache[script_filename] = ( - len(script_text), 0, script_text.split('\n'), script_filename + len(script_text), + 0, + script_text.split('\n'), + script_filename, ) script_code = compile(script_text, script_filename, 'exec') exec(script_code, namespace, namespace) @@ -1493,7 +1594,7 @@ class NullProvider: def _validate_resource_path(path): """ Validate the resource paths according to the docs. - https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access + https://setuptools.pypa.io/en/latest/pkg_resources.html#basic-resource-access >>> warned = getfixture('recwarn') >>> warnings.simplefilter('always') @@ -1543,9 +1644,9 @@ is not allowed. AttributeError: ... """ invalid = ( - os.path.pardir in path.split(posixpath.sep) or - posixpath.isabs(path) or - ntpath.isabs(path) + os.path.pardir in path.split(posixpath.sep) + or posixpath.isabs(path) + or ntpath.isabs(path) ) if not invalid: return @@ -1575,26 +1676,35 @@ is not allowed. register_loader_type(object, NullProvider) +def _parents(path): + """ + yield all parents of path including path + """ + last = None + while path != last: + yield path + last = path + path, _ = os.path.split(path) + + class EggProvider(NullProvider): """Provider based on a virtual filesystem""" def __init__(self, module): - NullProvider.__init__(self, module) + super().__init__(module) self._setup_prefix() def _setup_prefix(self): - # we assume here that our metadata may be nested inside a "basket" - # of multiple eggs; that's why we use module_path instead of .archive - path = self.module_path - old = None - while path != old: - if _is_egg_path(path): - self.egg_name = os.path.basename(path) - self.egg_info = os.path.join(path, 'EGG-INFO') - self.egg_root = path - break - old = path - path, base = os.path.split(path) + # Assume that metadata may be nested inside a "basket" + # of multiple eggs and use module_path instead of .archive. + eggs = filter(_is_egg_path, _parents(self.module_path)) + egg = next(eggs, None) + egg and self._set_egg(egg) + + def _set_egg(self, path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path class DefaultProvider(EggProvider): @@ -1618,7 +1728,10 @@ class DefaultProvider(EggProvider): @classmethod def _register(cls): - loader_names = 'SourceFileLoader', 'SourcelessFileLoader', + loader_names = ( + 'SourceFileLoader', + 'SourcelessFileLoader', + ) for name in loader_names: loader_cls = getattr(importlib_machinery, name, type(None)) register_loader_type(loader_cls, cls) @@ -1678,6 +1791,7 @@ class MemoizedZipManifests(ZipManifests): """ Memoized zipfile manifests. """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') def load(self, path): @@ -1701,7 +1815,7 @@ class ZipProvider(EggProvider): _zip_manifests = MemoizedZipManifests() def __init__(self, module): - EggProvider.__init__(self, module) + super().__init__(module) self.zip_pre = self.loader.archive + os.sep def _zipinfo_name(self, fspath): @@ -1711,20 +1825,16 @@ class ZipProvider(EggProvider): if fspath == self.loader.archive: return '' if fspath.startswith(self.zip_pre): - return fspath[len(self.zip_pre):] - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.zip_pre) - ) + return fspath[len(self.zip_pre) :] + raise AssertionError("%s is not a subpath of %s" % (fspath, self.zip_pre)) def _parts(self, zip_path): # Convert a zipfile subpath into an egg-relative path part list. # pseudo-fs path fspath = self.zip_pre + zip_path if fspath.startswith(self.egg_root + os.sep): - return fspath[len(self.egg_root) + 1:].split(os.sep) - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.egg_root) - ) + return fspath[len(self.egg_root) + 1 :].split(os.sep) + raise AssertionError("%s is not a subpath of %s" % (fspath, self.egg_root)) @property def zipinfo(self): @@ -1752,26 +1862,22 @@ class ZipProvider(EggProvider): timestamp = time.mktime(date_time) return timestamp, size - def _extract_resource(self, manager, zip_path): - + # FIXME: 'ZipProvider._extract_resource' is too complex (12) + def _extract_resource(self, manager, zip_path): # noqa: C901 if zip_path in self._index(): for name in self._index()[zip_path]: - last = self._extract_resource( - manager, os.path.join(zip_path, name) - ) + last = self._extract_resource(manager, os.path.join(zip_path, name)) # return the extracted directory name return os.path.dirname(last) timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) if not WRITE_SUPPORT: - raise IOError('"os.rename" and "os.unlink" are not supported ' - 'on this platform') - try: - - real_path = manager.get_cache_path( - self.egg_name, self._parts(zip_path) + raise IOError( + '"os.rename" and "os.unlink" are not supported ' 'on this platform' ) + try: + real_path = manager.get_cache_path(self.egg_name, self._parts(zip_path)) if self._is_current(real_path, zip_path): return real_path @@ -1900,8 +2006,7 @@ class FileMetadata(EmptyProvider): return metadata def _warn_on_replacement(self, metadata): - # Python 2.7 compat for: replacement_char = '�' - replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + replacement_char = '�' if replacement_char in metadata: tmpl = "{self.path} could not be properly decoded in UTF-8" msg = tmpl.format(**locals()) @@ -1991,7 +2096,7 @@ def find_eggs_in_zip(importer, path_item, only=False): dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) for dist in dists: yield dist - elif subitem.lower().endswith('.dist-info'): + elif subitem.lower().endswith(('.dist-info', '.egg-info')): subpath = os.path.join(path_item, subitem) submeta = EggMetadata(zipimport.zipimporter(subpath)) submeta.egg_info = subpath @@ -2008,58 +2113,21 @@ def find_nothing(importer, path_item, only=False): register_finder(object, find_nothing) -def _by_version_descending(names): - """ - Given a list of filenames, return them in descending order - by version number. - - >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' - >>> _by_version_descending(names) - ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] - """ - def _by_version(name): - """ - Parse each component of the filename - """ - name, ext = os.path.splitext(name) - parts = itertools.chain(name.split('-'), [ext]) - return [packaging.version.parse(part) for part in parts] - - return sorted(names, key=_by_version, reverse=True) - - def find_on_path(importer, path_item, only=False): """Yield distributions accessible on a sys.path directory""" path_item = _normalize_cached(path_item) if _is_unpacked_egg(path_item): yield Distribution.from_filename( - path_item, metadata=PathMetadata( - path_item, os.path.join(path_item, 'EGG-INFO') - ) + path_item, + metadata=PathMetadata(path_item, os.path.join(path_item, 'EGG-INFO')), ) return - entries = safe_listdir(path_item) - - # for performance, before sorting by version, - # screen entries for only those that will yield - # distributions - filtered = ( - entry - for entry in entries - if dist_factory(path_item, entry, only) - ) + entries = (os.path.join(path_item, child) for child in safe_listdir(path_item)) # scan for .egg and .egg-info in directory - path_item_entries = _by_version_descending(filtered) - for entry in path_item_entries: + for entry in sorted(entries): fullpath = os.path.join(path_item, entry) factory = dist_factory(path_item, entry, only) for dist in factory(fullpath): @@ -2067,19 +2135,21 @@ def find_on_path(importer, path_item, only=False): def dist_factory(path_item, entry, only): - """ - Return a dist_factory for a path_item and entry - """ + """Return a dist_factory for the given entry.""" lower = entry.lower() - is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) + is_egg_info = lower.endswith('.egg-info') + is_dist_info = lower.endswith('.dist-info') and os.path.isdir( + os.path.join(path_item, entry) + ) + is_meta = is_egg_info or is_dist_info return ( distributions_from_metadata - if is_meta else - find_distributions - if not only and _is_egg_path(entry) else - resolve_egg_link - if not only and lower.endswith('.egg-link') else - NoDists() + if is_meta + else find_distributions + if not only and _is_egg_path(entry) + else resolve_egg_link + if not only and lower.endswith('.egg-link') + else NoDists() ) @@ -2091,10 +2161,9 @@ class NoDists: >>> list(NoDists()('anything')) [] """ + def __bool__(self): return False - if six.PY2: - __nonzero__ = __bool__ def __call__(self, fullpath): return iter(()) @@ -2111,12 +2180,7 @@ def safe_listdir(path): except OSError as e: # Ignore the directory if does not exist, not a directory or # permission denied - ignorable = ( - e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) - # Python 2 on Windows needs to be handled this way :( - or getattr(e, "winerror", None) == 267 - ) - if not ignorable: + if e.errno not in (errno.ENOTDIR, errno.EACCES, errno.ENOENT): raise return () @@ -2132,7 +2196,10 @@ def distributions_from_metadata(path): metadata = FileMetadata(path) entry = os.path.basename(path) yield Distribution.from_location( - root, entry, metadata, precedence=DEVELOP_DIST, + root, + entry, + metadata, + precedence=DEVELOP_DIST, ) @@ -2154,17 +2221,16 @@ def resolve_egg_link(path): """ referenced_paths = non_empty_lines(path) resolved_paths = ( - os.path.join(os.path.dirname(path), ref) - for ref in referenced_paths + os.path.join(os.path.dirname(path), ref) for ref in referenced_paths ) dist_groups = map(find_distributions, resolved_paths) return next(dist_groups, ()) -register_finder(pkgutil.ImpImporter, find_on_path) +if hasattr(pkgutil, 'ImpImporter'): + register_finder(pkgutil.ImpImporter, find_on_path) -if hasattr(importlib_machinery, 'FileFinder'): - register_finder(importlib_machinery.FileFinder, find_on_path) +register_finder(importlib_machinery.FileFinder, find_on_path) _declare_state('dict', _namespace_handlers={}) _declare_state('dict', _namespace_packages={}) @@ -2195,10 +2261,16 @@ def _handle_ns(packageName, path_item): if importer is None: return None - # capture warnings due to #1111 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - loader = importer.find_module(packageName) + # use find_spec (PEP 451) and fall-back to find_module (PEP 302) + try: + spec = importer.find_spec(packageName) + except AttributeError: + # capture warnings due to #1111 + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + loader = importer.find_module(packageName) + else: + loader = spec.loader if spec else None if loader is None: return None @@ -2214,7 +2286,7 @@ def _handle_ns(packageName, path_item): if subpath is not None: path = module.__path__ path.append(subpath) - loader.load_module(packageName) + importlib.import_module(packageName) _rebuild_mod_path(path, packageName, module) return subpath @@ -2256,6 +2328,15 @@ def _rebuild_mod_path(orig_path, package_name, module): def declare_namespace(packageName): """Declare that package 'packageName' is a namespace package""" + msg = ( + f"Deprecated call to `pkg_resources.declare_namespace({packageName!r})`.\n" + "Implementing implicit namespace packages (as specified in PEP 420) " + "is preferred to `pkg_resources.declare_namespace`. " + "See https://setuptools.pypa.io/en/latest/references/" + "keywords.html#keyword-namespace-packages" + ) + warnings.warn(msg, DeprecationWarning, stacklevel=2) + _imp.acquire_lock() try: if packageName in _namespace_packages: @@ -2270,8 +2351,8 @@ def declare_namespace(packageName): __import__(parent) try: path = sys.modules[parent].__path__ - except AttributeError: - raise TypeError("Not a package:", parent) + except AttributeError as e: + raise TypeError("Not a package:", parent) from e # Track what packages are namespaces, so when new path items are added, # they can be updated @@ -2312,11 +2393,11 @@ def file_ns_handler(importer, path_item, packageName, module): return subpath -register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) -register_namespace_handler(zipimport.zipimporter, file_ns_handler) +if hasattr(pkgutil, 'ImpImporter'): + register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) -if hasattr(importlib_machinery, 'FileFinder'): - register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) +register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) def null_ns_handler(importer, path_item, packageName, module): @@ -2354,16 +2435,23 @@ def _is_egg_path(path): """ Determine if given path appears to be an egg. """ - return path.lower().endswith('.egg') + return _is_zip_egg(path) or _is_unpacked_egg(path) + + +def _is_zip_egg(path): + return ( + path.lower().endswith('.egg') + and os.path.isfile(path) + and zipfile.is_zipfile(path) + ) def _is_unpacked_egg(path): """ Determine if given path appears to be an unpacked egg. """ - return ( - _is_egg_path(path) and - os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) + return path.lower().endswith('.egg') and os.path.isfile( + os.path.join(path, 'EGG-INFO', 'PKG-INFO') ) @@ -2375,20 +2463,6 @@ def _set_parent_ns(packageName): setattr(sys.modules[parent], name, sys.modules[packageName]) -def yield_lines(strs): - """Yield non-empty/non-comment lines of a string or sequence""" - if isinstance(strs, six.string_types): - for s in strs.splitlines(): - s = s.strip() - # skip blank lines/comments - if s and not s.startswith('#'): - yield s - else: - for ss in strs: - for s in yield_lines(ss): - yield s - - MODULE = re.compile(r"\w+(\.\w+)*$").match EGG_NAME = re.compile( r""" @@ -2450,7 +2524,7 @@ class EntryPoint: try: return functools.reduce(getattr, self.attrs, module) except AttributeError as exc: - raise ImportError(str(exc)) + raise ImportError(str(exc)) from exc def require(self, env=None, installer=None): if self.extras and not self.dist: @@ -2536,22 +2610,15 @@ class EntryPoint: return maps -def _remove_md5_fragment(location): - if not location: - return '' - parsed = urllib.parse.urlparse(location) - if parsed[-1].startswith('md5='): - return urllib.parse.urlunparse(parsed[:-1] + ('',)) - return location - - def _version_from_file(lines): """ Given an iterable of lines from a Metadata file, return the value of the Version field, if present, or None otherwise. """ + def is_version_line(line): return line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) line = next(iter(version_lines), '') _, _, value = line.partition(':') @@ -2560,12 +2627,19 @@ def _version_from_file(lines): class Distribution: """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' def __init__( - self, location=None, metadata=None, project_name=None, - version=None, py_version=PY_MAJOR, platform=None, - precedence=EGG_DIST): + self, + location=None, + metadata=None, + project_name=None, + version=None, + py_version=PY_MAJOR, + platform=None, + precedence=EGG_DIST, + ): self.project_name = safe_name(project_name or 'Unknown') if version is not None: self._version = safe_version(version) @@ -2588,8 +2662,13 @@ class Distribution: 'name', 'ver', 'pyver', 'plat' ) return cls( - location, metadata, project_name=project_name, version=version, - py_version=py_version, platform=platform, **kw + location, + metadata, + project_name=project_name, + version=version, + py_version=py_version, + platform=platform, + **kw, )._reload_version() def _reload_version(self): @@ -2598,10 +2677,10 @@ class Distribution: @property def hashcmp(self): return ( - self.parsed_version, + self._forgiving_parsed_version, self.precedence, self.key, - _remove_md5_fragment(self.location), + self.location, self.py_version or '', self.platform or '', ) @@ -2645,48 +2724,55 @@ class Distribution: @property def parsed_version(self): if not hasattr(self, "_parsed_version"): - self._parsed_version = parse_version(self.version) + try: + self._parsed_version = parse_version(self.version) + except packaging.version.InvalidVersion as ex: + info = f"(package: {self.project_name})" + if hasattr(ex, "add_note"): + ex.add_note(info) # PEP 678 + raise + raise packaging.version.InvalidVersion(f"{str(ex)} {info}") from None return self._parsed_version - def _warn_legacy_version(self): - LV = packaging.version.LegacyVersion - is_legacy = isinstance(self._parsed_version, LV) - if not is_legacy: - return + @property + def _forgiving_parsed_version(self): + try: + return self.parsed_version + except packaging.version.InvalidVersion as ex: + self._parsed_version = parse_version(_forgiving_version(self.version)) - # While an empty version is technically a legacy version and - # is not a valid PEP 440 version, it's also unlikely to - # actually come from someone and instead it is more likely that - # it comes from setuptools attempting to parse a filename and - # including it in the list. So for that we'll gate this warning - # on if the version is anything at all or not. - if not self.version: - return + notes = "\n".join(getattr(ex, "__notes__", [])) # PEP 678 + msg = f"""!!\n\n + ************************************************************************* + {str(ex)}\n{notes} - tmpl = textwrap.dedent(""" - '{project_name} ({version})' is being parsed as a legacy, - non PEP 440, - version. You may find odd behavior and sort order. - In particular it will be sorted as less than 0.0. It - is recommended to migrate to PEP 440 compatible - versions. - """).strip().replace('\n', ' ') + This is a long overdue deprecation. + For the time being, `pkg_resources` will use `{self._parsed_version}` + as a replacement to avoid breaking existing environments, + but no future compatibility is guaranteed. - warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + If you maintain package {self.project_name} you should implement + the relevant changes to adequate the project to PEP 440 immediately. + ************************************************************************* + \n\n!! + """ + warnings.warn(msg, DeprecationWarning) + + return self._parsed_version @property def version(self): try: return self._version - except AttributeError: + except AttributeError as e: version = self._get_version() if version is None: path = self._get_metadata_path_for_display(self.PKG_INFO) - msg = ( - "Missing 'Version:' header and/or {} file at path: {}" - ).format(self.PKG_INFO, path) - raise ValueError(msg, self) + msg = ("Missing 'Version:' header and/or {} file at path: {}").format( + self.PKG_INFO, path + ) + raise ValueError(msg, self) from e return version @@ -2714,8 +2800,7 @@ class Distribution: reqs = dm.pop(extra) new_extra, _, marker = extra.partition(':') fails_marker = marker and ( - invalid_marker(marker) - or not evaluate_marker(marker) + invalid_marker(marker) or not evaluate_marker(marker) ) if fails_marker: reqs = [] @@ -2739,10 +2824,10 @@ class Distribution: for ext in extras: try: deps.extend(dm[safe_extra(ext)]) - except KeyError: + except KeyError as e: raise UnknownExtra( "%s has no such extra feature %r" % (self, ext) - ) + ) from e return deps def _get_metadata_path_for_display(self, name): @@ -2787,8 +2872,9 @@ class Distribution: def egg_name(self): """Return what this distribution's standard .egg filename should be""" filename = "%s-%s-py%s" % ( - to_filename(self.project_name), to_filename(self.version), - self.py_version or PY_MAJOR + to_filename(self.project_name), + to_filename(self.version), + self.py_version or PY_MAJOR, ) if self.platform: @@ -2818,21 +2904,13 @@ class Distribution: def __dir__(self): return list( set(super(Distribution, self).__dir__()) - | set( - attr for attr in self._provider.__dir__() - if not attr.startswith('_') - ) + | set(attr for attr in self._provider.__dir__() if not attr.startswith('_')) ) - if not hasattr(object, '__dir__'): - # python 2.7 not supported - del __dir__ - @classmethod def from_filename(cls, filename, metadata=None, **kw): return cls.from_location( - _normalize_cached(filename), os.path.basename(filename), metadata, - **kw + _normalize_cached(filename), os.path.basename(filename), metadata, **kw ) def as_requirement(self): @@ -2867,7 +2945,8 @@ class Distribution: """Return the EntryPoint object for `group`+`name`, or ``None``""" return self.get_entry_map(group).get(name) - def insert_on(self, path, loc=None, replace=False): + # FIXME: 'Distribution.insert_on' is too complex (13) + def insert_on(self, path, loc=None, replace=False): # noqa: C901 """Ensure self.location is on path If replace=False (default): @@ -2943,14 +3022,18 @@ class Distribution: nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) loc = normalize_path(self.location) for modname in self._get_metadata('top_level.txt'): - if (modname not in sys.modules or modname in nsp - or modname in _namespace_packages): + if ( + modname not in sys.modules + or modname in nsp + or modname in _namespace_packages + ): continue if modname in ('pkg_resources', 'setuptools', 'site'): continue fn = getattr(sys.modules[modname], '__file__', None) - if fn and (normalize_path(fn).startswith(loc) or - fn.startswith(self.location)): + if fn and ( + normalize_path(fn).startswith(loc) or fn.startswith(self.location) + ): continue issue_warning( "Module %s was already imported from %s, but %s is being added" @@ -2963,6 +3046,9 @@ class Distribution: except ValueError: issue_warning("Unbuilt egg for " + repr(self)) return False + except SystemError: + # TODO: remove this except clause when python/cpython#103632 is fixed. + return False return True def clone(self, **kw): @@ -3002,6 +3088,7 @@ class DistInfoDistribution(Distribution): Wrap an actual or potential sys.path entry w/metadata, .dist-info style. """ + PKG_INFO = 'METADATA' EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") @@ -3037,12 +3124,12 @@ class DistInfoDistribution(Distribution): if not req.marker or req.marker.evaluate({'extra': extra}): yield req - common = frozenset(reqs_for_extra(None)) + common = types.MappingProxyType(dict.fromkeys(reqs_for_extra(None))) dm[None].extend(common) for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: s_extra = safe_extra(extra.strip()) - dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + dm[s_extra] = [r for r in reqs_for_extra(extra) if r not in common] return dm @@ -3067,45 +3154,27 @@ def issue_warning(*args, **kw): warnings.warn(stacklevel=level + 1, *args, **kw) -class RequirementParseError(ValueError): - def __str__(self): - return ' '.join(self.args) - - def parse_requirements(strs): - """Yield ``Requirement`` objects for each specification in `strs` + """ + Yield ``Requirement`` objects for each specification in `strs`. `strs` must be a string, or a (possibly-nested) iterable thereof. """ - # create a steppable iterator, so we can handle \-continuations - lines = iter(yield_lines(strs)) + return map(Requirement, join_continuation(map(drop_comment, yield_lines(strs)))) - for line in lines: - # Drop comments -- a hash without a space may be in a URL. - if ' #' in line: - line = line[:line.find(' #')] - # If there is a line continuation, drop it, and append the next line. - if line.endswith('\\'): - line = line[:-2].strip() - try: - line += next(lines) - except StopIteration: - return - yield Requirement(line) + +class RequirementParseError(packaging.requirements.InvalidRequirement): + "Compatibility wrapper for InvalidRequirement" class Requirement(packaging.requirements.Requirement): def __init__(self, requirement_string): """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - try: - super(Requirement, self).__init__(requirement_string) - except packaging.requirements.InvalidRequirement as e: - raise RequirementParseError(str(e)) + super(Requirement, self).__init__(requirement_string) self.unsafe_name = self.name project_name = safe_name(self.name) self.project_name, self.key = project_name, project_name.lower() - self.specs = [ - (spec.operator, spec.version) for spec in self.specifier] + self.specs = [(spec.operator, spec.version) for spec in self.specifier] self.extras = tuple(map(safe_extra, self.extras)) self.hashCmp = ( self.key, @@ -3117,10 +3186,7 @@ class Requirement(packaging.requirements.Requirement): self.__hash = hash(self.hashCmp) def __eq__(self, other): - return ( - isinstance(other, Requirement) and - self.hashCmp == other.hashCmp - ) + return isinstance(other, Requirement) and self.hashCmp == other.hashCmp def __ne__(self, other): return not self == other @@ -3145,7 +3211,7 @@ class Requirement(packaging.requirements.Requirement): @staticmethod def parse(s): - req, = parse_requirements(s) + (req,) = parse_requirements(s) return req @@ -3170,7 +3236,7 @@ def _find_adapter(registry, ob): def ensure_directory(path): """Ensure that the parent directory of `path` exists""" dirname = os.path.dirname(path) - py31compat.makedirs(dirname, exist_ok=True) + os.makedirs(dirname, exist_ok=True) def _bypass_ensure_directory(path): @@ -3248,6 +3314,15 @@ def _initialize(g=globals()): ) +class PkgResourcesDeprecationWarning(Warning): + """ + Base class for warning about deprecations in ``pkg_resources`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ + + @_call_aside def _initialize_master_working_set(): """ @@ -3274,10 +3349,7 @@ def _initialize_master_working_set(): # ensure that all distributions added to the working set in the future # (e.g. by calling ``require()``) will get activated as well, # with higher priority (replace=True). - tuple( - dist.activate(replace=False) - for dist in working_set - ) + tuple(dist.activate(replace=False) for dist in working_set) add_activation_listener( lambda dist: dist.activate(replace=True), existing=False, @@ -3286,11 +3358,3 @@ def _initialize_master_working_set(): # match order list(map(working_set.add_entry, sys.path)) globals().update(locals()) - -class PkgResourcesDeprecationWarning(Warning): - """ - Base class for warning about deprecations in ``pkg_resources`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ diff --git a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc index 1c09e2c8..3ebb9d8b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-311.pyc deleted file mode 100644 index d26934ed..00000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py b/.venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py deleted file mode 100644 index a2d3007c..00000000 --- a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import errno -import sys - -from pip._vendor import six - - -def _makedirs_31(path, exist_ok=False): - try: - os.makedirs(path) - except OSError as exc: - if not exist_ok or exc.errno != errno.EEXIST: - raise - - -# rely on compatibility behavior until mode considerations -# and exists_ok considerations are disentangled. -# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 -needs_makedirs = ( - six.PY2 or - (3, 4) <= sys.version_info < (3, 4, 1) -) -makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py index 9d513dcf..c46a145c 100644 --- a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py @@ -7,13 +7,15 @@ from __future__ import annotations import os import sys from pathlib import Path -from typing import TYPE_CHECKING -if TYPE_CHECKING: - from pip._vendor.typing_extensions import Literal # pragma: no cover +if sys.version_info >= (3, 8): # pragma: no cover (py38+) + from typing import Literal +else: # pragma: no cover (py38+) + from pip._vendor.typing_extensions import Literal from .api import PlatformDirsABC -from .version import __version__, __version_info__ +from .version import __version__ +from .version import __version_tuple__ as __version_info__ def _set_platform_dir_class() -> type[PlatformDirsABC]: @@ -25,8 +27,7 @@ def _set_platform_dir_class() -> type[PlatformDirsABC]: from pip._vendor.platformdirs.unix import Unix as Result if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system": - - if os.getenv("SHELL") is not None: + if os.getenv("SHELL") or os.getenv("PREFIX"): return Result from pip._vendor.platformdirs.android import _android_folder @@ -48,15 +49,23 @@ def user_data_dir( appauthor: str | None | Literal[False] = None, version: str | None = None, roaming: bool = False, + ensure_exists: bool = False, ) -> str: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. - :param roaming: See `roaming `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: data directory tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_data_dir + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_data_dir def site_data_dir( @@ -64,15 +73,23 @@ def site_data_dir( appauthor: str | None | Literal[False] = None, version: str | None = None, multipath: bool = False, + ensure_exists: bool = False, ) -> str: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param multipath: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: data directory shared by users """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, multipath=multipath).site_data_dir + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + multipath=multipath, + ensure_exists=ensure_exists, + ).site_data_dir def user_config_dir( @@ -80,15 +97,23 @@ def user_config_dir( appauthor: str | None | Literal[False] = None, version: str | None = None, roaming: bool = False, + ensure_exists: bool = False, ) -> str: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. - :param roaming: See `roaming `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: config directory tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_config_dir + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_config_dir def site_config_dir( @@ -96,15 +121,23 @@ def site_config_dir( appauthor: str | None | Literal[False] = None, version: str | None = None, multipath: bool = False, + ensure_exists: bool = False, ) -> str: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param multipath: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: config directory shared by the users """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, multipath=multipath).site_config_dir + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + multipath=multipath, + ensure_exists=ensure_exists, + ).site_config_dir def user_cache_dir( @@ -112,15 +145,47 @@ def user_cache_dir( appauthor: str | None | Literal[False] = None, version: str | None = None, opinion: bool = True, + ensure_exists: bool = False, ) -> str: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param opinion: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: cache directory tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_cache_dir + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_cache_dir + + +def site_cache_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, + ensure_exists: bool = False, +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. + :returns: cache directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).site_cache_dir def user_state_dir( @@ -128,15 +193,23 @@ def user_state_dir( appauthor: str | None | Literal[False] = None, version: str | None = None, roaming: bool = False, + ensure_exists: bool = False, ) -> str: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. - :param roaming: See `roaming `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: state directory tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_state_dir + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_state_dir def user_log_dir( @@ -144,15 +217,23 @@ def user_log_dir( appauthor: str | None | Literal[False] = None, version: str | None = None, opinion: bool = True, + ensure_exists: bool = False, ) -> str: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param opinion: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: log directory tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_log_dir + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_log_dir def user_documents_dir() -> str: @@ -167,15 +248,23 @@ def user_runtime_dir( appauthor: str | None | Literal[False] = None, version: str | None = None, opinion: bool = True, + ensure_exists: bool = False, ) -> str: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. :returns: runtime directory tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_runtime_dir + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_runtime_dir def user_data_path( @@ -183,15 +272,23 @@ def user_data_path( appauthor: str | None | Literal[False] = None, version: str | None = None, roaming: bool = False, + ensure_exists: bool = False, ) -> Path: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. - :param roaming: See `roaming `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: data path tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_data_path + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_data_path def site_data_path( @@ -199,15 +296,23 @@ def site_data_path( appauthor: str | None | Literal[False] = None, version: str | None = None, multipath: bool = False, + ensure_exists: bool = False, ) -> Path: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param multipath: See `multipath `. + :param ensure_exists: See `ensure_exists `. :returns: data path shared by users """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, multipath=multipath).site_data_path + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + multipath=multipath, + ensure_exists=ensure_exists, + ).site_data_path def user_config_path( @@ -215,15 +320,23 @@ def user_config_path( appauthor: str | None | Literal[False] = None, version: str | None = None, roaming: bool = False, + ensure_exists: bool = False, ) -> Path: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. - :param roaming: See `roaming `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: config path tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_config_path + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_config_path def site_config_path( @@ -231,15 +344,47 @@ def site_config_path( appauthor: str | None | Literal[False] = None, version: str | None = None, multipath: bool = False, + ensure_exists: bool = False, ) -> Path: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param multipath: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: config path shared by the users """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, multipath=multipath).site_config_path + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + multipath=multipath, + ensure_exists=ensure_exists, + ).site_config_path + + +def site_cache_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, + ensure_exists: bool = False, +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. + :returns: cache directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).site_cache_path def user_cache_path( @@ -247,15 +392,23 @@ def user_cache_path( appauthor: str | None | Literal[False] = None, version: str | None = None, opinion: bool = True, + ensure_exists: bool = False, ) -> Path: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param opinion: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: cache path tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_cache_path + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_cache_path def user_state_path( @@ -263,15 +416,23 @@ def user_state_path( appauthor: str | None | Literal[False] = None, version: str | None = None, roaming: bool = False, + ensure_exists: bool = False, ) -> Path: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. - :param roaming: See `roaming `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: state path tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_state_path + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_state_path def user_log_path( @@ -279,15 +440,23 @@ def user_log_path( appauthor: str | None | Literal[False] = None, version: str | None = None, opinion: bool = True, + ensure_exists: bool = False, ) -> Path: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param opinion: See `roaming `. + :param ensure_exists: See `ensure_exists `. :returns: log path tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_log_path + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_log_path def user_documents_path() -> Path: @@ -302,15 +471,23 @@ def user_runtime_path( appauthor: str | None | Literal[False] = None, version: str | None = None, opinion: bool = True, + ensure_exists: bool = False, ) -> Path: """ :param appname: See `appname `. :param appauthor: See `appauthor `. :param version: See `version `. :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. :returns: runtime path tied to the user """ - return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_runtime_path + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_runtime_path __all__ = [ @@ -328,6 +505,7 @@ __all__ = [ "user_runtime_dir", "site_data_dir", "site_config_dir", + "site_cache_dir", "user_data_path", "user_config_path", "user_cache_path", @@ -337,4 +515,5 @@ __all__ = [ "user_runtime_path", "site_data_path", "site_config_path", + "site_cache_path", ] diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py index 9c54bfb4..7171f131 100644 --- a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +++ b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py @@ -12,6 +12,7 @@ PROPS = ( "user_runtime_dir", "site_data_dir", "site_config_dir", + "site_cache_dir", ) diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc index 2452709f..f9fcd6dc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc index 6fcb2396..0a7eb3d4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc index f137f7d7..b4916b26 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc index df6fc9e0..ee3fde73 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc index da4857ec..abc0c603 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc index 2e34cb5b..9a1c5d6b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc index 63bbaf4d..d3d73e96 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc index 4ffe642a..5d07f116 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/android.py b/.venv/Lib/site-packages/pip/_vendor/platformdirs/android.py index eda80935..f6de7451 100644 --- a/.venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +++ b/.venv/Lib/site-packages/pip/_vendor/platformdirs/android.py @@ -12,8 +12,9 @@ from .api import PlatformDirsABC class Android(PlatformDirsABC): """ Follows the guidance `from here `_. Makes use of the - `appname ` and - `version `. + `appname `, + `version `, + `ensure_exists `. """ @property @@ -43,6 +44,11 @@ class Android(PlatformDirsABC): """:return: cache directory tied to the user, e.g. e.g. ``/data/user///cache/``""" return self._append_app_name_and_version(cast(str, _android_folder()), "cache") + @property + def site_cache_dir(self) -> str: + """:return: cache directory shared by users, same as `user_cache_dir`""" + return self.user_cache_dir + @property def user_state_dir(self) -> str: """:return: state directory tied to the user, same as `user_data_dir`""" diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/api.py b/.venv/Lib/site-packages/pip/_vendor/platformdirs/api.py index 6f6e2c2c..f140e8b6 100644 --- a/.venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +++ b/.venv/Lib/site-packages/pip/_vendor/platformdirs/api.py @@ -22,6 +22,7 @@ class PlatformDirsABC(ABC): roaming: bool = False, multipath: bool = False, opinion: bool = True, + ensure_exists: bool = False, ): """ Create a new platform directory. @@ -32,6 +33,7 @@ class PlatformDirsABC(ABC): :param roaming: See `roaming`. :param multipath: See `multipath`. :param opinion: See `opinion`. + :param ensure_exists: See `ensure_exists`. """ self.appname = appname #: The name of application. self.appauthor = appauthor @@ -56,6 +58,11 @@ class PlatformDirsABC(ABC): returned. By default, the first item would only be returned. """ self.opinion = opinion #: A flag to indicating to use opinionated values. + self.ensure_exists = ensure_exists + """ + Optionally create the directory (and any missing parents) upon access if it does not exist. + By default, no directories are created. + """ def _append_app_name_and_version(self, *base: str) -> str: params = list(base[1:]) @@ -63,7 +70,13 @@ class PlatformDirsABC(ABC): params.append(self.appname) if self.version: params.append(self.version) - return os.path.join(base[0], *params) + path = os.path.join(base[0], *params) + self._optionally_create_directory(path) + return path + + def _optionally_create_directory(self, path: str) -> None: + if self.ensure_exists: + Path(path).mkdir(parents=True, exist_ok=True) @property @abstractmethod @@ -90,6 +103,11 @@ class PlatformDirsABC(ABC): def user_cache_dir(self) -> str: """:return: cache directory tied to the user""" + @property + @abstractmethod + def site_cache_dir(self) -> str: + """:return: cache directory shared by users""" + @property @abstractmethod def user_state_dir(self) -> str: @@ -135,6 +153,11 @@ class PlatformDirsABC(ABC): """:return: cache path tied to the user""" return Path(self.user_cache_dir) + @property + def site_cache_path(self) -> Path: + """:return: cache path shared by users""" + return Path(self.site_cache_dir) + @property def user_state_path(self) -> Path: """:return: state path tied to the user""" diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py b/.venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py index a01337c7..ec975112 100644 --- a/.venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +++ b/.venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py @@ -9,14 +9,15 @@ class MacOS(PlatformDirsABC): """ Platform directories for the macOS operating system. Follows the guidance from `Apple documentation `_. - Makes use of the `appname ` and - `version `. + Makes use of the `appname `, + `version `, + `ensure_exists `. """ @property def user_data_dir(self) -> str: """:return: data directory tied to the user, e.g. ``~/Library/Application Support/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Application Support/")) + return self._append_app_name_and_version(os.path.expanduser("~/Library/Application Support")) @property def site_data_dir(self) -> str: @@ -25,19 +26,24 @@ class MacOS(PlatformDirsABC): @property def user_config_dir(self) -> str: - """:return: config directory tied to the user, e.g. ``~/Library/Preferences/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Preferences/")) + """:return: config directory tied to the user, same as `user_data_dir`""" + return self.user_data_dir @property def site_config_dir(self) -> str: - """:return: config directory shared by the users, e.g. ``/Library/Preferences/$appname``""" - return self._append_app_name_and_version("/Library/Preferences") + """:return: config directory shared by the users, same as `site_data_dir`""" + return self.site_data_dir @property def user_cache_dir(self) -> str: """:return: cache directory tied to the user, e.g. ``~/Library/Caches/$appname/$version``""" return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches")) + @property + def site_cache_dir(self) -> str: + """:return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``""" + return self._append_app_name_and_version("/Library/Caches") + @property def user_state_dir(self) -> str: """:return: state directory tied to the user, same as `user_data_dir`""" diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py b/.venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py index 2fbd4d4f..17d355da 100644 --- a/.venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +++ b/.venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py @@ -24,7 +24,8 @@ class Unix(PlatformDirsABC): `appname `, `version `, `multipath `, - `opinion `. + `opinion `, + `ensure_exists `. """ @property @@ -93,6 +94,13 @@ class Unix(PlatformDirsABC): path = os.path.expanduser("~/.cache") return self._append_app_name_and_version(path) + @property + def site_cache_dir(self) -> str: + """ + :return: cache directory shared by users, e.g. ``/var/tmp/$appname/$version`` + """ + return self._append_app_name_and_version("/var/tmp") + @property def user_state_dir(self) -> str: """ @@ -107,9 +115,9 @@ class Unix(PlatformDirsABC): @property def user_log_dir(self) -> str: """ - :return: log directory tied to the user, same as `user_data_dir` if not opinionated else ``log`` in it + :return: log directory tied to the user, same as `user_state_dir` if not opinionated else ``log`` in it """ - path = self.user_cache_dir + path = self.user_state_dir if self.opinion: path = os.path.join(path, "log") return path @@ -148,6 +156,11 @@ class Unix(PlatformDirsABC): """:return: config path shared by the users. Only return first item, even if ``multipath`` is set to ``True``""" return self._first_item_as_path_if_multipath(self.site_config_dir) + @property + def site_cache_path(self) -> Path: + """:return: cache path shared by users. Only return first item, even if ``multipath`` is set to ``True``""" + return self._first_item_as_path_if_multipath(self.site_cache_dir) + def _first_item_as_path_if_multipath(self, directory: str) -> Path: if self.multipath: # If multipath is True, the first path is returned. diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/version.py b/.venv/Lib/site-packages/pip/_vendor/platformdirs/version.py index 4552c02a..d906a2c9 100644 --- a/.venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +++ b/.venv/Lib/site-packages/pip/_vendor/platformdirs/version.py @@ -1,4 +1,4 @@ -"""Version information""" - -__version__ = "2.5.2" -__version_info__ = (2, 5, 2) +# file generated by setuptools_scm +# don't change, don't track in version control +__version__ = version = '3.2.0' +__version_tuple__ = version_tuple = (3, 2, 0) diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py b/.venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py index ef972bdf..e7573c3d 100644 --- a/.venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +++ b/.venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py @@ -2,6 +2,7 @@ from __future__ import annotations import ctypes import os +import sys from functools import lru_cache from typing import Callable @@ -16,7 +17,9 @@ class Windows(PlatformDirsABC): `appauthor `, `version `, `roaming `, - `opinion `.""" + `opinion `, + `ensure_exists `. + """ @property def user_data_dir(self) -> str: @@ -40,7 +43,9 @@ class Windows(PlatformDirsABC): params.append(opinion_value) if self.version: params.append(self.version) - return os.path.join(path, *params) + path = os.path.join(path, *params) + self._optionally_create_directory(path) + return path @property def site_data_dir(self) -> str: @@ -67,6 +72,12 @@ class Windows(PlatformDirsABC): path = os.path.normpath(get_win_folder("CSIDL_LOCAL_APPDATA")) return self._append_parts(path, opinion_value="Cache") + @property + def site_cache_dir(self) -> str: + """:return: cache directory shared by users, e.g. ``C:\\ProgramData\\$appauthor\\$appname\\Cache\\$version``""" + path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA")) + return self._append_parts(path, opinion_value="Cache") + @property def user_state_dir(self) -> str: """:return: state directory tied to the user, same as `user_data_dir`""" @@ -80,6 +91,7 @@ class Windows(PlatformDirsABC): path = self.user_data_dir if self.opinion: path = os.path.join(path, "Logs") + self._optionally_create_directory(path) return path @property @@ -132,7 +144,8 @@ def get_win_folder_from_registry(csidl_name: str) -> str: }.get(csidl_name) if shell_folder_name is None: raise ValueError(f"Unknown CSIDL name: {csidl_name}") - + if sys.platform != "win32": # only needed for mypy type checker to know that this code runs only on Windows + raise NotImplementedError import winreg key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__init__.py b/.venv/Lib/site-packages/pip/_vendor/pygments/__init__.py index 7185e537..d9b0a8de 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/pygments/__init__.py @@ -26,7 +26,7 @@ """ from io import StringIO, BytesIO -__version__ = '2.13.0' +__version__ = '2.14.0' __docformat__ = 'restructuredtext' __all__ = ['lex', 'format', 'highlight'] diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc index 5a67d67d..1d0d4054 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc index 50e268a1..6d1aa9e9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc index 917b130b..fa39404f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc index 3bf8f9a2..f8f0c29c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc index 920f363b..0b5bd83e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc index ddbb8b14..c2c6e996 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc index 797b2297..b381fa27 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc index 032b4eeb..f4b32114 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc index 9881ced2..63989ebb 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc index da1c33ec..86a02e33 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc index 76fb7a44..a7fdd874 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc index 671fdf2c..0c3d83e0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc index 522c6ced..97b95b12 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc index a47e2bbb..6f54d7ec 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc index bbbfaf90..43a3c0e4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc index 5d9cd6b6..b1181673 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc index b2a8b679..afb73d40 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py index 43c4c89a..7ecf7eee 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py @@ -8,7 +8,6 @@ :license: BSD, see LICENSE for details. """ -import re import sys import types from fnmatch import fnmatch diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc index a26f2651..8257bf71 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc index be6665c5..5bab5afe 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc index 15bab5dc..95f5646d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc index 1eeced39..7c0a19da 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc index eb90298c..a6271e3f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc index 507e71ab..e0d93559 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc index 8903a4be..219a0cd4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc index a89e0dd3..21492236 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc index 324dc789..aa32e0f0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc index 34dadeeb..e41b8ad9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc index 8331496e..f43f8601 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc index f85ca2c6..41e8fb98 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc index 4883c028..807f05e5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc index 4b7b4b24..5b3a65a8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py index d5cda4c4..f22b200c 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py +++ b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py @@ -878,10 +878,12 @@ class HtmlFormatter(Formatter): # for all but the last line for part in parts[:-1]: if line: - if lspan != cspan: + # Also check for part being non-empty, so we avoid creating + # empty tags + if lspan != cspan and part: line.extend(((lspan and ''), cspan, part, (cspan and ''), lsep)) - else: # both are the same + else: # both are the same, or the current part was empty line.extend((part, (lspan and ''), lsep)) yield 1, ''.join(line) line = [] diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py index 3f6d52de..53e19b83 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py +++ b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py @@ -128,38 +128,12 @@ class IRCFormatter(Formatter): self._lineno = 0 def _write_lineno(self, outfile): - self._lineno += 1 - outfile.write("\n%04d: " % self._lineno) - - def _format_unencoded_with_lineno(self, tokensource, outfile): - self._write_lineno(outfile) - - for ttype, value in tokensource: - if value.endswith("\n"): - self._write_lineno(outfile) - value = value[:-1] - color = self.colorscheme.get(ttype) - while color is None: - ttype = ttype.parent - color = self.colorscheme.get(ttype) - if color: - color = color[self.darkbg] - spl = value.split('\n') - for line in spl[:-1]: - self._write_lineno(outfile) - if line: - outfile.write(ircformat(color, line[:-1])) - if spl[-1]: - outfile.write(ircformat(color, spl[-1])) - else: - outfile.write(value) - - outfile.write("\n") + if self.linenos: + self._lineno += 1 + outfile.write("%04d: " % self._lineno) def format_unencoded(self, tokensource, outfile): - if self.linenos: - self._format_unencoded_with_lineno(tokensource, outfile) - return + self._write_lineno(outfile) for ttype, value in tokensource: color = self.colorscheme.get(ttype) @@ -173,6 +147,7 @@ class IRCFormatter(Formatter): if line: outfile.write(ircformat(color, line)) outfile.write('\n') + self._write_lineno(outfile) if spl[-1]: outfile.write(ircformat(color, spl[-1])) else: diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexer.py b/.venv/Lib/site-packages/pip/_vendor/pygments/lexer.py index ec7f4de3..74ab9b90 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +++ b/.venv/Lib/site-packages/pip/_vendor/pygments/lexer.py @@ -14,15 +14,16 @@ import time from pip._vendor.pygments.filter import apply_filters, Filter from pip._vendor.pygments.filters import get_filter_by_name -from pip._vendor.pygments.token import Error, Text, Other, _TokenType +from pip._vendor.pygments.token import Error, Text, Other, Whitespace, _TokenType from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt, \ make_analysator, Future, guess_decode from pip._vendor.pygments.regexopt import regex_opt __all__ = ['Lexer', 'RegexLexer', 'ExtendedRegexLexer', 'DelegatingLexer', 'LexerContext', 'include', 'inherit', 'bygroups', 'using', 'this', - 'default', 'words'] + 'default', 'words', 'line_re'] +line_re = re.compile('.*?\n') _encoding_map = [(b'\xef\xbb\xbf', 'utf-8'), (b'\xff\xfe\0\0', 'utf-32'), @@ -670,7 +671,7 @@ class RegexLexer(Lexer, metaclass=RegexLexerMeta): # at EOL, reset state to "root" statestack = ['root'] statetokens = tokendefs['root'] - yield pos, Text, '\n' + yield pos, Whitespace, '\n' pos += 1 continue yield pos, Error, text[pos] diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py index ed69f24e..e75a0579 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py @@ -8,7 +8,6 @@ :license: BSD, see LICENSE for details. """ -import re import sys import types from fnmatch import fnmatch diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc index 807ae72d..f507ec84 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc index 9c22cf8a..0de040e6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc index 155a8f44..02ab60b9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py index 40dcaa3c..1eaaf56e 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +++ b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py @@ -30,6 +30,7 @@ LEXERS = { 'AppleScriptLexer': ('pip._vendor.pygments.lexers.scripting', 'AppleScript', ('applescript',), ('*.applescript',), ()), 'ArduinoLexer': ('pip._vendor.pygments.lexers.c_like', 'Arduino', ('arduino',), ('*.ino',), ('text/x-arduino',)), 'ArrowLexer': ('pip._vendor.pygments.lexers.arrow', 'Arrow', ('arrow',), ('*.arw',), ()), + 'ArturoLexer': ('pip._vendor.pygments.lexers.arturo', 'Arturo', ('arturo', 'art'), ('*.art',), ()), 'AscLexer': ('pip._vendor.pygments.lexers.asc', 'ASCII armored', ('asc', 'pem'), ('*.asc', '*.pem', 'id_dsa', 'id_ecdsa', 'id_ecdsa_sk', 'id_ed25519', 'id_ed25519_sk', 'id_rsa'), ('application/pgp-keys', 'application/pgp-encrypted', 'application/pgp-signature')), 'AspectJLexer': ('pip._vendor.pygments.lexers.jvm', 'AspectJ', ('aspectj',), ('*.aj',), ('text/x-aspectj',)), 'AsymptoteLexer': ('pip._vendor.pygments.lexers.graphics', 'Asymptote', ('asymptote', 'asy'), ('*.asy',), ('text/x-asymptote',)), @@ -152,13 +153,14 @@ LEXERS = { 'EvoqueXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Evoque', ('xml+evoque',), ('*.xml',), ('application/xml+evoque',)), 'ExeclineLexer': ('pip._vendor.pygments.lexers.shell', 'execline', ('execline',), ('*.exec',), ()), 'EzhilLexer': ('pip._vendor.pygments.lexers.ezhil', 'Ezhil', ('ezhil',), ('*.n',), ('text/x-ezhil',)), - 'FSharpLexer': ('pip._vendor.pygments.lexers.dotnet', 'F#', ('fsharp', 'f#'), ('*.fs', '*.fsi'), ('text/x-fsharp',)), + 'FSharpLexer': ('pip._vendor.pygments.lexers.dotnet', 'F#', ('fsharp', 'f#'), ('*.fs', '*.fsi', '*.fsx'), ('text/x-fsharp',)), 'FStarLexer': ('pip._vendor.pygments.lexers.ml', 'FStar', ('fstar',), ('*.fst', '*.fsti'), ('text/x-fstar',)), 'FactorLexer': ('pip._vendor.pygments.lexers.factor', 'Factor', ('factor',), ('*.factor',), ('text/x-factor',)), 'FancyLexer': ('pip._vendor.pygments.lexers.ruby', 'Fancy', ('fancy', 'fy'), ('*.fy', '*.fancypack'), ('text/x-fancysrc',)), 'FantomLexer': ('pip._vendor.pygments.lexers.fantom', 'Fantom', ('fan',), ('*.fan',), ('application/x-fantom',)), 'FelixLexer': ('pip._vendor.pygments.lexers.felix', 'Felix', ('felix', 'flx'), ('*.flx', '*.flxh'), ('text/x-felix',)), 'FennelLexer': ('pip._vendor.pygments.lexers.lisp', 'Fennel', ('fennel', 'fnl'), ('*.fnl',), ()), + 'FiftLexer': ('pip._vendor.pygments.lexers.fift', 'Fift', ('fift', 'fif'), ('*.fif',), ()), 'FishShellLexer': ('pip._vendor.pygments.lexers.shell', 'Fish', ('fish', 'fishshell'), ('*.fish', '*.load'), ('application/x-fish',)), 'FlatlineLexer': ('pip._vendor.pygments.lexers.dsls', 'Flatline', ('flatline',), (), ('text/x-flatline',)), 'FloScriptLexer': ('pip._vendor.pygments.lexers.floscript', 'FloScript', ('floscript', 'flo'), ('*.flo',), ()), @@ -167,7 +169,9 @@ LEXERS = { 'FortranLexer': ('pip._vendor.pygments.lexers.fortran', 'Fortran', ('fortran', 'f90'), ('*.f03', '*.f90', '*.F03', '*.F90'), ('text/x-fortran',)), 'FoxProLexer': ('pip._vendor.pygments.lexers.foxpro', 'FoxPro', ('foxpro', 'vfp', 'clipper', 'xbase'), ('*.PRG', '*.prg'), ()), 'FreeFemLexer': ('pip._vendor.pygments.lexers.freefem', 'Freefem', ('freefem',), ('*.edp',), ('text/x-freefem',)), + 'FuncLexer': ('pip._vendor.pygments.lexers.func', 'FunC', ('func', 'fc'), ('*.fc', '*.func'), ()), 'FutharkLexer': ('pip._vendor.pygments.lexers.futhark', 'Futhark', ('futhark',), ('*.fut',), ('text/x-futhark',)), + 'GAPConsoleLexer': ('pip._vendor.pygments.lexers.algebra', 'GAP session', ('gap-console', 'gap-repl'), ('*.tst',), ()), 'GAPLexer': ('pip._vendor.pygments.lexers.algebra', 'GAP', ('gap',), ('*.g', '*.gd', '*.gi', '*.gap'), ()), 'GDScriptLexer': ('pip._vendor.pygments.lexers.gdscript', 'GDScript', ('gdscript', 'gd'), ('*.gd',), ('text/x-gdscript', 'application/x-gdscript')), 'GLShaderLexer': ('pip._vendor.pygments.lexers.graphics', 'GLSL', ('glsl',), ('*.vert', '*.frag', '*.geo'), ('text/x-glslsrc',)), @@ -196,7 +200,7 @@ LEXERS = { 'HaxeLexer': ('pip._vendor.pygments.lexers.haxe', 'Haxe', ('haxe', 'hxsl', 'hx'), ('*.hx', '*.hxsl'), ('text/haxe', 'text/x-haxe', 'text/x-hx')), 'HexdumpLexer': ('pip._vendor.pygments.lexers.hexdump', 'Hexdump', ('hexdump',), (), ()), 'HsailLexer': ('pip._vendor.pygments.lexers.asm', 'HSAIL', ('hsail', 'hsa'), ('*.hsail',), ('text/x-hsail',)), - 'HspecLexer': ('pip._vendor.pygments.lexers.haskell', 'Hspec', ('hspec',), (), ()), + 'HspecLexer': ('pip._vendor.pygments.lexers.haskell', 'Hspec', ('hspec',), ('*Spec.hs',), ()), 'HtmlDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Django/Jinja', ('html+django', 'html+jinja', 'htmldjango'), ('*.html.j2', '*.htm.j2', '*.xhtml.j2', '*.html.jinja2', '*.htm.jinja2', '*.xhtml.jinja2'), ('text/html+django', 'text/html+jinja')), 'HtmlGenshiLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Genshi', ('html+genshi', 'html+kid'), (), ('text/html+genshi',)), 'HtmlLexer': ('pip._vendor.pygments.lexers.html', 'HTML', ('html',), ('*.html', '*.htm', '*.xhtml', '*.xslt'), ('text/html', 'application/xhtml+xml')), @@ -236,6 +240,7 @@ LEXERS = { 'JsonBareObjectLexer': ('pip._vendor.pygments.lexers.data', 'JSONBareObject', (), (), ()), 'JsonLdLexer': ('pip._vendor.pygments.lexers.data', 'JSON-LD', ('jsonld', 'json-ld'), ('*.jsonld',), ('application/ld+json',)), 'JsonLexer': ('pip._vendor.pygments.lexers.data', 'JSON', ('json', 'json-object'), ('*.json', 'Pipfile.lock'), ('application/json', 'application/json-object')), + 'JsonnetLexer': ('pip._vendor.pygments.lexers.jsonnet', 'Jsonnet', ('jsonnet',), ('*.jsonnet', '*.libsonnet'), ()), 'JspLexer': ('pip._vendor.pygments.lexers.templates', 'Java Server Page', ('jsp',), ('*.jsp',), ('application/x-jsp',)), 'JuliaConsoleLexer': ('pip._vendor.pygments.lexers.julia', 'Julia console', ('jlcon', 'julia-repl'), (), ()), 'JuliaLexer': ('pip._vendor.pygments.lexers.julia', 'Julia', ('julia', 'jl'), ('*.jl',), ('text/x-julia', 'application/x-julia')), @@ -270,8 +275,10 @@ LEXERS = { 'LogosLexer': ('pip._vendor.pygments.lexers.objective', 'Logos', ('logos',), ('*.x', '*.xi', '*.xm', '*.xmi'), ('text/x-logos',)), 'LogtalkLexer': ('pip._vendor.pygments.lexers.prolog', 'Logtalk', ('logtalk',), ('*.lgt', '*.logtalk'), ('text/x-logtalk',)), 'LuaLexer': ('pip._vendor.pygments.lexers.scripting', 'Lua', ('lua',), ('*.lua', '*.wlua'), ('text/x-lua', 'application/x-lua')), - 'MCFunctionLexer': ('pip._vendor.pygments.lexers.mcfunction', 'MCFunction', ('mcfunction', 'mcf'), ('*.mcfunction',), ('text/mcfunction',)), + 'MCFunctionLexer': ('pip._vendor.pygments.lexers.minecraft', 'MCFunction', ('mcfunction', 'mcf'), ('*.mcfunction',), ('text/mcfunction',)), + 'MCSchemaLexer': ('pip._vendor.pygments.lexers.minecraft', 'MCSchema', ('mcschema',), ('*.mcschema',), ('text/mcschema',)), 'MIMELexer': ('pip._vendor.pygments.lexers.mime', 'MIME', ('mime',), (), ('multipart/mixed', 'multipart/related', 'multipart/alternative')), + 'MIPSLexer': ('pip._vendor.pygments.lexers.mips', 'MIPS', ('mips',), ('*.mips', '*.MIPS'), ()), 'MOOCodeLexer': ('pip._vendor.pygments.lexers.scripting', 'MOOCode', ('moocode', 'moo'), ('*.moo',), ('text/x-moocode',)), 'MSDOSSessionLexer': ('pip._vendor.pygments.lexers.shell', 'MSDOS Session', ('doscon',), (), ()), 'Macaulay2Lexer': ('pip._vendor.pygments.lexers.macaulay2', 'Macaulay2', ('macaulay2',), ('*.m2',), ()), @@ -316,7 +323,7 @@ LEXERS = { 'MyghtyXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Myghty', ('xml+myghty',), (), ('application/xml+myghty',)), 'NCLLexer': ('pip._vendor.pygments.lexers.ncl', 'NCL', ('ncl',), ('*.ncl',), ('text/ncl',)), 'NSISLexer': ('pip._vendor.pygments.lexers.installers', 'NSIS', ('nsis', 'nsi', 'nsh'), ('*.nsi', '*.nsh'), ('text/x-nsis',)), - 'NasmLexer': ('pip._vendor.pygments.lexers.asm', 'NASM', ('nasm',), ('*.asm', '*.ASM'), ('text/x-nasm',)), + 'NasmLexer': ('pip._vendor.pygments.lexers.asm', 'NASM', ('nasm',), ('*.asm', '*.ASM', '*.nasm'), ('text/x-nasm',)), 'NasmObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'objdump-nasm', ('objdump-nasm',), ('*.objdump-intel',), ('text/x-nasm-objdump',)), 'NemerleLexer': ('pip._vendor.pygments.lexers.dotnet', 'Nemerle', ('nemerle',), ('*.n',), ('text/x-nemerle',)), 'NesCLexer': ('pip._vendor.pygments.lexers.c_like', 'nesC', ('nesc',), ('*.nc',), ('text/x-nescsrc',)), @@ -350,6 +357,7 @@ LEXERS = { 'PegLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'PEG', ('peg',), ('*.peg',), ('text/x-peg',)), 'Perl6Lexer': ('pip._vendor.pygments.lexers.perl', 'Perl6', ('perl6', 'pl6', 'raku'), ('*.pl', '*.pm', '*.nqp', '*.p6', '*.6pl', '*.p6l', '*.pl6', '*.6pm', '*.p6m', '*.pm6', '*.t', '*.raku', '*.rakumod', '*.rakutest', '*.rakudoc'), ('text/x-perl6', 'application/x-perl6')), 'PerlLexer': ('pip._vendor.pygments.lexers.perl', 'Perl', ('perl', 'pl'), ('*.pl', '*.pm', '*.t', '*.perl'), ('text/x-perl', 'application/x-perl')), + 'PhixLexer': ('pip._vendor.pygments.lexers.phix', 'Phix', ('phix',), ('*.exw',), ('text/x-phix',)), 'PhpLexer': ('pip._vendor.pygments.lexers.php', 'PHP', ('php', 'php3', 'php4', 'php5'), ('*.php', '*.php[345]', '*.inc'), ('text/x-php',)), 'PigLexer': ('pip._vendor.pygments.lexers.jvm', 'Pig', ('pig',), ('*.pig',), ('text/x-pig',)), 'PikeLexer': ('pip._vendor.pygments.lexers.c_like', 'Pike', ('pike',), ('*.pike', '*.pmod'), ('text/x-pike',)), @@ -357,6 +365,7 @@ LEXERS = { 'PlPgsqlLexer': ('pip._vendor.pygments.lexers.sql', 'PL/pgSQL', ('plpgsql',), (), ('text/x-plpgsql',)), 'PointlessLexer': ('pip._vendor.pygments.lexers.pointless', 'Pointless', ('pointless',), ('*.ptls',), ()), 'PonyLexer': ('pip._vendor.pygments.lexers.pony', 'Pony', ('pony',), ('*.pony',), ()), + 'PortugolLexer': ('pip._vendor.pygments.lexers.pascal', 'Portugol', ('portugol',), ('*.alg', '*.portugol'), ()), 'PostScriptLexer': ('pip._vendor.pygments.lexers.graphics', 'PostScript', ('postscript', 'postscr'), ('*.ps', '*.eps'), ('application/postscript',)), 'PostgresConsoleLexer': ('pip._vendor.pygments.lexers.sql', 'PostgreSQL console (psql)', ('psql', 'postgresql-console', 'postgres-console'), (), ('text/x-postgresql-psql',)), 'PostgresLexer': ('pip._vendor.pygments.lexers.sql', 'PostgreSQL SQL dialect', ('postgresql', 'postgres'), (), ('text/x-postgresql',)), @@ -376,7 +385,7 @@ LEXERS = { 'Python2Lexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x', ('python2', 'py2'), (), ('text/x-python2', 'application/x-python2')), 'Python2TracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x Traceback', ('py2tb',), ('*.py2tb',), ('text/x-python2-traceback',)), 'PythonConsoleLexer': ('pip._vendor.pygments.lexers.python', 'Python console session', ('pycon',), (), ('text/x-python-doctest',)), - 'PythonLexer': ('pip._vendor.pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3'), ('*.py', '*.pyw', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')), + 'PythonLexer': ('pip._vendor.pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')), 'PythonTracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python Traceback', ('pytb', 'py3tb'), ('*.pytb', '*.py3tb'), ('text/x-python-traceback', 'text/x-python3-traceback')), 'PythonUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'Python+UL4', ('py+ul4',), ('*.pyul4',), ()), 'QBasicLexer': ('pip._vendor.pygments.lexers.basic', 'QBasic', ('qbasic', 'basic'), ('*.BAS', '*.bas'), ('text/basic',)), @@ -421,7 +430,7 @@ LEXERS = { 'SASLexer': ('pip._vendor.pygments.lexers.sas', 'SAS', ('sas',), ('*.SAS', '*.sas'), ('text/x-sas', 'text/sas', 'application/x-sas')), 'SLexer': ('pip._vendor.pygments.lexers.r', 'S', ('splus', 's', 'r'), ('*.S', '*.R', '.Rhistory', '.Rprofile', '.Renviron'), ('text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r', 'text/x-R', 'text/x-r-history', 'text/x-r-profile')), 'SMLLexer': ('pip._vendor.pygments.lexers.ml', 'Standard ML', ('sml',), ('*.sml', '*.sig', '*.fun'), ('text/x-standardml', 'application/x-standardml')), - 'SNBTLexer': ('pip._vendor.pygments.lexers.mcfunction', 'SNBT', ('snbt',), ('*.snbt',), ('text/snbt',)), + 'SNBTLexer': ('pip._vendor.pygments.lexers.minecraft', 'SNBT', ('snbt',), ('*.snbt',), ('text/snbt',)), 'SarlLexer': ('pip._vendor.pygments.lexers.jvm', 'SARL', ('sarl',), ('*.sarl',), ('text/x-sarl',)), 'SassLexer': ('pip._vendor.pygments.lexers.css', 'Sass', ('sass',), ('*.sass',), ('text/x-sass',)), 'SaviLexer': ('pip._vendor.pygments.lexers.savi', 'Savi', ('savi',), ('*.savi',), ()), @@ -485,6 +494,7 @@ LEXERS = { 'ThingsDBLexer': ('pip._vendor.pygments.lexers.thingsdb', 'ThingsDB', ('ti', 'thingsdb'), ('*.ti',), ()), 'ThriftLexer': ('pip._vendor.pygments.lexers.dsls', 'Thrift', ('thrift',), ('*.thrift',), ('application/x-thrift',)), 'TiddlyWiki5Lexer': ('pip._vendor.pygments.lexers.markup', 'tiddler', ('tid',), ('*.tid',), ('text/vnd.tiddlywiki',)), + 'TlbLexer': ('pip._vendor.pygments.lexers.tlb', 'Tl-b', ('tlb',), ('*.tlb',), ()), 'TodotxtLexer': ('pip._vendor.pygments.lexers.textfmts', 'Todotxt', ('todotxt',), ('todo.txt', '*.todotxt'), ('text/x-todo',)), 'TransactSqlLexer': ('pip._vendor.pygments.lexers.sql', 'Transact-SQL', ('tsql', 't-sql'), ('*.sql',), ('text/x-tsql',)), 'TreetopLexer': ('pip._vendor.pygments.lexers.parsers', 'Treetop', ('treetop',), ('*.treetop', '*.tt'), ()), @@ -519,6 +529,8 @@ LEXERS = { 'WatLexer': ('pip._vendor.pygments.lexers.webassembly', 'WebAssembly', ('wast', 'wat'), ('*.wat', '*.wast'), ()), 'WebIDLLexer': ('pip._vendor.pygments.lexers.webidl', 'Web IDL', ('webidl',), ('*.webidl',), ()), 'WhileyLexer': ('pip._vendor.pygments.lexers.whiley', 'Whiley', ('whiley',), ('*.whiley',), ('text/x-whiley',)), + 'WoWTocLexer': ('pip._vendor.pygments.lexers.wowtoc', 'World of Warcraft TOC', ('wowtoc',), ('*.toc',), ()), + 'WrenLexer': ('pip._vendor.pygments.lexers.wren', 'Wren', ('wren',), ('*.wren',), ()), 'X10Lexer': ('pip._vendor.pygments.lexers.x10', 'X10', ('x10', 'xten'), ('*.x10',), ('text/x-x10',)), 'XMLUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'XML+UL4', ('xml+ul4',), ('*.xmlul4',), ()), 'XQueryLexer': ('pip._vendor.pygments.lexers.webmisc', 'XQuery', ('xquery', 'xqy', 'xq', 'xql', 'xqm'), ('*.xqy', '*.xquery', '*.xq', '*.xql', '*.xqm'), ('text/xquery', 'application/xquery')), diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py index c24e3c86..3341a382 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +++ b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py @@ -12,18 +12,16 @@ import re import keyword from pip._vendor.pygments.lexer import Lexer, RegexLexer, include, bygroups, using, \ - default, words, combined, do_insertions, this + default, words, combined, do_insertions, this, line_re from pip._vendor.pygments.util import get_bool_opt, shebang_matches from pip._vendor.pygments.token import Text, Comment, Operator, Keyword, Name, String, \ - Number, Punctuation, Generic, Other, Error + Number, Punctuation, Generic, Other, Error, Whitespace from pip._vendor.pygments import unistring as uni __all__ = ['PythonLexer', 'PythonConsoleLexer', 'PythonTracebackLexer', 'Python2Lexer', 'Python2TracebackLexer', 'CythonLexer', 'DgLexer', 'NumPyLexer'] -line_re = re.compile('.*?\n') - class PythonLexer(RegexLexer): """ @@ -42,6 +40,8 @@ class PythonLexer(RegexLexer): filenames = [ '*.py', '*.pyw', + # Type stubs + '*.pyi', # Jython '*.jy', # Sage @@ -100,11 +100,11 @@ class PythonLexer(RegexLexer): tokens = { 'root': [ - (r'\n', Text), + (r'\n', Whitespace), (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")', - bygroups(Text, String.Affix, String.Doc)), + bygroups(Whitespace, String.Affix, String.Doc)), (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')", - bygroups(Text, String.Affix, String.Doc)), + bygroups(Whitespace, String.Affix, String.Doc)), (r'\A#!.+$', Comment.Hashbang), (r'#.*$', Comment.Single), (r'\\\n', Text), @@ -169,7 +169,7 @@ class PythonLexer(RegexLexer): combined('bytesescape', 'dqs')), ("([bB])(')", bygroups(String.Affix, String.Single), combined('bytesescape', 'sqs')), - + (r'[^\S\n]+', Text), include('numbers'), (r'!=|==|<<|>>|:=|[-~+/*%=<>&^|.]', Operator), @@ -192,13 +192,13 @@ class PythonLexer(RegexLexer): (r'(=\s*)?' # debug (https://bugs.python.org/issue36817) r'(\![sraf])?' # conversion r':', String.Interpol, '#pop'), - (r'\s+', Text), # allow new lines + (r'\s+', Whitespace), # allow new lines include('expr'), ], 'expr-inside-fstring-inner': [ (r'[{([]', Punctuation, 'expr-inside-fstring-inner'), (r'[])}]', Punctuation, '#pop'), - (r'\s+', Text), # allow new lines + (r'\s+', Whitespace), # allow new lines include('expr'), ], 'expr-keywords': [ @@ -229,7 +229,7 @@ class PythonLexer(RegexLexer): ], 'soft-keywords-inner': [ # optional `_` keyword - (r'(\s+)([^\n_]*)(_\b)', bygroups(Text, using(this), Keyword)), + (r'(\s+)([^\n_]*)(_\b)', bygroups(Whitespace, using(this), Keyword)), default('#pop') ], 'builtins': [ @@ -445,11 +445,11 @@ class Python2Lexer(RegexLexer): tokens = { 'root': [ - (r'\n', Text), + (r'\n', Whitespace), (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")', - bygroups(Text, String.Affix, String.Doc)), + bygroups(Whitespace, String.Affix, String.Doc)), (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')", - bygroups(Text, String.Affix, String.Doc)), + bygroups(Whitespace, String.Affix, String.Doc)), (r'[^\S\n]+', Text), (r'\A#!.+$', Comment.Hashbang), (r'#.*$', Comment.Single), @@ -742,7 +742,7 @@ class PythonTracebackLexer(RegexLexer): tokens = { 'root': [ - (r'\n', Text), + (r'\n', Whitespace), (r'^Traceback \(most recent call last\):\n', Generic.Traceback, 'intb'), (r'^During handling of the above exception, another ' r'exception occurred:\n\n', Generic.Traceback), @@ -753,24 +753,24 @@ class PythonTracebackLexer(RegexLexer): ], 'intb': [ (r'^( File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Text, Name, Text)), + bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)), (r'^( File )("[^"]+")(, line )(\d+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Text)), + bygroups(Text, Name.Builtin, Text, Number, Whitespace)), (r'^( )(.+)(\n)', - bygroups(Text, using(PythonLexer), Text), 'markers'), + bygroups(Whitespace, using(PythonLexer), Whitespace), 'markers'), (r'^([ \t]*)(\.\.\.)(\n)', - bygroups(Text, Comment, Text)), # for doctests... + bygroups(Whitespace, Comment, Whitespace)), # for doctests... (r'^([^:]+)(: )(.+)(\n)', - bygroups(Generic.Error, Text, Name, Text), '#pop'), + bygroups(Generic.Error, Text, Name, Whitespace), '#pop'), (r'^([a-zA-Z_][\w.]*)(:?\n)', - bygroups(Generic.Error, Text), '#pop') + bygroups(Generic.Error, Whitespace), '#pop') ], 'markers': [ # Either `PEP 657 ` # error locations in Python 3.11+, or single-caret markers # for syntax errors before that. (r'^( {4,})([~^]+)(\n)', - bygroups(Text, Punctuation.Marker, Text), + bygroups(Whitespace, Punctuation.Marker, Whitespace), '#pop'), default('#pop'), ], @@ -808,17 +808,17 @@ class Python2TracebackLexer(RegexLexer): ], 'intb': [ (r'^( File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Text, Name, Text)), + bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)), (r'^( File )("[^"]+")(, line )(\d+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Text)), + bygroups(Text, Name.Builtin, Text, Number, Whitespace)), (r'^( )(.+)(\n)', - bygroups(Text, using(Python2Lexer), Text), 'marker'), + bygroups(Text, using(Python2Lexer), Whitespace), 'marker'), (r'^([ \t]*)(\.\.\.)(\n)', - bygroups(Text, Comment, Text)), # for doctests... + bygroups(Text, Comment, Whitespace)), # for doctests... (r'^([^:]+)(: )(.+)(\n)', - bygroups(Generic.Error, Text, Name, Text), '#pop'), + bygroups(Generic.Error, Text, Name, Whitespace), '#pop'), (r'^([a-zA-Z_]\w*)(:?\n)', - bygroups(Generic.Error, Text), '#pop') + bygroups(Generic.Error, Whitespace), '#pop') ], 'marker': [ # For syntax errors. @@ -843,13 +843,13 @@ class CythonLexer(RegexLexer): tokens = { 'root': [ - (r'\n', Text), - (r'^(\s*)("""(?:.|\n)*?""")', bygroups(Text, String.Doc)), - (r"^(\s*)('''(?:.|\n)*?''')", bygroups(Text, String.Doc)), + (r'\n', Whitespace), + (r'^(\s*)("""(?:.|\n)*?""")', bygroups(Whitespace, String.Doc)), + (r"^(\s*)('''(?:.|\n)*?''')", bygroups(Whitespace, String.Doc)), (r'[^\S\n]+', Text), (r'#.*$', Comment), (r'[]{}:(),;[]', Punctuation), - (r'\\\n', Text), + (r'\\\n', Whitespace), (r'\\', Text), (r'(in|is|and|or|not)\b', Operator.Word), (r'(<)([a-zA-Z0-9.?]+)(>)', diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py b/.venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py index c41bd49d..3537ecdb 100644 --- a/.venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +++ b/.venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py @@ -74,6 +74,8 @@ class PygmentsDoc(Directive): out = self.document_formatters() elif self.arguments[0] == 'filters': out = self.document_filters() + elif self.arguments[0] == 'lexers_overview': + out = self.document_lexers_overview() else: raise Exception('invalid argument for "pygmentsdoc" directive') node = nodes.compound() @@ -83,6 +85,66 @@ class PygmentsDoc(Directive): self.state.document.settings.record_dependencies.add(fn) return node.children + def document_lexers_overview(self): + """Generate a tabular overview of all lexers. + + The columns are the lexer name, the extensions handled by this lexer + (or "None"), the aliases and a link to the lexer class.""" + from pip._vendor.pygments.lexers._mapping import LEXERS + from pip._vendor.pygments.lexers import find_lexer_class + out = [] + + table = [] + + def format_link(name, url): + if url: + return f'`{name} <{url}>`_' + return name + + for classname, data in sorted(LEXERS.items(), key=lambda x: x[1][1].lower()): + lexer_cls = find_lexer_class(data[1]) + extensions = lexer_cls.filenames + lexer_cls.alias_filenames + + table.append({ + 'name': format_link(data[1], lexer_cls.url), + 'extensions': ', '.join(extensions).replace('*', '\\*').replace('_', '\\') or 'None', + 'aliases': ', '.join(data[2]), + 'class': f'{data[0]}.{classname}' + }) + + column_names = ['name', 'extensions', 'aliases', 'class'] + column_lengths = [max([len(row[column]) for row in table if row[column]]) + for column in column_names] + + def write_row(*columns): + """Format a table row""" + out = [] + for l, c in zip(column_lengths, columns): + if c: + out.append(c.ljust(l)) + else: + out.append(' '*l) + + return ' '.join(out) + + def write_seperator(): + """Write a table separator row""" + sep = ['='*c for c in column_lengths] + return write_row(*sep) + + out.append(write_seperator()) + out.append(write_row('Name', 'Extension(s)', 'Short name(s)', 'Lexer class')) + out.append(write_seperator()) + for row in table: + out.append(write_row( + row['name'], + row['extensions'], + row['aliases'], + f':class:`~{row["class"]}`')) + out.append(write_seperator()) + + return '\n'.join(out) + def document_lexers(self): from pip._vendor.pygments.lexers._mapping import LEXERS out = [] diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc index 1e879a8c..dd4047ee 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc index 3dafb4b6..f5706fc6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc index 6d7308a8..019f20cc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc index 909b5cd5..54eb0a80 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc index 5aad3946..fb3d506e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc index 5d746743..da2b656e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc index ce5b7bf0..75e7b973 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc index a66ff104..603af43e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc index f4088671..052e4d36 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc index 90f97153..0506411e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc index 92b8e6af..c3e557fa 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc index 381afced..aaea332b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py new file mode 100644 index 00000000..ddfcf7f7 --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py @@ -0,0 +1,23 @@ +"""Wrappers to call pyproject.toml-based build backend hooks. +""" + +from ._impl import ( + BackendInvalid, + BackendUnavailable, + BuildBackendHookCaller, + HookMissing, + UnsupportedOperation, + default_subprocess_runner, + quiet_subprocess_runner, +) + +__version__ = '1.0.0' +__all__ = [ + 'BackendUnavailable', + 'BackendInvalid', + 'HookMissing', + 'UnsupportedOperation', + 'default_subprocess_runner', + 'quiet_subprocess_runner', + 'BuildBackendHookCaller', +] diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 00000000..15f49179 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc new file mode 100644 index 00000000..4c9a91d3 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc new file mode 100644 index 00000000..12ea05e5 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pep517/_compat.py b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_compat.py similarity index 100% rename from .venv/Lib/site-packages/pip/_vendor/pep517/_compat.py rename to .venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_compat.py diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py new file mode 100644 index 00000000..37b0e653 --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py @@ -0,0 +1,330 @@ +import json +import os +import sys +import tempfile +from contextlib import contextmanager +from os.path import abspath +from os.path import join as pjoin +from subprocess import STDOUT, check_call, check_output + +from ._in_process import _in_proc_script_path + + +def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + +def read_json(path): + with open(path, encoding='utf-8') as f: + return json.load(f) + + +class BackendUnavailable(Exception): + """Will be raised if the backend cannot be imported in the hook process.""" + def __init__(self, traceback): + self.traceback = traceback + + +class BackendInvalid(Exception): + """Will be raised if the backend is invalid.""" + def __init__(self, backend_name, backend_path, message): + super().__init__(message) + self.backend_name = backend_name + self.backend_path = backend_path + + +class HookMissing(Exception): + """Will be raised on missing hooks (if a fallback can't be used).""" + def __init__(self, hook_name): + super().__init__(hook_name) + self.hook_name = hook_name + + +class UnsupportedOperation(Exception): + """May be raised by build_sdist if the backend indicates that it can't.""" + def __init__(self, traceback): + self.traceback = traceback + + +def default_subprocess_runner(cmd, cwd=None, extra_environ=None): + """The default method of calling the wrapper subprocess. + + This uses :func:`subprocess.check_call` under the hood. + """ + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_call(cmd, cwd=cwd, env=env) + + +def quiet_subprocess_runner(cmd, cwd=None, extra_environ=None): + """Call the subprocess while suppressing output. + + This uses :func:`subprocess.check_output` under the hood. + """ + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_output(cmd, cwd=cwd, env=env, stderr=STDOUT) + + +def norm_and_check(source_tree, requested): + """Normalise and check a backend path. + + Ensure that the requested backend path is specified as a relative path, + and resolves to a location under the given source tree. + + Return an absolute version of the requested path. + """ + if os.path.isabs(requested): + raise ValueError("paths must be relative") + + abs_source = os.path.abspath(source_tree) + abs_requested = os.path.normpath(os.path.join(abs_source, requested)) + # We have to use commonprefix for Python 2.7 compatibility. So we + # normalise case to avoid problems because commonprefix is a character + # based comparison :-( + norm_source = os.path.normcase(abs_source) + norm_requested = os.path.normcase(abs_requested) + if os.path.commonprefix([norm_source, norm_requested]) != norm_source: + raise ValueError("paths must be inside source tree") + + return abs_requested + + +class BuildBackendHookCaller: + """A wrapper to call the build backend hooks for a source directory. + """ + + def __init__( + self, + source_dir, + build_backend, + backend_path=None, + runner=None, + python_executable=None, + ): + """ + :param source_dir: The source directory to invoke the build backend for + :param build_backend: The build backend spec + :param backend_path: Additional path entries for the build backend spec + :param runner: The :ref:`subprocess runner ` to use + :param python_executable: + The Python executable used to invoke the build backend + """ + if runner is None: + runner = default_subprocess_runner + + self.source_dir = abspath(source_dir) + self.build_backend = build_backend + if backend_path: + backend_path = [ + norm_and_check(self.source_dir, p) for p in backend_path + ] + self.backend_path = backend_path + self._subprocess_runner = runner + if not python_executable: + python_executable = sys.executable + self.python_executable = python_executable + + @contextmanager + def subprocess_runner(self, runner): + """A context manager for temporarily overriding the default + :ref:`subprocess runner `. + + .. code-block:: python + + hook_caller = BuildBackendHookCaller(...) + with hook_caller.subprocess_runner(quiet_subprocess_runner): + ... + """ + prev = self._subprocess_runner + self._subprocess_runner = runner + try: + yield + finally: + self._subprocess_runner = prev + + def _supported_features(self): + """Return the list of optional features supported by the backend.""" + return self._call_hook('_supported_features', {}) + + def get_requires_for_build_wheel(self, config_settings=None): + """Get additional dependencies required for building a wheel. + + :returns: A list of :pep:`dependency specifiers <508>`. + :rtype: list[str] + + .. admonition:: Fallback + + If the build backend does not defined a hook with this name, an + empty list will be returned. + """ + return self._call_hook('get_requires_for_build_wheel', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_wheel( + self, metadata_directory, config_settings=None, + _allow_fallback=True): + """Prepare a ``*.dist-info`` folder with metadata for this project. + + :returns: Name of the newly created subfolder within + ``metadata_directory``, containing the metadata. + :rtype: str + + .. admonition:: Fallback + + If the build backend does not define a hook with this name and + ``_allow_fallback`` is truthy, the backend will be asked to build a + wheel via the ``build_wheel`` hook and the dist-info extracted from + that will be returned. + """ + return self._call_hook('prepare_metadata_for_build_wheel', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + '_allow_fallback': _allow_fallback, + }) + + def build_wheel( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build a wheel from this project. + + :returns: + The name of the newly created wheel within ``wheel_directory``. + + .. admonition:: Interaction with fallback + + If the ``build_wheel`` hook was called in the fallback for + :meth:`prepare_metadata_for_build_wheel`, the build backend would + not be invoked. Instead, the previously built wheel will be copied + to ``wheel_directory`` and the name of that file will be returned. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_wheel', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_editable(self, config_settings=None): + """Get additional dependencies required for building an editable wheel. + + :returns: A list of :pep:`dependency specifiers <508>`. + :rtype: list[str] + + .. admonition:: Fallback + + If the build backend does not defined a hook with this name, an + empty list will be returned. + """ + return self._call_hook('get_requires_for_build_editable', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_editable( + self, metadata_directory, config_settings=None, + _allow_fallback=True): + """Prepare a ``*.dist-info`` folder with metadata for this project. + + :returns: Name of the newly created subfolder within + ``metadata_directory``, containing the metadata. + :rtype: str + + .. admonition:: Fallback + + If the build backend does not define a hook with this name and + ``_allow_fallback`` is truthy, the backend will be asked to build a + wheel via the ``build_editable`` hook and the dist-info + extracted from that will be returned. + """ + return self._call_hook('prepare_metadata_for_build_editable', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + '_allow_fallback': _allow_fallback, + }) + + def build_editable( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build an editable wheel from this project. + + :returns: + The name of the newly created wheel within ``wheel_directory``. + + .. admonition:: Interaction with fallback + + If the ``build_editable`` hook was called in the fallback for + :meth:`prepare_metadata_for_build_editable`, the build backend + would not be invoked. Instead, the previously built wheel will be + copied to ``wheel_directory`` and the name of that file will be + returned. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_editable', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_sdist(self, config_settings=None): + """Get additional dependencies required for building an sdist. + + :returns: A list of :pep:`dependency specifiers <508>`. + :rtype: list[str] + """ + return self._call_hook('get_requires_for_build_sdist', { + 'config_settings': config_settings + }) + + def build_sdist(self, sdist_directory, config_settings=None): + """Build an sdist from this project. + + :returns: + The name of the newly created sdist within ``wheel_directory``. + """ + return self._call_hook('build_sdist', { + 'sdist_directory': abspath(sdist_directory), + 'config_settings': config_settings, + }) + + def _call_hook(self, hook_name, kwargs): + extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend} + + if self.backend_path: + backend_path = os.pathsep.join(self.backend_path) + extra_environ['PEP517_BACKEND_PATH'] = backend_path + + with tempfile.TemporaryDirectory() as td: + hook_input = {'kwargs': kwargs} + write_json(hook_input, pjoin(td, 'input.json'), indent=2) + + # Run the hook in a subprocess + with _in_proc_script_path() as script: + python = self.python_executable + self._subprocess_runner( + [python, abspath(str(script)), hook_name, td], + cwd=self.source_dir, + extra_environ=extra_environ + ) + + data = read_json(pjoin(td, 'output.json')) + if data.get('unsupported'): + raise UnsupportedOperation(data.get('traceback', '')) + if data.get('no_backend'): + raise BackendUnavailable(data.get('traceback', '')) + if data.get('backend_invalid'): + raise BackendInvalid( + backend_name=self.build_backend, + backend_path=self.backend_path, + message=data.get('backend_error', '') + ) + if data.get('hook_missing'): + raise HookMissing(data.get('missing_hook_name') or hook_name) + return data['return_val'] diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py new file mode 100644 index 00000000..917fa065 --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py @@ -0,0 +1,18 @@ +"""This is a subpackage because the directory is on sys.path for _in_process.py + +The subpackage should stay as empty as possible to avoid shadowing modules that +the backend might import. +""" + +import importlib.resources as resources + +try: + resources.files +except AttributeError: + # Python 3.8 compatibility + def _in_proc_script_path(): + return resources.path(__package__, '_in_process.py') +else: + def _in_proc_script_path(): + return resources.as_file( + resources.files(__package__).joinpath('_in_process.py')) diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 00000000..c7c93390 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc new file mode 100644 index 00000000..68c62f29 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py new file mode 100644 index 00000000..ee511ff2 --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py @@ -0,0 +1,353 @@ +"""This is invoked in a subprocess to call the build backend hooks. + +It expects: +- Command line args: hook_name, control_dir +- Environment variables: + PEP517_BUILD_BACKEND=entry.point:spec + PEP517_BACKEND_PATH=paths (separated with os.pathsep) +- control_dir/input.json: + - {"kwargs": {...}} + +Results: +- control_dir/output.json + - {"return_val": ...} +""" +import json +import os +import os.path +import re +import shutil +import sys +import traceback +from glob import glob +from importlib import import_module +from os.path import join as pjoin + +# This file is run as a script, and `import wrappers` is not zip-safe, so we +# include write_json() and read_json() from wrappers.py. + + +def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + +def read_json(path): + with open(path, encoding='utf-8') as f: + return json.load(f) + + +class BackendUnavailable(Exception): + """Raised if we cannot import the backend""" + def __init__(self, traceback): + self.traceback = traceback + + +class BackendInvalid(Exception): + """Raised if the backend is invalid""" + def __init__(self, message): + self.message = message + + +class HookMissing(Exception): + """Raised if a hook is missing and we are not executing the fallback""" + def __init__(self, hook_name=None): + super().__init__(hook_name) + self.hook_name = hook_name + + +def contained_in(filename, directory): + """Test if a file is located within the given directory.""" + filename = os.path.normcase(os.path.abspath(filename)) + directory = os.path.normcase(os.path.abspath(directory)) + return os.path.commonprefix([filename, directory]) == directory + + +def _build_backend(): + """Find and load the build backend""" + # Add in-tree backend directories to the front of sys.path. + backend_path = os.environ.get('PEP517_BACKEND_PATH') + if backend_path: + extra_pathitems = backend_path.split(os.pathsep) + sys.path[:0] = extra_pathitems + + ep = os.environ['PEP517_BUILD_BACKEND'] + mod_path, _, obj_path = ep.partition(':') + try: + obj = import_module(mod_path) + except ImportError: + raise BackendUnavailable(traceback.format_exc()) + + if backend_path: + if not any( + contained_in(obj.__file__, path) + for path in extra_pathitems + ): + raise BackendInvalid("Backend was not loaded from backend-path") + + if obj_path: + for path_part in obj_path.split('.'): + obj = getattr(obj, path_part) + return obj + + +def _supported_features(): + """Return the list of options features supported by the backend. + + Returns a list of strings. + The only possible value is 'build_editable'. + """ + backend = _build_backend() + features = [] + if hasattr(backend, "build_editable"): + features.append("build_editable") + return features + + +def get_requires_for_build_wheel(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_wheel + except AttributeError: + return [] + else: + return hook(config_settings) + + +def get_requires_for_build_editable(config_settings): + """Invoke the optional get_requires_for_build_editable hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_editable + except AttributeError: + return [] + else: + return hook(config_settings) + + +def prepare_metadata_for_build_wheel( + metadata_directory, config_settings, _allow_fallback): + """Invoke optional prepare_metadata_for_build_wheel + + Implements a fallback by building a wheel if the hook isn't defined, + unless _allow_fallback is False in which case HookMissing is raised. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_wheel + except AttributeError: + if not _allow_fallback: + raise HookMissing() + else: + return hook(metadata_directory, config_settings) + # fallback to build_wheel outside the try block to avoid exception chaining + # which can be confusing to users and is not relevant + whl_basename = backend.build_wheel(metadata_directory, config_settings) + return _get_wheel_metadata_from_wheel(whl_basename, metadata_directory, + config_settings) + + +def prepare_metadata_for_build_editable( + metadata_directory, config_settings, _allow_fallback): + """Invoke optional prepare_metadata_for_build_editable + + Implements a fallback by building an editable wheel if the hook isn't + defined, unless _allow_fallback is False in which case HookMissing is + raised. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_editable + except AttributeError: + if not _allow_fallback: + raise HookMissing() + try: + build_hook = backend.build_editable + except AttributeError: + raise HookMissing(hook_name='build_editable') + else: + whl_basename = build_hook(metadata_directory, config_settings) + return _get_wheel_metadata_from_wheel(whl_basename, + metadata_directory, + config_settings) + else: + return hook(metadata_directory, config_settings) + + +WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' + + +def _dist_info_files(whl_zip): + """Identify the .dist-info folder inside a wheel ZipFile.""" + res = [] + for path in whl_zip.namelist(): + m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) + if m: + res.append(path) + if res: + return res + raise Exception("No .dist-info folder found in wheel") + + +def _get_wheel_metadata_from_wheel( + whl_basename, metadata_directory, config_settings): + """Extract the metadata from a wheel. + + Fallback for when the build backend does not + define the 'get_wheel_metadata' hook. + """ + from zipfile import ZipFile + with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): + pass # Touch marker file + + whl_file = os.path.join(metadata_directory, whl_basename) + with ZipFile(whl_file) as zipf: + dist_info = _dist_info_files(zipf) + zipf.extractall(path=metadata_directory, members=dist_info) + return dist_info[0].split('/')[0] + + +def _find_already_built_wheel(metadata_directory): + """Check for a wheel already built during the get_wheel_metadata hook. + """ + if not metadata_directory: + return None + metadata_parent = os.path.dirname(metadata_directory) + if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): + return None + + whl_files = glob(os.path.join(metadata_parent, '*.whl')) + if not whl_files: + print('Found wheel built marker, but no .whl files') + return None + if len(whl_files) > 1: + print('Found multiple .whl files; unspecified behaviour. ' + 'Will call build_wheel.') + return None + + # Exactly one .whl file + return whl_files[0] + + +def build_wheel(wheel_directory, config_settings, metadata_directory=None): + """Invoke the mandatory build_wheel hook. + + If a wheel was already built in the + prepare_metadata_for_build_wheel fallback, this + will copy it rather than rebuilding the wheel. + """ + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return _build_backend().build_wheel(wheel_directory, config_settings, + metadata_directory) + + +def build_editable(wheel_directory, config_settings, metadata_directory=None): + """Invoke the optional build_editable hook. + + If a wheel was already built in the + prepare_metadata_for_build_editable fallback, this + will copy it rather than rebuilding the wheel. + """ + backend = _build_backend() + try: + hook = backend.build_editable + except AttributeError: + raise HookMissing() + else: + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return hook(wheel_directory, config_settings, metadata_directory) + + +def get_requires_for_build_sdist(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_sdist + except AttributeError: + return [] + else: + return hook(config_settings) + + +class _DummyException(Exception): + """Nothing should ever raise this exception""" + + +class GotUnsupportedOperation(Exception): + """For internal use when backend raises UnsupportedOperation""" + def __init__(self, traceback): + self.traceback = traceback + + +def build_sdist(sdist_directory, config_settings): + """Invoke the mandatory build_sdist hook.""" + backend = _build_backend() + try: + return backend.build_sdist(sdist_directory, config_settings) + except getattr(backend, 'UnsupportedOperation', _DummyException): + raise GotUnsupportedOperation(traceback.format_exc()) + + +HOOK_NAMES = { + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'get_requires_for_build_editable', + 'prepare_metadata_for_build_editable', + 'build_editable', + 'get_requires_for_build_sdist', + 'build_sdist', + '_supported_features', +} + + +def main(): + if len(sys.argv) < 3: + sys.exit("Needs args: hook_name, control_dir") + hook_name = sys.argv[1] + control_dir = sys.argv[2] + if hook_name not in HOOK_NAMES: + sys.exit("Unknown hook: %s" % hook_name) + hook = globals()[hook_name] + + hook_input = read_json(pjoin(control_dir, 'input.json')) + + json_out = {'unsupported': False, 'return_val': None} + try: + json_out['return_val'] = hook(**hook_input['kwargs']) + except BackendUnavailable as e: + json_out['no_backend'] = True + json_out['traceback'] = e.traceback + except BackendInvalid as e: + json_out['backend_invalid'] = True + json_out['backend_error'] = e.message + except GotUnsupportedOperation as e: + json_out['unsupported'] = True + json_out['traceback'] = e.traceback + except HookMissing as e: + json_out['hook_missing'] = True + json_out['missing_hook_name'] = e.hook_name or hook_name + + write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + + +if __name__ == '__main__': + main() diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__init__.py b/.venv/Lib/site-packages/pip/_vendor/requests/__init__.py index 9e97059d..a4776248 100644 --- a/.venv/Lib/site-packages/pip/_vendor/requests/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/requests/__init__.py @@ -77,8 +77,8 @@ def check_compatibility(urllib3_version, chardet_version, charset_normalizer_ver elif charset_normalizer_version: major, minor, patch = charset_normalizer_version.split(".")[:3] major, minor, patch = int(major), int(minor), int(patch) - # charset_normalizer >= 2.0.0 < 3.0.0 - assert (2, 0, 0) <= (major, minor, patch) < (3, 0, 0) + # charset_normalizer >= 2.0.0 < 4.0.0 + assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) else: raise Exception("You need either charset_normalizer or chardet installed") diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc index b943e3a0..7b7e46dd 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc index 13ebb223..6f376b76 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc index 4076c2f5..f3b0f699 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc index 043617f8..059122ab 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc index 2e0c43c7..50c667d1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc index 75b87603..a7171f86 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc index b066d76e..3f54a4bd 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc index 58821b4f..c8db0824 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc index 86ef3956..cee3a993 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc index 4ac73e1b..1fd028d5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc index 691a3bfe..5f953824 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc index e4b98a93..a0722e17 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc index 16e2ba49..73cf912f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc index ddc24c0c..96f597ba 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc index c440c96d..ba0c5ee8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc index 690ce037..28f0cfe9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc index 366f396a..9d2e1d6a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc index 4252de92..70e837a4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__version__.py b/.venv/Lib/site-packages/pip/_vendor/requests/__version__.py index e725ada6..69be3dec 100644 --- a/.venv/Lib/site-packages/pip/_vendor/requests/__version__.py +++ b/.venv/Lib/site-packages/pip/_vendor/requests/__version__.py @@ -5,10 +5,10 @@ __title__ = "requests" __description__ = "Python HTTP for Humans." __url__ = "https://requests.readthedocs.io" -__version__ = "2.28.1" -__build__ = 0x022801 +__version__ = "2.28.2" +__build__ = 0x022802 __author__ = "Kenneth Reitz" __author_email__ = "me@kennethreitz.org" __license__ = "Apache 2.0" -__copyright__ = "Copyright 2022 Kenneth Reitz" +__copyright__ = "Copyright Kenneth Reitz" __cake__ = "\u2728 \U0001f370 \u2728" diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/models.py b/.venv/Lib/site-packages/pip/_vendor/requests/models.py index b45e8103..76e6f199 100644 --- a/.venv/Lib/site-packages/pip/_vendor/requests/models.py +++ b/.venv/Lib/site-packages/pip/_vendor/requests/models.py @@ -438,7 +438,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): if not scheme: raise MissingSchema( f"Invalid URL {url!r}: No scheme supplied. " - f"Perhaps you meant http://{url}?" + f"Perhaps you meant https://{url}?" ) if not host: diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py index ce05fd30..d92acc7b 100644 --- a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py @@ -11,7 +11,7 @@ __all__ = [ "ResolutionTooDeep", ] -__version__ = "0.8.1" +__version__ = "1.0.1" from .providers import AbstractProvider, AbstractResolver diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc index 9704f883..136a95cb 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc index a2d5b1ab..2a31be66 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc index 319429a5..43e7ba9b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc index 478369a4..b4b9826b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc index 1fe22a53..64131ff9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc index 85705593..a07ab68f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc index 481b0867..9f1e9385 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py b/.venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py index 7d0a9c22..e99d87ee 100644 --- a/.venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +++ b/.venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py @@ -1,5 +1,5 @@ class AbstractProvider(object): - """Delegate class to provide requirement interface for the resolver.""" + """Delegate class to provide the required interface for the resolver.""" def identify(self, requirement_or_candidate): """Given a requirement, return an identifier for it. @@ -24,9 +24,9 @@ class AbstractProvider(object): this group of arguments is. :param identifier: An identifier as returned by ``identify()``. This - identifies the dependency matches of which should be returned. + identifies the dependency matches which should be returned. :param resolutions: Mapping of candidates currently pinned by the - resolver. Each key is an identifier, and the value a candidate. + resolver. Each key is an identifier, and the value is a candidate. The candidate may conflict with requirements from ``information``. :param candidates: Mapping of each dependency's possible candidates. Each value is an iterator of candidates. @@ -39,10 +39,10 @@ class AbstractProvider(object): * ``requirement`` specifies a requirement contributing to the current list of candidates. - * ``parent`` specifies the candidate that provides (dependend on) the + * ``parent`` specifies the candidate that provides (depended on) the requirement, or ``None`` to indicate a root requirement. - The preference could depend on a various of issues, including (not + The preference could depend on various issues, including (not necessarily in this order): * Is this package pinned in the current resolution result? @@ -61,7 +61,7 @@ class AbstractProvider(object): raise NotImplementedError def find_matches(self, identifier, requirements, incompatibilities): - """Find all possible candidates that satisfy given constraints. + """Find all possible candidates that satisfy the given constraints. :param identifier: An identifier as returned by ``identify()``. This identifies the dependency matches of which should be returned. @@ -92,7 +92,7 @@ class AbstractProvider(object): def is_satisfied_by(self, requirement, candidate): """Whether the given requirement can be satisfied by a candidate. - The candidate is guarenteed to have been generated from the + The candidate is guaranteed to have been generated from the requirement. A boolean should be returned to indicate whether ``candidate`` is a diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py b/.venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py index 6695480f..688b5e10 100644 --- a/.venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +++ b/.venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py @@ -36,7 +36,7 @@ class BaseReporter(object): :param causes: The information on the collision that caused the backtracking. """ - def backtracking(self, candidate): + def rejecting_candidate(self, criterion, candidate): """Called when rejecting a candidate during backtracking.""" def pinning(self, candidate): diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py b/.venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py index 787681b0..2c3d0e30 100644 --- a/.venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py +++ b/.venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py @@ -1,4 +1,5 @@ import collections +import itertools import operator from .providers import AbstractResolver @@ -173,6 +174,31 @@ class Resolution(object): raise RequirementsConflicted(criterion) criteria[identifier] = criterion + def _remove_information_from_criteria(self, criteria, parents): + """Remove information from parents of criteria. + + Concretely, removes all values from each criterion's ``information`` + field that have one of ``parents`` as provider of the requirement. + + :param criteria: The criteria to update. + :param parents: Identifiers for which to remove information from all criteria. + """ + if not parents: + return + for key, criterion in criteria.items(): + criteria[key] = Criterion( + criterion.candidates, + [ + information + for information in criterion.information + if ( + information.parent is None + or self._p.identify(information.parent) not in parents + ) + ], + criterion.incompatibilities, + ) + def _get_preference(self, name): return self._p.get_preference( identifier=name, @@ -212,6 +238,7 @@ class Resolution(object): try: criteria = self._get_updated_criteria(candidate) except RequirementsConflicted as e: + self._r.rejecting_candidate(e.criterion, candidate) causes.append(e.criterion) continue @@ -240,8 +267,8 @@ class Resolution(object): # end, signal for backtracking. return causes - def _backtrack(self): - """Perform backtracking. + def _backjump(self, causes): + """Perform backjumping. When we enter here, the stack is like this:: @@ -257,22 +284,46 @@ class Resolution(object): Each iteration of the loop will: - 1. Discard Z. - 2. Discard Y but remember its incompatibility information gathered + 1. Identify Z. The incompatibility is not always caused by the latest + state. For example, given three requirements A, B and C, with + dependencies A1, B1 and C1, where A1 and B1 are incompatible: the + last state might be related to C, so we want to discard the + previous state. + 2. Discard Z. + 3. Discard Y but remember its incompatibility information gathered previously, and the failure we're dealing with right now. - 3. Push a new state Y' based on X, and apply the incompatibility + 4. Push a new state Y' based on X, and apply the incompatibility information from Y to Y'. - 4a. If this causes Y' to conflict, we need to backtrack again. Make Y' + 5a. If this causes Y' to conflict, we need to backtrack again. Make Y' the new Z and go back to step 2. - 4b. If the incompatibilities apply cleanly, end backtracking. + 5b. If the incompatibilities apply cleanly, end backtracking. """ + incompatible_reqs = itertools.chain( + (c.parent for c in causes if c.parent is not None), + (c.requirement for c in causes), + ) + incompatible_deps = {self._p.identify(r) for r in incompatible_reqs} while len(self._states) >= 3: # Remove the state that triggered backtracking. del self._states[-1] - # Retrieve the last candidate pin and known incompatibilities. - broken_state = self._states.pop() - name, candidate = broken_state.mapping.popitem() + # Ensure to backtrack to a state that caused the incompatibility + incompatible_state = False + while not incompatible_state: + # Retrieve the last candidate pin and known incompatibilities. + try: + broken_state = self._states.pop() + name, candidate = broken_state.mapping.popitem() + except (IndexError, KeyError): + raise ResolutionImpossible(causes) + current_dependencies = { + self._p.identify(d) + for d in self._p.get_dependencies(candidate) + } + incompatible_state = not current_dependencies.isdisjoint( + incompatible_deps + ) + incompatibilities_from_broken = [ (k, list(v.incompatibilities)) for k, v in broken_state.criteria.items() @@ -281,8 +332,6 @@ class Resolution(object): # Also mark the newly known incompatibility. incompatibilities_from_broken.append((name, [candidate])) - self._r.backtracking(candidate=candidate) - # Create a new state from the last known-to-work one, and apply # the previously gathered incompatibility information. def _patch_criteria(): @@ -368,22 +417,38 @@ class Resolution(object): self._r.ending(state=self.state) return self.state + # keep track of satisfied names to calculate diff after pinning + satisfied_names = set(self.state.criteria.keys()) - set( + unsatisfied_names + ) + # Choose the most preferred unpinned criterion to try. name = min(unsatisfied_names, key=self._get_preference) failure_causes = self._attempt_to_pin_criterion(name) if failure_causes: causes = [i for c in failure_causes for i in c.information] - # Backtrack if pinning fails. The backtrack process puts us in + # Backjump if pinning fails. The backjump process puts us in # an unpinned state, so we can work on it in the next round. self._r.resolving_conflicts(causes=causes) - success = self._backtrack() + success = self._backjump(causes) self.state.backtrack_causes[:] = causes # Dead ends everywhere. Give up. if not success: raise ResolutionImpossible(self.state.backtrack_causes) else: + # discard as information sources any invalidated names + # (unsatisfied names that were previously satisfied) + newly_unsatisfied_names = { + key + for key, criterion in self.state.criteria.items() + if key in satisfied_names + and not self._is_current_pin_satisfying(key, criterion) + } + self._remove_information_from_criteria( + self.state.criteria, newly_unsatisfied_names + ) # Pinning was successful. Push a new state to do another pin. self._push_new_state() diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py b/.venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py index 93d1568b..359a34f6 100644 --- a/.venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +++ b/.venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py @@ -117,13 +117,14 @@ class _FactoryIterableView(object): def __init__(self, factory): self._factory = factory + self._iterable = None def __repr__(self): - return "{}({})".format(type(self).__name__, list(self._factory())) + return "{}({})".format(type(self).__name__, list(self)) def __bool__(self): try: - next(self._factory()) + next(iter(self)) except StopIteration: return False return True @@ -131,7 +132,11 @@ class _FactoryIterableView(object): __nonzero__ = __bool__ # XXX: Python 2. def __iter__(self): - return self._factory() + iterable = ( + self._factory() if self._iterable is None else self._iterable + ) + self._iterable, current = itertools.tee(iterable) + return current class _SequenceIterableView(object): diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__init__.py b/.venv/Lib/site-packages/pip/_vendor/rich/__init__.py index d35875db..73f58d77 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/__init__.py @@ -5,7 +5,7 @@ from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union from ._extension import load_ipython_extension # noqa: F401 -__all__ = ["get_console", "reconfigure", "print", "inspect"] +__all__ = ["get_console", "reconfigure", "print", "inspect", "print_json"] if TYPE_CHECKING: from .console import Console @@ -40,7 +40,8 @@ def reconfigure(*args: Any, **kwargs: Any) -> None: """Reconfigures the global console by replacing it with another. Args: - console (Console): Replacement console instance. + *args (Any): Positional arguments for the replacement :class:`~rich.console.Console`. + **kwargs (Any): Keyword arguments for the replacement :class:`~rich.console.Console`. """ from pip._vendor.rich.console import Console @@ -80,7 +81,7 @@ def print_json( indent: Union[None, int, str] = 2, highlight: bool = True, skip_keys: bool = False, - ensure_ascii: bool = True, + ensure_ascii: bool = False, check_circular: bool = True, allow_nan: bool = True, default: Optional[Callable[[Any], Any]] = None, diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__main__.py b/.venv/Lib/site-packages/pip/_vendor/rich/__main__.py index 54e6d5e8..270629fd 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/__main__.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/__main__.py @@ -227,10 +227,6 @@ if __name__ == "__main__": # pragma: no cover c = Console(record=True) c.print(test_card) - # c.save_svg( - # path="/Users/darrenburns/Library/Application Support/JetBrains/PyCharm2021.3/scratches/svg_export.svg", - # title="Rich can export to SVG", - # ) print(f"rendered in {pre_cache_taken}ms (cold cache)") print(f"rendered in {taken}ms (warm cache)") @@ -247,10 +243,6 @@ if __name__ == "__main__": # pragma: no cover "Textualize", "[u blue link=https://github.com/textualize]https://github.com/textualize", ) - sponsor_message.add_row( - "Buy devs a :coffee:", - "[u blue link=https://ko-fi.com/textualize]https://ko-fi.com/textualize", - ) sponsor_message.add_row( "Twitter", "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc index b066c6dd..b5e85709 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc index 8d8bcfef..f65ba4cb 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc index 4c557feb..09ce68f7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc index b49b9f91..a9190a65 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc index 1a328a8b..2b3f25ac 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc index 6ff524c7..311d1d4d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc index cc3a12ed..a05e68a0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc new file mode 100644 index 00000000..10d82644 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc index 33ac7829..ff296d7b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc index aad21efb..50f1c504 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc index fa4afa1f..05325928 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc new file mode 100644 index 00000000..55023d72 Binary files /dev/null and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc index e64c41a8..00eebd31 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc index bdd10225..5edf1f4b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc index 2be2f19e..a52cb02f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc index 675a53d2..b8c1cc05 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc index 8458c1b8..5e9a72aa 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc index 062ae776..c7ae6356 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc index 5a6205ec..8737bf76 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc index 16ef6aa7..468ba666 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc index 7419c121..1bcbe43c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc index 694a40e2..65814747 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc index 2244f020..f3673f11 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc index 703d2ddc..47392b15 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc index 804e7250..d96f69a9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc index 104181a6..77920551 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc index 0faf7e66..d85c1d24 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc index fa556473..ad5dc801 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc index fab978f5..e71aef92 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc index 7c05f8a7..a0a3ab8b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc index e6443185..1f0477b6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc index 6004f981..86dd1130 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc index 51752ae9..a110e3b8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc index 093fc725..e77d7208 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc index e274d1a1..fbff516e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc index ac1ec6f0..dc7387be 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc index 0e456a4b..a75905be 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc index 973fdf8a..2ce7a559 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc index d07d7607..bf3d3f88 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc index fa97f402..cf388322 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc index 4e1923c0..83378a6b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc index 97f018fa..6aa7b8dc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc index 137024f5..9da64d94 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc index a287992c..47e36121 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc index 84c0e705..f9979857 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc index d4a7955e..c2f1da36 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc index b87d2689..cbadda1f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc index f1e5856c..d3ae8be6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc index 37ffd6ac..cab84013 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc index bdba3210..5317cf35 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc index 4057d364..668c3c5b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc index 7ab40af9..d094ecdc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc index bc08ec90..50ed86c3 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc index f419f85b..201a6115 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc index 06c3251d..0c9a1199 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc index 2d89111c..7876bba0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc index 722c3249..9fb35bc8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc index 6ffcef06..06d5219c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc index 1d839f49..c877d000 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc index ca98f04c..abf7bf80 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc index 107b05b3..a62aaa73 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc index be910973..58a07fc0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc index 97021447..09c75c79 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc index 80be8226..f7ee8711 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc index 0f6d409c..e66977a5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc index b8fd1c23..88a6bbc6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc index a5d7d400..03cecf03 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc index aefe53ea..faa4b436 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc index f92236f8..0cf8133a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc index 378d4d3d..3ed5271a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc index 806cdd78..5cc44bad 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc index da0fe8d2..87ab8e74 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc index 2724f904..f39e8b4f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc index 626c6446..b8a45429 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc index b0c1579a..7728c7c5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc index c2792495..ecaa2aab 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc index d8e92cde..9dfec199 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/_export_format.py b/.venv/Lib/site-packages/pip/_vendor/rich/_export_format.py index b79c1306..094d2dc2 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/_export_format.py @@ -12,9 +12,7 @@ body {{ - -
{code}
-
+
{code}
""" diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/_fileno.py b/.venv/Lib/site-packages/pip/_vendor/rich/_fileno.py new file mode 100644 index 00000000..b17ee651 --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/rich/_fileno.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from typing import IO, Callable + + +def get_fileno(file_like: IO[str]) -> int | None: + """Get fileno() from a file, accounting for poorly implemented file-like objects. + + Args: + file_like (IO): A file-like object. + + Returns: + int | None: The result of fileno if available, or None if operation failed. + """ + fileno: Callable[[], int] | None = getattr(file_like, "fileno", None) + if fileno is not None: + try: + return fileno() + except Exception: + # `fileno` is documented as potentially raising a OSError + # Alas, from the issues, there are so many poorly implemented file-like objects, + # that `fileno()` can raise just about anything. + return None + return None diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/_null_file.py b/.venv/Lib/site-packages/pip/_vendor/rich/_null_file.py new file mode 100644 index 00000000..b659673e --- /dev/null +++ b/.venv/Lib/site-packages/pip/_vendor/rich/_null_file.py @@ -0,0 +1,69 @@ +from types import TracebackType +from typing import IO, Iterable, Iterator, List, Optional, Type + + +class NullFile(IO[str]): + def close(self) -> None: + pass + + def isatty(self) -> bool: + return False + + def read(self, __n: int = 1) -> str: + return "" + + def readable(self) -> bool: + return False + + def readline(self, __limit: int = 1) -> str: + return "" + + def readlines(self, __hint: int = 1) -> List[str]: + return [] + + def seek(self, __offset: int, __whence: int = 1) -> int: + return 0 + + def seekable(self) -> bool: + return False + + def tell(self) -> int: + return 0 + + def truncate(self, __size: Optional[int] = 1) -> int: + return 0 + + def writable(self) -> bool: + return False + + def writelines(self, __lines: Iterable[str]) -> None: + pass + + def __next__(self) -> str: + return "" + + def __iter__(self) -> Iterator[str]: + return iter([""]) + + def __enter__(self) -> IO[str]: + pass + + def __exit__( + self, + __t: Optional[Type[BaseException]], + __value: Optional[BaseException], + __traceback: Optional[TracebackType], + ) -> None: + pass + + def write(self, text: str) -> int: + return 0 + + def flush(self) -> None: + pass + + def fileno(self) -> int: + return -1 + + +NULL_FILE = NullFile() diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/align.py b/.venv/Lib/site-packages/pip/_vendor/rich/align.py index d5abb594..c310b66e 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/align.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/align.py @@ -303,7 +303,7 @@ if __name__ == "__main__": # pragma: no cover ), width=60, style="on dark_blue", - title="Algin", + title="Align", ) console.print( diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/ansi.py b/.venv/Lib/site-packages/pip/_vendor/rich/ansi.py index d4c32cef..66365e65 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/ansi.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/ansi.py @@ -43,6 +43,9 @@ def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: if start > position: yield _AnsiToken(ansi_text[position:start]) if sgr: + if sgr == "(": + position = end + 1 + continue if sgr.endswith("m"): yield _AnsiToken("", sgr[1:-1], osc) else: @@ -120,7 +123,7 @@ class AnsiDecoder: self.style = Style.null() def decode(self, terminal_text: str) -> Iterable[Text]: - """Decode ANSI codes in an interable of lines. + """Decode ANSI codes in an iterable of lines. Args: lines (Iterable[str]): An iterable of lines of terminal output. diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/box.py b/.venv/Lib/site-packages/pip/_vendor/rich/box.py index d0b07cf5..97d2a944 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/box.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/box.py @@ -514,4 +514,4 @@ if __name__ == "__main__": # pragma: no cover columns.add_renderable(table) console.print(columns) - # console.save_html("box.html", inline_styles=True) + # console.save_svg("box.svg") diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/cells.py b/.venv/Lib/site-packages/pip/_vendor/rich/cells.py index 139b949f..9354f9e3 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/cells.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/cells.py @@ -60,7 +60,7 @@ def _get_codepoint_cell_size(codepoint: int) -> int: """Get the cell size of a character. Args: - character (str): A single character. + codepoint (int): Codepoint of a character. Returns: int: Number of cells (0, 1 or 2) occupied by that character. diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/color.py b/.venv/Lib/site-packages/pip/_vendor/rich/color.py index 6bca2da9..dfe45593 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/color.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/color.py @@ -29,6 +29,9 @@ class ColorSystem(IntEnum): def __repr__(self) -> str: return f"ColorSystem.{self.name}" + def __str__(self) -> str: + return repr(self) + class ColorType(IntEnum): """Type of color stored in Color class.""" @@ -310,7 +313,7 @@ class Color(NamedTuple): """A triplet of color components, if an RGB color.""" def __rich__(self) -> "Text": - """Dispays the actual color if Rich printed.""" + """Displays the actual color if Rich printed.""" from .style import Style from .text import Text @@ -510,15 +513,14 @@ class Color(NamedTuple): def downgrade(self, system: ColorSystem) -> "Color": """Downgrade a color system to a system with fewer colors.""" - if self.type in [ColorType.DEFAULT, system]: + if self.type in (ColorType.DEFAULT, system): return self # Convert to 8-bit color from truecolor color if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: assert self.triplet is not None - red, green, blue = self.triplet.normalized - _h, l, s = rgb_to_hls(red, green, blue) - # If saturation is under 10% assume it is grayscale - if s < 0.1: + _h, l, s = rgb_to_hls(*self.triplet.normalized) + # If saturation is under 15% assume it is grayscale + if s < 0.15: gray = round(l * 25.0) if gray == 0: color_number = 16 @@ -528,8 +530,13 @@ class Color(NamedTuple): color_number = 231 + gray return Color(self.name, ColorType.EIGHT_BIT, number=color_number) + red, green, blue = self.triplet + six_red = red / 95 if red < 95 else 1 + (red - 95) / 40 + six_green = green / 95 if green < 95 else 1 + (green - 95) / 40 + six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40 + color_number = ( - 16 + 36 * round(red * 5.0) + 6 * round(green * 5.0) + round(blue * 5.0) + 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue) ) return Color(self.name, ColorType.EIGHT_BIT, number=color_number) diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/console.py b/.venv/Lib/site-packages/pip/_vendor/rich/console.py index 93a10b0b..7c363dfd 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/console.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/console.py @@ -1,5 +1,4 @@ import inspect -import io import os import platform import sys @@ -34,6 +33,8 @@ from typing import ( cast, ) +from pip._vendor.rich._null_file import NULL_FILE + if sys.version_info >= (3, 8): from typing import Literal, Protocol, runtime_checkable else: @@ -46,6 +47,7 @@ else: from . import errors, themes from ._emoji_replace import _emoji_replace from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT +from ._fileno import get_fileno from ._log_render import FormatTimeCallable, LogRender from .align import Align, AlignMethod from .color import ColorSystem, blend_rgb @@ -104,7 +106,11 @@ _STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) _STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) -_TERM_COLORS = {"256color": ColorSystem.EIGHT_BIT, "16color": ColorSystem.STANDARD} +_TERM_COLORS = { + "kitty": ColorSystem.EIGHT_BIT, + "256color": ColorSystem.EIGHT_BIT, + "16color": ColorSystem.STANDARD, +} class ConsoleDimensions(NamedTuple): @@ -516,7 +522,11 @@ def _is_jupyter() -> bool: # pragma: no cover return False ipython = get_ipython() # type: ignore[name-defined] shell = ipython.__class__.__name__ - if "google.colab" in str(ipython.__class__) or shell == "ZMQInteractiveShell": + if ( + "google.colab" in str(ipython.__class__) + or os.getenv("DATABRICKS_RUNTIME_VERSION") + or shell == "ZMQInteractiveShell" + ): return True # Jupyter notebook or qtconsole elif shell == "TerminalInteractiveShell": return False # Terminal running IPython @@ -697,7 +707,11 @@ class Console: self._height = height self._color_system: Optional[ColorSystem] - self._force_terminal = force_terminal + + self._force_terminal = None + if force_terminal is not None: + self._force_terminal = force_terminal + self._file = file self.quiet = quiet self.stderr = stderr @@ -739,13 +753,15 @@ class Console: self._is_alt_screen = False def __repr__(self) -> str: - return f"" + return f"" @property def file(self) -> IO[str]: """Get the file object to write to.""" file = self._file or (sys.stderr if self.stderr else sys.stdout) file = getattr(file, "rich_proxied_file", file) + if file is None: + file = NULL_FILE return file @file.setter @@ -928,6 +944,15 @@ class Console: # Return False for Idle which claims to be a tty but can't handle ansi codes return False + if self.is_jupyter: + # return False for Jupyter, which may have FORCE_COLOR set + return False + + # If FORCE_COLOR env var has any value at all, we assume a terminal. + force_color = self._environ.get("FORCE_COLOR") + if force_color is not None: + self._force_terminal = True + isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) try: return False if isatty is None else isatty() @@ -1125,7 +1150,7 @@ class Console: status: RenderableType, *, spinner: str = "dots", - spinner_style: str = "status.spinner", + spinner_style: StyleType = "status.spinner", speed: float = 1.0, refresh_per_second: float = 12.5, ) -> "Status": @@ -1502,7 +1527,7 @@ class Console: if text: sep_text = Text(sep, justify=justify, end=end) append(sep_text.join(text)) - del text[:] + text.clear() for renderable in objects: renderable = rich_cast(renderable) @@ -1701,7 +1726,7 @@ class Console: indent: Union[None, int, str] = 2, highlight: bool = True, skip_keys: bool = False, - ensure_ascii: bool = True, + ensure_ascii: bool = False, check_circular: bool = True, allow_nan: bool = True, default: Optional[Callable[[Any], Any]] = None, @@ -1985,31 +2010,50 @@ class Console: if WINDOWS: use_legacy_windows_render = False if self.legacy_windows: - try: + fileno = get_fileno(self.file) + if fileno is not None: use_legacy_windows_render = ( - self.file.fileno() in _STD_STREAMS_OUTPUT + fileno in _STD_STREAMS_OUTPUT ) - except (ValueError, io.UnsupportedOperation): - pass if use_legacy_windows_render: from pip._vendor.rich._win32_console import LegacyWindowsTerm from pip._vendor.rich._windows_renderer import legacy_windows_render - legacy_windows_render( - self._buffer[:], LegacyWindowsTerm(self.file) - ) + buffer = self._buffer[:] + if self.no_color and self._color_system: + buffer = list(Segment.remove_color(buffer)) + + legacy_windows_render(buffer, LegacyWindowsTerm(self.file)) else: # Either a non-std stream on legacy Windows, or modern Windows. text = self._render_buffer(self._buffer[:]) # https://bugs.python.org/issue37871 + # https://github.com/python/cpython/issues/82052 + # We need to avoid writing more than 32Kb in a single write, due to the above bug write = self.file.write - for line in text.splitlines(True): - try: - write(line) - except UnicodeEncodeError as error: - error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" - raise + # Worse case scenario, every character is 4 bytes of utf-8 + MAX_WRITE = 32 * 1024 // 4 + try: + if len(text) <= MAX_WRITE: + write(text) + else: + batch: List[str] = [] + batch_append = batch.append + size = 0 + for line in text.splitlines(True): + if size + len(line) > MAX_WRITE and batch: + write("".join(batch)) + batch.clear() + size = 0 + batch_append(line) + size += len(line) + if batch: + write("".join(batch)) + batch.clear() + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise else: text = self._render_buffer(self._buffer[:]) try: @@ -2238,18 +2282,24 @@ class Console: theme: Optional[TerminalTheme] = None, clear: bool = True, code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, ) -> str: """ Generate an SVG from the console contents (requires record=True in Console constructor). Args: - path (str): The path to write the SVG to. - title (str): The title of the tab in the output image + title (str, optional): The title of the tab in the output image theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str): Format string used to generate the SVG. Rich will inject a number of variables + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables into the string in order to form the final SVG output. The default template used and the variables injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. """ from pip._vendor.rich.cells import cell_len @@ -2293,7 +2343,7 @@ class Console: width = self.width char_height = 20 - char_width = char_height * 0.61 + char_width = char_height * font_aspect_ratio line_height = char_height * 1.22 margin_top = 1 @@ -2345,14 +2395,16 @@ class Console: if clear: self._record_buffer.clear() - unique_id = "terminal-" + str( - zlib.adler32( - ("".join(segment.text for segment in segments)).encode( - "utf-8", "ignore" + if unique_id is None: + unique_id = "terminal-" + str( + zlib.adler32( + ("".join(repr(segment) for segment in segments)).encode( + "utf-8", + "ignore", + ) + + title.encode("utf-8", "ignore") ) - + title.encode("utf-8", "ignore") ) - ) y = 0 for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): x = 0 @@ -2482,23 +2534,32 @@ class Console: theme: Optional[TerminalTheme] = None, clear: bool = True, code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, ) -> None: """Generate an SVG file from the console contents (requires record=True in Console constructor). Args: path (str): The path to write the SVG to. - title (str): The title of the tab in the output image + title (str, optional): The title of the tab in the output image theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str): Format string used to generate the SVG. Rich will inject a number of variables + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables into the string in order to form the final SVG output. The default template used and the variables injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. """ svg = self.export_svg( title=title, theme=theme, clear=clear, code_format=code_format, + font_aspect_ratio=font_aspect_ratio, + unique_id=unique_id, ) with open(path, "wt", encoding="utf-8") as write_file: write_file.write(svg) diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/default_styles.py b/.venv/Lib/site-packages/pip/_vendor/rich/default_styles.py index 46e9ea52..dca37193 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/default_styles.py @@ -138,10 +138,11 @@ DEFAULT_STYLES: Dict[str, Style] = { "tree.line": Style(), "markdown.paragraph": Style(), "markdown.text": Style(), - "markdown.emph": Style(italic=True), + "markdown.em": Style(italic=True), + "markdown.emph": Style(italic=True), # For commonmark backwards compatibility "markdown.strong": Style(bold=True), - "markdown.code": Style(bgcolor="black", color="bright_white"), - "markdown.code_block": Style(dim=True, color="cyan", bgcolor="black"), + "markdown.code": Style(bold=True, color="cyan", bgcolor="black"), + "markdown.code_block": Style(color="cyan", bgcolor="black"), "markdown.block_quote": Style(color="magenta"), "markdown.list": Style(color="cyan"), "markdown.item": Style(), @@ -157,7 +158,8 @@ DEFAULT_STYLES: Dict[str, Style] = { "markdown.h6": Style(italic=True), "markdown.h7": Style(italic=True, dim=True), "markdown.link": Style(color="bright_blue"), - "markdown.link_url": Style(color="blue"), + "markdown.link_url": Style(color="blue", underline=True), + "markdown.s": Style(strike=True), "iso8601.date": Style(color="blue"), "iso8601.time": Style(color="magenta"), "iso8601.timezone": Style(color="yellow"), diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py b/.venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py index cc69f22f..4b0b0da6 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py @@ -34,7 +34,7 @@ class FileProxy(io.TextIOBase): line, new_line, text = text.partition("\n") if new_line: lines.append("".join(buffer) + line) - del buffer[:] + buffer.clear() else: buffer.append(line) break @@ -52,3 +52,6 @@ class FileProxy(io.TextIOBase): if output: self.__console.print(output) del self.__buffer[:] + + def fileno(self) -> int: + return self.__file.fileno() diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/filesize.py b/.venv/Lib/site-packages/pip/_vendor/rich/filesize.py index 61be4751..99f118e2 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/filesize.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/filesize.py @@ -2,7 +2,7 @@ """Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2 The functions declared in this module should cover the different -usecases needed to generate a string representation of a file size +use cases needed to generate a string representation of a file size using several different units. Since there are many standards regarding file size units, three different functions have been implemented. diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/highlighter.py b/.venv/Lib/site-packages/pip/_vendor/rich/highlighter.py index 82293dff..c2646794 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/highlighter.py @@ -82,7 +82,7 @@ class ReprHighlighter(RegexHighlighter): base_style = "repr." highlights = [ - r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*?)(?P>)", + r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*)(?P>)", r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?', r"(?P[][{}()])", _combine_regex( diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/json.py b/.venv/Lib/site-packages/pip/_vendor/rich/json.py index 23583871..ea94493f 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/json.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/json.py @@ -1,3 +1,4 @@ +from pathlib import Path from json import loads, dumps from typing import Any, Callable, Optional, Union @@ -27,7 +28,7 @@ class JSON: indent: Union[None, int, str] = 2, highlight: bool = True, skip_keys: bool = False, - ensure_ascii: bool = True, + ensure_ascii: bool = False, check_circular: bool = True, allow_nan: bool = True, default: Optional[Callable[[Any], Any]] = None, @@ -56,7 +57,7 @@ class JSON: indent: Union[None, int, str] = 2, highlight: bool = True, skip_keys: bool = False, - ensure_ascii: bool = True, + ensure_ascii: bool = False, check_circular: bool = True, allow_nan: bool = True, default: Optional[Callable[[Any], Any]] = None, @@ -131,8 +132,7 @@ if __name__ == "__main__": if args.path == "-": json_data = sys.stdin.read() else: - with open(args.path, "rt") as json_file: - json_data = json_file.read() + json_data = Path(args.path).read_text() except Exception as error: error_console.print(f"Unable to read {args.path!r}; {error}") sys.exit(-1) diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/layout.py b/.venv/Lib/site-packages/pip/_vendor/rich/layout.py index 1d704652..849356ea 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/layout.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/layout.py @@ -20,8 +20,8 @@ from .console import Console, ConsoleOptions, RenderableType, RenderResult from .highlighter import ReprHighlighter from .panel import Panel from .pretty import Pretty -from .repr import rich_repr, Result from .region import Region +from .repr import Result, rich_repr from .segment import Segment from .style import StyleType @@ -162,7 +162,6 @@ class Layout: minimum_size: int = 1, ratio: int = 1, visible: bool = True, - height: Optional[int] = None, ) -> None: self._renderable = renderable or _Placeholder(self) self.size = size @@ -170,7 +169,6 @@ class Layout: self.ratio = ratio self.name = name self.visible = visible - self.height = height self.splitter: Splitter = self.splitters["column"]() self._children: List[Layout] = [] self._render_map: RenderMap = {} diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/live.py b/.venv/Lib/site-packages/pip/_vendor/rich/live.py index e635fe5c..3ebbbc4c 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/live.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/live.py @@ -210,6 +210,8 @@ class Live(JupyterMixin, RenderHook): renderable (RenderableType): New renderable to use. refresh (bool, optional): Refresh the display. Defaults to False. """ + if isinstance(renderable, str): + renderable = self.console.render_str(renderable) with self._lock: self._renderable = renderable if refresh: diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/logging.py b/.venv/Lib/site-packages/pip/_vendor/rich/logging.py index 58188fd8..91368dda 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/logging.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/logging.py @@ -3,10 +3,12 @@ from datetime import datetime from logging import Handler, LogRecord from pathlib import Path from types import ModuleType -from typing import ClassVar, List, Optional, Iterable, Type, Union +from typing import ClassVar, Iterable, List, Optional, Type, Union + +from pip._vendor.rich._null_file import NullFile from . import get_console -from ._log_render import LogRender, FormatTimeCallable +from ._log_render import FormatTimeCallable, LogRender from .console import Console, ConsoleRenderable from .highlighter import Highlighter, ReprHighlighter from .text import Text @@ -158,16 +160,23 @@ class RichHandler(Handler): log_renderable = self.render( record=record, traceback=traceback, message_renderable=message_renderable ) - try: - self.console.print(log_renderable) - except Exception: + if isinstance(self.console.file, NullFile): + # Handles pythonw, where stdout/stderr are null, and we return NullFile + # instance from Console.file. In this case, we still want to make a log record + # even though we won't be writing anything to a file. self.handleError(record) + else: + try: + self.console.print(log_renderable) + except Exception: + self.handleError(record) def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable": """Render message text in to Text. - record (LogRecord): logging Record. - message (str): String containing log message. + Args: + record (LogRecord): logging Record. + message (str): String containing log message. Returns: ConsoleRenderable: Renderable to display log message. diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/panel.py b/.venv/Lib/site-packages/pip/_vendor/rich/panel.py index fc2807c3..d522d80b 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/panel.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/panel.py @@ -2,11 +2,12 @@ from typing import TYPE_CHECKING, Optional from .align import AlignMethod from .box import ROUNDED, Box +from .cells import cell_len from .jupyter import JupyterMixin from .measure import Measurement, measure_renderables from .padding import Padding, PaddingDimensions from .segment import Segment -from .style import StyleType +from .style import Style, StyleType from .text import Text, TextType if TYPE_CHECKING: @@ -149,9 +150,53 @@ class Panel(JupyterMixin): safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box box = self.box.substitute(options, safe=safe_box) + def align_text( + text: Text, width: int, align: str, character: str, style: Style + ) -> Text: + """Gets new aligned text. + + Args: + text (Text): Title or subtitle text. + width (int): Desired width. + align (str): Alignment. + character (str): Character for alignment. + style (Style): Border style + + Returns: + Text: New text instance + """ + text = text.copy() + text.truncate(width) + excess_space = width - cell_len(text.plain) + if excess_space: + if align == "left": + return Text.assemble( + text, + (character * excess_space, style), + no_wrap=True, + end="", + ) + elif align == "center": + left = excess_space // 2 + return Text.assemble( + (character * left, style), + text, + (character * (excess_space - left), style), + no_wrap=True, + end="", + ) + else: + return Text.assemble( + (character * excess_space, style), + text, + no_wrap=True, + end="", + ) + return text + title_text = self._title if title_text is not None: - title_text.style = border_style + title_text.stylize_before(border_style) child_width = ( width - 2 @@ -180,7 +225,13 @@ class Panel(JupyterMixin): if title_text is None or width <= 4: yield Segment(box.get_top([width - 2]), border_style) else: - title_text.align(self.title_align, width - 4, character=box.top) + title_text = align_text( + title_text, + width - 4, + self.title_align, + box.top, + border_style, + ) yield Segment(box.top_left + box.top, border_style) yield from console.render(title_text, child_options.update_width(width - 4)) yield Segment(box.top + box.top_right, border_style) @@ -194,12 +245,18 @@ class Panel(JupyterMixin): subtitle_text = self._subtitle if subtitle_text is not None: - subtitle_text.style = border_style + subtitle_text.stylize_before(border_style) if subtitle_text is None or width <= 4: yield Segment(box.get_bottom([width - 2]), border_style) else: - subtitle_text.align(self.subtitle_align, width - 4, character=box.bottom) + subtitle_text = align_text( + subtitle_text, + width - 4, + self.subtitle_align, + box.bottom, + border_style, + ) yield Segment(box.bottom_left + box.bottom, border_style) yield from console.render( subtitle_text, child_options.update_width(width - 4) diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/pretty.py b/.venv/Lib/site-packages/pip/_vendor/rich/pretty.py index 4a5ddaaf..2bd9eb00 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/pretty.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/pretty.py @@ -30,7 +30,7 @@ from pip._vendor.rich.repr import RichReprResult try: import attr as _attr_module - _has_attrs = True + _has_attrs = hasattr(_attr_module, "ib") except ImportError: # pragma: no cover _has_attrs = False @@ -55,13 +55,6 @@ if TYPE_CHECKING: ) -JUPYTER_CLASSES_TO_NOT_RENDER = { - # Matplotlib "Artists" manage their own rendering in a Jupyter notebook, and we should not try to render them too. - # "Typically, all [Matplotlib] visible elements in a figure are subclasses of Artist." - "matplotlib.artist.Artist", -} - - def _is_attr_object(obj: Any) -> bool: """Check if an object was created with attrs module.""" return _has_attrs and _attr_module.has(type(obj)) @@ -120,69 +113,42 @@ def _ipy_display_hook( indent_guides: bool = False, max_length: Optional[int] = None, max_string: Optional[int] = None, + max_depth: Optional[int] = None, expand_all: bool = False, -) -> None: +) -> Union[str, None]: # needed here to prevent circular import: - from ._inspect import is_object_one_of_types from .console import ConsoleRenderable # always skip rich generated jupyter renderables or None values if _safe_isinstance(value, JupyterRenderable) or value is None: - return + return None console = console or get_console() - if console.is_jupyter: - # Delegate rendering to IPython if the object (and IPython) supports it - # https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display - ipython_repr_methods = [ - "_repr_html_", - "_repr_markdown_", - "_repr_json_", - "_repr_latex_", - "_repr_jpeg_", - "_repr_png_", - "_repr_svg_", - "_repr_mimebundle_", - ] - for repr_method in ipython_repr_methods: - method = getattr(value, repr_method, None) - if inspect.ismethod(method): - # Calling the method ourselves isn't ideal. The interface for the `_repr_*_` methods - # specifies that if they return None, then they should not be rendered - # by the notebook. - try: - repr_result = method() - except Exception: - continue # If the method raises, treat it as if it doesn't exist, try any others - if repr_result is not None: - return # Delegate rendering to IPython - # When in a Jupyter notebook let's avoid the display of some specific classes, - # as they result in the rendering of useless and noisy lines such as `
`. - # What does this do? - # --> if the class has "matplotlib.artist.Artist" in its hierarchy for example, we don't render it. - if is_object_one_of_types(value, JUPYTER_CLASSES_TO_NOT_RENDER): - return - - # certain renderables should start on a new line - if _safe_isinstance(value, ConsoleRenderable): - console.line() - - console.print( - value - if _safe_isinstance(value, RichRenderable) - else Pretty( - value, - overflow=overflow, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - expand_all=expand_all, - margin=12, - ), - crop=crop, - new_line_start=True, - ) + with console.capture() as capture: + # certain renderables should start on a new line + if _safe_isinstance(value, ConsoleRenderable): + console.line() + console.print( + value + if _safe_isinstance(value, RichRenderable) + else Pretty( + value, + overflow=overflow, + indent_guides=indent_guides, + max_length=max_length, + max_string=max_string, + max_depth=max_depth, + expand_all=expand_all, + margin=12, + ), + crop=crop, + new_line_start=True, + end="", + ) + # strip trailing newline, not usually part of a text repr + # I'm not sure if this should be prevented at a lower level + return capture.get().rstrip("\n") def _safe_isinstance( @@ -202,6 +168,7 @@ def install( indent_guides: bool = False, max_length: Optional[int] = None, max_string: Optional[int] = None, + max_depth: Optional[int] = None, expand_all: bool = False, ) -> None: """Install automatic pretty printing in the Python REPL. @@ -214,6 +181,7 @@ def install( max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to None. max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. + max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None. expand_all (bool, optional): Expand all containers. Defaults to False. max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. """ @@ -236,13 +204,14 @@ def install( indent_guides=indent_guides, max_length=max_length, max_string=max_string, + max_depth=max_depth, expand_all=expand_all, ), crop=crop, ) builtins._ = value # type: ignore[attr-defined] - try: # pragma: no cover + if "get_ipython" in globals(): ip = get_ipython() # type: ignore[name-defined] from IPython.core.formatters import BaseFormatter @@ -258,6 +227,7 @@ def install( indent_guides=indent_guides, max_length=max_length, max_string=max_string, + max_depth=max_depth, expand_all=expand_all, ) else: @@ -266,7 +236,7 @@ def install( # replace plain text formatter with rich formatter rich_formatter = RichFormatter() ip.display_formatter.formatters["text/plain"] = rich_formatter - except Exception: + else: sys.displayhook = display_hook @@ -333,7 +303,7 @@ class Pretty(JupyterMixin): max_depth=self.max_depth, expand_all=self.expand_all, ) - pretty_text = Text( + pretty_text = Text.from_ansi( pretty_str, justify=self.justify or options.justify, overflow=self.overflow or options.overflow, @@ -365,6 +335,7 @@ class Pretty(JupyterMixin): indent_size=self.indent_size, max_length=self.max_length, max_string=self.max_string, + max_depth=self.max_depth, expand_all=self.expand_all, ) text_width = ( @@ -427,7 +398,7 @@ class Node: is_tuple: bool = False is_namedtuple: bool = False children: Optional[List["Node"]] = None - key_separator = ": " + key_separator: str = ": " separator: str = ", " def iter_tokens(self) -> Iterable[str]: @@ -630,8 +601,12 @@ def traverse( def _traverse(obj: Any, root: bool = False, depth: int = 0) -> Node: """Walk the object depth first.""" + obj_id = id(obj) + if obj_id in visited_ids: + # Recursion detected + return Node(value_repr="...") + obj_type = type(obj) - py_version = (sys.version_info.major, sys.version_info.minor) children: List[Node] reached_max_depth = max_depth is not None and depth >= max_depth @@ -667,6 +642,7 @@ def traverse( pass if rich_repr_result is not None: + push_visited(obj_id) angular = getattr(obj.__rich_repr__, "angular", False) args = list(iter_rich_args(rich_repr_result)) class_name = obj.__class__.__name__ @@ -676,7 +652,10 @@ def traverse( append = children.append if reached_max_depth: - node = Node(value_repr=f"...") + if angular: + node = Node(value_repr=f"<{class_name}...>") + else: + node = Node(value_repr=f"{class_name}(...)") else: if angular: node = Node( @@ -711,14 +690,16 @@ def traverse( children=[], last=root, ) + pop_visited(obj_id) elif _is_attr_object(obj) and not fake_attributes: + push_visited(obj_id) children = [] append = children.append attr_fields = _get_attr_fields(obj) if attr_fields: if reached_max_depth: - node = Node(value_repr=f"...") + node = Node(value_repr=f"{obj.__class__.__name__}(...)") else: node = Node( open_brace=f"{obj.__class__.__name__}(", @@ -758,29 +739,25 @@ def traverse( node = Node( value_repr=f"{obj.__class__.__name__}()", children=[], last=root ) - + pop_visited(obj_id) elif ( is_dataclass(obj) and not _safe_isinstance(obj, type) and not fake_attributes - and (_is_dataclass_repr(obj) or py_version == (3, 6)) + and _is_dataclass_repr(obj) ): - obj_id = id(obj) - if obj_id in visited_ids: - # Recursion detected - return Node(value_repr="...") push_visited(obj_id) - children = [] append = children.append if reached_max_depth: - node = Node(value_repr=f"...") + node = Node(value_repr=f"{obj.__class__.__name__}(...)") else: node = Node( open_brace=f"{obj.__class__.__name__}(", close_brace=")", children=children, last=root, + empty=f"{obj.__class__.__name__}()", ) for last, field in loop_last( @@ -792,42 +769,43 @@ def traverse( child_node.key_separator = "=" append(child_node) - pop_visited(obj_id) + pop_visited(obj_id) elif _is_namedtuple(obj) and _has_default_namedtuple_repr(obj): + push_visited(obj_id) + class_name = obj.__class__.__name__ if reached_max_depth: - node = Node(value_repr="...") + # If we've reached the max depth, we still show the class name, but not its contents + node = Node( + value_repr=f"{class_name}(...)", + ) else: children = [] - class_name = obj.__class__.__name__ + append = children.append node = Node( open_brace=f"{class_name}(", close_brace=")", children=children, empty=f"{class_name}()", ) - append = children.append for last, (key, value) in loop_last(obj._asdict().items()): child_node = _traverse(value, depth=depth + 1) child_node.key_repr = key child_node.last = last child_node.key_separator = "=" append(child_node) + pop_visited(obj_id) elif _safe_isinstance(obj, _CONTAINERS): for container_type in _CONTAINERS: if _safe_isinstance(obj, container_type): obj_type = container_type break - obj_id = id(obj) - if obj_id in visited_ids: - # Recursion detected - return Node(value_repr="...") push_visited(obj_id) open_brace, close_brace, empty = _BRACES[obj_type](obj) if reached_max_depth: - node = Node(value_repr=f"...", last=root) + node = Node(value_repr=f"{open_brace}...{close_brace}") elif obj_type.__repr__ != type(obj).__repr__: node = Node(value_repr=to_repr(obj), last=root) elif obj: @@ -1007,4 +985,10 @@ if __name__ == "__main__": # pragma: no cover from pip._vendor.rich import print - print(Pretty(data, indent_guides=True, max_string=20)) + # print(Pretty(data, indent_guides=True, max_string=20)) + + class Thing: + def __repr__(self) -> str: + return "Hello\x1b[38;5;239m World!" + + print(Pretty(Thing())) diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/progress.py b/.venv/Lib/site-packages/pip/_vendor/rich/progress.py index 92cfa802..8b0a315f 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/progress.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/progress.py @@ -4,12 +4,12 @@ import typing import warnings from abc import ABC, abstractmethod from collections import deque -from collections.abc import Sized from dataclasses import dataclass, field from datetime import timedelta from io import RawIOBase, UnsupportedOperation from math import ceil from mmap import mmap +from operator import length_hint from os import PathLike, stat from threading import Event, RLock, Thread from types import TracebackType @@ -129,7 +129,7 @@ def track( refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. style (StyleType, optional): Style for the bar background. Defaults to "bar.back". complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. disable (bool, optional): Disable display of progress. @@ -151,7 +151,7 @@ def track( pulse_style=pulse_style, ), TaskProgressColumn(show_speed=show_speed), - TimeRemainingColumn(), + TimeRemainingColumn(elapsed_when_finished=True), ) ) progress = Progress( @@ -216,6 +216,10 @@ class _Reader(RawIOBase, BinaryIO): def isatty(self) -> bool: return self.handle.isatty() + @property + def mode(self) -> str: + return self.handle.mode + @property def name(self) -> str: return self.handle.name @@ -315,7 +319,7 @@ def wrap_file( refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. style (StyleType, optional): Style for the bar background. Defaults to "bar.back". complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". disable (bool, optional): Disable display of progress. Returns: @@ -440,7 +444,7 @@ def open( refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. style (StyleType, optional): Style for the bar background. Defaults to "bar.back". complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". disable (bool, optional): Disable display of progress. encoding (str, optional): The encoding to use when reading in text mode. @@ -634,7 +638,7 @@ class BarColumn(ProgressColumn): bar_width (Optional[int], optional): Width of bar or None for full width. Defaults to 40. style (StyleType, optional): Style for the bar background. Defaults to "bar.back". complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". """ @@ -673,7 +677,7 @@ class TimeElapsedColumn(ProgressColumn): """Renders time elapsed.""" def render(self, task: "Task") -> Text: - """Show time remaining.""" + """Show time elapsed.""" elapsed = task.finished_time if task.finished else task.elapsed if elapsed is None: return Text("-:--:--", style="progress.elapsed") @@ -1193,18 +1197,13 @@ class Progress(JupyterMixin): Returns: Iterable[ProgressType]: An iterable of values taken from the provided sequence. """ - - task_total: Optional[float] = None if total is None: - if isinstance(sequence, Sized): - task_total = float(len(sequence)) - else: - task_total = total + total = float(length_hint(sequence)) or None if task_id is None: - task_id = self.add_task(description, total=task_total) + task_id = self.add_task(description, total=total) else: - self.update(task_id, total=task_total) + self.update(task_id, total=total) if self.live.auto_refresh: with _TrackThread(self, task_id, update_period) as track_thread: @@ -1338,7 +1337,7 @@ class Progress(JupyterMixin): RuntimeWarning, ) buffering = -1 - elif _mode == "rt" or _mode == "r": + elif _mode in ("rt", "r"): if buffering == 0: raise ValueError("can't have unbuffered text I/O") elif buffering == 1: @@ -1359,7 +1358,7 @@ class Progress(JupyterMixin): reader = _Reader(handle, self, task_id, close_handle=True) # wrap the reader in a `TextIOWrapper` if text mode - if mode == "r" or mode == "rt": + if mode in ("r", "rt"): return io.TextIOWrapper( reader, encoding=encoding, diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py b/.venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py index 9c3a4f25..67361df2 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py @@ -25,7 +25,7 @@ class ProgressBar(JupyterMixin): pulse (bool, optional): Enable pulse effect. Defaults to False. Will pulse if a None total was passed. style (StyleType, optional): Style for the bar background. Defaults to "bar.back". complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". animation_time (Optional[float], optional): Time in seconds to use for animation, or None to use system time. """ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/repr.py b/.venv/Lib/site-packages/pip/_vendor/rich/repr.py index 36966e70..f284bcaf 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/repr.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/repr.py @@ -1,21 +1,18 @@ -from functools import partial import inspect -import sys - +from functools import partial from typing import ( Any, Callable, Iterable, List, Optional, - overload, - Union, Tuple, Type, TypeVar, + Union, + overload, ) - T = TypeVar("T") @@ -58,7 +55,7 @@ def auto( if key is None: append(repr(value)) else: - if len(default) and default[0] == value: + if default and default[0] == value: continue append(f"{key}={value!r}") else: diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/rule.py b/.venv/Lib/site-packages/pip/_vendor/rich/rule.py index 0b78f7a4..fd00ce6e 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/rule.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/rule.py @@ -51,13 +51,9 @@ class Rule(JupyterMixin): ) -> RenderResult: width = options.max_width - # Python3.6 doesn't have an isascii method on str - isascii = getattr(str, "isascii", None) or ( - lambda s: all(ord(c) < 128 for c in s) - ) characters = ( "-" - if (options.ascii_only and not isascii(self.characters)) + if (options.ascii_only and not self.characters.isascii()) else self.characters ) diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/scope.py b/.venv/Lib/site-packages/pip/_vendor/rich/scope.py index 6822b8ca..c9d134cc 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/scope.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/scope.py @@ -26,7 +26,7 @@ def render_scope( scope (Mapping): A mapping containing variable names and values. title (str, optional): Optional title. Defaults to None. sort_keys (bool, optional): Enable sorting of items. Defaults to True. - indent_guides (bool, optional): Enable indentaton guides. Defaults to False. + indent_guides (bool, optional): Enable indentation guides. Defaults to False. max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to None. max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/segment.py b/.venv/Lib/site-packages/pip/_vendor/rich/segment.py index 1ea5435a..e1257984 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/segment.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/segment.py @@ -119,7 +119,7 @@ class Segment(NamedTuple): cell_size = get_character_cell_size - pos = int((cut / cell_length) * len(text)) + pos = int((cut / cell_length) * (len(text) - 1)) before = text[:pos] cell_pos = cell_len(before) @@ -303,7 +303,7 @@ class Segment(NamedTuple): if include_new_lines: cropped_line.append(new_line_segment) yield cropped_line - del line[:] + line.clear() else: append(segment) if line: @@ -365,7 +365,7 @@ class Segment(NamedTuple): int: The length of the line. """ _cell_len = cell_len - return sum(_cell_len(segment.text) for segment in line) + return sum(_cell_len(text) for text, style, control in line if not control) @classmethod def get_shape(cls, lines: List[List["Segment"]]) -> Tuple[int, int]: @@ -727,7 +727,7 @@ console.print(text)""" console.print(Syntax(code, "python", line_numbers=True)) console.print() console.print( - "When you call [b]print()[/b], Rich [i]renders[/i] the object in to the the following:\n" + "When you call [b]print()[/b], Rich [i]renders[/i] the object in to the following:\n" ) fragments = list(console.render(text)) console.print(fragments) diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/spinner.py b/.venv/Lib/site-packages/pip/_vendor/rich/spinner.py index 0879088e..91ea630e 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/spinner.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/spinner.py @@ -11,6 +11,18 @@ if TYPE_CHECKING: class Spinner: + """A spinner animation. + + Args: + name (str): Name of spinner (run python -m rich.spinner). + text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". + style (StyleType, optional): Style for spinner animation. Defaults to None. + speed (float, optional): Speed factor for animation. Defaults to 1.0. + + Raises: + KeyError: If name isn't one of the supported spinner animations. + """ + def __init__( self, name: str, @@ -19,17 +31,6 @@ class Spinner: style: Optional["StyleType"] = None, speed: float = 1.0, ) -> None: - """A spinner animation. - - Args: - name (str): Name of spinner (run python -m rich.spinner). - text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". - style (StyleType, optional): Style for spinner animation. Defaults to None. - speed (float, optional): Speed factor for animation. Defaults to 1.0. - - Raises: - KeyError: If name isn't one of the supported spinner animations. - """ try: spinner = SPINNERS[name] except KeyError: diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/style.py b/.venv/Lib/site-packages/pip/_vendor/rich/style.py index b2e8aff7..313c8894 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/style.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/style.py @@ -188,8 +188,10 @@ class Style: ) self._link = link - self._link_id = f"{randint(0, 999999)}" if link else "" self._meta = None if meta is None else dumps(meta) + self._link_id = ( + f"{randint(0, 999999)}{hash(self._meta)}" if (link or meta) else "" + ) self._hash: Optional[int] = None self._null = not (self._set_attributes or color or bgcolor or link or meta) @@ -237,8 +239,8 @@ class Style: style._set_attributes = 0 style._attributes = 0 style._link = None - style._link_id = "" style._meta = dumps(meta) + style._link_id = f"{randint(0, 999999)}{hash(style._meta)}" style._hash = None style._null = not (meta) return style @@ -643,6 +645,29 @@ class Style: style._meta = self._meta return style + @lru_cache(maxsize=128) + def clear_meta_and_links(self) -> "Style": + """Get a copy of this style with link and meta information removed. + + Returns: + Style: New style object. + """ + if self._null: + return NULL_STYLE + style: Style = self.__new__(Style) + style._ansi = self._ansi + style._style_definition = self._style_definition + style._color = self._color + style._bgcolor = self._bgcolor + style._attributes = self._attributes + style._set_attributes = self._set_attributes + style._link = None + style._link_id = "" + style._hash = self._hash + style._null = False + style._meta = None + return style + def update_link(self, link: Optional[str] = None) -> "Style": """Get a copy with a different value for link. diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/syntax.py b/.venv/Lib/site-packages/pip/_vendor/rich/syntax.py index dace718c..25b226a3 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/syntax.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/syntax.py @@ -4,6 +4,7 @@ import re import sys import textwrap from abc import ABC, abstractmethod +from pathlib import Path from typing import ( Any, Dict, @@ -40,6 +41,7 @@ from pip._vendor.rich.containers import Lines from pip._vendor.rich.padding import Padding, PaddingDimensions from ._loop import loop_first +from .cells import cell_len from .color import Color, blend_rgb from .console import Console, ConsoleOptions, JustifyMethod, RenderResult from .jupyter import JupyterMixin @@ -337,8 +339,7 @@ class Syntax(JupyterMixin): Returns: [Syntax]: A Syntax object that may be printed to the console """ - with open(path, "rt", encoding=encoding) as code_file: - code = code_file.read() + code = Path(path).read_text(encoding=encoding) if not lexer: lexer = cls.guess_lexer(path, code=code) @@ -493,7 +494,10 @@ class Syntax(JupyterMixin): # Skip over tokens until line start while line_no < _line_start: - _token_type, token = next(tokens) + try: + _token_type, token = next(tokens) + except StopIteration: + break yield (token, None) if token.endswith("\n"): line_no += 1 @@ -586,11 +590,21 @@ class Syntax(JupyterMixin): def __rich_measure__( self, console: "Console", options: "ConsoleOptions" ) -> "Measurement": + _, right, _, left = Padding.unpack(self.padding) + padding = left + right if self.code_width is not None: - width = self.code_width + self._numbers_column_width + right + left + width = self.code_width + self._numbers_column_width + padding + 1 return Measurement(self._numbers_column_width, width) - return Measurement(self._numbers_column_width, options.max_width) + lines = self.code.splitlines() + width = ( + self._numbers_column_width + + padding + + (max(cell_len(line) for line in lines) if lines else 0) + ) + if self.line_numbers: + width += 1 + return Measurement(self._numbers_column_width, width) def __rich_console__( self, console: Console, options: ConsoleOptions @@ -660,6 +674,8 @@ class Syntax(JupyterMixin): line_offset = max(0, start_line - 1) lines: Union[List[Text], Lines] = text.split("\n", allow_blank=ends_on_nl) if self.line_range: + if line_offset > len(lines): + return lines = lines[line_offset:end_line] if self.indent_guides and not options.ascii_only: diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/table.py b/.venv/Lib/site-packages/pip/_vendor/rich/table.py index 8fc28ef2..17409f2e 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/table.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/table.py @@ -462,6 +462,12 @@ class Table(JupyterMixin): ) self.rows.append(Row(style=style, end_section=end_section)) + def add_section(self) -> None: + """Add a new section (draw a line after current row).""" + + if self.rows: + self.rows[-1].end_section = True + def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/text.py b/.venv/Lib/site-packages/pip/_vendor/rich/text.py index 12037d0c..998cb87d 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/text.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/text.py @@ -53,11 +53,7 @@ class Span(NamedTuple): """Style associated with the span.""" def __repr__(self) -> str: - return ( - f"Span({self.start}, {self.end}, {self.style!r})" - if (isinstance(self.style, Style) and self.style._meta) - else f"Span({self.start}, {self.end}, {repr(self.style)})" - ) + return f"Span({self.start}, {self.end}, {self.style!r})" def __bool__(self) -> bool: return self.end > self.start @@ -450,7 +446,6 @@ class Text(JupyterMixin): style (Union[str, Style]): Style instance or style definition to apply. start (int): Start offset (negative indexing is supported). Defaults to 0. end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. - """ if style: length = len(self) @@ -465,6 +460,32 @@ class Text(JupyterMixin): return self._spans.append(Span(start, min(length, end), style)) + def stylize_before( + self, + style: Union[str, Style], + start: int = 0, + end: Optional[int] = None, + ) -> None: + """Apply a style to the text, or a portion of the text. Styles will be applied before other styles already present. + + Args: + style (Union[str, Style]): Style instance or style definition to apply. + start (int): Start offset (negative indexing is supported). Defaults to 0. + end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. + """ + if style: + length = len(self) + if start < 0: + start = length + start + if end is None: + end = length + if end < 0: + end = length + end + if start >= length or end <= start: + # Span not in text or not valid + return + self._spans.insert(0, Span(start, min(length, end), style)) + def apply_meta( self, meta: Dict[str, Any], start: int = 0, end: Optional[int] = None ) -> None: @@ -1179,7 +1200,7 @@ class Text(JupyterMixin): width (int): Maximum characters in a line. Returns: - Lines: List of lines. + Lines: Lines container. """ lines: Lines = Lines() append = lines.append diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/theme.py b/.venv/Lib/site-packages/pip/_vendor/rich/theme.py index bfb3c7f8..471dfb2f 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/theme.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/theme.py @@ -56,17 +56,20 @@ class Theme: return theme @classmethod - def read(cls, path: str, inherit: bool = True) -> "Theme": + def read( + cls, path: str, inherit: bool = True, encoding: Optional[str] = None + ) -> "Theme": """Read a theme from a path. Args: path (str): Path to a config file readable by Python configparser module. inherit (bool, optional): Inherit default styles. Defaults to True. + encoding (str, optional): Encoding of the config file. Defaults to None. Returns: Theme: A new theme instance. """ - with open(path, "rt") as config_file: + with open(path, "rt", encoding=encoding) as config_file: return cls.from_file(config_file, source=path, inherit=inherit) diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/traceback.py b/.venv/Lib/site-packages/pip/_vendor/rich/traceback.py index e5023c77..c4ffe1f9 100644 --- a/.venv/Lib/site-packages/pip/_vendor/rich/traceback.py +++ b/.venv/Lib/site-packages/pip/_vendor/rich/traceback.py @@ -1,12 +1,24 @@ from __future__ import absolute_import +import linecache import os import platform import sys from dataclasses import dataclass, field from traceback import walk_tb from types import ModuleType, TracebackType -from typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, Type, Union +from typing import ( + Any, + Callable, + Dict, + Iterable, + List, + Optional, + Sequence, + Tuple, + Type, + Union, +) from pip._vendor.pygments.lexers import guess_lexer_for_filename from pip._vendor.pygments.token import Comment, Keyword, Name, Number, Operator, String @@ -41,6 +53,10 @@ def install( theme: Optional[str] = None, word_wrap: bool = False, show_locals: bool = False, + locals_max_length: int = LOCALS_MAX_LENGTH, + locals_max_string: int = LOCALS_MAX_STRING, + locals_hide_dunder: bool = True, + locals_hide_sunder: Optional[bool] = None, indent_guides: bool = True, suppress: Iterable[Union[str, ModuleType]] = (), max_frames: int = 100, @@ -58,6 +74,11 @@ def install( a theme appropriate for the platform. word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. show_locals (bool, optional): Enable display of local variables. Defaults to False. + locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to 10. + locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. + locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. @@ -65,7 +86,13 @@ def install( Callable: The previous exception handler that was replaced. """ - traceback_console = Console(file=sys.stderr) if console is None else console + traceback_console = Console(stderr=True) if console is None else console + + locals_hide_sunder = ( + True + if (traceback_console.is_jupyter and locals_hide_sunder is None) + else locals_hide_sunder + ) def excepthook( type_: Type[BaseException], @@ -82,6 +109,10 @@ def install( theme=theme, word_wrap=word_wrap, show_locals=show_locals, + locals_max_length=locals_max_length, + locals_max_string=locals_max_string, + locals_hide_dunder=locals_hide_dunder, + locals_hide_sunder=bool(locals_hide_sunder), indent_guides=indent_guides, suppress=suppress, max_frames=max_frames, @@ -192,6 +223,8 @@ class Traceback: locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. + locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. @@ -208,14 +241,17 @@ class Traceback: def __init__( self, trace: Optional[Trace] = None, + *, width: Optional[int] = 100, extra_lines: int = 3, theme: Optional[str] = None, word_wrap: bool = False, show_locals: bool = False, - indent_guides: bool = True, locals_max_length: int = LOCALS_MAX_LENGTH, locals_max_string: int = LOCALS_MAX_STRING, + locals_hide_dunder: bool = True, + locals_hide_sunder: bool = False, + indent_guides: bool = True, suppress: Iterable[Union[str, ModuleType]] = (), max_frames: int = 100, ): @@ -237,6 +273,8 @@ class Traceback: self.indent_guides = indent_guides self.locals_max_length = locals_max_length self.locals_max_string = locals_max_string + self.locals_hide_dunder = locals_hide_dunder + self.locals_hide_sunder = locals_hide_sunder self.suppress: Sequence[str] = [] for suppress_entity in suppress: @@ -257,14 +295,17 @@ class Traceback: exc_type: Type[Any], exc_value: BaseException, traceback: Optional[TracebackType], + *, width: Optional[int] = 100, extra_lines: int = 3, theme: Optional[str] = None, word_wrap: bool = False, show_locals: bool = False, - indent_guides: bool = True, locals_max_length: int = LOCALS_MAX_LENGTH, locals_max_string: int = LOCALS_MAX_STRING, + locals_hide_dunder: bool = True, + locals_hide_sunder: bool = False, + indent_guides: bool = True, suppress: Iterable[Union[str, ModuleType]] = (), max_frames: int = 100, ) -> "Traceback": @@ -283,6 +324,8 @@ class Traceback: locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. + locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. @@ -290,8 +333,16 @@ class Traceback: Traceback: A Traceback instance that may be printed. """ rich_traceback = cls.extract( - exc_type, exc_value, traceback, show_locals=show_locals + exc_type, + exc_value, + traceback, + show_locals=show_locals, + locals_max_length=locals_max_length, + locals_max_string=locals_max_string, + locals_hide_dunder=locals_hide_dunder, + locals_hide_sunder=locals_hide_sunder, ) + return cls( rich_traceback, width=width, @@ -302,6 +353,8 @@ class Traceback: indent_guides=indent_guides, locals_max_length=locals_max_length, locals_max_string=locals_max_string, + locals_hide_dunder=locals_hide_dunder, + locals_hide_sunder=locals_hide_sunder, suppress=suppress, max_frames=max_frames, ) @@ -312,9 +365,12 @@ class Traceback: exc_type: Type[BaseException], exc_value: BaseException, traceback: Optional[TracebackType], + *, show_locals: bool = False, locals_max_length: int = LOCALS_MAX_LENGTH, locals_max_string: int = LOCALS_MAX_STRING, + locals_hide_dunder: bool = True, + locals_hide_sunder: bool = False, ) -> Trace: """Extract traceback information. @@ -326,6 +382,8 @@ class Traceback: locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. + locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. Returns: Trace: A Trace instance which you can use to construct a `Traceback`. @@ -337,7 +395,7 @@ class Traceback: from pip._vendor.rich import _IMPORT_CWD def safe_str(_object: Any) -> str: - """Don't allow exceptions from __str__ to propegate.""" + """Don't allow exceptions from __str__ to propagate.""" try: return str(_object) except Exception: @@ -362,6 +420,20 @@ class Traceback: stacks.append(stack) append = stack.frames.append + def get_locals( + iter_locals: Iterable[Tuple[str, object]] + ) -> Iterable[Tuple[str, object]]: + """Extract locals from an iterator of key pairs.""" + if not (locals_hide_dunder or locals_hide_sunder): + yield from iter_locals + return + for key, value in iter_locals: + if locals_hide_dunder and key.startswith("__"): + continue + if locals_hide_sunder and key.startswith("_"): + continue + yield key, value + for frame_summary, line_no in walk_tb(traceback): filename = frame_summary.f_code.co_filename if filename and not filename.startswith("<"): @@ -369,6 +441,7 @@ class Traceback: filename = os.path.join(_IMPORT_CWD, filename) if frame_summary.f_locals.get("_rich_traceback_omit", False): continue + frame = Frame( filename=filename or "?", lineno=line_no, @@ -379,7 +452,7 @@ class Traceback: max_length=locals_max_length, max_string=locals_max_string, ) - for key, value in frame_summary.f_locals.items() + for key, value in get_locals(frame_summary.f_locals.items()) } if show_locals else None, @@ -389,19 +462,17 @@ class Traceback: del stack.frames[:] cause = getattr(exc_value, "__cause__", None) - if cause and cause.__traceback__: + if cause: exc_type = cause.__class__ exc_value = cause + # __traceback__ can be None, e.g. for exceptions raised by the + # 'multiprocessing' module traceback = cause.__traceback__ is_cause = True continue cause = exc_value.__context__ - if ( - cause - and cause.__traceback__ - and not getattr(exc_value, "__suppress_context__", False) - ): + if cause and not getattr(exc_value, "__suppress_context__", False): exc_type = cause.__class__ exc_value = cause traceback = cause.__traceback__ @@ -496,13 +567,14 @@ class Traceback: highlighter = ReprHighlighter() path_highlighter = PathHighlighter() if syntax_error.filename != "": - text = Text.assemble( - (f" {syntax_error.filename}", "pygments.string"), - (":", "pygments.text"), - (str(syntax_error.lineno), "pygments.number"), - style="pygments.text", - ) - yield path_highlighter(text) + if os.path.exists(syntax_error.filename): + text = Text.assemble( + (f" {syntax_error.filename}", "pygments.string"), + (":", "pygments.text"), + (str(syntax_error.lineno), "pygments.number"), + style="pygments.text", + ) + yield path_highlighter(text) syntax_error_text = highlighter(syntax_error.line.rstrip()) syntax_error_text.no_wrap = True offset = min(syntax_error.offset - 1, len(syntax_error_text)) @@ -533,7 +605,6 @@ class Traceback: def _render_stack(self, stack: Stack) -> RenderResult: path_highlighter = PathHighlighter() theme = self.theme - code_cache: Dict[str, str] = {} def read_code(filename: str) -> str: """Read files, and cache results on filename. @@ -544,14 +615,7 @@ class Traceback: Returns: str: Contents of file """ - code = code_cache.get(filename) - if code is None: - with open( - filename, "rt", encoding="utf-8", errors="replace" - ) as code_file: - code = code_file.read() - code_cache[filename] = code - return code + return "".join(linecache.getlines(filename)) def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: if frame.locals: @@ -590,14 +654,23 @@ class Traceback: frame_filename = frame.filename suppressed = any(frame_filename.startswith(path) for path in self.suppress) - text = Text.assemble( - path_highlighter(Text(frame.filename, style="pygments.string")), - (":", "pygments.text"), - (str(frame.lineno), "pygments.number"), - " in ", - (frame.name, "pygments.function"), - style="pygments.text", - ) + if os.path.exists(frame.filename): + text = Text.assemble( + path_highlighter(Text(frame.filename, style="pygments.string")), + (":", "pygments.text"), + (str(frame.lineno), "pygments.number"), + " in ", + (frame.name, "pygments.function"), + style="pygments.text", + ) + else: + text = Text.assemble( + "in ", + (frame.name, "pygments.function"), + (":", "pygments.text"), + (str(frame.lineno), "pygments.number"), + style="pygments.text", + ) if not frame.filename.startswith("<") and not first: yield "" yield text @@ -607,6 +680,10 @@ class Traceback: if not suppressed: try: code = read_code(frame.filename) + if not code: + # code may be an empty string if the file doesn't exist, OR + # if the traceback filename is generated dynamically + continue lexer_name = self._guess_lexer(frame.filename, code) syntax = Syntax( code, diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py index ab3be3bf..4f1603ad 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py @@ -16,6 +16,7 @@ # See the License for the specific language governing permissions and # limitations under the License. + import functools import sys import threading @@ -88,51 +89,13 @@ tornado = None # type: ignore if t.TYPE_CHECKING: import types - from .wait import wait_base - from .stop import stop_base + from .retry import RetryBaseT + from .stop import StopBaseT + from .wait import WaitBaseT -WrappedFn = t.TypeVar("WrappedFn", bound=t.Callable) -_RetValT = t.TypeVar("_RetValT") - - -@t.overload -def retry(fn: WrappedFn) -> WrappedFn: - pass - - -@t.overload -def retry(*dargs: t.Any, **dkw: t.Any) -> t.Callable[[WrappedFn], WrappedFn]: # noqa - pass - - -def retry(*dargs: t.Any, **dkw: t.Any) -> t.Union[WrappedFn, t.Callable[[WrappedFn], WrappedFn]]: # noqa - """Wrap a function with a new `Retrying` object. - - :param dargs: positional arguments passed to Retrying object - :param dkw: keyword arguments passed to the Retrying object - """ - # support both @retry and @retry() as valid syntax - if len(dargs) == 1 and callable(dargs[0]): - return retry()(dargs[0]) - else: - - def wrap(f: WrappedFn) -> WrappedFn: - if isinstance(f, retry_base): - warnings.warn( - f"Got retry_base instance ({f.__class__.__name__}) as callable argument, " - f"this will probably hang indefinitely (did you mean retry={f.__class__.__name__}(...)?)" - ) - if iscoroutinefunction(f): - r: "BaseRetrying" = AsyncRetrying(*dargs, **dkw) - elif tornado and hasattr(tornado.gen, "is_coroutine_function") and tornado.gen.is_coroutine_function(f): - r = TornadoRetrying(*dargs, **dkw) - else: - r = Retrying(*dargs, **dkw) - - return r.wraps(f) - - return wrap +WrappedFnReturnT = t.TypeVar("WrappedFnReturnT") +WrappedFn = t.TypeVar("WrappedFn", bound=t.Callable[..., t.Any]) class TryAgain(Exception): @@ -216,7 +179,7 @@ class AttemptManager: exc_value: t.Optional[BaseException], traceback: t.Optional["types.TracebackType"], ) -> t.Optional[bool]: - if isinstance(exc_value, BaseException): + if exc_type is not None and exc_value is not None: self.retry_state.set_exception((exc_type, exc_value, traceback)) return True # Swallow exception. else: @@ -229,9 +192,9 @@ class BaseRetrying(ABC): def __init__( self, sleep: t.Callable[[t.Union[int, float]], None] = sleep, - stop: "stop_base" = stop_never, - wait: "wait_base" = wait_none(), - retry: retry_base = retry_if_exception_type(), + stop: "StopBaseT" = stop_never, + wait: "WaitBaseT" = wait_none(), + retry: "RetryBaseT" = retry_if_exception_type(), before: t.Callable[["RetryCallState"], None] = before_nothing, after: t.Callable[["RetryCallState"], None] = after_nothing, before_sleep: t.Optional[t.Callable[["RetryCallState"], None]] = None, @@ -254,8 +217,8 @@ class BaseRetrying(ABC): def copy( self, sleep: t.Union[t.Callable[[t.Union[int, float]], None], object] = _unset, - stop: t.Union["stop_base", object] = _unset, - wait: t.Union["wait_base", object] = _unset, + stop: t.Union["StopBaseT", object] = _unset, + wait: t.Union["WaitBaseT", object] = _unset, retry: t.Union[retry_base, object] = _unset, before: t.Union[t.Callable[["RetryCallState"], None], object] = _unset, after: t.Union[t.Callable[["RetryCallState"], None], object] = _unset, @@ -312,9 +275,9 @@ class BaseRetrying(ABC): statistics from each thread). """ try: - return self._local.statistics + return self._local.statistics # type: ignore[no-any-return] except AttributeError: - self._local.statistics = {} + self._local.statistics = t.cast(t.Dict[str, t.Any], {}) return self._local.statistics def wraps(self, f: WrappedFn) -> WrappedFn: @@ -330,10 +293,10 @@ class BaseRetrying(ABC): def retry_with(*args: t.Any, **kwargs: t.Any) -> WrappedFn: return self.copy(*args, **kwargs).wraps(f) - wrapped_f.retry = self - wrapped_f.retry_with = retry_with + wrapped_f.retry = self # type: ignore[attr-defined] + wrapped_f.retry_with = retry_with # type: ignore[attr-defined] - return wrapped_f + return wrapped_f # type: ignore[return-value] def begin(self) -> None: self.statistics.clear() @@ -348,15 +311,15 @@ class BaseRetrying(ABC): self.before(retry_state) return DoAttempt() - is_explicit_retry = retry_state.outcome.failed and isinstance(retry_state.outcome.exception(), TryAgain) - if not (is_explicit_retry or self.retry(retry_state=retry_state)): + is_explicit_retry = fut.failed and isinstance(fut.exception(), TryAgain) + if not (is_explicit_retry or self.retry(retry_state)): return fut.result() if self.after is not None: self.after(retry_state) self.statistics["delay_since_first_attempt"] = retry_state.seconds_since_start - if self.stop(retry_state=retry_state): + if self.stop(retry_state): if self.retry_error_callback: return self.retry_error_callback(retry_state) retry_exc = self.retry_error_cls(fut) @@ -365,7 +328,7 @@ class BaseRetrying(ABC): raise retry_exc from fut.exception() if self.wait: - sleep = self.wait(retry_state=retry_state) + sleep = self.wait(retry_state) else: sleep = 0.0 retry_state.next_action = RetryAction(sleep) @@ -393,14 +356,24 @@ class BaseRetrying(ABC): break @abstractmethod - def __call__(self, fn: t.Callable[..., _RetValT], *args: t.Any, **kwargs: t.Any) -> _RetValT: + def __call__( + self, + fn: t.Callable[..., WrappedFnReturnT], + *args: t.Any, + **kwargs: t.Any, + ) -> WrappedFnReturnT: pass class Retrying(BaseRetrying): """Retrying controller.""" - def __call__(self, fn: t.Callable[..., _RetValT], *args: t.Any, **kwargs: t.Any) -> _RetValT: + def __call__( + self, + fn: t.Callable[..., WrappedFnReturnT], + *args: t.Any, + **kwargs: t.Any, + ) -> WrappedFnReturnT: self.begin() retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs) @@ -410,17 +383,23 @@ class Retrying(BaseRetrying): try: result = fn(*args, **kwargs) except BaseException: # noqa: B902 - retry_state.set_exception(sys.exc_info()) + retry_state.set_exception(sys.exc_info()) # type: ignore[arg-type] else: retry_state.set_result(result) elif isinstance(do, DoSleep): retry_state.prepare_for_next_attempt() self.sleep(do) else: - return do + return do # type: ignore[no-any-return] -class Future(futures.Future): +if sys.version_info[1] >= 9: + FutureGenericT = futures.Future[t.Any] +else: + FutureGenericT = futures.Future + + +class Future(FutureGenericT): """Encapsulates a (future or past) attempted call to a target function.""" def __init__(self, attempt_number: int) -> None: @@ -493,13 +472,15 @@ class RetryCallState: fut.set_result(val) self.outcome, self.outcome_timestamp = fut, ts - def set_exception(self, exc_info: t.Tuple[t.Type[BaseException], BaseException, "types.TracebackType"]) -> None: + def set_exception( + self, exc_info: t.Tuple[t.Type[BaseException], BaseException, "types.TracebackType| None"] + ) -> None: ts = time.monotonic() fut = Future(self.attempt_number) fut.set_exception(exc_info[1]) self.outcome, self.outcome_timestamp = fut, ts - def __repr__(self): + def __repr__(self) -> str: if self.outcome is None: result = "none yet" elif self.outcome.failed: @@ -513,7 +494,115 @@ class RetryCallState: return f"<{clsname} {id(self)}: attempt #{self.attempt_number}; slept for {slept}; last result: {result}>" +@t.overload +def retry(func: WrappedFn) -> WrappedFn: + ... + + +@t.overload +def retry( + sleep: t.Callable[[t.Union[int, float]], None] = sleep, + stop: "StopBaseT" = stop_never, + wait: "WaitBaseT" = wait_none(), + retry: "RetryBaseT" = retry_if_exception_type(), + before: t.Callable[["RetryCallState"], None] = before_nothing, + after: t.Callable[["RetryCallState"], None] = after_nothing, + before_sleep: t.Optional[t.Callable[["RetryCallState"], None]] = None, + reraise: bool = False, + retry_error_cls: t.Type["RetryError"] = RetryError, + retry_error_callback: t.Optional[t.Callable[["RetryCallState"], t.Any]] = None, +) -> t.Callable[[WrappedFn], WrappedFn]: + ... + + +def retry(*dargs: t.Any, **dkw: t.Any) -> t.Any: + """Wrap a function with a new `Retrying` object. + + :param dargs: positional arguments passed to Retrying object + :param dkw: keyword arguments passed to the Retrying object + """ + # support both @retry and @retry() as valid syntax + if len(dargs) == 1 and callable(dargs[0]): + return retry()(dargs[0]) + else: + + def wrap(f: WrappedFn) -> WrappedFn: + if isinstance(f, retry_base): + warnings.warn( + f"Got retry_base instance ({f.__class__.__name__}) as callable argument, " + f"this will probably hang indefinitely (did you mean retry={f.__class__.__name__}(...)?)" + ) + r: "BaseRetrying" + if iscoroutinefunction(f): + r = AsyncRetrying(*dargs, **dkw) + elif tornado and hasattr(tornado.gen, "is_coroutine_function") and tornado.gen.is_coroutine_function(f): + r = TornadoRetrying(*dargs, **dkw) + else: + r = Retrying(*dargs, **dkw) + + return r.wraps(f) + + return wrap + + from pip._vendor.tenacity._asyncio import AsyncRetrying # noqa:E402,I100 if tornado: from pip._vendor.tenacity.tornadoweb import TornadoRetrying + + +__all__ = [ + "retry_base", + "retry_all", + "retry_always", + "retry_any", + "retry_if_exception", + "retry_if_exception_type", + "retry_if_exception_cause_type", + "retry_if_not_exception_type", + "retry_if_not_result", + "retry_if_result", + "retry_never", + "retry_unless_exception_type", + "retry_if_exception_message", + "retry_if_not_exception_message", + "sleep", + "sleep_using_event", + "stop_after_attempt", + "stop_after_delay", + "stop_all", + "stop_any", + "stop_never", + "stop_when_event_set", + "wait_chain", + "wait_combine", + "wait_exponential", + "wait_fixed", + "wait_incrementing", + "wait_none", + "wait_random", + "wait_random_exponential", + "wait_full_jitter", + "wait_exponential_jitter", + "before_log", + "before_nothing", + "after_log", + "after_nothing", + "before_sleep_log", + "before_sleep_nothing", + "retry", + "WrappedFn", + "TryAgain", + "NO_RESULT", + "DoAttempt", + "DoSleep", + "BaseAction", + "RetryAction", + "RetryError", + "AttemptManager", + "BaseRetrying", + "Retrying", + "Future", + "RetryCallState", + "AsyncRetrying", +] diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc index 69d1e19b..61fb3a04 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc index 8390ea94..8b8e5ef5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc index 654319c3..089b37f6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc index a0146e82..30a62d4f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc index 432c7ca5..affa320b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc index a29f5671..d614898d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc index f5078e6e..458b8c33 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc index 5f3949bf..c13db4c0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc index b76ef586..67ccfbb1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc index 9ffffc7b..23420f23 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc index f7871e19..8bc221f6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py index 0f32b5f6..2e50cd7b 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py @@ -17,7 +17,7 @@ import functools import sys -import typing +import typing as t from asyncio import sleep from pip._vendor.tenacity import AttemptManager @@ -26,21 +26,20 @@ from pip._vendor.tenacity import DoAttempt from pip._vendor.tenacity import DoSleep from pip._vendor.tenacity import RetryCallState -WrappedFn = typing.TypeVar("WrappedFn", bound=typing.Callable) -_RetValT = typing.TypeVar("_RetValT") +WrappedFnReturnT = t.TypeVar("WrappedFnReturnT") +WrappedFn = t.TypeVar("WrappedFn", bound=t.Callable[..., t.Awaitable[t.Any]]) class AsyncRetrying(BaseRetrying): - def __init__(self, sleep: typing.Callable[[float], typing.Awaitable] = sleep, **kwargs: typing.Any) -> None: + sleep: t.Callable[[float], t.Awaitable[t.Any]] + + def __init__(self, sleep: t.Callable[[float], t.Awaitable[t.Any]] = sleep, **kwargs: t.Any) -> None: super().__init__(**kwargs) self.sleep = sleep - async def __call__( # type: ignore # Change signature from supertype - self, - fn: typing.Callable[..., typing.Awaitable[_RetValT]], - *args: typing.Any, - **kwargs: typing.Any, - ) -> _RetValT: + async def __call__( # type: ignore[override] + self, fn: WrappedFn, *args: t.Any, **kwargs: t.Any + ) -> WrappedFnReturnT: self.begin() retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs) @@ -50,21 +49,24 @@ class AsyncRetrying(BaseRetrying): try: result = await fn(*args, **kwargs) except BaseException: # noqa: B902 - retry_state.set_exception(sys.exc_info()) + retry_state.set_exception(sys.exc_info()) # type: ignore[arg-type] else: retry_state.set_result(result) elif isinstance(do, DoSleep): retry_state.prepare_for_next_attempt() await self.sleep(do) else: - return do + return do # type: ignore[no-any-return] + + def __iter__(self) -> t.Generator[AttemptManager, None, None]: + raise TypeError("AsyncRetrying object is not iterable") def __aiter__(self) -> "AsyncRetrying": self.begin() self._retry_state = RetryCallState(self, fn=None, args=(), kwargs={}) return self - async def __anext__(self) -> typing.Union[AttemptManager, typing.Any]: + async def __anext__(self) -> AttemptManager: while True: do = self.iter(retry_state=self._retry_state) if do is None: @@ -75,18 +77,18 @@ class AsyncRetrying(BaseRetrying): self._retry_state.prepare_for_next_attempt() await self.sleep(do) else: - return do + raise StopAsyncIteration def wraps(self, fn: WrappedFn) -> WrappedFn: fn = super().wraps(fn) # Ensure wrapper is recognized as a coroutine function. @functools.wraps(fn) - async def async_wrapped(*args: typing.Any, **kwargs: typing.Any) -> typing.Any: + async def async_wrapped(*args: t.Any, **kwargs: t.Any) -> t.Any: return await fn(*args, **kwargs) # Preserve attributes - async_wrapped.retry = fn.retry - async_wrapped.retry_with = fn.retry_with + async_wrapped.retry = fn.retry # type: ignore[attr-defined] + async_wrapped.retry_with = fn.retry_with # type: ignore[attr-defined] - return async_wrapped + return async_wrapped # type: ignore[return-value] diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py index d5c4c9de..f14ff320 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py @@ -16,6 +16,7 @@ import sys import typing +from datetime import timedelta # sys.maxsize: @@ -66,3 +67,10 @@ def get_callback_name(cb: typing.Callable[..., typing.Any]) -> str: except AttributeError: pass return ".".join(segments) + + +time_unit_type = typing.Union[int, float, timedelta] + + +def to_seconds(time_unit: time_unit_type) -> float: + return float(time_unit.total_seconds() if isinstance(time_unit, timedelta) else time_unit) diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/after.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/after.py index c056700f..574c9bce 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/after.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/after.py @@ -36,9 +36,14 @@ def after_log( """After call strategy that logs to some logger the finished attempt.""" def log_it(retry_state: "RetryCallState") -> None: + if retry_state.fn is None: + # NOTE(sileht): can't really happen, but we must please mypy + fn_name = "" + else: + fn_name = _utils.get_callback_name(retry_state.fn) logger.log( log_level, - f"Finished call to '{_utils.get_callback_name(retry_state.fn)}' " + f"Finished call to '{fn_name}' " f"after {sec_format % retry_state.seconds_since_start}(s), " f"this was the {_utils.to_ordinal(retry_state.attempt_number)} time calling it.", ) diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/before.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/before.py index a72c2c5f..cfd7dc72 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/before.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/before.py @@ -32,9 +32,14 @@ def before_log(logger: "logging.Logger", log_level: int) -> typing.Callable[["Re """Before call strategy that logs to some logger the attempt.""" def log_it(retry_state: "RetryCallState") -> None: + if retry_state.fn is None: + # NOTE(sileht): can't really happen, but we must please mypy + fn_name = "" + else: + fn_name = _utils.get_callback_name(retry_state.fn) logger.log( log_level, - f"Starting call to '{_utils.get_callback_name(retry_state.fn)}', " + f"Starting call to '{fn_name}', " f"this is the {_utils.to_ordinal(retry_state.attempt_number)} time calling it.", ) diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py index b35564fb..8c6167fb 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py @@ -36,6 +36,14 @@ def before_sleep_log( """Before call strategy that logs to some logger the attempt.""" def log_it(retry_state: "RetryCallState") -> None: + local_exc_info: BaseException | bool | None + + if retry_state.outcome is None: + raise RuntimeError("log_it() called before outcome was set") + + if retry_state.next_action is None: + raise RuntimeError("log_it() called before next_action was set") + if retry_state.outcome.failed: ex = retry_state.outcome.exception() verb, value = "raised", f"{ex.__class__.__name__}: {ex}" @@ -48,10 +56,15 @@ def before_sleep_log( verb, value = "returned", retry_state.outcome.result() local_exc_info = False # exc_info does not apply when no exception + if retry_state.fn is None: + # NOTE(sileht): can't really happen, but we must please mypy + fn_name = "" + else: + fn_name = _utils.get_callback_name(retry_state.fn) + logger.log( log_level, - f"Retrying {_utils.get_callback_name(retry_state.fn)} " - f"in {retry_state.next_action.sleep} seconds as it {verb} {value}.", + f"Retrying {fn_name} " f"in {retry_state.next_action.sleep} seconds as it {verb} {value}.", exc_info=local_exc_info, ) diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/retry.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/retry.py index 9ebeb62d..38988739 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/retry.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/retry.py @@ -36,6 +36,9 @@ class retry_base(abc.ABC): return retry_any(self, other) +RetryBaseT = typing.Union[retry_base, typing.Callable[["RetryCallState"], bool]] + + class _retry_never(retry_base): """Retry strategy that never rejects any result.""" @@ -63,8 +66,14 @@ class retry_if_exception(retry_base): self.predicate = predicate def __call__(self, retry_state: "RetryCallState") -> bool: + if retry_state.outcome is None: + raise RuntimeError("__call__() called before outcome was set") + if retry_state.outcome.failed: - return self.predicate(retry_state.outcome.exception()) + exception = retry_state.outcome.exception() + if exception is None: + raise RuntimeError("outcome failed but the exception is None") + return self.predicate(exception) else: return False @@ -111,10 +120,17 @@ class retry_unless_exception_type(retry_if_exception): super().__init__(lambda e: not isinstance(e, exception_types)) def __call__(self, retry_state: "RetryCallState") -> bool: + if retry_state.outcome is None: + raise RuntimeError("__call__() called before outcome was set") + # always retry if no exception was raised if not retry_state.outcome.failed: return True - return self.predicate(retry_state.outcome.exception()) + + exception = retry_state.outcome.exception() + if exception is None: + raise RuntimeError("outcome failed but the exception is None") + return self.predicate(exception) class retry_if_exception_cause_type(retry_base): @@ -134,6 +150,9 @@ class retry_if_exception_cause_type(retry_base): self.exception_cause_types = exception_types def __call__(self, retry_state: "RetryCallState") -> bool: + if retry_state.outcome is None: + raise RuntimeError("__call__ called before outcome was set") + if retry_state.outcome.failed: exc = retry_state.outcome.exception() while exc is not None: @@ -151,6 +170,9 @@ class retry_if_result(retry_base): self.predicate = predicate def __call__(self, retry_state: "RetryCallState") -> bool: + if retry_state.outcome is None: + raise RuntimeError("__call__() called before outcome was set") + if not retry_state.outcome.failed: return self.predicate(retry_state.outcome.result()) else: @@ -164,6 +186,9 @@ class retry_if_not_result(retry_base): self.predicate = predicate def __call__(self, retry_state: "RetryCallState") -> bool: + if retry_state.outcome is None: + raise RuntimeError("__call__() called before outcome was set") + if not retry_state.outcome.failed: return not self.predicate(retry_state.outcome.result()) else: @@ -215,9 +240,16 @@ class retry_if_not_exception_message(retry_if_exception_message): self.predicate = lambda *args_, **kwargs_: not if_predicate(*args_, **kwargs_) def __call__(self, retry_state: "RetryCallState") -> bool: + if retry_state.outcome is None: + raise RuntimeError("__call__() called before outcome was set") + if not retry_state.outcome.failed: return True - return self.predicate(retry_state.outcome.exception()) + + exception = retry_state.outcome.exception() + if exception is None: + raise RuntimeError("outcome failed but the exception is None") + return self.predicate(exception) class retry_any(retry_base): diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/stop.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/stop.py index faaae9a8..bb23effd 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/stop.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/stop.py @@ -16,6 +16,8 @@ import abc import typing +from pip._vendor.tenacity import _utils + if typing.TYPE_CHECKING: import threading @@ -36,6 +38,9 @@ class stop_base(abc.ABC): return stop_any(self, other) +StopBaseT = typing.Union[stop_base, typing.Callable[["RetryCallState"], bool]] + + class stop_any(stop_base): """Stop if any of the stop condition is valid.""" @@ -89,8 +94,10 @@ class stop_after_attempt(stop_base): class stop_after_delay(stop_base): """Stop when the time from the first attempt >= limit.""" - def __init__(self, max_delay: float) -> None: - self.max_delay = max_delay + def __init__(self, max_delay: _utils.time_unit_type) -> None: + self.max_delay = _utils.to_seconds(max_delay) def __call__(self, retry_state: "RetryCallState") -> bool: + if retry_state.seconds_since_start is None: + raise RuntimeError("__call__() called but seconds_since_start is not set") return retry_state.seconds_since_start >= self.max_delay diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py index 8f7731af..e19c30b1 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py @@ -33,8 +33,8 @@ class TornadoRetrying(BaseRetrying): super().__init__(**kwargs) self.sleep = sleep - @gen.coroutine - def __call__( # type: ignore # Change signature from supertype + @gen.coroutine # type: ignore[misc] + def __call__( self, fn: "typing.Callable[..., typing.Union[typing.Generator[typing.Any, typing.Any, _RetValT], Future[_RetValT]]]", *args: typing.Any, @@ -49,7 +49,7 @@ class TornadoRetrying(BaseRetrying): try: result = yield fn(*args, **kwargs) except BaseException: # noqa: B902 - retry_state.set_exception(sys.exc_info()) + retry_state.set_exception(sys.exc_info()) # type: ignore[arg-type] else: retry_state.set_result(result) elif isinstance(do, DoSleep): diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/wait.py b/.venv/Lib/site-packages/pip/_vendor/tenacity/wait.py index 8fdfc8f9..f9349c02 100644 --- a/.venv/Lib/site-packages/pip/_vendor/tenacity/wait.py +++ b/.venv/Lib/site-packages/pip/_vendor/tenacity/wait.py @@ -17,19 +17,12 @@ import abc import random import typing -from datetime import timedelta from pip._vendor.tenacity import _utils if typing.TYPE_CHECKING: from pip._vendor.tenacity import RetryCallState -wait_unit_type = typing.Union[int, float, timedelta] - - -def to_seconds(wait_unit: wait_unit_type) -> float: - return float(wait_unit.total_seconds() if isinstance(wait_unit, timedelta) else wait_unit) - class wait_base(abc.ABC): """Abstract base class for wait strategies.""" @@ -43,16 +36,19 @@ class wait_base(abc.ABC): def __radd__(self, other: "wait_base") -> typing.Union["wait_combine", "wait_base"]: # make it possible to use multiple waits with the built-in sum function - if other == 0: + if other == 0: # type: ignore[comparison-overlap] return self return self.__add__(other) +WaitBaseT = typing.Union[wait_base, typing.Callable[["RetryCallState"], typing.Union[float, int]]] + + class wait_fixed(wait_base): """Wait strategy that waits a fixed amount of time between each retry.""" - def __init__(self, wait: wait_unit_type) -> None: - self.wait_fixed = to_seconds(wait) + def __init__(self, wait: _utils.time_unit_type) -> None: + self.wait_fixed = _utils.to_seconds(wait) def __call__(self, retry_state: "RetryCallState") -> float: return self.wait_fixed @@ -68,9 +64,9 @@ class wait_none(wait_fixed): class wait_random(wait_base): """Wait strategy that waits a random amount of time between min/max.""" - def __init__(self, min: wait_unit_type = 0, max: wait_unit_type = 1) -> None: # noqa - self.wait_random_min = to_seconds(min) - self.wait_random_max = to_seconds(max) + def __init__(self, min: _utils.time_unit_type = 0, max: _utils.time_unit_type = 1) -> None: # noqa + self.wait_random_min = _utils.to_seconds(min) + self.wait_random_max = _utils.to_seconds(max) def __call__(self, retry_state: "RetryCallState") -> float: return self.wait_random_min + (random.random() * (self.wait_random_max - self.wait_random_min)) @@ -120,13 +116,13 @@ class wait_incrementing(wait_base): def __init__( self, - start: wait_unit_type = 0, - increment: wait_unit_type = 100, - max: wait_unit_type = _utils.MAX_WAIT, # noqa + start: _utils.time_unit_type = 0, + increment: _utils.time_unit_type = 100, + max: _utils.time_unit_type = _utils.MAX_WAIT, # noqa ) -> None: - self.start = to_seconds(start) - self.increment = to_seconds(increment) - self.max = to_seconds(max) + self.start = _utils.to_seconds(start) + self.increment = _utils.to_seconds(increment) + self.max = _utils.to_seconds(max) def __call__(self, retry_state: "RetryCallState") -> float: result = self.start + (self.increment * (retry_state.attempt_number - 1)) @@ -149,13 +145,13 @@ class wait_exponential(wait_base): def __init__( self, multiplier: typing.Union[int, float] = 1, - max: wait_unit_type = _utils.MAX_WAIT, # noqa + max: _utils.time_unit_type = _utils.MAX_WAIT, # noqa exp_base: typing.Union[int, float] = 2, - min: wait_unit_type = 0, # noqa + min: _utils.time_unit_type = 0, # noqa ) -> None: self.multiplier = multiplier - self.min = to_seconds(min) - self.max = to_seconds(max) + self.min = _utils.to_seconds(min) + self.max = _utils.to_seconds(max) self.exp_base = exp_base def __call__(self, retry_state: "RetryCallState") -> float: @@ -206,7 +202,7 @@ class wait_exponential_jitter(wait_base): This implements the strategy described here: https://cloud.google.com/storage/docs/retry-strategy - The wait time is min(initial * (2**n + random.uniform(0, jitter)), maximum) + The wait time is min(initial * 2**n + random.uniform(0, jitter), maximum) where n is the retry count. """ diff --git a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc index b333b1f1..41ee6f01 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc index 560ba498..a828f17e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc index 84184604..44893d77 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc index 6ba807b7..40e155b2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/typing_extensions.py b/.venv/Lib/site-packages/pip/_vendor/typing_extensions.py index 34199c2a..9cbf5b87 100644 --- a/.venv/Lib/site-packages/pip/_vendor/typing_extensions.py +++ b/.venv/Lib/site-packages/pip/_vendor/typing_extensions.py @@ -2,10 +2,12 @@ import abc import collections import collections.abc import functools +import inspect import operator import sys import types as _types import typing +import warnings __all__ = [ @@ -51,6 +53,7 @@ __all__ = [ 'assert_type', 'clear_overloads', 'dataclass_transform', + 'deprecated', 'get_overloads', 'final', 'get_args', @@ -728,6 +731,8 @@ else: _typeddict_new.__text_signature__ = ('($cls, _typename, _fields=None,' ' /, *, total=True, **kwargs)') + _TAKES_MODULE = "module" in inspect.signature(typing._type_check).parameters + class _TypedDictMeta(type): def __init__(cls, name, bases, ns, total=True): super().__init__(name, bases, ns) @@ -753,8 +758,10 @@ else: annotations = {} own_annotations = ns.get('__annotations__', {}) msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" + kwds = {"module": tp_dict.__module__} if _TAKES_MODULE else {} own_annotations = { - n: typing._type_check(tp, msg) for n, tp in own_annotations.items() + n: typing._type_check(tp, msg, **kwds) + for n, tp in own_annotations.items() } required_keys = set() optional_keys = set() @@ -1157,7 +1164,7 @@ class _DefaultMixin: if isinstance(default, (tuple, list)): self.__default__ = tuple((typing._type_check(d, "Default must be a type") for d in default)) - elif default: + elif default != _marker: self.__default__ = typing._type_check(default, "Default must be a type") else: self.__default__ = None @@ -1171,7 +1178,7 @@ class TypeVar(typing.TypeVar, _DefaultMixin, _root=True): def __init__(self, name, *constraints, bound=None, covariant=False, contravariant=False, - default=None, infer_variance=False): + default=_marker, infer_variance=False): super().__init__(name, *constraints, bound=bound, covariant=covariant, contravariant=contravariant) _DefaultMixin.__init__(self, default) @@ -1258,7 +1265,7 @@ if hasattr(typing, 'ParamSpec'): __module__ = 'typing' def __init__(self, name, *, bound=None, covariant=False, contravariant=False, - default=None): + default=_marker): super().__init__(name, bound=bound, covariant=covariant, contravariant=contravariant) _DefaultMixin.__init__(self, default) @@ -1334,7 +1341,7 @@ else: return ParamSpecKwargs(self) def __init__(self, name, *, bound=None, covariant=False, contravariant=False, - default=None): + default=_marker): super().__init__([self]) self.__name__ = name self.__covariant__ = bool(covariant) @@ -1850,7 +1857,7 @@ if hasattr(typing, "TypeVarTuple"): # 3.11+ class TypeVarTuple(typing.TypeVarTuple, _DefaultMixin, _root=True): """Type variable tuple.""" - def __init__(self, name, *, default=None): + def __init__(self, name, *, default=_marker): super().__init__(name) _DefaultMixin.__init__(self, default) @@ -1913,7 +1920,7 @@ else: def __iter__(self): yield self.__unpacked__ - def __init__(self, name, *, default=None): + def __init__(self, name, *, default=_marker): self.__name__ = name _DefaultMixin.__init__(self, default) @@ -1993,7 +2000,8 @@ else: raise AssertionError("Expected code to be unreachable") -if hasattr(typing, 'dataclass_transform'): +if sys.version_info >= (3, 12): + # dataclass_transform exists in 3.11 but lacks the frozen_default parameter dataclass_transform = typing.dataclass_transform else: def dataclass_transform( @@ -2001,6 +2009,7 @@ else: eq_default: bool = True, order_default: bool = False, kw_only_default: bool = False, + frozen_default: bool = False, field_specifiers: typing.Tuple[ typing.Union[typing.Type[typing.Any], typing.Callable[..., typing.Any]], ... @@ -2057,6 +2066,8 @@ else: assumed to be True or False if it is omitted by the caller. - ``kw_only_default`` indicates whether the ``kw_only`` parameter is assumed to be True or False if it is omitted by the caller. + - ``frozen_default`` indicates whether the ``frozen`` parameter is + assumed to be True or False if it is omitted by the caller. - ``field_specifiers`` specifies a static list of supported classes or functions that describe fields, similar to ``dataclasses.field()``. @@ -2071,6 +2082,7 @@ else: "eq_default": eq_default, "order_default": order_default, "kw_only_default": kw_only_default, + "frozen_default": frozen_default, "field_specifiers": field_specifiers, "kwargs": kwargs, } @@ -2102,12 +2114,103 @@ else: This helps prevent bugs that may occur when a base class is changed without an equivalent change to a child class. + There is no runtime checking of these properties. The decorator + sets the ``__override__`` attribute to ``True`` on the decorated object + to allow runtime introspection. + See PEP 698 for details. """ + try: + __arg.__override__ = True + except (AttributeError, TypeError): + # Skip the attribute silently if it is not writable. + # AttributeError happens if the object has __slots__ or a + # read-only property, TypeError if it's a builtin class. + pass return __arg +if hasattr(typing, "deprecated"): + deprecated = typing.deprecated +else: + _T = typing.TypeVar("_T") + + def deprecated( + __msg: str, + *, + category: typing.Optional[typing.Type[Warning]] = DeprecationWarning, + stacklevel: int = 1, + ) -> typing.Callable[[_T], _T]: + """Indicate that a class, function or overload is deprecated. + + Usage: + + @deprecated("Use B instead") + class A: + pass + + @deprecated("Use g instead") + def f(): + pass + + @overload + @deprecated("int support is deprecated") + def g(x: int) -> int: ... + @overload + def g(x: str) -> int: ... + + When this decorator is applied to an object, the type checker + will generate a diagnostic on usage of the deprecated object. + + No runtime warning is issued. The decorator sets the ``__deprecated__`` + attribute on the decorated object to the deprecation message + passed to the decorator. If applied to an overload, the decorator + must be after the ``@overload`` decorator for the attribute to + exist on the overload as returned by ``get_overloads()``. + + See PEP 702 for details. + + """ + def decorator(__arg: _T) -> _T: + if category is None: + __arg.__deprecated__ = __msg + return __arg + elif isinstance(__arg, type): + original_new = __arg.__new__ + has_init = __arg.__init__ is not object.__init__ + + @functools.wraps(original_new) + def __new__(cls, *args, **kwargs): + warnings.warn(__msg, category=category, stacklevel=stacklevel + 1) + # Mirrors a similar check in object.__new__. + if not has_init and (args or kwargs): + raise TypeError(f"{cls.__name__}() takes no arguments") + if original_new is not object.__new__: + return original_new(cls, *args, **kwargs) + else: + return original_new(cls) + + __arg.__new__ = staticmethod(__new__) + __arg.__deprecated__ = __new__.__deprecated__ = __msg + return __arg + elif callable(__arg): + @functools.wraps(__arg) + def wrapper(*args, **kwargs): + warnings.warn(__msg, category=category, stacklevel=stacklevel + 1) + return __arg(*args, **kwargs) + + __arg.__deprecated__ = wrapper.__deprecated__ = __msg + return wrapper + else: + raise TypeError( + "@deprecated decorator with non-None category must be applied to " + f"a class or callable, not {__arg!r}" + ) + + return decorator + + # We have to do some monkey patching to deal with the dual nature of # Unpack/TypeVarTuple: # - We want Unpack to be a kind of TypeVar so it gets accepted in diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc index 7aff3946..9b37420d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc index a200f83c..f0599534 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc index d509d56c..cdf99051 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc index 49aa4ea4..aea3c9f6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc index 7f5eaae5..eeb88271 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc index 43d5ee00..3f8a814f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc index 7bcfeb0e..00785488 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc index fe8cfc71..08416f43 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc index efee1c59..b6ea33f2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc index f85b2b6c..ff335603 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc index aa516fe4..28460758 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/_version.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/_version.py index 6fbc84b3..e12dd0e7 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/_version.py @@ -1,2 +1,2 @@ # This file is protected via CODEOWNERS -__version__ = "1.26.12" +__version__ = "1.26.15" diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/connection.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/connection.py index 10fb36c4..54b96b19 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/connection.py @@ -229,6 +229,11 @@ class HTTPConnection(_HTTPConnection, object): ) def request(self, method, url, body=None, headers=None): + # Update the inner socket's timeout value to send the request. + # This only triggers if the connection is re-used. + if getattr(self, "sock", None) is not None: + self.sock.settimeout(self.timeout) + if headers is None: headers = {} else: diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py index 96339e90..c23d736b 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py @@ -379,7 +379,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): timeout_obj = self._get_timeout(timeout) timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout + conn.timeout = Timeout.resolve_default_timeout(timeout_obj.connect_timeout) # Trigger any extra validation we need to do. try: @@ -862,7 +862,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): ) # Check if we should retry the HTTP response. - has_retry_after = bool(response.getheader("Retry-After")) + has_retry_after = bool(response.headers.get("Retry-After")) if retries.is_retry(method, response.status, has_retry_after): try: retries = retries.increment(method, url, response=response, _pool=self) diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc index f5240c4e..80a926de 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc index 7aef9fa3..6f946461 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc index 7ae882d2..b682a2c9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc index 7c4890a4..643a3774 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc index 5b3b91db..a9217b12 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc index aa262532..016e1a18 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc index a16f18d3..b83bc246 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc index c5922f60..0dcd3fe4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc index f5c41f8a..489f2ca2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc index ab1ba234..6fec3dcd 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py index 66853869..1717ee22 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py @@ -224,7 +224,7 @@ class AppEngineManager(RequestMethods): ) # Check if we should retry the HTTP response. - has_retry_after = bool(http_response.getheader("Retry-After")) + has_retry_after = bool(http_response.headers.get("Retry-After")) if retries.is_retry(method, http_response.status, has_retry_after): retries = retries.increment(method, url, response=http_response, _pool=self) log.debug("Retry: %s", url) diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py index 41a8fd17..47166575 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py @@ -69,7 +69,7 @@ class NTLMConnectionPool(HTTPSConnectionPool): log.debug("Request headers: %s", headers) conn.request("GET", self.authurl, None, headers) res = conn.getresponse() - reshdr = dict(res.getheaders()) + reshdr = dict(res.headers) log.debug("Response status: %s %s", res.status, res.reason) log.debug("Response headers: %s", reshdr) log.debug("Response data: %s [...]", res.read(100)) @@ -101,7 +101,7 @@ class NTLMConnectionPool(HTTPSConnectionPool): conn.request("GET", self.authurl, None, headers) res = conn.getresponse() log.debug("Response status: %s %s", res.status, res.reason) - log.debug("Response headers: %s", dict(res.getheaders())) + log.debug("Response headers: %s", dict(res.headers)) log.debug("Response data: %s [...]", res.read()[:100]) if res.status != 200: if res.status == 401: diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py index 528764a0..19e4aa97 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -47,10 +47,10 @@ compression in Python 2 (see `CRIME attack`_). """ from __future__ import absolute_import +import OpenSSL.crypto import OpenSSL.SSL from cryptography import x509 from cryptography.hazmat.backends.openssl import backend as openssl_backend -from cryptography.hazmat.backends.openssl.x509 import _Certificate try: from cryptography.x509 import UnsupportedExtension @@ -228,9 +228,8 @@ def get_subj_alt_name(peer_cert): if hasattr(peer_cert, "to_cryptography"): cert = peer_cert.to_cryptography() else: - # This is technically using private APIs, but should work across all - # relevant versions before PyOpenSSL got a proper API for this. - cert = _Certificate(openssl_backend, peer_cert._x509) + der = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, peer_cert) + cert = x509.load_der_x509_certificate(der, openssl_backend) # We want to find the SAN extension. Ask Cryptography to locate it (it's # faster than looping in Python) diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc index b8fb1c44..ed55d17a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc index 3fddebc5..ee64b5fc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc index c15a3e11..de17345e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc index 953c6585..50684c0e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/response.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/response.py index 4969b70e..8909f845 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/response.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/response.py @@ -3,6 +3,7 @@ from __future__ import absolute_import import io import logging import sys +import warnings import zlib from contextlib import contextmanager from socket import error as SocketError @@ -657,9 +658,21 @@ class HTTPResponse(io.IOBase): # Backwards-compatibility methods for http.client.HTTPResponse def getheaders(self): + warnings.warn( + "HTTPResponse.getheaders() is deprecated and will be removed " + "in urllib3 v2.1.0. Instead access HTTPResponse.headers directly.", + category=DeprecationWarning, + stacklevel=2, + ) return self.headers def getheader(self, name, default=None): + warnings.warn( + "HTTPResponse.getheader() is deprecated and will be removed " + "in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default).", + category=DeprecationWarning, + stacklevel=2, + ) return self.headers.get(name, default) # Backwards compatibility for http.cookiejar diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc index 92bd363e..7fc2ee41 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc index ce320261..406f8144 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc index dcea098a..62349e84 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc index c9d15662..80711d0f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc index 71f90024..27405848 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc index d7877d1d..2d47d52b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc index f26622b7..d8e7f98a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc index fc4b1ea3..e704af1e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc index 7ee068fe..3c36a005 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc index 891681d5..46802a3c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc index bd37e562..81c5bd49 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc index 01d7dc1b..781c843b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc index ba391b3d..2e6202c2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py index 3398323f..2490d5e5 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py @@ -394,7 +394,7 @@ class Retry(object): def get_retry_after(self, response): """Get the value of Retry-After in seconds.""" - retry_after = response.getheader("Retry-After") + retry_after = response.headers.get("Retry-After") if retry_after is None: return None diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py index ff69593b..78e18a62 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py @@ -2,9 +2,8 @@ from __future__ import absolute_import import time -# The default socket timeout, used by httplib to indicate that no timeout was -# specified by the user -from socket import _GLOBAL_DEFAULT_TIMEOUT +# The default socket timeout, used by httplib to indicate that no timeout was; specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT, getdefaulttimeout from ..exceptions import TimeoutStateError @@ -116,6 +115,10 @@ class Timeout(object): # __str__ provided for backwards compatibility __str__ = __repr__ + @classmethod + def resolve_default_timeout(cls, timeout): + return getdefaulttimeout() if timeout is cls.DEFAULT_TIMEOUT else timeout + @classmethod def _validate_timeout(cls, value, name): """Check that a timeout attribute is valid. diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py index 86bd8b48..a960b2f3 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py @@ -50,7 +50,7 @@ _variations = [ "(?:(?:%(hex)s:){0,6}%(hex)s)?::", ] -UNRESERVED_PAT = r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._!\-~" +UNRESERVED_PAT = r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._\-~" IPV6_PAT = "(?:" + "|".join([x % _subs for x in _variations]) + ")" ZONE_ID_PAT = "(?:%25|%)(?:[" + UNRESERVED_PAT + "]|%[a-fA-F0-9]{2})+" IPV6_ADDRZ_PAT = r"\[" + IPV6_PAT + r"(?:" + ZONE_ID_PAT + r")?\]" @@ -63,7 +63,7 @@ IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT + "$") BRACELESS_IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT[2:-2] + "$") ZONE_ID_RE = re.compile("(" + ZONE_ID_PAT + r")\]$") -_HOST_PORT_PAT = ("^(%s|%s|%s)(?::([0-9]{0,5}))?$") % ( +_HOST_PORT_PAT = ("^(%s|%s|%s)(?::0*?(|0|[1-9][0-9]{0,4}))?$") % ( REG_NAME_PAT, IPV4_PAT, IPV6_ADDRZ_PAT, @@ -303,7 +303,7 @@ def _normalize_host(host, scheme): def _idna_encode(name): - if name and any([ord(x) > 128 for x in name]): + if name and any(ord(x) >= 128 for x in name): try: from pip._vendor import idna except ImportError: diff --git a/.venv/Lib/site-packages/pip/_vendor/vendor.txt b/.venv/Lib/site-packages/pip/_vendor/vendor.txt index 9e9d4c11..61063459 100644 --- a/.venv/Lib/site-packages/pip/_vendor/vendor.txt +++ b/.venv/Lib/site-packages/pip/_vendor/vendor.txt @@ -1,23 +1,23 @@ CacheControl==0.12.11 # Make sure to update the license in pyproject.toml for this. -colorama==0.4.5 +colorama==0.4.6 distlib==0.3.6 -distro==1.7.0 -msgpack==1.0.4 +distro==1.8.0 +msgpack==1.0.5 packaging==21.3 -pep517==0.13.0 -platformdirs==2.5.2 +platformdirs==3.2.0 pyparsing==3.0.9 -requests==2.28.1 - certifi==2022.09.24 - chardet==5.0.0 +pyproject-hooks==1.0.0 +requests==2.28.2 + certifi==2022.12.7 + chardet==5.1.0 idna==3.4 - urllib3==1.26.12 -rich==12.5.1 - pygments==2.13.0 - typing_extensions==4.4.0 -resolvelib==0.8.1 -setuptools==44.0.0 + urllib3==1.26.15 +rich==13.3.3 + pygments==2.14.0 + typing_extensions==4.5.0 +resolvelib==1.0.1 +setuptools==67.7.2 six==1.16.0 -tenacity==8.1.0 +tenacity==8.2.2 tomli==2.0.1 webencodings==0.5.1 diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc index e2366168..3fadbfd9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc index 68dd103c..539fc722 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc index ec7d8ba8..d97a60f8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc index 32e9df40..2c893c7a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc index 68e5e100..97151e57 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc differ diff --git a/.venv/Scripts/pip.exe b/.venv/Scripts/pip.exe index 7062acbd..969c6ef0 100644 Binary files a/.venv/Scripts/pip.exe and b/.venv/Scripts/pip.exe differ diff --git a/.venv/Scripts/pip3.10.exe b/.venv/Scripts/pip3.10.exe index 7062acbd..969c6ef0 100644 Binary files a/.venv/Scripts/pip3.10.exe and b/.venv/Scripts/pip3.10.exe differ diff --git a/.venv/Scripts/pip3.11.exe b/.venv/Scripts/pip3.11.exe index 7062acbd..969c6ef0 100644 Binary files a/.venv/Scripts/pip3.11.exe and b/.venv/Scripts/pip3.11.exe differ diff --git a/.venv/Scripts/pip3.exe b/.venv/Scripts/pip3.exe index 7062acbd..969c6ef0 100644 Binary files a/.venv/Scripts/pip3.exe and b/.venv/Scripts/pip3.exe differ diff --git a/src/__pycache__/Bee.cpython-311.pyc b/src/__pycache__/Bee.cpython-311.pyc index 8f0e0219..e7c12eff 100644 Binary files a/src/__pycache__/Bee.cpython-311.pyc and b/src/__pycache__/Bee.cpython-311.pyc differ diff --git a/src/__pycache__/Beehive.cpython-311.pyc b/src/__pycache__/Beehive.cpython-311.pyc index 79b7ea1f..3a9fcadd 100644 Binary files a/src/__pycache__/Beehive.cpython-311.pyc and b/src/__pycache__/Beehive.cpython-311.pyc differ diff --git a/src/__pycache__/Field.cpython-311.pyc b/src/__pycache__/Field.cpython-311.pyc index 3f2bbf68..c7b5d7c4 100644 Binary files a/src/__pycache__/Field.cpython-311.pyc and b/src/__pycache__/Field.cpython-311.pyc differ diff --git a/src/__pycache__/Flower.cpython-311.pyc b/src/__pycache__/Flower.cpython-311.pyc index 5669ed45..b8eedd0e 100644 Binary files a/src/__pycache__/Flower.cpython-311.pyc and b/src/__pycache__/Flower.cpython-311.pyc differ diff --git a/src/__pycache__/Frames.cpython-311.pyc b/src/__pycache__/Frames.cpython-311.pyc index 4c9f74ee..941a5250 100644 Binary files a/src/__pycache__/Frames.cpython-311.pyc and b/src/__pycache__/Frames.cpython-311.pyc differ diff --git a/src/dataset/iris/10115417745_081d2150aa_c.jpg b/src/dataset/iris/10115417745_081d2150aa_c.jpg new file mode 100644 index 00000000..e9a1b2f4 Binary files /dev/null and b/src/dataset/iris/10115417745_081d2150aa_c.jpg differ diff --git a/src/dataset/iris/10280954713_cb21a0f906_c.jpg b/src/dataset/iris/10280954713_cb21a0f906_c.jpg new file mode 100644 index 00000000..a540185f Binary files /dev/null and b/src/dataset/iris/10280954713_cb21a0f906_c.jpg differ diff --git a/src/dataset/iris/10373095154_3f8436dee3_c.jpg b/src/dataset/iris/10373095154_3f8436dee3_c.jpg new file mode 100644 index 00000000..821a35a9 Binary files /dev/null and b/src/dataset/iris/10373095154_3f8436dee3_c.jpg differ diff --git a/src/dataset/iris/10802001213_7687db7f0c_c.jpg b/src/dataset/iris/10802001213_7687db7f0c_c.jpg new file mode 100644 index 00000000..471729de Binary files /dev/null and b/src/dataset/iris/10802001213_7687db7f0c_c.jpg differ diff --git a/src/dataset/iris/10901137955_0be1281a1e_c.jpg b/src/dataset/iris/10901137955_0be1281a1e_c.jpg new file mode 100644 index 00000000..e4adb9a9 Binary files /dev/null and b/src/dataset/iris/10901137955_0be1281a1e_c.jpg differ diff --git a/src/dataset/iris/1106870785_dff9f66f5a_c.jpg b/src/dataset/iris/1106870785_dff9f66f5a_c.jpg new file mode 100644 index 00000000..f7bb40fa Binary files /dev/null and b/src/dataset/iris/1106870785_dff9f66f5a_c.jpg differ diff --git a/src/dataset/iris/11134070315_7ed0d06b1a_c.jpg b/src/dataset/iris/11134070315_7ed0d06b1a_c.jpg new file mode 100644 index 00000000..c0fe5a11 Binary files /dev/null and b/src/dataset/iris/11134070315_7ed0d06b1a_c.jpg differ diff --git a/src/dataset/iris/11271936725_00614941d8_c.jpg b/src/dataset/iris/11271936725_00614941d8_c.jpg new file mode 100644 index 00000000..a154b2fe Binary files /dev/null and b/src/dataset/iris/11271936725_00614941d8_c.jpg differ diff --git a/src/dataset/iris/11412300846_0bda9b5c25_c.jpg b/src/dataset/iris/11412300846_0bda9b5c25_c.jpg new file mode 100644 index 00000000..23256add Binary files /dev/null and b/src/dataset/iris/11412300846_0bda9b5c25_c.jpg differ diff --git a/src/dataset/iris/11412306885_fd4c2b0532_c.jpg b/src/dataset/iris/11412306885_fd4c2b0532_c.jpg new file mode 100644 index 00000000..6715781d Binary files /dev/null and b/src/dataset/iris/11412306885_fd4c2b0532_c.jpg differ diff --git a/src/dataset/iris/11571471073_dda6ed0759_c.jpg b/src/dataset/iris/11571471073_dda6ed0759_c.jpg new file mode 100644 index 00000000..2bc2c999 Binary files /dev/null and b/src/dataset/iris/11571471073_dda6ed0759_c.jpg differ diff --git a/src/dataset/iris/1160871115_082d21352e_c.jpg b/src/dataset/iris/1160871115_082d21352e_c.jpg new file mode 100644 index 00000000..886a0a93 Binary files /dev/null and b/src/dataset/iris/1160871115_082d21352e_c.jpg differ diff --git a/src/dataset/iris/11817916283_6bc25bd87f_c.jpg b/src/dataset/iris/11817916283_6bc25bd87f_c.jpg new file mode 100644 index 00000000..11ffdabf Binary files /dev/null and b/src/dataset/iris/11817916283_6bc25bd87f_c.jpg differ diff --git a/src/dataset/iris/120924118_b29673e9ab_c.jpg b/src/dataset/iris/120924118_b29673e9ab_c.jpg new file mode 100644 index 00000000..dbc3e7ab Binary files /dev/null and b/src/dataset/iris/120924118_b29673e9ab_c.jpg differ diff --git a/src/dataset/iris/12657457655_8fc75db500_c.jpg b/src/dataset/iris/12657457655_8fc75db500_c.jpg new file mode 100644 index 00000000..20bce48e Binary files /dev/null and b/src/dataset/iris/12657457655_8fc75db500_c.jpg differ diff --git a/src/dataset/iris/128528375_deed22b61d_c.jpg b/src/dataset/iris/128528375_deed22b61d_c.jpg new file mode 100644 index 00000000..566ed04a Binary files /dev/null and b/src/dataset/iris/128528375_deed22b61d_c.jpg differ diff --git a/src/dataset/iris/1306594276_68e4a95998_c.jpg b/src/dataset/iris/1306594276_68e4a95998_c.jpg new file mode 100644 index 00000000..bab52388 Binary files /dev/null and b/src/dataset/iris/1306594276_68e4a95998_c.jpg differ diff --git a/src/dataset/iris/1362616513_996d9a7cc8_c.jpg b/src/dataset/iris/1362616513_996d9a7cc8_c.jpg new file mode 100644 index 00000000..51dcef39 Binary files /dev/null and b/src/dataset/iris/1362616513_996d9a7cc8_c.jpg differ diff --git a/src/dataset/iris/13637058274_456ecd8b93_c.jpg b/src/dataset/iris/13637058274_456ecd8b93_c.jpg new file mode 100644 index 00000000..34278ca9 Binary files /dev/null and b/src/dataset/iris/13637058274_456ecd8b93_c.jpg differ diff --git a/src/dataset/iris/13680240975_69e6dbdffc_c.jpg b/src/dataset/iris/13680240975_69e6dbdffc_c.jpg new file mode 100644 index 00000000..1f13260a Binary files /dev/null and b/src/dataset/iris/13680240975_69e6dbdffc_c.jpg differ diff --git a/src/dataset/iris/13680289453_828d96059b_c.jpg b/src/dataset/iris/13680289453_828d96059b_c.jpg new file mode 100644 index 00000000..c1abb6c3 Binary files /dev/null and b/src/dataset/iris/13680289453_828d96059b_c.jpg differ diff --git a/src/dataset/iris/13693690365_de45d431ee_c.jpg b/src/dataset/iris/13693690365_de45d431ee_c.jpg new file mode 100644 index 00000000..a327b4a1 Binary files /dev/null and b/src/dataset/iris/13693690365_de45d431ee_c.jpg differ diff --git a/src/dataset/iris/13723197524_9cf4c6a022_c.jpg b/src/dataset/iris/13723197524_9cf4c6a022_c.jpg new file mode 100644 index 00000000..ada40c27 Binary files /dev/null and b/src/dataset/iris/13723197524_9cf4c6a022_c.jpg differ diff --git a/src/dataset/iris/13780880885_46ac705fe8_c.jpg b/src/dataset/iris/13780880885_46ac705fe8_c.jpg new file mode 100644 index 00000000..36260c9a Binary files /dev/null and b/src/dataset/iris/13780880885_46ac705fe8_c.jpg differ diff --git a/src/dataset/iris/13780881813_c6d328cb91_c.jpg b/src/dataset/iris/13780881813_c6d328cb91_c.jpg new file mode 100644 index 00000000..3ecbce5c Binary files /dev/null and b/src/dataset/iris/13780881813_c6d328cb91_c.jpg differ diff --git a/src/dataset/iris/13834265613_48f7938810_c.jpg b/src/dataset/iris/13834265613_48f7938810_c.jpg new file mode 100644 index 00000000..b53b608e Binary files /dev/null and b/src/dataset/iris/13834265613_48f7938810_c.jpg differ diff --git a/src/dataset/iris/13891068166_0763a905d2_c.jpg b/src/dataset/iris/13891068166_0763a905d2_c.jpg new file mode 100644 index 00000000..bd783513 Binary files /dev/null and b/src/dataset/iris/13891068166_0763a905d2_c.jpg differ diff --git a/src/dataset/iris/13913219162_536f3e7df1_c.jpg b/src/dataset/iris/13913219162_536f3e7df1_c.jpg new file mode 100644 index 00000000..0cf9a1b5 Binary files /dev/null and b/src/dataset/iris/13913219162_536f3e7df1_c.jpg differ diff --git a/src/dataset/iris/13923801333_4b715b08ee_c.jpg b/src/dataset/iris/13923801333_4b715b08ee_c.jpg new file mode 100644 index 00000000..dd44f7c6 Binary files /dev/null and b/src/dataset/iris/13923801333_4b715b08ee_c.jpg differ diff --git a/src/dataset/iris/13939944668_11a17b91f7_c.jpg b/src/dataset/iris/13939944668_11a17b91f7_c.jpg new file mode 100644 index 00000000..44f411bc Binary files /dev/null and b/src/dataset/iris/13939944668_11a17b91f7_c.jpg differ diff --git a/src/dataset/iris/139435051_8528075c13_c.jpg b/src/dataset/iris/139435051_8528075c13_c.jpg new file mode 100644 index 00000000..1b329345 Binary files /dev/null and b/src/dataset/iris/139435051_8528075c13_c.jpg differ diff --git a/src/dataset/iris/139461243_6f64054fbc_c.jpg b/src/dataset/iris/139461243_6f64054fbc_c.jpg new file mode 100644 index 00000000..4de996a6 Binary files /dev/null and b/src/dataset/iris/139461243_6f64054fbc_c.jpg differ diff --git a/src/dataset/iris/13951132055_38ea7b6eb2_c.jpg b/src/dataset/iris/13951132055_38ea7b6eb2_c.jpg new file mode 100644 index 00000000..45622bca Binary files /dev/null and b/src/dataset/iris/13951132055_38ea7b6eb2_c.jpg differ diff --git a/src/dataset/iris/13952803282_4b30af661c_c.jpg b/src/dataset/iris/13952803282_4b30af661c_c.jpg new file mode 100644 index 00000000..7eff524a Binary files /dev/null and b/src/dataset/iris/13952803282_4b30af661c_c.jpg differ diff --git a/src/dataset/iris/13966473079_0ce0cc0e1d_c.jpg b/src/dataset/iris/13966473079_0ce0cc0e1d_c.jpg new file mode 100644 index 00000000..a43bb045 Binary files /dev/null and b/src/dataset/iris/13966473079_0ce0cc0e1d_c.jpg differ diff --git a/src/dataset/iris/13966473439_2b87ec58c7_c.jpg b/src/dataset/iris/13966473439_2b87ec58c7_c.jpg new file mode 100644 index 00000000..f597b4e0 Binary files /dev/null and b/src/dataset/iris/13966473439_2b87ec58c7_c.jpg differ diff --git a/src/dataset/iris/13966492170_5e3d6d8536_c.jpg b/src/dataset/iris/13966492170_5e3d6d8536_c.jpg new file mode 100644 index 00000000..dda515aa Binary files /dev/null and b/src/dataset/iris/13966492170_5e3d6d8536_c.jpg differ diff --git a/src/dataset/iris/13993674129_4023c2098b_c.jpg b/src/dataset/iris/13993674129_4023c2098b_c.jpg new file mode 100644 index 00000000..8c928f06 Binary files /dev/null and b/src/dataset/iris/13993674129_4023c2098b_c.jpg differ diff --git a/src/dataset/iris/13993696698_2e4c759521_c.jpg b/src/dataset/iris/13993696698_2e4c759521_c.jpg new file mode 100644 index 00000000..235d65b2 Binary files /dev/null and b/src/dataset/iris/13993696698_2e4c759521_c.jpg differ diff --git a/src/dataset/iris/14022463170_a3f36c15b1_c.jpg b/src/dataset/iris/14022463170_a3f36c15b1_c.jpg new file mode 100644 index 00000000..fa6e9eae Binary files /dev/null and b/src/dataset/iris/14022463170_a3f36c15b1_c.jpg differ diff --git a/src/dataset/iris/14034179559_b3c7e87d36_c.jpg b/src/dataset/iris/14034179559_b3c7e87d36_c.jpg new file mode 100644 index 00000000..69be7ffd Binary files /dev/null and b/src/dataset/iris/14034179559_b3c7e87d36_c.jpg differ diff --git a/src/dataset/iris/14040602140_dedf1c648a_c.jpg b/src/dataset/iris/14040602140_dedf1c648a_c.jpg new file mode 100644 index 00000000..bf024176 Binary files /dev/null and b/src/dataset/iris/14040602140_dedf1c648a_c.jpg differ diff --git a/src/dataset/iris/14088225777_bc7570eeb7_c.jpg b/src/dataset/iris/14088225777_bc7570eeb7_c.jpg new file mode 100644 index 00000000..6b8c0d6e Binary files /dev/null and b/src/dataset/iris/14088225777_bc7570eeb7_c.jpg differ diff --git a/src/dataset/iris/14089222412_e91b53824b_c.jpg b/src/dataset/iris/14089222412_e91b53824b_c.jpg new file mode 100644 index 00000000..c27f65d2 Binary files /dev/null and b/src/dataset/iris/14089222412_e91b53824b_c.jpg differ diff --git a/src/dataset/iris/14111758821_169a5169d8_c.jpg b/src/dataset/iris/14111758821_169a5169d8_c.jpg new file mode 100644 index 00000000..9b0c2de1 Binary files /dev/null and b/src/dataset/iris/14111758821_169a5169d8_c.jpg differ diff --git a/src/dataset/iris/14116947676_2650f9bc71_c.jpg b/src/dataset/iris/14116947676_2650f9bc71_c.jpg new file mode 100644 index 00000000..e22adead Binary files /dev/null and b/src/dataset/iris/14116947676_2650f9bc71_c.jpg differ diff --git a/src/dataset/iris/14121903929_6220281a01_c.jpg b/src/dataset/iris/14121903929_6220281a01_c.jpg new file mode 100644 index 00000000..187f464d Binary files /dev/null and b/src/dataset/iris/14121903929_6220281a01_c.jpg differ diff --git a/src/dataset/iris/14122272668_7e038b2c80_c.jpg b/src/dataset/iris/14122272668_7e038b2c80_c.jpg new file mode 100644 index 00000000..ee4f95df Binary files /dev/null and b/src/dataset/iris/14122272668_7e038b2c80_c.jpg differ diff --git a/src/dataset/iris/14125055676_3a5e4804fb_c.jpg b/src/dataset/iris/14125055676_3a5e4804fb_c.jpg new file mode 100644 index 00000000..90999074 Binary files /dev/null and b/src/dataset/iris/14125055676_3a5e4804fb_c.jpg differ diff --git a/src/dataset/iris/14125055706_9ac89e0df9_c.jpg b/src/dataset/iris/14125055706_9ac89e0df9_c.jpg new file mode 100644 index 00000000..4bb69d5f Binary files /dev/null and b/src/dataset/iris/14125055706_9ac89e0df9_c.jpg differ diff --git a/src/dataset/iris/14137383257_41c7ac5878_c.jpg b/src/dataset/iris/14137383257_41c7ac5878_c.jpg new file mode 100644 index 00000000..12e78689 Binary files /dev/null and b/src/dataset/iris/14137383257_41c7ac5878_c.jpg differ diff --git a/src/dataset/iris/14139125415_bc3f990e21_c.jpg b/src/dataset/iris/14139125415_bc3f990e21_c.jpg new file mode 100644 index 00000000..8b79499d Binary files /dev/null and b/src/dataset/iris/14139125415_bc3f990e21_c.jpg differ diff --git a/src/dataset/iris/14139275548_89cd20bd9c_c.jpg b/src/dataset/iris/14139275548_89cd20bd9c_c.jpg new file mode 100644 index 00000000..ea8fedf2 Binary files /dev/null and b/src/dataset/iris/14139275548_89cd20bd9c_c.jpg differ diff --git a/src/dataset/iris/14145736963_5927b16d49_c.jpg b/src/dataset/iris/14145736963_5927b16d49_c.jpg new file mode 100644 index 00000000..e9eb614d Binary files /dev/null and b/src/dataset/iris/14145736963_5927b16d49_c.jpg differ diff --git a/src/dataset/iris/14149595602_a679aaba90_c.jpg b/src/dataset/iris/14149595602_a679aaba90_c.jpg new file mode 100644 index 00000000..2e4e9bfa Binary files /dev/null and b/src/dataset/iris/14149595602_a679aaba90_c.jpg differ diff --git a/src/dataset/iris/14153438166_139a9ce543_c.jpg b/src/dataset/iris/14153438166_139a9ce543_c.jpg new file mode 100644 index 00000000..0b602c88 Binary files /dev/null and b/src/dataset/iris/14153438166_139a9ce543_c.jpg differ diff --git a/src/dataset/iris/14154136629_aaec2184c5_c.jpg b/src/dataset/iris/14154136629_aaec2184c5_c.jpg new file mode 100644 index 00000000..8a1ff717 Binary files /dev/null and b/src/dataset/iris/14154136629_aaec2184c5_c.jpg differ diff --git a/src/dataset/iris/14160259194_b53a72465f_c.jpg b/src/dataset/iris/14160259194_b53a72465f_c.jpg new file mode 100644 index 00000000..bd490806 Binary files /dev/null and b/src/dataset/iris/14160259194_b53a72465f_c.jpg differ diff --git a/src/dataset/iris/14174199913_a453bd5ddf_c.jpg b/src/dataset/iris/14174199913_a453bd5ddf_c.jpg new file mode 100644 index 00000000..e49c1b79 Binary files /dev/null and b/src/dataset/iris/14174199913_a453bd5ddf_c.jpg differ diff --git a/src/dataset/iris/14182403531_4a96c3ab1e_c.jpg b/src/dataset/iris/14182403531_4a96c3ab1e_c.jpg new file mode 100644 index 00000000..e5226622 Binary files /dev/null and b/src/dataset/iris/14182403531_4a96c3ab1e_c.jpg differ diff --git a/src/dataset/iris/14189518730_e0324e6fb2_c.jpg b/src/dataset/iris/14189518730_e0324e6fb2_c.jpg new file mode 100644 index 00000000..4faeeb76 Binary files /dev/null and b/src/dataset/iris/14189518730_e0324e6fb2_c.jpg differ diff --git a/src/dataset/iris/14216150226_d1547d66a4_c.jpg b/src/dataset/iris/14216150226_d1547d66a4_c.jpg new file mode 100644 index 00000000..5f9f170f Binary files /dev/null and b/src/dataset/iris/14216150226_d1547d66a4_c.jpg differ diff --git a/src/dataset/iris/14221846457_4ccbe711e5_c.jpg b/src/dataset/iris/14221846457_4ccbe711e5_c.jpg new file mode 100644 index 00000000..7a3cfc6d Binary files /dev/null and b/src/dataset/iris/14221846457_4ccbe711e5_c.jpg differ diff --git a/src/dataset/iris/14224656455_6b3076c16d_c.jpg b/src/dataset/iris/14224656455_6b3076c16d_c.jpg new file mode 100644 index 00000000..6f129e87 Binary files /dev/null and b/src/dataset/iris/14224656455_6b3076c16d_c.jpg differ diff --git a/src/dataset/iris/14237901335_42030daaf5_c.jpg b/src/dataset/iris/14237901335_42030daaf5_c.jpg new file mode 100644 index 00000000..f62a2ace Binary files /dev/null and b/src/dataset/iris/14237901335_42030daaf5_c.jpg differ diff --git a/src/dataset/iris/14251667396_57f533b0cf_c.jpg b/src/dataset/iris/14251667396_57f533b0cf_c.jpg new file mode 100644 index 00000000..51ef4c28 Binary files /dev/null and b/src/dataset/iris/14251667396_57f533b0cf_c.jpg differ diff --git a/src/dataset/iris/14252960528_b743d0acbe_c.jpg b/src/dataset/iris/14252960528_b743d0acbe_c.jpg new file mode 100644 index 00000000..fd8763ba Binary files /dev/null and b/src/dataset/iris/14252960528_b743d0acbe_c.jpg differ diff --git a/src/dataset/iris/14268557170_5d8e265133_c.jpg b/src/dataset/iris/14268557170_5d8e265133_c.jpg new file mode 100644 index 00000000..26897755 Binary files /dev/null and b/src/dataset/iris/14268557170_5d8e265133_c.jpg differ diff --git a/src/dataset/iris/14284240022_8c8bd557aa_c.jpg b/src/dataset/iris/14284240022_8c8bd557aa_c.jpg new file mode 100644 index 00000000..b8a7102f Binary files /dev/null and b/src/dataset/iris/14284240022_8c8bd557aa_c.jpg differ diff --git a/src/dataset/iris/14285755156_ee55f08093_c.jpg b/src/dataset/iris/14285755156_ee55f08093_c.jpg new file mode 100644 index 00000000..4702bea6 Binary files /dev/null and b/src/dataset/iris/14285755156_ee55f08093_c.jpg differ diff --git a/src/dataset/iris/14288600785_a8b6119f75_c.jpg b/src/dataset/iris/14288600785_a8b6119f75_c.jpg new file mode 100644 index 00000000..3933c29e Binary files /dev/null and b/src/dataset/iris/14288600785_a8b6119f75_c.jpg differ diff --git a/src/dataset/iris/14288619675_68209c1dc8_c.jpg b/src/dataset/iris/14288619675_68209c1dc8_c.jpg new file mode 100644 index 00000000..4e515d31 Binary files /dev/null and b/src/dataset/iris/14288619675_68209c1dc8_c.jpg differ diff --git a/src/dataset/iris/14317543323_e672ce59f8_c.jpg b/src/dataset/iris/14317543323_e672ce59f8_c.jpg new file mode 100644 index 00000000..2688c2b4 Binary files /dev/null and b/src/dataset/iris/14317543323_e672ce59f8_c.jpg differ diff --git a/src/dataset/iris/14329103553_92d62e48b2_c.jpg b/src/dataset/iris/14329103553_92d62e48b2_c.jpg new file mode 100644 index 00000000..913732a5 Binary files /dev/null and b/src/dataset/iris/14329103553_92d62e48b2_c.jpg differ diff --git a/src/dataset/iris/14345463751_42375ff871_c.jpg b/src/dataset/iris/14345463751_42375ff871_c.jpg new file mode 100644 index 00000000..634a0784 Binary files /dev/null and b/src/dataset/iris/14345463751_42375ff871_c.jpg differ diff --git a/src/dataset/iris/14377987733_9762771859_c.jpg b/src/dataset/iris/14377987733_9762771859_c.jpg new file mode 100644 index 00000000..f47ef243 Binary files /dev/null and b/src/dataset/iris/14377987733_9762771859_c.jpg differ diff --git a/src/dataset/iris/14379558256_44e7f61b47_c.jpg b/src/dataset/iris/14379558256_44e7f61b47_c.jpg new file mode 100644 index 00000000..7ee66251 Binary files /dev/null and b/src/dataset/iris/14379558256_44e7f61b47_c.jpg differ diff --git a/src/dataset/iris/14380113043_a30ccab682_c.jpg b/src/dataset/iris/14380113043_a30ccab682_c.jpg new file mode 100644 index 00000000..0936d30f Binary files /dev/null and b/src/dataset/iris/14380113043_a30ccab682_c.jpg differ diff --git a/src/dataset/iris/14390016745_884ede71e3_c.jpg b/src/dataset/iris/14390016745_884ede71e3_c.jpg new file mode 100644 index 00000000..b28fdbad Binary files /dev/null and b/src/dataset/iris/14390016745_884ede71e3_c.jpg differ diff --git a/src/dataset/iris/14438880880_9c80ac02db_c.jpg b/src/dataset/iris/14438880880_9c80ac02db_c.jpg new file mode 100644 index 00000000..3b4c8930 Binary files /dev/null and b/src/dataset/iris/14438880880_9c80ac02db_c.jpg differ diff --git a/src/dataset/iris/14443940267_b90694bd71_c.jpg b/src/dataset/iris/14443940267_b90694bd71_c.jpg new file mode 100644 index 00000000..866329e2 Binary files /dev/null and b/src/dataset/iris/14443940267_b90694bd71_c.jpg differ diff --git a/src/dataset/iris/1445576594_bdd9e3141d_c.jpg b/src/dataset/iris/1445576594_bdd9e3141d_c.jpg new file mode 100644 index 00000000..aa269d67 Binary files /dev/null and b/src/dataset/iris/1445576594_bdd9e3141d_c.jpg differ diff --git a/src/dataset/iris/14467289611_7863131793_c.jpg b/src/dataset/iris/14467289611_7863131793_c.jpg new file mode 100644 index 00000000..fd1fd4b0 Binary files /dev/null and b/src/dataset/iris/14467289611_7863131793_c.jpg differ diff --git a/src/dataset/iris/14468739889_3dc5960979_c.jpg b/src/dataset/iris/14468739889_3dc5960979_c.jpg new file mode 100644 index 00000000..0847cfee Binary files /dev/null and b/src/dataset/iris/14468739889_3dc5960979_c.jpg differ diff --git a/src/dataset/iris/14468931469_b59b45d70b_c.jpg b/src/dataset/iris/14468931469_b59b45d70b_c.jpg new file mode 100644 index 00000000..30a8088e Binary files /dev/null and b/src/dataset/iris/14468931469_b59b45d70b_c.jpg differ diff --git a/src/dataset/iris/14469132147_fca4a773e2_c.jpg b/src/dataset/iris/14469132147_fca4a773e2_c.jpg new file mode 100644 index 00000000..8424317d Binary files /dev/null and b/src/dataset/iris/14469132147_fca4a773e2_c.jpg differ diff --git a/src/dataset/iris/14483874556_2cac975ed0_c.jpg b/src/dataset/iris/14483874556_2cac975ed0_c.jpg new file mode 100644 index 00000000..776a4c4e Binary files /dev/null and b/src/dataset/iris/14483874556_2cac975ed0_c.jpg differ diff --git a/src/dataset/iris/14486063312_c46d9c5cca_c.jpg b/src/dataset/iris/14486063312_c46d9c5cca_c.jpg new file mode 100644 index 00000000..69948772 Binary files /dev/null and b/src/dataset/iris/14486063312_c46d9c5cca_c.jpg differ diff --git a/src/dataset/iris/14486063842_a156d1ce19_c.jpg b/src/dataset/iris/14486063842_a156d1ce19_c.jpg new file mode 100644 index 00000000..7a034924 Binary files /dev/null and b/src/dataset/iris/14486063842_a156d1ce19_c.jpg differ diff --git a/src/dataset/iris/14486063892_274a94873f_c.jpg b/src/dataset/iris/14486063892_274a94873f_c.jpg new file mode 100644 index 00000000..b1e4e492 Binary files /dev/null and b/src/dataset/iris/14486063892_274a94873f_c.jpg differ diff --git a/src/dataset/iris/14502837286_dff46fa104_c.jpg b/src/dataset/iris/14502837286_dff46fa104_c.jpg new file mode 100644 index 00000000..4f4c916b Binary files /dev/null and b/src/dataset/iris/14502837286_dff46fa104_c.jpg differ diff --git a/src/dataset/iris/14506978885_bc952442c3_c.jpg b/src/dataset/iris/14506978885_bc952442c3_c.jpg new file mode 100644 index 00000000..b4aa6bc2 Binary files /dev/null and b/src/dataset/iris/14506978885_bc952442c3_c.jpg differ diff --git a/src/dataset/iris/14581103311_40b58a0758_c.jpg b/src/dataset/iris/14581103311_40b58a0758_c.jpg new file mode 100644 index 00000000..19b538eb Binary files /dev/null and b/src/dataset/iris/14581103311_40b58a0758_c.jpg differ diff --git a/src/dataset/iris/14584403225_ec028f0228_c.jpg b/src/dataset/iris/14584403225_ec028f0228_c.jpg new file mode 100644 index 00000000..50f3245c Binary files /dev/null and b/src/dataset/iris/14584403225_ec028f0228_c.jpg differ diff --git a/src/dataset/iris/14604518413_96128497ff_c.jpg b/src/dataset/iris/14604518413_96128497ff_c.jpg new file mode 100644 index 00000000..f74c4082 Binary files /dev/null and b/src/dataset/iris/14604518413_96128497ff_c.jpg differ diff --git a/src/dataset/iris/14624030756_113ac9c469_c.jpg b/src/dataset/iris/14624030756_113ac9c469_c.jpg new file mode 100644 index 00000000..56378713 Binary files /dev/null and b/src/dataset/iris/14624030756_113ac9c469_c.jpg differ diff --git a/src/dataset/iris/14637969502_afe2d989ae_c.jpg b/src/dataset/iris/14637969502_afe2d989ae_c.jpg new file mode 100644 index 00000000..701ab590 Binary files /dev/null and b/src/dataset/iris/14637969502_afe2d989ae_c.jpg differ diff --git a/src/dataset/iris/14639576441_903d66a6eb_c.jpg b/src/dataset/iris/14639576441_903d66a6eb_c.jpg new file mode 100644 index 00000000..0ed43a51 Binary files /dev/null and b/src/dataset/iris/14639576441_903d66a6eb_c.jpg differ diff --git a/src/dataset/iris/14655374825_1a34710ccb_c.jpg b/src/dataset/iris/14655374825_1a34710ccb_c.jpg new file mode 100644 index 00000000..1a079130 Binary files /dev/null and b/src/dataset/iris/14655374825_1a34710ccb_c.jpg differ diff --git a/src/dataset/iris/14697131826_977f043137_c.jpg b/src/dataset/iris/14697131826_977f043137_c.jpg new file mode 100644 index 00000000..2da19f4e Binary files /dev/null and b/src/dataset/iris/14697131826_977f043137_c.jpg differ diff --git a/src/dataset/iris/14806901100_6797f68014_c.jpg b/src/dataset/iris/14806901100_6797f68014_c.jpg new file mode 100644 index 00000000..63be31b4 Binary files /dev/null and b/src/dataset/iris/14806901100_6797f68014_c.jpg differ diff --git a/src/dataset/iris/14853437824_813efd8bfe_c.jpg b/src/dataset/iris/14853437824_813efd8bfe_c.jpg new file mode 100644 index 00000000..2b3ddbb5 Binary files /dev/null and b/src/dataset/iris/14853437824_813efd8bfe_c.jpg differ diff --git a/src/dataset/iris/14854606961_3b7689152d_c.jpg b/src/dataset/iris/14854606961_3b7689152d_c.jpg new file mode 100644 index 00000000..fb6aaad4 Binary files /dev/null and b/src/dataset/iris/14854606961_3b7689152d_c.jpg differ diff --git a/src/dataset/iris/14855561752_3c1e53c9d6_c.jpg b/src/dataset/iris/14855561752_3c1e53c9d6_c.jpg new file mode 100644 index 00000000..39a7dbbb Binary files /dev/null and b/src/dataset/iris/14855561752_3c1e53c9d6_c.jpg differ diff --git a/src/dataset/iris/14855878375_91820fbaa8_c.jpg b/src/dataset/iris/14855878375_91820fbaa8_c.jpg new file mode 100644 index 00000000..c52785de Binary files /dev/null and b/src/dataset/iris/14855878375_91820fbaa8_c.jpg differ diff --git a/src/dataset/iris/14875723953_fec56bdddf_c.jpg b/src/dataset/iris/14875723953_fec56bdddf_c.jpg new file mode 100644 index 00000000..1619024d Binary files /dev/null and b/src/dataset/iris/14875723953_fec56bdddf_c.jpg differ diff --git a/src/dataset/iris/149070439_8fcfd9fc88_c.jpg b/src/dataset/iris/149070439_8fcfd9fc88_c.jpg new file mode 100644 index 00000000..feb11478 Binary files /dev/null and b/src/dataset/iris/149070439_8fcfd9fc88_c.jpg differ diff --git a/src/dataset/iris/149490977_b6b55daade_c.jpg b/src/dataset/iris/149490977_b6b55daade_c.jpg new file mode 100644 index 00000000..7618a42c Binary files /dev/null and b/src/dataset/iris/149490977_b6b55daade_c.jpg differ diff --git a/src/dataset/iris/15020790_f8aaf8850b_c.jpg b/src/dataset/iris/15020790_f8aaf8850b_c.jpg new file mode 100644 index 00000000..e19ef544 Binary files /dev/null and b/src/dataset/iris/15020790_f8aaf8850b_c.jpg differ diff --git a/src/dataset/iris/15156718106_6c9e86ab94_c.jpg b/src/dataset/iris/15156718106_6c9e86ab94_c.jpg new file mode 100644 index 00000000..bfc0c7ee Binary files /dev/null and b/src/dataset/iris/15156718106_6c9e86ab94_c.jpg differ diff --git a/src/dataset/iris/15597198686_1d733b25a6_c.jpg b/src/dataset/iris/15597198686_1d733b25a6_c.jpg new file mode 100644 index 00000000..f2f76745 Binary files /dev/null and b/src/dataset/iris/15597198686_1d733b25a6_c.jpg differ diff --git a/src/dataset/iris/15620328772_ded6ff2680_c.jpg b/src/dataset/iris/15620328772_ded6ff2680_c.jpg new file mode 100644 index 00000000..19b5b8b5 Binary files /dev/null and b/src/dataset/iris/15620328772_ded6ff2680_c.jpg differ diff --git a/src/dataset/iris/15700320769_5a011139a5_c.jpg b/src/dataset/iris/15700320769_5a011139a5_c.jpg new file mode 100644 index 00000000..efb1a6bf Binary files /dev/null and b/src/dataset/iris/15700320769_5a011139a5_c.jpg differ diff --git a/src/dataset/iris/157703554_bdd18cb12e_c.jpg b/src/dataset/iris/157703554_bdd18cb12e_c.jpg new file mode 100644 index 00000000..8517d699 Binary files /dev/null and b/src/dataset/iris/157703554_bdd18cb12e_c.jpg differ diff --git a/src/dataset/iris/158027773_f556c3ce15_c.jpg b/src/dataset/iris/158027773_f556c3ce15_c.jpg new file mode 100644 index 00000000..d2ddeb3a Binary files /dev/null and b/src/dataset/iris/158027773_f556c3ce15_c.jpg differ diff --git a/src/dataset/iris/15862525391_80509c9e2f_c.jpg b/src/dataset/iris/15862525391_80509c9e2f_c.jpg new file mode 100644 index 00000000..eae7bb98 Binary files /dev/null and b/src/dataset/iris/15862525391_80509c9e2f_c.jpg differ diff --git a/src/dataset/iris/159048391_ccce50c2a3_c.jpg b/src/dataset/iris/159048391_ccce50c2a3_c.jpg new file mode 100644 index 00000000..944e9dd2 Binary files /dev/null and b/src/dataset/iris/159048391_ccce50c2a3_c.jpg differ diff --git a/src/dataset/iris/16070255570_0e7fc12e3b_c.jpg b/src/dataset/iris/16070255570_0e7fc12e3b_c.jpg new file mode 100644 index 00000000..cba42f9f Binary files /dev/null and b/src/dataset/iris/16070255570_0e7fc12e3b_c.jpg differ diff --git a/src/dataset/iris/16321237323_247efbd564_c.jpg b/src/dataset/iris/16321237323_247efbd564_c.jpg new file mode 100644 index 00000000..b198afae Binary files /dev/null and b/src/dataset/iris/16321237323_247efbd564_c.jpg differ diff --git a/src/dataset/iris/16401038_940a5407e9_c.jpg b/src/dataset/iris/16401038_940a5407e9_c.jpg new file mode 100644 index 00000000..ebf85da9 Binary files /dev/null and b/src/dataset/iris/16401038_940a5407e9_c.jpg differ diff --git a/src/dataset/iris/16448221975_a2b27058f1_c.jpg b/src/dataset/iris/16448221975_a2b27058f1_c.jpg new file mode 100644 index 00000000..4febdcd2 Binary files /dev/null and b/src/dataset/iris/16448221975_a2b27058f1_c.jpg differ diff --git a/src/dataset/iris/164507281_f5c9796e11_c.jpg b/src/dataset/iris/164507281_f5c9796e11_c.jpg new file mode 100644 index 00000000..ee83d734 Binary files /dev/null and b/src/dataset/iris/164507281_f5c9796e11_c.jpg differ diff --git a/src/dataset/iris/166759662_2705a27d84_c.jpg b/src/dataset/iris/166759662_2705a27d84_c.jpg new file mode 100644 index 00000000..78cab8b8 Binary files /dev/null and b/src/dataset/iris/166759662_2705a27d84_c.jpg differ diff --git a/src/dataset/iris/167855937_652991da74_c.jpg b/src/dataset/iris/167855937_652991da74_c.jpg new file mode 100644 index 00000000..61f9907d Binary files /dev/null and b/src/dataset/iris/167855937_652991da74_c.jpg differ diff --git a/src/dataset/iris/16856324843_ab087b10b6_c.jpg b/src/dataset/iris/16856324843_ab087b10b6_c.jpg new file mode 100644 index 00000000..f5b86b4d Binary files /dev/null and b/src/dataset/iris/16856324843_ab087b10b6_c.jpg differ diff --git a/src/dataset/iris/16856368223_e6b0b432dd_c.jpg b/src/dataset/iris/16856368223_e6b0b432dd_c.jpg new file mode 100644 index 00000000..85f5d2f7 Binary files /dev/null and b/src/dataset/iris/16856368223_e6b0b432dd_c.jpg differ diff --git a/src/dataset/iris/16910542754_ac354f5742_c.jpg b/src/dataset/iris/16910542754_ac354f5742_c.jpg new file mode 100644 index 00000000..a8aceea6 Binary files /dev/null and b/src/dataset/iris/16910542754_ac354f5742_c.jpg differ diff --git a/src/dataset/iris/16984649607_7d5228ca2c_c.jpg b/src/dataset/iris/16984649607_7d5228ca2c_c.jpg new file mode 100644 index 00000000..4ea163e9 Binary files /dev/null and b/src/dataset/iris/16984649607_7d5228ca2c_c.jpg differ diff --git a/src/dataset/iris/17078194679_7196b05ee1_c.jpg b/src/dataset/iris/17078194679_7196b05ee1_c.jpg new file mode 100644 index 00000000..f1d08949 Binary files /dev/null and b/src/dataset/iris/17078194679_7196b05ee1_c.jpg differ diff --git a/src/dataset/iris/17083534979_ac03814329_c.jpg b/src/dataset/iris/17083534979_ac03814329_c.jpg new file mode 100644 index 00000000..46d6ac4c Binary files /dev/null and b/src/dataset/iris/17083534979_ac03814329_c.jpg differ diff --git a/src/dataset/iris/17100016037_28c6de91de_c.jpg b/src/dataset/iris/17100016037_28c6de91de_c.jpg new file mode 100644 index 00000000..9ae8f090 Binary files /dev/null and b/src/dataset/iris/17100016037_28c6de91de_c.jpg differ diff --git a/src/dataset/iris/17125175308_14423d7217_c.jpg b/src/dataset/iris/17125175308_14423d7217_c.jpg new file mode 100644 index 00000000..264533f6 Binary files /dev/null and b/src/dataset/iris/17125175308_14423d7217_c.jpg differ diff --git a/src/dataset/iris/17174485106_0eb2120b9f_c.jpg b/src/dataset/iris/17174485106_0eb2120b9f_c.jpg new file mode 100644 index 00000000..5b44011d Binary files /dev/null and b/src/dataset/iris/17174485106_0eb2120b9f_c.jpg differ diff --git a/src/dataset/iris/17182961190_59b8ce3778_c.jpg b/src/dataset/iris/17182961190_59b8ce3778_c.jpg new file mode 100644 index 00000000..db9830e4 Binary files /dev/null and b/src/dataset/iris/17182961190_59b8ce3778_c.jpg differ diff --git a/src/dataset/iris/17237724581_537e0e4429_c.jpg b/src/dataset/iris/17237724581_537e0e4429_c.jpg new file mode 100644 index 00000000..f2d59da9 Binary files /dev/null and b/src/dataset/iris/17237724581_537e0e4429_c.jpg differ diff --git a/src/dataset/iris/17266115801_1dfbf95caa_c.jpg b/src/dataset/iris/17266115801_1dfbf95caa_c.jpg new file mode 100644 index 00000000..bc57a59a Binary files /dev/null and b/src/dataset/iris/17266115801_1dfbf95caa_c.jpg differ diff --git a/src/dataset/iris/17305084875_88ba70cac1_c.jpg b/src/dataset/iris/17305084875_88ba70cac1_c.jpg new file mode 100644 index 00000000..692f4c08 Binary files /dev/null and b/src/dataset/iris/17305084875_88ba70cac1_c.jpg differ diff --git a/src/dataset/iris/17318090952_7bb5055e8b_c.jpg b/src/dataset/iris/17318090952_7bb5055e8b_c.jpg new file mode 100644 index 00000000..b4d597d1 Binary files /dev/null and b/src/dataset/iris/17318090952_7bb5055e8b_c.jpg differ diff --git a/src/dataset/iris/17341978226_dd36526165_c.jpg b/src/dataset/iris/17341978226_dd36526165_c.jpg new file mode 100644 index 00000000..e1b5a11e Binary files /dev/null and b/src/dataset/iris/17341978226_dd36526165_c.jpg differ diff --git a/src/dataset/iris/17343999645_b7355131b6_c.jpg b/src/dataset/iris/17343999645_b7355131b6_c.jpg new file mode 100644 index 00000000..f5b772f4 Binary files /dev/null and b/src/dataset/iris/17343999645_b7355131b6_c.jpg differ diff --git a/src/dataset/iris/17348965646_5ac97a7238_c.jpg b/src/dataset/iris/17348965646_5ac97a7238_c.jpg new file mode 100644 index 00000000..9ba9bdfe Binary files /dev/null and b/src/dataset/iris/17348965646_5ac97a7238_c.jpg differ diff --git a/src/dataset/iris/174484787_9f14c0978c_c.jpg b/src/dataset/iris/174484787_9f14c0978c_c.jpg new file mode 100644 index 00000000..d9e32930 Binary files /dev/null and b/src/dataset/iris/174484787_9f14c0978c_c.jpg differ diff --git a/src/dataset/iris/17458024356_1878f6bfee_c.jpg b/src/dataset/iris/17458024356_1878f6bfee_c.jpg new file mode 100644 index 00000000..fd2f9e70 Binary files /dev/null and b/src/dataset/iris/17458024356_1878f6bfee_c.jpg differ diff --git a/src/dataset/iris/17535096822_7e6e7c4c5a_c.jpg b/src/dataset/iris/17535096822_7e6e7c4c5a_c.jpg new file mode 100644 index 00000000..d9fd16ce Binary files /dev/null and b/src/dataset/iris/17535096822_7e6e7c4c5a_c.jpg differ diff --git a/src/dataset/iris/17612867401_a310a3a347_c.jpg b/src/dataset/iris/17612867401_a310a3a347_c.jpg new file mode 100644 index 00000000..3f41a0fc Binary files /dev/null and b/src/dataset/iris/17612867401_a310a3a347_c.jpg differ diff --git a/src/dataset/iris/17656513183_47d8f3cc2f_c.jpg b/src/dataset/iris/17656513183_47d8f3cc2f_c.jpg new file mode 100644 index 00000000..f9c73e94 Binary files /dev/null and b/src/dataset/iris/17656513183_47d8f3cc2f_c.jpg differ diff --git a/src/dataset/iris/17677574842_5867b026b1_c.jpg b/src/dataset/iris/17677574842_5867b026b1_c.jpg new file mode 100644 index 00000000..aa946339 Binary files /dev/null and b/src/dataset/iris/17677574842_5867b026b1_c.jpg differ diff --git a/src/dataset/iris/17683157618_4fbd49bbca_c.jpg b/src/dataset/iris/17683157618_4fbd49bbca_c.jpg new file mode 100644 index 00000000..148952e0 Binary files /dev/null and b/src/dataset/iris/17683157618_4fbd49bbca_c.jpg differ diff --git a/src/dataset/iris/17703132352_5e71b65409_c.jpg b/src/dataset/iris/17703132352_5e71b65409_c.jpg new file mode 100644 index 00000000..0c1f29ad Binary files /dev/null and b/src/dataset/iris/17703132352_5e71b65409_c.jpg differ diff --git a/src/dataset/iris/17745911753_4ed591b750_c.jpg b/src/dataset/iris/17745911753_4ed591b750_c.jpg new file mode 100644 index 00000000..c0cd1327 Binary files /dev/null and b/src/dataset/iris/17745911753_4ed591b750_c.jpg differ diff --git a/src/dataset/iris/17779345575_de76cd0e3a_c.jpg b/src/dataset/iris/17779345575_de76cd0e3a_c.jpg new file mode 100644 index 00000000..9bce32bb Binary files /dev/null and b/src/dataset/iris/17779345575_de76cd0e3a_c.jpg differ diff --git a/src/dataset/iris/17826727169_991cf11676_c.jpg b/src/dataset/iris/17826727169_991cf11676_c.jpg new file mode 100644 index 00000000..841d533c Binary files /dev/null and b/src/dataset/iris/17826727169_991cf11676_c.jpg differ diff --git a/src/dataset/iris/17858672081_4b4d071116_c.jpg b/src/dataset/iris/17858672081_4b4d071116_c.jpg new file mode 100644 index 00000000..4a3efc3b Binary files /dev/null and b/src/dataset/iris/17858672081_4b4d071116_c.jpg differ diff --git a/src/dataset/iris/17885928250_451875aec2_c.jpg b/src/dataset/iris/17885928250_451875aec2_c.jpg new file mode 100644 index 00000000..1e28d906 Binary files /dev/null and b/src/dataset/iris/17885928250_451875aec2_c.jpg differ diff --git a/src/dataset/iris/17948299355_2161a031db_c.jpg b/src/dataset/iris/17948299355_2161a031db_c.jpg new file mode 100644 index 00000000..b9c0d1fc Binary files /dev/null and b/src/dataset/iris/17948299355_2161a031db_c.jpg differ diff --git a/src/dataset/iris/17959086836_3e706d918b_c.jpg b/src/dataset/iris/17959086836_3e706d918b_c.jpg new file mode 100644 index 00000000..a10549b8 Binary files /dev/null and b/src/dataset/iris/17959086836_3e706d918b_c.jpg differ diff --git a/src/dataset/iris/18054931376_23052f68d0_c.jpg b/src/dataset/iris/18054931376_23052f68d0_c.jpg new file mode 100644 index 00000000..786a8bb8 Binary files /dev/null and b/src/dataset/iris/18054931376_23052f68d0_c.jpg differ diff --git a/src/dataset/iris/18059533553_186ccb451a_c.jpg b/src/dataset/iris/18059533553_186ccb451a_c.jpg new file mode 100644 index 00000000..af9f96a7 Binary files /dev/null and b/src/dataset/iris/18059533553_186ccb451a_c.jpg differ diff --git a/src/dataset/iris/18076633321_400ea17b5a_c.jpg b/src/dataset/iris/18076633321_400ea17b5a_c.jpg new file mode 100644 index 00000000..bfeb25b8 Binary files /dev/null and b/src/dataset/iris/18076633321_400ea17b5a_c.jpg differ diff --git a/src/dataset/iris/18120244292_ea11fcc9c5_c.jpg b/src/dataset/iris/18120244292_ea11fcc9c5_c.jpg new file mode 100644 index 00000000..4c69313f Binary files /dev/null and b/src/dataset/iris/18120244292_ea11fcc9c5_c.jpg differ diff --git a/src/dataset/iris/181379030_afebe26851_c.jpg b/src/dataset/iris/181379030_afebe26851_c.jpg new file mode 100644 index 00000000..ebdc5baa Binary files /dev/null and b/src/dataset/iris/181379030_afebe26851_c.jpg differ diff --git a/src/dataset/iris/18141122602_118114762d_c.jpg b/src/dataset/iris/18141122602_118114762d_c.jpg new file mode 100644 index 00000000..07756de6 Binary files /dev/null and b/src/dataset/iris/18141122602_118114762d_c.jpg differ diff --git a/src/dataset/iris/18256508742_af6a8f4222_c.jpg b/src/dataset/iris/18256508742_af6a8f4222_c.jpg new file mode 100644 index 00000000..081cc432 Binary files /dev/null and b/src/dataset/iris/18256508742_af6a8f4222_c.jpg differ diff --git a/src/dataset/iris/18280071332_c6bc90d75a_c.jpg b/src/dataset/iris/18280071332_c6bc90d75a_c.jpg new file mode 100644 index 00000000..a299322d Binary files /dev/null and b/src/dataset/iris/18280071332_c6bc90d75a_c.jpg differ diff --git a/src/dataset/iris/18348714266_33a7bf205f_c.jpg b/src/dataset/iris/18348714266_33a7bf205f_c.jpg new file mode 100644 index 00000000..4f351903 Binary files /dev/null and b/src/dataset/iris/18348714266_33a7bf205f_c.jpg differ diff --git a/src/dataset/iris/18504796248_9548f45757_c.jpg b/src/dataset/iris/18504796248_9548f45757_c.jpg new file mode 100644 index 00000000..f49c10e3 Binary files /dev/null and b/src/dataset/iris/18504796248_9548f45757_c.jpg differ diff --git a/src/dataset/iris/18519018712_9ae5d4be08_c.jpg b/src/dataset/iris/18519018712_9ae5d4be08_c.jpg new file mode 100644 index 00000000..32e077de Binary files /dev/null and b/src/dataset/iris/18519018712_9ae5d4be08_c.jpg differ diff --git a/src/dataset/iris/18551525352_70323e50e0_c.jpg b/src/dataset/iris/18551525352_70323e50e0_c.jpg new file mode 100644 index 00000000..3ac5877d Binary files /dev/null and b/src/dataset/iris/18551525352_70323e50e0_c.jpg differ diff --git a/src/dataset/iris/18607022104_4ae51cd825_c.jpg b/src/dataset/iris/18607022104_4ae51cd825_c.jpg new file mode 100644 index 00000000..677d13b8 Binary files /dev/null and b/src/dataset/iris/18607022104_4ae51cd825_c.jpg differ diff --git a/src/dataset/iris/18609284458_9050303cee_c.jpg b/src/dataset/iris/18609284458_9050303cee_c.jpg new file mode 100644 index 00000000..abb45542 Binary files /dev/null and b/src/dataset/iris/18609284458_9050303cee_c.jpg differ diff --git a/src/dataset/iris/18740152185_dc4fbba87e_c.jpg b/src/dataset/iris/18740152185_dc4fbba87e_c.jpg new file mode 100644 index 00000000..0e4edee2 Binary files /dev/null and b/src/dataset/iris/18740152185_dc4fbba87e_c.jpg differ diff --git a/src/dataset/iris/19000157355_02f7534984_c.jpg b/src/dataset/iris/19000157355_02f7534984_c.jpg new file mode 100644 index 00000000..f6f9f1de Binary files /dev/null and b/src/dataset/iris/19000157355_02f7534984_c.jpg differ diff --git a/src/dataset/iris/19264439192_253a119ae2_c.jpg b/src/dataset/iris/19264439192_253a119ae2_c.jpg new file mode 100644 index 00000000..adbc0d96 Binary files /dev/null and b/src/dataset/iris/19264439192_253a119ae2_c.jpg differ diff --git a/src/dataset/iris/19358634009_a4f86630fa_c.jpg b/src/dataset/iris/19358634009_a4f86630fa_c.jpg new file mode 100644 index 00000000..5f0465ce Binary files /dev/null and b/src/dataset/iris/19358634009_a4f86630fa_c.jpg differ diff --git a/src/dataset/iris/19454472459_a662848284_c.jpg b/src/dataset/iris/19454472459_a662848284_c.jpg new file mode 100644 index 00000000..aa13a312 Binary files /dev/null and b/src/dataset/iris/19454472459_a662848284_c.jpg differ diff --git a/src/dataset/iris/19602449370_4512d73852_c.jpg b/src/dataset/iris/19602449370_4512d73852_c.jpg new file mode 100644 index 00000000..7a082090 Binary files /dev/null and b/src/dataset/iris/19602449370_4512d73852_c.jpg differ diff --git a/src/dataset/iris/19656002_d22ef07856_c.jpg b/src/dataset/iris/19656002_d22ef07856_c.jpg new file mode 100644 index 00000000..06087129 Binary files /dev/null and b/src/dataset/iris/19656002_d22ef07856_c.jpg differ diff --git a/src/dataset/iris/19905782069_63e767b7a4_c.jpg b/src/dataset/iris/19905782069_63e767b7a4_c.jpg new file mode 100644 index 00000000..ff30a0a8 Binary files /dev/null and b/src/dataset/iris/19905782069_63e767b7a4_c.jpg differ diff --git a/src/dataset/iris/2008591297_75b5eb0a7a_c.jpg b/src/dataset/iris/2008591297_75b5eb0a7a_c.jpg new file mode 100644 index 00000000..e1d80eba Binary files /dev/null and b/src/dataset/iris/2008591297_75b5eb0a7a_c.jpg differ diff --git a/src/dataset/iris/20599673662_2fb082d077_c.jpg b/src/dataset/iris/20599673662_2fb082d077_c.jpg new file mode 100644 index 00000000..450b19ba Binary files /dev/null and b/src/dataset/iris/20599673662_2fb082d077_c.jpg differ diff --git a/src/dataset/iris/20626977888_07453a1809_c.jpg b/src/dataset/iris/20626977888_07453a1809_c.jpg new file mode 100644 index 00000000..a8d88274 Binary files /dev/null and b/src/dataset/iris/20626977888_07453a1809_c.jpg differ diff --git a/src/dataset/iris/2064148462_9296f6fbc2_c.jpg b/src/dataset/iris/2064148462_9296f6fbc2_c.jpg new file mode 100644 index 00000000..4a2bb133 Binary files /dev/null and b/src/dataset/iris/2064148462_9296f6fbc2_c.jpg differ diff --git a/src/dataset/iris/2068572654_2ac6e75412_c.jpg b/src/dataset/iris/2068572654_2ac6e75412_c.jpg new file mode 100644 index 00000000..3771295e Binary files /dev/null and b/src/dataset/iris/2068572654_2ac6e75412_c.jpg differ diff --git a/src/dataset/iris/20729935676_dcf8396e34_c.jpg b/src/dataset/iris/20729935676_dcf8396e34_c.jpg new file mode 100644 index 00000000..dce6cd24 Binary files /dev/null and b/src/dataset/iris/20729935676_dcf8396e34_c.jpg differ diff --git a/src/dataset/iris/20755904065_27f7b06818_c.jpg b/src/dataset/iris/20755904065_27f7b06818_c.jpg new file mode 100644 index 00000000..d3cc24f6 Binary files /dev/null and b/src/dataset/iris/20755904065_27f7b06818_c.jpg differ diff --git a/src/dataset/iris/21156066750_8b1308077b_c.jpg b/src/dataset/iris/21156066750_8b1308077b_c.jpg new file mode 100644 index 00000000..abe87016 Binary files /dev/null and b/src/dataset/iris/21156066750_8b1308077b_c.jpg differ diff --git a/src/dataset/iris/213414618_7db960f86b_c.jpg b/src/dataset/iris/213414618_7db960f86b_c.jpg new file mode 100644 index 00000000..8324f7bf Binary files /dev/null and b/src/dataset/iris/213414618_7db960f86b_c.jpg differ diff --git a/src/dataset/iris/21368238020_2391fabbae_c.jpg b/src/dataset/iris/21368238020_2391fabbae_c.jpg new file mode 100644 index 00000000..e7787bd1 Binary files /dev/null and b/src/dataset/iris/21368238020_2391fabbae_c.jpg differ diff --git a/src/dataset/iris/21473362733_a362dfe7a7_c.jpg b/src/dataset/iris/21473362733_a362dfe7a7_c.jpg new file mode 100644 index 00000000..63b290d9 Binary files /dev/null and b/src/dataset/iris/21473362733_a362dfe7a7_c.jpg differ diff --git a/src/dataset/iris/2173216321_fcc2655200_c.jpg b/src/dataset/iris/2173216321_fcc2655200_c.jpg new file mode 100644 index 00000000..69770113 Binary files /dev/null and b/src/dataset/iris/2173216321_fcc2655200_c.jpg differ diff --git a/src/dataset/iris/21989190560_8e4c5fe34d_c.jpg b/src/dataset/iris/21989190560_8e4c5fe34d_c.jpg new file mode 100644 index 00000000..d49d4c59 Binary files /dev/null and b/src/dataset/iris/21989190560_8e4c5fe34d_c.jpg differ diff --git a/src/dataset/iris/22428101045_a8aecd42c8_c.jpg b/src/dataset/iris/22428101045_a8aecd42c8_c.jpg new file mode 100644 index 00000000..8619a6ff Binary files /dev/null and b/src/dataset/iris/22428101045_a8aecd42c8_c.jpg differ diff --git a/src/dataset/iris/2246250943_b38cb07405_c.jpg b/src/dataset/iris/2246250943_b38cb07405_c.jpg new file mode 100644 index 00000000..2423979a Binary files /dev/null and b/src/dataset/iris/2246250943_b38cb07405_c.jpg differ diff --git a/src/dataset/iris/2310777139_3f7e3698d2_c.jpg b/src/dataset/iris/2310777139_3f7e3698d2_c.jpg new file mode 100644 index 00000000..1fd777a8 Binary files /dev/null and b/src/dataset/iris/2310777139_3f7e3698d2_c.jpg differ diff --git a/src/dataset/iris/2310778209_854023e033_c.jpg b/src/dataset/iris/2310778209_854023e033_c.jpg new file mode 100644 index 00000000..b5b20ce8 Binary files /dev/null and b/src/dataset/iris/2310778209_854023e033_c.jpg differ diff --git a/src/dataset/iris/2310778457_4294cf3d0f_c.jpg b/src/dataset/iris/2310778457_4294cf3d0f_c.jpg new file mode 100644 index 00000000..9fef704d Binary files /dev/null and b/src/dataset/iris/2310778457_4294cf3d0f_c.jpg differ diff --git a/src/dataset/iris/2318108086_276a6b8cdf_c.jpg b/src/dataset/iris/2318108086_276a6b8cdf_c.jpg new file mode 100644 index 00000000..f7340696 Binary files /dev/null and b/src/dataset/iris/2318108086_276a6b8cdf_c.jpg differ diff --git a/src/dataset/iris/2322854489_537f79ed46_c.jpg b/src/dataset/iris/2322854489_537f79ed46_c.jpg new file mode 100644 index 00000000..b01f278f Binary files /dev/null and b/src/dataset/iris/2322854489_537f79ed46_c.jpg differ diff --git a/src/dataset/iris/2323951884_a5d7a91f4c_c.jpg b/src/dataset/iris/2323951884_a5d7a91f4c_c.jpg new file mode 100644 index 00000000..6a1c13b6 Binary files /dev/null and b/src/dataset/iris/2323951884_a5d7a91f4c_c.jpg differ diff --git a/src/dataset/iris/2328754112_b23f4e7c9f_c.jpg b/src/dataset/iris/2328754112_b23f4e7c9f_c.jpg new file mode 100644 index 00000000..5742b9cb Binary files /dev/null and b/src/dataset/iris/2328754112_b23f4e7c9f_c.jpg differ diff --git a/src/dataset/iris/23393703622_7d7f4b1cb6_c.jpg b/src/dataset/iris/23393703622_7d7f4b1cb6_c.jpg new file mode 100644 index 00000000..a02f0f05 Binary files /dev/null and b/src/dataset/iris/23393703622_7d7f4b1cb6_c.jpg differ diff --git a/src/dataset/iris/2366211581_4bf9d50f80_c.jpg b/src/dataset/iris/2366211581_4bf9d50f80_c.jpg new file mode 100644 index 00000000..71ea1ef3 Binary files /dev/null and b/src/dataset/iris/2366211581_4bf9d50f80_c.jpg differ diff --git a/src/dataset/iris/2372475031_a81fc2945b_c.jpg b/src/dataset/iris/2372475031_a81fc2945b_c.jpg new file mode 100644 index 00000000..595f0a6f Binary files /dev/null and b/src/dataset/iris/2372475031_a81fc2945b_c.jpg differ diff --git a/src/dataset/iris/2374992658_2aac0ef4ba_c.jpg b/src/dataset/iris/2374992658_2aac0ef4ba_c.jpg new file mode 100644 index 00000000..92a73bb8 Binary files /dev/null and b/src/dataset/iris/2374992658_2aac0ef4ba_c.jpg differ diff --git a/src/dataset/iris/2398755867_56d2e547f6_c.jpg b/src/dataset/iris/2398755867_56d2e547f6_c.jpg new file mode 100644 index 00000000..5f4c1c75 Binary files /dev/null and b/src/dataset/iris/2398755867_56d2e547f6_c.jpg differ diff --git a/src/dataset/iris/2411612369_cf891aca15_c.jpg b/src/dataset/iris/2411612369_cf891aca15_c.jpg new file mode 100644 index 00000000..9df1e90e Binary files /dev/null and b/src/dataset/iris/2411612369_cf891aca15_c.jpg differ diff --git a/src/dataset/iris/2419589660_80b6084bfc_c.jpg b/src/dataset/iris/2419589660_80b6084bfc_c.jpg new file mode 100644 index 00000000..417024a7 Binary files /dev/null and b/src/dataset/iris/2419589660_80b6084bfc_c.jpg differ diff --git a/src/dataset/iris/2429129356_ea30de9ecb_c.jpg b/src/dataset/iris/2429129356_ea30de9ecb_c.jpg new file mode 100644 index 00000000..e550db33 Binary files /dev/null and b/src/dataset/iris/2429129356_ea30de9ecb_c.jpg differ diff --git a/src/dataset/iris/2429138274_506667c3ff_c.jpg b/src/dataset/iris/2429138274_506667c3ff_c.jpg new file mode 100644 index 00000000..a1a4a61b Binary files /dev/null and b/src/dataset/iris/2429138274_506667c3ff_c.jpg differ diff --git a/src/dataset/iris/2436447767_c8df14db06_c.jpg b/src/dataset/iris/2436447767_c8df14db06_c.jpg new file mode 100644 index 00000000..398aae38 Binary files /dev/null and b/src/dataset/iris/2436447767_c8df14db06_c.jpg differ diff --git a/src/dataset/iris/24374494343_58242a83c8_c.jpg b/src/dataset/iris/24374494343_58242a83c8_c.jpg new file mode 100644 index 00000000..9039ec7b Binary files /dev/null and b/src/dataset/iris/24374494343_58242a83c8_c.jpg differ diff --git a/src/dataset/iris/2441096687_7d9dbbd82a_c.jpg b/src/dataset/iris/2441096687_7d9dbbd82a_c.jpg new file mode 100644 index 00000000..d932a8d1 Binary files /dev/null and b/src/dataset/iris/2441096687_7d9dbbd82a_c.jpg differ diff --git a/src/dataset/iris/2441254019_ba48518269_c.jpg b/src/dataset/iris/2441254019_ba48518269_c.jpg new file mode 100644 index 00000000..7837a4be Binary files /dev/null and b/src/dataset/iris/2441254019_ba48518269_c.jpg differ diff --git a/src/dataset/iris/2441258591_0d02d00abe_c.jpg b/src/dataset/iris/2441258591_0d02d00abe_c.jpg new file mode 100644 index 00000000..802dc324 Binary files /dev/null and b/src/dataset/iris/2441258591_0d02d00abe_c.jpg differ diff --git a/src/dataset/iris/2441259821_0312dc1bc8_c.jpg b/src/dataset/iris/2441259821_0312dc1bc8_c.jpg new file mode 100644 index 00000000..ee61d46f Binary files /dev/null and b/src/dataset/iris/2441259821_0312dc1bc8_c.jpg differ diff --git a/src/dataset/iris/2442083760_eaf2cffd8b_c.jpg b/src/dataset/iris/2442083760_eaf2cffd8b_c.jpg new file mode 100644 index 00000000..50cf9ca2 Binary files /dev/null and b/src/dataset/iris/2442083760_eaf2cffd8b_c.jpg differ diff --git a/src/dataset/iris/2444071743_ef3a0dc6fd_c.jpg b/src/dataset/iris/2444071743_ef3a0dc6fd_c.jpg new file mode 100644 index 00000000..416a5f1b Binary files /dev/null and b/src/dataset/iris/2444071743_ef3a0dc6fd_c.jpg differ diff --git a/src/dataset/iris/2445222110_1071313b91_c.jpg b/src/dataset/iris/2445222110_1071313b91_c.jpg new file mode 100644 index 00000000..edb09736 Binary files /dev/null and b/src/dataset/iris/2445222110_1071313b91_c.jpg differ diff --git a/src/dataset/iris/2447187131_6f99fd490f_c.jpg b/src/dataset/iris/2447187131_6f99fd490f_c.jpg new file mode 100644 index 00000000..1f4aae2c Binary files /dev/null and b/src/dataset/iris/2447187131_6f99fd490f_c.jpg differ diff --git a/src/dataset/iris/2447262097_30cb06f320_c.jpg b/src/dataset/iris/2447262097_30cb06f320_c.jpg new file mode 100644 index 00000000..c35e0ec7 Binary files /dev/null and b/src/dataset/iris/2447262097_30cb06f320_c.jpg differ diff --git a/src/dataset/iris/2447275023_443c3683e4_c.jpg b/src/dataset/iris/2447275023_443c3683e4_c.jpg new file mode 100644 index 00000000..7366c9e6 Binary files /dev/null and b/src/dataset/iris/2447275023_443c3683e4_c.jpg differ diff --git a/src/dataset/iris/2448014554_052581c677_c.jpg b/src/dataset/iris/2448014554_052581c677_c.jpg new file mode 100644 index 00000000..b7f1a1e3 Binary files /dev/null and b/src/dataset/iris/2448014554_052581c677_c.jpg differ diff --git a/src/dataset/iris/2448022510_c2a956ce79_c.jpg b/src/dataset/iris/2448022510_c2a956ce79_c.jpg new file mode 100644 index 00000000..774f9fd3 Binary files /dev/null and b/src/dataset/iris/2448022510_c2a956ce79_c.jpg differ diff --git a/src/dataset/iris/2448083172_b64875faeb_c.jpg b/src/dataset/iris/2448083172_b64875faeb_c.jpg new file mode 100644 index 00000000..002389ed Binary files /dev/null and b/src/dataset/iris/2448083172_b64875faeb_c.jpg differ diff --git a/src/dataset/iris/2448085442_e2a7b64645_c.jpg b/src/dataset/iris/2448085442_e2a7b64645_c.jpg new file mode 100644 index 00000000..b39070a6 Binary files /dev/null and b/src/dataset/iris/2448085442_e2a7b64645_c.jpg differ diff --git a/src/dataset/iris/2448085838_ea60e96edf_c.jpg b/src/dataset/iris/2448085838_ea60e96edf_c.jpg new file mode 100644 index 00000000..eab909bc Binary files /dev/null and b/src/dataset/iris/2448085838_ea60e96edf_c.jpg differ diff --git a/src/dataset/iris/2448099720_47c1877177_c.jpg b/src/dataset/iris/2448099720_47c1877177_c.jpg new file mode 100644 index 00000000..56d40288 Binary files /dev/null and b/src/dataset/iris/2448099720_47c1877177_c.jpg differ diff --git a/src/dataset/iris/2461134134_f546c62ae8_c.jpg b/src/dataset/iris/2461134134_f546c62ae8_c.jpg new file mode 100644 index 00000000..4f6b91a9 Binary files /dev/null and b/src/dataset/iris/2461134134_f546c62ae8_c.jpg differ diff --git a/src/dataset/iris/2461812527_7e7fbdbe16_c.jpg b/src/dataset/iris/2461812527_7e7fbdbe16_c.jpg new file mode 100644 index 00000000..988e124a Binary files /dev/null and b/src/dataset/iris/2461812527_7e7fbdbe16_c.jpg differ diff --git a/src/dataset/iris/2469067951_5b7c2cf0c2_c.jpg b/src/dataset/iris/2469067951_5b7c2cf0c2_c.jpg new file mode 100644 index 00000000..dcf0b471 Binary files /dev/null and b/src/dataset/iris/2469067951_5b7c2cf0c2_c.jpg differ diff --git a/src/dataset/iris/2473915828_d8c2000521_c.jpg b/src/dataset/iris/2473915828_d8c2000521_c.jpg new file mode 100644 index 00000000..83f0fbd2 Binary files /dev/null and b/src/dataset/iris/2473915828_d8c2000521_c.jpg differ diff --git a/src/dataset/iris/2475203107_b54dbf8560_c.jpg b/src/dataset/iris/2475203107_b54dbf8560_c.jpg new file mode 100644 index 00000000..ec243a14 Binary files /dev/null and b/src/dataset/iris/2475203107_b54dbf8560_c.jpg differ diff --git a/src/dataset/iris/2480328518_49f72452c6_c.jpg b/src/dataset/iris/2480328518_49f72452c6_c.jpg new file mode 100644 index 00000000..86900a61 Binary files /dev/null and b/src/dataset/iris/2480328518_49f72452c6_c.jpg differ diff --git a/src/dataset/iris/2480329022_7fe3aff787_c.jpg b/src/dataset/iris/2480329022_7fe3aff787_c.jpg new file mode 100644 index 00000000..c4ae1a35 Binary files /dev/null and b/src/dataset/iris/2480329022_7fe3aff787_c.jpg differ diff --git a/src/dataset/iris/2480975113_91ea986d07_c.jpg b/src/dataset/iris/2480975113_91ea986d07_c.jpg new file mode 100644 index 00000000..f49cb97a Binary files /dev/null and b/src/dataset/iris/2480975113_91ea986d07_c.jpg differ diff --git a/src/dataset/iris/2485135892_411b3b910e_c.jpg b/src/dataset/iris/2485135892_411b3b910e_c.jpg new file mode 100644 index 00000000..5ab6ca76 Binary files /dev/null and b/src/dataset/iris/2485135892_411b3b910e_c.jpg differ diff --git a/src/dataset/iris/248596102_2dc510218a_c.jpg b/src/dataset/iris/248596102_2dc510218a_c.jpg new file mode 100644 index 00000000..f1efba79 Binary files /dev/null and b/src/dataset/iris/248596102_2dc510218a_c.jpg differ diff --git a/src/dataset/iris/2489132520_89106a25ed_c.jpg b/src/dataset/iris/2489132520_89106a25ed_c.jpg new file mode 100644 index 00000000..f868d69c Binary files /dev/null and b/src/dataset/iris/2489132520_89106a25ed_c.jpg differ diff --git a/src/dataset/iris/24908045001_2076364423_c.jpg b/src/dataset/iris/24908045001_2076364423_c.jpg new file mode 100644 index 00000000..444346c5 Binary files /dev/null and b/src/dataset/iris/24908045001_2076364423_c.jpg differ diff --git a/src/dataset/iris/2495774640_7d9874bf08_c.jpg b/src/dataset/iris/2495774640_7d9874bf08_c.jpg new file mode 100644 index 00000000..a29482d5 Binary files /dev/null and b/src/dataset/iris/2495774640_7d9874bf08_c.jpg differ diff --git a/src/dataset/iris/249982730_9e5d75434e_c.jpg b/src/dataset/iris/249982730_9e5d75434e_c.jpg new file mode 100644 index 00000000..b2fc5f23 Binary files /dev/null and b/src/dataset/iris/249982730_9e5d75434e_c.jpg differ diff --git a/src/dataset/iris/2502939836_d3b76182d7_c.jpg b/src/dataset/iris/2502939836_d3b76182d7_c.jpg new file mode 100644 index 00000000..0df20d34 Binary files /dev/null and b/src/dataset/iris/2502939836_d3b76182d7_c.jpg differ diff --git a/src/dataset/iris/2510549761_17f98f07d2_c.jpg b/src/dataset/iris/2510549761_17f98f07d2_c.jpg new file mode 100644 index 00000000..ccd1df35 Binary files /dev/null and b/src/dataset/iris/2510549761_17f98f07d2_c.jpg differ diff --git a/src/dataset/iris/2511260185_734f57804d_c.jpg b/src/dataset/iris/2511260185_734f57804d_c.jpg new file mode 100644 index 00000000..f821e008 Binary files /dev/null and b/src/dataset/iris/2511260185_734f57804d_c.jpg differ diff --git a/src/dataset/iris/2514968370_790bc750ff_c.jpg b/src/dataset/iris/2514968370_790bc750ff_c.jpg new file mode 100644 index 00000000..84f625bc Binary files /dev/null and b/src/dataset/iris/2514968370_790bc750ff_c.jpg differ diff --git a/src/dataset/iris/2515153818_f180e95ac7_c.jpg b/src/dataset/iris/2515153818_f180e95ac7_c.jpg new file mode 100644 index 00000000..62bfaf33 Binary files /dev/null and b/src/dataset/iris/2515153818_f180e95ac7_c.jpg differ diff --git a/src/dataset/iris/25200075244_39041d8762_c.jpg b/src/dataset/iris/25200075244_39041d8762_c.jpg new file mode 100644 index 00000000..080be14a Binary files /dev/null and b/src/dataset/iris/25200075244_39041d8762_c.jpg differ diff --git a/src/dataset/iris/2520208746_e25a56e7cd_c.jpg b/src/dataset/iris/2520208746_e25a56e7cd_c.jpg new file mode 100644 index 00000000..e9aad56d Binary files /dev/null and b/src/dataset/iris/2520208746_e25a56e7cd_c.jpg differ diff --git a/src/dataset/iris/2523647839_4dc217d702_c.jpg b/src/dataset/iris/2523647839_4dc217d702_c.jpg new file mode 100644 index 00000000..d19cef6b Binary files /dev/null and b/src/dataset/iris/2523647839_4dc217d702_c.jpg differ diff --git a/src/dataset/iris/2526612567_a16d66225b_c.jpg b/src/dataset/iris/2526612567_a16d66225b_c.jpg new file mode 100644 index 00000000..63439024 Binary files /dev/null and b/src/dataset/iris/2526612567_a16d66225b_c.jpg differ diff --git a/src/dataset/iris/2528712191_8e15b11a81_c.jpg b/src/dataset/iris/2528712191_8e15b11a81_c.jpg new file mode 100644 index 00000000..4521e6f4 Binary files /dev/null and b/src/dataset/iris/2528712191_8e15b11a81_c.jpg differ diff --git a/src/dataset/iris/2529826374_415fc4c053_c.jpg b/src/dataset/iris/2529826374_415fc4c053_c.jpg new file mode 100644 index 00000000..68ce0009 Binary files /dev/null and b/src/dataset/iris/2529826374_415fc4c053_c.jpg differ diff --git a/src/dataset/iris/2531120666_5f99f2b30b_c.jpg b/src/dataset/iris/2531120666_5f99f2b30b_c.jpg new file mode 100644 index 00000000..e85ce63e Binary files /dev/null and b/src/dataset/iris/2531120666_5f99f2b30b_c.jpg differ diff --git a/src/dataset/iris/2538920275_4289c408f4_c.jpg b/src/dataset/iris/2538920275_4289c408f4_c.jpg new file mode 100644 index 00000000..b6c978d7 Binary files /dev/null and b/src/dataset/iris/2538920275_4289c408f4_c.jpg differ diff --git a/src/dataset/iris/2539736322_1939fafb51_c.jpg b/src/dataset/iris/2539736322_1939fafb51_c.jpg new file mode 100644 index 00000000..24da79bd Binary files /dev/null and b/src/dataset/iris/2539736322_1939fafb51_c.jpg differ diff --git a/src/dataset/iris/2539747960_4a6b154388_c.jpg b/src/dataset/iris/2539747960_4a6b154388_c.jpg new file mode 100644 index 00000000..f25387c7 Binary files /dev/null and b/src/dataset/iris/2539747960_4a6b154388_c.jpg differ diff --git a/src/dataset/iris/2541955693_a7de91b072_c.jpg b/src/dataset/iris/2541955693_a7de91b072_c.jpg new file mode 100644 index 00000000..3620db0a Binary files /dev/null and b/src/dataset/iris/2541955693_a7de91b072_c.jpg differ diff --git a/src/dataset/iris/2543017308_1aeb32d1cd_c.jpg b/src/dataset/iris/2543017308_1aeb32d1cd_c.jpg new file mode 100644 index 00000000..e1a5b896 Binary files /dev/null and b/src/dataset/iris/2543017308_1aeb32d1cd_c.jpg differ diff --git a/src/dataset/iris/2545279753_a570036417_c.jpg b/src/dataset/iris/2545279753_a570036417_c.jpg new file mode 100644 index 00000000..3e28b261 Binary files /dev/null and b/src/dataset/iris/2545279753_a570036417_c.jpg differ diff --git a/src/dataset/iris/2546104126_b9a0e6d2f7_c.jpg b/src/dataset/iris/2546104126_b9a0e6d2f7_c.jpg new file mode 100644 index 00000000..e394de90 Binary files /dev/null and b/src/dataset/iris/2546104126_b9a0e6d2f7_c.jpg differ diff --git a/src/dataset/iris/2547641756_26929acf89_c.jpg b/src/dataset/iris/2547641756_26929acf89_c.jpg new file mode 100644 index 00000000..c836eba2 Binary files /dev/null and b/src/dataset/iris/2547641756_26929acf89_c.jpg differ diff --git a/src/dataset/iris/2549893634_68efecfc00_c.jpg b/src/dataset/iris/2549893634_68efecfc00_c.jpg new file mode 100644 index 00000000..c2c2bf9b Binary files /dev/null and b/src/dataset/iris/2549893634_68efecfc00_c.jpg differ diff --git a/src/dataset/iris/2553372742_69d02419ff_c.jpg b/src/dataset/iris/2553372742_69d02419ff_c.jpg new file mode 100644 index 00000000..7042a0d5 Binary files /dev/null and b/src/dataset/iris/2553372742_69d02419ff_c.jpg differ diff --git a/src/dataset/iris/2553543117_6c06af83d7_c.jpg b/src/dataset/iris/2553543117_6c06af83d7_c.jpg new file mode 100644 index 00000000..d4f33bf6 Binary files /dev/null and b/src/dataset/iris/2553543117_6c06af83d7_c.jpg differ diff --git a/src/dataset/iris/2557708900_d00e8b3589_c.jpg b/src/dataset/iris/2557708900_d00e8b3589_c.jpg new file mode 100644 index 00000000..5c570a96 Binary files /dev/null and b/src/dataset/iris/2557708900_d00e8b3589_c.jpg differ diff --git a/src/dataset/iris/25644138578_bd2aac2fcf_c.jpg b/src/dataset/iris/25644138578_bd2aac2fcf_c.jpg new file mode 100644 index 00000000..084fadef Binary files /dev/null and b/src/dataset/iris/25644138578_bd2aac2fcf_c.jpg differ diff --git a/src/dataset/iris/2566119007_9f7a781c51_c.jpg b/src/dataset/iris/2566119007_9f7a781c51_c.jpg new file mode 100644 index 00000000..a6b73a36 Binary files /dev/null and b/src/dataset/iris/2566119007_9f7a781c51_c.jpg differ diff --git a/src/dataset/iris/2566216005_bdeb8f393f_c.jpg b/src/dataset/iris/2566216005_bdeb8f393f_c.jpg new file mode 100644 index 00000000..7db2b68f Binary files /dev/null and b/src/dataset/iris/2566216005_bdeb8f393f_c.jpg differ diff --git a/src/dataset/iris/2566759786_cb4e1b3b36_c.jpg b/src/dataset/iris/2566759786_cb4e1b3b36_c.jpg new file mode 100644 index 00000000..bbef6f47 Binary files /dev/null and b/src/dataset/iris/2566759786_cb4e1b3b36_c.jpg differ diff --git a/src/dataset/iris/2567025932_8487cd37cb_c.jpg b/src/dataset/iris/2567025932_8487cd37cb_c.jpg new file mode 100644 index 00000000..33858f36 Binary files /dev/null and b/src/dataset/iris/2567025932_8487cd37cb_c.jpg differ diff --git a/src/dataset/iris/2567732726_ee7785c629_c.jpg b/src/dataset/iris/2567732726_ee7785c629_c.jpg new file mode 100644 index 00000000..586dc9d3 Binary files /dev/null and b/src/dataset/iris/2567732726_ee7785c629_c.jpg differ diff --git a/src/dataset/iris/2572109745_4565fc7369_c.jpg b/src/dataset/iris/2572109745_4565fc7369_c.jpg new file mode 100644 index 00000000..9f21446a Binary files /dev/null and b/src/dataset/iris/2572109745_4565fc7369_c.jpg differ diff --git a/src/dataset/iris/2572109923_2954f7b950_c.jpg b/src/dataset/iris/2572109923_2954f7b950_c.jpg new file mode 100644 index 00000000..2292eedf Binary files /dev/null and b/src/dataset/iris/2572109923_2954f7b950_c.jpg differ diff --git a/src/dataset/iris/2572936158_2dc9bb5b37_c.jpg b/src/dataset/iris/2572936158_2dc9bb5b37_c.jpg new file mode 100644 index 00000000..6641ee31 Binary files /dev/null and b/src/dataset/iris/2572936158_2dc9bb5b37_c.jpg differ diff --git a/src/dataset/iris/2573501175_da746f9eca_c.jpg b/src/dataset/iris/2573501175_da746f9eca_c.jpg new file mode 100644 index 00000000..d21132d5 Binary files /dev/null and b/src/dataset/iris/2573501175_da746f9eca_c.jpg differ diff --git a/src/dataset/iris/2573782629_59316b0251_c.jpg b/src/dataset/iris/2573782629_59316b0251_c.jpg new file mode 100644 index 00000000..2ba3565c Binary files /dev/null and b/src/dataset/iris/2573782629_59316b0251_c.jpg differ diff --git a/src/dataset/iris/2574722859_ef84d3241a_c.jpg b/src/dataset/iris/2574722859_ef84d3241a_c.jpg new file mode 100644 index 00000000..8faf55ec Binary files /dev/null and b/src/dataset/iris/2574722859_ef84d3241a_c.jpg differ diff --git a/src/dataset/iris/2574742986_f222d19eac_c.jpg b/src/dataset/iris/2574742986_f222d19eac_c.jpg new file mode 100644 index 00000000..df38bdc9 Binary files /dev/null and b/src/dataset/iris/2574742986_f222d19eac_c.jpg differ diff --git a/src/dataset/iris/2575107777_4ffa578bc0_c.jpg b/src/dataset/iris/2575107777_4ffa578bc0_c.jpg new file mode 100644 index 00000000..9f063a02 Binary files /dev/null and b/src/dataset/iris/2575107777_4ffa578bc0_c.jpg differ diff --git a/src/dataset/iris/2583134870_09d19cf78e_c.jpg b/src/dataset/iris/2583134870_09d19cf78e_c.jpg new file mode 100644 index 00000000..2172892d Binary files /dev/null and b/src/dataset/iris/2583134870_09d19cf78e_c.jpg differ diff --git a/src/dataset/iris/2585910165_081ecbd2f3_c.jpg b/src/dataset/iris/2585910165_081ecbd2f3_c.jpg new file mode 100644 index 00000000..ca26f698 Binary files /dev/null and b/src/dataset/iris/2585910165_081ecbd2f3_c.jpg differ diff --git a/src/dataset/iris/2586377674_954e980c84_c.jpg b/src/dataset/iris/2586377674_954e980c84_c.jpg new file mode 100644 index 00000000..4c7dfad3 Binary files /dev/null and b/src/dataset/iris/2586377674_954e980c84_c.jpg differ diff --git a/src/dataset/iris/2586380522_d0917a3a27_c.jpg b/src/dataset/iris/2586380522_d0917a3a27_c.jpg new file mode 100644 index 00000000..756b7c5f Binary files /dev/null and b/src/dataset/iris/2586380522_d0917a3a27_c.jpg differ diff --git a/src/dataset/iris/2608014074_346a3c2bcd_c.jpg b/src/dataset/iris/2608014074_346a3c2bcd_c.jpg new file mode 100644 index 00000000..3a332e20 Binary files /dev/null and b/src/dataset/iris/2608014074_346a3c2bcd_c.jpg differ diff --git a/src/dataset/iris/26122634754_d4f546d541_c.jpg b/src/dataset/iris/26122634754_d4f546d541_c.jpg new file mode 100644 index 00000000..fada88b1 Binary files /dev/null and b/src/dataset/iris/26122634754_d4f546d541_c.jpg differ diff --git a/src/dataset/iris/2614011980_eef21ba455_c.jpg b/src/dataset/iris/2614011980_eef21ba455_c.jpg new file mode 100644 index 00000000..44940c3e Binary files /dev/null and b/src/dataset/iris/2614011980_eef21ba455_c.jpg differ diff --git a/src/dataset/iris/26237260714_5f9a3b800e_c.jpg b/src/dataset/iris/26237260714_5f9a3b800e_c.jpg new file mode 100644 index 00000000..28b82312 Binary files /dev/null and b/src/dataset/iris/26237260714_5f9a3b800e_c.jpg differ diff --git a/src/dataset/iris/2624174010_4620f6f0a0_c.jpg b/src/dataset/iris/2624174010_4620f6f0a0_c.jpg new file mode 100644 index 00000000..74aa026e Binary files /dev/null and b/src/dataset/iris/2624174010_4620f6f0a0_c.jpg differ diff --git a/src/dataset/iris/2624262631_1ee38d9841_c.jpg b/src/dataset/iris/2624262631_1ee38d9841_c.jpg new file mode 100644 index 00000000..6ca40731 Binary files /dev/null and b/src/dataset/iris/2624262631_1ee38d9841_c.jpg differ diff --git a/src/dataset/iris/2624941294_b939711b08_c.jpg b/src/dataset/iris/2624941294_b939711b08_c.jpg new file mode 100644 index 00000000..881db62d Binary files /dev/null and b/src/dataset/iris/2624941294_b939711b08_c.jpg differ diff --git a/src/dataset/iris/2625081690_c143ff1988_c.jpg b/src/dataset/iris/2625081690_c143ff1988_c.jpg new file mode 100644 index 00000000..461eeabc Binary files /dev/null and b/src/dataset/iris/2625081690_c143ff1988_c.jpg differ diff --git a/src/dataset/iris/26332432598_57c1b46b1f_c.jpg b/src/dataset/iris/26332432598_57c1b46b1f_c.jpg new file mode 100644 index 00000000..42b47257 Binary files /dev/null and b/src/dataset/iris/26332432598_57c1b46b1f_c.jpg differ diff --git a/src/dataset/iris/26385803895_9fc3bb7bd4_c.jpg b/src/dataset/iris/26385803895_9fc3bb7bd4_c.jpg new file mode 100644 index 00000000..9d20070d Binary files /dev/null and b/src/dataset/iris/26385803895_9fc3bb7bd4_c.jpg differ diff --git a/src/dataset/iris/2641163014_2413fdda79_c.jpg b/src/dataset/iris/2641163014_2413fdda79_c.jpg new file mode 100644 index 00000000..7d97a639 Binary files /dev/null and b/src/dataset/iris/2641163014_2413fdda79_c.jpg differ diff --git a/src/dataset/iris/26514327762_e0d521a8d3_c.jpg b/src/dataset/iris/26514327762_e0d521a8d3_c.jpg new file mode 100644 index 00000000..92d2932c Binary files /dev/null and b/src/dataset/iris/26514327762_e0d521a8d3_c.jpg differ diff --git a/src/dataset/iris/2654548742_9d62a8d0f4_c.jpg b/src/dataset/iris/2654548742_9d62a8d0f4_c.jpg new file mode 100644 index 00000000..9849624a Binary files /dev/null and b/src/dataset/iris/2654548742_9d62a8d0f4_c.jpg differ diff --git a/src/dataset/iris/26591224416_84a4764cef_c.jpg b/src/dataset/iris/26591224416_84a4764cef_c.jpg new file mode 100644 index 00000000..ca565251 Binary files /dev/null and b/src/dataset/iris/26591224416_84a4764cef_c.jpg differ diff --git a/src/dataset/iris/26615124863_ae84b8bd62_c.jpg b/src/dataset/iris/26615124863_ae84b8bd62_c.jpg new file mode 100644 index 00000000..c2ea743e Binary files /dev/null and b/src/dataset/iris/26615124863_ae84b8bd62_c.jpg differ diff --git a/src/dataset/iris/2662830057_92779189ff_c.jpg b/src/dataset/iris/2662830057_92779189ff_c.jpg new file mode 100644 index 00000000..195631c8 Binary files /dev/null and b/src/dataset/iris/2662830057_92779189ff_c.jpg differ diff --git a/src/dataset/iris/26648049736_f5c54d9793_c.jpg b/src/dataset/iris/26648049736_f5c54d9793_c.jpg new file mode 100644 index 00000000..ad226864 Binary files /dev/null and b/src/dataset/iris/26648049736_f5c54d9793_c.jpg differ diff --git a/src/dataset/iris/26663807244_2f4c80fd42_c.jpg b/src/dataset/iris/26663807244_2f4c80fd42_c.jpg new file mode 100644 index 00000000..e522dad2 Binary files /dev/null and b/src/dataset/iris/26663807244_2f4c80fd42_c.jpg differ diff --git a/src/dataset/iris/2669474557_742340ee32_c.jpg b/src/dataset/iris/2669474557_742340ee32_c.jpg new file mode 100644 index 00000000..b45c6603 Binary files /dev/null and b/src/dataset/iris/2669474557_742340ee32_c.jpg differ diff --git a/src/dataset/iris/26696931932_4795db69a6_c.jpg b/src/dataset/iris/26696931932_4795db69a6_c.jpg new file mode 100644 index 00000000..686c02ad Binary files /dev/null and b/src/dataset/iris/26696931932_4795db69a6_c.jpg differ diff --git a/src/dataset/iris/26711592773_a9b0ba2588_c.jpg b/src/dataset/iris/26711592773_a9b0ba2588_c.jpg new file mode 100644 index 00000000..579b66aa Binary files /dev/null and b/src/dataset/iris/26711592773_a9b0ba2588_c.jpg differ diff --git a/src/dataset/iris/26711602090_8771fdc84b_c.jpg b/src/dataset/iris/26711602090_8771fdc84b_c.jpg new file mode 100644 index 00000000..fb92b93d Binary files /dev/null and b/src/dataset/iris/26711602090_8771fdc84b_c.jpg differ diff --git a/src/dataset/iris/26735100655_9b996ec9f4_c.jpg b/src/dataset/iris/26735100655_9b996ec9f4_c.jpg new file mode 100644 index 00000000..5833a133 Binary files /dev/null and b/src/dataset/iris/26735100655_9b996ec9f4_c.jpg differ diff --git a/src/dataset/iris/26739413294_9454336756_c.jpg b/src/dataset/iris/26739413294_9454336756_c.jpg new file mode 100644 index 00000000..2db07c35 Binary files /dev/null and b/src/dataset/iris/26739413294_9454336756_c.jpg differ diff --git a/src/dataset/iris/26740979540_17918a39f4_c.jpg b/src/dataset/iris/26740979540_17918a39f4_c.jpg new file mode 100644 index 00000000..40a887df Binary files /dev/null and b/src/dataset/iris/26740979540_17918a39f4_c.jpg differ diff --git a/src/dataset/iris/26742093495_9fbd1eea7f_c.jpg b/src/dataset/iris/26742093495_9fbd1eea7f_c.jpg new file mode 100644 index 00000000..0bcd0fe2 Binary files /dev/null and b/src/dataset/iris/26742093495_9fbd1eea7f_c.jpg differ diff --git a/src/dataset/iris/26774374114_6d377e63e8_c.jpg b/src/dataset/iris/26774374114_6d377e63e8_c.jpg new file mode 100644 index 00000000..deef01ec Binary files /dev/null and b/src/dataset/iris/26774374114_6d377e63e8_c.jpg differ diff --git a/src/dataset/iris/26777968710_1952623fc8_c.jpg b/src/dataset/iris/26777968710_1952623fc8_c.jpg new file mode 100644 index 00000000..7e2f72e0 Binary files /dev/null and b/src/dataset/iris/26777968710_1952623fc8_c.jpg differ diff --git a/src/dataset/iris/26783377827_f4e82c0857_c.jpg b/src/dataset/iris/26783377827_f4e82c0857_c.jpg new file mode 100644 index 00000000..4fbae76c Binary files /dev/null and b/src/dataset/iris/26783377827_f4e82c0857_c.jpg differ diff --git a/src/dataset/iris/26849459003_ea45c2189b_c.jpg b/src/dataset/iris/26849459003_ea45c2189b_c.jpg new file mode 100644 index 00000000..b51870cf Binary files /dev/null and b/src/dataset/iris/26849459003_ea45c2189b_c.jpg differ diff --git a/src/dataset/iris/26864868024_909f74f678_c.jpg b/src/dataset/iris/26864868024_909f74f678_c.jpg new file mode 100644 index 00000000..d13ea12c Binary files /dev/null and b/src/dataset/iris/26864868024_909f74f678_c.jpg differ diff --git a/src/dataset/iris/26891941715_2ea5ecb141_c.jpg b/src/dataset/iris/26891941715_2ea5ecb141_c.jpg new file mode 100644 index 00000000..7537fe0c Binary files /dev/null and b/src/dataset/iris/26891941715_2ea5ecb141_c.jpg differ diff --git a/src/dataset/iris/26952328518_569f944c82_c.jpg b/src/dataset/iris/26952328518_569f944c82_c.jpg new file mode 100644 index 00000000..10c23c20 Binary files /dev/null and b/src/dataset/iris/26952328518_569f944c82_c.jpg differ diff --git a/src/dataset/iris/27059169713_43fce365a4_c.jpg b/src/dataset/iris/27059169713_43fce365a4_c.jpg new file mode 100644 index 00000000..c828fb82 Binary files /dev/null and b/src/dataset/iris/27059169713_43fce365a4_c.jpg differ diff --git a/src/dataset/iris/27071041400_031ce70f60_c.jpg b/src/dataset/iris/27071041400_031ce70f60_c.jpg new file mode 100644 index 00000000..10dc917a Binary files /dev/null and b/src/dataset/iris/27071041400_031ce70f60_c.jpg differ diff --git a/src/dataset/iris/27123696535_dfd0ed2cb7_c.jpg b/src/dataset/iris/27123696535_dfd0ed2cb7_c.jpg new file mode 100644 index 00000000..b02dc52d Binary files /dev/null and b/src/dataset/iris/27123696535_dfd0ed2cb7_c.jpg differ diff --git a/src/dataset/iris/2720657246_13d59b2f33_c.jpg b/src/dataset/iris/2720657246_13d59b2f33_c.jpg new file mode 100644 index 00000000..7b1bf273 Binary files /dev/null and b/src/dataset/iris/2720657246_13d59b2f33_c.jpg differ diff --git a/src/dataset/iris/27220963404_93b97e9fd2_c.jpg b/src/dataset/iris/27220963404_93b97e9fd2_c.jpg new file mode 100644 index 00000000..c8b22c7a Binary files /dev/null and b/src/dataset/iris/27220963404_93b97e9fd2_c.jpg differ diff --git a/src/dataset/iris/27355148587_c3c61049f0_c.jpg b/src/dataset/iris/27355148587_c3c61049f0_c.jpg new file mode 100644 index 00000000..7dceecf3 Binary files /dev/null and b/src/dataset/iris/27355148587_c3c61049f0_c.jpg differ diff --git a/src/dataset/iris/27372999142_609e9df858_c.jpg b/src/dataset/iris/27372999142_609e9df858_c.jpg new file mode 100644 index 00000000..eb7e8a2d Binary files /dev/null and b/src/dataset/iris/27372999142_609e9df858_c.jpg differ diff --git a/src/dataset/iris/27419054687_c8b3b18066_c.jpg b/src/dataset/iris/27419054687_c8b3b18066_c.jpg new file mode 100644 index 00000000..88b0ada6 Binary files /dev/null and b/src/dataset/iris/27419054687_c8b3b18066_c.jpg differ diff --git a/src/dataset/iris/27422482155_5fe51f09b2_c.jpg b/src/dataset/iris/27422482155_5fe51f09b2_c.jpg new file mode 100644 index 00000000..0b0dd0a1 Binary files /dev/null and b/src/dataset/iris/27422482155_5fe51f09b2_c.jpg differ diff --git a/src/dataset/iris/27435424581_b4db19c9cb_c.jpg b/src/dataset/iris/27435424581_b4db19c9cb_c.jpg new file mode 100644 index 00000000..f0f6e3e0 Binary files /dev/null and b/src/dataset/iris/27435424581_b4db19c9cb_c.jpg differ diff --git a/src/dataset/iris/27436125285_bc32f066f6_c.jpg b/src/dataset/iris/27436125285_bc32f066f6_c.jpg new file mode 100644 index 00000000..0612c66f Binary files /dev/null and b/src/dataset/iris/27436125285_bc32f066f6_c.jpg differ diff --git a/src/dataset/iris/27452553762_4d30053ebd_c.jpg b/src/dataset/iris/27452553762_4d30053ebd_c.jpg new file mode 100644 index 00000000..b2b2efda Binary files /dev/null and b/src/dataset/iris/27452553762_4d30053ebd_c.jpg differ diff --git a/src/dataset/iris/2748142637_a587c9f651_c.jpg b/src/dataset/iris/2748142637_a587c9f651_c.jpg new file mode 100644 index 00000000..852013b3 Binary files /dev/null and b/src/dataset/iris/2748142637_a587c9f651_c.jpg differ diff --git a/src/dataset/iris/27540781760_50165460f4_c.jpg b/src/dataset/iris/27540781760_50165460f4_c.jpg new file mode 100644 index 00000000..ed61d90e Binary files /dev/null and b/src/dataset/iris/27540781760_50165460f4_c.jpg differ diff --git a/src/dataset/iris/27582030384_f27c28e3a4_c.jpg b/src/dataset/iris/27582030384_f27c28e3a4_c.jpg new file mode 100644 index 00000000..337423e2 Binary files /dev/null and b/src/dataset/iris/27582030384_f27c28e3a4_c.jpg differ diff --git a/src/dataset/iris/27626004657_5ec2c97804_c.jpg b/src/dataset/iris/27626004657_5ec2c97804_c.jpg new file mode 100644 index 00000000..e4b9a4e6 Binary files /dev/null and b/src/dataset/iris/27626004657_5ec2c97804_c.jpg differ diff --git a/src/dataset/iris/27634408371_78d923d8f7_c.jpg b/src/dataset/iris/27634408371_78d923d8f7_c.jpg new file mode 100644 index 00000000..fa5f5d22 Binary files /dev/null and b/src/dataset/iris/27634408371_78d923d8f7_c.jpg differ diff --git a/src/dataset/iris/2763729272_3ceecc23fb_c.jpg b/src/dataset/iris/2763729272_3ceecc23fb_c.jpg new file mode 100644 index 00000000..a1dc94cb Binary files /dev/null and b/src/dataset/iris/2763729272_3ceecc23fb_c.jpg differ diff --git a/src/dataset/iris/27645538855_54a7edcf12_c.jpg b/src/dataset/iris/27645538855_54a7edcf12_c.jpg new file mode 100644 index 00000000..73ef94f7 Binary files /dev/null and b/src/dataset/iris/27645538855_54a7edcf12_c.jpg differ diff --git a/src/dataset/iris/2769760370_d7c67dee1a_c.jpg b/src/dataset/iris/2769760370_d7c67dee1a_c.jpg new file mode 100644 index 00000000..03d72c69 Binary files /dev/null and b/src/dataset/iris/2769760370_d7c67dee1a_c.jpg differ diff --git a/src/dataset/iris/27854422445_33e7fd0c34_c.jpg b/src/dataset/iris/27854422445_33e7fd0c34_c.jpg new file mode 100644 index 00000000..a6a359c2 Binary files /dev/null and b/src/dataset/iris/27854422445_33e7fd0c34_c.jpg differ diff --git a/src/dataset/iris/27894000367_d321529b5b_c.jpg b/src/dataset/iris/27894000367_d321529b5b_c.jpg new file mode 100644 index 00000000..d6d23b15 Binary files /dev/null and b/src/dataset/iris/27894000367_d321529b5b_c.jpg differ diff --git a/src/dataset/iris/28147192098_43f681940f_c.jpg b/src/dataset/iris/28147192098_43f681940f_c.jpg new file mode 100644 index 00000000..e47111c5 Binary files /dev/null and b/src/dataset/iris/28147192098_43f681940f_c.jpg differ diff --git a/src/dataset/iris/2814880135_7c2f094891_c.jpg b/src/dataset/iris/2814880135_7c2f094891_c.jpg new file mode 100644 index 00000000..d6552f09 Binary files /dev/null and b/src/dataset/iris/2814880135_7c2f094891_c.jpg differ diff --git a/src/dataset/iris/28217014167_39844d3670_c.jpg b/src/dataset/iris/28217014167_39844d3670_c.jpg new file mode 100644 index 00000000..ee707385 Binary files /dev/null and b/src/dataset/iris/28217014167_39844d3670_c.jpg differ diff --git a/src/dataset/iris/28283484088_62fc6bfdcb_c.jpg b/src/dataset/iris/28283484088_62fc6bfdcb_c.jpg new file mode 100644 index 00000000..5525f9df Binary files /dev/null and b/src/dataset/iris/28283484088_62fc6bfdcb_c.jpg differ diff --git a/src/dataset/iris/28338003986_c4a2387126_c.jpg b/src/dataset/iris/28338003986_c4a2387126_c.jpg new file mode 100644 index 00000000..929bc530 Binary files /dev/null and b/src/dataset/iris/28338003986_c4a2387126_c.jpg differ diff --git a/src/dataset/iris/28408952038_cbbddc711b_c.jpg b/src/dataset/iris/28408952038_cbbddc711b_c.jpg new file mode 100644 index 00000000..62ed3532 Binary files /dev/null and b/src/dataset/iris/28408952038_cbbddc711b_c.jpg differ diff --git a/src/dataset/iris/28435110138_8ec481d5e0_c.jpg b/src/dataset/iris/28435110138_8ec481d5e0_c.jpg new file mode 100644 index 00000000..d724a711 Binary files /dev/null and b/src/dataset/iris/28435110138_8ec481d5e0_c.jpg differ diff --git a/src/dataset/iris/2847028240_d7dc276ee1_c.jpg b/src/dataset/iris/2847028240_d7dc276ee1_c.jpg new file mode 100644 index 00000000..f80eb805 Binary files /dev/null and b/src/dataset/iris/2847028240_d7dc276ee1_c.jpg differ diff --git a/src/dataset/iris/2852417974_acc7151cb7_c.jpg b/src/dataset/iris/2852417974_acc7151cb7_c.jpg new file mode 100644 index 00000000..591ed549 Binary files /dev/null and b/src/dataset/iris/2852417974_acc7151cb7_c.jpg differ diff --git a/src/dataset/iris/2852418142_9c8e8af475_c.jpg b/src/dataset/iris/2852418142_9c8e8af475_c.jpg new file mode 100644 index 00000000..9a5e3155 Binary files /dev/null and b/src/dataset/iris/2852418142_9c8e8af475_c.jpg differ diff --git a/src/dataset/iris/28547099108_942ba67434_c.jpg b/src/dataset/iris/28547099108_942ba67434_c.jpg new file mode 100644 index 00000000..ceb92775 Binary files /dev/null and b/src/dataset/iris/28547099108_942ba67434_c.jpg differ diff --git a/src/dataset/iris/28547099248_245e4e7ed0_c.jpg b/src/dataset/iris/28547099248_245e4e7ed0_c.jpg new file mode 100644 index 00000000..e5f9ea8d Binary files /dev/null and b/src/dataset/iris/28547099248_245e4e7ed0_c.jpg differ diff --git a/src/dataset/iris/28547099318_98ac5a03b8_c.jpg b/src/dataset/iris/28547099318_98ac5a03b8_c.jpg new file mode 100644 index 00000000..7446983c Binary files /dev/null and b/src/dataset/iris/28547099318_98ac5a03b8_c.jpg differ diff --git a/src/dataset/iris/28547099438_38ac1343e9_c.jpg b/src/dataset/iris/28547099438_38ac1343e9_c.jpg new file mode 100644 index 00000000..baa9e93e Binary files /dev/null and b/src/dataset/iris/28547099438_38ac1343e9_c.jpg differ diff --git a/src/dataset/iris/28547099728_e65e4e1a65_c.jpg b/src/dataset/iris/28547099728_e65e4e1a65_c.jpg new file mode 100644 index 00000000..2e48dd8b Binary files /dev/null and b/src/dataset/iris/28547099728_e65e4e1a65_c.jpg differ diff --git a/src/dataset/iris/28547099788_e565177a24_c.jpg b/src/dataset/iris/28547099788_e565177a24_c.jpg new file mode 100644 index 00000000..ed29851d Binary files /dev/null and b/src/dataset/iris/28547099788_e565177a24_c.jpg differ diff --git a/src/dataset/iris/28661129018_edbbab8050_c.jpg b/src/dataset/iris/28661129018_edbbab8050_c.jpg new file mode 100644 index 00000000..6d03f25e Binary files /dev/null and b/src/dataset/iris/28661129018_edbbab8050_c.jpg differ diff --git a/src/dataset/iris/28811243060_d9debb00c6_c.jpg b/src/dataset/iris/28811243060_d9debb00c6_c.jpg new file mode 100644 index 00000000..08492aac Binary files /dev/null and b/src/dataset/iris/28811243060_d9debb00c6_c.jpg differ diff --git a/src/dataset/iris/28882613988_f722525f11_c.jpg b/src/dataset/iris/28882613988_f722525f11_c.jpg new file mode 100644 index 00000000..de5472c9 Binary files /dev/null and b/src/dataset/iris/28882613988_f722525f11_c.jpg differ diff --git a/src/dataset/iris/2894203667_8b1b79cc3f_c.jpg b/src/dataset/iris/2894203667_8b1b79cc3f_c.jpg new file mode 100644 index 00000000..9cd90744 Binary files /dev/null and b/src/dataset/iris/2894203667_8b1b79cc3f_c.jpg differ diff --git a/src/dataset/iris/29107399967_6fe38920fa_c.jpg b/src/dataset/iris/29107399967_6fe38920fa_c.jpg new file mode 100644 index 00000000..780e6941 Binary files /dev/null and b/src/dataset/iris/29107399967_6fe38920fa_c.jpg differ diff --git a/src/dataset/iris/29214903848_660d3b0398_c.jpg b/src/dataset/iris/29214903848_660d3b0398_c.jpg new file mode 100644 index 00000000..e9f2b753 Binary files /dev/null and b/src/dataset/iris/29214903848_660d3b0398_c.jpg differ diff --git a/src/dataset/iris/29247590697_a34c78352a_c.jpg b/src/dataset/iris/29247590697_a34c78352a_c.jpg new file mode 100644 index 00000000..8463c7f5 Binary files /dev/null and b/src/dataset/iris/29247590697_a34c78352a_c.jpg differ diff --git a/src/dataset/iris/2977784598_8bfebf62c9_c.jpg b/src/dataset/iris/2977784598_8bfebf62c9_c.jpg new file mode 100644 index 00000000..9d8baf81 Binary files /dev/null and b/src/dataset/iris/2977784598_8bfebf62c9_c.jpg differ diff --git a/src/dataset/iris/29793820331_192488f4af_c.jpg b/src/dataset/iris/29793820331_192488f4af_c.jpg new file mode 100644 index 00000000..28d3bd6d Binary files /dev/null and b/src/dataset/iris/29793820331_192488f4af_c.jpg differ diff --git a/src/dataset/iris/2987634074_c83c2e8c72_c.jpg b/src/dataset/iris/2987634074_c83c2e8c72_c.jpg new file mode 100644 index 00000000..8b9a500e Binary files /dev/null and b/src/dataset/iris/2987634074_c83c2e8c72_c.jpg differ diff --git a/src/dataset/iris/3006210327_6bf1f166e7_c.jpg b/src/dataset/iris/3006210327_6bf1f166e7_c.jpg new file mode 100644 index 00000000..290ec634 Binary files /dev/null and b/src/dataset/iris/3006210327_6bf1f166e7_c.jpg differ diff --git a/src/dataset/iris/30391376108_a7659fa3f7_c.jpg b/src/dataset/iris/30391376108_a7659fa3f7_c.jpg new file mode 100644 index 00000000..9927bafe Binary files /dev/null and b/src/dataset/iris/30391376108_a7659fa3f7_c.jpg differ diff --git a/src/dataset/iris/30458768038_03bf23575f_c.jpg b/src/dataset/iris/30458768038_03bf23575f_c.jpg new file mode 100644 index 00000000..78ff7ee0 Binary files /dev/null and b/src/dataset/iris/30458768038_03bf23575f_c.jpg differ diff --git a/src/dataset/iris/30517300125_46d359c8c9_c.jpg b/src/dataset/iris/30517300125_46d359c8c9_c.jpg new file mode 100644 index 00000000..93866296 Binary files /dev/null and b/src/dataset/iris/30517300125_46d359c8c9_c.jpg differ diff --git a/src/dataset/iris/3086224230_6c0de62886_c.jpg b/src/dataset/iris/3086224230_6c0de62886_c.jpg new file mode 100644 index 00000000..bffa874b Binary files /dev/null and b/src/dataset/iris/3086224230_6c0de62886_c.jpg differ diff --git a/src/dataset/iris/3095164737_acc176b7a2_c.jpg b/src/dataset/iris/3095164737_acc176b7a2_c.jpg new file mode 100644 index 00000000..2dc202d8 Binary files /dev/null and b/src/dataset/iris/3095164737_acc176b7a2_c.jpg differ diff --git a/src/dataset/iris/3095164787_1c210f111c_c.jpg b/src/dataset/iris/3095164787_1c210f111c_c.jpg new file mode 100644 index 00000000..19f2a32b Binary files /dev/null and b/src/dataset/iris/3095164787_1c210f111c_c.jpg differ diff --git a/src/dataset/iris/3096006376_931804f5d5_c.jpg b/src/dataset/iris/3096006376_931804f5d5_c.jpg new file mode 100644 index 00000000..d6189ce2 Binary files /dev/null and b/src/dataset/iris/3096006376_931804f5d5_c.jpg differ diff --git a/src/dataset/iris/31106018168_03c667fef4_c.jpg b/src/dataset/iris/31106018168_03c667fef4_c.jpg new file mode 100644 index 00000000..f300552c Binary files /dev/null and b/src/dataset/iris/31106018168_03c667fef4_c.jpg differ diff --git a/src/dataset/iris/3125571955_ae61709621_c.jpg b/src/dataset/iris/3125571955_ae61709621_c.jpg new file mode 100644 index 00000000..96842bea Binary files /dev/null and b/src/dataset/iris/3125571955_ae61709621_c.jpg differ diff --git a/src/dataset/iris/3162550402_c5d534d70f_c.jpg b/src/dataset/iris/3162550402_c5d534d70f_c.jpg new file mode 100644 index 00000000..9435a5a0 Binary files /dev/null and b/src/dataset/iris/3162550402_c5d534d70f_c.jpg differ diff --git a/src/dataset/iris/3190002090_05562511c5_c.jpg b/src/dataset/iris/3190002090_05562511c5_c.jpg new file mode 100644 index 00000000..11f857d2 Binary files /dev/null and b/src/dataset/iris/3190002090_05562511c5_c.jpg differ diff --git a/src/dataset/iris/3202352114_27a6d17021_c.jpg b/src/dataset/iris/3202352114_27a6d17021_c.jpg new file mode 100644 index 00000000..97f8b749 Binary files /dev/null and b/src/dataset/iris/3202352114_27a6d17021_c.jpg differ diff --git a/src/dataset/iris/32172527653_7eb4b9ac56_c.jpg b/src/dataset/iris/32172527653_7eb4b9ac56_c.jpg new file mode 100644 index 00000000..eb78ac7a Binary files /dev/null and b/src/dataset/iris/32172527653_7eb4b9ac56_c.jpg differ diff --git a/src/dataset/iris/32179857847_c8abbee772_c.jpg b/src/dataset/iris/32179857847_c8abbee772_c.jpg new file mode 100644 index 00000000..2b52c55e Binary files /dev/null and b/src/dataset/iris/32179857847_c8abbee772_c.jpg differ diff --git a/src/dataset/iris/3221111599_4253236ff6_c.jpg b/src/dataset/iris/3221111599_4253236ff6_c.jpg new file mode 100644 index 00000000..e1564d73 Binary files /dev/null and b/src/dataset/iris/3221111599_4253236ff6_c.jpg differ diff --git a/src/dataset/iris/3234529758_556c70e3da_c.jpg b/src/dataset/iris/3234529758_556c70e3da_c.jpg new file mode 100644 index 00000000..e61ee808 Binary files /dev/null and b/src/dataset/iris/3234529758_556c70e3da_c.jpg differ diff --git a/src/dataset/iris/3246883876_5caea33334_c.jpg b/src/dataset/iris/3246883876_5caea33334_c.jpg new file mode 100644 index 00000000..6daedfc2 Binary files /dev/null and b/src/dataset/iris/3246883876_5caea33334_c.jpg differ diff --git a/src/dataset/iris/32481165800_2fd5beafdd_c.jpg b/src/dataset/iris/32481165800_2fd5beafdd_c.jpg new file mode 100644 index 00000000..6762a866 Binary files /dev/null and b/src/dataset/iris/32481165800_2fd5beafdd_c.jpg differ diff --git a/src/dataset/iris/3248876356_75f4475f5d_c.jpg b/src/dataset/iris/3248876356_75f4475f5d_c.jpg new file mode 100644 index 00000000..6016f8d4 Binary files /dev/null and b/src/dataset/iris/3248876356_75f4475f5d_c.jpg differ diff --git a/src/dataset/iris/32599698867_b047b6b652_c.jpg b/src/dataset/iris/32599698867_b047b6b652_c.jpg new file mode 100644 index 00000000..62842bbc Binary files /dev/null and b/src/dataset/iris/32599698867_b047b6b652_c.jpg differ diff --git a/src/dataset/iris/32608003863_6183373d1d_c.jpg b/src/dataset/iris/32608003863_6183373d1d_c.jpg new file mode 100644 index 00000000..c2e756ae Binary files /dev/null and b/src/dataset/iris/32608003863_6183373d1d_c.jpg differ diff --git a/src/dataset/iris/3274756118_6ae1165848_c.jpg b/src/dataset/iris/3274756118_6ae1165848_c.jpg new file mode 100644 index 00000000..21406cfe Binary files /dev/null and b/src/dataset/iris/3274756118_6ae1165848_c.jpg differ diff --git a/src/dataset/iris/3277889642_b957b83a45_c.jpg b/src/dataset/iris/3277889642_b957b83a45_c.jpg new file mode 100644 index 00000000..6b0b1fd6 Binary files /dev/null and b/src/dataset/iris/3277889642_b957b83a45_c.jpg differ diff --git a/src/dataset/iris/32850367893_3c0fc939a5_c.jpg b/src/dataset/iris/32850367893_3c0fc939a5_c.jpg new file mode 100644 index 00000000..49d6dab6 Binary files /dev/null and b/src/dataset/iris/32850367893_3c0fc939a5_c.jpg differ diff --git a/src/dataset/iris/33112977281_ba27c7e11f_c.jpg b/src/dataset/iris/33112977281_ba27c7e11f_c.jpg new file mode 100644 index 00000000..ee40d6a8 Binary files /dev/null and b/src/dataset/iris/33112977281_ba27c7e11f_c.jpg differ diff --git a/src/dataset/iris/3314626647_43d11a9838_c.jpg b/src/dataset/iris/3314626647_43d11a9838_c.jpg new file mode 100644 index 00000000..e7af4812 Binary files /dev/null and b/src/dataset/iris/3314626647_43d11a9838_c.jpg differ diff --git a/src/dataset/iris/3315461506_3711046d56_c.jpg b/src/dataset/iris/3315461506_3711046d56_c.jpg new file mode 100644 index 00000000..1993f3e9 Binary files /dev/null and b/src/dataset/iris/3315461506_3711046d56_c.jpg differ diff --git a/src/dataset/iris/3317447035_9c54e32a6f_c.jpg b/src/dataset/iris/3317447035_9c54e32a6f_c.jpg new file mode 100644 index 00000000..8b5ec18a Binary files /dev/null and b/src/dataset/iris/3317447035_9c54e32a6f_c.jpg differ diff --git a/src/dataset/iris/3318761127_db9c401d35_c.jpg b/src/dataset/iris/3318761127_db9c401d35_c.jpg new file mode 100644 index 00000000..cc67333d Binary files /dev/null and b/src/dataset/iris/3318761127_db9c401d35_c.jpg differ diff --git a/src/dataset/iris/33192921423_2f93f8fa6f_c.jpg b/src/dataset/iris/33192921423_2f93f8fa6f_c.jpg new file mode 100644 index 00000000..a617594a Binary files /dev/null and b/src/dataset/iris/33192921423_2f93f8fa6f_c.jpg differ diff --git a/src/dataset/iris/33393151274_bc4d847a2c_c.jpg b/src/dataset/iris/33393151274_bc4d847a2c_c.jpg new file mode 100644 index 00000000..9c02999f Binary files /dev/null and b/src/dataset/iris/33393151274_bc4d847a2c_c.jpg differ diff --git a/src/dataset/iris/3347852770_87ccb81122_c.jpg b/src/dataset/iris/3347852770_87ccb81122_c.jpg new file mode 100644 index 00000000..daf0970b Binary files /dev/null and b/src/dataset/iris/3347852770_87ccb81122_c.jpg differ diff --git a/src/dataset/iris/33533931446_7dacdd5385_c.jpg b/src/dataset/iris/33533931446_7dacdd5385_c.jpg new file mode 100644 index 00000000..c44191b3 Binary files /dev/null and b/src/dataset/iris/33533931446_7dacdd5385_c.jpg differ diff --git a/src/dataset/iris/335817339_ccd6309251_c.jpg b/src/dataset/iris/335817339_ccd6309251_c.jpg new file mode 100644 index 00000000..d4f26e48 Binary files /dev/null and b/src/dataset/iris/335817339_ccd6309251_c.jpg differ diff --git a/src/dataset/iris/33590877154_57de88bd3e_c.jpg b/src/dataset/iris/33590877154_57de88bd3e_c.jpg new file mode 100644 index 00000000..f245e6d2 Binary files /dev/null and b/src/dataset/iris/33590877154_57de88bd3e_c.jpg differ diff --git a/src/dataset/iris/33696364163_cd8e13ba02_c.jpg b/src/dataset/iris/33696364163_cd8e13ba02_c.jpg new file mode 100644 index 00000000..3045841e Binary files /dev/null and b/src/dataset/iris/33696364163_cd8e13ba02_c.jpg differ diff --git a/src/dataset/iris/33696402034_a0959ca7f6_c.jpg b/src/dataset/iris/33696402034_a0959ca7f6_c.jpg new file mode 100644 index 00000000..d1016852 Binary files /dev/null and b/src/dataset/iris/33696402034_a0959ca7f6_c.jpg differ diff --git a/src/dataset/iris/33696402084_254013aa35_c.jpg b/src/dataset/iris/33696402084_254013aa35_c.jpg new file mode 100644 index 00000000..c1efefd7 Binary files /dev/null and b/src/dataset/iris/33696402084_254013aa35_c.jpg differ diff --git a/src/dataset/iris/33710542733_73659a27a1_c.jpg b/src/dataset/iris/33710542733_73659a27a1_c.jpg new file mode 100644 index 00000000..67e302ac Binary files /dev/null and b/src/dataset/iris/33710542733_73659a27a1_c.jpg differ diff --git a/src/dataset/iris/33752452694_8fd7d13f4f_c.jpg b/src/dataset/iris/33752452694_8fd7d13f4f_c.jpg new file mode 100644 index 00000000..a3e7ea6e Binary files /dev/null and b/src/dataset/iris/33752452694_8fd7d13f4f_c.jpg differ diff --git a/src/dataset/iris/33752456094_e5d8e9e505_c.jpg b/src/dataset/iris/33752456094_e5d8e9e505_c.jpg new file mode 100644 index 00000000..3ceb988e Binary files /dev/null and b/src/dataset/iris/33752456094_e5d8e9e505_c.jpg differ diff --git a/src/dataset/iris/33765087683_2405e8a1f0_c.jpg b/src/dataset/iris/33765087683_2405e8a1f0_c.jpg new file mode 100644 index 00000000..2ebfdce0 Binary files /dev/null and b/src/dataset/iris/33765087683_2405e8a1f0_c.jpg differ diff --git a/src/dataset/iris/33768191353_b76258cef2_c.jpg b/src/dataset/iris/33768191353_b76258cef2_c.jpg new file mode 100644 index 00000000..01f27101 Binary files /dev/null and b/src/dataset/iris/33768191353_b76258cef2_c.jpg differ diff --git a/src/dataset/iris/33785579773_ea6ea518a3_c.jpg b/src/dataset/iris/33785579773_ea6ea518a3_c.jpg new file mode 100644 index 00000000..283748d7 Binary files /dev/null and b/src/dataset/iris/33785579773_ea6ea518a3_c.jpg differ diff --git a/src/dataset/iris/33803689703_050faa3576_c.jpg b/src/dataset/iris/33803689703_050faa3576_c.jpg new file mode 100644 index 00000000..e903d19f Binary files /dev/null and b/src/dataset/iris/33803689703_050faa3576_c.jpg differ diff --git a/src/dataset/iris/33808546344_55f1c73566_c.jpg b/src/dataset/iris/33808546344_55f1c73566_c.jpg new file mode 100644 index 00000000..e3eba720 Binary files /dev/null and b/src/dataset/iris/33808546344_55f1c73566_c.jpg differ diff --git a/src/dataset/iris/33860698580_8140405f9d_c.jpg b/src/dataset/iris/33860698580_8140405f9d_c.jpg new file mode 100644 index 00000000..0060e97b Binary files /dev/null and b/src/dataset/iris/33860698580_8140405f9d_c.jpg differ diff --git a/src/dataset/iris/33881430516_cd2f9e63e1_c.jpg b/src/dataset/iris/33881430516_cd2f9e63e1_c.jpg new file mode 100644 index 00000000..fbf9fdae Binary files /dev/null and b/src/dataset/iris/33881430516_cd2f9e63e1_c.jpg differ diff --git a/src/dataset/iris/33885428948_501e9e3d49_c.jpg b/src/dataset/iris/33885428948_501e9e3d49_c.jpg new file mode 100644 index 00000000..9f1c3ffe Binary files /dev/null and b/src/dataset/iris/33885428948_501e9e3d49_c.jpg differ diff --git a/src/dataset/iris/33885602148_ac1fae3f8f_c.jpg b/src/dataset/iris/33885602148_ac1fae3f8f_c.jpg new file mode 100644 index 00000000..6dea982a Binary files /dev/null and b/src/dataset/iris/33885602148_ac1fae3f8f_c.jpg differ diff --git a/src/dataset/iris/33921383786_d55020f4d6_c.jpg b/src/dataset/iris/33921383786_d55020f4d6_c.jpg new file mode 100644 index 00000000..65b91cc2 Binary files /dev/null and b/src/dataset/iris/33921383786_d55020f4d6_c.jpg differ diff --git a/src/dataset/iris/3396666977_8a40e0f02b_c.jpg b/src/dataset/iris/3396666977_8a40e0f02b_c.jpg new file mode 100644 index 00000000..57192a5d Binary files /dev/null and b/src/dataset/iris/3396666977_8a40e0f02b_c.jpg differ diff --git a/src/dataset/iris/33978892840_5d8bf70c4c_c.jpg b/src/dataset/iris/33978892840_5d8bf70c4c_c.jpg new file mode 100644 index 00000000..676d5268 Binary files /dev/null and b/src/dataset/iris/33978892840_5d8bf70c4c_c.jpg differ diff --git a/src/dataset/iris/3398884794_8b8f1beda9_c.jpg b/src/dataset/iris/3398884794_8b8f1beda9_c.jpg new file mode 100644 index 00000000..8fe7e3b9 Binary files /dev/null and b/src/dataset/iris/3398884794_8b8f1beda9_c.jpg differ diff --git a/src/dataset/iris/34030685083_08a93032cb_c.jpg b/src/dataset/iris/34030685083_08a93032cb_c.jpg new file mode 100644 index 00000000..d44caafa Binary files /dev/null and b/src/dataset/iris/34030685083_08a93032cb_c.jpg differ diff --git a/src/dataset/iris/3407837376_5f2c3d69a8_c.jpg b/src/dataset/iris/3407837376_5f2c3d69a8_c.jpg new file mode 100644 index 00000000..3acbbab8 Binary files /dev/null and b/src/dataset/iris/3407837376_5f2c3d69a8_c.jpg differ diff --git a/src/dataset/iris/34151942523_939a1bdec9_c.jpg b/src/dataset/iris/34151942523_939a1bdec9_c.jpg new file mode 100644 index 00000000..5df12d45 Binary files /dev/null and b/src/dataset/iris/34151942523_939a1bdec9_c.jpg differ diff --git a/src/dataset/iris/34187376144_a50991aacb_c.jpg b/src/dataset/iris/34187376144_a50991aacb_c.jpg new file mode 100644 index 00000000..d848d7fa Binary files /dev/null and b/src/dataset/iris/34187376144_a50991aacb_c.jpg differ diff --git a/src/dataset/iris/34189082423_919dbc0faa_c.jpg b/src/dataset/iris/34189082423_919dbc0faa_c.jpg new file mode 100644 index 00000000..43094207 Binary files /dev/null and b/src/dataset/iris/34189082423_919dbc0faa_c.jpg differ diff --git a/src/dataset/iris/34209551350_eb340281f4_c.jpg b/src/dataset/iris/34209551350_eb340281f4_c.jpg new file mode 100644 index 00000000..3e0cdde7 Binary files /dev/null and b/src/dataset/iris/34209551350_eb340281f4_c.jpg differ diff --git a/src/dataset/iris/34220627303_88d92b5658_c.jpg b/src/dataset/iris/34220627303_88d92b5658_c.jpg new file mode 100644 index 00000000..fdeb7735 Binary files /dev/null and b/src/dataset/iris/34220627303_88d92b5658_c.jpg differ diff --git a/src/dataset/iris/34252782101_8700c26f53_c.jpg b/src/dataset/iris/34252782101_8700c26f53_c.jpg new file mode 100644 index 00000000..de7c7a62 Binary files /dev/null and b/src/dataset/iris/34252782101_8700c26f53_c.jpg differ diff --git a/src/dataset/iris/34264344962_3134cc9596_c.jpg b/src/dataset/iris/34264344962_3134cc9596_c.jpg new file mode 100644 index 00000000..9345b904 Binary files /dev/null and b/src/dataset/iris/34264344962_3134cc9596_c.jpg differ diff --git a/src/dataset/iris/34278404803_e25be2a087_c.jpg b/src/dataset/iris/34278404803_e25be2a087_c.jpg new file mode 100644 index 00000000..ee861812 Binary files /dev/null and b/src/dataset/iris/34278404803_e25be2a087_c.jpg differ diff --git a/src/dataset/iris/3428362433_1e705ac8d8_c.jpg b/src/dataset/iris/3428362433_1e705ac8d8_c.jpg new file mode 100644 index 00000000..a396f77a Binary files /dev/null and b/src/dataset/iris/3428362433_1e705ac8d8_c.jpg differ diff --git a/src/dataset/iris/343260112_1ed93eea14_c.jpg b/src/dataset/iris/343260112_1ed93eea14_c.jpg new file mode 100644 index 00000000..e133a95a Binary files /dev/null and b/src/dataset/iris/343260112_1ed93eea14_c.jpg differ diff --git a/src/dataset/iris/34355853611_fab5afa7a6_c.jpg b/src/dataset/iris/34355853611_fab5afa7a6_c.jpg new file mode 100644 index 00000000..add1828c Binary files /dev/null and b/src/dataset/iris/34355853611_fab5afa7a6_c.jpg differ diff --git a/src/dataset/iris/34366672424_d4675407fb_c.jpg b/src/dataset/iris/34366672424_d4675407fb_c.jpg new file mode 100644 index 00000000..6bbed30a Binary files /dev/null and b/src/dataset/iris/34366672424_d4675407fb_c.jpg differ diff --git a/src/dataset/iris/3438290390_1bcc6d06b9_c.jpg b/src/dataset/iris/3438290390_1bcc6d06b9_c.jpg new file mode 100644 index 00000000..60724ac2 Binary files /dev/null and b/src/dataset/iris/3438290390_1bcc6d06b9_c.jpg differ diff --git a/src/dataset/iris/34400404775_dd658ce7e3_c.jpg b/src/dataset/iris/34400404775_dd658ce7e3_c.jpg new file mode 100644 index 00000000..6090c4ea Binary files /dev/null and b/src/dataset/iris/34400404775_dd658ce7e3_c.jpg differ diff --git a/src/dataset/iris/34413362842_dbd505c25a_c.jpg b/src/dataset/iris/34413362842_dbd505c25a_c.jpg new file mode 100644 index 00000000..6f694f9a Binary files /dev/null and b/src/dataset/iris/34413362842_dbd505c25a_c.jpg differ diff --git a/src/dataset/iris/34476184244_82cd041c68_c.jpg b/src/dataset/iris/34476184244_82cd041c68_c.jpg new file mode 100644 index 00000000..823a3859 Binary files /dev/null and b/src/dataset/iris/34476184244_82cd041c68_c.jpg differ diff --git a/src/dataset/iris/34506399085_173baaef1a_c.jpg b/src/dataset/iris/34506399085_173baaef1a_c.jpg new file mode 100644 index 00000000..0867934d Binary files /dev/null and b/src/dataset/iris/34506399085_173baaef1a_c.jpg differ diff --git a/src/dataset/iris/34518579083_50cb298579_c.jpg b/src/dataset/iris/34518579083_50cb298579_c.jpg new file mode 100644 index 00000000..32d7f43c Binary files /dev/null and b/src/dataset/iris/34518579083_50cb298579_c.jpg differ diff --git a/src/dataset/iris/3453334097_6369765aab_c.jpg b/src/dataset/iris/3453334097_6369765aab_c.jpg new file mode 100644 index 00000000..9cbcd3f1 Binary files /dev/null and b/src/dataset/iris/3453334097_6369765aab_c.jpg differ diff --git a/src/dataset/iris/34534107976_b0b8a4ed54_c.jpg b/src/dataset/iris/34534107976_b0b8a4ed54_c.jpg new file mode 100644 index 00000000..1f7c8010 Binary files /dev/null and b/src/dataset/iris/34534107976_b0b8a4ed54_c.jpg differ diff --git a/src/dataset/iris/34563563743_f8d11b02e8_c.jpg b/src/dataset/iris/34563563743_f8d11b02e8_c.jpg new file mode 100644 index 00000000..858d96f0 Binary files /dev/null and b/src/dataset/iris/34563563743_f8d11b02e8_c.jpg differ diff --git a/src/dataset/iris/34570378561_7b23cbcc0e_c.jpg b/src/dataset/iris/34570378561_7b23cbcc0e_c.jpg new file mode 100644 index 00000000..4b5f2fed Binary files /dev/null and b/src/dataset/iris/34570378561_7b23cbcc0e_c.jpg differ diff --git a/src/dataset/iris/34612656932_f6f0520a9a_c.jpg b/src/dataset/iris/34612656932_f6f0520a9a_c.jpg new file mode 100644 index 00000000..48514a75 Binary files /dev/null and b/src/dataset/iris/34612656932_f6f0520a9a_c.jpg differ diff --git a/src/dataset/iris/34623881693_d5b5b5dafe_c.jpg b/src/dataset/iris/34623881693_d5b5b5dafe_c.jpg new file mode 100644 index 00000000..c4ba5330 Binary files /dev/null and b/src/dataset/iris/34623881693_d5b5b5dafe_c.jpg differ diff --git a/src/dataset/iris/34636691785_099e4bed0a_c.jpg b/src/dataset/iris/34636691785_099e4bed0a_c.jpg new file mode 100644 index 00000000..22431c18 Binary files /dev/null and b/src/dataset/iris/34636691785_099e4bed0a_c.jpg differ diff --git a/src/dataset/iris/34645934674_9a91d4076f_c.jpg b/src/dataset/iris/34645934674_9a91d4076f_c.jpg new file mode 100644 index 00000000..2ea16f29 Binary files /dev/null and b/src/dataset/iris/34645934674_9a91d4076f_c.jpg differ diff --git a/src/dataset/iris/34679741415_f681a27ba0_c.jpg b/src/dataset/iris/34679741415_f681a27ba0_c.jpg new file mode 100644 index 00000000..1467f6e5 Binary files /dev/null and b/src/dataset/iris/34679741415_f681a27ba0_c.jpg differ diff --git a/src/dataset/iris/34716874641_bce52ac053_c.jpg b/src/dataset/iris/34716874641_bce52ac053_c.jpg new file mode 100644 index 00000000..ca289752 Binary files /dev/null and b/src/dataset/iris/34716874641_bce52ac053_c.jpg differ diff --git a/src/dataset/iris/3481049671_bcb7074016_c.jpg b/src/dataset/iris/3481049671_bcb7074016_c.jpg new file mode 100644 index 00000000..2ef63dbc Binary files /dev/null and b/src/dataset/iris/3481049671_bcb7074016_c.jpg differ diff --git a/src/dataset/iris/34813147012_6aaa2cc997_c.jpg b/src/dataset/iris/34813147012_6aaa2cc997_c.jpg new file mode 100644 index 00000000..4e9d6f71 Binary files /dev/null and b/src/dataset/iris/34813147012_6aaa2cc997_c.jpg differ diff --git a/src/dataset/iris/3481861572_290a0a8dbd_c.jpg b/src/dataset/iris/3481861572_290a0a8dbd_c.jpg new file mode 100644 index 00000000..4a0447f2 Binary files /dev/null and b/src/dataset/iris/3481861572_290a0a8dbd_c.jpg differ diff --git a/src/dataset/iris/34827362710_83d5b4e4be_c.jpg b/src/dataset/iris/34827362710_83d5b4e4be_c.jpg new file mode 100644 index 00000000..dd3274ee Binary files /dev/null and b/src/dataset/iris/34827362710_83d5b4e4be_c.jpg differ diff --git a/src/dataset/iris/3484849618_a29c4b7219_c.jpg b/src/dataset/iris/3484849618_a29c4b7219_c.jpg new file mode 100644 index 00000000..83034c8e Binary files /dev/null and b/src/dataset/iris/3484849618_a29c4b7219_c.jpg differ diff --git a/src/dataset/iris/3484850026_0b86849678_c.jpg b/src/dataset/iris/3484850026_0b86849678_c.jpg new file mode 100644 index 00000000..a01ac46b Binary files /dev/null and b/src/dataset/iris/3484850026_0b86849678_c.jpg differ diff --git a/src/dataset/iris/3484850098_6f6545cc45_c.jpg b/src/dataset/iris/3484850098_6f6545cc45_c.jpg new file mode 100644 index 00000000..1ed86f7a Binary files /dev/null and b/src/dataset/iris/3484850098_6f6545cc45_c.jpg differ diff --git a/src/dataset/iris/3492353511_dae482d79d_c.jpg b/src/dataset/iris/3492353511_dae482d79d_c.jpg new file mode 100644 index 00000000..9689c5d4 Binary files /dev/null and b/src/dataset/iris/3492353511_dae482d79d_c.jpg differ diff --git a/src/dataset/iris/3493470498_f55b10aef9_c.jpg b/src/dataset/iris/3493470498_f55b10aef9_c.jpg new file mode 100644 index 00000000..85e73f44 Binary files /dev/null and b/src/dataset/iris/3493470498_f55b10aef9_c.jpg differ diff --git a/src/dataset/iris/3495191055_00bcdd130f_c.jpg b/src/dataset/iris/3495191055_00bcdd130f_c.jpg new file mode 100644 index 00000000..f35fff4d Binary files /dev/null and b/src/dataset/iris/3495191055_00bcdd130f_c.jpg differ diff --git a/src/dataset/iris/3495194655_d6d1cbdb25_c.jpg b/src/dataset/iris/3495194655_d6d1cbdb25_c.jpg new file mode 100644 index 00000000..cc1a6244 Binary files /dev/null and b/src/dataset/iris/3495194655_d6d1cbdb25_c.jpg differ diff --git a/src/dataset/iris/3495362394_7b2ffe4dfc_c.jpg b/src/dataset/iris/3495362394_7b2ffe4dfc_c.jpg new file mode 100644 index 00000000..5c499ab0 Binary files /dev/null and b/src/dataset/iris/3495362394_7b2ffe4dfc_c.jpg differ diff --git a/src/dataset/iris/3495999652_9eb25b02ea_c.jpg b/src/dataset/iris/3495999652_9eb25b02ea_c.jpg new file mode 100644 index 00000000..cd88dadb Binary files /dev/null and b/src/dataset/iris/3495999652_9eb25b02ea_c.jpg differ diff --git a/src/dataset/iris/3500336407_f7c2a3fb65_c.jpg b/src/dataset/iris/3500336407_f7c2a3fb65_c.jpg new file mode 100644 index 00000000..654f72ff Binary files /dev/null and b/src/dataset/iris/3500336407_f7c2a3fb65_c.jpg differ diff --git a/src/dataset/iris/35022437235_01be97f514_c.jpg b/src/dataset/iris/35022437235_01be97f514_c.jpg new file mode 100644 index 00000000..9d64fcc3 Binary files /dev/null and b/src/dataset/iris/35022437235_01be97f514_c.jpg differ diff --git a/src/dataset/iris/3505038105_8acf66b4dd_c.jpg b/src/dataset/iris/3505038105_8acf66b4dd_c.jpg new file mode 100644 index 00000000..1860c846 Binary files /dev/null and b/src/dataset/iris/3505038105_8acf66b4dd_c.jpg differ diff --git a/src/dataset/iris/3505196603_02330d345f_c.jpg b/src/dataset/iris/3505196603_02330d345f_c.jpg new file mode 100644 index 00000000..48419772 Binary files /dev/null and b/src/dataset/iris/3505196603_02330d345f_c.jpg differ diff --git a/src/dataset/iris/3505722507_fc0a7652f3_c.jpg b/src/dataset/iris/3505722507_fc0a7652f3_c.jpg new file mode 100644 index 00000000..a573bdfc Binary files /dev/null and b/src/dataset/iris/3505722507_fc0a7652f3_c.jpg differ diff --git a/src/dataset/iris/3510495567_e9f104488e_c.jpg b/src/dataset/iris/3510495567_e9f104488e_c.jpg new file mode 100644 index 00000000..3320cbef Binary files /dev/null and b/src/dataset/iris/3510495567_e9f104488e_c.jpg differ diff --git a/src/dataset/iris/3513095278_67028ea689_c.jpg b/src/dataset/iris/3513095278_67028ea689_c.jpg new file mode 100644 index 00000000..3628c138 Binary files /dev/null and b/src/dataset/iris/3513095278_67028ea689_c.jpg differ diff --git a/src/dataset/iris/35135665465_90b87a1402_c.jpg b/src/dataset/iris/35135665465_90b87a1402_c.jpg new file mode 100644 index 00000000..c7d330ec Binary files /dev/null and b/src/dataset/iris/35135665465_90b87a1402_c.jpg differ diff --git a/src/dataset/iris/3515603273_3b12a22bec_c.jpg b/src/dataset/iris/3515603273_3b12a22bec_c.jpg new file mode 100644 index 00000000..e84a3203 Binary files /dev/null and b/src/dataset/iris/3515603273_3b12a22bec_c.jpg differ diff --git a/src/dataset/iris/3515848095_bab272558c_c.jpg b/src/dataset/iris/3515848095_bab272558c_c.jpg new file mode 100644 index 00000000..9e44940d Binary files /dev/null and b/src/dataset/iris/3515848095_bab272558c_c.jpg differ diff --git a/src/dataset/iris/3515849053_c40a01108e_c.jpg b/src/dataset/iris/3515849053_c40a01108e_c.jpg new file mode 100644 index 00000000..51999386 Binary files /dev/null and b/src/dataset/iris/3515849053_c40a01108e_c.jpg differ diff --git a/src/dataset/iris/3516330191_bc6070266e_c.jpg b/src/dataset/iris/3516330191_bc6070266e_c.jpg new file mode 100644 index 00000000..4890be8c Binary files /dev/null and b/src/dataset/iris/3516330191_bc6070266e_c.jpg differ diff --git a/src/dataset/iris/3516534783_e1f1325b6a_c.jpg b/src/dataset/iris/3516534783_e1f1325b6a_c.jpg new file mode 100644 index 00000000..b4a31bd0 Binary files /dev/null and b/src/dataset/iris/3516534783_e1f1325b6a_c.jpg differ diff --git a/src/dataset/iris/3516661636_2abab91667_c.jpg b/src/dataset/iris/3516661636_2abab91667_c.jpg new file mode 100644 index 00000000..4a9290fb Binary files /dev/null and b/src/dataset/iris/3516661636_2abab91667_c.jpg differ diff --git a/src/dataset/iris/3516966625_096ba1a077_c.jpg b/src/dataset/iris/3516966625_096ba1a077_c.jpg new file mode 100644 index 00000000..f2464c25 Binary files /dev/null and b/src/dataset/iris/3516966625_096ba1a077_c.jpg differ diff --git a/src/dataset/iris/3517140984_b579ef12ef_c.jpg b/src/dataset/iris/3517140984_b579ef12ef_c.jpg new file mode 100644 index 00000000..820379af Binary files /dev/null and b/src/dataset/iris/3517140984_b579ef12ef_c.jpg differ diff --git a/src/dataset/iris/3517773128_c6286b6a69_c.jpg b/src/dataset/iris/3517773128_c6286b6a69_c.jpg new file mode 100644 index 00000000..4d37ac87 Binary files /dev/null and b/src/dataset/iris/3517773128_c6286b6a69_c.jpg differ diff --git a/src/dataset/iris/3517773868_edf64ef8a9_c.jpg b/src/dataset/iris/3517773868_edf64ef8a9_c.jpg new file mode 100644 index 00000000..f4a77aaf Binary files /dev/null and b/src/dataset/iris/3517773868_edf64ef8a9_c.jpg differ diff --git a/src/dataset/iris/3517779118_ab808a3745_c.jpg b/src/dataset/iris/3517779118_ab808a3745_c.jpg new file mode 100644 index 00000000..16c0f9b9 Binary files /dev/null and b/src/dataset/iris/3517779118_ab808a3745_c.jpg differ diff --git a/src/dataset/iris/3519243691_b40937dc0c_c.jpg b/src/dataset/iris/3519243691_b40937dc0c_c.jpg new file mode 100644 index 00000000..a99f6968 Binary files /dev/null and b/src/dataset/iris/3519243691_b40937dc0c_c.jpg differ diff --git a/src/dataset/iris/3520053734_285b69944e_c.jpg b/src/dataset/iris/3520053734_285b69944e_c.jpg new file mode 100644 index 00000000..f19a8fc8 Binary files /dev/null and b/src/dataset/iris/3520053734_285b69944e_c.jpg differ diff --git a/src/dataset/iris/3520488085_b35213f964_c.jpg b/src/dataset/iris/3520488085_b35213f964_c.jpg new file mode 100644 index 00000000..6ba4834a Binary files /dev/null and b/src/dataset/iris/3520488085_b35213f964_c.jpg differ diff --git a/src/dataset/iris/3520991061_20d6781cc2_c.jpg b/src/dataset/iris/3520991061_20d6781cc2_c.jpg new file mode 100644 index 00000000..c7ce0e1f Binary files /dev/null and b/src/dataset/iris/3520991061_20d6781cc2_c.jpg differ diff --git a/src/dataset/iris/3521741148_c0877eabb2_c.jpg b/src/dataset/iris/3521741148_c0877eabb2_c.jpg new file mode 100644 index 00000000..e13eee47 Binary files /dev/null and b/src/dataset/iris/3521741148_c0877eabb2_c.jpg differ diff --git a/src/dataset/iris/35241159132_0baf2a2bf3_c.jpg b/src/dataset/iris/35241159132_0baf2a2bf3_c.jpg new file mode 100644 index 00000000..c86c0b52 Binary files /dev/null and b/src/dataset/iris/35241159132_0baf2a2bf3_c.jpg differ diff --git a/src/dataset/iris/3525576160_2c77f7875b_c.jpg b/src/dataset/iris/3525576160_2c77f7875b_c.jpg new file mode 100644 index 00000000..356f636b Binary files /dev/null and b/src/dataset/iris/3525576160_2c77f7875b_c.jpg differ diff --git a/src/dataset/iris/35301930611_d1fc971da1_c.jpg b/src/dataset/iris/35301930611_d1fc971da1_c.jpg new file mode 100644 index 00000000..6c9fee30 Binary files /dev/null and b/src/dataset/iris/35301930611_d1fc971da1_c.jpg differ diff --git a/src/dataset/iris/35307562225_9d443e7001_c.jpg b/src/dataset/iris/35307562225_9d443e7001_c.jpg new file mode 100644 index 00000000..953ba51f Binary files /dev/null and b/src/dataset/iris/35307562225_9d443e7001_c.jpg differ diff --git a/src/dataset/iris/3533069563_666d5e0a99_c.jpg b/src/dataset/iris/3533069563_666d5e0a99_c.jpg new file mode 100644 index 00000000..4751a46d Binary files /dev/null and b/src/dataset/iris/3533069563_666d5e0a99_c.jpg differ diff --git a/src/dataset/iris/35356808861_3fedd5a029_c.jpg b/src/dataset/iris/35356808861_3fedd5a029_c.jpg new file mode 100644 index 00000000..7bfdf65c Binary files /dev/null and b/src/dataset/iris/35356808861_3fedd5a029_c.jpg differ diff --git a/src/dataset/iris/3536950163_b00720f66e_c.jpg b/src/dataset/iris/3536950163_b00720f66e_c.jpg new file mode 100644 index 00000000..3b205324 Binary files /dev/null and b/src/dataset/iris/3536950163_b00720f66e_c.jpg differ diff --git a/src/dataset/iris/3537130250_119960679d_c.jpg b/src/dataset/iris/3537130250_119960679d_c.jpg new file mode 100644 index 00000000..9c241702 Binary files /dev/null and b/src/dataset/iris/3537130250_119960679d_c.jpg differ diff --git a/src/dataset/iris/3537754552_16649b8da7_c.jpg b/src/dataset/iris/3537754552_16649b8da7_c.jpg new file mode 100644 index 00000000..e2865dc6 Binary files /dev/null and b/src/dataset/iris/3537754552_16649b8da7_c.jpg differ diff --git a/src/dataset/iris/3537757022_478ef05071_c.jpg b/src/dataset/iris/3537757022_478ef05071_c.jpg new file mode 100644 index 00000000..8ec876f0 Binary files /dev/null and b/src/dataset/iris/3537757022_478ef05071_c.jpg differ diff --git a/src/dataset/iris/3538799588_4bb555ba8c_c.jpg b/src/dataset/iris/3538799588_4bb555ba8c_c.jpg new file mode 100644 index 00000000..ca698dd9 Binary files /dev/null and b/src/dataset/iris/3538799588_4bb555ba8c_c.jpg differ diff --git a/src/dataset/iris/3538801460_5fff4a7dbc_c.jpg b/src/dataset/iris/3538801460_5fff4a7dbc_c.jpg new file mode 100644 index 00000000..3973202b Binary files /dev/null and b/src/dataset/iris/3538801460_5fff4a7dbc_c.jpg differ diff --git a/src/dataset/iris/3538807940_073e089e73_c.jpg b/src/dataset/iris/3538807940_073e089e73_c.jpg new file mode 100644 index 00000000..31965982 Binary files /dev/null and b/src/dataset/iris/3538807940_073e089e73_c.jpg differ diff --git a/src/dataset/iris/3540145999_df7c5087ca_c.jpg b/src/dataset/iris/3540145999_df7c5087ca_c.jpg new file mode 100644 index 00000000..5979e264 Binary files /dev/null and b/src/dataset/iris/3540145999_df7c5087ca_c.jpg differ diff --git a/src/dataset/iris/3542127127_a664415c3f_c.jpg b/src/dataset/iris/3542127127_a664415c3f_c.jpg new file mode 100644 index 00000000..477cd2a1 Binary files /dev/null and b/src/dataset/iris/3542127127_a664415c3f_c.jpg differ diff --git a/src/dataset/iris/3542799989_55a00681f1_c.jpg b/src/dataset/iris/3542799989_55a00681f1_c.jpg new file mode 100644 index 00000000..aff60ffc Binary files /dev/null and b/src/dataset/iris/3542799989_55a00681f1_c.jpg differ diff --git a/src/dataset/iris/3542934702_eeda5ea203_c.jpg b/src/dataset/iris/3542934702_eeda5ea203_c.jpg new file mode 100644 index 00000000..8e41c883 Binary files /dev/null and b/src/dataset/iris/3542934702_eeda5ea203_c.jpg differ diff --git a/src/dataset/iris/3543610964_c27e494dfb_c.jpg b/src/dataset/iris/3543610964_c27e494dfb_c.jpg new file mode 100644 index 00000000..d8f65b72 Binary files /dev/null and b/src/dataset/iris/3543610964_c27e494dfb_c.jpg differ diff --git a/src/dataset/iris/3544633256_9261579915_c.jpg b/src/dataset/iris/3544633256_9261579915_c.jpg new file mode 100644 index 00000000..2099c3cc Binary files /dev/null and b/src/dataset/iris/3544633256_9261579915_c.jpg differ diff --git a/src/dataset/iris/3544633352_6b3ab48637_c.jpg b/src/dataset/iris/3544633352_6b3ab48637_c.jpg new file mode 100644 index 00000000..df4f4e8d Binary files /dev/null and b/src/dataset/iris/3544633352_6b3ab48637_c.jpg differ diff --git a/src/dataset/iris/3545677669_fe33e49df0_c.jpg b/src/dataset/iris/3545677669_fe33e49df0_c.jpg new file mode 100644 index 00000000..5da22b4d Binary files /dev/null and b/src/dataset/iris/3545677669_fe33e49df0_c.jpg differ diff --git a/src/dataset/iris/3548255551_e61cd1a3d6_c.jpg b/src/dataset/iris/3548255551_e61cd1a3d6_c.jpg new file mode 100644 index 00000000..5923f967 Binary files /dev/null and b/src/dataset/iris/3548255551_e61cd1a3d6_c.jpg differ diff --git a/src/dataset/iris/3555520280_f8cb52258e_c.jpg b/src/dataset/iris/3555520280_f8cb52258e_c.jpg new file mode 100644 index 00000000..3cc8b8e4 Binary files /dev/null and b/src/dataset/iris/3555520280_f8cb52258e_c.jpg differ diff --git a/src/dataset/iris/3555602746_16f222c28c_c.jpg b/src/dataset/iris/3555602746_16f222c28c_c.jpg new file mode 100644 index 00000000..eca61e1f Binary files /dev/null and b/src/dataset/iris/3555602746_16f222c28c_c.jpg differ diff --git a/src/dataset/iris/3555666296_0540220cef_c.jpg b/src/dataset/iris/3555666296_0540220cef_c.jpg new file mode 100644 index 00000000..3e1b98bb Binary files /dev/null and b/src/dataset/iris/3555666296_0540220cef_c.jpg differ diff --git a/src/dataset/iris/3556140435_5e09d89daa_c.jpg b/src/dataset/iris/3556140435_5e09d89daa_c.jpg new file mode 100644 index 00000000..21876a95 Binary files /dev/null and b/src/dataset/iris/3556140435_5e09d89daa_c.jpg differ diff --git a/src/dataset/iris/3557319599_e29c02a1e8_c.jpg b/src/dataset/iris/3557319599_e29c02a1e8_c.jpg new file mode 100644 index 00000000..6934497b Binary files /dev/null and b/src/dataset/iris/3557319599_e29c02a1e8_c.jpg differ diff --git a/src/dataset/iris/3558297439_74f051e55f_c.jpg b/src/dataset/iris/3558297439_74f051e55f_c.jpg new file mode 100644 index 00000000..2397b6ff Binary files /dev/null and b/src/dataset/iris/3558297439_74f051e55f_c.jpg differ diff --git a/src/dataset/iris/3560171181_7a055ee9a5_c.jpg b/src/dataset/iris/3560171181_7a055ee9a5_c.jpg new file mode 100644 index 00000000..ddf66c78 Binary files /dev/null and b/src/dataset/iris/3560171181_7a055ee9a5_c.jpg differ diff --git a/src/dataset/iris/3561475610_58f6389ac4_c.jpg b/src/dataset/iris/3561475610_58f6389ac4_c.jpg new file mode 100644 index 00000000..92ddc844 Binary files /dev/null and b/src/dataset/iris/3561475610_58f6389ac4_c.jpg differ diff --git a/src/dataset/iris/35644938760_0f4e2d6f3f_c.jpg b/src/dataset/iris/35644938760_0f4e2d6f3f_c.jpg new file mode 100644 index 00000000..0276adf4 Binary files /dev/null and b/src/dataset/iris/35644938760_0f4e2d6f3f_c.jpg differ diff --git a/src/dataset/iris/3568608094_fcb047f7ec_c.jpg b/src/dataset/iris/3568608094_fcb047f7ec_c.jpg new file mode 100644 index 00000000..9878e790 Binary files /dev/null and b/src/dataset/iris/3568608094_fcb047f7ec_c.jpg differ diff --git a/src/dataset/iris/3570925992_0af460f005_c.jpg b/src/dataset/iris/3570925992_0af460f005_c.jpg new file mode 100644 index 00000000..1ae96d42 Binary files /dev/null and b/src/dataset/iris/3570925992_0af460f005_c.jpg differ diff --git a/src/dataset/iris/3571786156_6aedd9cb0c_c.jpg b/src/dataset/iris/3571786156_6aedd9cb0c_c.jpg new file mode 100644 index 00000000..82b81a2d Binary files /dev/null and b/src/dataset/iris/3571786156_6aedd9cb0c_c.jpg differ diff --git a/src/dataset/iris/3572644076_4598e846dc_c.jpg b/src/dataset/iris/3572644076_4598e846dc_c.jpg new file mode 100644 index 00000000..96b9d180 Binary files /dev/null and b/src/dataset/iris/3572644076_4598e846dc_c.jpg differ diff --git a/src/dataset/iris/3573929294_b9d7c72ed5_c.jpg b/src/dataset/iris/3573929294_b9d7c72ed5_c.jpg new file mode 100644 index 00000000..9894df81 Binary files /dev/null and b/src/dataset/iris/3573929294_b9d7c72ed5_c.jpg differ diff --git a/src/dataset/iris/3576291192_ff16b5d333_c.jpg b/src/dataset/iris/3576291192_ff16b5d333_c.jpg new file mode 100644 index 00000000..b3c5dbfc Binary files /dev/null and b/src/dataset/iris/3576291192_ff16b5d333_c.jpg differ diff --git a/src/dataset/iris/3576343827_21176ca68d_c.jpg b/src/dataset/iris/3576343827_21176ca68d_c.jpg new file mode 100644 index 00000000..a003d79b Binary files /dev/null and b/src/dataset/iris/3576343827_21176ca68d_c.jpg differ diff --git a/src/dataset/iris/3581486233_38734cd09d_c.jpg b/src/dataset/iris/3581486233_38734cd09d_c.jpg new file mode 100644 index 00000000..63e470b0 Binary files /dev/null and b/src/dataset/iris/3581486233_38734cd09d_c.jpg differ diff --git a/src/dataset/iris/35824773842_88eed66bc2_c.jpg b/src/dataset/iris/35824773842_88eed66bc2_c.jpg new file mode 100644 index 00000000..c7feb06b Binary files /dev/null and b/src/dataset/iris/35824773842_88eed66bc2_c.jpg differ diff --git a/src/dataset/iris/3583346437_3406687bfb_c.jpg b/src/dataset/iris/3583346437_3406687bfb_c.jpg new file mode 100644 index 00000000..f60078ba Binary files /dev/null and b/src/dataset/iris/3583346437_3406687bfb_c.jpg differ diff --git a/src/dataset/iris/3583702568_a934e9d2f8_c.jpg b/src/dataset/iris/3583702568_a934e9d2f8_c.jpg new file mode 100644 index 00000000..ca838abf Binary files /dev/null and b/src/dataset/iris/3583702568_a934e9d2f8_c.jpg differ diff --git a/src/dataset/iris/3586393781_48afcb5008_c.jpg b/src/dataset/iris/3586393781_48afcb5008_c.jpg new file mode 100644 index 00000000..140ebd91 Binary files /dev/null and b/src/dataset/iris/3586393781_48afcb5008_c.jpg differ diff --git a/src/dataset/iris/3586839134_5825d6c9a1_c.jpg b/src/dataset/iris/3586839134_5825d6c9a1_c.jpg new file mode 100644 index 00000000..a7fbd2ef Binary files /dev/null and b/src/dataset/iris/3586839134_5825d6c9a1_c.jpg differ diff --git a/src/dataset/iris/3587246196_fe260442c8_c.jpg b/src/dataset/iris/3587246196_fe260442c8_c.jpg new file mode 100644 index 00000000..b7f6a44f Binary files /dev/null and b/src/dataset/iris/3587246196_fe260442c8_c.jpg differ diff --git a/src/dataset/iris/3587247446_95c640811e_c.jpg b/src/dataset/iris/3587247446_95c640811e_c.jpg new file mode 100644 index 00000000..ac0b7848 Binary files /dev/null and b/src/dataset/iris/3587247446_95c640811e_c.jpg differ diff --git a/src/dataset/iris/3589545637_79f08b4f7e_c.jpg b/src/dataset/iris/3589545637_79f08b4f7e_c.jpg new file mode 100644 index 00000000..758b5f95 Binary files /dev/null and b/src/dataset/iris/3589545637_79f08b4f7e_c.jpg differ diff --git a/src/dataset/iris/3590345982_5b754a1de6_c.jpg b/src/dataset/iris/3590345982_5b754a1de6_c.jpg new file mode 100644 index 00000000..af9dfebd Binary files /dev/null and b/src/dataset/iris/3590345982_5b754a1de6_c.jpg differ diff --git a/src/dataset/iris/3591046602_bf2c251e57_c.jpg b/src/dataset/iris/3591046602_bf2c251e57_c.jpg new file mode 100644 index 00000000..f21a504f Binary files /dev/null and b/src/dataset/iris/3591046602_bf2c251e57_c.jpg differ diff --git a/src/dataset/iris/3596363516_656c613b1e_c.jpg b/src/dataset/iris/3596363516_656c613b1e_c.jpg new file mode 100644 index 00000000..abcc9645 Binary files /dev/null and b/src/dataset/iris/3596363516_656c613b1e_c.jpg differ diff --git a/src/dataset/iris/3597289273_33d18fe973_c.jpg b/src/dataset/iris/3597289273_33d18fe973_c.jpg new file mode 100644 index 00000000..96db5ed5 Binary files /dev/null and b/src/dataset/iris/3597289273_33d18fe973_c.jpg differ diff --git a/src/dataset/iris/3597378787_4e6176253c_c.jpg b/src/dataset/iris/3597378787_4e6176253c_c.jpg new file mode 100644 index 00000000..98abdea1 Binary files /dev/null and b/src/dataset/iris/3597378787_4e6176253c_c.jpg differ diff --git a/src/dataset/iris/3598138235_c1f8b289f7_c.jpg b/src/dataset/iris/3598138235_c1f8b289f7_c.jpg new file mode 100644 index 00000000..7f9a2d2d Binary files /dev/null and b/src/dataset/iris/3598138235_c1f8b289f7_c.jpg differ diff --git a/src/dataset/iris/3599111312_81c4d8d948_c.jpg b/src/dataset/iris/3599111312_81c4d8d948_c.jpg new file mode 100644 index 00000000..216a53b3 Binary files /dev/null and b/src/dataset/iris/3599111312_81c4d8d948_c.jpg differ diff --git a/src/dataset/iris/3600068880_3ef1446727_c.jpg b/src/dataset/iris/3600068880_3ef1446727_c.jpg new file mode 100644 index 00000000..8c5b8b38 Binary files /dev/null and b/src/dataset/iris/3600068880_3ef1446727_c.jpg differ diff --git a/src/dataset/iris/3613931884_05f808784b_c.jpg b/src/dataset/iris/3613931884_05f808784b_c.jpg new file mode 100644 index 00000000..5428d6bf Binary files /dev/null and b/src/dataset/iris/3613931884_05f808784b_c.jpg differ diff --git a/src/dataset/iris/36153055214_8e7f14c091_c.jpg b/src/dataset/iris/36153055214_8e7f14c091_c.jpg new file mode 100644 index 00000000..ffe17055 Binary files /dev/null and b/src/dataset/iris/36153055214_8e7f14c091_c.jpg differ diff --git a/src/dataset/iris/3620878085_e8276988a9_c.jpg b/src/dataset/iris/3620878085_e8276988a9_c.jpg new file mode 100644 index 00000000..2252bbb9 Binary files /dev/null and b/src/dataset/iris/3620878085_e8276988a9_c.jpg differ diff --git a/src/dataset/iris/3623570770_00a85a77d4_c.jpg b/src/dataset/iris/3623570770_00a85a77d4_c.jpg new file mode 100644 index 00000000..b4cb211a Binary files /dev/null and b/src/dataset/iris/3623570770_00a85a77d4_c.jpg differ diff --git a/src/dataset/iris/3631094760_563b34c2f4_c.jpg b/src/dataset/iris/3631094760_563b34c2f4_c.jpg new file mode 100644 index 00000000..3ddfdbb3 Binary files /dev/null and b/src/dataset/iris/3631094760_563b34c2f4_c.jpg differ diff --git a/src/dataset/iris/36321160470_4e18d48e6f_c.jpg b/src/dataset/iris/36321160470_4e18d48e6f_c.jpg new file mode 100644 index 00000000..9f76b7db Binary files /dev/null and b/src/dataset/iris/36321160470_4e18d48e6f_c.jpg differ diff --git a/src/dataset/iris/3634874266_41b5bc3c7b_c.jpg b/src/dataset/iris/3634874266_41b5bc3c7b_c.jpg new file mode 100644 index 00000000..459074d7 Binary files /dev/null and b/src/dataset/iris/3634874266_41b5bc3c7b_c.jpg differ diff --git a/src/dataset/iris/3636201358_e0734717aa_c.jpg b/src/dataset/iris/3636201358_e0734717aa_c.jpg new file mode 100644 index 00000000..7d202e15 Binary files /dev/null and b/src/dataset/iris/3636201358_e0734717aa_c.jpg differ diff --git a/src/dataset/iris/3644009115_b421ece4a5_c.jpg b/src/dataset/iris/3644009115_b421ece4a5_c.jpg new file mode 100644 index 00000000..b2423840 Binary files /dev/null and b/src/dataset/iris/3644009115_b421ece4a5_c.jpg differ diff --git a/src/dataset/iris/3644012979_af97b432f9_c.jpg b/src/dataset/iris/3644012979_af97b432f9_c.jpg new file mode 100644 index 00000000..aa9c5ae5 Binary files /dev/null and b/src/dataset/iris/3644012979_af97b432f9_c.jpg differ diff --git a/src/dataset/iris/3644817802_99483a0838_c.jpg b/src/dataset/iris/3644817802_99483a0838_c.jpg new file mode 100644 index 00000000..d13e7f68 Binary files /dev/null and b/src/dataset/iris/3644817802_99483a0838_c.jpg differ diff --git a/src/dataset/iris/3651511946_7ff405cac0_c.jpg b/src/dataset/iris/3651511946_7ff405cac0_c.jpg new file mode 100644 index 00000000..a22732b6 Binary files /dev/null and b/src/dataset/iris/3651511946_7ff405cac0_c.jpg differ diff --git a/src/dataset/iris/3651860370_9d658012e3_c.jpg b/src/dataset/iris/3651860370_9d658012e3_c.jpg new file mode 100644 index 00000000..94bd7359 Binary files /dev/null and b/src/dataset/iris/3651860370_9d658012e3_c.jpg differ diff --git a/src/dataset/iris/3653109015_a82ba5af95_c.jpg b/src/dataset/iris/3653109015_a82ba5af95_c.jpg new file mode 100644 index 00000000..b05083ef Binary files /dev/null and b/src/dataset/iris/3653109015_a82ba5af95_c.jpg differ diff --git a/src/dataset/iris/3661513481_bc703a486a_c.jpg b/src/dataset/iris/3661513481_bc703a486a_c.jpg new file mode 100644 index 00000000..1416e7b8 Binary files /dev/null and b/src/dataset/iris/3661513481_bc703a486a_c.jpg differ diff --git a/src/dataset/iris/3662018509_20bf07ec36_c.jpg b/src/dataset/iris/3662018509_20bf07ec36_c.jpg new file mode 100644 index 00000000..f1b75fa4 Binary files /dev/null and b/src/dataset/iris/3662018509_20bf07ec36_c.jpg differ diff --git a/src/dataset/iris/3670254599_8b5af438ce_c.jpg b/src/dataset/iris/3670254599_8b5af438ce_c.jpg new file mode 100644 index 00000000..7db5b29c Binary files /dev/null and b/src/dataset/iris/3670254599_8b5af438ce_c.jpg differ diff --git a/src/dataset/iris/3674255326_531716c8d7_c.jpg b/src/dataset/iris/3674255326_531716c8d7_c.jpg new file mode 100644 index 00000000..a7a9c078 Binary files /dev/null and b/src/dataset/iris/3674255326_531716c8d7_c.jpg differ diff --git a/src/dataset/iris/36799212966_304e9c7697_c.jpg b/src/dataset/iris/36799212966_304e9c7697_c.jpg new file mode 100644 index 00000000..9ba35908 Binary files /dev/null and b/src/dataset/iris/36799212966_304e9c7697_c.jpg differ diff --git a/src/dataset/iris/3685522287_35fc2bc4fc_c.jpg b/src/dataset/iris/3685522287_35fc2bc4fc_c.jpg new file mode 100644 index 00000000..72597135 Binary files /dev/null and b/src/dataset/iris/3685522287_35fc2bc4fc_c.jpg differ diff --git a/src/dataset/iris/37023834243_6e411d7f32_c.jpg b/src/dataset/iris/37023834243_6e411d7f32_c.jpg new file mode 100644 index 00000000..3d048edd Binary files /dev/null and b/src/dataset/iris/37023834243_6e411d7f32_c.jpg differ diff --git a/src/dataset/iris/37246720145_3062799f84_c.jpg b/src/dataset/iris/37246720145_3062799f84_c.jpg new file mode 100644 index 00000000..7c05fde7 Binary files /dev/null and b/src/dataset/iris/37246720145_3062799f84_c.jpg differ diff --git a/src/dataset/iris/374073873_00173c0ce3_c.jpg b/src/dataset/iris/374073873_00173c0ce3_c.jpg new file mode 100644 index 00000000..9ba7be6f Binary files /dev/null and b/src/dataset/iris/374073873_00173c0ce3_c.jpg differ diff --git a/src/dataset/iris/3747929711_69ff98ec32_c.jpg b/src/dataset/iris/3747929711_69ff98ec32_c.jpg new file mode 100644 index 00000000..811f8ee4 Binary files /dev/null and b/src/dataset/iris/3747929711_69ff98ec32_c.jpg differ diff --git a/src/dataset/iris/3768885190_bba1fcddb4_c.jpg b/src/dataset/iris/3768885190_bba1fcddb4_c.jpg new file mode 100644 index 00000000..9f2e0353 Binary files /dev/null and b/src/dataset/iris/3768885190_bba1fcddb4_c.jpg differ diff --git a/src/dataset/iris/3782012745_8c18beea4c_c.jpg b/src/dataset/iris/3782012745_8c18beea4c_c.jpg new file mode 100644 index 00000000..e426fbaf Binary files /dev/null and b/src/dataset/iris/3782012745_8c18beea4c_c.jpg differ diff --git a/src/dataset/iris/3785125475_1c37a5be70_c.jpg b/src/dataset/iris/3785125475_1c37a5be70_c.jpg new file mode 100644 index 00000000..96556667 Binary files /dev/null and b/src/dataset/iris/3785125475_1c37a5be70_c.jpg differ diff --git a/src/dataset/iris/3834950303_cef7c47367_c.jpg b/src/dataset/iris/3834950303_cef7c47367_c.jpg new file mode 100644 index 00000000..fac39360 Binary files /dev/null and b/src/dataset/iris/3834950303_cef7c47367_c.jpg differ diff --git a/src/dataset/iris/38464399034_27481a4eb6_c.jpg b/src/dataset/iris/38464399034_27481a4eb6_c.jpg new file mode 100644 index 00000000..988f3963 Binary files /dev/null and b/src/dataset/iris/38464399034_27481a4eb6_c.jpg differ diff --git a/src/dataset/iris/3893988143_24af89c6f8_c.jpg b/src/dataset/iris/3893988143_24af89c6f8_c.jpg new file mode 100644 index 00000000..8f8b131b Binary files /dev/null and b/src/dataset/iris/3893988143_24af89c6f8_c.jpg differ diff --git a/src/dataset/iris/39070430515_9b7c5a4be6_c.jpg b/src/dataset/iris/39070430515_9b7c5a4be6_c.jpg new file mode 100644 index 00000000..0b4297b2 Binary files /dev/null and b/src/dataset/iris/39070430515_9b7c5a4be6_c.jpg differ diff --git a/src/dataset/iris/393337656_d88007a39b_c.jpg b/src/dataset/iris/393337656_d88007a39b_c.jpg new file mode 100644 index 00000000..fabb6fe5 Binary files /dev/null and b/src/dataset/iris/393337656_d88007a39b_c.jpg differ diff --git a/src/dataset/iris/39475156492_5031ed50e0_c.jpg b/src/dataset/iris/39475156492_5031ed50e0_c.jpg new file mode 100644 index 00000000..a391563e Binary files /dev/null and b/src/dataset/iris/39475156492_5031ed50e0_c.jpg differ diff --git a/src/dataset/iris/39537132430_63d7000e4b_c.jpg b/src/dataset/iris/39537132430_63d7000e4b_c.jpg new file mode 100644 index 00000000..b5bac983 Binary files /dev/null and b/src/dataset/iris/39537132430_63d7000e4b_c.jpg differ diff --git a/src/dataset/iris/39562942992_46ec041453_c.jpg b/src/dataset/iris/39562942992_46ec041453_c.jpg new file mode 100644 index 00000000..8258161b Binary files /dev/null and b/src/dataset/iris/39562942992_46ec041453_c.jpg differ diff --git a/src/dataset/iris/3961266837_9a6c58769f_c.jpg b/src/dataset/iris/3961266837_9a6c58769f_c.jpg new file mode 100644 index 00000000..b92574f3 Binary files /dev/null and b/src/dataset/iris/3961266837_9a6c58769f_c.jpg differ diff --git a/src/dataset/iris/39906990660_ca13976bfc_c.jpg b/src/dataset/iris/39906990660_ca13976bfc_c.jpg new file mode 100644 index 00000000..a9f24fbc Binary files /dev/null and b/src/dataset/iris/39906990660_ca13976bfc_c.jpg differ diff --git a/src/dataset/iris/39917514380_4b893d1c08_c.jpg b/src/dataset/iris/39917514380_4b893d1c08_c.jpg new file mode 100644 index 00000000..fd4e0b7e Binary files /dev/null and b/src/dataset/iris/39917514380_4b893d1c08_c.jpg differ diff --git a/src/dataset/iris/40182123323_7524a3c19f_c.jpg b/src/dataset/iris/40182123323_7524a3c19f_c.jpg new file mode 100644 index 00000000..9dffcf19 Binary files /dev/null and b/src/dataset/iris/40182123323_7524a3c19f_c.jpg differ diff --git a/src/dataset/iris/4024690654_2046830679_c.jpg b/src/dataset/iris/4024690654_2046830679_c.jpg new file mode 100644 index 00000000..ca4b6bfd Binary files /dev/null and b/src/dataset/iris/4024690654_2046830679_c.jpg differ diff --git a/src/dataset/iris/40325071731_079ef2c020_c.jpg b/src/dataset/iris/40325071731_079ef2c020_c.jpg new file mode 100644 index 00000000..142173e5 Binary files /dev/null and b/src/dataset/iris/40325071731_079ef2c020_c.jpg differ diff --git a/src/dataset/iris/40353671540_70a5bf7ec6_c.jpg b/src/dataset/iris/40353671540_70a5bf7ec6_c.jpg new file mode 100644 index 00000000..3d45b895 Binary files /dev/null and b/src/dataset/iris/40353671540_70a5bf7ec6_c.jpg differ diff --git a/src/dataset/iris/40502574023_2e7bcebb93_c.jpg b/src/dataset/iris/40502574023_2e7bcebb93_c.jpg new file mode 100644 index 00000000..db824a2b Binary files /dev/null and b/src/dataset/iris/40502574023_2e7bcebb93_c.jpg differ diff --git a/src/dataset/iris/40531008990_2c9ab4c194_c.jpg b/src/dataset/iris/40531008990_2c9ab4c194_c.jpg new file mode 100644 index 00000000..d99d89ae Binary files /dev/null and b/src/dataset/iris/40531008990_2c9ab4c194_c.jpg differ diff --git a/src/dataset/iris/40558285834_71252a5b2b_c.jpg b/src/dataset/iris/40558285834_71252a5b2b_c.jpg new file mode 100644 index 00000000..165fefab Binary files /dev/null and b/src/dataset/iris/40558285834_71252a5b2b_c.jpg differ diff --git a/src/dataset/iris/40612281020_deb2de4156_c.jpg b/src/dataset/iris/40612281020_deb2de4156_c.jpg new file mode 100644 index 00000000..eecafc7d Binary files /dev/null and b/src/dataset/iris/40612281020_deb2de4156_c.jpg differ diff --git a/src/dataset/iris/40612281150_cf184a4466_c.jpg b/src/dataset/iris/40612281150_cf184a4466_c.jpg new file mode 100644 index 00000000..aeaf9b4b Binary files /dev/null and b/src/dataset/iris/40612281150_cf184a4466_c.jpg differ diff --git a/src/dataset/iris/40612281570_904d59d704_c.jpg b/src/dataset/iris/40612281570_904d59d704_c.jpg new file mode 100644 index 00000000..4d0c9730 Binary files /dev/null and b/src/dataset/iris/40612281570_904d59d704_c.jpg differ diff --git a/src/dataset/iris/40612281640_d21ab9d8ba_c.jpg b/src/dataset/iris/40612281640_d21ab9d8ba_c.jpg new file mode 100644 index 00000000..18dba00c Binary files /dev/null and b/src/dataset/iris/40612281640_d21ab9d8ba_c.jpg differ diff --git a/src/dataset/iris/40612281740_e65e4e1a65_c.jpg b/src/dataset/iris/40612281740_e65e4e1a65_c.jpg new file mode 100644 index 00000000..5cacc0eb Binary files /dev/null and b/src/dataset/iris/40612281740_e65e4e1a65_c.jpg differ diff --git a/src/dataset/iris/40612281910_e9e6f66ce0_c.jpg b/src/dataset/iris/40612281910_e9e6f66ce0_c.jpg new file mode 100644 index 00000000..69b55a38 Binary files /dev/null and b/src/dataset/iris/40612281910_e9e6f66ce0_c.jpg differ diff --git a/src/dataset/iris/40612282010_ed276b3892_c.jpg b/src/dataset/iris/40612282010_ed276b3892_c.jpg new file mode 100644 index 00000000..b903edfa Binary files /dev/null and b/src/dataset/iris/40612282010_ed276b3892_c.jpg differ diff --git a/src/dataset/iris/4063671112_ff3c20aeda_c.jpg b/src/dataset/iris/4063671112_ff3c20aeda_c.jpg new file mode 100644 index 00000000..c92ea7e7 Binary files /dev/null and b/src/dataset/iris/4063671112_ff3c20aeda_c.jpg differ diff --git a/src/dataset/iris/40675901665_d7de104cda_c.jpg b/src/dataset/iris/40675901665_d7de104cda_c.jpg new file mode 100644 index 00000000..7d17328a Binary files /dev/null and b/src/dataset/iris/40675901665_d7de104cda_c.jpg differ diff --git a/src/dataset/iris/40700058720_d788cbdf1d_c.jpg b/src/dataset/iris/40700058720_d788cbdf1d_c.jpg new file mode 100644 index 00000000..410d9649 Binary files /dev/null and b/src/dataset/iris/40700058720_d788cbdf1d_c.jpg differ diff --git a/src/dataset/iris/40849090403_ea2bed2c19_c.jpg b/src/dataset/iris/40849090403_ea2bed2c19_c.jpg new file mode 100644 index 00000000..5481eedb Binary files /dev/null and b/src/dataset/iris/40849090403_ea2bed2c19_c.jpg differ diff --git a/src/dataset/iris/40901854093_134a5e6c0c_c.jpg b/src/dataset/iris/40901854093_134a5e6c0c_c.jpg new file mode 100644 index 00000000..2f37f9fb Binary files /dev/null and b/src/dataset/iris/40901854093_134a5e6c0c_c.jpg differ diff --git a/src/dataset/iris/40939699794_dee9fccac0_c.jpg b/src/dataset/iris/40939699794_dee9fccac0_c.jpg new file mode 100644 index 00000000..acc9ad17 Binary files /dev/null and b/src/dataset/iris/40939699794_dee9fccac0_c.jpg differ diff --git a/src/dataset/iris/40996605924_33017f96bf_c.jpg b/src/dataset/iris/40996605924_33017f96bf_c.jpg new file mode 100644 index 00000000..2b6326fb Binary files /dev/null and b/src/dataset/iris/40996605924_33017f96bf_c.jpg differ diff --git a/src/dataset/iris/41077428225_69b76c27c5_c.jpg b/src/dataset/iris/41077428225_69b76c27c5_c.jpg new file mode 100644 index 00000000..5bdf103e Binary files /dev/null and b/src/dataset/iris/41077428225_69b76c27c5_c.jpg differ diff --git a/src/dataset/iris/4112500483_f4cb359596_c.jpg b/src/dataset/iris/4112500483_f4cb359596_c.jpg new file mode 100644 index 00000000..4994061a Binary files /dev/null and b/src/dataset/iris/4112500483_f4cb359596_c.jpg differ diff --git a/src/dataset/iris/41164421760_b6db1ff50c_c.jpg b/src/dataset/iris/41164421760_b6db1ff50c_c.jpg new file mode 100644 index 00000000..7a047cc1 Binary files /dev/null and b/src/dataset/iris/41164421760_b6db1ff50c_c.jpg differ diff --git a/src/dataset/iris/41225653524_9784f2c76d_c.jpg b/src/dataset/iris/41225653524_9784f2c76d_c.jpg new file mode 100644 index 00000000..54a90b0f Binary files /dev/null and b/src/dataset/iris/41225653524_9784f2c76d_c.jpg differ diff --git a/src/dataset/iris/41334507144_1ffe30dd7f_c.jpg b/src/dataset/iris/41334507144_1ffe30dd7f_c.jpg new file mode 100644 index 00000000..05f96fdd Binary files /dev/null and b/src/dataset/iris/41334507144_1ffe30dd7f_c.jpg differ diff --git a/src/dataset/iris/41335169354_f679646278_c.jpg b/src/dataset/iris/41335169354_f679646278_c.jpg new file mode 100644 index 00000000..bc92ec28 Binary files /dev/null and b/src/dataset/iris/41335169354_f679646278_c.jpg differ diff --git a/src/dataset/iris/41397991564_8632984386_c.jpg b/src/dataset/iris/41397991564_8632984386_c.jpg new file mode 100644 index 00000000..3e5c112c Binary files /dev/null and b/src/dataset/iris/41397991564_8632984386_c.jpg differ diff --git a/src/dataset/iris/41437300455_726ac820fd_c.jpg b/src/dataset/iris/41437300455_726ac820fd_c.jpg new file mode 100644 index 00000000..552f6d83 Binary files /dev/null and b/src/dataset/iris/41437300455_726ac820fd_c.jpg differ diff --git a/src/dataset/iris/41458190654_b78686ab16_c.jpg b/src/dataset/iris/41458190654_b78686ab16_c.jpg new file mode 100644 index 00000000..674d40c4 Binary files /dev/null and b/src/dataset/iris/41458190654_b78686ab16_c.jpg differ diff --git a/src/dataset/iris/41474656741_1e7987634b_c.jpg b/src/dataset/iris/41474656741_1e7987634b_c.jpg new file mode 100644 index 00000000..abfcb8ee Binary files /dev/null and b/src/dataset/iris/41474656741_1e7987634b_c.jpg differ diff --git a/src/dataset/iris/41518062375_9ae0599911_c.jpg b/src/dataset/iris/41518062375_9ae0599911_c.jpg new file mode 100644 index 00000000..2ffd7b8e Binary files /dev/null and b/src/dataset/iris/41518062375_9ae0599911_c.jpg differ diff --git a/src/dataset/iris/41518062675_5648a390b6_c.jpg b/src/dataset/iris/41518062675_5648a390b6_c.jpg new file mode 100644 index 00000000..6f7cfb11 Binary files /dev/null and b/src/dataset/iris/41518062675_5648a390b6_c.jpg differ diff --git a/src/dataset/iris/41518063305_50e13e63b6_c.jpg b/src/dataset/iris/41518063305_50e13e63b6_c.jpg new file mode 100644 index 00000000..df8619fe Binary files /dev/null and b/src/dataset/iris/41518063305_50e13e63b6_c.jpg differ diff --git a/src/dataset/iris/41518065715_87f99a96da_c.jpg b/src/dataset/iris/41518065715_87f99a96da_c.jpg new file mode 100644 index 00000000..559ef6b6 Binary files /dev/null and b/src/dataset/iris/41518065715_87f99a96da_c.jpg differ diff --git a/src/dataset/iris/41652478474_436efbe943_c.jpg b/src/dataset/iris/41652478474_436efbe943_c.jpg new file mode 100644 index 00000000..7a018c00 Binary files /dev/null and b/src/dataset/iris/41652478474_436efbe943_c.jpg differ diff --git a/src/dataset/iris/41720023194_7d4939b4cc_c.jpg b/src/dataset/iris/41720023194_7d4939b4cc_c.jpg new file mode 100644 index 00000000..f941088e Binary files /dev/null and b/src/dataset/iris/41720023194_7d4939b4cc_c.jpg differ diff --git a/src/dataset/iris/41732238662_3cd699e740_c.jpg b/src/dataset/iris/41732238662_3cd699e740_c.jpg new file mode 100644 index 00000000..6d0325ec Binary files /dev/null and b/src/dataset/iris/41732238662_3cd699e740_c.jpg differ diff --git a/src/dataset/iris/41910866442_925871ea52_c.jpg b/src/dataset/iris/41910866442_925871ea52_c.jpg new file mode 100644 index 00000000..af225fcc Binary files /dev/null and b/src/dataset/iris/41910866442_925871ea52_c.jpg differ diff --git a/src/dataset/iris/41917293294_7186cf815d_c.jpg b/src/dataset/iris/41917293294_7186cf815d_c.jpg new file mode 100644 index 00000000..2cc41497 Binary files /dev/null and b/src/dataset/iris/41917293294_7186cf815d_c.jpg differ diff --git a/src/dataset/iris/41932420362_cc3d08c740_c.jpg b/src/dataset/iris/41932420362_cc3d08c740_c.jpg new file mode 100644 index 00000000..830b88a5 Binary files /dev/null and b/src/dataset/iris/41932420362_cc3d08c740_c.jpg differ diff --git a/src/dataset/iris/41935833655_b9a5b85083_c.jpg b/src/dataset/iris/41935833655_b9a5b85083_c.jpg new file mode 100644 index 00000000..2d6e4e4d Binary files /dev/null and b/src/dataset/iris/41935833655_b9a5b85083_c.jpg differ diff --git a/src/dataset/iris/41983768744_04e554cc42_c.jpg b/src/dataset/iris/41983768744_04e554cc42_c.jpg new file mode 100644 index 00000000..de891746 Binary files /dev/null and b/src/dataset/iris/41983768744_04e554cc42_c.jpg differ diff --git a/src/dataset/iris/42080873291_8064ab1a38_c.jpg b/src/dataset/iris/42080873291_8064ab1a38_c.jpg new file mode 100644 index 00000000..66f19723 Binary files /dev/null and b/src/dataset/iris/42080873291_8064ab1a38_c.jpg differ diff --git a/src/dataset/iris/42114135752_5ee5844a29_c.jpg b/src/dataset/iris/42114135752_5ee5844a29_c.jpg new file mode 100644 index 00000000..5876347f Binary files /dev/null and b/src/dataset/iris/42114135752_5ee5844a29_c.jpg differ diff --git a/src/dataset/iris/42132692152_0aa31f2727_c.jpg b/src/dataset/iris/42132692152_0aa31f2727_c.jpg new file mode 100644 index 00000000..a176e0ee Binary files /dev/null and b/src/dataset/iris/42132692152_0aa31f2727_c.jpg differ diff --git a/src/dataset/iris/42187879502_b660181951_c.jpg b/src/dataset/iris/42187879502_b660181951_c.jpg new file mode 100644 index 00000000..2df33495 Binary files /dev/null and b/src/dataset/iris/42187879502_b660181951_c.jpg differ diff --git a/src/dataset/iris/42234160261_85c257fda4_c.jpg b/src/dataset/iris/42234160261_85c257fda4_c.jpg new file mode 100644 index 00000000..cb4b9444 Binary files /dev/null and b/src/dataset/iris/42234160261_85c257fda4_c.jpg differ diff --git a/src/dataset/iris/42234163301_5bc48911da_c.jpg b/src/dataset/iris/42234163301_5bc48911da_c.jpg new file mode 100644 index 00000000..034635db Binary files /dev/null and b/src/dataset/iris/42234163301_5bc48911da_c.jpg differ diff --git a/src/dataset/iris/42400482002_d049f5eda4_c.jpg b/src/dataset/iris/42400482002_d049f5eda4_c.jpg new file mode 100644 index 00000000..66910b33 Binary files /dev/null and b/src/dataset/iris/42400482002_d049f5eda4_c.jpg differ diff --git a/src/dataset/iris/42412801052_3de81eb2e0_c.jpg b/src/dataset/iris/42412801052_3de81eb2e0_c.jpg new file mode 100644 index 00000000..282bd96b Binary files /dev/null and b/src/dataset/iris/42412801052_3de81eb2e0_c.jpg differ diff --git a/src/dataset/iris/42567659481_3f22344f9d_c.jpg b/src/dataset/iris/42567659481_3f22344f9d_c.jpg new file mode 100644 index 00000000..71a8be1f Binary files /dev/null and b/src/dataset/iris/42567659481_3f22344f9d_c.jpg differ diff --git a/src/dataset/iris/42580547082_d379c7ff9d_c.jpg b/src/dataset/iris/42580547082_d379c7ff9d_c.jpg new file mode 100644 index 00000000..08e65f77 Binary files /dev/null and b/src/dataset/iris/42580547082_d379c7ff9d_c.jpg differ diff --git a/src/dataset/iris/4294752906_0a1b665771_c.jpg b/src/dataset/iris/4294752906_0a1b665771_c.jpg new file mode 100644 index 00000000..73bee69b Binary files /dev/null and b/src/dataset/iris/4294752906_0a1b665771_c.jpg differ diff --git a/src/dataset/iris/43106057412_2aab2f616a_c.jpg b/src/dataset/iris/43106057412_2aab2f616a_c.jpg new file mode 100644 index 00000000..d19d27ee Binary files /dev/null and b/src/dataset/iris/43106057412_2aab2f616a_c.jpg differ diff --git a/src/dataset/iris/43157178822_21a7b123da_c.jpg b/src/dataset/iris/43157178822_21a7b123da_c.jpg new file mode 100644 index 00000000..3f0754d1 Binary files /dev/null and b/src/dataset/iris/43157178822_21a7b123da_c.jpg differ diff --git a/src/dataset/iris/4352818289_31cca10a32_c.jpg b/src/dataset/iris/4352818289_31cca10a32_c.jpg new file mode 100644 index 00000000..3f5502ce Binary files /dev/null and b/src/dataset/iris/4352818289_31cca10a32_c.jpg differ diff --git a/src/dataset/iris/435712443_bf42493201_c.jpg b/src/dataset/iris/435712443_bf42493201_c.jpg new file mode 100644 index 00000000..8e17a70e Binary files /dev/null and b/src/dataset/iris/435712443_bf42493201_c.jpg differ diff --git a/src/dataset/iris/4393115218_1433bc3a8c_c.jpg b/src/dataset/iris/4393115218_1433bc3a8c_c.jpg new file mode 100644 index 00000000..0c196cbf Binary files /dev/null and b/src/dataset/iris/4393115218_1433bc3a8c_c.jpg differ diff --git a/src/dataset/iris/4393115308_fd578b8d9d_c.jpg b/src/dataset/iris/4393115308_fd578b8d9d_c.jpg new file mode 100644 index 00000000..0685e0e9 Binary files /dev/null and b/src/dataset/iris/4393115308_fd578b8d9d_c.jpg differ diff --git a/src/dataset/iris/4446320038_0491bdd57e_c.jpg b/src/dataset/iris/4446320038_0491bdd57e_c.jpg new file mode 100644 index 00000000..447cf8a3 Binary files /dev/null and b/src/dataset/iris/4446320038_0491bdd57e_c.jpg differ diff --git a/src/dataset/iris/4487467368_a799d24a01_c.jpg b/src/dataset/iris/4487467368_a799d24a01_c.jpg new file mode 100644 index 00000000..c4f40cb6 Binary files /dev/null and b/src/dataset/iris/4487467368_a799d24a01_c.jpg differ diff --git a/src/dataset/iris/45114296211_4f5caeb279_c.jpg b/src/dataset/iris/45114296211_4f5caeb279_c.jpg new file mode 100644 index 00000000..b25270cb Binary files /dev/null and b/src/dataset/iris/45114296211_4f5caeb279_c.jpg differ diff --git a/src/dataset/iris/4529620169_4136d8786f_c.jpg b/src/dataset/iris/4529620169_4136d8786f_c.jpg new file mode 100644 index 00000000..bdca5391 Binary files /dev/null and b/src/dataset/iris/4529620169_4136d8786f_c.jpg differ diff --git a/src/dataset/iris/4532590437_2fd95cdb6d_c.jpg b/src/dataset/iris/4532590437_2fd95cdb6d_c.jpg new file mode 100644 index 00000000..cfc94946 Binary files /dev/null and b/src/dataset/iris/4532590437_2fd95cdb6d_c.jpg differ diff --git a/src/dataset/iris/4536410172_a746eb2eb0_c.jpg b/src/dataset/iris/4536410172_a746eb2eb0_c.jpg new file mode 100644 index 00000000..109db80f Binary files /dev/null and b/src/dataset/iris/4536410172_a746eb2eb0_c.jpg differ diff --git a/src/dataset/iris/4543813420_dfa440b597_c.jpg b/src/dataset/iris/4543813420_dfa440b597_c.jpg new file mode 100644 index 00000000..5b44f618 Binary files /dev/null and b/src/dataset/iris/4543813420_dfa440b597_c.jpg differ diff --git a/src/dataset/iris/4547344288_5f28791776_c.jpg b/src/dataset/iris/4547344288_5f28791776_c.jpg new file mode 100644 index 00000000..baec363e Binary files /dev/null and b/src/dataset/iris/4547344288_5f28791776_c.jpg differ diff --git a/src/dataset/iris/45480495542_eac27ac7a8_c.jpg b/src/dataset/iris/45480495542_eac27ac7a8_c.jpg new file mode 100644 index 00000000..c2899210 Binary files /dev/null and b/src/dataset/iris/45480495542_eac27ac7a8_c.jpg differ diff --git a/src/dataset/iris/4549176875_d1fb64f3e2_c.jpg b/src/dataset/iris/4549176875_d1fb64f3e2_c.jpg new file mode 100644 index 00000000..5f99a72e Binary files /dev/null and b/src/dataset/iris/4549176875_d1fb64f3e2_c.jpg differ diff --git a/src/dataset/iris/4551303666_b72e8c4303_c.jpg b/src/dataset/iris/4551303666_b72e8c4303_c.jpg new file mode 100644 index 00000000..fab32fde Binary files /dev/null and b/src/dataset/iris/4551303666_b72e8c4303_c.jpg differ diff --git a/src/dataset/iris/4551307184_5c911d3d8c_c.jpg b/src/dataset/iris/4551307184_5c911d3d8c_c.jpg new file mode 100644 index 00000000..db2793a1 Binary files /dev/null and b/src/dataset/iris/4551307184_5c911d3d8c_c.jpg differ diff --git a/src/dataset/iris/45535091681_f2677e65a4_c.jpg b/src/dataset/iris/45535091681_f2677e65a4_c.jpg new file mode 100644 index 00000000..25b38f0b Binary files /dev/null and b/src/dataset/iris/45535091681_f2677e65a4_c.jpg differ diff --git a/src/dataset/iris/4554085801_420108d128_c.jpg b/src/dataset/iris/4554085801_420108d128_c.jpg new file mode 100644 index 00000000..8fdff731 Binary files /dev/null and b/src/dataset/iris/4554085801_420108d128_c.jpg differ diff --git a/src/dataset/iris/4559373764_8b6b131de1_c.jpg b/src/dataset/iris/4559373764_8b6b131de1_c.jpg new file mode 100644 index 00000000..5e7f4e9e Binary files /dev/null and b/src/dataset/iris/4559373764_8b6b131de1_c.jpg differ diff --git a/src/dataset/iris/4567289696_3c29b7a6fd_c.jpg b/src/dataset/iris/4567289696_3c29b7a6fd_c.jpg new file mode 100644 index 00000000..7a844324 Binary files /dev/null and b/src/dataset/iris/4567289696_3c29b7a6fd_c.jpg differ diff --git a/src/dataset/iris/4572779081_dfdd79fdde_c.jpg b/src/dataset/iris/4572779081_dfdd79fdde_c.jpg new file mode 100644 index 00000000..cba32cd7 Binary files /dev/null and b/src/dataset/iris/4572779081_dfdd79fdde_c.jpg differ diff --git a/src/dataset/iris/4578538381_89cfd6a7f2_c.jpg b/src/dataset/iris/4578538381_89cfd6a7f2_c.jpg new file mode 100644 index 00000000..027ccbfd Binary files /dev/null and b/src/dataset/iris/4578538381_89cfd6a7f2_c.jpg differ diff --git a/src/dataset/iris/4582866448_a2fdf98afd_c.jpg b/src/dataset/iris/4582866448_a2fdf98afd_c.jpg new file mode 100644 index 00000000..016596e3 Binary files /dev/null and b/src/dataset/iris/4582866448_a2fdf98afd_c.jpg differ diff --git a/src/dataset/iris/4584441973_3c13b86821_c.jpg b/src/dataset/iris/4584441973_3c13b86821_c.jpg new file mode 100644 index 00000000..07cbbd77 Binary files /dev/null and b/src/dataset/iris/4584441973_3c13b86821_c.jpg differ diff --git a/src/dataset/iris/4590250915_53352c2fbd_c.jpg b/src/dataset/iris/4590250915_53352c2fbd_c.jpg new file mode 100644 index 00000000..23493c1e Binary files /dev/null and b/src/dataset/iris/4590250915_53352c2fbd_c.jpg differ diff --git a/src/dataset/iris/45929615984_7588ef7a94_c.jpg b/src/dataset/iris/45929615984_7588ef7a94_c.jpg new file mode 100644 index 00000000..bc35caef Binary files /dev/null and b/src/dataset/iris/45929615984_7588ef7a94_c.jpg differ diff --git a/src/dataset/iris/4594487744_73ec840c7f_c.jpg b/src/dataset/iris/4594487744_73ec840c7f_c.jpg new file mode 100644 index 00000000..ca32c21f Binary files /dev/null and b/src/dataset/iris/4594487744_73ec840c7f_c.jpg differ diff --git a/src/dataset/iris/4594894266_98aebccf79_c.jpg b/src/dataset/iris/4594894266_98aebccf79_c.jpg new file mode 100644 index 00000000..e5b217e4 Binary files /dev/null and b/src/dataset/iris/4594894266_98aebccf79_c.jpg differ diff --git a/src/dataset/iris/4594894486_b9c49518fb_c.jpg b/src/dataset/iris/4594894486_b9c49518fb_c.jpg new file mode 100644 index 00000000..beb00cf5 Binary files /dev/null and b/src/dataset/iris/4594894486_b9c49518fb_c.jpg differ diff --git a/src/dataset/iris/4594894566_5881655dc6_c.jpg b/src/dataset/iris/4594894566_5881655dc6_c.jpg new file mode 100644 index 00000000..36eb344c Binary files /dev/null and b/src/dataset/iris/4594894566_5881655dc6_c.jpg differ diff --git a/src/dataset/iris/4594894734_4404a6ea9b_c.jpg b/src/dataset/iris/4594894734_4404a6ea9b_c.jpg new file mode 100644 index 00000000..b657d423 Binary files /dev/null and b/src/dataset/iris/4594894734_4404a6ea9b_c.jpg differ diff --git a/src/dataset/iris/4595912869_80aa67537b_c.jpg b/src/dataset/iris/4595912869_80aa67537b_c.jpg new file mode 100644 index 00000000..29be1c25 Binary files /dev/null and b/src/dataset/iris/4595912869_80aa67537b_c.jpg differ diff --git a/src/dataset/iris/4596605399_7693653d9b_c.jpg b/src/dataset/iris/4596605399_7693653d9b_c.jpg new file mode 100644 index 00000000..b33abc38 Binary files /dev/null and b/src/dataset/iris/4596605399_7693653d9b_c.jpg differ diff --git a/src/dataset/iris/4603261876_df0b251fd9_c.jpg b/src/dataset/iris/4603261876_df0b251fd9_c.jpg new file mode 100644 index 00000000..8712ca0d Binary files /dev/null and b/src/dataset/iris/4603261876_df0b251fd9_c.jpg differ diff --git a/src/dataset/iris/4604882757_c835c906a7_c.jpg b/src/dataset/iris/4604882757_c835c906a7_c.jpg new file mode 100644 index 00000000..b3f382e4 Binary files /dev/null and b/src/dataset/iris/4604882757_c835c906a7_c.jpg differ diff --git a/src/dataset/iris/4614530689_8460dc1e5e_c.jpg b/src/dataset/iris/4614530689_8460dc1e5e_c.jpg new file mode 100644 index 00000000..5d4b7536 Binary files /dev/null and b/src/dataset/iris/4614530689_8460dc1e5e_c.jpg differ diff --git a/src/dataset/iris/4616350079_1b47b85d8a_c.jpg b/src/dataset/iris/4616350079_1b47b85d8a_c.jpg new file mode 100644 index 00000000..a5d523f5 Binary files /dev/null and b/src/dataset/iris/4616350079_1b47b85d8a_c.jpg differ diff --git a/src/dataset/iris/4617163754_562ae628d2_c.jpg b/src/dataset/iris/4617163754_562ae628d2_c.jpg new file mode 100644 index 00000000..b849605d Binary files /dev/null and b/src/dataset/iris/4617163754_562ae628d2_c.jpg differ diff --git a/src/dataset/iris/4617296710_aa07a3f6eb_c.jpg b/src/dataset/iris/4617296710_aa07a3f6eb_c.jpg new file mode 100644 index 00000000..6588a124 Binary files /dev/null and b/src/dataset/iris/4617296710_aa07a3f6eb_c.jpg differ diff --git a/src/dataset/iris/4617693629_30c2e9b852_c.jpg b/src/dataset/iris/4617693629_30c2e9b852_c.jpg new file mode 100644 index 00000000..48233c1f Binary files /dev/null and b/src/dataset/iris/4617693629_30c2e9b852_c.jpg differ diff --git a/src/dataset/iris/4618831003_e26b61c19c_c.jpg b/src/dataset/iris/4618831003_e26b61c19c_c.jpg new file mode 100644 index 00000000..e0613b20 Binary files /dev/null and b/src/dataset/iris/4618831003_e26b61c19c_c.jpg differ diff --git a/src/dataset/iris/4621830429_c9239353d1_c.jpg b/src/dataset/iris/4621830429_c9239353d1_c.jpg new file mode 100644 index 00000000..70548f6d Binary files /dev/null and b/src/dataset/iris/4621830429_c9239353d1_c.jpg differ diff --git a/src/dataset/iris/4621933450_106c7b0dfe_c.jpg b/src/dataset/iris/4621933450_106c7b0dfe_c.jpg new file mode 100644 index 00000000..d90b496a Binary files /dev/null and b/src/dataset/iris/4621933450_106c7b0dfe_c.jpg differ diff --git a/src/dataset/iris/4622365570_a9bff96fbd_c.jpg b/src/dataset/iris/4622365570_a9bff96fbd_c.jpg new file mode 100644 index 00000000..a2eb1074 Binary files /dev/null and b/src/dataset/iris/4622365570_a9bff96fbd_c.jpg differ diff --git a/src/dataset/iris/4624567132_54104e81fb_c.jpg b/src/dataset/iris/4624567132_54104e81fb_c.jpg new file mode 100644 index 00000000..65809c45 Binary files /dev/null and b/src/dataset/iris/4624567132_54104e81fb_c.jpg differ diff --git a/src/dataset/iris/4624946883_5f794e7437_c.jpg b/src/dataset/iris/4624946883_5f794e7437_c.jpg new file mode 100644 index 00000000..b57ad400 Binary files /dev/null and b/src/dataset/iris/4624946883_5f794e7437_c.jpg differ diff --git a/src/dataset/iris/4625146771_551d6fdf86_c.jpg b/src/dataset/iris/4625146771_551d6fdf86_c.jpg new file mode 100644 index 00000000..0d9ed76b Binary files /dev/null and b/src/dataset/iris/4625146771_551d6fdf86_c.jpg differ diff --git a/src/dataset/iris/4625552630_007a75f159_c.jpg b/src/dataset/iris/4625552630_007a75f159_c.jpg new file mode 100644 index 00000000..eac7aa8a Binary files /dev/null and b/src/dataset/iris/4625552630_007a75f159_c.jpg differ diff --git a/src/dataset/iris/4625750818_c23a1d2d64_c.jpg b/src/dataset/iris/4625750818_c23a1d2d64_c.jpg new file mode 100644 index 00000000..d7e39e36 Binary files /dev/null and b/src/dataset/iris/4625750818_c23a1d2d64_c.jpg differ diff --git a/src/dataset/iris/4626533045_2192a27d99_c.jpg b/src/dataset/iris/4626533045_2192a27d99_c.jpg new file mode 100644 index 00000000..06883dd0 Binary files /dev/null and b/src/dataset/iris/4626533045_2192a27d99_c.jpg differ diff --git a/src/dataset/iris/4631471695_7b0d5ce32d_c.jpg b/src/dataset/iris/4631471695_7b0d5ce32d_c.jpg new file mode 100644 index 00000000..6be71dcf Binary files /dev/null and b/src/dataset/iris/4631471695_7b0d5ce32d_c.jpg differ diff --git a/src/dataset/iris/4635502035_84a5c49779_c.jpg b/src/dataset/iris/4635502035_84a5c49779_c.jpg new file mode 100644 index 00000000..505a224a Binary files /dev/null and b/src/dataset/iris/4635502035_84a5c49779_c.jpg differ diff --git a/src/dataset/iris/4637492320_781a809560_c.jpg b/src/dataset/iris/4637492320_781a809560_c.jpg new file mode 100644 index 00000000..858a495e Binary files /dev/null and b/src/dataset/iris/4637492320_781a809560_c.jpg differ diff --git a/src/dataset/iris/4637496082_67642f2249_c.jpg b/src/dataset/iris/4637496082_67642f2249_c.jpg new file mode 100644 index 00000000..d75f79e7 Binary files /dev/null and b/src/dataset/iris/4637496082_67642f2249_c.jpg differ diff --git a/src/dataset/iris/4638716027_186acbc29d_c.jpg b/src/dataset/iris/4638716027_186acbc29d_c.jpg new file mode 100644 index 00000000..71099bce Binary files /dev/null and b/src/dataset/iris/4638716027_186acbc29d_c.jpg differ diff --git a/src/dataset/iris/4638891555_df0f40921b_c.jpg b/src/dataset/iris/4638891555_df0f40921b_c.jpg new file mode 100644 index 00000000..a585601f Binary files /dev/null and b/src/dataset/iris/4638891555_df0f40921b_c.jpg differ diff --git a/src/dataset/iris/4640729511_38cfb911c2_c.jpg b/src/dataset/iris/4640729511_38cfb911c2_c.jpg new file mode 100644 index 00000000..fe78bdb5 Binary files /dev/null and b/src/dataset/iris/4640729511_38cfb911c2_c.jpg differ diff --git a/src/dataset/iris/4640730511_08f5070846_c.jpg b/src/dataset/iris/4640730511_08f5070846_c.jpg new file mode 100644 index 00000000..af2cb411 Binary files /dev/null and b/src/dataset/iris/4640730511_08f5070846_c.jpg differ diff --git a/src/dataset/iris/4641419829_49e1aa6fb0_c.jpg b/src/dataset/iris/4641419829_49e1aa6fb0_c.jpg new file mode 100644 index 00000000..ed222574 Binary files /dev/null and b/src/dataset/iris/4641419829_49e1aa6fb0_c.jpg differ diff --git a/src/dataset/iris/464323868_fcb6f326e3_c.jpg b/src/dataset/iris/464323868_fcb6f326e3_c.jpg new file mode 100644 index 00000000..0f18be9b Binary files /dev/null and b/src/dataset/iris/464323868_fcb6f326e3_c.jpg differ diff --git a/src/dataset/iris/4646949997_734edf892e_c.jpg b/src/dataset/iris/4646949997_734edf892e_c.jpg new file mode 100644 index 00000000..3abb7c10 Binary files /dev/null and b/src/dataset/iris/4646949997_734edf892e_c.jpg differ diff --git a/src/dataset/iris/4646950635_9320ba09cc_c.jpg b/src/dataset/iris/4646950635_9320ba09cc_c.jpg new file mode 100644 index 00000000..7cc0a93b Binary files /dev/null and b/src/dataset/iris/4646950635_9320ba09cc_c.jpg differ diff --git a/src/dataset/iris/4649136640_d8445d165e_c.jpg b/src/dataset/iris/4649136640_d8445d165e_c.jpg new file mode 100644 index 00000000..514762eb Binary files /dev/null and b/src/dataset/iris/4649136640_d8445d165e_c.jpg differ diff --git a/src/dataset/iris/4650824811_f39427a627_c.jpg b/src/dataset/iris/4650824811_f39427a627_c.jpg new file mode 100644 index 00000000..0e07552f Binary files /dev/null and b/src/dataset/iris/4650824811_f39427a627_c.jpg differ diff --git a/src/dataset/iris/4652341037_0fb456dfbb_c.jpg b/src/dataset/iris/4652341037_0fb456dfbb_c.jpg new file mode 100644 index 00000000..a4bf7b4b Binary files /dev/null and b/src/dataset/iris/4652341037_0fb456dfbb_c.jpg differ diff --git a/src/dataset/iris/4653969130_9cc078570b_c.jpg b/src/dataset/iris/4653969130_9cc078570b_c.jpg new file mode 100644 index 00000000..b010ae24 Binary files /dev/null and b/src/dataset/iris/4653969130_9cc078570b_c.jpg differ diff --git a/src/dataset/iris/4661354849_5f06914a13_c.jpg b/src/dataset/iris/4661354849_5f06914a13_c.jpg new file mode 100644 index 00000000..62d1b0b9 Binary files /dev/null and b/src/dataset/iris/4661354849_5f06914a13_c.jpg differ diff --git a/src/dataset/iris/4665545655_7f2b5325fe_c.jpg b/src/dataset/iris/4665545655_7f2b5325fe_c.jpg new file mode 100644 index 00000000..e60073ef Binary files /dev/null and b/src/dataset/iris/4665545655_7f2b5325fe_c.jpg differ diff --git a/src/dataset/iris/4665758014_4e61d30283_c.jpg b/src/dataset/iris/4665758014_4e61d30283_c.jpg new file mode 100644 index 00000000..1784e174 Binary files /dev/null and b/src/dataset/iris/4665758014_4e61d30283_c.jpg differ diff --git a/src/dataset/iris/4666470078_327b6df2ac_c.jpg b/src/dataset/iris/4666470078_327b6df2ac_c.jpg new file mode 100644 index 00000000..1d2bf123 Binary files /dev/null and b/src/dataset/iris/4666470078_327b6df2ac_c.jpg differ diff --git a/src/dataset/iris/4669323265_0a3710907a_c.jpg b/src/dataset/iris/4669323265_0a3710907a_c.jpg new file mode 100644 index 00000000..bb05123f Binary files /dev/null and b/src/dataset/iris/4669323265_0a3710907a_c.jpg differ diff --git a/src/dataset/iris/4672617785_d99f0835b2_c.jpg b/src/dataset/iris/4672617785_d99f0835b2_c.jpg new file mode 100644 index 00000000..c0f3f3b3 Binary files /dev/null and b/src/dataset/iris/4672617785_d99f0835b2_c.jpg differ diff --git a/src/dataset/iris/4672940004_74db94c3bf_c.jpg b/src/dataset/iris/4672940004_74db94c3bf_c.jpg new file mode 100644 index 00000000..306281cf Binary files /dev/null and b/src/dataset/iris/4672940004_74db94c3bf_c.jpg differ diff --git a/src/dataset/iris/467431332_f46f5cf3ca_c.jpg b/src/dataset/iris/467431332_f46f5cf3ca_c.jpg new file mode 100644 index 00000000..3a3b2ed5 Binary files /dev/null and b/src/dataset/iris/467431332_f46f5cf3ca_c.jpg differ diff --git a/src/dataset/iris/4674734436_ed0ac7e840_c.jpg b/src/dataset/iris/4674734436_ed0ac7e840_c.jpg new file mode 100644 index 00000000..c84052ca Binary files /dev/null and b/src/dataset/iris/4674734436_ed0ac7e840_c.jpg differ diff --git a/src/dataset/iris/4675709145_6a4d52932c_c.jpg b/src/dataset/iris/4675709145_6a4d52932c_c.jpg new file mode 100644 index 00000000..ab301b83 Binary files /dev/null and b/src/dataset/iris/4675709145_6a4d52932c_c.jpg differ diff --git a/src/dataset/iris/467841519_910e353335_c.jpg b/src/dataset/iris/467841519_910e353335_c.jpg new file mode 100644 index 00000000..109984d6 Binary files /dev/null and b/src/dataset/iris/467841519_910e353335_c.jpg differ diff --git a/src/dataset/iris/468157974_ed17c4ced1_c.jpg b/src/dataset/iris/468157974_ed17c4ced1_c.jpg new file mode 100644 index 00000000..58f05882 Binary files /dev/null and b/src/dataset/iris/468157974_ed17c4ced1_c.jpg differ diff --git a/src/dataset/iris/4682396944_31cce334ac_c.jpg b/src/dataset/iris/4682396944_31cce334ac_c.jpg new file mode 100644 index 00000000..c7c756e8 Binary files /dev/null and b/src/dataset/iris/4682396944_31cce334ac_c.jpg differ diff --git a/src/dataset/iris/4683229403_a7bca169e8_c.jpg b/src/dataset/iris/4683229403_a7bca169e8_c.jpg new file mode 100644 index 00000000..77f4a423 Binary files /dev/null and b/src/dataset/iris/4683229403_a7bca169e8_c.jpg differ diff --git a/src/dataset/iris/4683855412_cf6ac916c6_c.jpg b/src/dataset/iris/4683855412_cf6ac916c6_c.jpg new file mode 100644 index 00000000..23be14e6 Binary files /dev/null and b/src/dataset/iris/4683855412_cf6ac916c6_c.jpg differ diff --git a/src/dataset/iris/4683860272_72dac12c3e_c.jpg b/src/dataset/iris/4683860272_72dac12c3e_c.jpg new file mode 100644 index 00000000..8bee283a Binary files /dev/null and b/src/dataset/iris/4683860272_72dac12c3e_c.jpg differ diff --git a/src/dataset/iris/4683863674_4dd2d8cfd9_c.jpg b/src/dataset/iris/4683863674_4dd2d8cfd9_c.jpg new file mode 100644 index 00000000..498442e9 Binary files /dev/null and b/src/dataset/iris/4683863674_4dd2d8cfd9_c.jpg differ diff --git a/src/dataset/iris/4683865122_086edf3311_c.jpg b/src/dataset/iris/4683865122_086edf3311_c.jpg new file mode 100644 index 00000000..5008bbad Binary files /dev/null and b/src/dataset/iris/4683865122_086edf3311_c.jpg differ diff --git a/src/dataset/iris/4686166470_41dd061ed7_c.jpg b/src/dataset/iris/4686166470_41dd061ed7_c.jpg new file mode 100644 index 00000000..dced08e8 Binary files /dev/null and b/src/dataset/iris/4686166470_41dd061ed7_c.jpg differ diff --git a/src/dataset/iris/4689391099_b5a491b332_c.jpg b/src/dataset/iris/4689391099_b5a491b332_c.jpg new file mode 100644 index 00000000..778975ec Binary files /dev/null and b/src/dataset/iris/4689391099_b5a491b332_c.jpg differ diff --git a/src/dataset/iris/4689396645_d15b10f35b_c.jpg b/src/dataset/iris/4689396645_d15b10f35b_c.jpg new file mode 100644 index 00000000..37e1a012 Binary files /dev/null and b/src/dataset/iris/4689396645_d15b10f35b_c.jpg differ diff --git a/src/dataset/iris/4702664621_ff2912daeb_c.jpg b/src/dataset/iris/4702664621_ff2912daeb_c.jpg new file mode 100644 index 00000000..17d4402b Binary files /dev/null and b/src/dataset/iris/4702664621_ff2912daeb_c.jpg differ diff --git a/src/dataset/iris/4715709210_b8d62802c8_c.jpg b/src/dataset/iris/4715709210_b8d62802c8_c.jpg new file mode 100644 index 00000000..fdcb45fb Binary files /dev/null and b/src/dataset/iris/4715709210_b8d62802c8_c.jpg differ diff --git a/src/dataset/iris/4717497501_964a72a718_c.jpg b/src/dataset/iris/4717497501_964a72a718_c.jpg new file mode 100644 index 00000000..72bb4e56 Binary files /dev/null and b/src/dataset/iris/4717497501_964a72a718_c.jpg differ diff --git a/src/dataset/iris/472111019_7db43e7cc7_c.jpg b/src/dataset/iris/472111019_7db43e7cc7_c.jpg new file mode 100644 index 00000000..76a2be06 Binary files /dev/null and b/src/dataset/iris/472111019_7db43e7cc7_c.jpg differ diff --git a/src/dataset/iris/4724438292_1e8f463fc0_c.jpg b/src/dataset/iris/4724438292_1e8f463fc0_c.jpg new file mode 100644 index 00000000..ffb38551 Binary files /dev/null and b/src/dataset/iris/4724438292_1e8f463fc0_c.jpg differ diff --git a/src/dataset/iris/4728273120_fa84d480cf_c.jpg b/src/dataset/iris/4728273120_fa84d480cf_c.jpg new file mode 100644 index 00000000..ce434943 Binary files /dev/null and b/src/dataset/iris/4728273120_fa84d480cf_c.jpg differ diff --git a/src/dataset/iris/4731448148_1c8156f606_c.jpg b/src/dataset/iris/4731448148_1c8156f606_c.jpg new file mode 100644 index 00000000..9f8b052b Binary files /dev/null and b/src/dataset/iris/4731448148_1c8156f606_c.jpg differ diff --git a/src/dataset/iris/4733316589_1d7d365575_c.jpg b/src/dataset/iris/4733316589_1d7d365575_c.jpg new file mode 100644 index 00000000..a15c9c31 Binary files /dev/null and b/src/dataset/iris/4733316589_1d7d365575_c.jpg differ diff --git a/src/dataset/iris/4739631565_ae13172d60_c.jpg b/src/dataset/iris/4739631565_ae13172d60_c.jpg new file mode 100644 index 00000000..cd0c971b Binary files /dev/null and b/src/dataset/iris/4739631565_ae13172d60_c.jpg differ diff --git a/src/dataset/iris/4756413429_30733be144_c.jpg b/src/dataset/iris/4756413429_30733be144_c.jpg new file mode 100644 index 00000000..78436879 Binary files /dev/null and b/src/dataset/iris/4756413429_30733be144_c.jpg differ diff --git a/src/dataset/iris/47716292891_e05a77fe70_c.jpg b/src/dataset/iris/47716292891_e05a77fe70_c.jpg new file mode 100644 index 00000000..1d2c638e Binary files /dev/null and b/src/dataset/iris/47716292891_e05a77fe70_c.jpg differ diff --git a/src/dataset/iris/477207173_91eecdb47d_c.jpg b/src/dataset/iris/477207173_91eecdb47d_c.jpg new file mode 100644 index 00000000..914ea5ce Binary files /dev/null and b/src/dataset/iris/477207173_91eecdb47d_c.jpg differ diff --git a/src/dataset/iris/47763389202_ffc8f2c79b_c.jpg b/src/dataset/iris/47763389202_ffc8f2c79b_c.jpg new file mode 100644 index 00000000..9ef535a0 Binary files /dev/null and b/src/dataset/iris/47763389202_ffc8f2c79b_c.jpg differ diff --git a/src/dataset/iris/47775896132_34fefd3f50_c.jpg b/src/dataset/iris/47775896132_34fefd3f50_c.jpg new file mode 100644 index 00000000..36af0f34 Binary files /dev/null and b/src/dataset/iris/47775896132_34fefd3f50_c.jpg differ diff --git a/src/dataset/iris/4782724595_10b1f11470_c.jpg b/src/dataset/iris/4782724595_10b1f11470_c.jpg new file mode 100644 index 00000000..069d9782 Binary files /dev/null and b/src/dataset/iris/4782724595_10b1f11470_c.jpg differ diff --git a/src/dataset/iris/4785939988_1c68c6f82a_c.jpg b/src/dataset/iris/4785939988_1c68c6f82a_c.jpg new file mode 100644 index 00000000..10a9c6c5 Binary files /dev/null and b/src/dataset/iris/4785939988_1c68c6f82a_c.jpg differ diff --git a/src/dataset/iris/481965041_17982c1ccc_c.jpg b/src/dataset/iris/481965041_17982c1ccc_c.jpg new file mode 100644 index 00000000..c0c779f8 Binary files /dev/null and b/src/dataset/iris/481965041_17982c1ccc_c.jpg differ diff --git a/src/dataset/iris/4832036792_3deb85c5b9_c.jpg b/src/dataset/iris/4832036792_3deb85c5b9_c.jpg new file mode 100644 index 00000000..72d510c5 Binary files /dev/null and b/src/dataset/iris/4832036792_3deb85c5b9_c.jpg differ diff --git a/src/dataset/iris/4832406375_50af6f258e_c.jpg b/src/dataset/iris/4832406375_50af6f258e_c.jpg new file mode 100644 index 00000000..7204df47 Binary files /dev/null and b/src/dataset/iris/4832406375_50af6f258e_c.jpg differ diff --git a/src/dataset/iris/488821829_cb7d43db49_c.jpg b/src/dataset/iris/488821829_cb7d43db49_c.jpg new file mode 100644 index 00000000..2a5fdcca Binary files /dev/null and b/src/dataset/iris/488821829_cb7d43db49_c.jpg differ diff --git a/src/dataset/iris/490566180_c84acdf29a_c.jpg b/src/dataset/iris/490566180_c84acdf29a_c.jpg new file mode 100644 index 00000000..2951b1b4 Binary files /dev/null and b/src/dataset/iris/490566180_c84acdf29a_c.jpg differ diff --git a/src/dataset/iris/495074021_ca7b99a25b_c.jpg b/src/dataset/iris/495074021_ca7b99a25b_c.jpg new file mode 100644 index 00000000..1fc8adef Binary files /dev/null and b/src/dataset/iris/495074021_ca7b99a25b_c.jpg differ diff --git a/src/dataset/iris/498881088_b0b84e1c85_c.jpg b/src/dataset/iris/498881088_b0b84e1c85_c.jpg new file mode 100644 index 00000000..06aef753 Binary files /dev/null and b/src/dataset/iris/498881088_b0b84e1c85_c.jpg differ diff --git a/src/dataset/iris/498905725_8f77d0cd49_c.jpg b/src/dataset/iris/498905725_8f77d0cd49_c.jpg new file mode 100644 index 00000000..c03d9614 Binary files /dev/null and b/src/dataset/iris/498905725_8f77d0cd49_c.jpg differ diff --git a/src/dataset/iris/4995022874_77c7079dd9_c.jpg b/src/dataset/iris/4995022874_77c7079dd9_c.jpg new file mode 100644 index 00000000..1ca883a9 Binary files /dev/null and b/src/dataset/iris/4995022874_77c7079dd9_c.jpg differ diff --git a/src/dataset/iris/501943910_953091e767_c.jpg b/src/dataset/iris/501943910_953091e767_c.jpg new file mode 100644 index 00000000..a5ee99f2 Binary files /dev/null and b/src/dataset/iris/501943910_953091e767_c.jpg differ diff --git a/src/dataset/iris/5032699683_3dbbfe8819_c.jpg b/src/dataset/iris/5032699683_3dbbfe8819_c.jpg new file mode 100644 index 00000000..5c804a32 Binary files /dev/null and b/src/dataset/iris/5032699683_3dbbfe8819_c.jpg differ diff --git a/src/dataset/iris/503853343_8d039b5ca2_c.jpg b/src/dataset/iris/503853343_8d039b5ca2_c.jpg new file mode 100644 index 00000000..030f33ea Binary files /dev/null and b/src/dataset/iris/503853343_8d039b5ca2_c.jpg differ diff --git a/src/dataset/iris/505449319_385831a7b9_c.jpg b/src/dataset/iris/505449319_385831a7b9_c.jpg new file mode 100644 index 00000000..d0ecf5a1 Binary files /dev/null and b/src/dataset/iris/505449319_385831a7b9_c.jpg differ diff --git a/src/dataset/iris/5061372237_0b2fa56c4f_c.jpg b/src/dataset/iris/5061372237_0b2fa56c4f_c.jpg new file mode 100644 index 00000000..81a4fb9d Binary files /dev/null and b/src/dataset/iris/5061372237_0b2fa56c4f_c.jpg differ diff --git a/src/dataset/iris/506728371_7fc1f873d9_c.jpg b/src/dataset/iris/506728371_7fc1f873d9_c.jpg new file mode 100644 index 00000000..9a0ee8f0 Binary files /dev/null and b/src/dataset/iris/506728371_7fc1f873d9_c.jpg differ diff --git a/src/dataset/iris/5067426281_579ef112f0_c.jpg b/src/dataset/iris/5067426281_579ef112f0_c.jpg new file mode 100644 index 00000000..a5c31e20 Binary files /dev/null and b/src/dataset/iris/5067426281_579ef112f0_c.jpg differ diff --git a/src/dataset/iris/507046324_824eb471a0_c.jpg b/src/dataset/iris/507046324_824eb471a0_c.jpg new file mode 100644 index 00000000..fc4e4008 Binary files /dev/null and b/src/dataset/iris/507046324_824eb471a0_c.jpg differ diff --git a/src/dataset/iris/507046332_418638509a_c.jpg b/src/dataset/iris/507046332_418638509a_c.jpg new file mode 100644 index 00000000..1af9a610 Binary files /dev/null and b/src/dataset/iris/507046332_418638509a_c.jpg differ diff --git a/src/dataset/iris/507070579_b8cd995b45_c.jpg b/src/dataset/iris/507070579_b8cd995b45_c.jpg new file mode 100644 index 00000000..3a955ed5 Binary files /dev/null and b/src/dataset/iris/507070579_b8cd995b45_c.jpg differ diff --git a/src/dataset/iris/507080554_ae75fe2797_c.jpg b/src/dataset/iris/507080554_ae75fe2797_c.jpg new file mode 100644 index 00000000..800ba151 Binary files /dev/null and b/src/dataset/iris/507080554_ae75fe2797_c.jpg differ diff --git a/src/dataset/iris/507080592_93ab2d698e_c.jpg b/src/dataset/iris/507080592_93ab2d698e_c.jpg new file mode 100644 index 00000000..6f21e2e5 Binary files /dev/null and b/src/dataset/iris/507080592_93ab2d698e_c.jpg differ diff --git a/src/dataset/iris/507086665_3cc333b0b3_c.jpg b/src/dataset/iris/507086665_3cc333b0b3_c.jpg new file mode 100644 index 00000000..a04eefc1 Binary files /dev/null and b/src/dataset/iris/507086665_3cc333b0b3_c.jpg differ diff --git a/src/dataset/iris/507086673_367ec0791d_c.jpg b/src/dataset/iris/507086673_367ec0791d_c.jpg new file mode 100644 index 00000000..800ba151 Binary files /dev/null and b/src/dataset/iris/507086673_367ec0791d_c.jpg differ diff --git a/src/dataset/iris/507086677_ab2dd3521c_c.jpg b/src/dataset/iris/507086677_ab2dd3521c_c.jpg new file mode 100644 index 00000000..48518e98 Binary files /dev/null and b/src/dataset/iris/507086677_ab2dd3521c_c.jpg differ diff --git a/src/dataset/iris/507086693_c97e7d7bf5_c.jpg b/src/dataset/iris/507086693_c97e7d7bf5_c.jpg new file mode 100644 index 00000000..630d8dee Binary files /dev/null and b/src/dataset/iris/507086693_c97e7d7bf5_c.jpg differ diff --git a/src/dataset/iris/507090124_376dbdd1c5_c.jpg b/src/dataset/iris/507090124_376dbdd1c5_c.jpg new file mode 100644 index 00000000..630d8dee Binary files /dev/null and b/src/dataset/iris/507090124_376dbdd1c5_c.jpg differ diff --git a/src/dataset/iris/507090170_6ae4974e88_c.jpg b/src/dataset/iris/507090170_6ae4974e88_c.jpg new file mode 100644 index 00000000..0f46b29b Binary files /dev/null and b/src/dataset/iris/507090170_6ae4974e88_c.jpg differ diff --git a/src/dataset/iris/507090186_d48c1f6afa_c.jpg b/src/dataset/iris/507090186_d48c1f6afa_c.jpg new file mode 100644 index 00000000..aede22b3 Binary files /dev/null and b/src/dataset/iris/507090186_d48c1f6afa_c.jpg differ diff --git a/src/dataset/iris/507868539_b3c3799397_c.jpg b/src/dataset/iris/507868539_b3c3799397_c.jpg new file mode 100644 index 00000000..5786ad92 Binary files /dev/null and b/src/dataset/iris/507868539_b3c3799397_c.jpg differ diff --git a/src/dataset/iris/508561265_ee477b0d1f_c.jpg b/src/dataset/iris/508561265_ee477b0d1f_c.jpg new file mode 100644 index 00000000..7478e1ec Binary files /dev/null and b/src/dataset/iris/508561265_ee477b0d1f_c.jpg differ diff --git a/src/dataset/iris/508572637_e584ca6767_c.jpg b/src/dataset/iris/508572637_e584ca6767_c.jpg new file mode 100644 index 00000000..c3286e14 Binary files /dev/null and b/src/dataset/iris/508572637_e584ca6767_c.jpg differ diff --git a/src/dataset/iris/508572647_57abc09aa4_c.jpg b/src/dataset/iris/508572647_57abc09aa4_c.jpg new file mode 100644 index 00000000..ed63320f Binary files /dev/null and b/src/dataset/iris/508572647_57abc09aa4_c.jpg differ diff --git a/src/dataset/iris/514065539_6a26aad359_c.jpg b/src/dataset/iris/514065539_6a26aad359_c.jpg new file mode 100644 index 00000000..9db1546c Binary files /dev/null and b/src/dataset/iris/514065539_6a26aad359_c.jpg differ diff --git a/src/dataset/iris/514168094_741702a309_c.jpg b/src/dataset/iris/514168094_741702a309_c.jpg new file mode 100644 index 00000000..f679d032 Binary files /dev/null and b/src/dataset/iris/514168094_741702a309_c.jpg differ diff --git a/src/dataset/iris/514196171_b25bd89bd4_c.jpg b/src/dataset/iris/514196171_b25bd89bd4_c.jpg new file mode 100644 index 00000000..774b4114 Binary files /dev/null and b/src/dataset/iris/514196171_b25bd89bd4_c.jpg differ diff --git a/src/dataset/iris/5175072530_6d403c5917_c.jpg b/src/dataset/iris/5175072530_6d403c5917_c.jpg new file mode 100644 index 00000000..2cba46f0 Binary files /dev/null and b/src/dataset/iris/5175072530_6d403c5917_c.jpg differ diff --git a/src/dataset/iris/5187969471_fcf588e286_c.jpg b/src/dataset/iris/5187969471_fcf588e286_c.jpg new file mode 100644 index 00000000..a1729db4 Binary files /dev/null and b/src/dataset/iris/5187969471_fcf588e286_c.jpg differ diff --git a/src/dataset/iris/5214694535_e8bfd1a483_c.jpg b/src/dataset/iris/5214694535_e8bfd1a483_c.jpg new file mode 100644 index 00000000..459a620c Binary files /dev/null and b/src/dataset/iris/5214694535_e8bfd1a483_c.jpg differ diff --git a/src/dataset/iris/525246739_e6190d07c9_c.jpg b/src/dataset/iris/525246739_e6190d07c9_c.jpg new file mode 100644 index 00000000..70517a99 Binary files /dev/null and b/src/dataset/iris/525246739_e6190d07c9_c.jpg differ diff --git a/src/dataset/iris/5255077682_642461f440_c.jpg b/src/dataset/iris/5255077682_642461f440_c.jpg new file mode 100644 index 00000000..f76eaefc Binary files /dev/null and b/src/dataset/iris/5255077682_642461f440_c.jpg differ diff --git a/src/dataset/iris/526130550_4232709812_c.jpg b/src/dataset/iris/526130550_4232709812_c.jpg new file mode 100644 index 00000000..b1db479b Binary files /dev/null and b/src/dataset/iris/526130550_4232709812_c.jpg differ diff --git a/src/dataset/iris/527809421_63137c2be8_c.jpg b/src/dataset/iris/527809421_63137c2be8_c.jpg new file mode 100644 index 00000000..55a7ac4f Binary files /dev/null and b/src/dataset/iris/527809421_63137c2be8_c.jpg differ diff --git a/src/dataset/iris/5287247582_85edf02e1e_c.jpg b/src/dataset/iris/5287247582_85edf02e1e_c.jpg new file mode 100644 index 00000000..5c5809b5 Binary files /dev/null and b/src/dataset/iris/5287247582_85edf02e1e_c.jpg differ diff --git a/src/dataset/iris/531911955_b59adeea93_c.jpg b/src/dataset/iris/531911955_b59adeea93_c.jpg new file mode 100644 index 00000000..000321c0 Binary files /dev/null and b/src/dataset/iris/531911955_b59adeea93_c.jpg differ diff --git a/src/dataset/iris/532112193_cd28748e3e_c.jpg b/src/dataset/iris/532112193_cd28748e3e_c.jpg new file mode 100644 index 00000000..9c06266b Binary files /dev/null and b/src/dataset/iris/532112193_cd28748e3e_c.jpg differ diff --git a/src/dataset/iris/532564738_75301b167a_c.jpg b/src/dataset/iris/532564738_75301b167a_c.jpg new file mode 100644 index 00000000..ef79696c Binary files /dev/null and b/src/dataset/iris/532564738_75301b167a_c.jpg differ diff --git a/src/dataset/iris/532564742_07cca6e27b_c.jpg b/src/dataset/iris/532564742_07cca6e27b_c.jpg new file mode 100644 index 00000000..69dd7140 Binary files /dev/null and b/src/dataset/iris/532564742_07cca6e27b_c.jpg differ diff --git a/src/dataset/iris/533868180_a8843fd3a0_c.jpg b/src/dataset/iris/533868180_a8843fd3a0_c.jpg new file mode 100644 index 00000000..6309aaf8 Binary files /dev/null and b/src/dataset/iris/533868180_a8843fd3a0_c.jpg differ diff --git a/src/dataset/iris/536463048_0fb77c9d7d_c.jpg b/src/dataset/iris/536463048_0fb77c9d7d_c.jpg new file mode 100644 index 00000000..593eb8fe Binary files /dev/null and b/src/dataset/iris/536463048_0fb77c9d7d_c.jpg differ diff --git a/src/dataset/iris/5568505273_fc32aa84fe_c.jpg b/src/dataset/iris/5568505273_fc32aa84fe_c.jpg new file mode 100644 index 00000000..f49179ac Binary files /dev/null and b/src/dataset/iris/5568505273_fc32aa84fe_c.jpg differ diff --git a/src/dataset/iris/5578778649_f0495a118e_c.jpg b/src/dataset/iris/5578778649_f0495a118e_c.jpg new file mode 100644 index 00000000..f40a4e8a Binary files /dev/null and b/src/dataset/iris/5578778649_f0495a118e_c.jpg differ diff --git a/src/dataset/iris/5591648343_5e1056b7cf_c.jpg b/src/dataset/iris/5591648343_5e1056b7cf_c.jpg new file mode 100644 index 00000000..5a274c70 Binary files /dev/null and b/src/dataset/iris/5591648343_5e1056b7cf_c.jpg differ diff --git a/src/dataset/iris/5606724390_c850f68539_c.jpg b/src/dataset/iris/5606724390_c850f68539_c.jpg new file mode 100644 index 00000000..6e7abce6 Binary files /dev/null and b/src/dataset/iris/5606724390_c850f68539_c.jpg differ diff --git a/src/dataset/iris/5628367400_63428ac3ee_c.jpg b/src/dataset/iris/5628367400_63428ac3ee_c.jpg new file mode 100644 index 00000000..68af9bc7 Binary files /dev/null and b/src/dataset/iris/5628367400_63428ac3ee_c.jpg differ diff --git a/src/dataset/iris/5628381878_ed9101eb6a_c.jpg b/src/dataset/iris/5628381878_ed9101eb6a_c.jpg new file mode 100644 index 00000000..0be3eef9 Binary files /dev/null and b/src/dataset/iris/5628381878_ed9101eb6a_c.jpg differ diff --git a/src/dataset/iris/564191758_20934915ee_c.jpg b/src/dataset/iris/564191758_20934915ee_c.jpg new file mode 100644 index 00000000..3105ea5b Binary files /dev/null and b/src/dataset/iris/564191758_20934915ee_c.jpg differ diff --git a/src/dataset/iris/564198730_93008629af_c.jpg b/src/dataset/iris/564198730_93008629af_c.jpg new file mode 100644 index 00000000..874156de Binary files /dev/null and b/src/dataset/iris/564198730_93008629af_c.jpg differ diff --git a/src/dataset/iris/5645047181_6b61843ed6_c.jpg b/src/dataset/iris/5645047181_6b61843ed6_c.jpg new file mode 100644 index 00000000..c5c98da3 Binary files /dev/null and b/src/dataset/iris/5645047181_6b61843ed6_c.jpg differ diff --git a/src/dataset/iris/5651250866_4c062a5a93_c.jpg b/src/dataset/iris/5651250866_4c062a5a93_c.jpg new file mode 100644 index 00000000..db4eaa72 Binary files /dev/null and b/src/dataset/iris/5651250866_4c062a5a93_c.jpg differ diff --git a/src/dataset/iris/5651251780_aa3f65b87e_c.jpg b/src/dataset/iris/5651251780_aa3f65b87e_c.jpg new file mode 100644 index 00000000..44da798e Binary files /dev/null and b/src/dataset/iris/5651251780_aa3f65b87e_c.jpg differ diff --git a/src/dataset/iris/5662189283_4dcfe39c51_c.jpg b/src/dataset/iris/5662189283_4dcfe39c51_c.jpg new file mode 100644 index 00000000..bd7dbf28 Binary files /dev/null and b/src/dataset/iris/5662189283_4dcfe39c51_c.jpg differ diff --git a/src/dataset/iris/5672888455_de7dbac8ff_c.jpg b/src/dataset/iris/5672888455_de7dbac8ff_c.jpg new file mode 100644 index 00000000..76dd6667 Binary files /dev/null and b/src/dataset/iris/5672888455_de7dbac8ff_c.jpg differ diff --git a/src/dataset/iris/5672890607_5ae1311b34_c.jpg b/src/dataset/iris/5672890607_5ae1311b34_c.jpg new file mode 100644 index 00000000..6dd2de36 Binary files /dev/null and b/src/dataset/iris/5672890607_5ae1311b34_c.jpg differ diff --git a/src/dataset/iris/5672898773_c85e5bea7f_c.jpg b/src/dataset/iris/5672898773_c85e5bea7f_c.jpg new file mode 100644 index 00000000..0c408fc9 Binary files /dev/null and b/src/dataset/iris/5672898773_c85e5bea7f_c.jpg differ diff --git a/src/dataset/iris/5672900029_f7ae2bb5b9_c.jpg b/src/dataset/iris/5672900029_f7ae2bb5b9_c.jpg new file mode 100644 index 00000000..f1e53d43 Binary files /dev/null and b/src/dataset/iris/5672900029_f7ae2bb5b9_c.jpg differ diff --git a/src/dataset/iris/5672901247_9482eae8b6_c.jpg b/src/dataset/iris/5672901247_9482eae8b6_c.jpg new file mode 100644 index 00000000..ee40d636 Binary files /dev/null and b/src/dataset/iris/5672901247_9482eae8b6_c.jpg differ diff --git a/src/dataset/iris/5672918829_f669d70d1e_c.jpg b/src/dataset/iris/5672918829_f669d70d1e_c.jpg new file mode 100644 index 00000000..436d0fcc Binary files /dev/null and b/src/dataset/iris/5672918829_f669d70d1e_c.jpg differ diff --git a/src/dataset/iris/5673454832_5fc6b03a09_c.jpg b/src/dataset/iris/5673454832_5fc6b03a09_c.jpg new file mode 100644 index 00000000..db2a4458 Binary files /dev/null and b/src/dataset/iris/5673454832_5fc6b03a09_c.jpg differ diff --git a/src/dataset/iris/5673478496_2ec4df735b_c.jpg b/src/dataset/iris/5673478496_2ec4df735b_c.jpg new file mode 100644 index 00000000..57791e52 Binary files /dev/null and b/src/dataset/iris/5673478496_2ec4df735b_c.jpg differ diff --git a/src/dataset/iris/5673985985_1f6524fcab_c.jpg b/src/dataset/iris/5673985985_1f6524fcab_c.jpg new file mode 100644 index 00000000..7461e1fc Binary files /dev/null and b/src/dataset/iris/5673985985_1f6524fcab_c.jpg differ diff --git a/src/dataset/iris/5679571298_4e778e228a_c.jpg b/src/dataset/iris/5679571298_4e778e228a_c.jpg new file mode 100644 index 00000000..22883971 Binary files /dev/null and b/src/dataset/iris/5679571298_4e778e228a_c.jpg differ diff --git a/src/dataset/iris/5691089941_68d2fa0d02_c.jpg b/src/dataset/iris/5691089941_68d2fa0d02_c.jpg new file mode 100644 index 00000000..a583d4c1 Binary files /dev/null and b/src/dataset/iris/5691089941_68d2fa0d02_c.jpg differ diff --git a/src/dataset/iris/5694141265_078f3066ee_c.jpg b/src/dataset/iris/5694141265_078f3066ee_c.jpg new file mode 100644 index 00000000..c1685919 Binary files /dev/null and b/src/dataset/iris/5694141265_078f3066ee_c.jpg differ diff --git a/src/dataset/iris/5694733301_b883a9fe27_c.jpg b/src/dataset/iris/5694733301_b883a9fe27_c.jpg new file mode 100644 index 00000000..e1aa5988 Binary files /dev/null and b/src/dataset/iris/5694733301_b883a9fe27_c.jpg differ diff --git a/src/dataset/iris/5694744691_950773ea7b_c.jpg b/src/dataset/iris/5694744691_950773ea7b_c.jpg new file mode 100644 index 00000000..4abe0fee Binary files /dev/null and b/src/dataset/iris/5694744691_950773ea7b_c.jpg differ diff --git a/src/dataset/iris/5694984160_207cd4d56c_c.jpg b/src/dataset/iris/5694984160_207cd4d56c_c.jpg new file mode 100644 index 00000000..a3f201f3 Binary files /dev/null and b/src/dataset/iris/5694984160_207cd4d56c_c.jpg differ diff --git a/src/dataset/iris/5695309566_e0a5f1aa19_c.jpg b/src/dataset/iris/5695309566_e0a5f1aa19_c.jpg new file mode 100644 index 00000000..270ad78b Binary files /dev/null and b/src/dataset/iris/5695309566_e0a5f1aa19_c.jpg differ diff --git a/src/dataset/iris/5695315830_2c4e9215cb_c.jpg b/src/dataset/iris/5695315830_2c4e9215cb_c.jpg new file mode 100644 index 00000000..c3e090d7 Binary files /dev/null and b/src/dataset/iris/5695315830_2c4e9215cb_c.jpg differ diff --git a/src/dataset/iris/5702977490_9a3897d9c9_c.jpg b/src/dataset/iris/5702977490_9a3897d9c9_c.jpg new file mode 100644 index 00000000..bc942ddf Binary files /dev/null and b/src/dataset/iris/5702977490_9a3897d9c9_c.jpg differ diff --git a/src/dataset/iris/5707563903_5e4ed570b6_c.jpg b/src/dataset/iris/5707563903_5e4ed570b6_c.jpg new file mode 100644 index 00000000..855f335a Binary files /dev/null and b/src/dataset/iris/5707563903_5e4ed570b6_c.jpg differ diff --git a/src/dataset/iris/5708124562_9db82a059a_c.jpg b/src/dataset/iris/5708124562_9db82a059a_c.jpg new file mode 100644 index 00000000..24f72638 Binary files /dev/null and b/src/dataset/iris/5708124562_9db82a059a_c.jpg differ diff --git a/src/dataset/iris/5724229960_333d7ac3a7_c.jpg b/src/dataset/iris/5724229960_333d7ac3a7_c.jpg new file mode 100644 index 00000000..be6a76a6 Binary files /dev/null and b/src/dataset/iris/5724229960_333d7ac3a7_c.jpg differ diff --git a/src/dataset/iris/5725867389_f1d6e31f4a_c.jpg b/src/dataset/iris/5725867389_f1d6e31f4a_c.jpg new file mode 100644 index 00000000..de519b2a Binary files /dev/null and b/src/dataset/iris/5725867389_f1d6e31f4a_c.jpg differ diff --git a/src/dataset/iris/5726442058_2cc83a40a4_c.jpg b/src/dataset/iris/5726442058_2cc83a40a4_c.jpg new file mode 100644 index 00000000..6d0fc96f Binary files /dev/null and b/src/dataset/iris/5726442058_2cc83a40a4_c.jpg differ diff --git a/src/dataset/iris/5733087431_a47dbece27_c.jpg b/src/dataset/iris/5733087431_a47dbece27_c.jpg new file mode 100644 index 00000000..927b98bb Binary files /dev/null and b/src/dataset/iris/5733087431_a47dbece27_c.jpg differ diff --git a/src/dataset/iris/5735630872_1d8b57ce46_c.jpg b/src/dataset/iris/5735630872_1d8b57ce46_c.jpg new file mode 100644 index 00000000..1a0ea602 Binary files /dev/null and b/src/dataset/iris/5735630872_1d8b57ce46_c.jpg differ diff --git a/src/dataset/iris/5744734285_389f078c8c_c.jpg b/src/dataset/iris/5744734285_389f078c8c_c.jpg new file mode 100644 index 00000000..2fb34543 Binary files /dev/null and b/src/dataset/iris/5744734285_389f078c8c_c.jpg differ diff --git a/src/dataset/iris/5748007068_31ca1bfd82_c.jpg b/src/dataset/iris/5748007068_31ca1bfd82_c.jpg new file mode 100644 index 00000000..2bdfe68d Binary files /dev/null and b/src/dataset/iris/5748007068_31ca1bfd82_c.jpg differ diff --git a/src/dataset/iris/5748038870_60f0a7841c_c.jpg b/src/dataset/iris/5748038870_60f0a7841c_c.jpg new file mode 100644 index 00000000..40e83f62 Binary files /dev/null and b/src/dataset/iris/5748038870_60f0a7841c_c.jpg differ diff --git a/src/dataset/iris/5748820302_ca78d086f6_c.jpg b/src/dataset/iris/5748820302_ca78d086f6_c.jpg new file mode 100644 index 00000000..e03517e1 Binary files /dev/null and b/src/dataset/iris/5748820302_ca78d086f6_c.jpg differ diff --git a/src/dataset/iris/5748822144_d5fcf61e18_c.jpg b/src/dataset/iris/5748822144_d5fcf61e18_c.jpg new file mode 100644 index 00000000..b5cd6ecf Binary files /dev/null and b/src/dataset/iris/5748822144_d5fcf61e18_c.jpg differ diff --git a/src/dataset/iris/5752143849_58983f9689_c.jpg b/src/dataset/iris/5752143849_58983f9689_c.jpg new file mode 100644 index 00000000..8c8d496a Binary files /dev/null and b/src/dataset/iris/5752143849_58983f9689_c.jpg differ diff --git a/src/dataset/iris/5752158433_f6f33a3d72_c.jpg b/src/dataset/iris/5752158433_f6f33a3d72_c.jpg new file mode 100644 index 00000000..5fb2a549 Binary files /dev/null and b/src/dataset/iris/5752158433_f6f33a3d72_c.jpg differ diff --git a/src/dataset/iris/5753171465_3836960ffe_c.jpg b/src/dataset/iris/5753171465_3836960ffe_c.jpg new file mode 100644 index 00000000..8e9c3947 Binary files /dev/null and b/src/dataset/iris/5753171465_3836960ffe_c.jpg differ diff --git a/src/dataset/iris/5756577836_6991009162_c.jpg b/src/dataset/iris/5756577836_6991009162_c.jpg new file mode 100644 index 00000000..d0173ee0 Binary files /dev/null and b/src/dataset/iris/5756577836_6991009162_c.jpg differ diff --git a/src/dataset/iris/5757258072_e708553cda_c.jpg b/src/dataset/iris/5757258072_e708553cda_c.jpg new file mode 100644 index 00000000..468cdcd0 Binary files /dev/null and b/src/dataset/iris/5757258072_e708553cda_c.jpg differ diff --git a/src/dataset/iris/5759039629_dd6e7a6114_c.jpg b/src/dataset/iris/5759039629_dd6e7a6114_c.jpg new file mode 100644 index 00000000..2c897d56 Binary files /dev/null and b/src/dataset/iris/5759039629_dd6e7a6114_c.jpg differ diff --git a/src/dataset/iris/5765398441_f14a821bd3_c.jpg b/src/dataset/iris/5765398441_f14a821bd3_c.jpg new file mode 100644 index 00000000..034aa758 Binary files /dev/null and b/src/dataset/iris/5765398441_f14a821bd3_c.jpg differ diff --git a/src/dataset/iris/5765616997_426dd6226d_c.jpg b/src/dataset/iris/5765616997_426dd6226d_c.jpg new file mode 100644 index 00000000..ff6bf684 Binary files /dev/null and b/src/dataset/iris/5765616997_426dd6226d_c.jpg differ diff --git a/src/dataset/iris/5766162675_a94d1b371e_c.jpg b/src/dataset/iris/5766162675_a94d1b371e_c.jpg new file mode 100644 index 00000000..69a0cbe3 Binary files /dev/null and b/src/dataset/iris/5766162675_a94d1b371e_c.jpg differ diff --git a/src/dataset/iris/5769709576_260b3811b6_c.jpg b/src/dataset/iris/5769709576_260b3811b6_c.jpg new file mode 100644 index 00000000..98fc4fdd Binary files /dev/null and b/src/dataset/iris/5769709576_260b3811b6_c.jpg differ diff --git a/src/dataset/iris/5776464747_0bd4116312_c.jpg b/src/dataset/iris/5776464747_0bd4116312_c.jpg new file mode 100644 index 00000000..99aa6f8a Binary files /dev/null and b/src/dataset/iris/5776464747_0bd4116312_c.jpg differ diff --git a/src/dataset/iris/5785758269_e5a84d1229_c.jpg b/src/dataset/iris/5785758269_e5a84d1229_c.jpg new file mode 100644 index 00000000..ffd18a19 Binary files /dev/null and b/src/dataset/iris/5785758269_e5a84d1229_c.jpg differ diff --git a/src/dataset/iris/5787620698_aa62edf555_c.jpg b/src/dataset/iris/5787620698_aa62edf555_c.jpg new file mode 100644 index 00000000..95ffd829 Binary files /dev/null and b/src/dataset/iris/5787620698_aa62edf555_c.jpg differ diff --git a/src/dataset/iris/5791452511_2d975d09e3_c.jpg b/src/dataset/iris/5791452511_2d975d09e3_c.jpg new file mode 100644 index 00000000..e8b85deb Binary files /dev/null and b/src/dataset/iris/5791452511_2d975d09e3_c.jpg differ diff --git a/src/dataset/iris/5795289322_73c261597e_c.jpg b/src/dataset/iris/5795289322_73c261597e_c.jpg new file mode 100644 index 00000000..1eb5491e Binary files /dev/null and b/src/dataset/iris/5795289322_73c261597e_c.jpg differ diff --git a/src/dataset/iris/5796441954_dc7a7474dc_c.jpg b/src/dataset/iris/5796441954_dc7a7474dc_c.jpg new file mode 100644 index 00000000..5792618d Binary files /dev/null and b/src/dataset/iris/5796441954_dc7a7474dc_c.jpg differ diff --git a/src/dataset/iris/5798420631_9fa111ca16_c.jpg b/src/dataset/iris/5798420631_9fa111ca16_c.jpg new file mode 100644 index 00000000..5451f023 Binary files /dev/null and b/src/dataset/iris/5798420631_9fa111ca16_c.jpg differ diff --git a/src/dataset/iris/5798940778_4c81ab7c5a_c.jpg b/src/dataset/iris/5798940778_4c81ab7c5a_c.jpg new file mode 100644 index 00000000..733b72e7 Binary files /dev/null and b/src/dataset/iris/5798940778_4c81ab7c5a_c.jpg differ diff --git a/src/dataset/iris/5802328285_ac0633dc44_c.jpg b/src/dataset/iris/5802328285_ac0633dc44_c.jpg new file mode 100644 index 00000000..f5a06a49 Binary files /dev/null and b/src/dataset/iris/5802328285_ac0633dc44_c.jpg differ diff --git a/src/dataset/iris/5802328865_74231e6e3d_c.jpg b/src/dataset/iris/5802328865_74231e6e3d_c.jpg new file mode 100644 index 00000000..aa6f92e2 Binary files /dev/null and b/src/dataset/iris/5802328865_74231e6e3d_c.jpg differ diff --git a/src/dataset/iris/5809930456_3b58a48cbb_c.jpg b/src/dataset/iris/5809930456_3b58a48cbb_c.jpg new file mode 100644 index 00000000..5fc509af Binary files /dev/null and b/src/dataset/iris/5809930456_3b58a48cbb_c.jpg differ diff --git a/src/dataset/iris/5812461289_1190ec1dc6_c.jpg b/src/dataset/iris/5812461289_1190ec1dc6_c.jpg new file mode 100644 index 00000000..d142b439 Binary files /dev/null and b/src/dataset/iris/5812461289_1190ec1dc6_c.jpg differ diff --git a/src/dataset/iris/5812466593_7908b064e5_c.jpg b/src/dataset/iris/5812466593_7908b064e5_c.jpg new file mode 100644 index 00000000..c717e946 Binary files /dev/null and b/src/dataset/iris/5812466593_7908b064e5_c.jpg differ diff --git a/src/dataset/iris/5820990772_b9249a8a82_c.jpg b/src/dataset/iris/5820990772_b9249a8a82_c.jpg new file mode 100644 index 00000000..04c4511e Binary files /dev/null and b/src/dataset/iris/5820990772_b9249a8a82_c.jpg differ diff --git a/src/dataset/iris/5822035090_846d21f4ab_c.jpg b/src/dataset/iris/5822035090_846d21f4ab_c.jpg new file mode 100644 index 00000000..ea2b6f2d Binary files /dev/null and b/src/dataset/iris/5822035090_846d21f4ab_c.jpg differ diff --git a/src/dataset/iris/5824026838_35dd6811d0_c.jpg b/src/dataset/iris/5824026838_35dd6811d0_c.jpg new file mode 100644 index 00000000..6fdf576d Binary files /dev/null and b/src/dataset/iris/5824026838_35dd6811d0_c.jpg differ diff --git a/src/dataset/iris/582546284_3c29620183_c.jpg b/src/dataset/iris/582546284_3c29620183_c.jpg new file mode 100644 index 00000000..db2b1997 Binary files /dev/null and b/src/dataset/iris/582546284_3c29620183_c.jpg differ diff --git a/src/dataset/iris/5829381519_6cd22962d6_c.jpg b/src/dataset/iris/5829381519_6cd22962d6_c.jpg new file mode 100644 index 00000000..aea73b40 Binary files /dev/null and b/src/dataset/iris/5829381519_6cd22962d6_c.jpg differ diff --git a/src/dataset/iris/5831007182_e5a4973d50_c.jpg b/src/dataset/iris/5831007182_e5a4973d50_c.jpg new file mode 100644 index 00000000..d2c74d69 Binary files /dev/null and b/src/dataset/iris/5831007182_e5a4973d50_c.jpg differ diff --git a/src/dataset/iris/5831015680_f71da448e0_c.jpg b/src/dataset/iris/5831015680_f71da448e0_c.jpg new file mode 100644 index 00000000..d41b4dc1 Binary files /dev/null and b/src/dataset/iris/5831015680_f71da448e0_c.jpg differ diff --git a/src/dataset/iris/5831428650_af4994b857_c.jpg b/src/dataset/iris/5831428650_af4994b857_c.jpg new file mode 100644 index 00000000..24fc9cc9 Binary files /dev/null and b/src/dataset/iris/5831428650_af4994b857_c.jpg differ diff --git a/src/dataset/iris/5831429312_d1db584f2c_c.jpg b/src/dataset/iris/5831429312_d1db584f2c_c.jpg new file mode 100644 index 00000000..a53310e9 Binary files /dev/null and b/src/dataset/iris/5831429312_d1db584f2c_c.jpg differ diff --git a/src/dataset/iris/5835380929_7b46e1713b_c.jpg b/src/dataset/iris/5835380929_7b46e1713b_c.jpg new file mode 100644 index 00000000..321ad2b3 Binary files /dev/null and b/src/dataset/iris/5835380929_7b46e1713b_c.jpg differ diff --git a/src/dataset/iris/5857877926_5161ea2bc5_c.jpg b/src/dataset/iris/5857877926_5161ea2bc5_c.jpg new file mode 100644 index 00000000..da0bdb94 Binary files /dev/null and b/src/dataset/iris/5857877926_5161ea2bc5_c.jpg differ diff --git a/src/dataset/iris/5868021678_60a4e346d9_c.jpg b/src/dataset/iris/5868021678_60a4e346d9_c.jpg new file mode 100644 index 00000000..78d68096 Binary files /dev/null and b/src/dataset/iris/5868021678_60a4e346d9_c.jpg differ diff --git a/src/dataset/iris/5883066637_0d94c601b8_c.jpg b/src/dataset/iris/5883066637_0d94c601b8_c.jpg new file mode 100644 index 00000000..0477fc4a Binary files /dev/null and b/src/dataset/iris/5883066637_0d94c601b8_c.jpg differ diff --git a/src/dataset/iris/5895223403_55353db02b_c.jpg b/src/dataset/iris/5895223403_55353db02b_c.jpg new file mode 100644 index 00000000..b35d3a3a Binary files /dev/null and b/src/dataset/iris/5895223403_55353db02b_c.jpg differ diff --git a/src/dataset/iris/5895230723_c44fcfdd47_c.jpg b/src/dataset/iris/5895230723_c44fcfdd47_c.jpg new file mode 100644 index 00000000..9a73ca89 Binary files /dev/null and b/src/dataset/iris/5895230723_c44fcfdd47_c.jpg differ diff --git a/src/dataset/iris/5895235169_7f28a94a48_c.jpg b/src/dataset/iris/5895235169_7f28a94a48_c.jpg new file mode 100644 index 00000000..a5bb0ea4 Binary files /dev/null and b/src/dataset/iris/5895235169_7f28a94a48_c.jpg differ diff --git a/src/dataset/iris/5895240859_b1ca857aa2_c.jpg b/src/dataset/iris/5895240859_b1ca857aa2_c.jpg new file mode 100644 index 00000000..1a5ab10a Binary files /dev/null and b/src/dataset/iris/5895240859_b1ca857aa2_c.jpg differ diff --git a/src/dataset/iris/5895241971_6c6d4b4fa6_c.jpg b/src/dataset/iris/5895241971_6c6d4b4fa6_c.jpg new file mode 100644 index 00000000..85999fa0 Binary files /dev/null and b/src/dataset/iris/5895241971_6c6d4b4fa6_c.jpg differ diff --git a/src/dataset/iris/5895250089_54387eeb23_c.jpg b/src/dataset/iris/5895250089_54387eeb23_c.jpg new file mode 100644 index 00000000..0971f347 Binary files /dev/null and b/src/dataset/iris/5895250089_54387eeb23_c.jpg differ diff --git a/src/dataset/iris/5895780902_2df66dd7d0_c.jpg b/src/dataset/iris/5895780902_2df66dd7d0_c.jpg new file mode 100644 index 00000000..5f10da63 Binary files /dev/null and b/src/dataset/iris/5895780902_2df66dd7d0_c.jpg differ diff --git a/src/dataset/iris/5895790666_de28695d64_c.jpg b/src/dataset/iris/5895790666_de28695d64_c.jpg new file mode 100644 index 00000000..1580f243 Binary files /dev/null and b/src/dataset/iris/5895790666_de28695d64_c.jpg differ diff --git a/src/dataset/iris/5895806494_6a39bc9d57_c.jpg b/src/dataset/iris/5895806494_6a39bc9d57_c.jpg new file mode 100644 index 00000000..3e088f32 Binary files /dev/null and b/src/dataset/iris/5895806494_6a39bc9d57_c.jpg differ diff --git a/src/dataset/iris/5895819616_c5793b2e40_c.jpg b/src/dataset/iris/5895819616_c5793b2e40_c.jpg new file mode 100644 index 00000000..e268d0e7 Binary files /dev/null and b/src/dataset/iris/5895819616_c5793b2e40_c.jpg differ diff --git a/src/dataset/iris/5895820670_07f7049997_c.jpg b/src/dataset/iris/5895820670_07f7049997_c.jpg new file mode 100644 index 00000000..bfcaf358 Binary files /dev/null and b/src/dataset/iris/5895820670_07f7049997_c.jpg differ diff --git a/src/dataset/iris/5895822074_2b185daec8_c.jpg b/src/dataset/iris/5895822074_2b185daec8_c.jpg new file mode 100644 index 00000000..43e13cda Binary files /dev/null and b/src/dataset/iris/5895822074_2b185daec8_c.jpg differ diff --git a/src/dataset/iris/5895829008_a6020ba5ee_c.jpg b/src/dataset/iris/5895829008_a6020ba5ee_c.jpg new file mode 100644 index 00000000..49c3492e Binary files /dev/null and b/src/dataset/iris/5895829008_a6020ba5ee_c.jpg differ diff --git a/src/dataset/iris/5896927616_2b32f2b44d_c.jpg b/src/dataset/iris/5896927616_2b32f2b44d_c.jpg new file mode 100644 index 00000000..7094ca71 Binary files /dev/null and b/src/dataset/iris/5896927616_2b32f2b44d_c.jpg differ diff --git a/src/dataset/iris/5914539765_9fff823a10_c.jpg b/src/dataset/iris/5914539765_9fff823a10_c.jpg new file mode 100644 index 00000000..6dc57528 Binary files /dev/null and b/src/dataset/iris/5914539765_9fff823a10_c.jpg differ diff --git a/src/dataset/iris/5926833957_cab3632e37_c.jpg b/src/dataset/iris/5926833957_cab3632e37_c.jpg new file mode 100644 index 00000000..6aae893a Binary files /dev/null and b/src/dataset/iris/5926833957_cab3632e37_c.jpg differ diff --git a/src/dataset/iris/5955080718_1b15ae1f07_c.jpg b/src/dataset/iris/5955080718_1b15ae1f07_c.jpg new file mode 100644 index 00000000..8d781e57 Binary files /dev/null and b/src/dataset/iris/5955080718_1b15ae1f07_c.jpg differ diff --git a/src/dataset/iris/6006285896_874681d712_c.jpg b/src/dataset/iris/6006285896_874681d712_c.jpg new file mode 100644 index 00000000..61839d57 Binary files /dev/null and b/src/dataset/iris/6006285896_874681d712_c.jpg differ diff --git a/src/dataset/iris/6019129436_2e22b1fecf_c.jpg b/src/dataset/iris/6019129436_2e22b1fecf_c.jpg new file mode 100644 index 00000000..8c8352f1 Binary files /dev/null and b/src/dataset/iris/6019129436_2e22b1fecf_c.jpg differ diff --git a/src/dataset/iris/606507757_0c8478f295_c.jpg b/src/dataset/iris/606507757_0c8478f295_c.jpg new file mode 100644 index 00000000..da28923d Binary files /dev/null and b/src/dataset/iris/606507757_0c8478f295_c.jpg differ diff --git a/src/dataset/iris/606508017_d5080c8eed_c.jpg b/src/dataset/iris/606508017_d5080c8eed_c.jpg new file mode 100644 index 00000000..4aeacc59 Binary files /dev/null and b/src/dataset/iris/606508017_d5080c8eed_c.jpg differ diff --git a/src/dataset/iris/6123879050_bcb02d79ca_c.jpg b/src/dataset/iris/6123879050_bcb02d79ca_c.jpg new file mode 100644 index 00000000..ec7875fb Binary files /dev/null and b/src/dataset/iris/6123879050_bcb02d79ca_c.jpg differ diff --git a/src/dataset/iris/6123879320_aac57f9b34_c.jpg b/src/dataset/iris/6123879320_aac57f9b34_c.jpg new file mode 100644 index 00000000..a731ef55 Binary files /dev/null and b/src/dataset/iris/6123879320_aac57f9b34_c.jpg differ diff --git a/src/dataset/iris/6123879856_1e7a9870f1_c.jpg b/src/dataset/iris/6123879856_1e7a9870f1_c.jpg new file mode 100644 index 00000000..9c66f710 Binary files /dev/null and b/src/dataset/iris/6123879856_1e7a9870f1_c.jpg differ diff --git a/src/dataset/iris/6147539839_38de301848_c.jpg b/src/dataset/iris/6147539839_38de301848_c.jpg new file mode 100644 index 00000000..732df67e Binary files /dev/null and b/src/dataset/iris/6147539839_38de301848_c.jpg differ diff --git a/src/dataset/iris/6170755060_56d994c11c_c.jpg b/src/dataset/iris/6170755060_56d994c11c_c.jpg new file mode 100644 index 00000000..7704669f Binary files /dev/null and b/src/dataset/iris/6170755060_56d994c11c_c.jpg differ diff --git a/src/dataset/iris/624356933_8ceb4ca095_c.jpg b/src/dataset/iris/624356933_8ceb4ca095_c.jpg new file mode 100644 index 00000000..2686d0e1 Binary files /dev/null and b/src/dataset/iris/624356933_8ceb4ca095_c.jpg differ diff --git a/src/dataset/iris/6261601348_8b44e10d9d_c.jpg b/src/dataset/iris/6261601348_8b44e10d9d_c.jpg new file mode 100644 index 00000000..c21a4291 Binary files /dev/null and b/src/dataset/iris/6261601348_8b44e10d9d_c.jpg differ diff --git a/src/dataset/iris/629081105_9c6a37e80f_c.jpg b/src/dataset/iris/629081105_9c6a37e80f_c.jpg new file mode 100644 index 00000000..ef8ec883 Binary files /dev/null and b/src/dataset/iris/629081105_9c6a37e80f_c.jpg differ diff --git a/src/dataset/iris/6294114652_8dcd69d2cb_c.jpg b/src/dataset/iris/6294114652_8dcd69d2cb_c.jpg new file mode 100644 index 00000000..371a6498 Binary files /dev/null and b/src/dataset/iris/6294114652_8dcd69d2cb_c.jpg differ diff --git a/src/dataset/iris/6333356161_971fc5a413_c.jpg b/src/dataset/iris/6333356161_971fc5a413_c.jpg new file mode 100644 index 00000000..9c7d3fcd Binary files /dev/null and b/src/dataset/iris/6333356161_971fc5a413_c.jpg differ diff --git a/src/dataset/iris/6336045269_48c92efc66_c.jpg b/src/dataset/iris/6336045269_48c92efc66_c.jpg new file mode 100644 index 00000000..741c0446 Binary files /dev/null and b/src/dataset/iris/6336045269_48c92efc66_c.jpg differ diff --git a/src/dataset/iris/6336799564_559502f38a_c.jpg b/src/dataset/iris/6336799564_559502f38a_c.jpg new file mode 100644 index 00000000..1d01e780 Binary files /dev/null and b/src/dataset/iris/6336799564_559502f38a_c.jpg differ diff --git a/src/dataset/iris/6337451594_8864f11c8b_c.jpg b/src/dataset/iris/6337451594_8864f11c8b_c.jpg new file mode 100644 index 00000000..06c08f4f Binary files /dev/null and b/src/dataset/iris/6337451594_8864f11c8b_c.jpg differ diff --git a/src/dataset/iris/6346696751_51bfc99dd4_c.jpg b/src/dataset/iris/6346696751_51bfc99dd4_c.jpg new file mode 100644 index 00000000..a8357420 Binary files /dev/null and b/src/dataset/iris/6346696751_51bfc99dd4_c.jpg differ diff --git a/src/dataset/iris/6352558119_72019e5dda_c.jpg b/src/dataset/iris/6352558119_72019e5dda_c.jpg new file mode 100644 index 00000000..d81812e2 Binary files /dev/null and b/src/dataset/iris/6352558119_72019e5dda_c.jpg differ diff --git a/src/dataset/iris/6390405295_5e2e604843_c.jpg b/src/dataset/iris/6390405295_5e2e604843_c.jpg new file mode 100644 index 00000000..e1e25548 Binary files /dev/null and b/src/dataset/iris/6390405295_5e2e604843_c.jpg differ diff --git a/src/dataset/iris/648158777_9908c191d2_c.jpg b/src/dataset/iris/648158777_9908c191d2_c.jpg new file mode 100644 index 00000000..c7c2aa9d Binary files /dev/null and b/src/dataset/iris/648158777_9908c191d2_c.jpg differ diff --git a/src/dataset/iris/648707598_d5c5d94b70_c.jpg b/src/dataset/iris/648707598_d5c5d94b70_c.jpg new file mode 100644 index 00000000..f531f474 Binary files /dev/null and b/src/dataset/iris/648707598_d5c5d94b70_c.jpg differ diff --git a/src/dataset/iris/649728406_97646d0139_c.jpg b/src/dataset/iris/649728406_97646d0139_c.jpg new file mode 100644 index 00000000..c04777de Binary files /dev/null and b/src/dataset/iris/649728406_97646d0139_c.jpg differ diff --git a/src/dataset/iris/649728482_e1075fe91b_c.jpg b/src/dataset/iris/649728482_e1075fe91b_c.jpg new file mode 100644 index 00000000..c04777de Binary files /dev/null and b/src/dataset/iris/649728482_e1075fe91b_c.jpg differ diff --git a/src/dataset/iris/649863652_b9796f49b6_c.jpg b/src/dataset/iris/649863652_b9796f49b6_c.jpg new file mode 100644 index 00000000..aa3df7b6 Binary files /dev/null and b/src/dataset/iris/649863652_b9796f49b6_c.jpg differ diff --git a/src/dataset/iris/654431565_0ebf676ee4_c.jpg b/src/dataset/iris/654431565_0ebf676ee4_c.jpg new file mode 100644 index 00000000..d212c80f Binary files /dev/null and b/src/dataset/iris/654431565_0ebf676ee4_c.jpg differ diff --git a/src/dataset/iris/6601163897_42e1d6f2d2_c.jpg b/src/dataset/iris/6601163897_42e1d6f2d2_c.jpg new file mode 100644 index 00000000..4085de5b Binary files /dev/null and b/src/dataset/iris/6601163897_42e1d6f2d2_c.jpg differ diff --git a/src/dataset/iris/6635895897_13e19b4ce6_c.jpg b/src/dataset/iris/6635895897_13e19b4ce6_c.jpg new file mode 100644 index 00000000..b1aec1bc Binary files /dev/null and b/src/dataset/iris/6635895897_13e19b4ce6_c.jpg differ diff --git a/src/dataset/iris/6743251579_af67627afa_c.jpg b/src/dataset/iris/6743251579_af67627afa_c.jpg new file mode 100644 index 00000000..2c987c38 Binary files /dev/null and b/src/dataset/iris/6743251579_af67627afa_c.jpg differ diff --git a/src/dataset/iris/6771404405_6fcac9c67a_c.jpg b/src/dataset/iris/6771404405_6fcac9c67a_c.jpg new file mode 100644 index 00000000..d155130c Binary files /dev/null and b/src/dataset/iris/6771404405_6fcac9c67a_c.jpg differ diff --git a/src/dataset/iris/6780689299_47aca832bf_c.jpg b/src/dataset/iris/6780689299_47aca832bf_c.jpg new file mode 100644 index 00000000..56011d6e Binary files /dev/null and b/src/dataset/iris/6780689299_47aca832bf_c.jpg differ diff --git a/src/dataset/iris/6821741754_d7ed47db7b_c.jpg b/src/dataset/iris/6821741754_d7ed47db7b_c.jpg new file mode 100644 index 00000000..1b75bfa4 Binary files /dev/null and b/src/dataset/iris/6821741754_d7ed47db7b_c.jpg differ diff --git a/src/dataset/iris/6893696190_70a8f5b666_c.jpg b/src/dataset/iris/6893696190_70a8f5b666_c.jpg new file mode 100644 index 00000000..eb5fc063 Binary files /dev/null and b/src/dataset/iris/6893696190_70a8f5b666_c.jpg differ diff --git a/src/dataset/iris/6901232472_681f355085_c.jpg b/src/dataset/iris/6901232472_681f355085_c.jpg new file mode 100644 index 00000000..9fb46fa9 Binary files /dev/null and b/src/dataset/iris/6901232472_681f355085_c.jpg differ diff --git a/src/dataset/iris/6902612309_c4da549ccf_c.jpg b/src/dataset/iris/6902612309_c4da549ccf_c.jpg new file mode 100644 index 00000000..a8e1334e Binary files /dev/null and b/src/dataset/iris/6902612309_c4da549ccf_c.jpg differ diff --git a/src/dataset/iris/6919797204_af119d4240_c.jpg b/src/dataset/iris/6919797204_af119d4240_c.jpg new file mode 100644 index 00000000..e8cfa70f Binary files /dev/null and b/src/dataset/iris/6919797204_af119d4240_c.jpg differ diff --git a/src/dataset/iris/6922317708_c3e3dc51ba_c.jpg b/src/dataset/iris/6922317708_c3e3dc51ba_c.jpg new file mode 100644 index 00000000..c80b4ff5 Binary files /dev/null and b/src/dataset/iris/6922317708_c3e3dc51ba_c.jpg differ diff --git a/src/dataset/iris/6933825324_380cd6505f_c.jpg b/src/dataset/iris/6933825324_380cd6505f_c.jpg new file mode 100644 index 00000000..88909c9a Binary files /dev/null and b/src/dataset/iris/6933825324_380cd6505f_c.jpg differ diff --git a/src/dataset/iris/6947392626_ee08abb28a_c.jpg b/src/dataset/iris/6947392626_ee08abb28a_c.jpg new file mode 100644 index 00000000..52c7454c Binary files /dev/null and b/src/dataset/iris/6947392626_ee08abb28a_c.jpg differ diff --git a/src/dataset/iris/6967643982_66600bdfcf_c.jpg b/src/dataset/iris/6967643982_66600bdfcf_c.jpg new file mode 100644 index 00000000..4618e8fa Binary files /dev/null and b/src/dataset/iris/6967643982_66600bdfcf_c.jpg differ diff --git a/src/dataset/iris/6975375550_a70f118c08_c.jpg b/src/dataset/iris/6975375550_a70f118c08_c.jpg new file mode 100644 index 00000000..f8df7659 Binary files /dev/null and b/src/dataset/iris/6975375550_a70f118c08_c.jpg differ diff --git a/src/dataset/iris/6981037424_5180e59d2e_c.jpg b/src/dataset/iris/6981037424_5180e59d2e_c.jpg new file mode 100644 index 00000000..46cbc418 Binary files /dev/null and b/src/dataset/iris/6981037424_5180e59d2e_c.jpg differ diff --git a/src/dataset/iris/6993810216_731bf9bc98_c.jpg b/src/dataset/iris/6993810216_731bf9bc98_c.jpg new file mode 100644 index 00000000..556375cf Binary files /dev/null and b/src/dataset/iris/6993810216_731bf9bc98_c.jpg differ diff --git a/src/dataset/iris/7001091103_52bf7ff013_c.jpg b/src/dataset/iris/7001091103_52bf7ff013_c.jpg new file mode 100644 index 00000000..1a68cf5b Binary files /dev/null and b/src/dataset/iris/7001091103_52bf7ff013_c.jpg differ diff --git a/src/dataset/iris/7001095281_2132f44b51_c.jpg b/src/dataset/iris/7001095281_2132f44b51_c.jpg new file mode 100644 index 00000000..c699f137 Binary files /dev/null and b/src/dataset/iris/7001095281_2132f44b51_c.jpg differ diff --git a/src/dataset/iris/7004627313_216fcd9b22_c.jpg b/src/dataset/iris/7004627313_216fcd9b22_c.jpg new file mode 100644 index 00000000..a0b40d02 Binary files /dev/null and b/src/dataset/iris/7004627313_216fcd9b22_c.jpg differ diff --git a/src/dataset/iris/7040779869_7c06b55892_c.jpg b/src/dataset/iris/7040779869_7c06b55892_c.jpg new file mode 100644 index 00000000..c0e394e5 Binary files /dev/null and b/src/dataset/iris/7040779869_7c06b55892_c.jpg differ diff --git a/src/dataset/iris/7089364811_1870a8df13_c.jpg b/src/dataset/iris/7089364811_1870a8df13_c.jpg new file mode 100644 index 00000000..45432d2c Binary files /dev/null and b/src/dataset/iris/7089364811_1870a8df13_c.jpg differ diff --git a/src/dataset/iris/7097465915_bf0035fd3e_c.jpg b/src/dataset/iris/7097465915_bf0035fd3e_c.jpg new file mode 100644 index 00000000..c12337b7 Binary files /dev/null and b/src/dataset/iris/7097465915_bf0035fd3e_c.jpg differ diff --git a/src/dataset/iris/7108410923_da41fd9de8_c.jpg b/src/dataset/iris/7108410923_da41fd9de8_c.jpg new file mode 100644 index 00000000..5dc347c9 Binary files /dev/null and b/src/dataset/iris/7108410923_da41fd9de8_c.jpg differ diff --git a/src/dataset/iris/7133834591_6ff85e1aa6_c.jpg b/src/dataset/iris/7133834591_6ff85e1aa6_c.jpg new file mode 100644 index 00000000..79497b15 Binary files /dev/null and b/src/dataset/iris/7133834591_6ff85e1aa6_c.jpg differ diff --git a/src/dataset/iris/7139897925_28dbf62ce9_c.jpg b/src/dataset/iris/7139897925_28dbf62ce9_c.jpg new file mode 100644 index 00000000..4a62ee8d Binary files /dev/null and b/src/dataset/iris/7139897925_28dbf62ce9_c.jpg differ diff --git a/src/dataset/iris/7145207685_b32537b561_c.jpg b/src/dataset/iris/7145207685_b32537b561_c.jpg new file mode 100644 index 00000000..f2badcb2 Binary files /dev/null and b/src/dataset/iris/7145207685_b32537b561_c.jpg differ diff --git a/src/dataset/iris/7157338445_758bc0c163_c.jpg b/src/dataset/iris/7157338445_758bc0c163_c.jpg new file mode 100644 index 00000000..a75ff104 Binary files /dev/null and b/src/dataset/iris/7157338445_758bc0c163_c.jpg differ diff --git a/src/dataset/iris/7157338791_5b3d4e44d6_c.jpg b/src/dataset/iris/7157338791_5b3d4e44d6_c.jpg new file mode 100644 index 00000000..8ae56432 Binary files /dev/null and b/src/dataset/iris/7157338791_5b3d4e44d6_c.jpg differ diff --git a/src/dataset/iris/7161580448_928f6fc8c4_c.jpg b/src/dataset/iris/7161580448_928f6fc8c4_c.jpg new file mode 100644 index 00000000..df35a6bf Binary files /dev/null and b/src/dataset/iris/7161580448_928f6fc8c4_c.jpg differ diff --git a/src/dataset/iris/7166593684_10be515ab0_c.jpg b/src/dataset/iris/7166593684_10be515ab0_c.jpg new file mode 100644 index 00000000..33fc123a Binary files /dev/null and b/src/dataset/iris/7166593684_10be515ab0_c.jpg differ diff --git a/src/dataset/iris/7166767907_2385a5425f_c.jpg b/src/dataset/iris/7166767907_2385a5425f_c.jpg new file mode 100644 index 00000000..a3b01449 Binary files /dev/null and b/src/dataset/iris/7166767907_2385a5425f_c.jpg differ diff --git a/src/dataset/iris/7169564395_10de07c607_c.jpg b/src/dataset/iris/7169564395_10de07c607_c.jpg new file mode 100644 index 00000000..2132446f Binary files /dev/null and b/src/dataset/iris/7169564395_10de07c607_c.jpg differ diff --git a/src/dataset/iris/7171663917_22aef225ba_c.jpg b/src/dataset/iris/7171663917_22aef225ba_c.jpg new file mode 100644 index 00000000..6b55c8ff Binary files /dev/null and b/src/dataset/iris/7171663917_22aef225ba_c.jpg differ diff --git a/src/dataset/iris/71766650_e2d423bea7_c.jpg b/src/dataset/iris/71766650_e2d423bea7_c.jpg new file mode 100644 index 00000000..5eb2a794 Binary files /dev/null and b/src/dataset/iris/71766650_e2d423bea7_c.jpg differ diff --git a/src/dataset/iris/7180468270_58fc71d3ed_c.jpg b/src/dataset/iris/7180468270_58fc71d3ed_c.jpg new file mode 100644 index 00000000..05804459 Binary files /dev/null and b/src/dataset/iris/7180468270_58fc71d3ed_c.jpg differ diff --git a/src/dataset/iris/7183449485_e5d607e896_c.jpg b/src/dataset/iris/7183449485_e5d607e896_c.jpg new file mode 100644 index 00000000..8d8be4f0 Binary files /dev/null and b/src/dataset/iris/7183449485_e5d607e896_c.jpg differ diff --git a/src/dataset/iris/7184276730_df3d1da2ee_c.jpg b/src/dataset/iris/7184276730_df3d1da2ee_c.jpg new file mode 100644 index 00000000..fca40a0e Binary files /dev/null and b/src/dataset/iris/7184276730_df3d1da2ee_c.jpg differ diff --git a/src/dataset/iris/7189356056_e7382442e6_c.jpg b/src/dataset/iris/7189356056_e7382442e6_c.jpg new file mode 100644 index 00000000..b368e229 Binary files /dev/null and b/src/dataset/iris/7189356056_e7382442e6_c.jpg differ diff --git a/src/dataset/iris/7195048260_5621f5d664_c.jpg b/src/dataset/iris/7195048260_5621f5d664_c.jpg new file mode 100644 index 00000000..8660ffea Binary files /dev/null and b/src/dataset/iris/7195048260_5621f5d664_c.jpg differ diff --git a/src/dataset/iris/7209216098_3a01e4850f_c.jpg b/src/dataset/iris/7209216098_3a01e4850f_c.jpg new file mode 100644 index 00000000..cbf4b3bc Binary files /dev/null and b/src/dataset/iris/7209216098_3a01e4850f_c.jpg differ diff --git a/src/dataset/iris/7213483636_5faf811b64_c.jpg b/src/dataset/iris/7213483636_5faf811b64_c.jpg new file mode 100644 index 00000000..65da165f Binary files /dev/null and b/src/dataset/iris/7213483636_5faf811b64_c.jpg differ diff --git a/src/dataset/iris/7217839680_f7f5a650c0_c.jpg b/src/dataset/iris/7217839680_f7f5a650c0_c.jpg new file mode 100644 index 00000000..ca56bdb8 Binary files /dev/null and b/src/dataset/iris/7217839680_f7f5a650c0_c.jpg differ diff --git a/src/dataset/iris/7234894500_d9e200f8f9_c.jpg b/src/dataset/iris/7234894500_d9e200f8f9_c.jpg new file mode 100644 index 00000000..de38f655 Binary files /dev/null and b/src/dataset/iris/7234894500_d9e200f8f9_c.jpg differ diff --git a/src/dataset/iris/7246067500_8a00635d51_c.jpg b/src/dataset/iris/7246067500_8a00635d51_c.jpg new file mode 100644 index 00000000..552f3bfc Binary files /dev/null and b/src/dataset/iris/7246067500_8a00635d51_c.jpg differ diff --git a/src/dataset/iris/7252883280_26e37559a3_c.jpg b/src/dataset/iris/7252883280_26e37559a3_c.jpg new file mode 100644 index 00000000..b0df0878 Binary files /dev/null and b/src/dataset/iris/7252883280_26e37559a3_c.jpg differ diff --git a/src/dataset/iris/7254220726_0e74702f1f_c.jpg b/src/dataset/iris/7254220726_0e74702f1f_c.jpg new file mode 100644 index 00000000..b1209877 Binary files /dev/null and b/src/dataset/iris/7254220726_0e74702f1f_c.jpg differ diff --git a/src/dataset/iris/7254221026_c270440159_c.jpg b/src/dataset/iris/7254221026_c270440159_c.jpg new file mode 100644 index 00000000..e34922ae Binary files /dev/null and b/src/dataset/iris/7254221026_c270440159_c.jpg differ diff --git a/src/dataset/iris/7256636968_d9540830a5_c.jpg b/src/dataset/iris/7256636968_d9540830a5_c.jpg new file mode 100644 index 00000000..620bccab Binary files /dev/null and b/src/dataset/iris/7256636968_d9540830a5_c.jpg differ diff --git a/src/dataset/iris/7257154502_58caf10787_c.jpg b/src/dataset/iris/7257154502_58caf10787_c.jpg new file mode 100644 index 00000000..2fa41ad2 Binary files /dev/null and b/src/dataset/iris/7257154502_58caf10787_c.jpg differ diff --git a/src/dataset/iris/7262699106_f628243ec7_c.jpg b/src/dataset/iris/7262699106_f628243ec7_c.jpg new file mode 100644 index 00000000..dd496494 Binary files /dev/null and b/src/dataset/iris/7262699106_f628243ec7_c.jpg differ diff --git a/src/dataset/iris/7265022286_bdcbf5bf34_c.jpg b/src/dataset/iris/7265022286_bdcbf5bf34_c.jpg new file mode 100644 index 00000000..48c168d7 Binary files /dev/null and b/src/dataset/iris/7265022286_bdcbf5bf34_c.jpg differ diff --git a/src/dataset/iris/7273314098_ed8fd349ed_c.jpg b/src/dataset/iris/7273314098_ed8fd349ed_c.jpg new file mode 100644 index 00000000..57b49d1a Binary files /dev/null and b/src/dataset/iris/7273314098_ed8fd349ed_c.jpg differ diff --git a/src/dataset/iris/727402711_5c30e4d058_c.jpg b/src/dataset/iris/727402711_5c30e4d058_c.jpg new file mode 100644 index 00000000..237dcc68 Binary files /dev/null and b/src/dataset/iris/727402711_5c30e4d058_c.jpg differ diff --git a/src/dataset/iris/727409677_af8d0aae7a_c.jpg b/src/dataset/iris/727409677_af8d0aae7a_c.jpg new file mode 100644 index 00000000..c704a776 Binary files /dev/null and b/src/dataset/iris/727409677_af8d0aae7a_c.jpg differ diff --git a/src/dataset/iris/7281346290_5438d098ff_c.jpg b/src/dataset/iris/7281346290_5438d098ff_c.jpg new file mode 100644 index 00000000..aba1a692 Binary files /dev/null and b/src/dataset/iris/7281346290_5438d098ff_c.jpg differ diff --git a/src/dataset/iris/7284520346_2c06632270_c.jpg b/src/dataset/iris/7284520346_2c06632270_c.jpg new file mode 100644 index 00000000..c378ad60 Binary files /dev/null and b/src/dataset/iris/7284520346_2c06632270_c.jpg differ diff --git a/src/dataset/iris/7303049608_1f24dd37e0_c.jpg b/src/dataset/iris/7303049608_1f24dd37e0_c.jpg new file mode 100644 index 00000000..6ff08847 Binary files /dev/null and b/src/dataset/iris/7303049608_1f24dd37e0_c.jpg differ diff --git a/src/dataset/iris/7305617744_b00591e72d_c.jpg b/src/dataset/iris/7305617744_b00591e72d_c.jpg new file mode 100644 index 00000000..1599de10 Binary files /dev/null and b/src/dataset/iris/7305617744_b00591e72d_c.jpg differ diff --git a/src/dataset/iris/7309948452_40084f3c0c_c.jpg b/src/dataset/iris/7309948452_40084f3c0c_c.jpg new file mode 100644 index 00000000..49bc6185 Binary files /dev/null and b/src/dataset/iris/7309948452_40084f3c0c_c.jpg differ diff --git a/src/dataset/iris/7313474410_1ff63fd762_c.jpg b/src/dataset/iris/7313474410_1ff63fd762_c.jpg new file mode 100644 index 00000000..e2a65bce Binary files /dev/null and b/src/dataset/iris/7313474410_1ff63fd762_c.jpg differ diff --git a/src/dataset/iris/7314139288_b53a716040_c.jpg b/src/dataset/iris/7314139288_b53a716040_c.jpg new file mode 100644 index 00000000..7979353a Binary files /dev/null and b/src/dataset/iris/7314139288_b53a716040_c.jpg differ diff --git a/src/dataset/iris/7328038384_1073e59c62_c.jpg b/src/dataset/iris/7328038384_1073e59c62_c.jpg new file mode 100644 index 00000000..d46b80ce Binary files /dev/null and b/src/dataset/iris/7328038384_1073e59c62_c.jpg differ diff --git a/src/dataset/iris/7329032764_6b31fc3b5e_c.jpg b/src/dataset/iris/7329032764_6b31fc3b5e_c.jpg new file mode 100644 index 00000000..0918b516 Binary files /dev/null and b/src/dataset/iris/7329032764_6b31fc3b5e_c.jpg differ diff --git a/src/dataset/iris/7346394538_4584967fa3_c.jpg b/src/dataset/iris/7346394538_4584967fa3_c.jpg new file mode 100644 index 00000000..d3f388d0 Binary files /dev/null and b/src/dataset/iris/7346394538_4584967fa3_c.jpg differ diff --git a/src/dataset/iris/7354770108_0249dafd69_c.jpg b/src/dataset/iris/7354770108_0249dafd69_c.jpg new file mode 100644 index 00000000..aa396c8e Binary files /dev/null and b/src/dataset/iris/7354770108_0249dafd69_c.jpg differ diff --git a/src/dataset/iris/7354770488_e4668e35ff_c.jpg b/src/dataset/iris/7354770488_e4668e35ff_c.jpg new file mode 100644 index 00000000..1377cc0a Binary files /dev/null and b/src/dataset/iris/7354770488_e4668e35ff_c.jpg differ diff --git a/src/dataset/iris/7359674388_def70d6cf4_c.jpg b/src/dataset/iris/7359674388_def70d6cf4_c.jpg new file mode 100644 index 00000000..3a8ab92a Binary files /dev/null and b/src/dataset/iris/7359674388_def70d6cf4_c.jpg differ diff --git a/src/dataset/iris/7370207158_a2d482de5c_c.jpg b/src/dataset/iris/7370207158_a2d482de5c_c.jpg new file mode 100644 index 00000000..69a80030 Binary files /dev/null and b/src/dataset/iris/7370207158_a2d482de5c_c.jpg differ diff --git a/src/dataset/iris/7394746994_bfc67e1deb_c.jpg b/src/dataset/iris/7394746994_bfc67e1deb_c.jpg new file mode 100644 index 00000000..de224367 Binary files /dev/null and b/src/dataset/iris/7394746994_bfc67e1deb_c.jpg differ diff --git a/src/dataset/iris/7400107912_85ba4feccd_c.jpg b/src/dataset/iris/7400107912_85ba4feccd_c.jpg new file mode 100644 index 00000000..7c7a7e4b Binary files /dev/null and b/src/dataset/iris/7400107912_85ba4feccd_c.jpg differ diff --git a/src/dataset/iris/7402194956_ee490c596a_c.jpg b/src/dataset/iris/7402194956_ee490c596a_c.jpg new file mode 100644 index 00000000..bd3edfd6 Binary files /dev/null and b/src/dataset/iris/7402194956_ee490c596a_c.jpg differ diff --git a/src/dataset/iris/7423671496_9399a7cc6d_c.jpg b/src/dataset/iris/7423671496_9399a7cc6d_c.jpg new file mode 100644 index 00000000..ee9059f9 Binary files /dev/null and b/src/dataset/iris/7423671496_9399a7cc6d_c.jpg differ diff --git a/src/dataset/iris/754347695_bb952ab373_c.jpg b/src/dataset/iris/754347695_bb952ab373_c.jpg new file mode 100644 index 00000000..de37c1cb Binary files /dev/null and b/src/dataset/iris/754347695_bb952ab373_c.jpg differ diff --git a/src/dataset/iris/755273356_fad5f70dcc_c.jpg b/src/dataset/iris/755273356_fad5f70dcc_c.jpg new file mode 100644 index 00000000..d38f6bfb Binary files /dev/null and b/src/dataset/iris/755273356_fad5f70dcc_c.jpg differ diff --git a/src/dataset/iris/7631383584_b098b62942_c.jpg b/src/dataset/iris/7631383584_b098b62942_c.jpg new file mode 100644 index 00000000..d348da1d Binary files /dev/null and b/src/dataset/iris/7631383584_b098b62942_c.jpg differ diff --git a/src/dataset/iris/7654286112_ca9dff32da_c.jpg b/src/dataset/iris/7654286112_ca9dff32da_c.jpg new file mode 100644 index 00000000..181bd8d4 Binary files /dev/null and b/src/dataset/iris/7654286112_ca9dff32da_c.jpg differ diff --git a/src/dataset/iris/7793427620_dd1f5ddbaa_c.jpg b/src/dataset/iris/7793427620_dd1f5ddbaa_c.jpg new file mode 100644 index 00000000..0f3bce42 Binary files /dev/null and b/src/dataset/iris/7793427620_dd1f5ddbaa_c.jpg differ diff --git a/src/dataset/iris/782040305_9e781a194b_c.jpg b/src/dataset/iris/782040305_9e781a194b_c.jpg new file mode 100644 index 00000000..383e87c6 Binary files /dev/null and b/src/dataset/iris/782040305_9e781a194b_c.jpg differ diff --git a/src/dataset/iris/793667886_b5f8cb6ce3_c.jpg b/src/dataset/iris/793667886_b5f8cb6ce3_c.jpg new file mode 100644 index 00000000..1731e6ef Binary files /dev/null and b/src/dataset/iris/793667886_b5f8cb6ce3_c.jpg differ diff --git a/src/dataset/iris/7967323056_f194cc7c0f_c.jpg b/src/dataset/iris/7967323056_f194cc7c0f_c.jpg new file mode 100644 index 00000000..74b34475 Binary files /dev/null and b/src/dataset/iris/7967323056_f194cc7c0f_c.jpg differ diff --git a/src/dataset/iris/8036053004_fbb4357757_c.jpg b/src/dataset/iris/8036053004_fbb4357757_c.jpg new file mode 100644 index 00000000..1e73b230 Binary files /dev/null and b/src/dataset/iris/8036053004_fbb4357757_c.jpg differ diff --git a/src/dataset/iris/8120051133_30abbb8b0c_c.jpg b/src/dataset/iris/8120051133_30abbb8b0c_c.jpg new file mode 100644 index 00000000..79eac3eb Binary files /dev/null and b/src/dataset/iris/8120051133_30abbb8b0c_c.jpg differ diff --git a/src/dataset/iris/8222413082_020a1a309d_c.jpg b/src/dataset/iris/8222413082_020a1a309d_c.jpg new file mode 100644 index 00000000..2c76721c Binary files /dev/null and b/src/dataset/iris/8222413082_020a1a309d_c.jpg differ diff --git a/src/dataset/iris/8224844639_56bec338bf_c.jpg b/src/dataset/iris/8224844639_56bec338bf_c.jpg new file mode 100644 index 00000000..98905918 Binary files /dev/null and b/src/dataset/iris/8224844639_56bec338bf_c.jpg differ diff --git a/src/dataset/iris/8346839206_e2f57942e1_c.jpg b/src/dataset/iris/8346839206_e2f57942e1_c.jpg new file mode 100644 index 00000000..704a4280 Binary files /dev/null and b/src/dataset/iris/8346839206_e2f57942e1_c.jpg differ diff --git a/src/dataset/iris/84088028_642a0fd22c_c.jpg b/src/dataset/iris/84088028_642a0fd22c_c.jpg new file mode 100644 index 00000000..3e06b2cb Binary files /dev/null and b/src/dataset/iris/84088028_642a0fd22c_c.jpg differ diff --git a/src/dataset/iris/8467855561_04bfdbfd00_c.jpg b/src/dataset/iris/8467855561_04bfdbfd00_c.jpg new file mode 100644 index 00000000..0b6f8b9d Binary files /dev/null and b/src/dataset/iris/8467855561_04bfdbfd00_c.jpg differ diff --git a/src/dataset/iris/8536215032_80627e443a_c.jpg b/src/dataset/iris/8536215032_80627e443a_c.jpg new file mode 100644 index 00000000..deea03b5 Binary files /dev/null and b/src/dataset/iris/8536215032_80627e443a_c.jpg differ diff --git a/src/dataset/iris/8536215060_c08c9b285f_c.jpg b/src/dataset/iris/8536215060_c08c9b285f_c.jpg new file mode 100644 index 00000000..579bd60d Binary files /dev/null and b/src/dataset/iris/8536215060_c08c9b285f_c.jpg differ diff --git a/src/dataset/iris/8543085231_2e926e9406_c.jpg b/src/dataset/iris/8543085231_2e926e9406_c.jpg new file mode 100644 index 00000000..27393db6 Binary files /dev/null and b/src/dataset/iris/8543085231_2e926e9406_c.jpg differ diff --git a/src/dataset/iris/8608205218_0664ba54e0_c.jpg b/src/dataset/iris/8608205218_0664ba54e0_c.jpg new file mode 100644 index 00000000..26002fb1 Binary files /dev/null and b/src/dataset/iris/8608205218_0664ba54e0_c.jpg differ diff --git a/src/dataset/iris/8612888775_1e4e819a5e_c.jpg b/src/dataset/iris/8612888775_1e4e819a5e_c.jpg new file mode 100644 index 00000000..c0a0141b Binary files /dev/null and b/src/dataset/iris/8612888775_1e4e819a5e_c.jpg differ diff --git a/src/dataset/iris/8620108617_b2032e4ff6_c.jpg b/src/dataset/iris/8620108617_b2032e4ff6_c.jpg new file mode 100644 index 00000000..760e73fd Binary files /dev/null and b/src/dataset/iris/8620108617_b2032e4ff6_c.jpg differ diff --git a/src/dataset/iris/8675966174_25df9df9ef_c.jpg b/src/dataset/iris/8675966174_25df9df9ef_c.jpg new file mode 100644 index 00000000..68312c54 Binary files /dev/null and b/src/dataset/iris/8675966174_25df9df9ef_c.jpg differ diff --git a/src/dataset/iris/8690708529_1e1a05f3cc_c.jpg b/src/dataset/iris/8690708529_1e1a05f3cc_c.jpg new file mode 100644 index 00000000..7dcc770f Binary files /dev/null and b/src/dataset/iris/8690708529_1e1a05f3cc_c.jpg differ diff --git a/src/dataset/iris/8699570380_47999babb3_c.jpg b/src/dataset/iris/8699570380_47999babb3_c.jpg new file mode 100644 index 00000000..fdbe2815 Binary files /dev/null and b/src/dataset/iris/8699570380_47999babb3_c.jpg differ diff --git a/src/dataset/iris/8708396324_d029576a60_c.jpg b/src/dataset/iris/8708396324_d029576a60_c.jpg new file mode 100644 index 00000000..ef690e8c Binary files /dev/null and b/src/dataset/iris/8708396324_d029576a60_c.jpg differ diff --git a/src/dataset/iris/871055991_d0f052e4db_c.jpg b/src/dataset/iris/871055991_d0f052e4db_c.jpg new file mode 100644 index 00000000..b85b3f7b Binary files /dev/null and b/src/dataset/iris/871055991_d0f052e4db_c.jpg differ diff --git a/src/dataset/iris/8720483729_20902d6773_c.jpg b/src/dataset/iris/8720483729_20902d6773_c.jpg new file mode 100644 index 00000000..d3552365 Binary files /dev/null and b/src/dataset/iris/8720483729_20902d6773_c.jpg differ diff --git a/src/dataset/iris/8721627356_138a172b99_c.jpg b/src/dataset/iris/8721627356_138a172b99_c.jpg new file mode 100644 index 00000000..3a0ca9f9 Binary files /dev/null and b/src/dataset/iris/8721627356_138a172b99_c.jpg differ diff --git a/src/dataset/iris/8722090744_1b4e8d5002_c.jpg b/src/dataset/iris/8722090744_1b4e8d5002_c.jpg new file mode 100644 index 00000000..b99a511c Binary files /dev/null and b/src/dataset/iris/8722090744_1b4e8d5002_c.jpg differ diff --git a/src/dataset/iris/8725379838_33203c5114_c.jpg b/src/dataset/iris/8725379838_33203c5114_c.jpg new file mode 100644 index 00000000..06c51170 Binary files /dev/null and b/src/dataset/iris/8725379838_33203c5114_c.jpg differ diff --git a/src/dataset/iris/8727938668_de90802957_c.jpg b/src/dataset/iris/8727938668_de90802957_c.jpg new file mode 100644 index 00000000..6b7d4a6c Binary files /dev/null and b/src/dataset/iris/8727938668_de90802957_c.jpg differ diff --git a/src/dataset/iris/8736067090_40b6150ef7_c.jpg b/src/dataset/iris/8736067090_40b6150ef7_c.jpg new file mode 100644 index 00000000..c9321493 Binary files /dev/null and b/src/dataset/iris/8736067090_40b6150ef7_c.jpg differ diff --git a/src/dataset/iris/8751517985_450803241b_c.jpg b/src/dataset/iris/8751517985_450803241b_c.jpg new file mode 100644 index 00000000..e1c1fb31 Binary files /dev/null and b/src/dataset/iris/8751517985_450803241b_c.jpg differ diff --git a/src/dataset/iris/8752360392_c9973a2f06_c.jpg b/src/dataset/iris/8752360392_c9973a2f06_c.jpg new file mode 100644 index 00000000..d284d7f0 Binary files /dev/null and b/src/dataset/iris/8752360392_c9973a2f06_c.jpg differ diff --git a/src/dataset/iris/8752622018_5c32823d46_c.jpg b/src/dataset/iris/8752622018_5c32823d46_c.jpg new file mode 100644 index 00000000..1092d8ef Binary files /dev/null and b/src/dataset/iris/8752622018_5c32823d46_c.jpg differ diff --git a/src/dataset/iris/8753156569_390cc96923_c.jpg b/src/dataset/iris/8753156569_390cc96923_c.jpg new file mode 100644 index 00000000..45b2f202 Binary files /dev/null and b/src/dataset/iris/8753156569_390cc96923_c.jpg differ diff --git a/src/dataset/iris/8761330186_aa6df7c7b6_c.jpg b/src/dataset/iris/8761330186_aa6df7c7b6_c.jpg new file mode 100644 index 00000000..99f8faef Binary files /dev/null and b/src/dataset/iris/8761330186_aa6df7c7b6_c.jpg differ diff --git a/src/dataset/iris/8768093486_21c39ab950_c.jpg b/src/dataset/iris/8768093486_21c39ab950_c.jpg new file mode 100644 index 00000000..780b0585 Binary files /dev/null and b/src/dataset/iris/8768093486_21c39ab950_c.jpg differ diff --git a/src/dataset/iris/8772059978_47d8990193_c.jpg b/src/dataset/iris/8772059978_47d8990193_c.jpg new file mode 100644 index 00000000..a4481894 Binary files /dev/null and b/src/dataset/iris/8772059978_47d8990193_c.jpg differ diff --git a/src/dataset/iris/8778872374_c1b94a3df5_c.jpg b/src/dataset/iris/8778872374_c1b94a3df5_c.jpg new file mode 100644 index 00000000..b61ddbf7 Binary files /dev/null and b/src/dataset/iris/8778872374_c1b94a3df5_c.jpg differ diff --git a/src/dataset/iris/8835480547_4ca333ec11_c.jpg b/src/dataset/iris/8835480547_4ca333ec11_c.jpg new file mode 100644 index 00000000..987afa25 Binary files /dev/null and b/src/dataset/iris/8835480547_4ca333ec11_c.jpg differ diff --git a/src/dataset/iris/8836132042_63117346dd_c.jpg b/src/dataset/iris/8836132042_63117346dd_c.jpg new file mode 100644 index 00000000..e1c7f593 Binary files /dev/null and b/src/dataset/iris/8836132042_63117346dd_c.jpg differ diff --git a/src/dataset/iris/8836142080_1fcb48f975_c.jpg b/src/dataset/iris/8836142080_1fcb48f975_c.jpg new file mode 100644 index 00000000..5edc1882 Binary files /dev/null and b/src/dataset/iris/8836142080_1fcb48f975_c.jpg differ diff --git a/src/dataset/iris/8838320369_ddc4bcbf15_c.jpg b/src/dataset/iris/8838320369_ddc4bcbf15_c.jpg new file mode 100644 index 00000000..d3296109 Binary files /dev/null and b/src/dataset/iris/8838320369_ddc4bcbf15_c.jpg differ diff --git a/src/dataset/iris/8856834771_02c2628fb0_c.jpg b/src/dataset/iris/8856834771_02c2628fb0_c.jpg new file mode 100644 index 00000000..c327b20c Binary files /dev/null and b/src/dataset/iris/8856834771_02c2628fb0_c.jpg differ diff --git a/src/dataset/iris/8859068716_5051c08306_c.jpg b/src/dataset/iris/8859068716_5051c08306_c.jpg new file mode 100644 index 00000000..15e2230a Binary files /dev/null and b/src/dataset/iris/8859068716_5051c08306_c.jpg differ diff --git a/src/dataset/iris/8865120153_5512835827_c.jpg b/src/dataset/iris/8865120153_5512835827_c.jpg new file mode 100644 index 00000000..0bad9dbe Binary files /dev/null and b/src/dataset/iris/8865120153_5512835827_c.jpg differ diff --git a/src/dataset/iris/8884659663_57fc35c526_c.jpg b/src/dataset/iris/8884659663_57fc35c526_c.jpg new file mode 100644 index 00000000..a3da91d5 Binary files /dev/null and b/src/dataset/iris/8884659663_57fc35c526_c.jpg differ diff --git a/src/dataset/iris/8889993276_296c56686f_c.jpg b/src/dataset/iris/8889993276_296c56686f_c.jpg new file mode 100644 index 00000000..30bfe1be Binary files /dev/null and b/src/dataset/iris/8889993276_296c56686f_c.jpg differ diff --git a/src/dataset/iris/8956193094_b9312d4cbb_c.jpg b/src/dataset/iris/8956193094_b9312d4cbb_c.jpg new file mode 100644 index 00000000..ae42fab3 Binary files /dev/null and b/src/dataset/iris/8956193094_b9312d4cbb_c.jpg differ diff --git a/src/dataset/iris/8966204199_5571b3d360_c.jpg b/src/dataset/iris/8966204199_5571b3d360_c.jpg new file mode 100644 index 00000000..a3894ac2 Binary files /dev/null and b/src/dataset/iris/8966204199_5571b3d360_c.jpg differ diff --git a/src/dataset/iris/8991171200_79bd100610_c.jpg b/src/dataset/iris/8991171200_79bd100610_c.jpg new file mode 100644 index 00000000..9fe6eb2f Binary files /dev/null and b/src/dataset/iris/8991171200_79bd100610_c.jpg differ diff --git a/src/dataset/iris/8991234917_3c98210ce6_c.jpg b/src/dataset/iris/8991234917_3c98210ce6_c.jpg new file mode 100644 index 00000000..78cb3aee Binary files /dev/null and b/src/dataset/iris/8991234917_3c98210ce6_c.jpg differ diff --git a/src/dataset/iris/9002617523_53ed426e28_c.jpg b/src/dataset/iris/9002617523_53ed426e28_c.jpg new file mode 100644 index 00000000..ac63b16b Binary files /dev/null and b/src/dataset/iris/9002617523_53ed426e28_c.jpg differ diff --git a/src/dataset/iris/9002626619_d2c0a5d70c_c.jpg b/src/dataset/iris/9002626619_d2c0a5d70c_c.jpg new file mode 100644 index 00000000..83d89e18 Binary files /dev/null and b/src/dataset/iris/9002626619_d2c0a5d70c_c.jpg differ diff --git a/src/dataset/iris/9002646687_2ff55b815c_c.jpg b/src/dataset/iris/9002646687_2ff55b815c_c.jpg new file mode 100644 index 00000000..6265ff96 Binary files /dev/null and b/src/dataset/iris/9002646687_2ff55b815c_c.jpg differ diff --git a/src/dataset/iris/9003803140_191c81ce05_c.jpg b/src/dataset/iris/9003803140_191c81ce05_c.jpg new file mode 100644 index 00000000..ed6c104a Binary files /dev/null and b/src/dataset/iris/9003803140_191c81ce05_c.jpg differ diff --git a/src/dataset/iris/9051099993_5b03f2cfaf_c.jpg b/src/dataset/iris/9051099993_5b03f2cfaf_c.jpg new file mode 100644 index 00000000..7ce309a3 Binary files /dev/null and b/src/dataset/iris/9051099993_5b03f2cfaf_c.jpg differ diff --git a/src/dataset/iris/9054818035_965648c690_c.jpg b/src/dataset/iris/9054818035_965648c690_c.jpg new file mode 100644 index 00000000..dc69dd0f Binary files /dev/null and b/src/dataset/iris/9054818035_965648c690_c.jpg differ diff --git a/src/dataset/iris/9054832831_94db399ccf_c.jpg b/src/dataset/iris/9054832831_94db399ccf_c.jpg new file mode 100644 index 00000000..741019f9 Binary files /dev/null and b/src/dataset/iris/9054832831_94db399ccf_c.jpg differ diff --git a/src/dataset/iris/9057061942_13ca64d27b_c.jpg b/src/dataset/iris/9057061942_13ca64d27b_c.jpg new file mode 100644 index 00000000..4d1973ea Binary files /dev/null and b/src/dataset/iris/9057061942_13ca64d27b_c.jpg differ diff --git a/src/dataset/iris/9058930434_65060cd963_c.jpg b/src/dataset/iris/9058930434_65060cd963_c.jpg new file mode 100644 index 00000000..7a0b1882 Binary files /dev/null and b/src/dataset/iris/9058930434_65060cd963_c.jpg differ diff --git a/src/dataset/iris/906532290_e71f796d2c_c.jpg b/src/dataset/iris/906532290_e71f796d2c_c.jpg new file mode 100644 index 00000000..0e75e536 Binary files /dev/null and b/src/dataset/iris/906532290_e71f796d2c_c.jpg differ diff --git a/src/dataset/iris/9108542176_af4a4e4978_c.jpg b/src/dataset/iris/9108542176_af4a4e4978_c.jpg new file mode 100644 index 00000000..deb6d177 Binary files /dev/null and b/src/dataset/iris/9108542176_af4a4e4978_c.jpg differ diff --git a/src/dataset/iris/9125379414_5bd32918be_c.jpg b/src/dataset/iris/9125379414_5bd32918be_c.jpg new file mode 100644 index 00000000..6c2db98d Binary files /dev/null and b/src/dataset/iris/9125379414_5bd32918be_c.jpg differ diff --git a/src/dataset/iris/9126471900_8c47c9658a_c.jpg b/src/dataset/iris/9126471900_8c47c9658a_c.jpg new file mode 100644 index 00000000..2db259f1 Binary files /dev/null and b/src/dataset/iris/9126471900_8c47c9658a_c.jpg differ diff --git a/src/dataset/iris/9146814726_1fcaf51d26_c.jpg b/src/dataset/iris/9146814726_1fcaf51d26_c.jpg new file mode 100644 index 00000000..b43ddee2 Binary files /dev/null and b/src/dataset/iris/9146814726_1fcaf51d26_c.jpg differ diff --git a/src/dataset/iris/9148634707_6b3ee3155b_c.jpg b/src/dataset/iris/9148634707_6b3ee3155b_c.jpg new file mode 100644 index 00000000..a0e76df5 Binary files /dev/null and b/src/dataset/iris/9148634707_6b3ee3155b_c.jpg differ diff --git a/src/dataset/iris/9212958174_a2d3fa9122_c.jpg b/src/dataset/iris/9212958174_a2d3fa9122_c.jpg new file mode 100644 index 00000000..5acc38dc Binary files /dev/null and b/src/dataset/iris/9212958174_a2d3fa9122_c.jpg differ diff --git a/src/dataset/iris/9310387045_9cf718d72e_c.jpg b/src/dataset/iris/9310387045_9cf718d72e_c.jpg new file mode 100644 index 00000000..0fb81e06 Binary files /dev/null and b/src/dataset/iris/9310387045_9cf718d72e_c.jpg differ diff --git a/src/dataset/iris/9664621718_003b7c7b11_c.jpg b/src/dataset/iris/9664621718_003b7c7b11_c.jpg new file mode 100644 index 00000000..0937c2f2 Binary files /dev/null and b/src/dataset/iris/9664621718_003b7c7b11_c.jpg differ diff --git a/src/dataset/iris/9778987913_f59a3c8d30_c.jpg b/src/dataset/iris/9778987913_f59a3c8d30_c.jpg new file mode 100644 index 00000000..fffc8731 Binary files /dev/null and b/src/dataset/iris/9778987913_f59a3c8d30_c.jpg differ diff --git a/src/dataset/iris/9971333634_4bb99cea66_c.jpg b/src/dataset/iris/9971333634_4bb99cea66_c.jpg new file mode 100644 index 00000000..fd14e1a1 Binary files /dev/null and b/src/dataset/iris/9971333634_4bb99cea66_c.jpg differ diff --git a/src/dataset/rose/10063573746_dae22f863b_c.jpg b/src/dataset/rose/10063573746_dae22f863b_c.jpg new file mode 100644 index 00000000..3fe5c80d Binary files /dev/null and b/src/dataset/rose/10063573746_dae22f863b_c.jpg differ diff --git a/src/dataset/rose/10065206693_14c212b535_c.jpg b/src/dataset/rose/10065206693_14c212b535_c.jpg new file mode 100644 index 00000000..fc93a279 Binary files /dev/null and b/src/dataset/rose/10065206693_14c212b535_c.jpg differ diff --git a/src/dataset/rose/10153195253_1d7c25ceb1_c.jpg b/src/dataset/rose/10153195253_1d7c25ceb1_c.jpg new file mode 100644 index 00000000..3f53c0fe Binary files /dev/null and b/src/dataset/rose/10153195253_1d7c25ceb1_c.jpg differ diff --git a/src/dataset/rose/10539258363_62df2abf81_c.jpg b/src/dataset/rose/10539258363_62df2abf81_c.jpg new file mode 100644 index 00000000..b39aeceb Binary files /dev/null and b/src/dataset/rose/10539258363_62df2abf81_c.jpg differ diff --git a/src/dataset/rose/105796918_05f03f42c7_c.jpg b/src/dataset/rose/105796918_05f03f42c7_c.jpg new file mode 100644 index 00000000..5833c8ad Binary files /dev/null and b/src/dataset/rose/105796918_05f03f42c7_c.jpg differ diff --git a/src/dataset/rose/10731426816_050902833d_c.jpg b/src/dataset/rose/10731426816_050902833d_c.jpg new file mode 100644 index 00000000..3a1c64bf Binary files /dev/null and b/src/dataset/rose/10731426816_050902833d_c.jpg differ diff --git a/src/dataset/rose/1085236961_eb1e4aefa2_c.jpg b/src/dataset/rose/1085236961_eb1e4aefa2_c.jpg new file mode 100644 index 00000000..1c57cdd4 Binary files /dev/null and b/src/dataset/rose/1085236961_eb1e4aefa2_c.jpg differ diff --git a/src/dataset/rose/1086116212_bd2adc7d81_c.jpg b/src/dataset/rose/1086116212_bd2adc7d81_c.jpg new file mode 100644 index 00000000..e6556203 Binary files /dev/null and b/src/dataset/rose/1086116212_bd2adc7d81_c.jpg differ diff --git a/src/dataset/rose/1091926885_103ad6e41a_c.jpg b/src/dataset/rose/1091926885_103ad6e41a_c.jpg new file mode 100644 index 00000000..a053b560 Binary files /dev/null and b/src/dataset/rose/1091926885_103ad6e41a_c.jpg differ diff --git a/src/dataset/rose/1093502641_59898088b4_c.jpg b/src/dataset/rose/1093502641_59898088b4_c.jpg new file mode 100644 index 00000000..bfb53932 Binary files /dev/null and b/src/dataset/rose/1093502641_59898088b4_c.jpg differ diff --git a/src/dataset/rose/11053820414_71ac2844ae_c.jpg b/src/dataset/rose/11053820414_71ac2844ae_c.jpg new file mode 100644 index 00000000..68d51b6d Binary files /dev/null and b/src/dataset/rose/11053820414_71ac2844ae_c.jpg differ diff --git a/src/dataset/rose/11053873483_2a9eb41c0d_c.jpg b/src/dataset/rose/11053873483_2a9eb41c0d_c.jpg new file mode 100644 index 00000000..a982d611 Binary files /dev/null and b/src/dataset/rose/11053873483_2a9eb41c0d_c.jpg differ diff --git a/src/dataset/rose/11053874933_efcef05a93_c.jpg b/src/dataset/rose/11053874933_efcef05a93_c.jpg new file mode 100644 index 00000000..3b083dee Binary files /dev/null and b/src/dataset/rose/11053874933_efcef05a93_c.jpg differ diff --git a/src/dataset/rose/11563567033_b822736d84_c.jpg b/src/dataset/rose/11563567033_b822736d84_c.jpg new file mode 100644 index 00000000..0428e931 Binary files /dev/null and b/src/dataset/rose/11563567033_b822736d84_c.jpg differ diff --git a/src/dataset/rose/1161454912_5c51bd8ff9_c.jpg b/src/dataset/rose/1161454912_5c51bd8ff9_c.jpg new file mode 100644 index 00000000..613906ea Binary files /dev/null and b/src/dataset/rose/1161454912_5c51bd8ff9_c.jpg differ diff --git a/src/dataset/rose/120295872_2d2f47e14e_c.jpg b/src/dataset/rose/120295872_2d2f47e14e_c.jpg new file mode 100644 index 00000000..60c935b0 Binary files /dev/null and b/src/dataset/rose/120295872_2d2f47e14e_c.jpg differ diff --git a/src/dataset/rose/1216789_7e50c0f967_c.jpg b/src/dataset/rose/1216789_7e50c0f967_c.jpg new file mode 100644 index 00000000..72d3da27 Binary files /dev/null and b/src/dataset/rose/1216789_7e50c0f967_c.jpg differ diff --git a/src/dataset/rose/12229407124_9f2d127a0c_c.jpg b/src/dataset/rose/12229407124_9f2d127a0c_c.jpg new file mode 100644 index 00000000..ef920310 Binary files /dev/null and b/src/dataset/rose/12229407124_9f2d127a0c_c.jpg differ diff --git a/src/dataset/rose/12229407154_6a39beea99_c.jpg b/src/dataset/rose/12229407154_6a39beea99_c.jpg new file mode 100644 index 00000000..eb82e84c Binary files /dev/null and b/src/dataset/rose/12229407154_6a39beea99_c.jpg differ diff --git a/src/dataset/rose/12229427556_2c3ccd2aa9_c.jpg b/src/dataset/rose/12229427556_2c3ccd2aa9_c.jpg new file mode 100644 index 00000000..334f6b41 Binary files /dev/null and b/src/dataset/rose/12229427556_2c3ccd2aa9_c.jpg differ diff --git a/src/dataset/rose/12241436983_9341d1aa9d_c.jpg b/src/dataset/rose/12241436983_9341d1aa9d_c.jpg new file mode 100644 index 00000000..cdcf8683 Binary files /dev/null and b/src/dataset/rose/12241436983_9341d1aa9d_c.jpg differ diff --git a/src/dataset/rose/12349494165_c218f3d2be_c.jpg b/src/dataset/rose/12349494165_c218f3d2be_c.jpg new file mode 100644 index 00000000..238cc055 Binary files /dev/null and b/src/dataset/rose/12349494165_c218f3d2be_c.jpg differ diff --git a/src/dataset/rose/12406546493_2a8d039b93_c.jpg b/src/dataset/rose/12406546493_2a8d039b93_c.jpg new file mode 100644 index 00000000..40f94cbc Binary files /dev/null and b/src/dataset/rose/12406546493_2a8d039b93_c.jpg differ diff --git a/src/dataset/rose/125486946_73427d049e_c.jpg b/src/dataset/rose/125486946_73427d049e_c.jpg new file mode 100644 index 00000000..0d615914 Binary files /dev/null and b/src/dataset/rose/125486946_73427d049e_c.jpg differ diff --git a/src/dataset/rose/12573943994_a6315beb78_c.jpg b/src/dataset/rose/12573943994_a6315beb78_c.jpg new file mode 100644 index 00000000..0c0a53c0 Binary files /dev/null and b/src/dataset/rose/12573943994_a6315beb78_c.jpg differ diff --git a/src/dataset/rose/12647401333_1d28cf2e00_c.jpg b/src/dataset/rose/12647401333_1d28cf2e00_c.jpg new file mode 100644 index 00000000..aa7f5462 Binary files /dev/null and b/src/dataset/rose/12647401333_1d28cf2e00_c.jpg differ diff --git a/src/dataset/rose/130068992_b1edd7bf54_c.jpg b/src/dataset/rose/130068992_b1edd7bf54_c.jpg new file mode 100644 index 00000000..7ce55333 Binary files /dev/null and b/src/dataset/rose/130068992_b1edd7bf54_c.jpg differ diff --git a/src/dataset/rose/13329757933_a81355bb93_c.jpg b/src/dataset/rose/13329757933_a81355bb93_c.jpg new file mode 100644 index 00000000..20ae9814 Binary files /dev/null and b/src/dataset/rose/13329757933_a81355bb93_c.jpg differ diff --git a/src/dataset/rose/13356014474_74708355e2_c.jpg b/src/dataset/rose/13356014474_74708355e2_c.jpg new file mode 100644 index 00000000..55afe3b9 Binary files /dev/null and b/src/dataset/rose/13356014474_74708355e2_c.jpg differ diff --git a/src/dataset/rose/13434317363_551eea8828_c.jpg b/src/dataset/rose/13434317363_551eea8828_c.jpg new file mode 100644 index 00000000..5ad468fa Binary files /dev/null and b/src/dataset/rose/13434317363_551eea8828_c.jpg differ diff --git a/src/dataset/rose/1344672384_49d938aaf5_c.jpg b/src/dataset/rose/1344672384_49d938aaf5_c.jpg new file mode 100644 index 00000000..19659bc5 Binary files /dev/null and b/src/dataset/rose/1344672384_49d938aaf5_c.jpg differ diff --git a/src/dataset/rose/13463664043_80a05a1d51_c.jpg b/src/dataset/rose/13463664043_80a05a1d51_c.jpg new file mode 100644 index 00000000..50fff15b Binary files /dev/null and b/src/dataset/rose/13463664043_80a05a1d51_c.jpg differ diff --git a/src/dataset/rose/1346373891_f1480d85a8_c.jpg b/src/dataset/rose/1346373891_f1480d85a8_c.jpg new file mode 100644 index 00000000..f4806a1c Binary files /dev/null and b/src/dataset/rose/1346373891_f1480d85a8_c.jpg differ diff --git a/src/dataset/rose/1346682727_2c0fe8712b_c.jpg b/src/dataset/rose/1346682727_2c0fe8712b_c.jpg new file mode 100644 index 00000000..04ada7ee Binary files /dev/null and b/src/dataset/rose/1346682727_2c0fe8712b_c.jpg differ diff --git a/src/dataset/rose/1352726882_383a582403_c.jpg b/src/dataset/rose/1352726882_383a582403_c.jpg new file mode 100644 index 00000000..74b85456 Binary files /dev/null and b/src/dataset/rose/1352726882_383a582403_c.jpg differ diff --git a/src/dataset/rose/1363267439_c68220d7dc_c.jpg b/src/dataset/rose/1363267439_c68220d7dc_c.jpg new file mode 100644 index 00000000..e20328f3 Binary files /dev/null and b/src/dataset/rose/1363267439_c68220d7dc_c.jpg differ diff --git a/src/dataset/rose/1363267709_7c509e4005_c.jpg b/src/dataset/rose/1363267709_7c509e4005_c.jpg new file mode 100644 index 00000000..2c6b5c9e Binary files /dev/null and b/src/dataset/rose/1363267709_7c509e4005_c.jpg differ diff --git a/src/dataset/rose/1364155786_a0eec497a1_c.jpg b/src/dataset/rose/1364155786_a0eec497a1_c.jpg new file mode 100644 index 00000000..8d75d2e8 Binary files /dev/null and b/src/dataset/rose/1364155786_a0eec497a1_c.jpg differ diff --git a/src/dataset/rose/1364158308_21aebc5805_c.jpg b/src/dataset/rose/1364158308_21aebc5805_c.jpg new file mode 100644 index 00000000..c5bdf6a1 Binary files /dev/null and b/src/dataset/rose/1364158308_21aebc5805_c.jpg differ diff --git a/src/dataset/rose/1364158896_b72bfeccfe_c.jpg b/src/dataset/rose/1364158896_b72bfeccfe_c.jpg new file mode 100644 index 00000000..e839b3bb Binary files /dev/null and b/src/dataset/rose/1364158896_b72bfeccfe_c.jpg differ diff --git a/src/dataset/rose/13733581864_f91c0cbf7f_c.jpg b/src/dataset/rose/13733581864_f91c0cbf7f_c.jpg new file mode 100644 index 00000000..cf044665 Binary files /dev/null and b/src/dataset/rose/13733581864_f91c0cbf7f_c.jpg differ diff --git a/src/dataset/rose/13897640908_47e0ca9b55_c.jpg b/src/dataset/rose/13897640908_47e0ca9b55_c.jpg new file mode 100644 index 00000000..29892829 Binary files /dev/null and b/src/dataset/rose/13897640908_47e0ca9b55_c.jpg differ diff --git a/src/dataset/rose/13929445464_7423962d8d_c.jpg b/src/dataset/rose/13929445464_7423962d8d_c.jpg new file mode 100644 index 00000000..356c0eb8 Binary files /dev/null and b/src/dataset/rose/13929445464_7423962d8d_c.jpg differ diff --git a/src/dataset/rose/13967628989_406313b33c_c.jpg b/src/dataset/rose/13967628989_406313b33c_c.jpg new file mode 100644 index 00000000..ac4039db Binary files /dev/null and b/src/dataset/rose/13967628989_406313b33c_c.jpg differ diff --git a/src/dataset/rose/14151131842_c3f9c2c4c3_c.jpg b/src/dataset/rose/14151131842_c3f9c2c4c3_c.jpg new file mode 100644 index 00000000..b0292c58 Binary files /dev/null and b/src/dataset/rose/14151131842_c3f9c2c4c3_c.jpg differ diff --git a/src/dataset/rose/14178650057_6f9e0305d8_c.jpg b/src/dataset/rose/14178650057_6f9e0305d8_c.jpg new file mode 100644 index 00000000..a4d18528 Binary files /dev/null and b/src/dataset/rose/14178650057_6f9e0305d8_c.jpg differ diff --git a/src/dataset/rose/14186749150_c5b0d642ca_c.jpg b/src/dataset/rose/14186749150_c5b0d642ca_c.jpg new file mode 100644 index 00000000..e4fdf2b4 Binary files /dev/null and b/src/dataset/rose/14186749150_c5b0d642ca_c.jpg differ diff --git a/src/dataset/rose/14213382047_00b704fc55_c.jpg b/src/dataset/rose/14213382047_00b704fc55_c.jpg new file mode 100644 index 00000000..39d0e707 Binary files /dev/null and b/src/dataset/rose/14213382047_00b704fc55_c.jpg differ diff --git a/src/dataset/rose/14218830472_3834726b63_c.jpg b/src/dataset/rose/14218830472_3834726b63_c.jpg new file mode 100644 index 00000000..21cff07f Binary files /dev/null and b/src/dataset/rose/14218830472_3834726b63_c.jpg differ diff --git a/src/dataset/rose/14220454184_34619cf1c6_c.jpg b/src/dataset/rose/14220454184_34619cf1c6_c.jpg new file mode 100644 index 00000000..bab44f2c Binary files /dev/null and b/src/dataset/rose/14220454184_34619cf1c6_c.jpg differ diff --git a/src/dataset/rose/14231694574_b08d90cab1_c.jpg b/src/dataset/rose/14231694574_b08d90cab1_c.jpg new file mode 100644 index 00000000..c1579418 Binary files /dev/null and b/src/dataset/rose/14231694574_b08d90cab1_c.jpg differ diff --git a/src/dataset/rose/14240988383_1d3aafab7e_c.jpg b/src/dataset/rose/14240988383_1d3aafab7e_c.jpg new file mode 100644 index 00000000..9d2ae278 Binary files /dev/null and b/src/dataset/rose/14240988383_1d3aafab7e_c.jpg differ diff --git a/src/dataset/rose/14284164022_0cf424f1c1_c.jpg b/src/dataset/rose/14284164022_0cf424f1c1_c.jpg new file mode 100644 index 00000000..63228cc4 Binary files /dev/null and b/src/dataset/rose/14284164022_0cf424f1c1_c.jpg differ diff --git a/src/dataset/rose/14289552486_e2d626b668_c.jpg b/src/dataset/rose/14289552486_e2d626b668_c.jpg new file mode 100644 index 00000000..08381dd7 Binary files /dev/null and b/src/dataset/rose/14289552486_e2d626b668_c.jpg differ diff --git a/src/dataset/rose/14317978043_69198f43ae_c.jpg b/src/dataset/rose/14317978043_69198f43ae_c.jpg new file mode 100644 index 00000000..da2a0b64 Binary files /dev/null and b/src/dataset/rose/14317978043_69198f43ae_c.jpg differ diff --git a/src/dataset/rose/14331519412_fb045e11a2_c.jpg b/src/dataset/rose/14331519412_fb045e11a2_c.jpg new file mode 100644 index 00000000..c5c33803 Binary files /dev/null and b/src/dataset/rose/14331519412_fb045e11a2_c.jpg differ diff --git a/src/dataset/rose/14331819526_f260f530b6_c.jpg b/src/dataset/rose/14331819526_f260f530b6_c.jpg new file mode 100644 index 00000000..e2d0633b Binary files /dev/null and b/src/dataset/rose/14331819526_f260f530b6_c.jpg differ diff --git a/src/dataset/rose/14416921483_36e546a3f5_c.jpg b/src/dataset/rose/14416921483_36e546a3f5_c.jpg new file mode 100644 index 00000000..938dcd6b Binary files /dev/null and b/src/dataset/rose/14416921483_36e546a3f5_c.jpg differ diff --git a/src/dataset/rose/14434172294_7a318d174d_c.jpg b/src/dataset/rose/14434172294_7a318d174d_c.jpg new file mode 100644 index 00000000..f38a08ed Binary files /dev/null and b/src/dataset/rose/14434172294_7a318d174d_c.jpg differ diff --git a/src/dataset/rose/14435429551_428eaab702_c.jpg b/src/dataset/rose/14435429551_428eaab702_c.jpg new file mode 100644 index 00000000..5863babf Binary files /dev/null and b/src/dataset/rose/14435429551_428eaab702_c.jpg differ diff --git a/src/dataset/rose/14451413886_17d8971f0f_c.jpg b/src/dataset/rose/14451413886_17d8971f0f_c.jpg new file mode 100644 index 00000000..864b71c1 Binary files /dev/null and b/src/dataset/rose/14451413886_17d8971f0f_c.jpg differ diff --git a/src/dataset/rose/14475353248_19071e3827_c.jpg b/src/dataset/rose/14475353248_19071e3827_c.jpg new file mode 100644 index 00000000..457d2504 Binary files /dev/null and b/src/dataset/rose/14475353248_19071e3827_c.jpg differ diff --git a/src/dataset/rose/14480655332_475c3858bc_c.jpg b/src/dataset/rose/14480655332_475c3858bc_c.jpg new file mode 100644 index 00000000..76066f56 Binary files /dev/null and b/src/dataset/rose/14480655332_475c3858bc_c.jpg differ diff --git a/src/dataset/rose/14480749258_2e089a43f6_c.jpg b/src/dataset/rose/14480749258_2e089a43f6_c.jpg new file mode 100644 index 00000000..ec47f438 Binary files /dev/null and b/src/dataset/rose/14480749258_2e089a43f6_c.jpg differ diff --git a/src/dataset/rose/14489445424_2f9d8cd0e2_c.jpg b/src/dataset/rose/14489445424_2f9d8cd0e2_c.jpg new file mode 100644 index 00000000..d2d93e51 Binary files /dev/null and b/src/dataset/rose/14489445424_2f9d8cd0e2_c.jpg differ diff --git a/src/dataset/rose/14527948525_161f140dc3_c.jpg b/src/dataset/rose/14527948525_161f140dc3_c.jpg new file mode 100644 index 00000000..6cacd503 Binary files /dev/null and b/src/dataset/rose/14527948525_161f140dc3_c.jpg differ diff --git a/src/dataset/rose/14538820438_e570a5b59a_c.jpg b/src/dataset/rose/14538820438_e570a5b59a_c.jpg new file mode 100644 index 00000000..087212dc Binary files /dev/null and b/src/dataset/rose/14538820438_e570a5b59a_c.jpg differ diff --git a/src/dataset/rose/14567935788_3f10a9cd01_c.jpg b/src/dataset/rose/14567935788_3f10a9cd01_c.jpg new file mode 100644 index 00000000..f1c1d2b1 Binary files /dev/null and b/src/dataset/rose/14567935788_3f10a9cd01_c.jpg differ diff --git a/src/dataset/rose/14582439834_73fa16a455_c.jpg b/src/dataset/rose/14582439834_73fa16a455_c.jpg new file mode 100644 index 00000000..47224af2 Binary files /dev/null and b/src/dataset/rose/14582439834_73fa16a455_c.jpg differ diff --git a/src/dataset/rose/14599589255_bc4e2140eb_c.jpg b/src/dataset/rose/14599589255_bc4e2140eb_c.jpg new file mode 100644 index 00000000..8b51b457 Binary files /dev/null and b/src/dataset/rose/14599589255_bc4e2140eb_c.jpg differ diff --git a/src/dataset/rose/14661618282_7d1b812080_c.jpg b/src/dataset/rose/14661618282_7d1b812080_c.jpg new file mode 100644 index 00000000..577058c6 Binary files /dev/null and b/src/dataset/rose/14661618282_7d1b812080_c.jpg differ diff --git a/src/dataset/rose/14702959993_e0ddb0e812_c.jpg b/src/dataset/rose/14702959993_e0ddb0e812_c.jpg new file mode 100644 index 00000000..0f0fefb5 Binary files /dev/null and b/src/dataset/rose/14702959993_e0ddb0e812_c.jpg differ diff --git a/src/dataset/rose/14750106322_a1623609f4_c.jpg b/src/dataset/rose/14750106322_a1623609f4_c.jpg new file mode 100644 index 00000000..2aa6bb7e Binary files /dev/null and b/src/dataset/rose/14750106322_a1623609f4_c.jpg differ diff --git a/src/dataset/rose/14758554747_f5cfa3356a_c.jpg b/src/dataset/rose/14758554747_f5cfa3356a_c.jpg new file mode 100644 index 00000000..f34d7734 Binary files /dev/null and b/src/dataset/rose/14758554747_f5cfa3356a_c.jpg differ diff --git a/src/dataset/rose/1476943_ecf8d36b29_c.jpg b/src/dataset/rose/1476943_ecf8d36b29_c.jpg new file mode 100644 index 00000000..dd90dcc5 Binary files /dev/null and b/src/dataset/rose/1476943_ecf8d36b29_c.jpg differ diff --git a/src/dataset/rose/14805639873_8755a494c4_c.jpg b/src/dataset/rose/14805639873_8755a494c4_c.jpg new file mode 100644 index 00000000..98162821 Binary files /dev/null and b/src/dataset/rose/14805639873_8755a494c4_c.jpg differ diff --git a/src/dataset/rose/14821467350_aabbe5b816_c.jpg b/src/dataset/rose/14821467350_aabbe5b816_c.jpg new file mode 100644 index 00000000..5d5afa42 Binary files /dev/null and b/src/dataset/rose/14821467350_aabbe5b816_c.jpg differ diff --git a/src/dataset/rose/14868991779_87e3eb76a2_c.jpg b/src/dataset/rose/14868991779_87e3eb76a2_c.jpg new file mode 100644 index 00000000..0c9859bd Binary files /dev/null and b/src/dataset/rose/14868991779_87e3eb76a2_c.jpg differ diff --git a/src/dataset/rose/1486916680_facff5b09d_c.jpg b/src/dataset/rose/1486916680_facff5b09d_c.jpg new file mode 100644 index 00000000..e1611041 Binary files /dev/null and b/src/dataset/rose/1486916680_facff5b09d_c.jpg differ diff --git a/src/dataset/rose/1486917054_a32574b8db_c.jpg b/src/dataset/rose/1486917054_a32574b8db_c.jpg new file mode 100644 index 00000000..106df87d Binary files /dev/null and b/src/dataset/rose/1486917054_a32574b8db_c.jpg differ diff --git a/src/dataset/rose/14880881530_012d691210_c.jpg b/src/dataset/rose/14880881530_012d691210_c.jpg new file mode 100644 index 00000000..2cdaec67 Binary files /dev/null and b/src/dataset/rose/14880881530_012d691210_c.jpg differ diff --git a/src/dataset/rose/149137665_db5e421309_c.jpg b/src/dataset/rose/149137665_db5e421309_c.jpg new file mode 100644 index 00000000..60de1bab Binary files /dev/null and b/src/dataset/rose/149137665_db5e421309_c.jpg differ diff --git a/src/dataset/rose/14937815595_ae349565f8_c.jpg b/src/dataset/rose/14937815595_ae349565f8_c.jpg new file mode 100644 index 00000000..f6c337f6 Binary files /dev/null and b/src/dataset/rose/14937815595_ae349565f8_c.jpg differ diff --git a/src/dataset/rose/14996372094_7c3800fbff_c.jpg b/src/dataset/rose/14996372094_7c3800fbff_c.jpg new file mode 100644 index 00000000..b9902b10 Binary files /dev/null and b/src/dataset/rose/14996372094_7c3800fbff_c.jpg differ diff --git a/src/dataset/rose/15052767589_e5655ab9a8_c.jpg b/src/dataset/rose/15052767589_e5655ab9a8_c.jpg new file mode 100644 index 00000000..69c9012e Binary files /dev/null and b/src/dataset/rose/15052767589_e5655ab9a8_c.jpg differ diff --git a/src/dataset/rose/15062019896_1ae9866288_c.jpg b/src/dataset/rose/15062019896_1ae9866288_c.jpg new file mode 100644 index 00000000..7fb2b684 Binary files /dev/null and b/src/dataset/rose/15062019896_1ae9866288_c.jpg differ diff --git a/src/dataset/rose/1514530953_a3b5536323_c.jpg b/src/dataset/rose/1514530953_a3b5536323_c.jpg new file mode 100644 index 00000000..20268aaa Binary files /dev/null and b/src/dataset/rose/1514530953_a3b5536323_c.jpg differ diff --git a/src/dataset/rose/15179109176_41979a406d_c.jpg b/src/dataset/rose/15179109176_41979a406d_c.jpg new file mode 100644 index 00000000..661ffa32 Binary files /dev/null and b/src/dataset/rose/15179109176_41979a406d_c.jpg differ diff --git a/src/dataset/rose/15190221591_63af7935c7_c.jpg b/src/dataset/rose/15190221591_63af7935c7_c.jpg new file mode 100644 index 00000000..44cc36fb Binary files /dev/null and b/src/dataset/rose/15190221591_63af7935c7_c.jpg differ diff --git a/src/dataset/rose/15205581549_8dd22e31d9_c.jpg b/src/dataset/rose/15205581549_8dd22e31d9_c.jpg new file mode 100644 index 00000000..adef7a45 Binary files /dev/null and b/src/dataset/rose/15205581549_8dd22e31d9_c.jpg differ diff --git a/src/dataset/rose/15212091776_f24a0fe783_c.jpg b/src/dataset/rose/15212091776_f24a0fe783_c.jpg new file mode 100644 index 00000000..6eac21c2 Binary files /dev/null and b/src/dataset/rose/15212091776_f24a0fe783_c.jpg differ diff --git a/src/dataset/rose/152165160_fec6dca661_c.jpg b/src/dataset/rose/152165160_fec6dca661_c.jpg new file mode 100644 index 00000000..b89187b9 Binary files /dev/null and b/src/dataset/rose/152165160_fec6dca661_c.jpg differ diff --git a/src/dataset/rose/15237463024_bce98299b2_c.jpg b/src/dataset/rose/15237463024_bce98299b2_c.jpg new file mode 100644 index 00000000..db41c7bc Binary files /dev/null and b/src/dataset/rose/15237463024_bce98299b2_c.jpg differ diff --git a/src/dataset/rose/15263487102_72ea5e8bd9_c.jpg b/src/dataset/rose/15263487102_72ea5e8bd9_c.jpg new file mode 100644 index 00000000..ba00f070 Binary files /dev/null and b/src/dataset/rose/15263487102_72ea5e8bd9_c.jpg differ diff --git a/src/dataset/rose/15284682778_a91576754f_c.jpg b/src/dataset/rose/15284682778_a91576754f_c.jpg new file mode 100644 index 00000000..f4452cca Binary files /dev/null and b/src/dataset/rose/15284682778_a91576754f_c.jpg differ diff --git a/src/dataset/rose/15310321012_f3aaf52277_c.jpg b/src/dataset/rose/15310321012_f3aaf52277_c.jpg new file mode 100644 index 00000000..ad95eeab Binary files /dev/null and b/src/dataset/rose/15310321012_f3aaf52277_c.jpg differ diff --git a/src/dataset/rose/153250507_e2daa13434_c.jpg b/src/dataset/rose/153250507_e2daa13434_c.jpg new file mode 100644 index 00000000..9b15332c Binary files /dev/null and b/src/dataset/rose/153250507_e2daa13434_c.jpg differ diff --git a/src/dataset/rose/15354454278_d1517b3354_c.jpg b/src/dataset/rose/15354454278_d1517b3354_c.jpg new file mode 100644 index 00000000..ce679110 Binary files /dev/null and b/src/dataset/rose/15354454278_d1517b3354_c.jpg differ diff --git a/src/dataset/rose/15354595427_032d755b42_c.jpg b/src/dataset/rose/15354595427_032d755b42_c.jpg new file mode 100644 index 00000000..8614e4f4 Binary files /dev/null and b/src/dataset/rose/15354595427_032d755b42_c.jpg differ diff --git a/src/dataset/rose/15361154448_2813ca8a3c_c.jpg b/src/dataset/rose/15361154448_2813ca8a3c_c.jpg new file mode 100644 index 00000000..6c3bf340 Binary files /dev/null and b/src/dataset/rose/15361154448_2813ca8a3c_c.jpg differ diff --git a/src/dataset/rose/15394458068_2fdbcb1ded_c.jpg b/src/dataset/rose/15394458068_2fdbcb1ded_c.jpg new file mode 100644 index 00000000..9cdb6370 Binary files /dev/null and b/src/dataset/rose/15394458068_2fdbcb1ded_c.jpg differ diff --git a/src/dataset/rose/15516902686_05ec5d34e5_c.jpg b/src/dataset/rose/15516902686_05ec5d34e5_c.jpg new file mode 100644 index 00000000..4dc3585b Binary files /dev/null and b/src/dataset/rose/15516902686_05ec5d34e5_c.jpg differ diff --git a/src/dataset/rose/15520495777_40733f548e_c.jpg b/src/dataset/rose/15520495777_40733f548e_c.jpg new file mode 100644 index 00000000..d7bd26dd Binary files /dev/null and b/src/dataset/rose/15520495777_40733f548e_c.jpg differ diff --git a/src/dataset/rose/15537916211_a7db7d246f_c.jpg b/src/dataset/rose/15537916211_a7db7d246f_c.jpg new file mode 100644 index 00000000..14259ce6 Binary files /dev/null and b/src/dataset/rose/15537916211_a7db7d246f_c.jpg differ diff --git a/src/dataset/rose/15537917111_dd6a4e41d1_c.jpg b/src/dataset/rose/15537917111_dd6a4e41d1_c.jpg new file mode 100644 index 00000000..8899fc10 Binary files /dev/null and b/src/dataset/rose/15537917111_dd6a4e41d1_c.jpg differ diff --git a/src/dataset/rose/15548121492_790232668f_c.jpg b/src/dataset/rose/15548121492_790232668f_c.jpg new file mode 100644 index 00000000..5548f2bb Binary files /dev/null and b/src/dataset/rose/15548121492_790232668f_c.jpg differ diff --git a/src/dataset/rose/15548122062_5d43358e51_c.jpg b/src/dataset/rose/15548122062_5d43358e51_c.jpg new file mode 100644 index 00000000..382e08ea Binary files /dev/null and b/src/dataset/rose/15548122062_5d43358e51_c.jpg differ diff --git a/src/dataset/rose/15625118846_f1395c9fda_c.jpg b/src/dataset/rose/15625118846_f1395c9fda_c.jpg new file mode 100644 index 00000000..7a5a01ab Binary files /dev/null and b/src/dataset/rose/15625118846_f1395c9fda_c.jpg differ diff --git a/src/dataset/rose/15706629534_0cb152af50_c.jpg b/src/dataset/rose/15706629534_0cb152af50_c.jpg new file mode 100644 index 00000000..72140d79 Binary files /dev/null and b/src/dataset/rose/15706629534_0cb152af50_c.jpg differ diff --git a/src/dataset/rose/15769526165_e106a726d8_c.jpg b/src/dataset/rose/15769526165_e106a726d8_c.jpg new file mode 100644 index 00000000..f1353ad5 Binary files /dev/null and b/src/dataset/rose/15769526165_e106a726d8_c.jpg differ diff --git a/src/dataset/rose/15778401042_5fb1fe4db5_c.jpg b/src/dataset/rose/15778401042_5fb1fe4db5_c.jpg new file mode 100644 index 00000000..c33e58d6 Binary files /dev/null and b/src/dataset/rose/15778401042_5fb1fe4db5_c.jpg differ diff --git a/src/dataset/rose/15802683562_31d59c49c6_c.jpg b/src/dataset/rose/15802683562_31d59c49c6_c.jpg new file mode 100644 index 00000000..8c2b9cae Binary files /dev/null and b/src/dataset/rose/15802683562_31d59c49c6_c.jpg differ diff --git a/src/dataset/rose/15885312679_bda44ecf99_c.jpg b/src/dataset/rose/15885312679_bda44ecf99_c.jpg new file mode 100644 index 00000000..1c270325 Binary files /dev/null and b/src/dataset/rose/15885312679_bda44ecf99_c.jpg differ diff --git a/src/dataset/rose/15917658707_e7ef13464f_c.jpg b/src/dataset/rose/15917658707_e7ef13464f_c.jpg new file mode 100644 index 00000000..425efc4c Binary files /dev/null and b/src/dataset/rose/15917658707_e7ef13464f_c.jpg differ diff --git a/src/dataset/rose/15946936007_50fcbc4f00_c.jpg b/src/dataset/rose/15946936007_50fcbc4f00_c.jpg new file mode 100644 index 00000000..51d3b05d Binary files /dev/null and b/src/dataset/rose/15946936007_50fcbc4f00_c.jpg differ diff --git a/src/dataset/rose/160189097_7b64d32743_c.jpg b/src/dataset/rose/160189097_7b64d32743_c.jpg new file mode 100644 index 00000000..bfa744ad Binary files /dev/null and b/src/dataset/rose/160189097_7b64d32743_c.jpg differ diff --git a/src/dataset/rose/16036883317_39cd77fd1a_c.jpg b/src/dataset/rose/16036883317_39cd77fd1a_c.jpg new file mode 100644 index 00000000..01c5534b Binary files /dev/null and b/src/dataset/rose/16036883317_39cd77fd1a_c.jpg differ diff --git a/src/dataset/rose/16171747087_a354e4240f_c.jpg b/src/dataset/rose/16171747087_a354e4240f_c.jpg new file mode 100644 index 00000000..10d36e8d Binary files /dev/null and b/src/dataset/rose/16171747087_a354e4240f_c.jpg differ diff --git a/src/dataset/rose/16269050018_75f23b087f_c.jpg b/src/dataset/rose/16269050018_75f23b087f_c.jpg new file mode 100644 index 00000000..3b53dd91 Binary files /dev/null and b/src/dataset/rose/16269050018_75f23b087f_c.jpg differ diff --git a/src/dataset/rose/16270309505_a198c8f479_c.jpg b/src/dataset/rose/16270309505_a198c8f479_c.jpg new file mode 100644 index 00000000..b2d4d152 Binary files /dev/null and b/src/dataset/rose/16270309505_a198c8f479_c.jpg differ diff --git a/src/dataset/rose/16324203584_b037fbcc72_c.jpg b/src/dataset/rose/16324203584_b037fbcc72_c.jpg new file mode 100644 index 00000000..a477359a Binary files /dev/null and b/src/dataset/rose/16324203584_b037fbcc72_c.jpg differ diff --git a/src/dataset/rose/16391880567_ff9e7894b6_c.jpg b/src/dataset/rose/16391880567_ff9e7894b6_c.jpg new file mode 100644 index 00000000..19db8645 Binary files /dev/null and b/src/dataset/rose/16391880567_ff9e7894b6_c.jpg differ diff --git a/src/dataset/rose/16413603897_8b583f366a_c.jpg b/src/dataset/rose/16413603897_8b583f366a_c.jpg new file mode 100644 index 00000000..06bdc9e6 Binary files /dev/null and b/src/dataset/rose/16413603897_8b583f366a_c.jpg differ diff --git a/src/dataset/rose/165221695_09b9641c18_c.jpg b/src/dataset/rose/165221695_09b9641c18_c.jpg new file mode 100644 index 00000000..5023aa75 Binary files /dev/null and b/src/dataset/rose/165221695_09b9641c18_c.jpg differ diff --git a/src/dataset/rose/16581536920_9978228bb9_c.jpg b/src/dataset/rose/16581536920_9978228bb9_c.jpg new file mode 100644 index 00000000..3157f30c Binary files /dev/null and b/src/dataset/rose/16581536920_9978228bb9_c.jpg differ diff --git a/src/dataset/rose/16610640669_f3a461eb45_c.jpg b/src/dataset/rose/16610640669_f3a461eb45_c.jpg new file mode 100644 index 00000000..b0429125 Binary files /dev/null and b/src/dataset/rose/16610640669_f3a461eb45_c.jpg differ diff --git a/src/dataset/rose/16636537378_ae24ee99c9_c.jpg b/src/dataset/rose/16636537378_ae24ee99c9_c.jpg new file mode 100644 index 00000000..c62d9419 Binary files /dev/null and b/src/dataset/rose/16636537378_ae24ee99c9_c.jpg differ diff --git a/src/dataset/rose/16657335946_63208bb203_c.jpg b/src/dataset/rose/16657335946_63208bb203_c.jpg new file mode 100644 index 00000000..86fca181 Binary files /dev/null and b/src/dataset/rose/16657335946_63208bb203_c.jpg differ diff --git a/src/dataset/rose/16782479450_c7e81eda30_c.jpg b/src/dataset/rose/16782479450_c7e81eda30_c.jpg new file mode 100644 index 00000000..22205a99 Binary files /dev/null and b/src/dataset/rose/16782479450_c7e81eda30_c.jpg differ diff --git a/src/dataset/rose/16820350475_d7c5ec073b_c.jpg b/src/dataset/rose/16820350475_d7c5ec073b_c.jpg new file mode 100644 index 00000000..6563cc9a Binary files /dev/null and b/src/dataset/rose/16820350475_d7c5ec073b_c.jpg differ diff --git a/src/dataset/rose/16922618941_422f0d392d_c.jpg b/src/dataset/rose/16922618941_422f0d392d_c.jpg new file mode 100644 index 00000000..8d79ce2f Binary files /dev/null and b/src/dataset/rose/16922618941_422f0d392d_c.jpg differ diff --git a/src/dataset/rose/1692696743_37dc2eb1ff_c.jpg b/src/dataset/rose/1692696743_37dc2eb1ff_c.jpg new file mode 100644 index 00000000..f8b6698f Binary files /dev/null and b/src/dataset/rose/1692696743_37dc2eb1ff_c.jpg differ diff --git a/src/dataset/rose/17630684996_9bfdac3795_c.jpg b/src/dataset/rose/17630684996_9bfdac3795_c.jpg new file mode 100644 index 00000000..c81da937 Binary files /dev/null and b/src/dataset/rose/17630684996_9bfdac3795_c.jpg differ diff --git a/src/dataset/rose/17702375854_d1d4bc94c3_c.jpg b/src/dataset/rose/17702375854_d1d4bc94c3_c.jpg new file mode 100644 index 00000000..cc0dd18c Binary files /dev/null and b/src/dataset/rose/17702375854_d1d4bc94c3_c.jpg differ diff --git a/src/dataset/rose/17756094922_7d78e1729e_c.jpg b/src/dataset/rose/17756094922_7d78e1729e_c.jpg new file mode 100644 index 00000000..dd7b49ab Binary files /dev/null and b/src/dataset/rose/17756094922_7d78e1729e_c.jpg differ diff --git a/src/dataset/rose/177686067_bb8d56eeca_c.jpg b/src/dataset/rose/177686067_bb8d56eeca_c.jpg new file mode 100644 index 00000000..b8a36649 Binary files /dev/null and b/src/dataset/rose/177686067_bb8d56eeca_c.jpg differ diff --git a/src/dataset/rose/177730616_d6d67a1ad6_c.jpg b/src/dataset/rose/177730616_d6d67a1ad6_c.jpg new file mode 100644 index 00000000..14ab980b Binary files /dev/null and b/src/dataset/rose/177730616_d6d67a1ad6_c.jpg differ diff --git a/src/dataset/rose/17837765634_e021e18bce_c.jpg b/src/dataset/rose/17837765634_e021e18bce_c.jpg new file mode 100644 index 00000000..ba35c178 Binary files /dev/null and b/src/dataset/rose/17837765634_e021e18bce_c.jpg differ diff --git a/src/dataset/rose/17891819940_853b7d932e_c.jpg b/src/dataset/rose/17891819940_853b7d932e_c.jpg new file mode 100644 index 00000000..2d3ca1db Binary files /dev/null and b/src/dataset/rose/17891819940_853b7d932e_c.jpg differ diff --git a/src/dataset/rose/17923058340_f148d321e3_c.jpg b/src/dataset/rose/17923058340_f148d321e3_c.jpg new file mode 100644 index 00000000..24472ed9 Binary files /dev/null and b/src/dataset/rose/17923058340_f148d321e3_c.jpg differ diff --git a/src/dataset/rose/17940079_b29dc18a2f_c.jpg b/src/dataset/rose/17940079_b29dc18a2f_c.jpg new file mode 100644 index 00000000..4314e146 Binary files /dev/null and b/src/dataset/rose/17940079_b29dc18a2f_c.jpg differ diff --git a/src/dataset/rose/18049321320_c5f61b0d71_c.jpg b/src/dataset/rose/18049321320_c5f61b0d71_c.jpg new file mode 100644 index 00000000..e8ef9834 Binary files /dev/null and b/src/dataset/rose/18049321320_c5f61b0d71_c.jpg differ diff --git a/src/dataset/rose/181641557_a2fd2b3d16_c.jpg b/src/dataset/rose/181641557_a2fd2b3d16_c.jpg new file mode 100644 index 00000000..57977dc3 Binary files /dev/null and b/src/dataset/rose/181641557_a2fd2b3d16_c.jpg differ diff --git a/src/dataset/rose/18198881353_0a151996b7_c.jpg b/src/dataset/rose/18198881353_0a151996b7_c.jpg new file mode 100644 index 00000000..e3342a8a Binary files /dev/null and b/src/dataset/rose/18198881353_0a151996b7_c.jpg differ diff --git a/src/dataset/rose/18216254829_a40fedb67c_c.jpg b/src/dataset/rose/18216254829_a40fedb67c_c.jpg new file mode 100644 index 00000000..24178123 Binary files /dev/null and b/src/dataset/rose/18216254829_a40fedb67c_c.jpg differ diff --git a/src/dataset/rose/18266970920_0b2784078d_c.jpg b/src/dataset/rose/18266970920_0b2784078d_c.jpg new file mode 100644 index 00000000..4fdd1bbc Binary files /dev/null and b/src/dataset/rose/18266970920_0b2784078d_c.jpg differ diff --git a/src/dataset/rose/18305207424_13b1d58195_c.jpg b/src/dataset/rose/18305207424_13b1d58195_c.jpg new file mode 100644 index 00000000..4f988ba5 Binary files /dev/null and b/src/dataset/rose/18305207424_13b1d58195_c.jpg differ diff --git a/src/dataset/rose/18416929922_cb43760d63_c.jpg b/src/dataset/rose/18416929922_cb43760d63_c.jpg new file mode 100644 index 00000000..3ca49046 Binary files /dev/null and b/src/dataset/rose/18416929922_cb43760d63_c.jpg differ diff --git a/src/dataset/rose/18479023778_530a960af7_c.jpg b/src/dataset/rose/18479023778_530a960af7_c.jpg new file mode 100644 index 00000000..33606ebe Binary files /dev/null and b/src/dataset/rose/18479023778_530a960af7_c.jpg differ diff --git a/src/dataset/rose/18485031144_4d39d22280_c.jpg b/src/dataset/rose/18485031144_4d39d22280_c.jpg new file mode 100644 index 00000000..a6d32d63 Binary files /dev/null and b/src/dataset/rose/18485031144_4d39d22280_c.jpg differ diff --git a/src/dataset/rose/1848880728_c7ac78facf_c.jpg b/src/dataset/rose/1848880728_c7ac78facf_c.jpg new file mode 100644 index 00000000..d2757e36 Binary files /dev/null and b/src/dataset/rose/1848880728_c7ac78facf_c.jpg differ diff --git a/src/dataset/rose/185017045_ebe98b7e9c_c.jpg b/src/dataset/rose/185017045_ebe98b7e9c_c.jpg new file mode 100644 index 00000000..1c3dea38 Binary files /dev/null and b/src/dataset/rose/185017045_ebe98b7e9c_c.jpg differ diff --git a/src/dataset/rose/18514794799_16281266ae_c.jpg b/src/dataset/rose/18514794799_16281266ae_c.jpg new file mode 100644 index 00000000..75d39af8 Binary files /dev/null and b/src/dataset/rose/18514794799_16281266ae_c.jpg differ diff --git a/src/dataset/rose/185166267_cc52dccf4c_c.jpg b/src/dataset/rose/185166267_cc52dccf4c_c.jpg new file mode 100644 index 00000000..2a3b35df Binary files /dev/null and b/src/dataset/rose/185166267_cc52dccf4c_c.jpg differ diff --git a/src/dataset/rose/186415192_77e4aabf98_c.jpg b/src/dataset/rose/186415192_77e4aabf98_c.jpg new file mode 100644 index 00000000..f13e2ef3 Binary files /dev/null and b/src/dataset/rose/186415192_77e4aabf98_c.jpg differ diff --git a/src/dataset/rose/18652414308_f10eecbc9a_c.jpg b/src/dataset/rose/18652414308_f10eecbc9a_c.jpg new file mode 100644 index 00000000..86adcd2d Binary files /dev/null and b/src/dataset/rose/18652414308_f10eecbc9a_c.jpg differ diff --git a/src/dataset/rose/18750077020_e8ba53d210_c.jpg b/src/dataset/rose/18750077020_e8ba53d210_c.jpg new file mode 100644 index 00000000..e56f5142 Binary files /dev/null and b/src/dataset/rose/18750077020_e8ba53d210_c.jpg differ diff --git a/src/dataset/rose/19007450594_1bf7927700_c.jpg b/src/dataset/rose/19007450594_1bf7927700_c.jpg new file mode 100644 index 00000000..38b34bff Binary files /dev/null and b/src/dataset/rose/19007450594_1bf7927700_c.jpg differ diff --git a/src/dataset/rose/19275471105_d340266456_c.jpg b/src/dataset/rose/19275471105_d340266456_c.jpg new file mode 100644 index 00000000..ccb36726 Binary files /dev/null and b/src/dataset/rose/19275471105_d340266456_c.jpg differ diff --git a/src/dataset/rose/19317665345_a5d53c2e1b_c.jpg b/src/dataset/rose/19317665345_a5d53c2e1b_c.jpg new file mode 100644 index 00000000..c08e8298 Binary files /dev/null and b/src/dataset/rose/19317665345_a5d53c2e1b_c.jpg differ diff --git a/src/dataset/rose/1936671829_16b7bcb1c3_c.jpg b/src/dataset/rose/1936671829_16b7bcb1c3_c.jpg new file mode 100644 index 00000000..319fc2d0 Binary files /dev/null and b/src/dataset/rose/1936671829_16b7bcb1c3_c.jpg differ diff --git a/src/dataset/rose/19383535005_e621834f69_c.jpg b/src/dataset/rose/19383535005_e621834f69_c.jpg new file mode 100644 index 00000000..8ec69571 Binary files /dev/null and b/src/dataset/rose/19383535005_e621834f69_c.jpg differ diff --git a/src/dataset/rose/19488233335_c5924d2f37_c.jpg b/src/dataset/rose/19488233335_c5924d2f37_c.jpg new file mode 100644 index 00000000..88a4885f Binary files /dev/null and b/src/dataset/rose/19488233335_c5924d2f37_c.jpg differ diff --git a/src/dataset/rose/19539167363_7c751045ab_c.jpg b/src/dataset/rose/19539167363_7c751045ab_c.jpg new file mode 100644 index 00000000..132dcbe5 Binary files /dev/null and b/src/dataset/rose/19539167363_7c751045ab_c.jpg differ diff --git a/src/dataset/rose/19578459688_9711391b10_c.jpg b/src/dataset/rose/19578459688_9711391b10_c.jpg new file mode 100644 index 00000000..d5bd6e32 Binary files /dev/null and b/src/dataset/rose/19578459688_9711391b10_c.jpg differ diff --git a/src/dataset/rose/19590323778_b3a21bf062_c.jpg b/src/dataset/rose/19590323778_b3a21bf062_c.jpg new file mode 100644 index 00000000..69e01d1d Binary files /dev/null and b/src/dataset/rose/19590323778_b3a21bf062_c.jpg differ diff --git a/src/dataset/rose/19911901939_203df78845_c.jpg b/src/dataset/rose/19911901939_203df78845_c.jpg new file mode 100644 index 00000000..399aec57 Binary files /dev/null and b/src/dataset/rose/19911901939_203df78845_c.jpg differ diff --git a/src/dataset/rose/19972099038_f07285fbd7_c.jpg b/src/dataset/rose/19972099038_f07285fbd7_c.jpg new file mode 100644 index 00000000..8c234612 Binary files /dev/null and b/src/dataset/rose/19972099038_f07285fbd7_c.jpg differ diff --git a/src/dataset/rose/20018037665_61c39ffe84_c.jpg b/src/dataset/rose/20018037665_61c39ffe84_c.jpg new file mode 100644 index 00000000..95ca47d2 Binary files /dev/null and b/src/dataset/rose/20018037665_61c39ffe84_c.jpg differ diff --git a/src/dataset/rose/20210799278_7fd1fd094e_c.jpg b/src/dataset/rose/20210799278_7fd1fd094e_c.jpg new file mode 100644 index 00000000..d6f63573 Binary files /dev/null and b/src/dataset/rose/20210799278_7fd1fd094e_c.jpg differ diff --git a/src/dataset/rose/20404145199_71b7de8436_c.jpg b/src/dataset/rose/20404145199_71b7de8436_c.jpg new file mode 100644 index 00000000..6e36b3f1 Binary files /dev/null and b/src/dataset/rose/20404145199_71b7de8436_c.jpg differ diff --git a/src/dataset/rose/20416656404_10184f67a4_c.jpg b/src/dataset/rose/20416656404_10184f67a4_c.jpg new file mode 100644 index 00000000..36db30f7 Binary files /dev/null and b/src/dataset/rose/20416656404_10184f67a4_c.jpg differ diff --git a/src/dataset/rose/2045513724_c623d90506_c.jpg b/src/dataset/rose/2045513724_c623d90506_c.jpg new file mode 100644 index 00000000..33b95884 Binary files /dev/null and b/src/dataset/rose/2045513724_c623d90506_c.jpg differ diff --git a/src/dataset/rose/20524283050_8422ce270c_c.jpg b/src/dataset/rose/20524283050_8422ce270c_c.jpg new file mode 100644 index 00000000..4bf17e55 Binary files /dev/null and b/src/dataset/rose/20524283050_8422ce270c_c.jpg differ diff --git a/src/dataset/rose/20676959651_77bca9605d_c.jpg b/src/dataset/rose/20676959651_77bca9605d_c.jpg new file mode 100644 index 00000000..594a4eef Binary files /dev/null and b/src/dataset/rose/20676959651_77bca9605d_c.jpg differ diff --git a/src/dataset/rose/20727863642_b5a32441a1_c.jpg b/src/dataset/rose/20727863642_b5a32441a1_c.jpg new file mode 100644 index 00000000..a998fbef Binary files /dev/null and b/src/dataset/rose/20727863642_b5a32441a1_c.jpg differ diff --git a/src/dataset/rose/2080587221_861f79877c_c.jpg b/src/dataset/rose/2080587221_861f79877c_c.jpg new file mode 100644 index 00000000..3c7ae8f7 Binary files /dev/null and b/src/dataset/rose/2080587221_861f79877c_c.jpg differ diff --git a/src/dataset/rose/209475519_6745f77b29_c.jpg b/src/dataset/rose/209475519_6745f77b29_c.jpg new file mode 100644 index 00000000..c755b64b Binary files /dev/null and b/src/dataset/rose/209475519_6745f77b29_c.jpg differ diff --git a/src/dataset/rose/20998499752_8977831072_c.jpg b/src/dataset/rose/20998499752_8977831072_c.jpg new file mode 100644 index 00000000..11b152ec Binary files /dev/null and b/src/dataset/rose/20998499752_8977831072_c.jpg differ diff --git a/src/dataset/rose/21058003722_b429b2eaed_c.jpg b/src/dataset/rose/21058003722_b429b2eaed_c.jpg new file mode 100644 index 00000000..29335568 Binary files /dev/null and b/src/dataset/rose/21058003722_b429b2eaed_c.jpg differ diff --git a/src/dataset/rose/21113296146_ca0fbc6baf_c.jpg b/src/dataset/rose/21113296146_ca0fbc6baf_c.jpg new file mode 100644 index 00000000..f81514e6 Binary files /dev/null and b/src/dataset/rose/21113296146_ca0fbc6baf_c.jpg differ diff --git a/src/dataset/rose/21175691410_306eb948cc_c.jpg b/src/dataset/rose/21175691410_306eb948cc_c.jpg new file mode 100644 index 00000000..31a8381a Binary files /dev/null and b/src/dataset/rose/21175691410_306eb948cc_c.jpg differ diff --git a/src/dataset/rose/21376009918_2c0878338e_c.jpg b/src/dataset/rose/21376009918_2c0878338e_c.jpg new file mode 100644 index 00000000..5afb162c Binary files /dev/null and b/src/dataset/rose/21376009918_2c0878338e_c.jpg differ diff --git a/src/dataset/rose/21608681888_0aaf50f419_c.jpg b/src/dataset/rose/21608681888_0aaf50f419_c.jpg new file mode 100644 index 00000000..15bdf597 Binary files /dev/null and b/src/dataset/rose/21608681888_0aaf50f419_c.jpg differ diff --git a/src/dataset/rose/21645654968_994b86d5db_c.jpg b/src/dataset/rose/21645654968_994b86d5db_c.jpg new file mode 100644 index 00000000..6c43dbd6 Binary files /dev/null and b/src/dataset/rose/21645654968_994b86d5db_c.jpg differ diff --git a/src/dataset/rose/21736791914_ca42637e7a_c.jpg b/src/dataset/rose/21736791914_ca42637e7a_c.jpg new file mode 100644 index 00000000..af576f10 Binary files /dev/null and b/src/dataset/rose/21736791914_ca42637e7a_c.jpg differ diff --git a/src/dataset/rose/21796477832_a2fd34bb66_c.jpg b/src/dataset/rose/21796477832_a2fd34bb66_c.jpg new file mode 100644 index 00000000..d4eab8a2 Binary files /dev/null and b/src/dataset/rose/21796477832_a2fd34bb66_c.jpg differ diff --git a/src/dataset/rose/22119416343_2ee64868d7_c.jpg b/src/dataset/rose/22119416343_2ee64868d7_c.jpg new file mode 100644 index 00000000..4f014030 Binary files /dev/null and b/src/dataset/rose/22119416343_2ee64868d7_c.jpg differ diff --git a/src/dataset/rose/22185900626_216d35e430_c.jpg b/src/dataset/rose/22185900626_216d35e430_c.jpg new file mode 100644 index 00000000..3ee9a3e6 Binary files /dev/null and b/src/dataset/rose/22185900626_216d35e430_c.jpg differ diff --git a/src/dataset/rose/22222379161_40b3088968_c.jpg b/src/dataset/rose/22222379161_40b3088968_c.jpg new file mode 100644 index 00000000..7f9c4a7a Binary files /dev/null and b/src/dataset/rose/22222379161_40b3088968_c.jpg differ diff --git a/src/dataset/rose/223336459_a71b9f1e92_c.jpg b/src/dataset/rose/223336459_a71b9f1e92_c.jpg new file mode 100644 index 00000000..bf0d8f15 Binary files /dev/null and b/src/dataset/rose/223336459_a71b9f1e92_c.jpg differ diff --git a/src/dataset/rose/2234940981_8b7bce343b_c.jpg b/src/dataset/rose/2234940981_8b7bce343b_c.jpg new file mode 100644 index 00000000..b66d0b45 Binary files /dev/null and b/src/dataset/rose/2234940981_8b7bce343b_c.jpg differ diff --git a/src/dataset/rose/2236959607_042732f9ff_c.jpg b/src/dataset/rose/2236959607_042732f9ff_c.jpg new file mode 100644 index 00000000..85db717d Binary files /dev/null and b/src/dataset/rose/2236959607_042732f9ff_c.jpg differ diff --git a/src/dataset/rose/2245020350_06d5bea8a9_c.jpg b/src/dataset/rose/2245020350_06d5bea8a9_c.jpg new file mode 100644 index 00000000..013d9723 Binary files /dev/null and b/src/dataset/rose/2245020350_06d5bea8a9_c.jpg differ diff --git a/src/dataset/rose/2247847517_16039f8252_c.jpg b/src/dataset/rose/2247847517_16039f8252_c.jpg new file mode 100644 index 00000000..cdd21acf Binary files /dev/null and b/src/dataset/rose/2247847517_16039f8252_c.jpg differ diff --git a/src/dataset/rose/22504198392_fc4eff37ae_c.jpg b/src/dataset/rose/22504198392_fc4eff37ae_c.jpg new file mode 100644 index 00000000..4baa2cea Binary files /dev/null and b/src/dataset/rose/22504198392_fc4eff37ae_c.jpg differ diff --git a/src/dataset/rose/22515218314_1e6880d432_c.jpg b/src/dataset/rose/22515218314_1e6880d432_c.jpg new file mode 100644 index 00000000..f1816c8c Binary files /dev/null and b/src/dataset/rose/22515218314_1e6880d432_c.jpg differ diff --git a/src/dataset/rose/2266710965_9cdc688071_c.jpg b/src/dataset/rose/2266710965_9cdc688071_c.jpg new file mode 100644 index 00000000..0dffb571 Binary files /dev/null and b/src/dataset/rose/2266710965_9cdc688071_c.jpg differ diff --git a/src/dataset/rose/2270832406_cc331185c5_c.jpg b/src/dataset/rose/2270832406_cc331185c5_c.jpg new file mode 100644 index 00000000..ad752027 Binary files /dev/null and b/src/dataset/rose/2270832406_cc331185c5_c.jpg differ diff --git a/src/dataset/rose/2277130885_3d7d4785f9_c.jpg b/src/dataset/rose/2277130885_3d7d4785f9_c.jpg new file mode 100644 index 00000000..7f8687e2 Binary files /dev/null and b/src/dataset/rose/2277130885_3d7d4785f9_c.jpg differ diff --git a/src/dataset/rose/22781303545_e35882daf5_c.jpg b/src/dataset/rose/22781303545_e35882daf5_c.jpg new file mode 100644 index 00000000..f7fcf368 Binary files /dev/null and b/src/dataset/rose/22781303545_e35882daf5_c.jpg differ diff --git a/src/dataset/rose/2282417084_5af7e5cefe_c.jpg b/src/dataset/rose/2282417084_5af7e5cefe_c.jpg new file mode 100644 index 00000000..1ca3524d Binary files /dev/null and b/src/dataset/rose/2282417084_5af7e5cefe_c.jpg differ diff --git a/src/dataset/rose/22837297404_7aaa9d170e_c.jpg b/src/dataset/rose/22837297404_7aaa9d170e_c.jpg new file mode 100644 index 00000000..0de08e0a Binary files /dev/null and b/src/dataset/rose/22837297404_7aaa9d170e_c.jpg differ diff --git a/src/dataset/rose/22984741994_fef31f7014_c.jpg b/src/dataset/rose/22984741994_fef31f7014_c.jpg new file mode 100644 index 00000000..9a2bd097 Binary files /dev/null and b/src/dataset/rose/22984741994_fef31f7014_c.jpg differ diff --git a/src/dataset/rose/23278059805_5fc2ddf144_c.jpg b/src/dataset/rose/23278059805_5fc2ddf144_c.jpg new file mode 100644 index 00000000..21897b50 Binary files /dev/null and b/src/dataset/rose/23278059805_5fc2ddf144_c.jpg differ diff --git a/src/dataset/rose/23288604480_33018539b6_c.jpg b/src/dataset/rose/23288604480_33018539b6_c.jpg new file mode 100644 index 00000000..b8db5bd0 Binary files /dev/null and b/src/dataset/rose/23288604480_33018539b6_c.jpg differ diff --git a/src/dataset/rose/23291435451_2d1c153e8b_c.jpg b/src/dataset/rose/23291435451_2d1c153e8b_c.jpg new file mode 100644 index 00000000..f9ed4372 Binary files /dev/null and b/src/dataset/rose/23291435451_2d1c153e8b_c.jpg differ diff --git a/src/dataset/rose/23361761853_132a147b6b_c.jpg b/src/dataset/rose/23361761853_132a147b6b_c.jpg new file mode 100644 index 00000000..5963902c Binary files /dev/null and b/src/dataset/rose/23361761853_132a147b6b_c.jpg differ diff --git a/src/dataset/rose/23541704336_488ba53b83_c.jpg b/src/dataset/rose/23541704336_488ba53b83_c.jpg new file mode 100644 index 00000000..d8fac56a Binary files /dev/null and b/src/dataset/rose/23541704336_488ba53b83_c.jpg differ diff --git a/src/dataset/rose/23604296880_c02ab72692_c.jpg b/src/dataset/rose/23604296880_c02ab72692_c.jpg new file mode 100644 index 00000000..89b6d535 Binary files /dev/null and b/src/dataset/rose/23604296880_c02ab72692_c.jpg differ diff --git a/src/dataset/rose/23780970139_fc490cacf8_c.jpg b/src/dataset/rose/23780970139_fc490cacf8_c.jpg new file mode 100644 index 00000000..ad978a33 Binary files /dev/null and b/src/dataset/rose/23780970139_fc490cacf8_c.jpg differ diff --git a/src/dataset/rose/23860547783_61e81b3ea2_c.jpg b/src/dataset/rose/23860547783_61e81b3ea2_c.jpg new file mode 100644 index 00000000..d2d44d3b Binary files /dev/null and b/src/dataset/rose/23860547783_61e81b3ea2_c.jpg differ diff --git a/src/dataset/rose/23874633440_0844dd66bd_c.jpg b/src/dataset/rose/23874633440_0844dd66bd_c.jpg new file mode 100644 index 00000000..de6610b7 Binary files /dev/null and b/src/dataset/rose/23874633440_0844dd66bd_c.jpg differ diff --git a/src/dataset/rose/23878760385_d43b3fab9e_c.jpg b/src/dataset/rose/23878760385_d43b3fab9e_c.jpg new file mode 100644 index 00000000..e096ee9c Binary files /dev/null and b/src/dataset/rose/23878760385_d43b3fab9e_c.jpg differ diff --git a/src/dataset/rose/23994135190_66c703fd46_c.jpg b/src/dataset/rose/23994135190_66c703fd46_c.jpg new file mode 100644 index 00000000..83f04111 Binary files /dev/null and b/src/dataset/rose/23994135190_66c703fd46_c.jpg differ diff --git a/src/dataset/rose/2411509617_196f682dfe_c.jpg b/src/dataset/rose/2411509617_196f682dfe_c.jpg new file mode 100644 index 00000000..e61b2d47 Binary files /dev/null and b/src/dataset/rose/2411509617_196f682dfe_c.jpg differ diff --git a/src/dataset/rose/24143852341_2c8bb62072_c.jpg b/src/dataset/rose/24143852341_2c8bb62072_c.jpg new file mode 100644 index 00000000..37fc050a Binary files /dev/null and b/src/dataset/rose/24143852341_2c8bb62072_c.jpg differ diff --git a/src/dataset/rose/24191619180_0af0829978_c.jpg b/src/dataset/rose/24191619180_0af0829978_c.jpg new file mode 100644 index 00000000..fb6f4a0d Binary files /dev/null and b/src/dataset/rose/24191619180_0af0829978_c.jpg differ diff --git a/src/dataset/rose/24245728128_1a3f278044_c.jpg b/src/dataset/rose/24245728128_1a3f278044_c.jpg new file mode 100644 index 00000000..22ce5420 Binary files /dev/null and b/src/dataset/rose/24245728128_1a3f278044_c.jpg differ diff --git a/src/dataset/rose/24321904043_5c7afe22fb_c.jpg b/src/dataset/rose/24321904043_5c7afe22fb_c.jpg new file mode 100644 index 00000000..600a5ed4 Binary files /dev/null and b/src/dataset/rose/24321904043_5c7afe22fb_c.jpg differ diff --git a/src/dataset/rose/24346787480_cb0bb7a461_c.jpg b/src/dataset/rose/24346787480_cb0bb7a461_c.jpg new file mode 100644 index 00000000..1628889c Binary files /dev/null and b/src/dataset/rose/24346787480_cb0bb7a461_c.jpg differ diff --git a/src/dataset/rose/2435039655_a231c16b84_c.jpg b/src/dataset/rose/2435039655_a231c16b84_c.jpg new file mode 100644 index 00000000..530d9268 Binary files /dev/null and b/src/dataset/rose/2435039655_a231c16b84_c.jpg differ diff --git a/src/dataset/rose/2440006060_be1a7028e4_c.jpg b/src/dataset/rose/2440006060_be1a7028e4_c.jpg new file mode 100644 index 00000000..2f113ead Binary files /dev/null and b/src/dataset/rose/2440006060_be1a7028e4_c.jpg differ diff --git a/src/dataset/rose/2452729496_35f1f1ee4c_c.jpg b/src/dataset/rose/2452729496_35f1f1ee4c_c.jpg new file mode 100644 index 00000000..4a1c12b3 Binary files /dev/null and b/src/dataset/rose/2452729496_35f1f1ee4c_c.jpg differ diff --git a/src/dataset/rose/24573581100_bbbca17a00_c.jpg b/src/dataset/rose/24573581100_bbbca17a00_c.jpg new file mode 100644 index 00000000..9e5e135e Binary files /dev/null and b/src/dataset/rose/24573581100_bbbca17a00_c.jpg differ diff --git a/src/dataset/rose/2458241573_ed0d96b8e8_c.jpg b/src/dataset/rose/2458241573_ed0d96b8e8_c.jpg new file mode 100644 index 00000000..38de401c Binary files /dev/null and b/src/dataset/rose/2458241573_ed0d96b8e8_c.jpg differ diff --git a/src/dataset/rose/2458241657_291e6cc81e_c.jpg b/src/dataset/rose/2458241657_291e6cc81e_c.jpg new file mode 100644 index 00000000..a3a12e31 Binary files /dev/null and b/src/dataset/rose/2458241657_291e6cc81e_c.jpg differ diff --git a/src/dataset/rose/2458241711_f23334b8da_c.jpg b/src/dataset/rose/2458241711_f23334b8da_c.jpg new file mode 100644 index 00000000..792d2220 Binary files /dev/null and b/src/dataset/rose/2458241711_f23334b8da_c.jpg differ diff --git a/src/dataset/rose/24686794682_25852c29f5_c.jpg b/src/dataset/rose/24686794682_25852c29f5_c.jpg new file mode 100644 index 00000000..46cc61a8 Binary files /dev/null and b/src/dataset/rose/24686794682_25852c29f5_c.jpg differ diff --git a/src/dataset/rose/24726776218_cf5bc0d7ab_c.jpg b/src/dataset/rose/24726776218_cf5bc0d7ab_c.jpg new file mode 100644 index 00000000..897a8968 Binary files /dev/null and b/src/dataset/rose/24726776218_cf5bc0d7ab_c.jpg differ diff --git a/src/dataset/rose/2473575245_bd587a1718_c.jpg b/src/dataset/rose/2473575245_bd587a1718_c.jpg new file mode 100644 index 00000000..c35bc406 Binary files /dev/null and b/src/dataset/rose/2473575245_bd587a1718_c.jpg differ diff --git a/src/dataset/rose/2476522560_7e3eee325f_c.jpg b/src/dataset/rose/2476522560_7e3eee325f_c.jpg new file mode 100644 index 00000000..49772a12 Binary files /dev/null and b/src/dataset/rose/2476522560_7e3eee325f_c.jpg differ diff --git a/src/dataset/rose/2476522664_1e7c8b1c84_c.jpg b/src/dataset/rose/2476522664_1e7c8b1c84_c.jpg new file mode 100644 index 00000000..7612de8e Binary files /dev/null and b/src/dataset/rose/2476522664_1e7c8b1c84_c.jpg differ diff --git a/src/dataset/rose/2479428247_d3abc6d6a7_c.jpg b/src/dataset/rose/2479428247_d3abc6d6a7_c.jpg new file mode 100644 index 00000000..88e7c71b Binary files /dev/null and b/src/dataset/rose/2479428247_d3abc6d6a7_c.jpg differ diff --git a/src/dataset/rose/2479521745_9675204ca4_c.jpg b/src/dataset/rose/2479521745_9675204ca4_c.jpg new file mode 100644 index 00000000..5a526af2 Binary files /dev/null and b/src/dataset/rose/2479521745_9675204ca4_c.jpg differ diff --git a/src/dataset/rose/2479522219_878c507df1_c.jpg b/src/dataset/rose/2479522219_878c507df1_c.jpg new file mode 100644 index 00000000..ba29b0d3 Binary files /dev/null and b/src/dataset/rose/2479522219_878c507df1_c.jpg differ diff --git a/src/dataset/rose/2479522473_d14047b437_c.jpg b/src/dataset/rose/2479522473_d14047b437_c.jpg new file mode 100644 index 00000000..0e55b536 Binary files /dev/null and b/src/dataset/rose/2479522473_d14047b437_c.jpg differ diff --git a/src/dataset/rose/2479524637_509c3dcf38_c.jpg b/src/dataset/rose/2479524637_509c3dcf38_c.jpg new file mode 100644 index 00000000..b9d17c11 Binary files /dev/null and b/src/dataset/rose/2479524637_509c3dcf38_c.jpg differ diff --git a/src/dataset/rose/2479527497_5881058d84_c.jpg b/src/dataset/rose/2479527497_5881058d84_c.jpg new file mode 100644 index 00000000..6a330f13 Binary files /dev/null and b/src/dataset/rose/2479527497_5881058d84_c.jpg differ diff --git a/src/dataset/rose/2479527829_bdffe55ec7_c.jpg b/src/dataset/rose/2479527829_bdffe55ec7_c.jpg new file mode 100644 index 00000000..1cc09441 Binary files /dev/null and b/src/dataset/rose/2479527829_bdffe55ec7_c.jpg differ diff --git a/src/dataset/rose/2479527937_9bc6791df1_c.jpg b/src/dataset/rose/2479527937_9bc6791df1_c.jpg new file mode 100644 index 00000000..7dde0cd5 Binary files /dev/null and b/src/dataset/rose/2479527937_9bc6791df1_c.jpg differ diff --git a/src/dataset/rose/2479528029_10ddbaf056_c.jpg b/src/dataset/rose/2479528029_10ddbaf056_c.jpg new file mode 100644 index 00000000..bac7d31f Binary files /dev/null and b/src/dataset/rose/2479528029_10ddbaf056_c.jpg differ diff --git a/src/dataset/rose/2479528483_53e611b8e5_c.jpg b/src/dataset/rose/2479528483_53e611b8e5_c.jpg new file mode 100644 index 00000000..8dbd766a Binary files /dev/null and b/src/dataset/rose/2479528483_53e611b8e5_c.jpg differ diff --git a/src/dataset/rose/2480336582_a8ca1752ba_c.jpg b/src/dataset/rose/2480336582_a8ca1752ba_c.jpg new file mode 100644 index 00000000..babc763c Binary files /dev/null and b/src/dataset/rose/2480336582_a8ca1752ba_c.jpg differ diff --git a/src/dataset/rose/2480336660_71f0182835_c.jpg b/src/dataset/rose/2480336660_71f0182835_c.jpg new file mode 100644 index 00000000..5068b3c8 Binary files /dev/null and b/src/dataset/rose/2480336660_71f0182835_c.jpg differ diff --git a/src/dataset/rose/2480336812_58ec6089ea_c.jpg b/src/dataset/rose/2480336812_58ec6089ea_c.jpg new file mode 100644 index 00000000..d812b3b6 Binary files /dev/null and b/src/dataset/rose/2480336812_58ec6089ea_c.jpg differ diff --git a/src/dataset/rose/2480336960_bacc1b0cf2_c.jpg b/src/dataset/rose/2480336960_bacc1b0cf2_c.jpg new file mode 100644 index 00000000..9a0325f4 Binary files /dev/null and b/src/dataset/rose/2480336960_bacc1b0cf2_c.jpg differ diff --git a/src/dataset/rose/2480337034_f4c8b18ee5_c.jpg b/src/dataset/rose/2480337034_f4c8b18ee5_c.jpg new file mode 100644 index 00000000..6d5c353c Binary files /dev/null and b/src/dataset/rose/2480337034_f4c8b18ee5_c.jpg differ diff --git a/src/dataset/rose/2480337102_9e9e97b60f_c.jpg b/src/dataset/rose/2480337102_9e9e97b60f_c.jpg new file mode 100644 index 00000000..05801d45 Binary files /dev/null and b/src/dataset/rose/2480337102_9e9e97b60f_c.jpg differ diff --git a/src/dataset/rose/2480337460_c298544b81_c.jpg b/src/dataset/rose/2480337460_c298544b81_c.jpg new file mode 100644 index 00000000..7c7ced44 Binary files /dev/null and b/src/dataset/rose/2480337460_c298544b81_c.jpg differ diff --git a/src/dataset/rose/2480337552_85685831bd_c.jpg b/src/dataset/rose/2480337552_85685831bd_c.jpg new file mode 100644 index 00000000..687cf8be Binary files /dev/null and b/src/dataset/rose/2480337552_85685831bd_c.jpg differ diff --git a/src/dataset/rose/2480339354_a3869fa865_c.jpg b/src/dataset/rose/2480339354_a3869fa865_c.jpg new file mode 100644 index 00000000..06c44a6d Binary files /dev/null and b/src/dataset/rose/2480339354_a3869fa865_c.jpg differ diff --git a/src/dataset/rose/2480339412_5216cfc543_c.jpg b/src/dataset/rose/2480339412_5216cfc543_c.jpg new file mode 100644 index 00000000..5ba970ee Binary files /dev/null and b/src/dataset/rose/2480339412_5216cfc543_c.jpg differ diff --git a/src/dataset/rose/2480339494_b8fc86f3e9_c.jpg b/src/dataset/rose/2480339494_b8fc86f3e9_c.jpg new file mode 100644 index 00000000..d79ea521 Binary files /dev/null and b/src/dataset/rose/2480339494_b8fc86f3e9_c.jpg differ diff --git a/src/dataset/rose/2480339574_72cb579615_c.jpg b/src/dataset/rose/2480339574_72cb579615_c.jpg new file mode 100644 index 00000000..6b405010 Binary files /dev/null and b/src/dataset/rose/2480339574_72cb579615_c.jpg differ diff --git a/src/dataset/rose/2480339642_f415daf9f6_c.jpg b/src/dataset/rose/2480339642_f415daf9f6_c.jpg new file mode 100644 index 00000000..6fb43fd7 Binary files /dev/null and b/src/dataset/rose/2480339642_f415daf9f6_c.jpg differ diff --git a/src/dataset/rose/2480339720_a769f1609f_c.jpg b/src/dataset/rose/2480339720_a769f1609f_c.jpg new file mode 100644 index 00000000..7f5fb4b1 Binary files /dev/null and b/src/dataset/rose/2480339720_a769f1609f_c.jpg differ diff --git a/src/dataset/rose/2480339898_a51209c653_c.jpg b/src/dataset/rose/2480339898_a51209c653_c.jpg new file mode 100644 index 00000000..2d174af3 Binary files /dev/null and b/src/dataset/rose/2480339898_a51209c653_c.jpg differ diff --git a/src/dataset/rose/2480339968_395faf3c8c_c.jpg b/src/dataset/rose/2480339968_395faf3c8c_c.jpg new file mode 100644 index 00000000..4c97bbf5 Binary files /dev/null and b/src/dataset/rose/2480339968_395faf3c8c_c.jpg differ diff --git a/src/dataset/rose/2480340048_45fc7e70e8_c.jpg b/src/dataset/rose/2480340048_45fc7e70e8_c.jpg new file mode 100644 index 00000000..91be35cb Binary files /dev/null and b/src/dataset/rose/2480340048_45fc7e70e8_c.jpg differ diff --git a/src/dataset/rose/2480340274_47162a1476_c.jpg b/src/dataset/rose/2480340274_47162a1476_c.jpg new file mode 100644 index 00000000..6ab26889 Binary files /dev/null and b/src/dataset/rose/2480340274_47162a1476_c.jpg differ diff --git a/src/dataset/rose/2480340422_fc68c6e9bf_c.jpg b/src/dataset/rose/2480340422_fc68c6e9bf_c.jpg new file mode 100644 index 00000000..0ec8f860 Binary files /dev/null and b/src/dataset/rose/2480340422_fc68c6e9bf_c.jpg differ diff --git a/src/dataset/rose/2480343052_ddd3fedd53_c.jpg b/src/dataset/rose/2480343052_ddd3fedd53_c.jpg new file mode 100644 index 00000000..92dd1ef4 Binary files /dev/null and b/src/dataset/rose/2480343052_ddd3fedd53_c.jpg differ diff --git a/src/dataset/rose/2480343554_9183905b47_c.jpg b/src/dataset/rose/2480343554_9183905b47_c.jpg new file mode 100644 index 00000000..a585c4fb Binary files /dev/null and b/src/dataset/rose/2480343554_9183905b47_c.jpg differ diff --git a/src/dataset/rose/2480343660_b4da90926e_c.jpg b/src/dataset/rose/2480343660_b4da90926e_c.jpg new file mode 100644 index 00000000..99d9f68f Binary files /dev/null and b/src/dataset/rose/2480343660_b4da90926e_c.jpg differ diff --git a/src/dataset/rose/2480343746_d94bf025a2_c.jpg b/src/dataset/rose/2480343746_d94bf025a2_c.jpg new file mode 100644 index 00000000..d67c056c Binary files /dev/null and b/src/dataset/rose/2480343746_d94bf025a2_c.jpg differ diff --git a/src/dataset/rose/2480343924_777cac21aa_c.jpg b/src/dataset/rose/2480343924_777cac21aa_c.jpg new file mode 100644 index 00000000..22bd3ba2 Binary files /dev/null and b/src/dataset/rose/2480343924_777cac21aa_c.jpg differ diff --git a/src/dataset/rose/24841052213_90fc2b1046_c.jpg b/src/dataset/rose/24841052213_90fc2b1046_c.jpg new file mode 100644 index 00000000..d4c5358e Binary files /dev/null and b/src/dataset/rose/24841052213_90fc2b1046_c.jpg differ diff --git a/src/dataset/rose/2499298730_0eb61f45af_c.jpg b/src/dataset/rose/2499298730_0eb61f45af_c.jpg new file mode 100644 index 00000000..e42f4f81 Binary files /dev/null and b/src/dataset/rose/2499298730_0eb61f45af_c.jpg differ diff --git a/src/dataset/rose/25036282086_e5a9634785_c.jpg b/src/dataset/rose/25036282086_e5a9634785_c.jpg new file mode 100644 index 00000000..b4fb022a Binary files /dev/null and b/src/dataset/rose/25036282086_e5a9634785_c.jpg differ diff --git a/src/dataset/rose/25050937054_635d9728d6_c.jpg b/src/dataset/rose/25050937054_635d9728d6_c.jpg new file mode 100644 index 00000000..73dbca34 Binary files /dev/null and b/src/dataset/rose/25050937054_635d9728d6_c.jpg differ diff --git a/src/dataset/rose/250569976_8e40f031f2_c.jpg b/src/dataset/rose/250569976_8e40f031f2_c.jpg new file mode 100644 index 00000000..e60acfd6 Binary files /dev/null and b/src/dataset/rose/250569976_8e40f031f2_c.jpg differ diff --git a/src/dataset/rose/25164776416_00acce3e1d_c.jpg b/src/dataset/rose/25164776416_00acce3e1d_c.jpg new file mode 100644 index 00000000..2be27b37 Binary files /dev/null and b/src/dataset/rose/25164776416_00acce3e1d_c.jpg differ diff --git a/src/dataset/rose/2519352934_263ca935a5_c.jpg b/src/dataset/rose/2519352934_263ca935a5_c.jpg new file mode 100644 index 00000000..64d7caa3 Binary files /dev/null and b/src/dataset/rose/2519352934_263ca935a5_c.jpg differ diff --git a/src/dataset/rose/2540551719_8e8b482a88_c.jpg b/src/dataset/rose/2540551719_8e8b482a88_c.jpg new file mode 100644 index 00000000..99b88eb0 Binary files /dev/null and b/src/dataset/rose/2540551719_8e8b482a88_c.jpg differ diff --git a/src/dataset/rose/25606894085_9d578f9174_c.jpg b/src/dataset/rose/25606894085_9d578f9174_c.jpg new file mode 100644 index 00000000..0b5f21e8 Binary files /dev/null and b/src/dataset/rose/25606894085_9d578f9174_c.jpg differ diff --git a/src/dataset/rose/25629411773_a8e71d17f5_c.jpg b/src/dataset/rose/25629411773_a8e71d17f5_c.jpg new file mode 100644 index 00000000..8f65a8e5 Binary files /dev/null and b/src/dataset/rose/25629411773_a8e71d17f5_c.jpg differ diff --git a/src/dataset/rose/2564951771_641001c817_c.jpg b/src/dataset/rose/2564951771_641001c817_c.jpg new file mode 100644 index 00000000..4d73d0af Binary files /dev/null and b/src/dataset/rose/2564951771_641001c817_c.jpg differ diff --git a/src/dataset/rose/2565359593_3a29764961_c.jpg b/src/dataset/rose/2565359593_3a29764961_c.jpg new file mode 100644 index 00000000..eabeab24 Binary files /dev/null and b/src/dataset/rose/2565359593_3a29764961_c.jpg differ diff --git a/src/dataset/rose/2572384330_728e14d562_c.jpg b/src/dataset/rose/2572384330_728e14d562_c.jpg new file mode 100644 index 00000000..5a5a048d Binary files /dev/null and b/src/dataset/rose/2572384330_728e14d562_c.jpg differ diff --git a/src/dataset/rose/2580782531_ca28eb7163_c.jpg b/src/dataset/rose/2580782531_ca28eb7163_c.jpg new file mode 100644 index 00000000..3a4f47ac Binary files /dev/null and b/src/dataset/rose/2580782531_ca28eb7163_c.jpg differ diff --git a/src/dataset/rose/2580784067_e4c929b503_c.jpg b/src/dataset/rose/2580784067_e4c929b503_c.jpg new file mode 100644 index 00000000..49ed6545 Binary files /dev/null and b/src/dataset/rose/2580784067_e4c929b503_c.jpg differ diff --git a/src/dataset/rose/2580948483_5cd06d64cc_c.jpg b/src/dataset/rose/2580948483_5cd06d64cc_c.jpg new file mode 100644 index 00000000..6cbb8c91 Binary files /dev/null and b/src/dataset/rose/2580948483_5cd06d64cc_c.jpg differ diff --git a/src/dataset/rose/2581608446_9aa340ff1c_c.jpg b/src/dataset/rose/2581608446_9aa340ff1c_c.jpg new file mode 100644 index 00000000..09bfbb1e Binary files /dev/null and b/src/dataset/rose/2581608446_9aa340ff1c_c.jpg differ diff --git a/src/dataset/rose/2581615232_2d3e9599b3_c.jpg b/src/dataset/rose/2581615232_2d3e9599b3_c.jpg new file mode 100644 index 00000000..bbf2ada1 Binary files /dev/null and b/src/dataset/rose/2581615232_2d3e9599b3_c.jpg differ diff --git a/src/dataset/rose/2589195814_79a8c93fa0_c.jpg b/src/dataset/rose/2589195814_79a8c93fa0_c.jpg new file mode 100644 index 00000000..957d08b1 Binary files /dev/null and b/src/dataset/rose/2589195814_79a8c93fa0_c.jpg differ diff --git a/src/dataset/rose/259533863_071779e93d_c.jpg b/src/dataset/rose/259533863_071779e93d_c.jpg new file mode 100644 index 00000000..69fc44c0 Binary files /dev/null and b/src/dataset/rose/259533863_071779e93d_c.jpg differ diff --git a/src/dataset/rose/2600697873_b8878658de_c.jpg b/src/dataset/rose/2600697873_b8878658de_c.jpg new file mode 100644 index 00000000..6f604d8d Binary files /dev/null and b/src/dataset/rose/2600697873_b8878658de_c.jpg differ diff --git a/src/dataset/rose/2618242364_c76f60ffb9_c.jpg b/src/dataset/rose/2618242364_c76f60ffb9_c.jpg new file mode 100644 index 00000000..17348155 Binary files /dev/null and b/src/dataset/rose/2618242364_c76f60ffb9_c.jpg differ diff --git a/src/dataset/rose/26293245030_f429362d15_c.jpg b/src/dataset/rose/26293245030_f429362d15_c.jpg new file mode 100644 index 00000000..b3b0fbc5 Binary files /dev/null and b/src/dataset/rose/26293245030_f429362d15_c.jpg differ diff --git a/src/dataset/rose/26364141413_5a0b834126_c.jpg b/src/dataset/rose/26364141413_5a0b834126_c.jpg new file mode 100644 index 00000000..2501ffef Binary files /dev/null and b/src/dataset/rose/26364141413_5a0b834126_c.jpg differ diff --git a/src/dataset/rose/26364622593_35bfcb9695_c.jpg b/src/dataset/rose/26364622593_35bfcb9695_c.jpg new file mode 100644 index 00000000..88a13b71 Binary files /dev/null and b/src/dataset/rose/26364622593_35bfcb9695_c.jpg differ diff --git a/src/dataset/rose/26364622653_8e346c7759_c.jpg b/src/dataset/rose/26364622653_8e346c7759_c.jpg new file mode 100644 index 00000000..f4c53f83 Binary files /dev/null and b/src/dataset/rose/26364622653_8e346c7759_c.jpg differ diff --git a/src/dataset/rose/2636834688_3b9cbeaff3_c.jpg b/src/dataset/rose/2636834688_3b9cbeaff3_c.jpg new file mode 100644 index 00000000..dd6f1cb4 Binary files /dev/null and b/src/dataset/rose/2636834688_3b9cbeaff3_c.jpg differ diff --git a/src/dataset/rose/26416956403_9b719e9791_c.jpg b/src/dataset/rose/26416956403_9b719e9791_c.jpg new file mode 100644 index 00000000..4c3c3013 Binary files /dev/null and b/src/dataset/rose/26416956403_9b719e9791_c.jpg differ diff --git a/src/dataset/rose/26418039544_bc087af79e_c.jpg b/src/dataset/rose/26418039544_bc087af79e_c.jpg new file mode 100644 index 00000000..b0faa3fa Binary files /dev/null and b/src/dataset/rose/26418039544_bc087af79e_c.jpg differ diff --git a/src/dataset/rose/26429548153_17eb8c9ecc_c.jpg b/src/dataset/rose/26429548153_17eb8c9ecc_c.jpg new file mode 100644 index 00000000..1a8f8c65 Binary files /dev/null and b/src/dataset/rose/26429548153_17eb8c9ecc_c.jpg differ diff --git a/src/dataset/rose/26461559223_92f028755f_c.jpg b/src/dataset/rose/26461559223_92f028755f_c.jpg new file mode 100644 index 00000000..c9e1c582 Binary files /dev/null and b/src/dataset/rose/26461559223_92f028755f_c.jpg differ diff --git a/src/dataset/rose/26461559233_1e29598561_c.jpg b/src/dataset/rose/26461559233_1e29598561_c.jpg new file mode 100644 index 00000000..b26642c2 Binary files /dev/null and b/src/dataset/rose/26461559233_1e29598561_c.jpg differ diff --git a/src/dataset/rose/26461559253_01b9e74ba5_c.jpg b/src/dataset/rose/26461559253_01b9e74ba5_c.jpg new file mode 100644 index 00000000..7112c71f Binary files /dev/null and b/src/dataset/rose/26461559253_01b9e74ba5_c.jpg differ diff --git a/src/dataset/rose/26471888213_2f8097ee23_c.jpg b/src/dataset/rose/26471888213_2f8097ee23_c.jpg new file mode 100644 index 00000000..33087326 Binary files /dev/null and b/src/dataset/rose/26471888213_2f8097ee23_c.jpg differ diff --git a/src/dataset/rose/26482975613_32d2b049fc_c.jpg b/src/dataset/rose/26482975613_32d2b049fc_c.jpg new file mode 100644 index 00000000..66acf369 Binary files /dev/null and b/src/dataset/rose/26482975613_32d2b049fc_c.jpg differ diff --git a/src/dataset/rose/26535958414_74228df30a_c.jpg b/src/dataset/rose/26535958414_74228df30a_c.jpg new file mode 100644 index 00000000..eac41d31 Binary files /dev/null and b/src/dataset/rose/26535958414_74228df30a_c.jpg differ diff --git a/src/dataset/rose/26535958444_e62ab9b06f_c.jpg b/src/dataset/rose/26535958444_e62ab9b06f_c.jpg new file mode 100644 index 00000000..e991abb5 Binary files /dev/null and b/src/dataset/rose/26535958444_e62ab9b06f_c.jpg differ diff --git a/src/dataset/rose/26649662544_57ec379f42_c.jpg b/src/dataset/rose/26649662544_57ec379f42_c.jpg new file mode 100644 index 00000000..ceeaebf6 Binary files /dev/null and b/src/dataset/rose/26649662544_57ec379f42_c.jpg differ diff --git a/src/dataset/rose/26649662584_8d540f5e1f_c.jpg b/src/dataset/rose/26649662584_8d540f5e1f_c.jpg new file mode 100644 index 00000000..711ab203 Binary files /dev/null and b/src/dataset/rose/26649662584_8d540f5e1f_c.jpg differ diff --git a/src/dataset/rose/26649662704_2b76b1fccf_c.jpg b/src/dataset/rose/26649662704_2b76b1fccf_c.jpg new file mode 100644 index 00000000..ce98f2bc Binary files /dev/null and b/src/dataset/rose/26649662704_2b76b1fccf_c.jpg differ diff --git a/src/dataset/rose/26692485943_da8f61cecb_c.jpg b/src/dataset/rose/26692485943_da8f61cecb_c.jpg new file mode 100644 index 00000000..fa4eaf9e Binary files /dev/null and b/src/dataset/rose/26692485943_da8f61cecb_c.jpg differ diff --git a/src/dataset/rose/26692486043_e6874c78f8_c.jpg b/src/dataset/rose/26692486043_e6874c78f8_c.jpg new file mode 100644 index 00000000..6aa3a117 Binary files /dev/null and b/src/dataset/rose/26692486043_e6874c78f8_c.jpg differ diff --git a/src/dataset/rose/26704287686_bf1188d00a_c.jpg b/src/dataset/rose/26704287686_bf1188d00a_c.jpg new file mode 100644 index 00000000..04b1d6b3 Binary files /dev/null and b/src/dataset/rose/26704287686_bf1188d00a_c.jpg differ diff --git a/src/dataset/rose/26720380763_be6ef9c599_c.jpg b/src/dataset/rose/26720380763_be6ef9c599_c.jpg new file mode 100644 index 00000000..5af013b8 Binary files /dev/null and b/src/dataset/rose/26720380763_be6ef9c599_c.jpg differ diff --git a/src/dataset/rose/26727723264_a97ea00dc4_c.jpg b/src/dataset/rose/26727723264_a97ea00dc4_c.jpg new file mode 100644 index 00000000..4dbd76e6 Binary files /dev/null and b/src/dataset/rose/26727723264_a97ea00dc4_c.jpg differ diff --git a/src/dataset/rose/2677543481_817c70de13_c.jpg b/src/dataset/rose/2677543481_817c70de13_c.jpg new file mode 100644 index 00000000..72ed1a05 Binary files /dev/null and b/src/dataset/rose/2677543481_817c70de13_c.jpg differ diff --git a/src/dataset/rose/26790802644_babff53fa7_c.jpg b/src/dataset/rose/26790802644_babff53fa7_c.jpg new file mode 100644 index 00000000..55c0e6b1 Binary files /dev/null and b/src/dataset/rose/26790802644_babff53fa7_c.jpg differ diff --git a/src/dataset/rose/26795372474_9532d1c37b_c.jpg b/src/dataset/rose/26795372474_9532d1c37b_c.jpg new file mode 100644 index 00000000..a050eee4 Binary files /dev/null and b/src/dataset/rose/26795372474_9532d1c37b_c.jpg differ diff --git a/src/dataset/rose/26797792131_1b8ba5e203_c.jpg b/src/dataset/rose/26797792131_1b8ba5e203_c.jpg new file mode 100644 index 00000000..16efc815 Binary files /dev/null and b/src/dataset/rose/26797792131_1b8ba5e203_c.jpg differ diff --git a/src/dataset/rose/26826252943_31992826fb_c.jpg b/src/dataset/rose/26826252943_31992826fb_c.jpg new file mode 100644 index 00000000..6df87750 Binary files /dev/null and b/src/dataset/rose/26826252943_31992826fb_c.jpg differ diff --git a/src/dataset/rose/26833044715_d804d60b1b_c.jpg b/src/dataset/rose/26833044715_d804d60b1b_c.jpg new file mode 100644 index 00000000..a8139e0c Binary files /dev/null and b/src/dataset/rose/26833044715_d804d60b1b_c.jpg differ diff --git a/src/dataset/rose/26865317290_a7ed4f67a4_c.jpg b/src/dataset/rose/26865317290_a7ed4f67a4_c.jpg new file mode 100644 index 00000000..3fae9f7c Binary files /dev/null and b/src/dataset/rose/26865317290_a7ed4f67a4_c.jpg differ diff --git a/src/dataset/rose/26874648111_7aa55120ef_c.jpg b/src/dataset/rose/26874648111_7aa55120ef_c.jpg new file mode 100644 index 00000000..2aded586 Binary files /dev/null and b/src/dataset/rose/26874648111_7aa55120ef_c.jpg differ diff --git a/src/dataset/rose/26874925162_4607ca5e69_c.jpg b/src/dataset/rose/26874925162_4607ca5e69_c.jpg new file mode 100644 index 00000000..912362d6 Binary files /dev/null and b/src/dataset/rose/26874925162_4607ca5e69_c.jpg differ diff --git a/src/dataset/rose/26908903852_a989a8b73c_c.jpg b/src/dataset/rose/26908903852_a989a8b73c_c.jpg new file mode 100644 index 00000000..bc148f0f Binary files /dev/null and b/src/dataset/rose/26908903852_a989a8b73c_c.jpg differ diff --git a/src/dataset/rose/26929892086_97be97db34_c.jpg b/src/dataset/rose/26929892086_97be97db34_c.jpg new file mode 100644 index 00000000..03868b1c Binary files /dev/null and b/src/dataset/rose/26929892086_97be97db34_c.jpg differ diff --git a/src/dataset/rose/26929892176_1cd73be785_c.jpg b/src/dataset/rose/26929892176_1cd73be785_c.jpg new file mode 100644 index 00000000..c07963ce Binary files /dev/null and b/src/dataset/rose/26929892176_1cd73be785_c.jpg differ diff --git a/src/dataset/rose/26958733230_efa21b24c2_c.jpg b/src/dataset/rose/26958733230_efa21b24c2_c.jpg new file mode 100644 index 00000000..cb0d1606 Binary files /dev/null and b/src/dataset/rose/26958733230_efa21b24c2_c.jpg differ diff --git a/src/dataset/rose/26959405336_3441bfc075_c.jpg b/src/dataset/rose/26959405336_3441bfc075_c.jpg new file mode 100644 index 00000000..dacc5584 Binary files /dev/null and b/src/dataset/rose/26959405336_3441bfc075_c.jpg differ diff --git a/src/dataset/rose/26975621353_e500ae9ff6_c.jpg b/src/dataset/rose/26975621353_e500ae9ff6_c.jpg new file mode 100644 index 00000000..c8fade8f Binary files /dev/null and b/src/dataset/rose/26975621353_e500ae9ff6_c.jpg differ diff --git a/src/dataset/rose/26990020916_3767054d2b_c.jpg b/src/dataset/rose/26990020916_3767054d2b_c.jpg new file mode 100644 index 00000000..3c686e13 Binary files /dev/null and b/src/dataset/rose/26990020916_3767054d2b_c.jpg differ diff --git a/src/dataset/rose/27010331733_0aab643a36_c.jpg b/src/dataset/rose/27010331733_0aab643a36_c.jpg new file mode 100644 index 00000000..9faf164b Binary files /dev/null and b/src/dataset/rose/27010331733_0aab643a36_c.jpg differ diff --git a/src/dataset/rose/27033836012_4d8808c231_c.jpg b/src/dataset/rose/27033836012_4d8808c231_c.jpg new file mode 100644 index 00000000..a4f1ea65 Binary files /dev/null and b/src/dataset/rose/27033836012_4d8808c231_c.jpg differ diff --git a/src/dataset/rose/27036969281_abea68f113_c.jpg b/src/dataset/rose/27036969281_abea68f113_c.jpg new file mode 100644 index 00000000..64524cc2 Binary files /dev/null and b/src/dataset/rose/27036969281_abea68f113_c.jpg differ diff --git a/src/dataset/rose/27036969291_208beffdd5_c.jpg b/src/dataset/rose/27036969291_208beffdd5_c.jpg new file mode 100644 index 00000000..477ce482 Binary files /dev/null and b/src/dataset/rose/27036969291_208beffdd5_c.jpg differ diff --git a/src/dataset/rose/27041422151_ec881e55c6_c.jpg b/src/dataset/rose/27041422151_ec881e55c6_c.jpg new file mode 100644 index 00000000..bb859958 Binary files /dev/null and b/src/dataset/rose/27041422151_ec881e55c6_c.jpg differ diff --git a/src/dataset/rose/27076574336_1d854d1fd2_c.jpg b/src/dataset/rose/27076574336_1d854d1fd2_c.jpg new file mode 100644 index 00000000..c0b33e2e Binary files /dev/null and b/src/dataset/rose/27076574336_1d854d1fd2_c.jpg differ diff --git a/src/dataset/rose/27090580002_cdb0e32d61_c.jpg b/src/dataset/rose/27090580002_cdb0e32d61_c.jpg new file mode 100644 index 00000000..00d59da8 Binary files /dev/null and b/src/dataset/rose/27090580002_cdb0e32d61_c.jpg differ diff --git a/src/dataset/rose/27123681125_d45b334a94_c.jpg b/src/dataset/rose/27123681125_d45b334a94_c.jpg new file mode 100644 index 00000000..43bc1fd4 Binary files /dev/null and b/src/dataset/rose/27123681125_d45b334a94_c.jpg differ diff --git a/src/dataset/rose/27128674_b07bd9bb38_c.jpg b/src/dataset/rose/27128674_b07bd9bb38_c.jpg new file mode 100644 index 00000000..0719cd1a Binary files /dev/null and b/src/dataset/rose/27128674_b07bd9bb38_c.jpg differ diff --git a/src/dataset/rose/27129494646_21224de72a_c.jpg b/src/dataset/rose/27129494646_21224de72a_c.jpg new file mode 100644 index 00000000..4bbef74f Binary files /dev/null and b/src/dataset/rose/27129494646_21224de72a_c.jpg differ diff --git a/src/dataset/rose/27129494676_454b093094_c.jpg b/src/dataset/rose/27129494676_454b093094_c.jpg new file mode 100644 index 00000000..8902c4cd Binary files /dev/null and b/src/dataset/rose/27129494676_454b093094_c.jpg differ diff --git a/src/dataset/rose/27149131764_0293cd8ab1_c.jpg b/src/dataset/rose/27149131764_0293cd8ab1_c.jpg new file mode 100644 index 00000000..37f264d0 Binary files /dev/null and b/src/dataset/rose/27149131764_0293cd8ab1_c.jpg differ diff --git a/src/dataset/rose/27223705952_f9ab5a75d9_c.jpg b/src/dataset/rose/27223705952_f9ab5a75d9_c.jpg new file mode 100644 index 00000000..f845e215 Binary files /dev/null and b/src/dataset/rose/27223705952_f9ab5a75d9_c.jpg differ diff --git a/src/dataset/rose/27236249566_92118a4eb8_c.jpg b/src/dataset/rose/27236249566_92118a4eb8_c.jpg new file mode 100644 index 00000000..37e79c73 Binary files /dev/null and b/src/dataset/rose/27236249566_92118a4eb8_c.jpg differ diff --git a/src/dataset/rose/27244045456_6d331cc61e_c.jpg b/src/dataset/rose/27244045456_6d331cc61e_c.jpg new file mode 100644 index 00000000..0213959a Binary files /dev/null and b/src/dataset/rose/27244045456_6d331cc61e_c.jpg differ diff --git a/src/dataset/rose/2724899750_49641ac717_c.jpg b/src/dataset/rose/2724899750_49641ac717_c.jpg new file mode 100644 index 00000000..37b50980 Binary files /dev/null and b/src/dataset/rose/2724899750_49641ac717_c.jpg differ diff --git a/src/dataset/rose/27258090010_cebdb8ebb7_c.jpg b/src/dataset/rose/27258090010_cebdb8ebb7_c.jpg new file mode 100644 index 00000000..3aef2540 Binary files /dev/null and b/src/dataset/rose/27258090010_cebdb8ebb7_c.jpg differ diff --git a/src/dataset/rose/27258090030_2b0a5f8bc3_c.jpg b/src/dataset/rose/27258090030_2b0a5f8bc3_c.jpg new file mode 100644 index 00000000..669bed7e Binary files /dev/null and b/src/dataset/rose/27258090030_2b0a5f8bc3_c.jpg differ diff --git a/src/dataset/rose/27267493383_5de49a0169_c.jpg b/src/dataset/rose/27267493383_5de49a0169_c.jpg new file mode 100644 index 00000000..4aa646be Binary files /dev/null and b/src/dataset/rose/27267493383_5de49a0169_c.jpg differ diff --git a/src/dataset/rose/27287844164_e638f83ff8_c.jpg b/src/dataset/rose/27287844164_e638f83ff8_c.jpg new file mode 100644 index 00000000..dac6ef99 Binary files /dev/null and b/src/dataset/rose/27287844164_e638f83ff8_c.jpg differ diff --git a/src/dataset/rose/27321025035_de9321aeb1_c.jpg b/src/dataset/rose/27321025035_de9321aeb1_c.jpg new file mode 100644 index 00000000..f06cd124 Binary files /dev/null and b/src/dataset/rose/27321025035_de9321aeb1_c.jpg differ diff --git a/src/dataset/rose/2738662757_18aca3f6b2_c.jpg b/src/dataset/rose/2738662757_18aca3f6b2_c.jpg new file mode 100644 index 00000000..8bfb9ee0 Binary files /dev/null and b/src/dataset/rose/2738662757_18aca3f6b2_c.jpg differ diff --git a/src/dataset/rose/2739757169_d813386605_c.jpg b/src/dataset/rose/2739757169_d813386605_c.jpg new file mode 100644 index 00000000..f2b58a24 Binary files /dev/null and b/src/dataset/rose/2739757169_d813386605_c.jpg differ diff --git a/src/dataset/rose/27402987200_3c019d9133_c.jpg b/src/dataset/rose/27402987200_3c019d9133_c.jpg new file mode 100644 index 00000000..4ce7ea99 Binary files /dev/null and b/src/dataset/rose/27402987200_3c019d9133_c.jpg differ diff --git a/src/dataset/rose/27458258277_4c809076e4_c.jpg b/src/dataset/rose/27458258277_4c809076e4_c.jpg new file mode 100644 index 00000000..765f860a Binary files /dev/null and b/src/dataset/rose/27458258277_4c809076e4_c.jpg differ diff --git a/src/dataset/rose/27486136015_d93d3b14e6_c.jpg b/src/dataset/rose/27486136015_d93d3b14e6_c.jpg new file mode 100644 index 00000000..9a3cdb93 Binary files /dev/null and b/src/dataset/rose/27486136015_d93d3b14e6_c.jpg differ diff --git a/src/dataset/rose/27488743173_93649f1788_c.jpg b/src/dataset/rose/27488743173_93649f1788_c.jpg new file mode 100644 index 00000000..accabd60 Binary files /dev/null and b/src/dataset/rose/27488743173_93649f1788_c.jpg differ diff --git a/src/dataset/rose/27508072155_4cb5a25e35_c.jpg b/src/dataset/rose/27508072155_4cb5a25e35_c.jpg new file mode 100644 index 00000000..f5fe88ae Binary files /dev/null and b/src/dataset/rose/27508072155_4cb5a25e35_c.jpg differ diff --git a/src/dataset/rose/27532881000_6e2f3fb5c4_c.jpg b/src/dataset/rose/27532881000_6e2f3fb5c4_c.jpg new file mode 100644 index 00000000..57b6ca7b Binary files /dev/null and b/src/dataset/rose/27532881000_6e2f3fb5c4_c.jpg differ diff --git a/src/dataset/rose/27544093262_2a5d597494_c.jpg b/src/dataset/rose/27544093262_2a5d597494_c.jpg new file mode 100644 index 00000000..04a9b571 Binary files /dev/null and b/src/dataset/rose/27544093262_2a5d597494_c.jpg differ diff --git a/src/dataset/rose/27559704785_e8cd0a7a59_c.jpg b/src/dataset/rose/27559704785_e8cd0a7a59_c.jpg new file mode 100644 index 00000000..661f5e2e Binary files /dev/null and b/src/dataset/rose/27559704785_e8cd0a7a59_c.jpg differ diff --git a/src/dataset/rose/27585549694_dc2b4aca28_c.jpg b/src/dataset/rose/27585549694_dc2b4aca28_c.jpg new file mode 100644 index 00000000..6224df43 Binary files /dev/null and b/src/dataset/rose/27585549694_dc2b4aca28_c.jpg differ diff --git a/src/dataset/rose/27590987_7d079605e3_c.jpg b/src/dataset/rose/27590987_7d079605e3_c.jpg new file mode 100644 index 00000000..93fbf8f2 Binary files /dev/null and b/src/dataset/rose/27590987_7d079605e3_c.jpg differ diff --git a/src/dataset/rose/2759224367_bbffcb8be8_c.jpg b/src/dataset/rose/2759224367_bbffcb8be8_c.jpg new file mode 100644 index 00000000..8930401b Binary files /dev/null and b/src/dataset/rose/2759224367_bbffcb8be8_c.jpg differ diff --git a/src/dataset/rose/2760604717_c750ba2b66_c.jpg b/src/dataset/rose/2760604717_c750ba2b66_c.jpg new file mode 100644 index 00000000..de91355e Binary files /dev/null and b/src/dataset/rose/2760604717_c750ba2b66_c.jpg differ diff --git a/src/dataset/rose/27650753651_62a8d4b0f5_c.jpg b/src/dataset/rose/27650753651_62a8d4b0f5_c.jpg new file mode 100644 index 00000000..051fa271 Binary files /dev/null and b/src/dataset/rose/27650753651_62a8d4b0f5_c.jpg differ diff --git a/src/dataset/rose/27659270112_53fcb13434_c.jpg b/src/dataset/rose/27659270112_53fcb13434_c.jpg new file mode 100644 index 00000000..f2487957 Binary files /dev/null and b/src/dataset/rose/27659270112_53fcb13434_c.jpg differ diff --git a/src/dataset/rose/27673197840_8390b137f2_c.jpg b/src/dataset/rose/27673197840_8390b137f2_c.jpg new file mode 100644 index 00000000..cc8f3823 Binary files /dev/null and b/src/dataset/rose/27673197840_8390b137f2_c.jpg differ diff --git a/src/dataset/rose/27699273346_5f90d91e79_c.jpg b/src/dataset/rose/27699273346_5f90d91e79_c.jpg new file mode 100644 index 00000000..e6b9fba8 Binary files /dev/null and b/src/dataset/rose/27699273346_5f90d91e79_c.jpg differ diff --git a/src/dataset/rose/27729230372_47a8a05c2d_c.jpg b/src/dataset/rose/27729230372_47a8a05c2d_c.jpg new file mode 100644 index 00000000..d4b92a0b Binary files /dev/null and b/src/dataset/rose/27729230372_47a8a05c2d_c.jpg differ diff --git a/src/dataset/rose/27771478265_8d23eaca6a_c.jpg b/src/dataset/rose/27771478265_8d23eaca6a_c.jpg new file mode 100644 index 00000000..99098fc5 Binary files /dev/null and b/src/dataset/rose/27771478265_8d23eaca6a_c.jpg differ diff --git a/src/dataset/rose/27819339721_947be4ac4b_c.jpg b/src/dataset/rose/27819339721_947be4ac4b_c.jpg new file mode 100644 index 00000000..02a75c80 Binary files /dev/null and b/src/dataset/rose/27819339721_947be4ac4b_c.jpg differ diff --git a/src/dataset/rose/27885929180_98428fe3d5_c.jpg b/src/dataset/rose/27885929180_98428fe3d5_c.jpg new file mode 100644 index 00000000..580e59e9 Binary files /dev/null and b/src/dataset/rose/27885929180_98428fe3d5_c.jpg differ diff --git a/src/dataset/rose/27976191426_9dbbcb8db5_c.jpg b/src/dataset/rose/27976191426_9dbbcb8db5_c.jpg new file mode 100644 index 00000000..489d89a6 Binary files /dev/null and b/src/dataset/rose/27976191426_9dbbcb8db5_c.jpg differ diff --git a/src/dataset/rose/2799744525_c10913bc48_c.jpg b/src/dataset/rose/2799744525_c10913bc48_c.jpg new file mode 100644 index 00000000..cefa4c43 Binary files /dev/null and b/src/dataset/rose/2799744525_c10913bc48_c.jpg differ diff --git a/src/dataset/rose/28029514230_f4e00768b5_c.jpg b/src/dataset/rose/28029514230_f4e00768b5_c.jpg new file mode 100644 index 00000000..3b281f85 Binary files /dev/null and b/src/dataset/rose/28029514230_f4e00768b5_c.jpg differ diff --git a/src/dataset/rose/28043482773_23d745be28_c.jpg b/src/dataset/rose/28043482773_23d745be28_c.jpg new file mode 100644 index 00000000..622289e7 Binary files /dev/null and b/src/dataset/rose/28043482773_23d745be28_c.jpg differ diff --git a/src/dataset/rose/28075849322_457a282542_c.jpg b/src/dataset/rose/28075849322_457a282542_c.jpg new file mode 100644 index 00000000..c61b94e6 Binary files /dev/null and b/src/dataset/rose/28075849322_457a282542_c.jpg differ diff --git a/src/dataset/rose/28089573812_fbf8274f78_c.jpg b/src/dataset/rose/28089573812_fbf8274f78_c.jpg new file mode 100644 index 00000000..5d75d0f4 Binary files /dev/null and b/src/dataset/rose/28089573812_fbf8274f78_c.jpg differ diff --git a/src/dataset/rose/28096227031_00dbbb2d00_c.jpg b/src/dataset/rose/28096227031_00dbbb2d00_c.jpg new file mode 100644 index 00000000..65c4e2f6 Binary files /dev/null and b/src/dataset/rose/28096227031_00dbbb2d00_c.jpg differ diff --git a/src/dataset/rose/28135375883_e9a97a411e_c.jpg b/src/dataset/rose/28135375883_e9a97a411e_c.jpg new file mode 100644 index 00000000..b96b6fde Binary files /dev/null and b/src/dataset/rose/28135375883_e9a97a411e_c.jpg differ diff --git a/src/dataset/rose/28136760813_0c2b90435d_c.jpg b/src/dataset/rose/28136760813_0c2b90435d_c.jpg new file mode 100644 index 00000000..21dfdbf3 Binary files /dev/null and b/src/dataset/rose/28136760813_0c2b90435d_c.jpg differ diff --git a/src/dataset/rose/28267312712_b32db222e5_c.jpg b/src/dataset/rose/28267312712_b32db222e5_c.jpg new file mode 100644 index 00000000..015091b6 Binary files /dev/null and b/src/dataset/rose/28267312712_b32db222e5_c.jpg differ diff --git a/src/dataset/rose/28291956816_e79ddca982_c.jpg b/src/dataset/rose/28291956816_e79ddca982_c.jpg new file mode 100644 index 00000000..22fd68e7 Binary files /dev/null and b/src/dataset/rose/28291956816_e79ddca982_c.jpg differ diff --git a/src/dataset/rose/28404289281_17d6a2b0de_c.jpg b/src/dataset/rose/28404289281_17d6a2b0de_c.jpg new file mode 100644 index 00000000..47d096ca Binary files /dev/null and b/src/dataset/rose/28404289281_17d6a2b0de_c.jpg differ diff --git a/src/dataset/rose/28406432184_9e88769296_c.jpg b/src/dataset/rose/28406432184_9e88769296_c.jpg new file mode 100644 index 00000000..8a2a692e Binary files /dev/null and b/src/dataset/rose/28406432184_9e88769296_c.jpg differ diff --git a/src/dataset/rose/28446426152_438b3b2c11_c.jpg b/src/dataset/rose/28446426152_438b3b2c11_c.jpg new file mode 100644 index 00000000..17a4f127 Binary files /dev/null and b/src/dataset/rose/28446426152_438b3b2c11_c.jpg differ diff --git a/src/dataset/rose/28482693215_fcf0b41e36_c.jpg b/src/dataset/rose/28482693215_fcf0b41e36_c.jpg new file mode 100644 index 00000000..50798936 Binary files /dev/null and b/src/dataset/rose/28482693215_fcf0b41e36_c.jpg differ diff --git a/src/dataset/rose/28513180070_5d2a531355_c.jpg b/src/dataset/rose/28513180070_5d2a531355_c.jpg new file mode 100644 index 00000000..6da20f4e Binary files /dev/null and b/src/dataset/rose/28513180070_5d2a531355_c.jpg differ diff --git a/src/dataset/rose/28545469216_6623c13961_c.jpg b/src/dataset/rose/28545469216_6623c13961_c.jpg new file mode 100644 index 00000000..58601dbe Binary files /dev/null and b/src/dataset/rose/28545469216_6623c13961_c.jpg differ diff --git a/src/dataset/rose/28587327315_e2820746c2_c.jpg b/src/dataset/rose/28587327315_e2820746c2_c.jpg new file mode 100644 index 00000000..3f8cabf5 Binary files /dev/null and b/src/dataset/rose/28587327315_e2820746c2_c.jpg differ diff --git a/src/dataset/rose/28657580874_b12b4135ff_c.jpg b/src/dataset/rose/28657580874_b12b4135ff_c.jpg new file mode 100644 index 00000000..8661ed05 Binary files /dev/null and b/src/dataset/rose/28657580874_b12b4135ff_c.jpg differ diff --git a/src/dataset/rose/28717021477_abd010b573_c.jpg b/src/dataset/rose/28717021477_abd010b573_c.jpg new file mode 100644 index 00000000..d5cba7b9 Binary files /dev/null and b/src/dataset/rose/28717021477_abd010b573_c.jpg differ diff --git a/src/dataset/rose/28725151573_d7a6ff1b54_c.jpg b/src/dataset/rose/28725151573_d7a6ff1b54_c.jpg new file mode 100644 index 00000000..52122323 Binary files /dev/null and b/src/dataset/rose/28725151573_d7a6ff1b54_c.jpg differ diff --git a/src/dataset/rose/2877003503_e46101f58d_c.jpg b/src/dataset/rose/2877003503_e46101f58d_c.jpg new file mode 100644 index 00000000..6e88e8e7 Binary files /dev/null and b/src/dataset/rose/2877003503_e46101f58d_c.jpg differ diff --git a/src/dataset/rose/28777523597_15f55b85cf_c.jpg b/src/dataset/rose/28777523597_15f55b85cf_c.jpg new file mode 100644 index 00000000..c5da3f94 Binary files /dev/null and b/src/dataset/rose/28777523597_15f55b85cf_c.jpg differ diff --git a/src/dataset/rose/28812188825_8c110fc3b6_c.jpg b/src/dataset/rose/28812188825_8c110fc3b6_c.jpg new file mode 100644 index 00000000..dc627f27 Binary files /dev/null and b/src/dataset/rose/28812188825_8c110fc3b6_c.jpg differ diff --git a/src/dataset/rose/28813288548_ed458d306c_c.jpg b/src/dataset/rose/28813288548_ed458d306c_c.jpg new file mode 100644 index 00000000..12397b12 Binary files /dev/null and b/src/dataset/rose/28813288548_ed458d306c_c.jpg differ diff --git a/src/dataset/rose/28850444270_34c40b28b4_c.jpg b/src/dataset/rose/28850444270_34c40b28b4_c.jpg new file mode 100644 index 00000000..3138ec83 Binary files /dev/null and b/src/dataset/rose/28850444270_34c40b28b4_c.jpg differ diff --git a/src/dataset/rose/2886599218_c49d658efc_c.jpg b/src/dataset/rose/2886599218_c49d658efc_c.jpg new file mode 100644 index 00000000..c7ac57da Binary files /dev/null and b/src/dataset/rose/2886599218_c49d658efc_c.jpg differ diff --git a/src/dataset/rose/2890098318_0363387479_c.jpg b/src/dataset/rose/2890098318_0363387479_c.jpg new file mode 100644 index 00000000..2e0e0c4e Binary files /dev/null and b/src/dataset/rose/2890098318_0363387479_c.jpg differ diff --git a/src/dataset/rose/28922847943_1be809bdf4_c.jpg b/src/dataset/rose/28922847943_1be809bdf4_c.jpg new file mode 100644 index 00000000..b4491607 Binary files /dev/null and b/src/dataset/rose/28922847943_1be809bdf4_c.jpg differ diff --git a/src/dataset/rose/28934528478_1666ffd634_c.jpg b/src/dataset/rose/28934528478_1666ffd634_c.jpg new file mode 100644 index 00000000..bd4a7bb2 Binary files /dev/null and b/src/dataset/rose/28934528478_1666ffd634_c.jpg differ diff --git a/src/dataset/rose/2895144967_a1e92b5810_c.jpg b/src/dataset/rose/2895144967_a1e92b5810_c.jpg new file mode 100644 index 00000000..a5c4c6f8 Binary files /dev/null and b/src/dataset/rose/2895144967_a1e92b5810_c.jpg differ diff --git a/src/dataset/rose/2898457461_ddaff4f28c_c.jpg b/src/dataset/rose/2898457461_ddaff4f28c_c.jpg new file mode 100644 index 00000000..5e7e7860 Binary files /dev/null and b/src/dataset/rose/2898457461_ddaff4f28c_c.jpg differ diff --git a/src/dataset/rose/29005223960_e06494c342_c.jpg b/src/dataset/rose/29005223960_e06494c342_c.jpg new file mode 100644 index 00000000..987c6dd6 Binary files /dev/null and b/src/dataset/rose/29005223960_e06494c342_c.jpg differ diff --git a/src/dataset/rose/29019347750_06621fb6bf_c.jpg b/src/dataset/rose/29019347750_06621fb6bf_c.jpg new file mode 100644 index 00000000..9849edd7 Binary files /dev/null and b/src/dataset/rose/29019347750_06621fb6bf_c.jpg differ diff --git a/src/dataset/rose/29060593752_f443f4eff5_c.jpg b/src/dataset/rose/29060593752_f443f4eff5_c.jpg new file mode 100644 index 00000000..20825191 Binary files /dev/null and b/src/dataset/rose/29060593752_f443f4eff5_c.jpg differ diff --git a/src/dataset/rose/29133810912_5fbe8d34b3_c.jpg b/src/dataset/rose/29133810912_5fbe8d34b3_c.jpg new file mode 100644 index 00000000..44bfcafc Binary files /dev/null and b/src/dataset/rose/29133810912_5fbe8d34b3_c.jpg differ diff --git a/src/dataset/rose/29187641955_37a5a50c94_c.jpg b/src/dataset/rose/29187641955_37a5a50c94_c.jpg new file mode 100644 index 00000000..20c1666b Binary files /dev/null and b/src/dataset/rose/29187641955_37a5a50c94_c.jpg differ diff --git a/src/dataset/rose/29203009700_f6e9b63e66_c.jpg b/src/dataset/rose/29203009700_f6e9b63e66_c.jpg new file mode 100644 index 00000000..85becdf9 Binary files /dev/null and b/src/dataset/rose/29203009700_f6e9b63e66_c.jpg differ diff --git a/src/dataset/rose/29281182344_52e48295ba_c.jpg b/src/dataset/rose/29281182344_52e48295ba_c.jpg new file mode 100644 index 00000000..2906e389 Binary files /dev/null and b/src/dataset/rose/29281182344_52e48295ba_c.jpg differ diff --git a/src/dataset/rose/29301940921_c01ca9c4e3_c.jpg b/src/dataset/rose/29301940921_c01ca9c4e3_c.jpg new file mode 100644 index 00000000..dd9965cb Binary files /dev/null and b/src/dataset/rose/29301940921_c01ca9c4e3_c.jpg differ diff --git a/src/dataset/rose/29400791081_16df87fac4_c.jpg b/src/dataset/rose/29400791081_16df87fac4_c.jpg new file mode 100644 index 00000000..6de30783 Binary files /dev/null and b/src/dataset/rose/29400791081_16df87fac4_c.jpg differ diff --git a/src/dataset/rose/29403268414_b7cfa67523_c.jpg b/src/dataset/rose/29403268414_b7cfa67523_c.jpg new file mode 100644 index 00000000..e0c99428 Binary files /dev/null and b/src/dataset/rose/29403268414_b7cfa67523_c.jpg differ diff --git a/src/dataset/rose/29403497771_163d9e1704_c.jpg b/src/dataset/rose/29403497771_163d9e1704_c.jpg new file mode 100644 index 00000000..3805f054 Binary files /dev/null and b/src/dataset/rose/29403497771_163d9e1704_c.jpg differ diff --git a/src/dataset/rose/29410340203_c49428293a_c.jpg b/src/dataset/rose/29410340203_c49428293a_c.jpg new file mode 100644 index 00000000..29939d3f Binary files /dev/null and b/src/dataset/rose/29410340203_c49428293a_c.jpg differ diff --git a/src/dataset/rose/29432097571_45732b1ae3_c.jpg b/src/dataset/rose/29432097571_45732b1ae3_c.jpg new file mode 100644 index 00000000..b163928a Binary files /dev/null and b/src/dataset/rose/29432097571_45732b1ae3_c.jpg differ diff --git a/src/dataset/rose/29433407590_5ea15113ba_c.jpg b/src/dataset/rose/29433407590_5ea15113ba_c.jpg new file mode 100644 index 00000000..17390bc1 Binary files /dev/null and b/src/dataset/rose/29433407590_5ea15113ba_c.jpg differ diff --git a/src/dataset/rose/29433410800_fdfccbc59d_c.jpg b/src/dataset/rose/29433410800_fdfccbc59d_c.jpg new file mode 100644 index 00000000..4e56bdd5 Binary files /dev/null and b/src/dataset/rose/29433410800_fdfccbc59d_c.jpg differ diff --git a/src/dataset/rose/29446419486_5a9e37e8eb_c.jpg b/src/dataset/rose/29446419486_5a9e37e8eb_c.jpg new file mode 100644 index 00000000..2c9903a2 Binary files /dev/null and b/src/dataset/rose/29446419486_5a9e37e8eb_c.jpg differ diff --git a/src/dataset/rose/2945036879_14fd2cf70b_c.jpg b/src/dataset/rose/2945036879_14fd2cf70b_c.jpg new file mode 100644 index 00000000..bfea6f4b Binary files /dev/null and b/src/dataset/rose/2945036879_14fd2cf70b_c.jpg differ diff --git a/src/dataset/rose/29457922657_7cd4d07116_c.jpg b/src/dataset/rose/29457922657_7cd4d07116_c.jpg new file mode 100644 index 00000000..0c12df00 Binary files /dev/null and b/src/dataset/rose/29457922657_7cd4d07116_c.jpg differ diff --git a/src/dataset/rose/29489576531_fdd43727ed_c.jpg b/src/dataset/rose/29489576531_fdd43727ed_c.jpg new file mode 100644 index 00000000..89f4069e Binary files /dev/null and b/src/dataset/rose/29489576531_fdd43727ed_c.jpg differ diff --git a/src/dataset/rose/2951031843_cc38f2d46d_c.jpg b/src/dataset/rose/2951031843_cc38f2d46d_c.jpg new file mode 100644 index 00000000..bd5f5066 Binary files /dev/null and b/src/dataset/rose/2951031843_cc38f2d46d_c.jpg differ diff --git a/src/dataset/rose/29631851230_41f7a0ebdf_c.jpg b/src/dataset/rose/29631851230_41f7a0ebdf_c.jpg new file mode 100644 index 00000000..ef557e1a Binary files /dev/null and b/src/dataset/rose/29631851230_41f7a0ebdf_c.jpg differ diff --git a/src/dataset/rose/29671161616_be206e25b7_c.jpg b/src/dataset/rose/29671161616_be206e25b7_c.jpg new file mode 100644 index 00000000..6e8da974 Binary files /dev/null and b/src/dataset/rose/29671161616_be206e25b7_c.jpg differ diff --git a/src/dataset/rose/29731357860_b4d458c6bf_c.jpg b/src/dataset/rose/29731357860_b4d458c6bf_c.jpg new file mode 100644 index 00000000..afaaacc5 Binary files /dev/null and b/src/dataset/rose/29731357860_b4d458c6bf_c.jpg differ diff --git a/src/dataset/rose/29743651873_5f22e02dd6_c.jpg b/src/dataset/rose/29743651873_5f22e02dd6_c.jpg new file mode 100644 index 00000000..3cd83b9e Binary files /dev/null and b/src/dataset/rose/29743651873_5f22e02dd6_c.jpg differ diff --git a/src/dataset/rose/2980925933_a7553ff1a3_c.jpg b/src/dataset/rose/2980925933_a7553ff1a3_c.jpg new file mode 100644 index 00000000..0fe6c6bd Binary files /dev/null and b/src/dataset/rose/2980925933_a7553ff1a3_c.jpg differ diff --git a/src/dataset/rose/29811348836_ab69262630_c.jpg b/src/dataset/rose/29811348836_ab69262630_c.jpg new file mode 100644 index 00000000..8c2154f3 Binary files /dev/null and b/src/dataset/rose/29811348836_ab69262630_c.jpg differ diff --git a/src/dataset/rose/2981783216_1e2e858a91_c.jpg b/src/dataset/rose/2981783216_1e2e858a91_c.jpg new file mode 100644 index 00000000..8681292f Binary files /dev/null and b/src/dataset/rose/2981783216_1e2e858a91_c.jpg differ diff --git a/src/dataset/rose/29855458706_6c84cf96a8_c.jpg b/src/dataset/rose/29855458706_6c84cf96a8_c.jpg new file mode 100644 index 00000000..6cbd932c Binary files /dev/null and b/src/dataset/rose/29855458706_6c84cf96a8_c.jpg differ diff --git a/src/dataset/rose/29903694262_83a317d648_c.jpg b/src/dataset/rose/29903694262_83a317d648_c.jpg new file mode 100644 index 00000000..81b0c70e Binary files /dev/null and b/src/dataset/rose/29903694262_83a317d648_c.jpg differ diff --git a/src/dataset/rose/29933035015_ab248a48d9_c.jpg b/src/dataset/rose/29933035015_ab248a48d9_c.jpg new file mode 100644 index 00000000..95c326c6 Binary files /dev/null and b/src/dataset/rose/29933035015_ab248a48d9_c.jpg differ diff --git a/src/dataset/rose/29996866615_6b611296bb_c.jpg b/src/dataset/rose/29996866615_6b611296bb_c.jpg new file mode 100644 index 00000000..abf909ec Binary files /dev/null and b/src/dataset/rose/29996866615_6b611296bb_c.jpg differ diff --git a/src/dataset/rose/2999848462_56d3c08a46_c.jpg b/src/dataset/rose/2999848462_56d3c08a46_c.jpg new file mode 100644 index 00000000..fc626a7e Binary files /dev/null and b/src/dataset/rose/2999848462_56d3c08a46_c.jpg differ diff --git a/src/dataset/rose/29999332780_12531141b6_c.jpg b/src/dataset/rose/29999332780_12531141b6_c.jpg new file mode 100644 index 00000000..9326900d Binary files /dev/null and b/src/dataset/rose/29999332780_12531141b6_c.jpg differ diff --git a/src/dataset/rose/2ef7c4117c.jpg b/src/dataset/rose/2ef7c4117c.jpg new file mode 100644 index 00000000..9857fc8a Binary files /dev/null and b/src/dataset/rose/2ef7c4117c.jpg differ diff --git a/src/dataset/rose/30000984403_74b59e8193_c.jpg b/src/dataset/rose/30000984403_74b59e8193_c.jpg new file mode 100644 index 00000000..7de9f36e Binary files /dev/null and b/src/dataset/rose/30000984403_74b59e8193_c.jpg differ diff --git a/src/dataset/rose/30084475004_8e1e37d763_c.jpg b/src/dataset/rose/30084475004_8e1e37d763_c.jpg new file mode 100644 index 00000000..fda824ea Binary files /dev/null and b/src/dataset/rose/30084475004_8e1e37d763_c.jpg differ diff --git a/src/dataset/rose/30087999203_21d0c249ba_c.jpg b/src/dataset/rose/30087999203_21d0c249ba_c.jpg new file mode 100644 index 00000000..eea262eb Binary files /dev/null and b/src/dataset/rose/30087999203_21d0c249ba_c.jpg differ diff --git a/src/dataset/rose/30137839622_74675c4229_c.jpg b/src/dataset/rose/30137839622_74675c4229_c.jpg new file mode 100644 index 00000000..9d0e23c0 Binary files /dev/null and b/src/dataset/rose/30137839622_74675c4229_c.jpg differ diff --git a/src/dataset/rose/30176720544_7da3c76f88_c.jpg b/src/dataset/rose/30176720544_7da3c76f88_c.jpg new file mode 100644 index 00000000..4d067395 Binary files /dev/null and b/src/dataset/rose/30176720544_7da3c76f88_c.jpg differ diff --git a/src/dataset/rose/301821732_8586a35ae9_c.jpg b/src/dataset/rose/301821732_8586a35ae9_c.jpg new file mode 100644 index 00000000..0f02967d Binary files /dev/null and b/src/dataset/rose/301821732_8586a35ae9_c.jpg differ diff --git a/src/dataset/rose/3020532668_f26b44c678_c.jpg b/src/dataset/rose/3020532668_f26b44c678_c.jpg new file mode 100644 index 00000000..081307de Binary files /dev/null and b/src/dataset/rose/3020532668_f26b44c678_c.jpg differ diff --git a/src/dataset/rose/30209913107_4d6b8b41d3_c.jpg b/src/dataset/rose/30209913107_4d6b8b41d3_c.jpg new file mode 100644 index 00000000..803975ff Binary files /dev/null and b/src/dataset/rose/30209913107_4d6b8b41d3_c.jpg differ diff --git a/src/dataset/rose/30288127_11d6fd1f6d_c.jpg b/src/dataset/rose/30288127_11d6fd1f6d_c.jpg new file mode 100644 index 00000000..73d27087 Binary files /dev/null and b/src/dataset/rose/30288127_11d6fd1f6d_c.jpg differ diff --git a/src/dataset/rose/30451315300_62f654558f_c.jpg b/src/dataset/rose/30451315300_62f654558f_c.jpg new file mode 100644 index 00000000..4292693d Binary files /dev/null and b/src/dataset/rose/30451315300_62f654558f_c.jpg differ diff --git a/src/dataset/rose/3045761505_91352f7004_c.jpg b/src/dataset/rose/3045761505_91352f7004_c.jpg new file mode 100644 index 00000000..b98e2dd1 Binary files /dev/null and b/src/dataset/rose/3045761505_91352f7004_c.jpg differ diff --git a/src/dataset/rose/3045954461_54dd378b1d_c.jpg b/src/dataset/rose/3045954461_54dd378b1d_c.jpg new file mode 100644 index 00000000..2b3b1297 Binary files /dev/null and b/src/dataset/rose/3045954461_54dd378b1d_c.jpg differ diff --git a/src/dataset/rose/30507464380_451af23df5_c.jpg b/src/dataset/rose/30507464380_451af23df5_c.jpg new file mode 100644 index 00000000..74f2fa38 Binary files /dev/null and b/src/dataset/rose/30507464380_451af23df5_c.jpg differ diff --git a/src/dataset/rose/30507512910_969cd1db89_c.jpg b/src/dataset/rose/30507512910_969cd1db89_c.jpg new file mode 100644 index 00000000..d7b44999 Binary files /dev/null and b/src/dataset/rose/30507512910_969cd1db89_c.jpg differ diff --git a/src/dataset/rose/3060017566_1d9282dc97_c.jpg b/src/dataset/rose/3060017566_1d9282dc97_c.jpg new file mode 100644 index 00000000..7b51b207 Binary files /dev/null and b/src/dataset/rose/3060017566_1d9282dc97_c.jpg differ diff --git a/src/dataset/rose/30603979943_856fd01d6a_c.jpg b/src/dataset/rose/30603979943_856fd01d6a_c.jpg new file mode 100644 index 00000000..984e0dae Binary files /dev/null and b/src/dataset/rose/30603979943_856fd01d6a_c.jpg differ diff --git a/src/dataset/rose/30639492295_d770b34935_c.jpg b/src/dataset/rose/30639492295_d770b34935_c.jpg new file mode 100644 index 00000000..eebd9378 Binary files /dev/null and b/src/dataset/rose/30639492295_d770b34935_c.jpg differ diff --git a/src/dataset/rose/30661773866_0d853061cb_c.jpg b/src/dataset/rose/30661773866_0d853061cb_c.jpg new file mode 100644 index 00000000..91afe9b4 Binary files /dev/null and b/src/dataset/rose/30661773866_0d853061cb_c.jpg differ diff --git a/src/dataset/rose/30685627040_4977a8321a_c.jpg b/src/dataset/rose/30685627040_4977a8321a_c.jpg new file mode 100644 index 00000000..59419774 Binary files /dev/null and b/src/dataset/rose/30685627040_4977a8321a_c.jpg differ diff --git a/src/dataset/rose/30716306220_007f5a5d4a_c.jpg b/src/dataset/rose/30716306220_007f5a5d4a_c.jpg new file mode 100644 index 00000000..192d1112 Binary files /dev/null and b/src/dataset/rose/30716306220_007f5a5d4a_c.jpg differ diff --git a/src/dataset/rose/30721554804_0ced30fc03_c.jpg b/src/dataset/rose/30721554804_0ced30fc03_c.jpg new file mode 100644 index 00000000..2017e35f Binary files /dev/null and b/src/dataset/rose/30721554804_0ced30fc03_c.jpg differ diff --git a/src/dataset/rose/30731440286_6a37038d22_c.jpg b/src/dataset/rose/30731440286_6a37038d22_c.jpg new file mode 100644 index 00000000..8843ca94 Binary files /dev/null and b/src/dataset/rose/30731440286_6a37038d22_c.jpg differ diff --git a/src/dataset/rose/30771841786_2f5f60ff55_c.jpg b/src/dataset/rose/30771841786_2f5f60ff55_c.jpg new file mode 100644 index 00000000..6c9c4a35 Binary files /dev/null and b/src/dataset/rose/30771841786_2f5f60ff55_c.jpg differ diff --git a/src/dataset/rose/30797324404_5847336d3c_c.jpg b/src/dataset/rose/30797324404_5847336d3c_c.jpg new file mode 100644 index 00000000..1f8c2ce6 Binary files /dev/null and b/src/dataset/rose/30797324404_5847336d3c_c.jpg differ diff --git a/src/dataset/rose/30797326344_f74d565a88_c.jpg b/src/dataset/rose/30797326344_f74d565a88_c.jpg new file mode 100644 index 00000000..5b0ab0f0 Binary files /dev/null and b/src/dataset/rose/30797326344_f74d565a88_c.jpg differ diff --git a/src/dataset/rose/30870215436_924ec54a9d_c.jpg b/src/dataset/rose/30870215436_924ec54a9d_c.jpg new file mode 100644 index 00000000..e00bb225 Binary files /dev/null and b/src/dataset/rose/30870215436_924ec54a9d_c.jpg differ diff --git a/src/dataset/rose/30871984536_00dd44a517_c.jpg b/src/dataset/rose/30871984536_00dd44a517_c.jpg new file mode 100644 index 00000000..46c0cf41 Binary files /dev/null and b/src/dataset/rose/30871984536_00dd44a517_c.jpg differ diff --git a/src/dataset/rose/30946435951_1b0e546681_c.jpg b/src/dataset/rose/30946435951_1b0e546681_c.jpg new file mode 100644 index 00000000..575254b1 Binary files /dev/null and b/src/dataset/rose/30946435951_1b0e546681_c.jpg differ diff --git a/src/dataset/rose/3099692506_ec46d58b05_c.jpg b/src/dataset/rose/3099692506_ec46d58b05_c.jpg new file mode 100644 index 00000000..69a1a4ab Binary files /dev/null and b/src/dataset/rose/3099692506_ec46d58b05_c.jpg differ diff --git a/src/dataset/rose/31001745336_acc9bebf1b_c.jpg b/src/dataset/rose/31001745336_acc9bebf1b_c.jpg new file mode 100644 index 00000000..33a5398b Binary files /dev/null and b/src/dataset/rose/31001745336_acc9bebf1b_c.jpg differ diff --git a/src/dataset/rose/3102237947_b0a9a8e57d_c.jpg b/src/dataset/rose/3102237947_b0a9a8e57d_c.jpg new file mode 100644 index 00000000..de74b9dc Binary files /dev/null and b/src/dataset/rose/3102237947_b0a9a8e57d_c.jpg differ diff --git a/src/dataset/rose/31078979126_bce7e74c69_c.jpg b/src/dataset/rose/31078979126_bce7e74c69_c.jpg new file mode 100644 index 00000000..3eb0cf51 Binary files /dev/null and b/src/dataset/rose/31078979126_bce7e74c69_c.jpg differ diff --git a/src/dataset/rose/31186085512_a7d8af2e84_c.jpg b/src/dataset/rose/31186085512_a7d8af2e84_c.jpg new file mode 100644 index 00000000..82a392b9 Binary files /dev/null and b/src/dataset/rose/31186085512_a7d8af2e84_c.jpg differ diff --git a/src/dataset/rose/31306072885_d01f9e275c_c.jpg b/src/dataset/rose/31306072885_d01f9e275c_c.jpg new file mode 100644 index 00000000..1dcd4fa2 Binary files /dev/null and b/src/dataset/rose/31306072885_d01f9e275c_c.jpg differ diff --git a/src/dataset/rose/31319646231_ebffec7d26_c.jpg b/src/dataset/rose/31319646231_ebffec7d26_c.jpg new file mode 100644 index 00000000..3399c476 Binary files /dev/null and b/src/dataset/rose/31319646231_ebffec7d26_c.jpg differ diff --git a/src/dataset/rose/31849667555_4b8b3ee72f_c.jpg b/src/dataset/rose/31849667555_4b8b3ee72f_c.jpg new file mode 100644 index 00000000..c6c07046 Binary files /dev/null and b/src/dataset/rose/31849667555_4b8b3ee72f_c.jpg differ diff --git a/src/dataset/rose/3199042797_448dff4501_c.jpg b/src/dataset/rose/3199042797_448dff4501_c.jpg new file mode 100644 index 00000000..c45a507a Binary files /dev/null and b/src/dataset/rose/3199042797_448dff4501_c.jpg differ diff --git a/src/dataset/rose/3199889726_e12a657647_c.jpg b/src/dataset/rose/3199889726_e12a657647_c.jpg new file mode 100644 index 00000000..1f63a42f Binary files /dev/null and b/src/dataset/rose/3199889726_e12a657647_c.jpg differ diff --git a/src/dataset/rose/32086153761_f26bfefa60_c.jpg b/src/dataset/rose/32086153761_f26bfefa60_c.jpg new file mode 100644 index 00000000..ed262a3e Binary files /dev/null and b/src/dataset/rose/32086153761_f26bfefa60_c.jpg differ diff --git a/src/dataset/rose/3214755819_e7f7175895_c.jpg b/src/dataset/rose/3214755819_e7f7175895_c.jpg new file mode 100644 index 00000000..7f58e172 Binary files /dev/null and b/src/dataset/rose/3214755819_e7f7175895_c.jpg differ diff --git a/src/dataset/rose/32150006740_bf685fc903_c.jpg b/src/dataset/rose/32150006740_bf685fc903_c.jpg new file mode 100644 index 00000000..10a613e3 Binary files /dev/null and b/src/dataset/rose/32150006740_bf685fc903_c.jpg differ diff --git a/src/dataset/rose/3215934527_89e202c99e_c.jpg b/src/dataset/rose/3215934527_89e202c99e_c.jpg new file mode 100644 index 00000000..4b1defad Binary files /dev/null and b/src/dataset/rose/3215934527_89e202c99e_c.jpg differ diff --git a/src/dataset/rose/32183418971_8e0a644c06_c.jpg b/src/dataset/rose/32183418971_8e0a644c06_c.jpg new file mode 100644 index 00000000..ecc3ecb4 Binary files /dev/null and b/src/dataset/rose/32183418971_8e0a644c06_c.jpg differ diff --git a/src/dataset/rose/32186891101_dcd4e7000a_c.jpg b/src/dataset/rose/32186891101_dcd4e7000a_c.jpg new file mode 100644 index 00000000..e9a4a2d5 Binary files /dev/null and b/src/dataset/rose/32186891101_dcd4e7000a_c.jpg differ diff --git a/src/dataset/rose/32285017590_08d5994a0a_c.jpg b/src/dataset/rose/32285017590_08d5994a0a_c.jpg new file mode 100644 index 00000000..19c3c047 Binary files /dev/null and b/src/dataset/rose/32285017590_08d5994a0a_c.jpg differ diff --git a/src/dataset/rose/32307773616_6ccc344813_c.jpg b/src/dataset/rose/32307773616_6ccc344813_c.jpg new file mode 100644 index 00000000..b949d396 Binary files /dev/null and b/src/dataset/rose/32307773616_6ccc344813_c.jpg differ diff --git a/src/dataset/rose/32327476885_654322e579_c.jpg b/src/dataset/rose/32327476885_654322e579_c.jpg new file mode 100644 index 00000000..30548bf1 Binary files /dev/null and b/src/dataset/rose/32327476885_654322e579_c.jpg differ diff --git a/src/dataset/rose/32543071546_22808b8c11_c.jpg b/src/dataset/rose/32543071546_22808b8c11_c.jpg new file mode 100644 index 00000000..4c938e63 Binary files /dev/null and b/src/dataset/rose/32543071546_22808b8c11_c.jpg differ diff --git a/src/dataset/rose/32608854771_dd0e78e976_c.jpg b/src/dataset/rose/32608854771_dd0e78e976_c.jpg new file mode 100644 index 00000000..7b1cb18f Binary files /dev/null and b/src/dataset/rose/32608854771_dd0e78e976_c.jpg differ diff --git a/src/dataset/rose/3261849227_0bdc608972_c.jpg b/src/dataset/rose/3261849227_0bdc608972_c.jpg new file mode 100644 index 00000000..fcef9bd1 Binary files /dev/null and b/src/dataset/rose/3261849227_0bdc608972_c.jpg differ diff --git a/src/dataset/rose/3262672802_7f20464271_c.jpg b/src/dataset/rose/3262672802_7f20464271_c.jpg new file mode 100644 index 00000000..4aa72e48 Binary files /dev/null and b/src/dataset/rose/3262672802_7f20464271_c.jpg differ diff --git a/src/dataset/rose/3262676270_947c4fd47e_c.jpg b/src/dataset/rose/3262676270_947c4fd47e_c.jpg new file mode 100644 index 00000000..8bcd0737 Binary files /dev/null and b/src/dataset/rose/3262676270_947c4fd47e_c.jpg differ diff --git a/src/dataset/rose/32752955803_d426f6b478_c.jpg b/src/dataset/rose/32752955803_d426f6b478_c.jpg new file mode 100644 index 00000000..90623cc3 Binary files /dev/null and b/src/dataset/rose/32752955803_d426f6b478_c.jpg differ diff --git a/src/dataset/rose/3280882473_c6153da40a_c.jpg b/src/dataset/rose/3280882473_c6153da40a_c.jpg new file mode 100644 index 00000000..419f721f Binary files /dev/null and b/src/dataset/rose/3280882473_c6153da40a_c.jpg differ diff --git a/src/dataset/rose/3282202534_df3d5ecd26_c.jpg b/src/dataset/rose/3282202534_df3d5ecd26_c.jpg new file mode 100644 index 00000000..dcdadf08 Binary files /dev/null and b/src/dataset/rose/3282202534_df3d5ecd26_c.jpg differ diff --git a/src/dataset/rose/32919174140_6643d70a1f_c.jpg b/src/dataset/rose/32919174140_6643d70a1f_c.jpg new file mode 100644 index 00000000..a8fc8639 Binary files /dev/null and b/src/dataset/rose/32919174140_6643d70a1f_c.jpg differ diff --git a/src/dataset/rose/33349608058_1178a738de_c.jpg b/src/dataset/rose/33349608058_1178a738de_c.jpg new file mode 100644 index 00000000..fc6896d4 Binary files /dev/null and b/src/dataset/rose/33349608058_1178a738de_c.jpg differ diff --git a/src/dataset/rose/33457200_b3976e5047_c.jpg b/src/dataset/rose/33457200_b3976e5047_c.jpg new file mode 100644 index 00000000..b0b4780b Binary files /dev/null and b/src/dataset/rose/33457200_b3976e5047_c.jpg differ diff --git a/src/dataset/rose/3348864936_be47485694_c.jpg b/src/dataset/rose/3348864936_be47485694_c.jpg new file mode 100644 index 00000000..519c8a8d Binary files /dev/null and b/src/dataset/rose/3348864936_be47485694_c.jpg differ diff --git a/src/dataset/rose/3374780364_3734f6c927_c.jpg b/src/dataset/rose/3374780364_3734f6c927_c.jpg new file mode 100644 index 00000000..0b5af905 Binary files /dev/null and b/src/dataset/rose/3374780364_3734f6c927_c.jpg differ diff --git a/src/dataset/rose/33889673684_764f9770e8_c.jpg b/src/dataset/rose/33889673684_764f9770e8_c.jpg new file mode 100644 index 00000000..818c67ab Binary files /dev/null and b/src/dataset/rose/33889673684_764f9770e8_c.jpg differ diff --git a/src/dataset/rose/33909062534_fa7bebff46_c.jpg b/src/dataset/rose/33909062534_fa7bebff46_c.jpg new file mode 100644 index 00000000..50d8fd35 Binary files /dev/null and b/src/dataset/rose/33909062534_fa7bebff46_c.jpg differ diff --git a/src/dataset/rose/3395391122_a40cc01e2f_c.jpg b/src/dataset/rose/3395391122_a40cc01e2f_c.jpg new file mode 100644 index 00000000..9e940a1d Binary files /dev/null and b/src/dataset/rose/3395391122_a40cc01e2f_c.jpg differ diff --git a/src/dataset/rose/3396590475_2f8c2a90ce_c.jpg b/src/dataset/rose/3396590475_2f8c2a90ce_c.jpg new file mode 100644 index 00000000..fb1e7f02 Binary files /dev/null and b/src/dataset/rose/3396590475_2f8c2a90ce_c.jpg differ diff --git a/src/dataset/rose/34006751613_0b490b9e30_c.jpg b/src/dataset/rose/34006751613_0b490b9e30_c.jpg new file mode 100644 index 00000000..2e27393c Binary files /dev/null and b/src/dataset/rose/34006751613_0b490b9e30_c.jpg differ diff --git a/src/dataset/rose/34009284304_c50bc29d59_c.jpg b/src/dataset/rose/34009284304_c50bc29d59_c.jpg new file mode 100644 index 00000000..0dd56a75 Binary files /dev/null and b/src/dataset/rose/34009284304_c50bc29d59_c.jpg differ diff --git a/src/dataset/rose/34115713020_c474b807b9_c.jpg b/src/dataset/rose/34115713020_c474b807b9_c.jpg new file mode 100644 index 00000000..0e080c61 Binary files /dev/null and b/src/dataset/rose/34115713020_c474b807b9_c.jpg differ diff --git a/src/dataset/rose/34119030794_ed5c826677_c.jpg b/src/dataset/rose/34119030794_ed5c826677_c.jpg new file mode 100644 index 00000000..c60af498 Binary files /dev/null and b/src/dataset/rose/34119030794_ed5c826677_c.jpg differ diff --git a/src/dataset/rose/34218736571_31c303e288_c.jpg b/src/dataset/rose/34218736571_31c303e288_c.jpg new file mode 100644 index 00000000..994106d6 Binary files /dev/null and b/src/dataset/rose/34218736571_31c303e288_c.jpg differ diff --git a/src/dataset/rose/34309202136_c8a911acdc_c.jpg b/src/dataset/rose/34309202136_c8a911acdc_c.jpg new file mode 100644 index 00000000..0703aed3 Binary files /dev/null and b/src/dataset/rose/34309202136_c8a911acdc_c.jpg differ diff --git a/src/dataset/rose/34377814175_7c9fa17543_c.jpg b/src/dataset/rose/34377814175_7c9fa17543_c.jpg new file mode 100644 index 00000000..8730ff31 Binary files /dev/null and b/src/dataset/rose/34377814175_7c9fa17543_c.jpg differ diff --git a/src/dataset/rose/34407923924_5a1b8ece2b_c.jpg b/src/dataset/rose/34407923924_5a1b8ece2b_c.jpg new file mode 100644 index 00000000..d3c2048d Binary files /dev/null and b/src/dataset/rose/34407923924_5a1b8ece2b_c.jpg differ diff --git a/src/dataset/rose/3446770760_1c8fee5f7c_c.jpg b/src/dataset/rose/3446770760_1c8fee5f7c_c.jpg new file mode 100644 index 00000000..d3f3e28d Binary files /dev/null and b/src/dataset/rose/3446770760_1c8fee5f7c_c.jpg differ diff --git a/src/dataset/rose/34483309581_1ef34389c5_c.jpg b/src/dataset/rose/34483309581_1ef34389c5_c.jpg new file mode 100644 index 00000000..c63bd70f Binary files /dev/null and b/src/dataset/rose/34483309581_1ef34389c5_c.jpg differ diff --git a/src/dataset/rose/34526050931_babfaedcc6_c.jpg b/src/dataset/rose/34526050931_babfaedcc6_c.jpg new file mode 100644 index 00000000..08154950 Binary files /dev/null and b/src/dataset/rose/34526050931_babfaedcc6_c.jpg differ diff --git a/src/dataset/rose/34558551245_c13cda64da_c.jpg b/src/dataset/rose/34558551245_c13cda64da_c.jpg new file mode 100644 index 00000000..cea68056 Binary files /dev/null and b/src/dataset/rose/34558551245_c13cda64da_c.jpg differ diff --git a/src/dataset/rose/34568446643_b0c835e9d6_c.jpg b/src/dataset/rose/34568446643_b0c835e9d6_c.jpg new file mode 100644 index 00000000..bb50bc16 Binary files /dev/null and b/src/dataset/rose/34568446643_b0c835e9d6_c.jpg differ diff --git a/src/dataset/rose/34786344271_5405a29bdc_c.jpg b/src/dataset/rose/34786344271_5405a29bdc_c.jpg new file mode 100644 index 00000000..3bb53cf3 Binary files /dev/null and b/src/dataset/rose/34786344271_5405a29bdc_c.jpg differ diff --git a/src/dataset/rose/34796172892_d3c8ea4078_c.jpg b/src/dataset/rose/34796172892_d3c8ea4078_c.jpg new file mode 100644 index 00000000..b687f592 Binary files /dev/null and b/src/dataset/rose/34796172892_d3c8ea4078_c.jpg differ diff --git a/src/dataset/rose/34840854482_52d56fe923_c.jpg b/src/dataset/rose/34840854482_52d56fe923_c.jpg new file mode 100644 index 00000000..0dc32761 Binary files /dev/null and b/src/dataset/rose/34840854482_52d56fe923_c.jpg differ diff --git a/src/dataset/rose/34858176572_8e46b028c8_c.jpg b/src/dataset/rose/34858176572_8e46b028c8_c.jpg new file mode 100644 index 00000000..2b5c3c88 Binary files /dev/null and b/src/dataset/rose/34858176572_8e46b028c8_c.jpg differ diff --git a/src/dataset/rose/3495455675_29dacd8662_c.jpg b/src/dataset/rose/3495455675_29dacd8662_c.jpg new file mode 100644 index 00000000..0b7f797f Binary files /dev/null and b/src/dataset/rose/3495455675_29dacd8662_c.jpg differ diff --git a/src/dataset/rose/3495458585_260b62a15c_c.jpg b/src/dataset/rose/3495458585_260b62a15c_c.jpg new file mode 100644 index 00000000..b1effde0 Binary files /dev/null and b/src/dataset/rose/3495458585_260b62a15c_c.jpg differ diff --git a/src/dataset/rose/3496275044_499be6092d_c.jpg b/src/dataset/rose/3496275044_499be6092d_c.jpg new file mode 100644 index 00000000..0eb67f08 Binary files /dev/null and b/src/dataset/rose/3496275044_499be6092d_c.jpg differ diff --git a/src/dataset/rose/3496277880_6c04ebe17e_c.jpg b/src/dataset/rose/3496277880_6c04ebe17e_c.jpg new file mode 100644 index 00000000..5f527e28 Binary files /dev/null and b/src/dataset/rose/3496277880_6c04ebe17e_c.jpg differ diff --git a/src/dataset/rose/3496456475_83f86acdd1_c.jpg b/src/dataset/rose/3496456475_83f86acdd1_c.jpg new file mode 100644 index 00000000..46e30495 Binary files /dev/null and b/src/dataset/rose/3496456475_83f86acdd1_c.jpg differ diff --git a/src/dataset/rose/34976179810_9735b1a602_c.jpg b/src/dataset/rose/34976179810_9735b1a602_c.jpg new file mode 100644 index 00000000..2fef1e21 Binary files /dev/null and b/src/dataset/rose/34976179810_9735b1a602_c.jpg differ diff --git a/src/dataset/rose/34982979435_5a7b2f49f2_c.jpg b/src/dataset/rose/34982979435_5a7b2f49f2_c.jpg new file mode 100644 index 00000000..7cdd7a3a Binary files /dev/null and b/src/dataset/rose/34982979435_5a7b2f49f2_c.jpg differ diff --git a/src/dataset/rose/3499848181_20493faa71_c.jpg b/src/dataset/rose/3499848181_20493faa71_c.jpg new file mode 100644 index 00000000..74e48307 Binary files /dev/null and b/src/dataset/rose/3499848181_20493faa71_c.jpg differ diff --git a/src/dataset/rose/3502437587_38e744903c_c.jpg b/src/dataset/rose/3502437587_38e744903c_c.jpg new file mode 100644 index 00000000..32f094f9 Binary files /dev/null and b/src/dataset/rose/3502437587_38e744903c_c.jpg differ diff --git a/src/dataset/rose/35063038412_dfa41c45e5_c.jpg b/src/dataset/rose/35063038412_dfa41c45e5_c.jpg new file mode 100644 index 00000000..ca42ccd0 Binary files /dev/null and b/src/dataset/rose/35063038412_dfa41c45e5_c.jpg differ diff --git a/src/dataset/rose/35138711284_0c6ff40063_c.jpg b/src/dataset/rose/35138711284_0c6ff40063_c.jpg new file mode 100644 index 00000000..a9824711 Binary files /dev/null and b/src/dataset/rose/35138711284_0c6ff40063_c.jpg differ diff --git a/src/dataset/rose/35147671394_6f9419a36b_c.jpg b/src/dataset/rose/35147671394_6f9419a36b_c.jpg new file mode 100644 index 00000000..d3a3442b Binary files /dev/null and b/src/dataset/rose/35147671394_6f9419a36b_c.jpg differ diff --git a/src/dataset/rose/35207590363_41b620604a_c.jpg b/src/dataset/rose/35207590363_41b620604a_c.jpg new file mode 100644 index 00000000..8b048dc6 Binary files /dev/null and b/src/dataset/rose/35207590363_41b620604a_c.jpg differ diff --git a/src/dataset/rose/35227777456_2c54d01dfe_c.jpg b/src/dataset/rose/35227777456_2c54d01dfe_c.jpg new file mode 100644 index 00000000..cc0747df Binary files /dev/null and b/src/dataset/rose/35227777456_2c54d01dfe_c.jpg differ diff --git a/src/dataset/rose/35251965425_b7d451f9bc_c.jpg b/src/dataset/rose/35251965425_b7d451f9bc_c.jpg new file mode 100644 index 00000000..953f1ac8 Binary files /dev/null and b/src/dataset/rose/35251965425_b7d451f9bc_c.jpg differ diff --git a/src/dataset/rose/35291105915_d396a56317_c.jpg b/src/dataset/rose/35291105915_d396a56317_c.jpg new file mode 100644 index 00000000..10c479d1 Binary files /dev/null and b/src/dataset/rose/35291105915_d396a56317_c.jpg differ diff --git a/src/dataset/rose/35310497655_9c771c4df2_c.jpg b/src/dataset/rose/35310497655_9c771c4df2_c.jpg new file mode 100644 index 00000000..0a9ad2ec Binary files /dev/null and b/src/dataset/rose/35310497655_9c771c4df2_c.jpg differ diff --git a/src/dataset/rose/3539913351_a183a2fd2e_c.jpg b/src/dataset/rose/3539913351_a183a2fd2e_c.jpg new file mode 100644 index 00000000..7ca10195 Binary files /dev/null and b/src/dataset/rose/3539913351_a183a2fd2e_c.jpg differ diff --git a/src/dataset/rose/35526147224_37d8495630_c.jpg b/src/dataset/rose/35526147224_37d8495630_c.jpg new file mode 100644 index 00000000..620925d3 Binary files /dev/null and b/src/dataset/rose/35526147224_37d8495630_c.jpg differ diff --git a/src/dataset/rose/35526147234_6270428c4e_c.jpg b/src/dataset/rose/35526147234_6270428c4e_c.jpg new file mode 100644 index 00000000..c705b2ad Binary files /dev/null and b/src/dataset/rose/35526147234_6270428c4e_c.jpg differ diff --git a/src/dataset/rose/35538488514_fd7f6c1b2a_c.jpg b/src/dataset/rose/35538488514_fd7f6c1b2a_c.jpg new file mode 100644 index 00000000..0e5280b8 Binary files /dev/null and b/src/dataset/rose/35538488514_fd7f6c1b2a_c.jpg differ diff --git a/src/dataset/rose/3554087840_d2d8958ab3_c.jpg b/src/dataset/rose/3554087840_d2d8958ab3_c.jpg new file mode 100644 index 00000000..ce4b90be Binary files /dev/null and b/src/dataset/rose/3554087840_d2d8958ab3_c.jpg differ diff --git a/src/dataset/rose/3558991486_a98d502506_c.jpg b/src/dataset/rose/3558991486_a98d502506_c.jpg new file mode 100644 index 00000000..dc7b1f71 Binary files /dev/null and b/src/dataset/rose/3558991486_a98d502506_c.jpg differ diff --git a/src/dataset/rose/3559438039_0cb5bb2ae8_c.jpg b/src/dataset/rose/3559438039_0cb5bb2ae8_c.jpg new file mode 100644 index 00000000..d686baa7 Binary files /dev/null and b/src/dataset/rose/3559438039_0cb5bb2ae8_c.jpg differ diff --git a/src/dataset/rose/3560285780_a249e527b4_c.jpg b/src/dataset/rose/3560285780_a249e527b4_c.jpg new file mode 100644 index 00000000..f1d2b556 Binary files /dev/null and b/src/dataset/rose/3560285780_a249e527b4_c.jpg differ diff --git a/src/dataset/rose/35790202023_2f2e34797a_c.jpg b/src/dataset/rose/35790202023_2f2e34797a_c.jpg new file mode 100644 index 00000000..4fb777c7 Binary files /dev/null and b/src/dataset/rose/35790202023_2f2e34797a_c.jpg differ diff --git a/src/dataset/rose/3596780337_52953d8dd2_c.jpg b/src/dataset/rose/3596780337_52953d8dd2_c.jpg new file mode 100644 index 00000000..6244049e Binary files /dev/null and b/src/dataset/rose/3596780337_52953d8dd2_c.jpg differ diff --git a/src/dataset/rose/3596780879_7bfeb58e8d_c.jpg b/src/dataset/rose/3596780879_7bfeb58e8d_c.jpg new file mode 100644 index 00000000..e13ee3c5 Binary files /dev/null and b/src/dataset/rose/3596780879_7bfeb58e8d_c.jpg differ diff --git a/src/dataset/rose/35975188205_595a9b9dbf_c.jpg b/src/dataset/rose/35975188205_595a9b9dbf_c.jpg new file mode 100644 index 00000000..372bc830 Binary files /dev/null and b/src/dataset/rose/35975188205_595a9b9dbf_c.jpg differ diff --git a/src/dataset/rose/36012878755_89ec423f2a_c.jpg b/src/dataset/rose/36012878755_89ec423f2a_c.jpg new file mode 100644 index 00000000..07600508 Binary files /dev/null and b/src/dataset/rose/36012878755_89ec423f2a_c.jpg differ diff --git a/src/dataset/rose/36155919474_78b340978e_c.jpg b/src/dataset/rose/36155919474_78b340978e_c.jpg new file mode 100644 index 00000000..b577c5a2 Binary files /dev/null and b/src/dataset/rose/36155919474_78b340978e_c.jpg differ diff --git a/src/dataset/rose/3622035393_dc874a4730_c.jpg b/src/dataset/rose/3622035393_dc874a4730_c.jpg new file mode 100644 index 00000000..96e4182d Binary files /dev/null and b/src/dataset/rose/3622035393_dc874a4730_c.jpg differ diff --git a/src/dataset/rose/3622850950_3753a88dfc_c.jpg b/src/dataset/rose/3622850950_3753a88dfc_c.jpg new file mode 100644 index 00000000..14d47c1c Binary files /dev/null and b/src/dataset/rose/3622850950_3753a88dfc_c.jpg differ diff --git a/src/dataset/rose/3622856054_4d50ddd306_c.jpg b/src/dataset/rose/3622856054_4d50ddd306_c.jpg new file mode 100644 index 00000000..0b7f797f Binary files /dev/null and b/src/dataset/rose/3622856054_4d50ddd306_c.jpg differ diff --git a/src/dataset/rose/3622857482_8bb39d0a7f_c.jpg b/src/dataset/rose/3622857482_8bb39d0a7f_c.jpg new file mode 100644 index 00000000..0eb67f08 Binary files /dev/null and b/src/dataset/rose/3622857482_8bb39d0a7f_c.jpg differ diff --git a/src/dataset/rose/3622859156_76fffd0c64_c.jpg b/src/dataset/rose/3622859156_76fffd0c64_c.jpg new file mode 100644 index 00000000..cc73f76a Binary files /dev/null and b/src/dataset/rose/3622859156_76fffd0c64_c.jpg differ diff --git a/src/dataset/rose/3624532399_09d7f967a3_c.jpg b/src/dataset/rose/3624532399_09d7f967a3_c.jpg new file mode 100644 index 00000000..1937a52a Binary files /dev/null and b/src/dataset/rose/3624532399_09d7f967a3_c.jpg differ diff --git a/src/dataset/rose/36253901421_5688b988aa_c.jpg b/src/dataset/rose/36253901421_5688b988aa_c.jpg new file mode 100644 index 00000000..2588bac1 Binary files /dev/null and b/src/dataset/rose/36253901421_5688b988aa_c.jpg differ diff --git a/src/dataset/rose/36317206622_ded4712618_c.jpg b/src/dataset/rose/36317206622_ded4712618_c.jpg new file mode 100644 index 00000000..7ed19f67 Binary files /dev/null and b/src/dataset/rose/36317206622_ded4712618_c.jpg differ diff --git a/src/dataset/rose/36323554642_27db659461_c.jpg b/src/dataset/rose/36323554642_27db659461_c.jpg new file mode 100644 index 00000000..a74476b3 Binary files /dev/null and b/src/dataset/rose/36323554642_27db659461_c.jpg differ diff --git a/src/dataset/rose/3633502980_a321770d65_c.jpg b/src/dataset/rose/3633502980_a321770d65_c.jpg new file mode 100644 index 00000000..d3a5f154 Binary files /dev/null and b/src/dataset/rose/3633502980_a321770d65_c.jpg differ diff --git a/src/dataset/rose/36337030081_323e13c9b9_c.jpg b/src/dataset/rose/36337030081_323e13c9b9_c.jpg new file mode 100644 index 00000000..b2b4747d Binary files /dev/null and b/src/dataset/rose/36337030081_323e13c9b9_c.jpg differ diff --git a/src/dataset/rose/3646183744_ba4ff869c7_c.jpg b/src/dataset/rose/3646183744_ba4ff869c7_c.jpg new file mode 100644 index 00000000..b9a285d4 Binary files /dev/null and b/src/dataset/rose/3646183744_ba4ff869c7_c.jpg differ diff --git a/src/dataset/rose/36510327055_d0e045f508_c.jpg b/src/dataset/rose/36510327055_d0e045f508_c.jpg new file mode 100644 index 00000000..35d36a7b Binary files /dev/null and b/src/dataset/rose/36510327055_d0e045f508_c.jpg differ diff --git a/src/dataset/rose/36587255341_1537a0d70b_c.jpg b/src/dataset/rose/36587255341_1537a0d70b_c.jpg new file mode 100644 index 00000000..a8871656 Binary files /dev/null and b/src/dataset/rose/36587255341_1537a0d70b_c.jpg differ diff --git a/src/dataset/rose/36607279603_3fd5ce81a1_c.jpg b/src/dataset/rose/36607279603_3fd5ce81a1_c.jpg new file mode 100644 index 00000000..c6f86d47 Binary files /dev/null and b/src/dataset/rose/36607279603_3fd5ce81a1_c.jpg differ diff --git a/src/dataset/rose/3662530669_a2bd246d28_c.jpg b/src/dataset/rose/3662530669_a2bd246d28_c.jpg new file mode 100644 index 00000000..d05e0275 Binary files /dev/null and b/src/dataset/rose/3662530669_a2bd246d28_c.jpg differ diff --git a/src/dataset/rose/3666565506_52d109cd57_c.jpg b/src/dataset/rose/3666565506_52d109cd57_c.jpg new file mode 100644 index 00000000..06aed9b1 Binary files /dev/null and b/src/dataset/rose/3666565506_52d109cd57_c.jpg differ diff --git a/src/dataset/rose/3673213268_84b7121aac_c.jpg b/src/dataset/rose/3673213268_84b7121aac_c.jpg new file mode 100644 index 00000000..1cbca477 Binary files /dev/null and b/src/dataset/rose/3673213268_84b7121aac_c.jpg differ diff --git a/src/dataset/rose/3689372695_eca00539b5_c.jpg b/src/dataset/rose/3689372695_eca00539b5_c.jpg new file mode 100644 index 00000000..bb01d2a3 Binary files /dev/null and b/src/dataset/rose/3689372695_eca00539b5_c.jpg differ diff --git a/src/dataset/rose/3691259291_532ef90f3e_c.jpg b/src/dataset/rose/3691259291_532ef90f3e_c.jpg new file mode 100644 index 00000000..7e888f28 Binary files /dev/null and b/src/dataset/rose/3691259291_532ef90f3e_c.jpg differ diff --git a/src/dataset/rose/369448659_c3cce8889b_c.jpg b/src/dataset/rose/369448659_c3cce8889b_c.jpg new file mode 100644 index 00000000..942b95d4 Binary files /dev/null and b/src/dataset/rose/369448659_c3cce8889b_c.jpg differ diff --git a/src/dataset/rose/3702319352_7a930d0337_c.jpg b/src/dataset/rose/3702319352_7a930d0337_c.jpg new file mode 100644 index 00000000..e8fa63f1 Binary files /dev/null and b/src/dataset/rose/3702319352_7a930d0337_c.jpg differ diff --git a/src/dataset/rose/37047621714_719d120490_c.jpg b/src/dataset/rose/37047621714_719d120490_c.jpg new file mode 100644 index 00000000..2c6e3370 Binary files /dev/null and b/src/dataset/rose/37047621714_719d120490_c.jpg differ diff --git a/src/dataset/rose/37054009521_dc46007b63_c.jpg b/src/dataset/rose/37054009521_dc46007b63_c.jpg new file mode 100644 index 00000000..29fcf7b1 Binary files /dev/null and b/src/dataset/rose/37054009521_dc46007b63_c.jpg differ diff --git a/src/dataset/rose/37065218184_40542a32b7_c.jpg b/src/dataset/rose/37065218184_40542a32b7_c.jpg new file mode 100644 index 00000000..c091aa28 Binary files /dev/null and b/src/dataset/rose/37065218184_40542a32b7_c.jpg differ diff --git a/src/dataset/rose/3706930231_16c0568623_c.jpg b/src/dataset/rose/3706930231_16c0568623_c.jpg new file mode 100644 index 00000000..9707b0d8 Binary files /dev/null and b/src/dataset/rose/3706930231_16c0568623_c.jpg differ diff --git a/src/dataset/rose/37236772855_68eb9305b4_c.jpg b/src/dataset/rose/37236772855_68eb9305b4_c.jpg new file mode 100644 index 00000000..afea2852 Binary files /dev/null and b/src/dataset/rose/37236772855_68eb9305b4_c.jpg differ diff --git a/src/dataset/rose/37421104851_658939414d_c.jpg b/src/dataset/rose/37421104851_658939414d_c.jpg new file mode 100644 index 00000000..48ca5046 Binary files /dev/null and b/src/dataset/rose/37421104851_658939414d_c.jpg differ diff --git a/src/dataset/rose/3747926491_25c036d023_c.jpg b/src/dataset/rose/3747926491_25c036d023_c.jpg new file mode 100644 index 00000000..05ca9d00 Binary files /dev/null and b/src/dataset/rose/3747926491_25c036d023_c.jpg differ diff --git a/src/dataset/rose/3747927271_6955aa40b8_c.jpg b/src/dataset/rose/3747927271_6955aa40b8_c.jpg new file mode 100644 index 00000000..a111ad54 Binary files /dev/null and b/src/dataset/rose/3747927271_6955aa40b8_c.jpg differ diff --git a/src/dataset/rose/3747927883_3163ef70c6_c.jpg b/src/dataset/rose/3747927883_3163ef70c6_c.jpg new file mode 100644 index 00000000..b1f823b3 Binary files /dev/null and b/src/dataset/rose/3747927883_3163ef70c6_c.jpg differ diff --git a/src/dataset/rose/3747928345_9d32731beb_c.jpg b/src/dataset/rose/3747928345_9d32731beb_c.jpg new file mode 100644 index 00000000..4657637e Binary files /dev/null and b/src/dataset/rose/3747928345_9d32731beb_c.jpg differ diff --git a/src/dataset/rose/3747929625_1d4d51d288_c.jpg b/src/dataset/rose/3747929625_1d4d51d288_c.jpg new file mode 100644 index 00000000..5bfeee48 Binary files /dev/null and b/src/dataset/rose/3747929625_1d4d51d288_c.jpg differ diff --git a/src/dataset/rose/3748714812_0329ba6b2c_c.jpg b/src/dataset/rose/3748714812_0329ba6b2c_c.jpg new file mode 100644 index 00000000..1fb458ce Binary files /dev/null and b/src/dataset/rose/3748714812_0329ba6b2c_c.jpg differ diff --git a/src/dataset/rose/3748717164_738f9469a4_c.jpg b/src/dataset/rose/3748717164_738f9469a4_c.jpg new file mode 100644 index 00000000..efd7edd5 Binary files /dev/null and b/src/dataset/rose/3748717164_738f9469a4_c.jpg differ diff --git a/src/dataset/rose/37526965574_c9e8105ee7_c.jpg b/src/dataset/rose/37526965574_c9e8105ee7_c.jpg new file mode 100644 index 00000000..815682da Binary files /dev/null and b/src/dataset/rose/37526965574_c9e8105ee7_c.jpg differ diff --git a/src/dataset/rose/37537007156_c3891a9c27_c.jpg b/src/dataset/rose/37537007156_c3891a9c27_c.jpg new file mode 100644 index 00000000..9b0b1529 Binary files /dev/null and b/src/dataset/rose/37537007156_c3891a9c27_c.jpg differ diff --git a/src/dataset/rose/3769935473_df7886ae0a_c.jpg b/src/dataset/rose/3769935473_df7886ae0a_c.jpg new file mode 100644 index 00000000..39ce5bb9 Binary files /dev/null and b/src/dataset/rose/3769935473_df7886ae0a_c.jpg differ diff --git a/src/dataset/rose/377277099_544769262c_c.jpg b/src/dataset/rose/377277099_544769262c_c.jpg new file mode 100644 index 00000000..585a79f6 Binary files /dev/null and b/src/dataset/rose/377277099_544769262c_c.jpg differ diff --git a/src/dataset/rose/378710508_9aead53e4c_c.jpg b/src/dataset/rose/378710508_9aead53e4c_c.jpg new file mode 100644 index 00000000..72fb5282 Binary files /dev/null and b/src/dataset/rose/378710508_9aead53e4c_c.jpg differ diff --git a/src/dataset/rose/37928335852_a97888e99b_c.jpg b/src/dataset/rose/37928335852_a97888e99b_c.jpg new file mode 100644 index 00000000..e798d2a4 Binary files /dev/null and b/src/dataset/rose/37928335852_a97888e99b_c.jpg differ diff --git a/src/dataset/rose/38039351116_6e639a1903_c.jpg b/src/dataset/rose/38039351116_6e639a1903_c.jpg new file mode 100644 index 00000000..bd84244e Binary files /dev/null and b/src/dataset/rose/38039351116_6e639a1903_c.jpg differ diff --git a/src/dataset/rose/3826295683_979923fbb1_c.jpg b/src/dataset/rose/3826295683_979923fbb1_c.jpg new file mode 100644 index 00000000..754e0477 Binary files /dev/null and b/src/dataset/rose/3826295683_979923fbb1_c.jpg differ diff --git a/src/dataset/rose/3854766262_5a97b829ee_c.jpg b/src/dataset/rose/3854766262_5a97b829ee_c.jpg new file mode 100644 index 00000000..407356d4 Binary files /dev/null and b/src/dataset/rose/3854766262_5a97b829ee_c.jpg differ diff --git a/src/dataset/rose/388223548_48d5d1293a_c.jpg b/src/dataset/rose/388223548_48d5d1293a_c.jpg new file mode 100644 index 00000000..dfd44a6b Binary files /dev/null and b/src/dataset/rose/388223548_48d5d1293a_c.jpg differ diff --git a/src/dataset/rose/3882563557_c67743f8b9_c.jpg b/src/dataset/rose/3882563557_c67743f8b9_c.jpg new file mode 100644 index 00000000..01cae32a Binary files /dev/null and b/src/dataset/rose/3882563557_c67743f8b9_c.jpg differ diff --git a/src/dataset/rose/39040286_74c3c1cec8_c.jpg b/src/dataset/rose/39040286_74c3c1cec8_c.jpg new file mode 100644 index 00000000..cda76a88 Binary files /dev/null and b/src/dataset/rose/39040286_74c3c1cec8_c.jpg differ diff --git a/src/dataset/rose/39061644604_7b554f7489_c.jpg b/src/dataset/rose/39061644604_7b554f7489_c.jpg new file mode 100644 index 00000000..3bbf0ed8 Binary files /dev/null and b/src/dataset/rose/39061644604_7b554f7489_c.jpg differ diff --git a/src/dataset/rose/3923070781_e9e12fd026_c.jpg b/src/dataset/rose/3923070781_e9e12fd026_c.jpg new file mode 100644 index 00000000..ef7c26df Binary files /dev/null and b/src/dataset/rose/3923070781_e9e12fd026_c.jpg differ diff --git a/src/dataset/rose/3923851602_53eac9e733_c.jpg b/src/dataset/rose/3923851602_53eac9e733_c.jpg new file mode 100644 index 00000000..68b2612c Binary files /dev/null and b/src/dataset/rose/3923851602_53eac9e733_c.jpg differ diff --git a/src/dataset/rose/3923860708_2cc18c8fab_c.jpg b/src/dataset/rose/3923860708_2cc18c8fab_c.jpg new file mode 100644 index 00000000..29d721e8 Binary files /dev/null and b/src/dataset/rose/3923860708_2cc18c8fab_c.jpg differ diff --git a/src/dataset/rose/3944870816_1f1a1c301c_c.jpg b/src/dataset/rose/3944870816_1f1a1c301c_c.jpg new file mode 100644 index 00000000..86a548d5 Binary files /dev/null and b/src/dataset/rose/3944870816_1f1a1c301c_c.jpg differ diff --git a/src/dataset/rose/3965887317_335aa1ef67_c.jpg b/src/dataset/rose/3965887317_335aa1ef67_c.jpg new file mode 100644 index 00000000..5963cc80 Binary files /dev/null and b/src/dataset/rose/3965887317_335aa1ef67_c.jpg differ diff --git a/src/dataset/rose/3980267228_376ab0f5b4_c.jpg b/src/dataset/rose/3980267228_376ab0f5b4_c.jpg new file mode 100644 index 00000000..dd9a18b6 Binary files /dev/null and b/src/dataset/rose/3980267228_376ab0f5b4_c.jpg differ diff --git a/src/dataset/rose/3986390326.jpg b/src/dataset/rose/3986390326.jpg new file mode 100644 index 00000000..03c7a9c0 Binary files /dev/null and b/src/dataset/rose/3986390326.jpg differ diff --git a/src/dataset/rose/4008612916_480e352f58_c.jpg b/src/dataset/rose/4008612916_480e352f58_c.jpg new file mode 100644 index 00000000..fc69b113 Binary files /dev/null and b/src/dataset/rose/4008612916_480e352f58_c.jpg differ diff --git a/src/dataset/rose/4011491214_9ed31e44da_c.jpg b/src/dataset/rose/4011491214_9ed31e44da_c.jpg new file mode 100644 index 00000000..234555bf Binary files /dev/null and b/src/dataset/rose/4011491214_9ed31e44da_c.jpg differ diff --git a/src/dataset/rose/401814564_c2f5f9c507_c.jpg b/src/dataset/rose/401814564_c2f5f9c507_c.jpg new file mode 100644 index 00000000..c8e31326 Binary files /dev/null and b/src/dataset/rose/401814564_c2f5f9c507_c.jpg differ diff --git a/src/dataset/rose/402579111_3120889eaf_c.jpg b/src/dataset/rose/402579111_3120889eaf_c.jpg new file mode 100644 index 00000000..339c8c5b Binary files /dev/null and b/src/dataset/rose/402579111_3120889eaf_c.jpg differ diff --git a/src/dataset/rose/402579123_c66c697621_c.jpg b/src/dataset/rose/402579123_c66c697621_c.jpg new file mode 100644 index 00000000..8401155a Binary files /dev/null and b/src/dataset/rose/402579123_c66c697621_c.jpg differ diff --git a/src/dataset/rose/4035762406_1a5b5c5fa2_c.jpg b/src/dataset/rose/4035762406_1a5b5c5fa2_c.jpg new file mode 100644 index 00000000..5970bcd3 Binary files /dev/null and b/src/dataset/rose/4035762406_1a5b5c5fa2_c.jpg differ diff --git a/src/dataset/rose/4040414351_34930cb77d_c.jpg b/src/dataset/rose/4040414351_34930cb77d_c.jpg new file mode 100644 index 00000000..6d391c17 Binary files /dev/null and b/src/dataset/rose/4040414351_34930cb77d_c.jpg differ diff --git a/src/dataset/rose/4045395655_b56f3805a9_c.jpg b/src/dataset/rose/4045395655_b56f3805a9_c.jpg new file mode 100644 index 00000000..f74c0e0f Binary files /dev/null and b/src/dataset/rose/4045395655_b56f3805a9_c.jpg differ diff --git a/src/dataset/rose/40478195560_cccccb7591_c.jpg b/src/dataset/rose/40478195560_cccccb7591_c.jpg new file mode 100644 index 00000000..55b075ad Binary files /dev/null and b/src/dataset/rose/40478195560_cccccb7591_c.jpg differ diff --git a/src/dataset/rose/4066360885_89f0d36279_c.jpg b/src/dataset/rose/4066360885_89f0d36279_c.jpg new file mode 100644 index 00000000..e57472fc Binary files /dev/null and b/src/dataset/rose/4066360885_89f0d36279_c.jpg differ diff --git a/src/dataset/rose/4066363089_77fd8ee14d_c.jpg b/src/dataset/rose/4066363089_77fd8ee14d_c.jpg new file mode 100644 index 00000000..6e850399 Binary files /dev/null and b/src/dataset/rose/4066363089_77fd8ee14d_c.jpg differ diff --git a/src/dataset/rose/40669884360_0062b8044c_c.jpg b/src/dataset/rose/40669884360_0062b8044c_c.jpg new file mode 100644 index 00000000..c531a7e7 Binary files /dev/null and b/src/dataset/rose/40669884360_0062b8044c_c.jpg differ diff --git a/src/dataset/rose/40805497680_a8a13279fc_c.jpg b/src/dataset/rose/40805497680_a8a13279fc_c.jpg new file mode 100644 index 00000000..e1a14d59 Binary files /dev/null and b/src/dataset/rose/40805497680_a8a13279fc_c.jpg differ diff --git a/src/dataset/rose/4083052797_88892b3a97_c.jpg b/src/dataset/rose/4083052797_88892b3a97_c.jpg new file mode 100644 index 00000000..a7bd2a50 Binary files /dev/null and b/src/dataset/rose/4083052797_88892b3a97_c.jpg differ diff --git a/src/dataset/rose/4087769506_6252811962_c.jpg b/src/dataset/rose/4087769506_6252811962_c.jpg new file mode 100644 index 00000000..222ed60e Binary files /dev/null and b/src/dataset/rose/4087769506_6252811962_c.jpg differ diff --git a/src/dataset/rose/4103620810_d880455e38_c.jpg b/src/dataset/rose/4103620810_d880455e38_c.jpg new file mode 100644 index 00000000..f05e0d46 Binary files /dev/null and b/src/dataset/rose/4103620810_d880455e38_c.jpg differ diff --git a/src/dataset/rose/41277178352_bce0e5106b_c.jpg b/src/dataset/rose/41277178352_bce0e5106b_c.jpg new file mode 100644 index 00000000..9baf3b43 Binary files /dev/null and b/src/dataset/rose/41277178352_bce0e5106b_c.jpg differ diff --git a/src/dataset/rose/4129319643_42f5a2bc9f_c.jpg b/src/dataset/rose/4129319643_42f5a2bc9f_c.jpg new file mode 100644 index 00000000..17c2e587 Binary files /dev/null and b/src/dataset/rose/4129319643_42f5a2bc9f_c.jpg differ diff --git a/src/dataset/rose/4140737865_6ca88608a4_c.jpg b/src/dataset/rose/4140737865_6ca88608a4_c.jpg new file mode 100644 index 00000000..0197e885 Binary files /dev/null and b/src/dataset/rose/4140737865_6ca88608a4_c.jpg differ diff --git a/src/dataset/rose/42030451435_f250edea95_c.jpg b/src/dataset/rose/42030451435_f250edea95_c.jpg new file mode 100644 index 00000000..71e7da3b Binary files /dev/null and b/src/dataset/rose/42030451435_f250edea95_c.jpg differ diff --git a/src/dataset/rose/42183045_abd3a75314_c.jpg b/src/dataset/rose/42183045_abd3a75314_c.jpg new file mode 100644 index 00000000..dee962ae Binary files /dev/null and b/src/dataset/rose/42183045_abd3a75314_c.jpg differ diff --git a/src/dataset/rose/42859879880_5f50d05e11_c.jpg b/src/dataset/rose/42859879880_5f50d05e11_c.jpg new file mode 100644 index 00000000..da5a16c0 Binary files /dev/null and b/src/dataset/rose/42859879880_5f50d05e11_c.jpg differ diff --git a/src/dataset/rose/42859879900_852de76eb9_c.jpg b/src/dataset/rose/42859879900_852de76eb9_c.jpg new file mode 100644 index 00000000..95906ee4 Binary files /dev/null and b/src/dataset/rose/42859879900_852de76eb9_c.jpg differ diff --git a/src/dataset/rose/43042677621_d339ce15f8_c.jpg b/src/dataset/rose/43042677621_d339ce15f8_c.jpg new file mode 100644 index 00000000..c2870bd9 Binary files /dev/null and b/src/dataset/rose/43042677621_d339ce15f8_c.jpg differ diff --git a/src/dataset/rose/4311709566_3d0410b408_c.jpg b/src/dataset/rose/4311709566_3d0410b408_c.jpg new file mode 100644 index 00000000..4cd96054 Binary files /dev/null and b/src/dataset/rose/4311709566_3d0410b408_c.jpg differ diff --git a/src/dataset/rose/4343827801_115d520727_c.jpg b/src/dataset/rose/4343827801_115d520727_c.jpg new file mode 100644 index 00000000..344cc143 Binary files /dev/null and b/src/dataset/rose/4343827801_115d520727_c.jpg differ diff --git a/src/dataset/rose/4343828089_6cb38bbca1_c.jpg b/src/dataset/rose/4343828089_6cb38bbca1_c.jpg new file mode 100644 index 00000000..32fe63d0 Binary files /dev/null and b/src/dataset/rose/4343828089_6cb38bbca1_c.jpg differ diff --git a/src/dataset/rose/4357550657_29ce48df12_c.jpg b/src/dataset/rose/4357550657_29ce48df12_c.jpg new file mode 100644 index 00000000..3743f87f Binary files /dev/null and b/src/dataset/rose/4357550657_29ce48df12_c.jpg differ diff --git a/src/dataset/rose/4357972395_653c4cb76d_c.jpg b/src/dataset/rose/4357972395_653c4cb76d_c.jpg new file mode 100644 index 00000000..b732299a Binary files /dev/null and b/src/dataset/rose/4357972395_653c4cb76d_c.jpg differ diff --git a/src/dataset/rose/4362964170_ab03456ae1_c.jpg b/src/dataset/rose/4362964170_ab03456ae1_c.jpg new file mode 100644 index 00000000..5403a45b Binary files /dev/null and b/src/dataset/rose/4362964170_ab03456ae1_c.jpg differ diff --git a/src/dataset/rose/4373364544_ef9509ae1b_c.jpg b/src/dataset/rose/4373364544_ef9509ae1b_c.jpg new file mode 100644 index 00000000..5da858dd Binary files /dev/null and b/src/dataset/rose/4373364544_ef9509ae1b_c.jpg differ diff --git a/src/dataset/rose/43867827595_d60ee1e8d8_c.jpg b/src/dataset/rose/43867827595_d60ee1e8d8_c.jpg new file mode 100644 index 00000000..51dc2b39 Binary files /dev/null and b/src/dataset/rose/43867827595_d60ee1e8d8_c.jpg differ diff --git a/src/dataset/rose/43874460570_febb5e0a27_c.jpg b/src/dataset/rose/43874460570_febb5e0a27_c.jpg new file mode 100644 index 00000000..ec42b848 Binary files /dev/null and b/src/dataset/rose/43874460570_febb5e0a27_c.jpg differ diff --git a/src/dataset/rose/4391090824_6a77ba5000_c.jpg b/src/dataset/rose/4391090824_6a77ba5000_c.jpg new file mode 100644 index 00000000..64f158f2 Binary files /dev/null and b/src/dataset/rose/4391090824_6a77ba5000_c.jpg differ diff --git a/src/dataset/rose/4393453463_356b3a63c2_c.jpg b/src/dataset/rose/4393453463_356b3a63c2_c.jpg new file mode 100644 index 00000000..a375954c Binary files /dev/null and b/src/dataset/rose/4393453463_356b3a63c2_c.jpg differ diff --git a/src/dataset/rose/4418167076_607c245c35_c.jpg b/src/dataset/rose/4418167076_607c245c35_c.jpg new file mode 100644 index 00000000..36ef654f Binary files /dev/null and b/src/dataset/rose/4418167076_607c245c35_c.jpg differ diff --git a/src/dataset/rose/4420103937_1f8d1d943b_c.jpg b/src/dataset/rose/4420103937_1f8d1d943b_c.jpg new file mode 100644 index 00000000..e97a2725 Binary files /dev/null and b/src/dataset/rose/4420103937_1f8d1d943b_c.jpg differ diff --git a/src/dataset/rose/446279753_a64e48ad9d_c.jpg b/src/dataset/rose/446279753_a64e48ad9d_c.jpg new file mode 100644 index 00000000..aadd58f1 Binary files /dev/null and b/src/dataset/rose/446279753_a64e48ad9d_c.jpg differ diff --git a/src/dataset/rose/44688450282_f0e897b77c_c.jpg b/src/dataset/rose/44688450282_f0e897b77c_c.jpg new file mode 100644 index 00000000..0a508af1 Binary files /dev/null and b/src/dataset/rose/44688450282_f0e897b77c_c.jpg differ diff --git a/src/dataset/rose/4470984488_f4f89d405b_c.jpg b/src/dataset/rose/4470984488_f4f89d405b_c.jpg new file mode 100644 index 00000000..77cd6dff Binary files /dev/null and b/src/dataset/rose/4470984488_f4f89d405b_c.jpg differ diff --git a/src/dataset/rose/450717085_b448f7ae7d_c.jpg b/src/dataset/rose/450717085_b448f7ae7d_c.jpg new file mode 100644 index 00000000..05905a47 Binary files /dev/null and b/src/dataset/rose/450717085_b448f7ae7d_c.jpg differ diff --git a/src/dataset/rose/450717087_8ebb7ba4c2_c.jpg b/src/dataset/rose/450717087_8ebb7ba4c2_c.jpg new file mode 100644 index 00000000..673f7d23 Binary files /dev/null and b/src/dataset/rose/450717087_8ebb7ba4c2_c.jpg differ diff --git a/src/dataset/rose/4553259844_0af680cde4_c.jpg b/src/dataset/rose/4553259844_0af680cde4_c.jpg new file mode 100644 index 00000000..de84ab80 Binary files /dev/null and b/src/dataset/rose/4553259844_0af680cde4_c.jpg differ diff --git a/src/dataset/rose/4573556983_3dee824738_c.jpg b/src/dataset/rose/4573556983_3dee824738_c.jpg new file mode 100644 index 00000000..7c35dbdc Binary files /dev/null and b/src/dataset/rose/4573556983_3dee824738_c.jpg differ diff --git a/src/dataset/rose/4587298392_5cfd3366cd_c.jpg b/src/dataset/rose/4587298392_5cfd3366cd_c.jpg new file mode 100644 index 00000000..c194e54d Binary files /dev/null and b/src/dataset/rose/4587298392_5cfd3366cd_c.jpg differ diff --git a/src/dataset/rose/4606992239_2e827d1fbc_c.jpg b/src/dataset/rose/4606992239_2e827d1fbc_c.jpg new file mode 100644 index 00000000..43df3fdb Binary files /dev/null and b/src/dataset/rose/4606992239_2e827d1fbc_c.jpg differ diff --git a/src/dataset/rose/4607188752_514a1b0b11_c.jpg b/src/dataset/rose/4607188752_514a1b0b11_c.jpg new file mode 100644 index 00000000..9e7445e3 Binary files /dev/null and b/src/dataset/rose/4607188752_514a1b0b11_c.jpg differ diff --git a/src/dataset/rose/4619554074_b4820eb8b4_c.jpg b/src/dataset/rose/4619554074_b4820eb8b4_c.jpg new file mode 100644 index 00000000..eb9355ca Binary files /dev/null and b/src/dataset/rose/4619554074_b4820eb8b4_c.jpg differ diff --git a/src/dataset/rose/4623071565_d4aae22be1_c.jpg b/src/dataset/rose/4623071565_d4aae22be1_c.jpg new file mode 100644 index 00000000..6ad25560 Binary files /dev/null and b/src/dataset/rose/4623071565_d4aae22be1_c.jpg differ diff --git a/src/dataset/rose/4646286009_315a98a3f9_c.jpg b/src/dataset/rose/4646286009_315a98a3f9_c.jpg new file mode 100644 index 00000000..4edb728f Binary files /dev/null and b/src/dataset/rose/4646286009_315a98a3f9_c.jpg differ diff --git a/src/dataset/rose/464922216_12b3782454_c.jpg b/src/dataset/rose/464922216_12b3782454_c.jpg new file mode 100644 index 00000000..b97c7c05 Binary files /dev/null and b/src/dataset/rose/464922216_12b3782454_c.jpg differ diff --git a/src/dataset/rose/4656066041_1ba746499c_c.jpg b/src/dataset/rose/4656066041_1ba746499c_c.jpg new file mode 100644 index 00000000..e3ade8e4 Binary files /dev/null and b/src/dataset/rose/4656066041_1ba746499c_c.jpg differ diff --git a/src/dataset/rose/4656067083_b08080ec88_c.jpg b/src/dataset/rose/4656067083_b08080ec88_c.jpg new file mode 100644 index 00000000..a626872e Binary files /dev/null and b/src/dataset/rose/4656067083_b08080ec88_c.jpg differ diff --git a/src/dataset/rose/4656075053_7804836b64_c.jpg b/src/dataset/rose/4656075053_7804836b64_c.jpg new file mode 100644 index 00000000..e5132262 Binary files /dev/null and b/src/dataset/rose/4656075053_7804836b64_c.jpg differ diff --git a/src/dataset/rose/4656086033_8c0f356ffa_c.jpg b/src/dataset/rose/4656086033_8c0f356ffa_c.jpg new file mode 100644 index 00000000..66111434 Binary files /dev/null and b/src/dataset/rose/4656086033_8c0f356ffa_c.jpg differ diff --git a/src/dataset/rose/4656697720_84f78733e4_c.jpg b/src/dataset/rose/4656697720_84f78733e4_c.jpg new file mode 100644 index 00000000..c81192b1 Binary files /dev/null and b/src/dataset/rose/4656697720_84f78733e4_c.jpg differ diff --git a/src/dataset/rose/4656704310_39fb90218a_c.jpg b/src/dataset/rose/4656704310_39fb90218a_c.jpg new file mode 100644 index 00000000..a39e475b Binary files /dev/null and b/src/dataset/rose/4656704310_39fb90218a_c.jpg differ diff --git a/src/dataset/rose/4656716730_dd22cf60d4_c.jpg b/src/dataset/rose/4656716730_dd22cf60d4_c.jpg new file mode 100644 index 00000000..d5eef730 Binary files /dev/null and b/src/dataset/rose/4656716730_dd22cf60d4_c.jpg differ diff --git a/src/dataset/rose/4656719762_bd6eecc2d2_c.jpg b/src/dataset/rose/4656719762_bd6eecc2d2_c.jpg new file mode 100644 index 00000000..be39a3aa Binary files /dev/null and b/src/dataset/rose/4656719762_bd6eecc2d2_c.jpg differ diff --git a/src/dataset/rose/4656728672_c56b067652_c.jpg b/src/dataset/rose/4656728672_c56b067652_c.jpg new file mode 100644 index 00000000..137530a5 Binary files /dev/null and b/src/dataset/rose/4656728672_c56b067652_c.jpg differ diff --git a/src/dataset/rose/4656733074_1a1633a692_c.jpg b/src/dataset/rose/4656733074_1a1633a692_c.jpg new file mode 100644 index 00000000..d709cb83 Binary files /dev/null and b/src/dataset/rose/4656733074_1a1633a692_c.jpg differ diff --git a/src/dataset/rose/4656737638_17464bdd92_c.jpg b/src/dataset/rose/4656737638_17464bdd92_c.jpg new file mode 100644 index 00000000..dd286cec Binary files /dev/null and b/src/dataset/rose/4656737638_17464bdd92_c.jpg differ diff --git a/src/dataset/rose/4656738878_29705ed052_c.jpg b/src/dataset/rose/4656738878_29705ed052_c.jpg new file mode 100644 index 00000000..9db70f58 Binary files /dev/null and b/src/dataset/rose/4656738878_29705ed052_c.jpg differ diff --git a/src/dataset/rose/4656742162_10771440c4_c.jpg b/src/dataset/rose/4656742162_10771440c4_c.jpg new file mode 100644 index 00000000..a14c0b9c Binary files /dev/null and b/src/dataset/rose/4656742162_10771440c4_c.jpg differ diff --git a/src/dataset/rose/4666353418_fe516b8e2f_c.jpg b/src/dataset/rose/4666353418_fe516b8e2f_c.jpg new file mode 100644 index 00000000..26c6caba Binary files /dev/null and b/src/dataset/rose/4666353418_fe516b8e2f_c.jpg differ diff --git a/src/dataset/rose/4669659278_3dbce37d7f_c.jpg b/src/dataset/rose/4669659278_3dbce37d7f_c.jpg new file mode 100644 index 00000000..22dd97a0 Binary files /dev/null and b/src/dataset/rose/4669659278_3dbce37d7f_c.jpg differ diff --git a/src/dataset/rose/468026552_06183cb642_c.jpg b/src/dataset/rose/468026552_06183cb642_c.jpg new file mode 100644 index 00000000..7c3b22ad Binary files /dev/null and b/src/dataset/rose/468026552_06183cb642_c.jpg differ diff --git a/src/dataset/rose/4684842824_a8b6a5a0e0_c.jpg b/src/dataset/rose/4684842824_a8b6a5a0e0_c.jpg new file mode 100644 index 00000000..aa29a7bf Binary files /dev/null and b/src/dataset/rose/4684842824_a8b6a5a0e0_c.jpg differ diff --git a/src/dataset/rose/4688265296_a40b23e0f6_c.jpg b/src/dataset/rose/4688265296_a40b23e0f6_c.jpg new file mode 100644 index 00000000..37bfa9cb Binary files /dev/null and b/src/dataset/rose/4688265296_a40b23e0f6_c.jpg differ diff --git a/src/dataset/rose/4692095516_b9ce33ea42_c.jpg b/src/dataset/rose/4692095516_b9ce33ea42_c.jpg new file mode 100644 index 00000000..7a3e65f1 Binary files /dev/null and b/src/dataset/rose/4692095516_b9ce33ea42_c.jpg differ diff --git a/src/dataset/rose/4693549773_e1c1c9a8a4_c.jpg b/src/dataset/rose/4693549773_e1c1c9a8a4_c.jpg new file mode 100644 index 00000000..b15840cb Binary files /dev/null and b/src/dataset/rose/4693549773_e1c1c9a8a4_c.jpg differ diff --git a/src/dataset/rose/4700235818_fb3a96a135_c.jpg b/src/dataset/rose/4700235818_fb3a96a135_c.jpg new file mode 100644 index 00000000..6af869ed Binary files /dev/null and b/src/dataset/rose/4700235818_fb3a96a135_c.jpg differ diff --git a/src/dataset/rose/4719627283_e900d40212_c.jpg b/src/dataset/rose/4719627283_e900d40212_c.jpg new file mode 100644 index 00000000..eb95ce62 Binary files /dev/null and b/src/dataset/rose/4719627283_e900d40212_c.jpg differ diff --git a/src/dataset/rose/4729161029_f8ef219e92_c.jpg b/src/dataset/rose/4729161029_f8ef219e92_c.jpg new file mode 100644 index 00000000..eff3429e Binary files /dev/null and b/src/dataset/rose/4729161029_f8ef219e92_c.jpg differ diff --git a/src/dataset/rose/4737907017_e48314f056_c.jpg b/src/dataset/rose/4737907017_e48314f056_c.jpg new file mode 100644 index 00000000..0a6ac15d Binary files /dev/null and b/src/dataset/rose/4737907017_e48314f056_c.jpg differ diff --git a/src/dataset/rose/4742966455_9cf8038cef_c.jpg b/src/dataset/rose/4742966455_9cf8038cef_c.jpg new file mode 100644 index 00000000..6778f89f Binary files /dev/null and b/src/dataset/rose/4742966455_9cf8038cef_c.jpg differ diff --git a/src/dataset/rose/4767151099_d65873936b_c.jpg b/src/dataset/rose/4767151099_d65873936b_c.jpg new file mode 100644 index 00000000..0effe086 Binary files /dev/null and b/src/dataset/rose/4767151099_d65873936b_c.jpg differ diff --git a/src/dataset/rose/476868198_3783c6afe0_c.jpg b/src/dataset/rose/476868198_3783c6afe0_c.jpg new file mode 100644 index 00000000..8e92b441 Binary files /dev/null and b/src/dataset/rose/476868198_3783c6afe0_c.jpg differ diff --git a/src/dataset/rose/4778566509_7d56f473bc_c.jpg b/src/dataset/rose/4778566509_7d56f473bc_c.jpg new file mode 100644 index 00000000..9096a573 Binary files /dev/null and b/src/dataset/rose/4778566509_7d56f473bc_c.jpg differ diff --git a/src/dataset/rose/4779200844_410a92c636_c.jpg b/src/dataset/rose/4779200844_410a92c636_c.jpg new file mode 100644 index 00000000..6ba4103c Binary files /dev/null and b/src/dataset/rose/4779200844_410a92c636_c.jpg differ diff --git a/src/dataset/rose/4800463139_39918cd50d_c.jpg b/src/dataset/rose/4800463139_39918cd50d_c.jpg new file mode 100644 index 00000000..5fe061d2 Binary files /dev/null and b/src/dataset/rose/4800463139_39918cd50d_c.jpg differ diff --git a/src/dataset/rose/4801606259_eea2bd8c4f_c.jpg b/src/dataset/rose/4801606259_eea2bd8c4f_c.jpg new file mode 100644 index 00000000..2b86d903 Binary files /dev/null and b/src/dataset/rose/4801606259_eea2bd8c4f_c.jpg differ diff --git a/src/dataset/rose/4803532536_d73b873894_c.jpg b/src/dataset/rose/4803532536_d73b873894_c.jpg new file mode 100644 index 00000000..80961016 Binary files /dev/null and b/src/dataset/rose/4803532536_d73b873894_c.jpg differ diff --git a/src/dataset/rose/4842151034_614f0a2f4b_c.jpg b/src/dataset/rose/4842151034_614f0a2f4b_c.jpg new file mode 100644 index 00000000..0820357d Binary files /dev/null and b/src/dataset/rose/4842151034_614f0a2f4b_c.jpg differ diff --git a/src/dataset/rose/4855655116_a225a604b3_c.jpg b/src/dataset/rose/4855655116_a225a604b3_c.jpg new file mode 100644 index 00000000..31aa8b7b Binary files /dev/null and b/src/dataset/rose/4855655116_a225a604b3_c.jpg differ diff --git a/src/dataset/rose/4861285138_01188c5883_c.jpg b/src/dataset/rose/4861285138_01188c5883_c.jpg new file mode 100644 index 00000000..cc4dfbeb Binary files /dev/null and b/src/dataset/rose/4861285138_01188c5883_c.jpg differ diff --git a/src/dataset/rose/4915040353_5a3a9af3bf_c.jpg b/src/dataset/rose/4915040353_5a3a9af3bf_c.jpg new file mode 100644 index 00000000..14528ea6 Binary files /dev/null and b/src/dataset/rose/4915040353_5a3a9af3bf_c.jpg differ diff --git a/src/dataset/rose/4921490434_7eb584aa84_c.jpg b/src/dataset/rose/4921490434_7eb584aa84_c.jpg new file mode 100644 index 00000000..5486a0a1 Binary files /dev/null and b/src/dataset/rose/4921490434_7eb584aa84_c.jpg differ diff --git a/src/dataset/rose/4925641353_c4b8ec3950_c.jpg b/src/dataset/rose/4925641353_c4b8ec3950_c.jpg new file mode 100644 index 00000000..31371f7c Binary files /dev/null and b/src/dataset/rose/4925641353_c4b8ec3950_c.jpg differ diff --git a/src/dataset/rose/4936724064_61d29114a8_c.jpg b/src/dataset/rose/4936724064_61d29114a8_c.jpg new file mode 100644 index 00000000..7cda7ac6 Binary files /dev/null and b/src/dataset/rose/4936724064_61d29114a8_c.jpg differ diff --git a/src/dataset/rose/4939571801_32150a5a86_c.jpg b/src/dataset/rose/4939571801_32150a5a86_c.jpg new file mode 100644 index 00000000..3ee0434f Binary files /dev/null and b/src/dataset/rose/4939571801_32150a5a86_c.jpg differ diff --git a/src/dataset/rose/4939574115_ace337bcd3_c.jpg b/src/dataset/rose/4939574115_ace337bcd3_c.jpg new file mode 100644 index 00000000..d55ce097 Binary files /dev/null and b/src/dataset/rose/4939574115_ace337bcd3_c.jpg differ diff --git a/src/dataset/rose/4939574913_c5acb63244_c.jpg b/src/dataset/rose/4939574913_c5acb63244_c.jpg new file mode 100644 index 00000000..ec1b0a1b Binary files /dev/null and b/src/dataset/rose/4939574913_c5acb63244_c.jpg differ diff --git a/src/dataset/rose/4939578367_78b4d7b8ef_c.jpg b/src/dataset/rose/4939578367_78b4d7b8ef_c.jpg new file mode 100644 index 00000000..153fc8d5 Binary files /dev/null and b/src/dataset/rose/4939578367_78b4d7b8ef_c.jpg differ diff --git a/src/dataset/rose/4940015584_6c318e4307_c.jpg b/src/dataset/rose/4940015584_6c318e4307_c.jpg new file mode 100644 index 00000000..23b9c8c4 Binary files /dev/null and b/src/dataset/rose/4940015584_6c318e4307_c.jpg differ diff --git a/src/dataset/rose/4940162738_264b0e9c30_c.jpg b/src/dataset/rose/4940162738_264b0e9c30_c.jpg new file mode 100644 index 00000000..64b0ed94 Binary files /dev/null and b/src/dataset/rose/4940162738_264b0e9c30_c.jpg differ diff --git a/src/dataset/rose/4957188611_eb7ca6ca9a_c.jpg b/src/dataset/rose/4957188611_eb7ca6ca9a_c.jpg new file mode 100644 index 00000000..018b86b5 Binary files /dev/null and b/src/dataset/rose/4957188611_eb7ca6ca9a_c.jpg differ diff --git a/src/dataset/rose/495938797_1fa8081dfa_c.jpg b/src/dataset/rose/495938797_1fa8081dfa_c.jpg new file mode 100644 index 00000000..72d7e033 Binary files /dev/null and b/src/dataset/rose/495938797_1fa8081dfa_c.jpg differ diff --git a/src/dataset/rose/4965748511_87aee9fac3_c.jpg b/src/dataset/rose/4965748511_87aee9fac3_c.jpg new file mode 100644 index 00000000..4c010c36 Binary files /dev/null and b/src/dataset/rose/4965748511_87aee9fac3_c.jpg differ diff --git a/src/dataset/rose/497110312_768553398c_c.jpg b/src/dataset/rose/497110312_768553398c_c.jpg new file mode 100644 index 00000000..475cbfe5 Binary files /dev/null and b/src/dataset/rose/497110312_768553398c_c.jpg differ diff --git a/src/dataset/rose/497111719_9c8ebf15ce_c.jpg b/src/dataset/rose/497111719_9c8ebf15ce_c.jpg new file mode 100644 index 00000000..6f2feb1c Binary files /dev/null and b/src/dataset/rose/497111719_9c8ebf15ce_c.jpg differ diff --git a/src/dataset/rose/4987470688_32d7d68d29_c.jpg b/src/dataset/rose/4987470688_32d7d68d29_c.jpg new file mode 100644 index 00000000..2f3eda04 Binary files /dev/null and b/src/dataset/rose/4987470688_32d7d68d29_c.jpg differ diff --git a/src/dataset/rose/4999491651_1e5d7befa0_c.jpg b/src/dataset/rose/4999491651_1e5d7befa0_c.jpg new file mode 100644 index 00000000..8a28c8f5 Binary files /dev/null and b/src/dataset/rose/4999491651_1e5d7befa0_c.jpg differ diff --git a/src/dataset/rose/5023205250_bb09c1f460_c.jpg b/src/dataset/rose/5023205250_bb09c1f460_c.jpg new file mode 100644 index 00000000..edbd2341 Binary files /dev/null and b/src/dataset/rose/5023205250_bb09c1f460_c.jpg differ diff --git a/src/dataset/rose/504717810_384ff0fa45_c.jpg b/src/dataset/rose/504717810_384ff0fa45_c.jpg new file mode 100644 index 00000000..9fd79041 Binary files /dev/null and b/src/dataset/rose/504717810_384ff0fa45_c.jpg differ diff --git a/src/dataset/rose/504717952_76a8e7b101_c.jpg b/src/dataset/rose/504717952_76a8e7b101_c.jpg new file mode 100644 index 00000000..56d2ac48 Binary files /dev/null and b/src/dataset/rose/504717952_76a8e7b101_c.jpg differ diff --git a/src/dataset/rose/5076415842_1828384df0_c.jpg b/src/dataset/rose/5076415842_1828384df0_c.jpg new file mode 100644 index 00000000..ba660428 Binary files /dev/null and b/src/dataset/rose/5076415842_1828384df0_c.jpg differ diff --git a/src/dataset/rose/5097708248_c4caf7ccfb_c.jpg b/src/dataset/rose/5097708248_c4caf7ccfb_c.jpg new file mode 100644 index 00000000..63e9379d Binary files /dev/null and b/src/dataset/rose/5097708248_c4caf7ccfb_c.jpg differ diff --git a/src/dataset/rose/5112117670_2f7a0d2d5d_c.jpg b/src/dataset/rose/5112117670_2f7a0d2d5d_c.jpg new file mode 100644 index 00000000..6f404ef4 Binary files /dev/null and b/src/dataset/rose/5112117670_2f7a0d2d5d_c.jpg differ diff --git a/src/dataset/rose/5117934947_4a3318540d_c.jpg b/src/dataset/rose/5117934947_4a3318540d_c.jpg new file mode 100644 index 00000000..3250d5e4 Binary files /dev/null and b/src/dataset/rose/5117934947_4a3318540d_c.jpg differ diff --git a/src/dataset/rose/5127021282_047257c403_c.jpg b/src/dataset/rose/5127021282_047257c403_c.jpg new file mode 100644 index 00000000..5081feb3 Binary files /dev/null and b/src/dataset/rose/5127021282_047257c403_c.jpg differ diff --git a/src/dataset/rose/515173738_9007f92a0f_c.jpg b/src/dataset/rose/515173738_9007f92a0f_c.jpg new file mode 100644 index 00000000..823b8aaf Binary files /dev/null and b/src/dataset/rose/515173738_9007f92a0f_c.jpg differ diff --git a/src/dataset/rose/5179159949_46c9ddb8f4_c.jpg b/src/dataset/rose/5179159949_46c9ddb8f4_c.jpg new file mode 100644 index 00000000..ff64f2a9 Binary files /dev/null and b/src/dataset/rose/5179159949_46c9ddb8f4_c.jpg differ diff --git a/src/dataset/rose/518545682_b26cc4d152_c.jpg b/src/dataset/rose/518545682_b26cc4d152_c.jpg new file mode 100644 index 00000000..f9883580 Binary files /dev/null and b/src/dataset/rose/518545682_b26cc4d152_c.jpg differ diff --git a/src/dataset/rose/5186586319_8253ef54cd_c.jpg b/src/dataset/rose/5186586319_8253ef54cd_c.jpg new file mode 100644 index 00000000..9813b597 Binary files /dev/null and b/src/dataset/rose/5186586319_8253ef54cd_c.jpg differ diff --git a/src/dataset/rose/5214372775_2517a309f3_c.jpg b/src/dataset/rose/5214372775_2517a309f3_c.jpg new file mode 100644 index 00000000..c5283f22 Binary files /dev/null and b/src/dataset/rose/5214372775_2517a309f3_c.jpg differ diff --git a/src/dataset/rose/5235417567_b9b0011ac4_c.jpg b/src/dataset/rose/5235417567_b9b0011ac4_c.jpg new file mode 100644 index 00000000..1564518f Binary files /dev/null and b/src/dataset/rose/5235417567_b9b0011ac4_c.jpg differ diff --git a/src/dataset/rose/5245768682_934cd2f756_c.jpg b/src/dataset/rose/5245768682_934cd2f756_c.jpg new file mode 100644 index 00000000..da329313 Binary files /dev/null and b/src/dataset/rose/5245768682_934cd2f756_c.jpg differ diff --git a/src/dataset/rose/5258750605_de82dbeed2_c.jpg b/src/dataset/rose/5258750605_de82dbeed2_c.jpg new file mode 100644 index 00000000..1b981f6d Binary files /dev/null and b/src/dataset/rose/5258750605_de82dbeed2_c.jpg differ diff --git a/src/dataset/rose/527055019_b6353babf2_c.jpg b/src/dataset/rose/527055019_b6353babf2_c.jpg new file mode 100644 index 00000000..feff511a Binary files /dev/null and b/src/dataset/rose/527055019_b6353babf2_c.jpg differ diff --git a/src/dataset/rose/5299961378_64756a2659_c.jpg b/src/dataset/rose/5299961378_64756a2659_c.jpg new file mode 100644 index 00000000..efa7c9ff Binary files /dev/null and b/src/dataset/rose/5299961378_64756a2659_c.jpg differ diff --git a/src/dataset/rose/531197089_b240821319_c.jpg b/src/dataset/rose/531197089_b240821319_c.jpg new file mode 100644 index 00000000..474613b6 Binary files /dev/null and b/src/dataset/rose/531197089_b240821319_c.jpg differ diff --git a/src/dataset/rose/531197147_1c4f978563_c.jpg b/src/dataset/rose/531197147_1c4f978563_c.jpg new file mode 100644 index 00000000..32c41433 Binary files /dev/null and b/src/dataset/rose/531197147_1c4f978563_c.jpg differ diff --git a/src/dataset/rose/533599191_ebd7e0824c_c.jpg b/src/dataset/rose/533599191_ebd7e0824c_c.jpg new file mode 100644 index 00000000..b74a2838 Binary files /dev/null and b/src/dataset/rose/533599191_ebd7e0824c_c.jpg differ diff --git a/src/dataset/rose/5355603537_401066bf8b_c.jpg b/src/dataset/rose/5355603537_401066bf8b_c.jpg new file mode 100644 index 00000000..4f6238a5 Binary files /dev/null and b/src/dataset/rose/5355603537_401066bf8b_c.jpg differ diff --git a/src/dataset/rose/5358520590_94346e8350_c.jpg b/src/dataset/rose/5358520590_94346e8350_c.jpg new file mode 100644 index 00000000..05de3963 Binary files /dev/null and b/src/dataset/rose/5358520590_94346e8350_c.jpg differ diff --git a/src/dataset/rose/5360540962_7f33b57526_c.jpg b/src/dataset/rose/5360540962_7f33b57526_c.jpg new file mode 100644 index 00000000..87821aa7 Binary files /dev/null and b/src/dataset/rose/5360540962_7f33b57526_c.jpg differ diff --git a/src/dataset/rose/5371136160_c7c9ff17b2_c.jpg b/src/dataset/rose/5371136160_c7c9ff17b2_c.jpg new file mode 100644 index 00000000..0d5a5649 Binary files /dev/null and b/src/dataset/rose/5371136160_c7c9ff17b2_c.jpg differ diff --git a/src/dataset/rose/5391019702_00f2b1eee1_c.jpg b/src/dataset/rose/5391019702_00f2b1eee1_c.jpg new file mode 100644 index 00000000..e3b9fb50 Binary files /dev/null and b/src/dataset/rose/5391019702_00f2b1eee1_c.jpg differ diff --git a/src/dataset/rose/5397459269_4ebdf0d8d4_c.jpg b/src/dataset/rose/5397459269_4ebdf0d8d4_c.jpg new file mode 100644 index 00000000..998ddfef Binary files /dev/null and b/src/dataset/rose/5397459269_4ebdf0d8d4_c.jpg differ diff --git a/src/dataset/rose/5397844784_159eb02f7e_c.jpg b/src/dataset/rose/5397844784_159eb02f7e_c.jpg new file mode 100644 index 00000000..91bff069 Binary files /dev/null and b/src/dataset/rose/5397844784_159eb02f7e_c.jpg differ diff --git a/src/dataset/rose/5407233359_634a619159_c.jpg b/src/dataset/rose/5407233359_634a619159_c.jpg new file mode 100644 index 00000000..ba739983 Binary files /dev/null and b/src/dataset/rose/5407233359_634a619159_c.jpg differ diff --git a/src/dataset/rose/5410469212_6945c99932_c.jpg b/src/dataset/rose/5410469212_6945c99932_c.jpg new file mode 100644 index 00000000..229546e9 Binary files /dev/null and b/src/dataset/rose/5410469212_6945c99932_c.jpg differ diff --git a/src/dataset/rose/5420648565_2c82777808_c.jpg b/src/dataset/rose/5420648565_2c82777808_c.jpg new file mode 100644 index 00000000..e7573470 Binary files /dev/null and b/src/dataset/rose/5420648565_2c82777808_c.jpg differ diff --git a/src/dataset/rose/5421256896_856912ca3c_c.jpg b/src/dataset/rose/5421256896_856912ca3c_c.jpg new file mode 100644 index 00000000..f0fdf19b Binary files /dev/null and b/src/dataset/rose/5421256896_856912ca3c_c.jpg differ diff --git a/src/dataset/rose/5421405638_2ef350cfed_c.jpg b/src/dataset/rose/5421405638_2ef350cfed_c.jpg new file mode 100644 index 00000000..0cd5f625 Binary files /dev/null and b/src/dataset/rose/5421405638_2ef350cfed_c.jpg differ diff --git a/src/dataset/rose/54259077_c642c8d991_c.jpg b/src/dataset/rose/54259077_c642c8d991_c.jpg new file mode 100644 index 00000000..4174aabc Binary files /dev/null and b/src/dataset/rose/54259077_c642c8d991_c.jpg differ diff --git a/src/dataset/rose/543488013_5fbda20fd4_c.jpg b/src/dataset/rose/543488013_5fbda20fd4_c.jpg new file mode 100644 index 00000000..33d0e235 Binary files /dev/null and b/src/dataset/rose/543488013_5fbda20fd4_c.jpg differ diff --git a/src/dataset/rose/543488055_2e973307b7_c.jpg b/src/dataset/rose/543488055_2e973307b7_c.jpg new file mode 100644 index 00000000..b05aa63c Binary files /dev/null and b/src/dataset/rose/543488055_2e973307b7_c.jpg differ diff --git a/src/dataset/rose/5461415145_b0a5eb1f11_c.jpg b/src/dataset/rose/5461415145_b0a5eb1f11_c.jpg new file mode 100644 index 00000000..c8c80356 Binary files /dev/null and b/src/dataset/rose/5461415145_b0a5eb1f11_c.jpg differ diff --git a/src/dataset/rose/5462768163_021728e220_c.jpg b/src/dataset/rose/5462768163_021728e220_c.jpg new file mode 100644 index 00000000..3b2d98c9 Binary files /dev/null and b/src/dataset/rose/5462768163_021728e220_c.jpg differ diff --git a/src/dataset/rose/5473818483_d2e5792a66_c.jpg b/src/dataset/rose/5473818483_d2e5792a66_c.jpg new file mode 100644 index 00000000..38fd66c2 Binary files /dev/null and b/src/dataset/rose/5473818483_d2e5792a66_c.jpg differ diff --git a/src/dataset/rose/5478649993_be3e2b388e_c.jpg b/src/dataset/rose/5478649993_be3e2b388e_c.jpg new file mode 100644 index 00000000..670fc4c0 Binary files /dev/null and b/src/dataset/rose/5478649993_be3e2b388e_c.jpg differ diff --git a/src/dataset/rose/5500890705_e574b84ecd_c.jpg b/src/dataset/rose/5500890705_e574b84ecd_c.jpg new file mode 100644 index 00000000..2838c6ed Binary files /dev/null and b/src/dataset/rose/5500890705_e574b84ecd_c.jpg differ diff --git a/src/dataset/rose/553803010_2473b60082_c.jpg b/src/dataset/rose/553803010_2473b60082_c.jpg new file mode 100644 index 00000000..18676b2d Binary files /dev/null and b/src/dataset/rose/553803010_2473b60082_c.jpg differ diff --git a/src/dataset/rose/5544467900_5b2039fe51_c.jpg b/src/dataset/rose/5544467900_5b2039fe51_c.jpg new file mode 100644 index 00000000..c37029be Binary files /dev/null and b/src/dataset/rose/5544467900_5b2039fe51_c.jpg differ diff --git a/src/dataset/rose/5581931407_3d01ee03fb_c.jpg b/src/dataset/rose/5581931407_3d01ee03fb_c.jpg new file mode 100644 index 00000000..e66ace2a Binary files /dev/null and b/src/dataset/rose/5581931407_3d01ee03fb_c.jpg differ diff --git a/src/dataset/rose/5583278872_f55a0e342b_c.jpg b/src/dataset/rose/5583278872_f55a0e342b_c.jpg new file mode 100644 index 00000000..bb67ccd3 Binary files /dev/null and b/src/dataset/rose/5583278872_f55a0e342b_c.jpg differ diff --git a/src/dataset/rose/5616091157_bb7e39aa1c_c.jpg b/src/dataset/rose/5616091157_bb7e39aa1c_c.jpg new file mode 100644 index 00000000..c893c2be Binary files /dev/null and b/src/dataset/rose/5616091157_bb7e39aa1c_c.jpg differ diff --git a/src/dataset/rose/5634688563_78a0249e19_c.jpg b/src/dataset/rose/5634688563_78a0249e19_c.jpg new file mode 100644 index 00000000..8761adbc Binary files /dev/null and b/src/dataset/rose/5634688563_78a0249e19_c.jpg differ diff --git a/src/dataset/rose/5644131997_d2e4121371_c.jpg b/src/dataset/rose/5644131997_d2e4121371_c.jpg new file mode 100644 index 00000000..073e7539 Binary files /dev/null and b/src/dataset/rose/5644131997_d2e4121371_c.jpg differ diff --git a/src/dataset/rose/5673757636_4d4b3ca108_c.jpg b/src/dataset/rose/5673757636_4d4b3ca108_c.jpg new file mode 100644 index 00000000..5b13910b Binary files /dev/null and b/src/dataset/rose/5673757636_4d4b3ca108_c.jpg differ diff --git a/src/dataset/rose/5723055900_8dfc26a62a_c.jpg b/src/dataset/rose/5723055900_8dfc26a62a_c.jpg new file mode 100644 index 00000000..7dd62a4b Binary files /dev/null and b/src/dataset/rose/5723055900_8dfc26a62a_c.jpg differ diff --git a/src/dataset/rose/5726781525_a8ebf6c1f9_c.jpg b/src/dataset/rose/5726781525_a8ebf6c1f9_c.jpg new file mode 100644 index 00000000..66b5ecbb Binary files /dev/null and b/src/dataset/rose/5726781525_a8ebf6c1f9_c.jpg differ diff --git a/src/dataset/rose/5746812412_b32b1b9330_c.jpg b/src/dataset/rose/5746812412_b32b1b9330_c.jpg new file mode 100644 index 00000000..3929bc2b Binary files /dev/null and b/src/dataset/rose/5746812412_b32b1b9330_c.jpg differ diff --git a/src/dataset/rose/5756211982_9604d3e871_c.jpg b/src/dataset/rose/5756211982_9604d3e871_c.jpg new file mode 100644 index 00000000..f628cbdf Binary files /dev/null and b/src/dataset/rose/5756211982_9604d3e871_c.jpg differ diff --git a/src/dataset/rose/5767934833_009d72facb_c.jpg b/src/dataset/rose/5767934833_009d72facb_c.jpg new file mode 100644 index 00000000..f4b19ab0 Binary files /dev/null and b/src/dataset/rose/5767934833_009d72facb_c.jpg differ diff --git a/src/dataset/rose/5811194883_465422ee66_c.jpg b/src/dataset/rose/5811194883_465422ee66_c.jpg new file mode 100644 index 00000000..e6404d3a Binary files /dev/null and b/src/dataset/rose/5811194883_465422ee66_c.jpg differ diff --git a/src/dataset/rose/5811195677_ef9fff57ce_c.jpg b/src/dataset/rose/5811195677_ef9fff57ce_c.jpg new file mode 100644 index 00000000..c64a0ca4 Binary files /dev/null and b/src/dataset/rose/5811195677_ef9fff57ce_c.jpg differ diff --git a/src/dataset/rose/5811196279_3589db7abb_c.jpg b/src/dataset/rose/5811196279_3589db7abb_c.jpg new file mode 100644 index 00000000..0be6ca86 Binary files /dev/null and b/src/dataset/rose/5811196279_3589db7abb_c.jpg differ diff --git a/src/dataset/rose/5811196461_e44e113b2a_c.jpg b/src/dataset/rose/5811196461_e44e113b2a_c.jpg new file mode 100644 index 00000000..0912a337 Binary files /dev/null and b/src/dataset/rose/5811196461_e44e113b2a_c.jpg differ diff --git a/src/dataset/rose/5811197091_d4670654e8_c.jpg b/src/dataset/rose/5811197091_d4670654e8_c.jpg new file mode 100644 index 00000000..108d1902 Binary files /dev/null and b/src/dataset/rose/5811197091_d4670654e8_c.jpg differ diff --git a/src/dataset/rose/5811197221_bf8faae63b_c.jpg b/src/dataset/rose/5811197221_bf8faae63b_c.jpg new file mode 100644 index 00000000..d0a10280 Binary files /dev/null and b/src/dataset/rose/5811197221_bf8faae63b_c.jpg differ diff --git a/src/dataset/rose/5811197471_627bf32647_c.jpg b/src/dataset/rose/5811197471_627bf32647_c.jpg new file mode 100644 index 00000000..44f810ca Binary files /dev/null and b/src/dataset/rose/5811197471_627bf32647_c.jpg differ diff --git a/src/dataset/rose/5811759450_c93446a9b1_c.jpg b/src/dataset/rose/5811759450_c93446a9b1_c.jpg new file mode 100644 index 00000000..f60c97d4 Binary files /dev/null and b/src/dataset/rose/5811759450_c93446a9b1_c.jpg differ diff --git a/src/dataset/rose/5843997853_779b3a461a_c.jpg b/src/dataset/rose/5843997853_779b3a461a_c.jpg new file mode 100644 index 00000000..84e74b73 Binary files /dev/null and b/src/dataset/rose/5843997853_779b3a461a_c.jpg differ diff --git a/src/dataset/rose/5845183319_a2f06a86e4_c.jpg b/src/dataset/rose/5845183319_a2f06a86e4_c.jpg new file mode 100644 index 00000000..1fa27874 Binary files /dev/null and b/src/dataset/rose/5845183319_a2f06a86e4_c.jpg differ diff --git a/src/dataset/rose/5845738332_68fb24aa9d_c.jpg b/src/dataset/rose/5845738332_68fb24aa9d_c.jpg new file mode 100644 index 00000000..89bea833 Binary files /dev/null and b/src/dataset/rose/5845738332_68fb24aa9d_c.jpg differ diff --git a/src/dataset/rose/5864602630_84132bd7ff_c.jpg b/src/dataset/rose/5864602630_84132bd7ff_c.jpg new file mode 100644 index 00000000..ba356c21 Binary files /dev/null and b/src/dataset/rose/5864602630_84132bd7ff_c.jpg differ diff --git a/src/dataset/rose/5874760284_045637abf2_c.jpg b/src/dataset/rose/5874760284_045637abf2_c.jpg new file mode 100644 index 00000000..f49319a0 Binary files /dev/null and b/src/dataset/rose/5874760284_045637abf2_c.jpg differ diff --git a/src/dataset/rose/5877835469_c78ce00e8a_c.jpg b/src/dataset/rose/5877835469_c78ce00e8a_c.jpg new file mode 100644 index 00000000..a0a63e2e Binary files /dev/null and b/src/dataset/rose/5877835469_c78ce00e8a_c.jpg differ diff --git a/src/dataset/rose/5889647082_4c71291f41_c.jpg b/src/dataset/rose/5889647082_4c71291f41_c.jpg new file mode 100644 index 00000000..ca7c3258 Binary files /dev/null and b/src/dataset/rose/5889647082_4c71291f41_c.jpg differ diff --git a/src/dataset/rose/592610758_6dd84df3ac_c.jpg b/src/dataset/rose/592610758_6dd84df3ac_c.jpg new file mode 100644 index 00000000..57f95d7d Binary files /dev/null and b/src/dataset/rose/592610758_6dd84df3ac_c.jpg differ diff --git a/src/dataset/rose/5944327485_5ee4361555_c.jpg b/src/dataset/rose/5944327485_5ee4361555_c.jpg new file mode 100644 index 00000000..470700e8 Binary files /dev/null and b/src/dataset/rose/5944327485_5ee4361555_c.jpg differ diff --git a/src/dataset/rose/594943423_8c8c7eb06a_c.jpg b/src/dataset/rose/594943423_8c8c7eb06a_c.jpg new file mode 100644 index 00000000..cb86a41e Binary files /dev/null and b/src/dataset/rose/594943423_8c8c7eb06a_c.jpg differ diff --git a/src/dataset/rose/5952164776_885c453680_c.jpg b/src/dataset/rose/5952164776_885c453680_c.jpg new file mode 100644 index 00000000..ca8ed1d5 Binary files /dev/null and b/src/dataset/rose/5952164776_885c453680_c.jpg differ diff --git a/src/dataset/rose/5957632278_0ecb542499_c.jpg b/src/dataset/rose/5957632278_0ecb542499_c.jpg new file mode 100644 index 00000000..8896ac9e Binary files /dev/null and b/src/dataset/rose/5957632278_0ecb542499_c.jpg differ diff --git a/src/dataset/rose/5969461387_d394491f36_c.jpg b/src/dataset/rose/5969461387_d394491f36_c.jpg new file mode 100644 index 00000000..9a8c4e09 Binary files /dev/null and b/src/dataset/rose/5969461387_d394491f36_c.jpg differ diff --git a/src/dataset/rose/5984683059_d38fb078a9_c.jpg b/src/dataset/rose/5984683059_d38fb078a9_c.jpg new file mode 100644 index 00000000..ada28c1c Binary files /dev/null and b/src/dataset/rose/5984683059_d38fb078a9_c.jpg differ diff --git a/src/dataset/rose/5993847284_820c72f049_c.jpg b/src/dataset/rose/5993847284_820c72f049_c.jpg new file mode 100644 index 00000000..a38e2e98 Binary files /dev/null and b/src/dataset/rose/5993847284_820c72f049_c.jpg differ diff --git a/src/dataset/rose/6018793220_0150c9afc8_c.jpg b/src/dataset/rose/6018793220_0150c9afc8_c.jpg new file mode 100644 index 00000000..4e8c8424 Binary files /dev/null and b/src/dataset/rose/6018793220_0150c9afc8_c.jpg differ diff --git a/src/dataset/rose/604230171_76b6b1dcc6_c.jpg b/src/dataset/rose/604230171_76b6b1dcc6_c.jpg new file mode 100644 index 00000000..aab2d37a Binary files /dev/null and b/src/dataset/rose/604230171_76b6b1dcc6_c.jpg differ diff --git a/src/dataset/rose/6048819631_69c253876a_c.jpg b/src/dataset/rose/6048819631_69c253876a_c.jpg new file mode 100644 index 00000000..ea0cf00f Binary files /dev/null and b/src/dataset/rose/6048819631_69c253876a_c.jpg differ diff --git a/src/dataset/rose/6086968938_142e33dbef_c.jpg b/src/dataset/rose/6086968938_142e33dbef_c.jpg new file mode 100644 index 00000000..bcfb4c09 Binary files /dev/null and b/src/dataset/rose/6086968938_142e33dbef_c.jpg differ diff --git a/src/dataset/rose/610912889_f16f2b825f_c.jpg b/src/dataset/rose/610912889_f16f2b825f_c.jpg new file mode 100644 index 00000000..bb97e47d Binary files /dev/null and b/src/dataset/rose/610912889_f16f2b825f_c.jpg differ diff --git a/src/dataset/rose/6136511707_2ec8d847e3_c.jpg b/src/dataset/rose/6136511707_2ec8d847e3_c.jpg new file mode 100644 index 00000000..084d0b7c Binary files /dev/null and b/src/dataset/rose/6136511707_2ec8d847e3_c.jpg differ diff --git a/src/dataset/rose/6175134743_8175e630e1_c.jpg b/src/dataset/rose/6175134743_8175e630e1_c.jpg new file mode 100644 index 00000000..e555779e Binary files /dev/null and b/src/dataset/rose/6175134743_8175e630e1_c.jpg differ diff --git a/src/dataset/rose/6175137483_6ea7c523a2_c.jpg b/src/dataset/rose/6175137483_6ea7c523a2_c.jpg new file mode 100644 index 00000000..a19283db Binary files /dev/null and b/src/dataset/rose/6175137483_6ea7c523a2_c.jpg differ diff --git a/src/dataset/rose/6185065407_8d945015d3_c.jpg b/src/dataset/rose/6185065407_8d945015d3_c.jpg new file mode 100644 index 00000000..79a6e442 Binary files /dev/null and b/src/dataset/rose/6185065407_8d945015d3_c.jpg differ diff --git a/src/dataset/rose/6186772097_a958295d9d_c.jpg b/src/dataset/rose/6186772097_a958295d9d_c.jpg new file mode 100644 index 00000000..0359ec5a Binary files /dev/null and b/src/dataset/rose/6186772097_a958295d9d_c.jpg differ diff --git a/src/dataset/rose/6206552859_b8220d1fb7_c.jpg b/src/dataset/rose/6206552859_b8220d1fb7_c.jpg new file mode 100644 index 00000000..0748b21e Binary files /dev/null and b/src/dataset/rose/6206552859_b8220d1fb7_c.jpg differ diff --git a/src/dataset/rose/6207068192_7f2050c223_c.jpg b/src/dataset/rose/6207068192_7f2050c223_c.jpg new file mode 100644 index 00000000..cfc76f43 Binary files /dev/null and b/src/dataset/rose/6207068192_7f2050c223_c.jpg differ diff --git a/src/dataset/rose/6259203205_b375d36f28_c.jpg b/src/dataset/rose/6259203205_b375d36f28_c.jpg new file mode 100644 index 00000000..7dd11024 Binary files /dev/null and b/src/dataset/rose/6259203205_b375d36f28_c.jpg differ diff --git a/src/dataset/rose/6264159313_bfde17dbb9_c.jpg b/src/dataset/rose/6264159313_bfde17dbb9_c.jpg new file mode 100644 index 00000000..4e191737 Binary files /dev/null and b/src/dataset/rose/6264159313_bfde17dbb9_c.jpg differ diff --git a/src/dataset/rose/6264687542_92d5d967fa_c.jpg b/src/dataset/rose/6264687542_92d5d967fa_c.jpg new file mode 100644 index 00000000..2a764d27 Binary files /dev/null and b/src/dataset/rose/6264687542_92d5d967fa_c.jpg differ diff --git a/src/dataset/rose/6280916282_0174bb55d1_c.jpg b/src/dataset/rose/6280916282_0174bb55d1_c.jpg new file mode 100644 index 00000000..6df8205c Binary files /dev/null and b/src/dataset/rose/6280916282_0174bb55d1_c.jpg differ diff --git a/src/dataset/rose/6282751636_2931e61ed0_c.jpg b/src/dataset/rose/6282751636_2931e61ed0_c.jpg new file mode 100644 index 00000000..009a4549 Binary files /dev/null and b/src/dataset/rose/6282751636_2931e61ed0_c.jpg differ diff --git a/src/dataset/rose/6295276042_1454dac43c_c.jpg b/src/dataset/rose/6295276042_1454dac43c_c.jpg new file mode 100644 index 00000000..bbecc083 Binary files /dev/null and b/src/dataset/rose/6295276042_1454dac43c_c.jpg differ diff --git a/src/dataset/rose/6296317478_45284098ba_c.jpg b/src/dataset/rose/6296317478_45284098ba_c.jpg new file mode 100644 index 00000000..6b973571 Binary files /dev/null and b/src/dataset/rose/6296317478_45284098ba_c.jpg differ diff --git a/src/dataset/rose/6334623180_2f7371bf15_c.jpg b/src/dataset/rose/6334623180_2f7371bf15_c.jpg new file mode 100644 index 00000000..5241503c Binary files /dev/null and b/src/dataset/rose/6334623180_2f7371bf15_c.jpg differ diff --git a/src/dataset/rose/6341233397_52e160a070_c.jpg b/src/dataset/rose/6341233397_52e160a070_c.jpg new file mode 100644 index 00000000..c0b8dc9e Binary files /dev/null and b/src/dataset/rose/6341233397_52e160a070_c.jpg differ diff --git a/src/dataset/rose/635192349_e11a4c3c90_c.jpg b/src/dataset/rose/635192349_e11a4c3c90_c.jpg new file mode 100644 index 00000000..279bb858 Binary files /dev/null and b/src/dataset/rose/635192349_e11a4c3c90_c.jpg differ diff --git a/src/dataset/rose/6393851119_1f8e2070ff_c.jpg b/src/dataset/rose/6393851119_1f8e2070ff_c.jpg new file mode 100644 index 00000000..5317ece6 Binary files /dev/null and b/src/dataset/rose/6393851119_1f8e2070ff_c.jpg differ diff --git a/src/dataset/rose/6513067265_3bee547896_c.jpg b/src/dataset/rose/6513067265_3bee547896_c.jpg new file mode 100644 index 00000000..a4917aa9 Binary files /dev/null and b/src/dataset/rose/6513067265_3bee547896_c.jpg differ diff --git a/src/dataset/rose/6585852573_afc0f2803f_c.jpg b/src/dataset/rose/6585852573_afc0f2803f_c.jpg new file mode 100644 index 00000000..9c27cbd6 Binary files /dev/null and b/src/dataset/rose/6585852573_afc0f2803f_c.jpg differ diff --git a/src/dataset/rose/6605614467_5709479847_c.jpg b/src/dataset/rose/6605614467_5709479847_c.jpg new file mode 100644 index 00000000..057ef2ae Binary files /dev/null and b/src/dataset/rose/6605614467_5709479847_c.jpg differ diff --git a/src/dataset/rose/6633535409_e5e4b0a30e_c.jpg b/src/dataset/rose/6633535409_e5e4b0a30e_c.jpg new file mode 100644 index 00000000..46100411 Binary files /dev/null and b/src/dataset/rose/6633535409_e5e4b0a30e_c.jpg differ diff --git a/src/dataset/rose/6673378717_4430bd2ca0_c.jpg b/src/dataset/rose/6673378717_4430bd2ca0_c.jpg new file mode 100644 index 00000000..4f68ab21 Binary files /dev/null and b/src/dataset/rose/6673378717_4430bd2ca0_c.jpg differ diff --git a/src/dataset/rose/6679143049_1c0a0d819d_c.jpg b/src/dataset/rose/6679143049_1c0a0d819d_c.jpg new file mode 100644 index 00000000..e26d822e Binary files /dev/null and b/src/dataset/rose/6679143049_1c0a0d819d_c.jpg differ diff --git a/src/dataset/rose/6684705935_08147f3b54_c.jpg b/src/dataset/rose/6684705935_08147f3b54_c.jpg new file mode 100644 index 00000000..c075b609 Binary files /dev/null and b/src/dataset/rose/6684705935_08147f3b54_c.jpg differ diff --git a/src/dataset/rose/6734059631_d29d021c03_c.jpg b/src/dataset/rose/6734059631_d29d021c03_c.jpg new file mode 100644 index 00000000..6378c91b Binary files /dev/null and b/src/dataset/rose/6734059631_d29d021c03_c.jpg differ diff --git a/src/dataset/rose/6734063829_09c04e44ae_c.jpg b/src/dataset/rose/6734063829_09c04e44ae_c.jpg new file mode 100644 index 00000000..a7471503 Binary files /dev/null and b/src/dataset/rose/6734063829_09c04e44ae_c.jpg differ diff --git a/src/dataset/rose/6734066321_6aa74994e3_c.jpg b/src/dataset/rose/6734066321_6aa74994e3_c.jpg new file mode 100644 index 00000000..2280f53e Binary files /dev/null and b/src/dataset/rose/6734066321_6aa74994e3_c.jpg differ diff --git a/src/dataset/rose/6742407231_7354c16448_c.jpg b/src/dataset/rose/6742407231_7354c16448_c.jpg new file mode 100644 index 00000000..2e61fe15 Binary files /dev/null and b/src/dataset/rose/6742407231_7354c16448_c.jpg differ diff --git a/src/dataset/rose/676547376_fba1fcfc8c_c.jpg b/src/dataset/rose/676547376_fba1fcfc8c_c.jpg new file mode 100644 index 00000000..240bc9c0 Binary files /dev/null and b/src/dataset/rose/676547376_fba1fcfc8c_c.jpg differ diff --git a/src/dataset/rose/6780413204_8c92ecff01_c.jpg b/src/dataset/rose/6780413204_8c92ecff01_c.jpg new file mode 100644 index 00000000..bfa5fc4e Binary files /dev/null and b/src/dataset/rose/6780413204_8c92ecff01_c.jpg differ diff --git a/src/dataset/rose/6785415531_386acc683d_c.jpg b/src/dataset/rose/6785415531_386acc683d_c.jpg new file mode 100644 index 00000000..16baac05 Binary files /dev/null and b/src/dataset/rose/6785415531_386acc683d_c.jpg differ diff --git a/src/dataset/rose/6802217018_304bf701a4_c.jpg b/src/dataset/rose/6802217018_304bf701a4_c.jpg new file mode 100644 index 00000000..9fd9ec65 Binary files /dev/null and b/src/dataset/rose/6802217018_304bf701a4_c.jpg differ diff --git a/src/dataset/rose/681024715_3b0721b76a_c.jpg b/src/dataset/rose/681024715_3b0721b76a_c.jpg new file mode 100644 index 00000000..0a012351 Binary files /dev/null and b/src/dataset/rose/681024715_3b0721b76a_c.jpg differ diff --git a/src/dataset/rose/6836630450_fb4f6eafc8_c.jpg b/src/dataset/rose/6836630450_fb4f6eafc8_c.jpg new file mode 100644 index 00000000..8cb60f53 Binary files /dev/null and b/src/dataset/rose/6836630450_fb4f6eafc8_c.jpg differ diff --git a/src/dataset/rose/6836630728_f80b7e264e_c.jpg b/src/dataset/rose/6836630728_f80b7e264e_c.jpg new file mode 100644 index 00000000..8ba1e5ea Binary files /dev/null and b/src/dataset/rose/6836630728_f80b7e264e_c.jpg differ diff --git a/src/dataset/rose/6841548925_ba1149c089_c.jpg b/src/dataset/rose/6841548925_ba1149c089_c.jpg new file mode 100644 index 00000000..fa779bc7 Binary files /dev/null and b/src/dataset/rose/6841548925_ba1149c089_c.jpg differ diff --git a/src/dataset/rose/6852205845_acb5a6dafa_c.jpg b/src/dataset/rose/6852205845_acb5a6dafa_c.jpg new file mode 100644 index 00000000..8782eed0 Binary files /dev/null and b/src/dataset/rose/6852205845_acb5a6dafa_c.jpg differ diff --git a/src/dataset/rose/6866235490_7e3c942a00_c.jpg b/src/dataset/rose/6866235490_7e3c942a00_c.jpg new file mode 100644 index 00000000..067a2a1a Binary files /dev/null and b/src/dataset/rose/6866235490_7e3c942a00_c.jpg differ diff --git a/src/dataset/rose/6889144155_0b15272d6f_c.jpg b/src/dataset/rose/6889144155_0b15272d6f_c.jpg new file mode 100644 index 00000000..24cbc21c Binary files /dev/null and b/src/dataset/rose/6889144155_0b15272d6f_c.jpg differ diff --git a/src/dataset/rose/6889145833_2b67df3b75_c.jpg b/src/dataset/rose/6889145833_2b67df3b75_c.jpg new file mode 100644 index 00000000..51f367e6 Binary files /dev/null and b/src/dataset/rose/6889145833_2b67df3b75_c.jpg differ diff --git a/src/dataset/rose/6890472190_9bbf3947ae_c.jpg b/src/dataset/rose/6890472190_9bbf3947ae_c.jpg new file mode 100644 index 00000000..9fe62eea Binary files /dev/null and b/src/dataset/rose/6890472190_9bbf3947ae_c.jpg differ diff --git a/src/dataset/rose/68963342_5e9ba27107_c.jpg b/src/dataset/rose/68963342_5e9ba27107_c.jpg new file mode 100644 index 00000000..50e1a2db Binary files /dev/null and b/src/dataset/rose/68963342_5e9ba27107_c.jpg differ diff --git a/src/dataset/rose/6917601423_4a8ce921f6_c.jpg b/src/dataset/rose/6917601423_4a8ce921f6_c.jpg new file mode 100644 index 00000000..b12cce2b Binary files /dev/null and b/src/dataset/rose/6917601423_4a8ce921f6_c.jpg differ diff --git a/src/dataset/rose/6929756935_329e2a7929_c.jpg b/src/dataset/rose/6929756935_329e2a7929_c.jpg new file mode 100644 index 00000000..6f67d850 Binary files /dev/null and b/src/dataset/rose/6929756935_329e2a7929_c.jpg differ diff --git a/src/dataset/rose/696963586_e2de77cc08_c.jpg b/src/dataset/rose/696963586_e2de77cc08_c.jpg new file mode 100644 index 00000000..5c2e263f Binary files /dev/null and b/src/dataset/rose/696963586_e2de77cc08_c.jpg differ diff --git a/src/dataset/rose/6982757305_fb873b10ab_c.jpg b/src/dataset/rose/6982757305_fb873b10ab_c.jpg new file mode 100644 index 00000000..2c8fb1d2 Binary files /dev/null and b/src/dataset/rose/6982757305_fb873b10ab_c.jpg differ diff --git a/src/dataset/rose/7033432165_20e53d6789_c.jpg b/src/dataset/rose/7033432165_20e53d6789_c.jpg new file mode 100644 index 00000000..dd8f7af4 Binary files /dev/null and b/src/dataset/rose/7033432165_20e53d6789_c.jpg differ diff --git a/src/dataset/rose/7076083991_7424795c58_c.jpg b/src/dataset/rose/7076083991_7424795c58_c.jpg new file mode 100644 index 00000000..67812d91 Binary files /dev/null and b/src/dataset/rose/7076083991_7424795c58_c.jpg differ diff --git a/src/dataset/rose/7076085383_b3d36507f8_c.jpg b/src/dataset/rose/7076085383_b3d36507f8_c.jpg new file mode 100644 index 00000000..400c1a90 Binary files /dev/null and b/src/dataset/rose/7076085383_b3d36507f8_c.jpg differ diff --git a/src/dataset/rose/7121773045_a96d54c0fa_c.jpg b/src/dataset/rose/7121773045_a96d54c0fa_c.jpg new file mode 100644 index 00000000..b96e13d2 Binary files /dev/null and b/src/dataset/rose/7121773045_a96d54c0fa_c.jpg differ diff --git a/src/dataset/rose/7125135497_b1c353b974_c.jpg b/src/dataset/rose/7125135497_b1c353b974_c.jpg new file mode 100644 index 00000000..fa742c7d Binary files /dev/null and b/src/dataset/rose/7125135497_b1c353b974_c.jpg differ diff --git a/src/dataset/rose/7129765393_32c9f569a7_c.jpg b/src/dataset/rose/7129765393_32c9f569a7_c.jpg new file mode 100644 index 00000000..a70f7531 Binary files /dev/null and b/src/dataset/rose/7129765393_32c9f569a7_c.jpg differ diff --git a/src/dataset/rose/7131158011_3448b9f26c_c.jpg b/src/dataset/rose/7131158011_3448b9f26c_c.jpg new file mode 100644 index 00000000..82f0579f Binary files /dev/null and b/src/dataset/rose/7131158011_3448b9f26c_c.jpg differ diff --git a/src/dataset/rose/7148255519_0411f8728e_c.jpg b/src/dataset/rose/7148255519_0411f8728e_c.jpg new file mode 100644 index 00000000..48eabe37 Binary files /dev/null and b/src/dataset/rose/7148255519_0411f8728e_c.jpg differ diff --git a/src/dataset/rose/7148257003_bd373f37a7_c.jpg b/src/dataset/rose/7148257003_bd373f37a7_c.jpg new file mode 100644 index 00000000..1c7db7e8 Binary files /dev/null and b/src/dataset/rose/7148257003_bd373f37a7_c.jpg differ diff --git a/src/dataset/rose/7158370172_43a515a359_c.jpg b/src/dataset/rose/7158370172_43a515a359_c.jpg new file mode 100644 index 00000000..91a318e5 Binary files /dev/null and b/src/dataset/rose/7158370172_43a515a359_c.jpg differ diff --git a/src/dataset/rose/7159688332_e89201a216_c.jpg b/src/dataset/rose/7159688332_e89201a216_c.jpg new file mode 100644 index 00000000..65bcab1d Binary files /dev/null and b/src/dataset/rose/7159688332_e89201a216_c.jpg differ diff --git a/src/dataset/rose/7159893850_aab27b0b7a_c.jpg b/src/dataset/rose/7159893850_aab27b0b7a_c.jpg new file mode 100644 index 00000000..c3f5c958 Binary files /dev/null and b/src/dataset/rose/7159893850_aab27b0b7a_c.jpg differ diff --git a/src/dataset/rose/7170170977_23ecdeb0f0_c.jpg b/src/dataset/rose/7170170977_23ecdeb0f0_c.jpg new file mode 100644 index 00000000..12ce1e9f Binary files /dev/null and b/src/dataset/rose/7170170977_23ecdeb0f0_c.jpg differ diff --git a/src/dataset/rose/7182960492_12f96c97d7_c.jpg b/src/dataset/rose/7182960492_12f96c97d7_c.jpg new file mode 100644 index 00000000..fef6a8ea Binary files /dev/null and b/src/dataset/rose/7182960492_12f96c97d7_c.jpg differ diff --git a/src/dataset/rose/7202205662_6bd0259962_c.jpg b/src/dataset/rose/7202205662_6bd0259962_c.jpg new file mode 100644 index 00000000..e123647c Binary files /dev/null and b/src/dataset/rose/7202205662_6bd0259962_c.jpg differ diff --git a/src/dataset/rose/7277189692_a636279f96_c.jpg b/src/dataset/rose/7277189692_a636279f96_c.jpg new file mode 100644 index 00000000..3c4a32b5 Binary files /dev/null and b/src/dataset/rose/7277189692_a636279f96_c.jpg differ diff --git a/src/dataset/rose/7281054046_eaacca2e79_c.jpg b/src/dataset/rose/7281054046_eaacca2e79_c.jpg new file mode 100644 index 00000000..6ad0dbc5 Binary files /dev/null and b/src/dataset/rose/7281054046_eaacca2e79_c.jpg differ diff --git a/src/dataset/rose/7303805494_be485b5ea1_c.jpg b/src/dataset/rose/7303805494_be485b5ea1_c.jpg new file mode 100644 index 00000000..db97fa97 Binary files /dev/null and b/src/dataset/rose/7303805494_be485b5ea1_c.jpg differ diff --git a/src/dataset/rose/7344357814_590359907e_c.jpg b/src/dataset/rose/7344357814_590359907e_c.jpg new file mode 100644 index 00000000..ff98adb8 Binary files /dev/null and b/src/dataset/rose/7344357814_590359907e_c.jpg differ diff --git a/src/dataset/rose/7345579642_a39111d98e_c.jpg b/src/dataset/rose/7345579642_a39111d98e_c.jpg new file mode 100644 index 00000000..814be7ed Binary files /dev/null and b/src/dataset/rose/7345579642_a39111d98e_c.jpg differ diff --git a/src/dataset/rose/7349605322_e83018bc76_c.jpg b/src/dataset/rose/7349605322_e83018bc76_c.jpg new file mode 100644 index 00000000..281879db Binary files /dev/null and b/src/dataset/rose/7349605322_e83018bc76_c.jpg differ diff --git a/src/dataset/rose/7353946104_e363dc39e1_c.jpg b/src/dataset/rose/7353946104_e363dc39e1_c.jpg new file mode 100644 index 00000000..50b4a670 Binary files /dev/null and b/src/dataset/rose/7353946104_e363dc39e1_c.jpg differ diff --git a/src/dataset/rose/7354869678_68bc7ef089_c.jpg b/src/dataset/rose/7354869678_68bc7ef089_c.jpg new file mode 100644 index 00000000..8e9bd197 Binary files /dev/null and b/src/dataset/rose/7354869678_68bc7ef089_c.jpg differ diff --git a/src/dataset/rose/7357822772_4414303181_c.jpg b/src/dataset/rose/7357822772_4414303181_c.jpg new file mode 100644 index 00000000..2904a0f2 Binary files /dev/null and b/src/dataset/rose/7357822772_4414303181_c.jpg differ diff --git a/src/dataset/rose/7387440454_60d7450a64_c.jpg b/src/dataset/rose/7387440454_60d7450a64_c.jpg new file mode 100644 index 00000000..f84cf83d Binary files /dev/null and b/src/dataset/rose/7387440454_60d7450a64_c.jpg differ diff --git a/src/dataset/rose/7402078810_b69ccc8586_c.jpg b/src/dataset/rose/7402078810_b69ccc8586_c.jpg new file mode 100644 index 00000000..2a950ec7 Binary files /dev/null and b/src/dataset/rose/7402078810_b69ccc8586_c.jpg differ diff --git a/src/dataset/rose/7403146524_4e1e7d9f99_c.jpg b/src/dataset/rose/7403146524_4e1e7d9f99_c.jpg new file mode 100644 index 00000000..3ff20ffa Binary files /dev/null and b/src/dataset/rose/7403146524_4e1e7d9f99_c.jpg differ diff --git a/src/dataset/rose/7460779096_75dfc87e7f_c.jpg b/src/dataset/rose/7460779096_75dfc87e7f_c.jpg new file mode 100644 index 00000000..ca7147a8 Binary files /dev/null and b/src/dataset/rose/7460779096_75dfc87e7f_c.jpg differ diff --git a/src/dataset/rose/7517498490_454a4e1f42_c.jpg b/src/dataset/rose/7517498490_454a4e1f42_c.jpg new file mode 100644 index 00000000..57a35911 Binary files /dev/null and b/src/dataset/rose/7517498490_454a4e1f42_c.jpg differ diff --git a/src/dataset/rose/751944138_a3260b122d_c.jpg b/src/dataset/rose/751944138_a3260b122d_c.jpg new file mode 100644 index 00000000..589ae6d9 Binary files /dev/null and b/src/dataset/rose/751944138_a3260b122d_c.jpg differ diff --git a/src/dataset/rose/7600584732_1659ea93f0_c.jpg b/src/dataset/rose/7600584732_1659ea93f0_c.jpg new file mode 100644 index 00000000..63c85e5d Binary files /dev/null and b/src/dataset/rose/7600584732_1659ea93f0_c.jpg differ diff --git a/src/dataset/rose/7642780510_6263575b3f_c.jpg b/src/dataset/rose/7642780510_6263575b3f_c.jpg new file mode 100644 index 00000000..e3ed977e Binary files /dev/null and b/src/dataset/rose/7642780510_6263575b3f_c.jpg differ diff --git a/src/dataset/rose/7746115724_dd34c17cd9_c.jpg b/src/dataset/rose/7746115724_dd34c17cd9_c.jpg new file mode 100644 index 00000000..c09e3e5d Binary files /dev/null and b/src/dataset/rose/7746115724_dd34c17cd9_c.jpg differ diff --git a/src/dataset/rose/7755487360_5156b4b915_c.jpg b/src/dataset/rose/7755487360_5156b4b915_c.jpg new file mode 100644 index 00000000..c6b58df2 Binary files /dev/null and b/src/dataset/rose/7755487360_5156b4b915_c.jpg differ diff --git a/src/dataset/rose/7758395954_24a84102ab_c.jpg b/src/dataset/rose/7758395954_24a84102ab_c.jpg new file mode 100644 index 00000000..24c0ad4d Binary files /dev/null and b/src/dataset/rose/7758395954_24a84102ab_c.jpg differ diff --git a/src/dataset/rose/776264845_ff66d8bb1c_c.jpg b/src/dataset/rose/776264845_ff66d8bb1c_c.jpg new file mode 100644 index 00000000..b459cc75 Binary files /dev/null and b/src/dataset/rose/776264845_ff66d8bb1c_c.jpg differ diff --git a/src/dataset/rose/7772478886_4d4328cac5_c.jpg b/src/dataset/rose/7772478886_4d4328cac5_c.jpg new file mode 100644 index 00000000..089b25b0 Binary files /dev/null and b/src/dataset/rose/7772478886_4d4328cac5_c.jpg differ diff --git a/src/dataset/rose/7772494422_76e0003de2_c.jpg b/src/dataset/rose/7772494422_76e0003de2_c.jpg new file mode 100644 index 00000000..26cc3522 Binary files /dev/null and b/src/dataset/rose/7772494422_76e0003de2_c.jpg differ diff --git a/src/dataset/rose/7817967940_bd7529b5ae_c.jpg b/src/dataset/rose/7817967940_bd7529b5ae_c.jpg new file mode 100644 index 00000000..709c9769 Binary files /dev/null and b/src/dataset/rose/7817967940_bd7529b5ae_c.jpg differ diff --git a/src/dataset/rose/7826516066_4971a9cb2b_c.jpg b/src/dataset/rose/7826516066_4971a9cb2b_c.jpg new file mode 100644 index 00000000..402bb942 Binary files /dev/null and b/src/dataset/rose/7826516066_4971a9cb2b_c.jpg differ diff --git a/src/dataset/rose/7826516734_9e794be6af_c.jpg b/src/dataset/rose/7826516734_9e794be6af_c.jpg new file mode 100644 index 00000000..ed66c756 Binary files /dev/null and b/src/dataset/rose/7826516734_9e794be6af_c.jpg differ diff --git a/src/dataset/rose/7826519720_94cf083345_c.jpg b/src/dataset/rose/7826519720_94cf083345_c.jpg new file mode 100644 index 00000000..8f6cc1a5 Binary files /dev/null and b/src/dataset/rose/7826519720_94cf083345_c.jpg differ diff --git a/src/dataset/rose/7883839850_43014343f7_c.jpg b/src/dataset/rose/7883839850_43014343f7_c.jpg new file mode 100644 index 00000000..118765e9 Binary files /dev/null and b/src/dataset/rose/7883839850_43014343f7_c.jpg differ diff --git a/src/dataset/rose/7944072272_72a4156d3f_c.jpg b/src/dataset/rose/7944072272_72a4156d3f_c.jpg new file mode 100644 index 00000000..eb66eb86 Binary files /dev/null and b/src/dataset/rose/7944072272_72a4156d3f_c.jpg differ diff --git a/src/dataset/rose/8008000428_e6298e35b9_c.jpg b/src/dataset/rose/8008000428_e6298e35b9_c.jpg new file mode 100644 index 00000000..e1462b65 Binary files /dev/null and b/src/dataset/rose/8008000428_e6298e35b9_c.jpg differ diff --git a/src/dataset/rose/8011324647_8d0eeb81f2_c.jpg b/src/dataset/rose/8011324647_8d0eeb81f2_c.jpg new file mode 100644 index 00000000..4cc01325 Binary files /dev/null and b/src/dataset/rose/8011324647_8d0eeb81f2_c.jpg differ diff --git a/src/dataset/rose/8011333469_8bc5810fc7_c.jpg b/src/dataset/rose/8011333469_8bc5810fc7_c.jpg new file mode 100644 index 00000000..16144524 Binary files /dev/null and b/src/dataset/rose/8011333469_8bc5810fc7_c.jpg differ diff --git a/src/dataset/rose/8011340540_e68ab1ff97_c.jpg b/src/dataset/rose/8011340540_e68ab1ff97_c.jpg new file mode 100644 index 00000000..d96ee764 Binary files /dev/null and b/src/dataset/rose/8011340540_e68ab1ff97_c.jpg differ diff --git a/src/dataset/rose/8013894382_f6b339e9c0_c.jpg b/src/dataset/rose/8013894382_f6b339e9c0_c.jpg new file mode 100644 index 00000000..288d0fd3 Binary files /dev/null and b/src/dataset/rose/8013894382_f6b339e9c0_c.jpg differ diff --git a/src/dataset/rose/8020578309_322bf7bf75_c.jpg b/src/dataset/rose/8020578309_322bf7bf75_c.jpg new file mode 100644 index 00000000..feaeab69 Binary files /dev/null and b/src/dataset/rose/8020578309_322bf7bf75_c.jpg differ diff --git a/src/dataset/rose/8021081367_57a71a65c9_c.jpg b/src/dataset/rose/8021081367_57a71a65c9_c.jpg new file mode 100644 index 00000000..627346d2 Binary files /dev/null and b/src/dataset/rose/8021081367_57a71a65c9_c.jpg differ diff --git a/src/dataset/rose/8070019959_2020dc0385_c.jpg b/src/dataset/rose/8070019959_2020dc0385_c.jpg new file mode 100644 index 00000000..c10d5245 Binary files /dev/null and b/src/dataset/rose/8070019959_2020dc0385_c.jpg differ diff --git a/src/dataset/rose/8079321405_1af34cc55a_c.jpg b/src/dataset/rose/8079321405_1af34cc55a_c.jpg new file mode 100644 index 00000000..42c9ed9b Binary files /dev/null and b/src/dataset/rose/8079321405_1af34cc55a_c.jpg differ diff --git a/src/dataset/rose/8085834905_3dc9d6502f_c.jpg b/src/dataset/rose/8085834905_3dc9d6502f_c.jpg new file mode 100644 index 00000000..f040d52b Binary files /dev/null and b/src/dataset/rose/8085834905_3dc9d6502f_c.jpg differ diff --git a/src/dataset/rose/8085839926_8b7f98d0ff_c.jpg b/src/dataset/rose/8085839926_8b7f98d0ff_c.jpg new file mode 100644 index 00000000..4239325b Binary files /dev/null and b/src/dataset/rose/8085839926_8b7f98d0ff_c.jpg differ diff --git a/src/dataset/rose/8127608014_92c6a31657_c.jpg b/src/dataset/rose/8127608014_92c6a31657_c.jpg new file mode 100644 index 00000000..e62ecb97 Binary files /dev/null and b/src/dataset/rose/8127608014_92c6a31657_c.jpg differ diff --git a/src/dataset/rose/8132603128_33fd92a8d3_c.jpg b/src/dataset/rose/8132603128_33fd92a8d3_c.jpg new file mode 100644 index 00000000..4769267f Binary files /dev/null and b/src/dataset/rose/8132603128_33fd92a8d3_c.jpg differ diff --git a/src/dataset/rose/8132605869_bc2d920558_c.jpg b/src/dataset/rose/8132605869_bc2d920558_c.jpg new file mode 100644 index 00000000..5aa54a63 Binary files /dev/null and b/src/dataset/rose/8132605869_bc2d920558_c.jpg differ diff --git a/src/dataset/rose/813873375_32f738bf5a_c.jpg b/src/dataset/rose/813873375_32f738bf5a_c.jpg new file mode 100644 index 00000000..cc591972 Binary files /dev/null and b/src/dataset/rose/813873375_32f738bf5a_c.jpg differ diff --git a/src/dataset/rose/8143760507_98dc9e82fc_c.jpg b/src/dataset/rose/8143760507_98dc9e82fc_c.jpg new file mode 100644 index 00000000..e654d9bb Binary files /dev/null and b/src/dataset/rose/8143760507_98dc9e82fc_c.jpg differ diff --git a/src/dataset/rose/8143761251_b8ab512642_c.jpg b/src/dataset/rose/8143761251_b8ab512642_c.jpg new file mode 100644 index 00000000..cf905e5b Binary files /dev/null and b/src/dataset/rose/8143761251_b8ab512642_c.jpg differ diff --git a/src/dataset/rose/8143763907_51e00106d4_c.jpg b/src/dataset/rose/8143763907_51e00106d4_c.jpg new file mode 100644 index 00000000..a1a47a48 Binary files /dev/null and b/src/dataset/rose/8143763907_51e00106d4_c.jpg differ diff --git a/src/dataset/rose/8143794762_83606a103e_c.jpg b/src/dataset/rose/8143794762_83606a103e_c.jpg new file mode 100644 index 00000000..1ae13069 Binary files /dev/null and b/src/dataset/rose/8143794762_83606a103e_c.jpg differ diff --git a/src/dataset/rose/8147996556_d176118a57_c.jpg b/src/dataset/rose/8147996556_d176118a57_c.jpg new file mode 100644 index 00000000..6daee24f Binary files /dev/null and b/src/dataset/rose/8147996556_d176118a57_c.jpg differ diff --git a/src/dataset/rose/8171561545_58c9de6fa2_c.jpg b/src/dataset/rose/8171561545_58c9de6fa2_c.jpg new file mode 100644 index 00000000..6b4b6a42 Binary files /dev/null and b/src/dataset/rose/8171561545_58c9de6fa2_c.jpg differ diff --git a/src/dataset/rose/8172218687_638c3dd4b2_c.jpg b/src/dataset/rose/8172218687_638c3dd4b2_c.jpg new file mode 100644 index 00000000..d202c8f3 Binary files /dev/null and b/src/dataset/rose/8172218687_638c3dd4b2_c.jpg differ diff --git a/src/dataset/rose/8172245822_c611e5112e_c.jpg b/src/dataset/rose/8172245822_c611e5112e_c.jpg new file mode 100644 index 00000000..69795df5 Binary files /dev/null and b/src/dataset/rose/8172245822_c611e5112e_c.jpg differ diff --git a/src/dataset/rose/8172249984_118bba431d_c.jpg b/src/dataset/rose/8172249984_118bba431d_c.jpg new file mode 100644 index 00000000..75e875c4 Binary files /dev/null and b/src/dataset/rose/8172249984_118bba431d_c.jpg differ diff --git a/src/dataset/rose/8197281259_ef5fe0f17c_c.jpg b/src/dataset/rose/8197281259_ef5fe0f17c_c.jpg new file mode 100644 index 00000000..a8368020 Binary files /dev/null and b/src/dataset/rose/8197281259_ef5fe0f17c_c.jpg differ diff --git a/src/dataset/rose/8197318779_81d825615d_c.jpg b/src/dataset/rose/8197318779_81d825615d_c.jpg new file mode 100644 index 00000000..9b2f988d Binary files /dev/null and b/src/dataset/rose/8197318779_81d825615d_c.jpg differ diff --git a/src/dataset/rose/8197323143_5675aff764_c.jpg b/src/dataset/rose/8197323143_5675aff764_c.jpg new file mode 100644 index 00000000..c0f673ca Binary files /dev/null and b/src/dataset/rose/8197323143_5675aff764_c.jpg differ diff --git a/src/dataset/rose/8197355121_126e829b52_c.jpg b/src/dataset/rose/8197355121_126e829b52_c.jpg new file mode 100644 index 00000000..3c6a0d0c Binary files /dev/null and b/src/dataset/rose/8197355121_126e829b52_c.jpg differ diff --git a/src/dataset/rose/8198373888_9f104f3676_c.jpg b/src/dataset/rose/8198373888_9f104f3676_c.jpg new file mode 100644 index 00000000..b6314fe1 Binary files /dev/null and b/src/dataset/rose/8198373888_9f104f3676_c.jpg differ diff --git a/src/dataset/rose/8198375518_a49db811fd_c.jpg b/src/dataset/rose/8198375518_a49db811fd_c.jpg new file mode 100644 index 00000000..23082965 Binary files /dev/null and b/src/dataset/rose/8198375518_a49db811fd_c.jpg differ diff --git a/src/dataset/rose/8198377040_9b2c7e6ef8_c.jpg b/src/dataset/rose/8198377040_9b2c7e6ef8_c.jpg new file mode 100644 index 00000000..fe695be2 Binary files /dev/null and b/src/dataset/rose/8198377040_9b2c7e6ef8_c.jpg differ diff --git a/src/dataset/rose/8198408482_c7510b0992_c.jpg b/src/dataset/rose/8198408482_c7510b0992_c.jpg new file mode 100644 index 00000000..c3fdfa7b Binary files /dev/null and b/src/dataset/rose/8198408482_c7510b0992_c.jpg differ diff --git a/src/dataset/rose/8198413110_a4070c47ee_c.jpg b/src/dataset/rose/8198413110_a4070c47ee_c.jpg new file mode 100644 index 00000000..803fa399 Binary files /dev/null and b/src/dataset/rose/8198413110_a4070c47ee_c.jpg differ diff --git a/src/dataset/rose/8198454814_77db2f2a57_c.jpg b/src/dataset/rose/8198454814_77db2f2a57_c.jpg new file mode 100644 index 00000000..828a979f Binary files /dev/null and b/src/dataset/rose/8198454814_77db2f2a57_c.jpg differ diff --git a/src/dataset/rose/8198458828_db627ac431_c.jpg b/src/dataset/rose/8198458828_db627ac431_c.jpg new file mode 100644 index 00000000..cc287819 Binary files /dev/null and b/src/dataset/rose/8198458828_db627ac431_c.jpg differ diff --git a/src/dataset/rose/8273429828_ca4e746534_c.jpg b/src/dataset/rose/8273429828_ca4e746534_c.jpg new file mode 100644 index 00000000..54c514f5 Binary files /dev/null and b/src/dataset/rose/8273429828_ca4e746534_c.jpg differ diff --git a/src/dataset/rose/8277713612_9a13d37b78_c.jpg b/src/dataset/rose/8277713612_9a13d37b78_c.jpg new file mode 100644 index 00000000..ab024d72 Binary files /dev/null and b/src/dataset/rose/8277713612_9a13d37b78_c.jpg differ diff --git a/src/dataset/rose/8277714024_e840619542_c.jpg b/src/dataset/rose/8277714024_e840619542_c.jpg new file mode 100644 index 00000000..77a37295 Binary files /dev/null and b/src/dataset/rose/8277714024_e840619542_c.jpg differ diff --git a/src/dataset/rose/8343234588_a1c9142193_c.jpg b/src/dataset/rose/8343234588_a1c9142193_c.jpg new file mode 100644 index 00000000..92b6edb5 Binary files /dev/null and b/src/dataset/rose/8343234588_a1c9142193_c.jpg differ diff --git a/src/dataset/rose/8357064882_c2e59b9809_c.jpg b/src/dataset/rose/8357064882_c2e59b9809_c.jpg new file mode 100644 index 00000000..5a645b0a Binary files /dev/null and b/src/dataset/rose/8357064882_c2e59b9809_c.jpg differ diff --git a/src/dataset/rose/8367861962_bb3c23a44c_c.jpg b/src/dataset/rose/8367861962_bb3c23a44c_c.jpg new file mode 100644 index 00000000..0ef97308 Binary files /dev/null and b/src/dataset/rose/8367861962_bb3c23a44c_c.jpg differ diff --git a/src/dataset/rose/8368679135_b10da57dcf_c.jpg b/src/dataset/rose/8368679135_b10da57dcf_c.jpg new file mode 100644 index 00000000..0ad048ba Binary files /dev/null and b/src/dataset/rose/8368679135_b10da57dcf_c.jpg differ diff --git a/src/dataset/rose/841621710_a4302399ab_c.jpg b/src/dataset/rose/841621710_a4302399ab_c.jpg new file mode 100644 index 00000000..cc8cf469 Binary files /dev/null and b/src/dataset/rose/841621710_a4302399ab_c.jpg differ diff --git a/src/dataset/rose/8423195780_57e3489c00_c.jpg b/src/dataset/rose/8423195780_57e3489c00_c.jpg new file mode 100644 index 00000000..fe9a4859 Binary files /dev/null and b/src/dataset/rose/8423195780_57e3489c00_c.jpg differ diff --git a/src/dataset/rose/8463662492_f6d5d0fcda_c.jpg b/src/dataset/rose/8463662492_f6d5d0fcda_c.jpg new file mode 100644 index 00000000..2e907eb4 Binary files /dev/null and b/src/dataset/rose/8463662492_f6d5d0fcda_c.jpg differ diff --git a/src/dataset/rose/8475346003_2e7e8550d8_c.jpg b/src/dataset/rose/8475346003_2e7e8550d8_c.jpg new file mode 100644 index 00000000..ba4ea2b8 Binary files /dev/null and b/src/dataset/rose/8475346003_2e7e8550d8_c.jpg differ diff --git a/src/dataset/rose/8476375800_b6053406af_c.jpg b/src/dataset/rose/8476375800_b6053406af_c.jpg new file mode 100644 index 00000000..be33a5e1 Binary files /dev/null and b/src/dataset/rose/8476375800_b6053406af_c.jpg differ diff --git a/src/dataset/rose/8510993672_70293ff125_c.jpg b/src/dataset/rose/8510993672_70293ff125_c.jpg new file mode 100644 index 00000000..0edbb56d Binary files /dev/null and b/src/dataset/rose/8510993672_70293ff125_c.jpg differ diff --git a/src/dataset/rose/8538225425_124d1acda4_c.jpg b/src/dataset/rose/8538225425_124d1acda4_c.jpg new file mode 100644 index 00000000..5a75a84b Binary files /dev/null and b/src/dataset/rose/8538225425_124d1acda4_c.jpg differ diff --git a/src/dataset/rose/8565236833_3593ba5fac_c.jpg b/src/dataset/rose/8565236833_3593ba5fac_c.jpg new file mode 100644 index 00000000..a2c25750 Binary files /dev/null and b/src/dataset/rose/8565236833_3593ba5fac_c.jpg differ diff --git a/src/dataset/rose/8596807411_41df733e44_c.jpg b/src/dataset/rose/8596807411_41df733e44_c.jpg new file mode 100644 index 00000000..a7ebaf4a Binary files /dev/null and b/src/dataset/rose/8596807411_41df733e44_c.jpg differ diff --git a/src/dataset/rose/8629406553_fb2932a9ee_c.jpg b/src/dataset/rose/8629406553_fb2932a9ee_c.jpg new file mode 100644 index 00000000..5af2793f Binary files /dev/null and b/src/dataset/rose/8629406553_fb2932a9ee_c.jpg differ diff --git a/src/dataset/rose/8633402710_5f1b9e0040_c.jpg b/src/dataset/rose/8633402710_5f1b9e0040_c.jpg new file mode 100644 index 00000000..8ebf4e19 Binary files /dev/null and b/src/dataset/rose/8633402710_5f1b9e0040_c.jpg differ diff --git a/src/dataset/rose/8678535665_59b009bab0_c.jpg b/src/dataset/rose/8678535665_59b009bab0_c.jpg new file mode 100644 index 00000000..15cdc542 Binary files /dev/null and b/src/dataset/rose/8678535665_59b009bab0_c.jpg differ diff --git a/src/dataset/rose/8694821449_0d2c418f8e_c.jpg b/src/dataset/rose/8694821449_0d2c418f8e_c.jpg new file mode 100644 index 00000000..0cc3a3dc Binary files /dev/null and b/src/dataset/rose/8694821449_0d2c418f8e_c.jpg differ diff --git a/src/dataset/rose/8702674772_b285eb4fbb_c.jpg b/src/dataset/rose/8702674772_b285eb4fbb_c.jpg new file mode 100644 index 00000000..a457138f Binary files /dev/null and b/src/dataset/rose/8702674772_b285eb4fbb_c.jpg differ diff --git a/src/dataset/rose/8702677054_b916a65bf4_c.jpg b/src/dataset/rose/8702677054_b916a65bf4_c.jpg new file mode 100644 index 00000000..731a2682 Binary files /dev/null and b/src/dataset/rose/8702677054_b916a65bf4_c.jpg differ diff --git a/src/dataset/rose/8705169609_a70214c4c4_c.jpg b/src/dataset/rose/8705169609_a70214c4c4_c.jpg new file mode 100644 index 00000000..af4255b3 Binary files /dev/null and b/src/dataset/rose/8705169609_a70214c4c4_c.jpg differ diff --git a/src/dataset/rose/8705175629_3ca610d337_c.jpg b/src/dataset/rose/8705175629_3ca610d337_c.jpg new file mode 100644 index 00000000..1397afa2 Binary files /dev/null and b/src/dataset/rose/8705175629_3ca610d337_c.jpg differ diff --git a/src/dataset/rose/8706297454_421ac7f0bb_c.jpg b/src/dataset/rose/8706297454_421ac7f0bb_c.jpg new file mode 100644 index 00000000..6baa7bf8 Binary files /dev/null and b/src/dataset/rose/8706297454_421ac7f0bb_c.jpg differ diff --git a/src/dataset/rose/8713901744_c9bb7e6563_c.jpg b/src/dataset/rose/8713901744_c9bb7e6563_c.jpg new file mode 100644 index 00000000..c8b4ae70 Binary files /dev/null and b/src/dataset/rose/8713901744_c9bb7e6563_c.jpg differ diff --git a/src/dataset/rose/8731728850_e1837b1607_c.jpg b/src/dataset/rose/8731728850_e1837b1607_c.jpg new file mode 100644 index 00000000..60eff87f Binary files /dev/null and b/src/dataset/rose/8731728850_e1837b1607_c.jpg differ diff --git a/src/dataset/rose/8739679581_9479ac63e4_c.jpg b/src/dataset/rose/8739679581_9479ac63e4_c.jpg new file mode 100644 index 00000000..7dd75e60 Binary files /dev/null and b/src/dataset/rose/8739679581_9479ac63e4_c.jpg differ diff --git a/src/dataset/rose/8739680755_082f3d6790_c.jpg b/src/dataset/rose/8739680755_082f3d6790_c.jpg new file mode 100644 index 00000000..de23300a Binary files /dev/null and b/src/dataset/rose/8739680755_082f3d6790_c.jpg differ diff --git a/src/dataset/rose/8739682211_20f1aec5fe_c.jpg b/src/dataset/rose/8739682211_20f1aec5fe_c.jpg new file mode 100644 index 00000000..9fa95e6c Binary files /dev/null and b/src/dataset/rose/8739682211_20f1aec5fe_c.jpg differ diff --git a/src/dataset/rose/8739683185_17435b3217_c.jpg b/src/dataset/rose/8739683185_17435b3217_c.jpg new file mode 100644 index 00000000..c452d3ef Binary files /dev/null and b/src/dataset/rose/8739683185_17435b3217_c.jpg differ diff --git a/src/dataset/rose/8740796260_8454b2c978_c.jpg b/src/dataset/rose/8740796260_8454b2c978_c.jpg new file mode 100644 index 00000000..88b7ae35 Binary files /dev/null and b/src/dataset/rose/8740796260_8454b2c978_c.jpg differ diff --git a/src/dataset/rose/8740797734_1ac752f38d_c.jpg b/src/dataset/rose/8740797734_1ac752f38d_c.jpg new file mode 100644 index 00000000..aee25e83 Binary files /dev/null and b/src/dataset/rose/8740797734_1ac752f38d_c.jpg differ diff --git a/src/dataset/rose/8755112689_ed1b247bd5_c.jpg b/src/dataset/rose/8755112689_ed1b247bd5_c.jpg new file mode 100644 index 00000000..659d8ed9 Binary files /dev/null and b/src/dataset/rose/8755112689_ed1b247bd5_c.jpg differ diff --git a/src/dataset/rose/8755621116_28dfbc0f04_c.jpg b/src/dataset/rose/8755621116_28dfbc0f04_c.jpg new file mode 100644 index 00000000..d56aac72 Binary files /dev/null and b/src/dataset/rose/8755621116_28dfbc0f04_c.jpg differ diff --git a/src/dataset/rose/8782484528_793aa93cd6_c.jpg b/src/dataset/rose/8782484528_793aa93cd6_c.jpg new file mode 100644 index 00000000..eae0f6ef Binary files /dev/null and b/src/dataset/rose/8782484528_793aa93cd6_c.jpg differ diff --git a/src/dataset/rose/8782518372_1cbcec4de3_c.jpg b/src/dataset/rose/8782518372_1cbcec4de3_c.jpg new file mode 100644 index 00000000..43be7048 Binary files /dev/null and b/src/dataset/rose/8782518372_1cbcec4de3_c.jpg differ diff --git a/src/dataset/rose/881825045_a38d961609_c.jpg b/src/dataset/rose/881825045_a38d961609_c.jpg new file mode 100644 index 00000000..411827d6 Binary files /dev/null and b/src/dataset/rose/881825045_a38d961609_c.jpg differ diff --git a/src/dataset/rose/8897507692_3b6f7291ac_c.jpg b/src/dataset/rose/8897507692_3b6f7291ac_c.jpg new file mode 100644 index 00000000..494a395f Binary files /dev/null and b/src/dataset/rose/8897507692_3b6f7291ac_c.jpg differ diff --git a/src/dataset/rose/8903360566_722b9d1fd6_c.jpg b/src/dataset/rose/8903360566_722b9d1fd6_c.jpg new file mode 100644 index 00000000..d7b2b808 Binary files /dev/null and b/src/dataset/rose/8903360566_722b9d1fd6_c.jpg differ diff --git a/src/dataset/rose/890675906_d5efac343c_c.jpg b/src/dataset/rose/890675906_d5efac343c_c.jpg new file mode 100644 index 00000000..768492ea Binary files /dev/null and b/src/dataset/rose/890675906_d5efac343c_c.jpg differ diff --git a/src/dataset/rose/8984352281_3f6e8394ac_c.jpg b/src/dataset/rose/8984352281_3f6e8394ac_c.jpg new file mode 100644 index 00000000..057da8e2 Binary files /dev/null and b/src/dataset/rose/8984352281_3f6e8394ac_c.jpg differ diff --git a/src/dataset/rose/9088215384_d4a794c9d2_c.jpg b/src/dataset/rose/9088215384_d4a794c9d2_c.jpg new file mode 100644 index 00000000..7634d282 Binary files /dev/null and b/src/dataset/rose/9088215384_d4a794c9d2_c.jpg differ diff --git a/src/dataset/rose/9113964404_4694096010_c.jpg b/src/dataset/rose/9113964404_4694096010_c.jpg new file mode 100644 index 00000000..5529eda1 Binary files /dev/null and b/src/dataset/rose/9113964404_4694096010_c.jpg differ diff --git a/src/dataset/rose/9134581121_3206edf71f_c.jpg b/src/dataset/rose/9134581121_3206edf71f_c.jpg new file mode 100644 index 00000000..e1361809 Binary files /dev/null and b/src/dataset/rose/9134581121_3206edf71f_c.jpg differ diff --git a/src/dataset/rose/9137749093_46a9ae656b_c.jpg b/src/dataset/rose/9137749093_46a9ae656b_c.jpg new file mode 100644 index 00000000..8183f54f Binary files /dev/null and b/src/dataset/rose/9137749093_46a9ae656b_c.jpg differ diff --git a/src/dataset/rose/9139995278_2435561a07_c.jpg b/src/dataset/rose/9139995278_2435561a07_c.jpg new file mode 100644 index 00000000..996d6b04 Binary files /dev/null and b/src/dataset/rose/9139995278_2435561a07_c.jpg differ diff --git a/src/dataset/rose/9172400275_4f10745dda_c.jpg b/src/dataset/rose/9172400275_4f10745dda_c.jpg new file mode 100644 index 00000000..378e5759 Binary files /dev/null and b/src/dataset/rose/9172400275_4f10745dda_c.jpg differ diff --git a/src/dataset/rose/9172427417_9ef4631605_c.jpg b/src/dataset/rose/9172427417_9ef4631605_c.jpg new file mode 100644 index 00000000..5407e2e1 Binary files /dev/null and b/src/dataset/rose/9172427417_9ef4631605_c.jpg differ diff --git a/src/dataset/rose/9174631512_3431be9fa6_c.jpg b/src/dataset/rose/9174631512_3431be9fa6_c.jpg new file mode 100644 index 00000000..18c96c3c Binary files /dev/null and b/src/dataset/rose/9174631512_3431be9fa6_c.jpg differ diff --git a/src/dataset/rose/9174644992_32165b2a18_c.jpg b/src/dataset/rose/9174644992_32165b2a18_c.jpg new file mode 100644 index 00000000..9d76fe79 Binary files /dev/null and b/src/dataset/rose/9174644992_32165b2a18_c.jpg differ diff --git a/src/dataset/rose/9177271621_1c8fd46b30_c.jpg b/src/dataset/rose/9177271621_1c8fd46b30_c.jpg new file mode 100644 index 00000000..eb03ab4c Binary files /dev/null and b/src/dataset/rose/9177271621_1c8fd46b30_c.jpg differ diff --git a/src/dataset/rose/9185768268_1e48d4d119_c.jpg b/src/dataset/rose/9185768268_1e48d4d119_c.jpg new file mode 100644 index 00000000..b2021447 Binary files /dev/null and b/src/dataset/rose/9185768268_1e48d4d119_c.jpg differ diff --git a/src/dataset/rose/9203540076_935956ca93_c.jpg b/src/dataset/rose/9203540076_935956ca93_c.jpg new file mode 100644 index 00000000..956734a6 Binary files /dev/null and b/src/dataset/rose/9203540076_935956ca93_c.jpg differ diff --git a/src/dataset/rose/9219733749_1b6ef80855_c.jpg b/src/dataset/rose/9219733749_1b6ef80855_c.jpg new file mode 100644 index 00000000..52500de2 Binary files /dev/null and b/src/dataset/rose/9219733749_1b6ef80855_c.jpg differ diff --git a/src/dataset/rose/9230421241_665f294ca3_c.jpg b/src/dataset/rose/9230421241_665f294ca3_c.jpg new file mode 100644 index 00000000..b40321e1 Binary files /dev/null and b/src/dataset/rose/9230421241_665f294ca3_c.jpg differ diff --git a/src/dataset/rose/9231304331_477c013cd4_c.jpg b/src/dataset/rose/9231304331_477c013cd4_c.jpg new file mode 100644 index 00000000..b84b302c Binary files /dev/null and b/src/dataset/rose/9231304331_477c013cd4_c.jpg differ diff --git a/src/dataset/rose/9240977588_b6f3a48b90_c.jpg b/src/dataset/rose/9240977588_b6f3a48b90_c.jpg new file mode 100644 index 00000000..35ad028f Binary files /dev/null and b/src/dataset/rose/9240977588_b6f3a48b90_c.jpg differ diff --git a/src/dataset/rose/9246201815_6b38ea4808_c.jpg b/src/dataset/rose/9246201815_6b38ea4808_c.jpg new file mode 100644 index 00000000..59617557 Binary files /dev/null and b/src/dataset/rose/9246201815_6b38ea4808_c.jpg differ diff --git a/src/dataset/rose/9261696767_61a4eef337_c.jpg b/src/dataset/rose/9261696767_61a4eef337_c.jpg new file mode 100644 index 00000000..b13c9d11 Binary files /dev/null and b/src/dataset/rose/9261696767_61a4eef337_c.jpg differ diff --git a/src/dataset/rose/9264951873_b2e7918abb_c.jpg b/src/dataset/rose/9264951873_b2e7918abb_c.jpg new file mode 100644 index 00000000..ff581e4e Binary files /dev/null and b/src/dataset/rose/9264951873_b2e7918abb_c.jpg differ diff --git a/src/dataset/rose/9285937754_3dfcb6c726_c.jpg b/src/dataset/rose/9285937754_3dfcb6c726_c.jpg new file mode 100644 index 00000000..5ed48931 Binary files /dev/null and b/src/dataset/rose/9285937754_3dfcb6c726_c.jpg differ diff --git a/src/dataset/rose/9287614610_ca48b643cd_c.jpg b/src/dataset/rose/9287614610_ca48b643cd_c.jpg new file mode 100644 index 00000000..9ae64a08 Binary files /dev/null and b/src/dataset/rose/9287614610_ca48b643cd_c.jpg differ diff --git a/src/dataset/rose/9303283149_ab76e3e448_c.jpg b/src/dataset/rose/9303283149_ab76e3e448_c.jpg new file mode 100644 index 00000000..2b554934 Binary files /dev/null and b/src/dataset/rose/9303283149_ab76e3e448_c.jpg differ diff --git a/src/dataset/rose/9304394239_3bdfb8d28b_c.jpg b/src/dataset/rose/9304394239_3bdfb8d28b_c.jpg new file mode 100644 index 00000000..4db00960 Binary files /dev/null and b/src/dataset/rose/9304394239_3bdfb8d28b_c.jpg differ diff --git a/src/dataset/rose/9341357294_fab46067e0_c.jpg b/src/dataset/rose/9341357294_fab46067e0_c.jpg new file mode 100644 index 00000000..03ab958b Binary files /dev/null and b/src/dataset/rose/9341357294_fab46067e0_c.jpg differ diff --git a/src/dataset/rose/940962066_91d0d1ab02_c.jpg b/src/dataset/rose/940962066_91d0d1ab02_c.jpg new file mode 100644 index 00000000..a90ee744 Binary files /dev/null and b/src/dataset/rose/940962066_91d0d1ab02_c.jpg differ diff --git a/src/dataset/rose/9426713041_102c40f032_c.jpg b/src/dataset/rose/9426713041_102c40f032_c.jpg new file mode 100644 index 00000000..59edb683 Binary files /dev/null and b/src/dataset/rose/9426713041_102c40f032_c.jpg differ diff --git a/src/dataset/rose/9553145859_e84e6d540f_c.jpg b/src/dataset/rose/9553145859_e84e6d540f_c.jpg new file mode 100644 index 00000000..46cceb8e Binary files /dev/null and b/src/dataset/rose/9553145859_e84e6d540f_c.jpg differ diff --git a/src/dataset/rose/9560792430_8e91f70b23_c.jpg b/src/dataset/rose/9560792430_8e91f70b23_c.jpg new file mode 100644 index 00000000..ed89350b Binary files /dev/null and b/src/dataset/rose/9560792430_8e91f70b23_c.jpg differ diff --git a/src/dataset/rose/9574751632_b2cdc0c7a4_c.jpg b/src/dataset/rose/9574751632_b2cdc0c7a4_c.jpg new file mode 100644 index 00000000..bb9bfcd5 Binary files /dev/null and b/src/dataset/rose/9574751632_b2cdc0c7a4_c.jpg differ diff --git a/src/dataset/rose/9574751666_00bd0cfe83_c.jpg b/src/dataset/rose/9574751666_00bd0cfe83_c.jpg new file mode 100644 index 00000000..20afc8da Binary files /dev/null and b/src/dataset/rose/9574751666_00bd0cfe83_c.jpg differ diff --git a/src/dataset/rose/9574751734_61e2d15dfe_c.jpg b/src/dataset/rose/9574751734_61e2d15dfe_c.jpg new file mode 100644 index 00000000..6f02b8b3 Binary files /dev/null and b/src/dataset/rose/9574751734_61e2d15dfe_c.jpg differ diff --git a/src/dataset/rose/9574751794_93bf8fa1e8_c.jpg b/src/dataset/rose/9574751794_93bf8fa1e8_c.jpg new file mode 100644 index 00000000..ebc84539 Binary files /dev/null and b/src/dataset/rose/9574751794_93bf8fa1e8_c.jpg differ diff --git a/src/dataset/rose/9591390476_67c635088c_c.jpg b/src/dataset/rose/9591390476_67c635088c_c.jpg new file mode 100644 index 00000000..ae212cfa Binary files /dev/null and b/src/dataset/rose/9591390476_67c635088c_c.jpg differ diff --git a/src/dataset/rose/9670940733_dbc80fbf93_c.jpg b/src/dataset/rose/9670940733_dbc80fbf93_c.jpg new file mode 100644 index 00000000..87b0e506 Binary files /dev/null and b/src/dataset/rose/9670940733_dbc80fbf93_c.jpg differ diff --git a/src/dataset/rose/9689470877_f31783f4dd_c.jpg b/src/dataset/rose/9689470877_f31783f4dd_c.jpg new file mode 100644 index 00000000..6e806ddf Binary files /dev/null and b/src/dataset/rose/9689470877_f31783f4dd_c.jpg differ diff --git a/src/dataset/rose/9692922135_ca989f7f65_c.jpg b/src/dataset/rose/9692922135_ca989f7f65_c.jpg new file mode 100644 index 00000000..7625c47a Binary files /dev/null and b/src/dataset/rose/9692922135_ca989f7f65_c.jpg differ diff --git a/src/dataset/rose/9712694465_58b70077d1_c.jpg b/src/dataset/rose/9712694465_58b70077d1_c.jpg new file mode 100644 index 00000000..3c312a24 Binary files /dev/null and b/src/dataset/rose/9712694465_58b70077d1_c.jpg differ diff --git a/src/dataset/rose/9712694549_893c4203bd_c.jpg b/src/dataset/rose/9712694549_893c4203bd_c.jpg new file mode 100644 index 00000000..acf4ae63 Binary files /dev/null and b/src/dataset/rose/9712694549_893c4203bd_c.jpg differ diff --git a/src/dataset/rose/9715969136_38fe5bcca3_c.jpg b/src/dataset/rose/9715969136_38fe5bcca3_c.jpg new file mode 100644 index 00000000..92ea8c18 Binary files /dev/null and b/src/dataset/rose/9715969136_38fe5bcca3_c.jpg differ diff --git a/src/dataset/rose/9715969200_60fde2d97d_c.jpg b/src/dataset/rose/9715969200_60fde2d97d_c.jpg new file mode 100644 index 00000000..b03954e6 Binary files /dev/null and b/src/dataset/rose/9715969200_60fde2d97d_c.jpg differ diff --git a/src/dataset/rose/9716058738_cd2b8cc97a_c.jpg b/src/dataset/rose/9716058738_cd2b8cc97a_c.jpg new file mode 100644 index 00000000..8be2a9c7 Binary files /dev/null and b/src/dataset/rose/9716058738_cd2b8cc97a_c.jpg differ diff --git a/src/dataset/rose/9785439455_c87dfb4ab9_c.jpg b/src/dataset/rose/9785439455_c87dfb4ab9_c.jpg new file mode 100644 index 00000000..b61973fa Binary files /dev/null and b/src/dataset/rose/9785439455_c87dfb4ab9_c.jpg differ diff --git a/src/dataset/rose/9804267784_f5f8c436b4_c.jpg b/src/dataset/rose/9804267784_f5f8c436b4_c.jpg new file mode 100644 index 00000000..99a784f1 Binary files /dev/null and b/src/dataset/rose/9804267784_f5f8c436b4_c.jpg differ diff --git a/src/dataset/rose/9949176603_cd37af664b_c.jpg b/src/dataset/rose/9949176603_cd37af664b_c.jpg new file mode 100644 index 00000000..f8f7cece Binary files /dev/null and b/src/dataset/rose/9949176603_cd37af664b_c.jpg differ diff --git a/src/dataset/sunflower/10011283315_d8e812a998_c.jpg b/src/dataset/sunflower/10011283315_d8e812a998_c.jpg new file mode 100644 index 00000000..f3f5e62a Binary files /dev/null and b/src/dataset/sunflower/10011283315_d8e812a998_c.jpg differ diff --git a/src/dataset/sunflower/10088209136_2ca2a59218_c.jpg b/src/dataset/sunflower/10088209136_2ca2a59218_c.jpg new file mode 100644 index 00000000..b85d0ed5 Binary files /dev/null and b/src/dataset/sunflower/10088209136_2ca2a59218_c.jpg differ diff --git a/src/dataset/sunflower/10210025666_5d84aeb685_c.jpg b/src/dataset/sunflower/10210025666_5d84aeb685_c.jpg new file mode 100644 index 00000000..eb757de1 Binary files /dev/null and b/src/dataset/sunflower/10210025666_5d84aeb685_c.jpg differ diff --git a/src/dataset/sunflower/10211713845_18dffecf8e_c.jpg b/src/dataset/sunflower/10211713845_18dffecf8e_c.jpg new file mode 100644 index 00000000..5e890f9c Binary files /dev/null and b/src/dataset/sunflower/10211713845_18dffecf8e_c.jpg differ diff --git a/src/dataset/sunflower/102972561_dbab2a876b_c.jpg b/src/dataset/sunflower/102972561_dbab2a876b_c.jpg new file mode 100644 index 00000000..70bc073d Binary files /dev/null and b/src/dataset/sunflower/102972561_dbab2a876b_c.jpg differ diff --git a/src/dataset/sunflower/10371326925_64dda8ba37_c.jpg b/src/dataset/sunflower/10371326925_64dda8ba37_c.jpg new file mode 100644 index 00000000..9a4e62ab Binary files /dev/null and b/src/dataset/sunflower/10371326925_64dda8ba37_c.jpg differ diff --git a/src/dataset/sunflower/104105032_73f190dae8_c.jpg b/src/dataset/sunflower/104105032_73f190dae8_c.jpg new file mode 100644 index 00000000..2505059a Binary files /dev/null and b/src/dataset/sunflower/104105032_73f190dae8_c.jpg differ diff --git a/src/dataset/sunflower/1049322612_b6152b6736_c.jpg b/src/dataset/sunflower/1049322612_b6152b6736_c.jpg new file mode 100644 index 00000000..44aa553e Binary files /dev/null and b/src/dataset/sunflower/1049322612_b6152b6736_c.jpg differ diff --git a/src/dataset/sunflower/10687547556_c36e10553e_c.jpg b/src/dataset/sunflower/10687547556_c36e10553e_c.jpg new file mode 100644 index 00000000..927e341e Binary files /dev/null and b/src/dataset/sunflower/10687547556_c36e10553e_c.jpg differ diff --git a/src/dataset/sunflower/107073102_bd8b40b24c_c.jpg b/src/dataset/sunflower/107073102_bd8b40b24c_c.jpg new file mode 100644 index 00000000..c128accf Binary files /dev/null and b/src/dataset/sunflower/107073102_bd8b40b24c_c.jpg differ diff --git a/src/dataset/sunflower/10746511783_21904a9d8d_c.jpg b/src/dataset/sunflower/10746511783_21904a9d8d_c.jpg new file mode 100644 index 00000000..9e7c544f Binary files /dev/null and b/src/dataset/sunflower/10746511783_21904a9d8d_c.jpg differ diff --git a/src/dataset/sunflower/107636804_fa65e111c6_c.jpg b/src/dataset/sunflower/107636804_fa65e111c6_c.jpg new file mode 100644 index 00000000..c7e5ec31 Binary files /dev/null and b/src/dataset/sunflower/107636804_fa65e111c6_c.jpg differ diff --git a/src/dataset/sunflower/1091622274_f53ae12f62_c.jpg b/src/dataset/sunflower/1091622274_f53ae12f62_c.jpg new file mode 100644 index 00000000..34e8da02 Binary files /dev/null and b/src/dataset/sunflower/1091622274_f53ae12f62_c.jpg differ diff --git a/src/dataset/sunflower/110474474_1102c8ac00_c.jpg b/src/dataset/sunflower/110474474_1102c8ac00_c.jpg new file mode 100644 index 00000000..996deea7 Binary files /dev/null and b/src/dataset/sunflower/110474474_1102c8ac00_c.jpg differ diff --git a/src/dataset/sunflower/1106558887_f33f5ef4b4_c.jpg b/src/dataset/sunflower/1106558887_f33f5ef4b4_c.jpg new file mode 100644 index 00000000..a10e4bb2 Binary files /dev/null and b/src/dataset/sunflower/1106558887_f33f5ef4b4_c.jpg differ diff --git a/src/dataset/sunflower/1109359641_39f2b5a33d_c.jpg b/src/dataset/sunflower/1109359641_39f2b5a33d_c.jpg new file mode 100644 index 00000000..2a56f23d Binary files /dev/null and b/src/dataset/sunflower/1109359641_39f2b5a33d_c.jpg differ diff --git a/src/dataset/sunflower/1133681213_bd66664304_c.jpg b/src/dataset/sunflower/1133681213_bd66664304_c.jpg new file mode 100644 index 00000000..233bf5b5 Binary files /dev/null and b/src/dataset/sunflower/1133681213_bd66664304_c.jpg differ diff --git a/src/dataset/sunflower/1146694366_1cd11d776a_c.jpg b/src/dataset/sunflower/1146694366_1cd11d776a_c.jpg new file mode 100644 index 00000000..e523575f Binary files /dev/null and b/src/dataset/sunflower/1146694366_1cd11d776a_c.jpg differ diff --git a/src/dataset/sunflower/1149584904_d5f3d93740_c.jpg b/src/dataset/sunflower/1149584904_d5f3d93740_c.jpg new file mode 100644 index 00000000..3d53963f Binary files /dev/null and b/src/dataset/sunflower/1149584904_d5f3d93740_c.jpg differ diff --git a/src/dataset/sunflower/11779438744_3c68cd846b_c.jpg b/src/dataset/sunflower/11779438744_3c68cd846b_c.jpg new file mode 100644 index 00000000..1ede46fa Binary files /dev/null and b/src/dataset/sunflower/11779438744_3c68cd846b_c.jpg differ diff --git a/src/dataset/sunflower/11809264185_c6cc103bcf_c.jpg b/src/dataset/sunflower/11809264185_c6cc103bcf_c.jpg new file mode 100644 index 00000000..15d0594d Binary files /dev/null and b/src/dataset/sunflower/11809264185_c6cc103bcf_c.jpg differ diff --git a/src/dataset/sunflower/1182186777_37be9cba9a_c.jpg b/src/dataset/sunflower/1182186777_37be9cba9a_c.jpg new file mode 100644 index 00000000..dba9b26c Binary files /dev/null and b/src/dataset/sunflower/1182186777_37be9cba9a_c.jpg differ diff --git a/src/dataset/sunflower/1183046296_faa2427337_c.jpg b/src/dataset/sunflower/1183046296_faa2427337_c.jpg new file mode 100644 index 00000000..9bad6034 Binary files /dev/null and b/src/dataset/sunflower/1183046296_faa2427337_c.jpg differ diff --git a/src/dataset/sunflower/1183047236_2922c10538_c.jpg b/src/dataset/sunflower/1183047236_2922c10538_c.jpg new file mode 100644 index 00000000..5c89a1c2 Binary files /dev/null and b/src/dataset/sunflower/1183047236_2922c10538_c.jpg differ diff --git a/src/dataset/sunflower/11931307_f5431aca39_c.jpg b/src/dataset/sunflower/11931307_f5431aca39_c.jpg new file mode 100644 index 00000000..f464bcc3 Binary files /dev/null and b/src/dataset/sunflower/11931307_f5431aca39_c.jpg differ diff --git a/src/dataset/sunflower/1193278641_bec50582cb_c.jpg b/src/dataset/sunflower/1193278641_bec50582cb_c.jpg new file mode 100644 index 00000000..ac2ec03b Binary files /dev/null and b/src/dataset/sunflower/1193278641_bec50582cb_c.jpg differ diff --git a/src/dataset/sunflower/12273153114_81f421c3ff_c.jpg b/src/dataset/sunflower/12273153114_81f421c3ff_c.jpg new file mode 100644 index 00000000..b4c2df4f Binary files /dev/null and b/src/dataset/sunflower/12273153114_81f421c3ff_c.jpg differ diff --git a/src/dataset/sunflower/1232137407_2f5185e3d2_c.jpg b/src/dataset/sunflower/1232137407_2f5185e3d2_c.jpg new file mode 100644 index 00000000..d6a69cef Binary files /dev/null and b/src/dataset/sunflower/1232137407_2f5185e3d2_c.jpg differ diff --git a/src/dataset/sunflower/1236047831_3e30999b98_c.jpg b/src/dataset/sunflower/1236047831_3e30999b98_c.jpg new file mode 100644 index 00000000..c3428ac6 Binary files /dev/null and b/src/dataset/sunflower/1236047831_3e30999b98_c.jpg differ diff --git a/src/dataset/sunflower/1236048831_12bad03bbb_c.jpg b/src/dataset/sunflower/1236048831_12bad03bbb_c.jpg new file mode 100644 index 00000000..c409467f Binary files /dev/null and b/src/dataset/sunflower/1236048831_12bad03bbb_c.jpg differ diff --git a/src/dataset/sunflower/1236911294_5bf65bc438_c.jpg b/src/dataset/sunflower/1236911294_5bf65bc438_c.jpg new file mode 100644 index 00000000..37e60329 Binary files /dev/null and b/src/dataset/sunflower/1236911294_5bf65bc438_c.jpg differ diff --git a/src/dataset/sunflower/1255290711_691bf6d671_c.jpg b/src/dataset/sunflower/1255290711_691bf6d671_c.jpg new file mode 100644 index 00000000..a8c4c362 Binary files /dev/null and b/src/dataset/sunflower/1255290711_691bf6d671_c.jpg differ diff --git a/src/dataset/sunflower/1257775378_2dc11f0ae2_c.jpg b/src/dataset/sunflower/1257775378_2dc11f0ae2_c.jpg new file mode 100644 index 00000000..0351ea33 Binary files /dev/null and b/src/dataset/sunflower/1257775378_2dc11f0ae2_c.jpg differ diff --git a/src/dataset/sunflower/1279740126_5f88f8b32f_c.jpg b/src/dataset/sunflower/1279740126_5f88f8b32f_c.jpg new file mode 100644 index 00000000..b428e965 Binary files /dev/null and b/src/dataset/sunflower/1279740126_5f88f8b32f_c.jpg differ diff --git a/src/dataset/sunflower/1311186327_0a20d57890_c.jpg b/src/dataset/sunflower/1311186327_0a20d57890_c.jpg new file mode 100644 index 00000000..c41137f7 Binary files /dev/null and b/src/dataset/sunflower/1311186327_0a20d57890_c.jpg differ diff --git a/src/dataset/sunflower/1311195373_51ef605988_c.jpg b/src/dataset/sunflower/1311195373_51ef605988_c.jpg new file mode 100644 index 00000000..efef19aa Binary files /dev/null and b/src/dataset/sunflower/1311195373_51ef605988_c.jpg differ diff --git a/src/dataset/sunflower/13308929034_2995d6c9ab_c.jpg b/src/dataset/sunflower/13308929034_2995d6c9ab_c.jpg new file mode 100644 index 00000000..f612d02f Binary files /dev/null and b/src/dataset/sunflower/13308929034_2995d6c9ab_c.jpg differ diff --git a/src/dataset/sunflower/1342625466_8de6a9088a_c.jpg b/src/dataset/sunflower/1342625466_8de6a9088a_c.jpg new file mode 100644 index 00000000..e76b54da Binary files /dev/null and b/src/dataset/sunflower/1342625466_8de6a9088a_c.jpg differ diff --git a/src/dataset/sunflower/13449769773_b51565c837_c.jpg b/src/dataset/sunflower/13449769773_b51565c837_c.jpg new file mode 100644 index 00000000..f3a2cd9d Binary files /dev/null and b/src/dataset/sunflower/13449769773_b51565c837_c.jpg differ diff --git a/src/dataset/sunflower/1345927377_97a06b9f97_c.jpg b/src/dataset/sunflower/1345927377_97a06b9f97_c.jpg new file mode 100644 index 00000000..6190ef23 Binary files /dev/null and b/src/dataset/sunflower/1345927377_97a06b9f97_c.jpg differ diff --git a/src/dataset/sunflower/1347738165_454e6f8d77_c.jpg b/src/dataset/sunflower/1347738165_454e6f8d77_c.jpg new file mode 100644 index 00000000..f7d2a542 Binary files /dev/null and b/src/dataset/sunflower/1347738165_454e6f8d77_c.jpg differ diff --git a/src/dataset/sunflower/1347738245_a5aa1f82ed_c.jpg b/src/dataset/sunflower/1347738245_a5aa1f82ed_c.jpg new file mode 100644 index 00000000..6aee2d9b Binary files /dev/null and b/src/dataset/sunflower/1347738245_a5aa1f82ed_c.jpg differ diff --git a/src/dataset/sunflower/1348631330_6bc6acc711_c.jpg b/src/dataset/sunflower/1348631330_6bc6acc711_c.jpg new file mode 100644 index 00000000..e0bb5e09 Binary files /dev/null and b/src/dataset/sunflower/1348631330_6bc6acc711_c.jpg differ diff --git a/src/dataset/sunflower/1350202166_a4ec7274a0_c.jpg b/src/dataset/sunflower/1350202166_a4ec7274a0_c.jpg new file mode 100644 index 00000000..c57b79a6 Binary files /dev/null and b/src/dataset/sunflower/1350202166_a4ec7274a0_c.jpg differ diff --git a/src/dataset/sunflower/13539451565_7f06fd87b2_c.jpg b/src/dataset/sunflower/13539451565_7f06fd87b2_c.jpg new file mode 100644 index 00000000..3c56e68f Binary files /dev/null and b/src/dataset/sunflower/13539451565_7f06fd87b2_c.jpg differ diff --git a/src/dataset/sunflower/1355063263_b416539f6f_c.jpg b/src/dataset/sunflower/1355063263_b416539f6f_c.jpg new file mode 100644 index 00000000..37c57438 Binary files /dev/null and b/src/dataset/sunflower/1355063263_b416539f6f_c.jpg differ diff --git a/src/dataset/sunflower/13780541124_b39752b49a_c.jpg b/src/dataset/sunflower/13780541124_b39752b49a_c.jpg new file mode 100644 index 00000000..398e425d Binary files /dev/null and b/src/dataset/sunflower/13780541124_b39752b49a_c.jpg differ diff --git a/src/dataset/sunflower/13869537255_9046bc1a41_c.jpg b/src/dataset/sunflower/13869537255_9046bc1a41_c.jpg new file mode 100644 index 00000000..59839d2d Binary files /dev/null and b/src/dataset/sunflower/13869537255_9046bc1a41_c.jpg differ diff --git a/src/dataset/sunflower/13890885287_414f460520_c.jpg b/src/dataset/sunflower/13890885287_414f460520_c.jpg new file mode 100644 index 00000000..f0cce648 Binary files /dev/null and b/src/dataset/sunflower/13890885287_414f460520_c.jpg differ diff --git a/src/dataset/sunflower/1397763369_728c86ade7_c.jpg b/src/dataset/sunflower/1397763369_728c86ade7_c.jpg new file mode 100644 index 00000000..d8abeecd Binary files /dev/null and b/src/dataset/sunflower/1397763369_728c86ade7_c.jpg differ diff --git a/src/dataset/sunflower/14007055885_46e28a3169_c.jpg b/src/dataset/sunflower/14007055885_46e28a3169_c.jpg new file mode 100644 index 00000000..cc198f4b Binary files /dev/null and b/src/dataset/sunflower/14007055885_46e28a3169_c.jpg differ diff --git a/src/dataset/sunflower/14058543180_d37b1c0eea_c.jpg b/src/dataset/sunflower/14058543180_d37b1c0eea_c.jpg new file mode 100644 index 00000000..598ca4fa Binary files /dev/null and b/src/dataset/sunflower/14058543180_d37b1c0eea_c.jpg differ diff --git a/src/dataset/sunflower/14323996364_abe2709315_c.jpg b/src/dataset/sunflower/14323996364_abe2709315_c.jpg new file mode 100644 index 00000000..a6a05e84 Binary files /dev/null and b/src/dataset/sunflower/14323996364_abe2709315_c.jpg differ diff --git a/src/dataset/sunflower/14345338449_1c5a202c40_c.jpg b/src/dataset/sunflower/14345338449_1c5a202c40_c.jpg new file mode 100644 index 00000000..50b870dc Binary files /dev/null and b/src/dataset/sunflower/14345338449_1c5a202c40_c.jpg differ diff --git a/src/dataset/sunflower/14345341669_cedcf6b98d_c.jpg b/src/dataset/sunflower/14345341669_cedcf6b98d_c.jpg new file mode 100644 index 00000000..b8d5b636 Binary files /dev/null and b/src/dataset/sunflower/14345341669_cedcf6b98d_c.jpg differ diff --git a/src/dataset/sunflower/1438523026_4b7061194f_c.jpg b/src/dataset/sunflower/1438523026_4b7061194f_c.jpg new file mode 100644 index 00000000..a8b69d88 Binary files /dev/null and b/src/dataset/sunflower/1438523026_4b7061194f_c.jpg differ diff --git a/src/dataset/sunflower/14420385577_aac166c192_c.jpg b/src/dataset/sunflower/14420385577_aac166c192_c.jpg new file mode 100644 index 00000000..45e493a6 Binary files /dev/null and b/src/dataset/sunflower/14420385577_aac166c192_c.jpg differ diff --git a/src/dataset/sunflower/14476852607_120d0c7eba_c.jpg b/src/dataset/sunflower/14476852607_120d0c7eba_c.jpg new file mode 100644 index 00000000..aa99f8c2 Binary files /dev/null and b/src/dataset/sunflower/14476852607_120d0c7eba_c.jpg differ diff --git a/src/dataset/sunflower/14498391400_6673cb1541_c.jpg b/src/dataset/sunflower/14498391400_6673cb1541_c.jpg new file mode 100644 index 00000000..72c3f515 Binary files /dev/null and b/src/dataset/sunflower/14498391400_6673cb1541_c.jpg differ diff --git a/src/dataset/sunflower/14507901260_5149a745d7_c.jpg b/src/dataset/sunflower/14507901260_5149a745d7_c.jpg new file mode 100644 index 00000000..49b3a05a Binary files /dev/null and b/src/dataset/sunflower/14507901260_5149a745d7_c.jpg differ diff --git a/src/dataset/sunflower/14520932260_61d3249a7c_c.jpg b/src/dataset/sunflower/14520932260_61d3249a7c_c.jpg new file mode 100644 index 00000000..79cadfb5 Binary files /dev/null and b/src/dataset/sunflower/14520932260_61d3249a7c_c.jpg differ diff --git a/src/dataset/sunflower/14530728234_4d3a75e1e1_c.jpg b/src/dataset/sunflower/14530728234_4d3a75e1e1_c.jpg new file mode 100644 index 00000000..a59682cf Binary files /dev/null and b/src/dataset/sunflower/14530728234_4d3a75e1e1_c.jpg differ diff --git a/src/dataset/sunflower/14530946782_da6597b7a1_c.jpg b/src/dataset/sunflower/14530946782_da6597b7a1_c.jpg new file mode 100644 index 00000000..f9b2392b Binary files /dev/null and b/src/dataset/sunflower/14530946782_da6597b7a1_c.jpg differ diff --git a/src/dataset/sunflower/14531944205_d6129c36bd_c.jpg b/src/dataset/sunflower/14531944205_d6129c36bd_c.jpg new file mode 100644 index 00000000..0cff5d4e Binary files /dev/null and b/src/dataset/sunflower/14531944205_d6129c36bd_c.jpg differ diff --git a/src/dataset/sunflower/14558342284_277af7974e_c.jpg b/src/dataset/sunflower/14558342284_277af7974e_c.jpg new file mode 100644 index 00000000..ab1b53ba Binary files /dev/null and b/src/dataset/sunflower/14558342284_277af7974e_c.jpg differ diff --git a/src/dataset/sunflower/14561130315_831503a05b_c.jpg b/src/dataset/sunflower/14561130315_831503a05b_c.jpg new file mode 100644 index 00000000..0f5037b3 Binary files /dev/null and b/src/dataset/sunflower/14561130315_831503a05b_c.jpg differ diff --git a/src/dataset/sunflower/14563402199_8ec334767c_c.jpg b/src/dataset/sunflower/14563402199_8ec334767c_c.jpg new file mode 100644 index 00000000..416d9500 Binary files /dev/null and b/src/dataset/sunflower/14563402199_8ec334767c_c.jpg differ diff --git a/src/dataset/sunflower/1458910105_807efd1a29_c.jpg b/src/dataset/sunflower/1458910105_807efd1a29_c.jpg new file mode 100644 index 00000000..40cba77e Binary files /dev/null and b/src/dataset/sunflower/1458910105_807efd1a29_c.jpg differ diff --git a/src/dataset/sunflower/14608506467_4a50aeec54_c.jpg b/src/dataset/sunflower/14608506467_4a50aeec54_c.jpg new file mode 100644 index 00000000..7c5d8a1a Binary files /dev/null and b/src/dataset/sunflower/14608506467_4a50aeec54_c.jpg differ diff --git a/src/dataset/sunflower/14626275898_1e0cfc0c3b_c.jpg b/src/dataset/sunflower/14626275898_1e0cfc0c3b_c.jpg new file mode 100644 index 00000000..547eadee Binary files /dev/null and b/src/dataset/sunflower/14626275898_1e0cfc0c3b_c.jpg differ diff --git a/src/dataset/sunflower/14626373627_0dd8c3df87_c.jpg b/src/dataset/sunflower/14626373627_0dd8c3df87_c.jpg new file mode 100644 index 00000000..6c11c092 Binary files /dev/null and b/src/dataset/sunflower/14626373627_0dd8c3df87_c.jpg differ diff --git a/src/dataset/sunflower/14637340935_efe93de1b2_c.jpg b/src/dataset/sunflower/14637340935_efe93de1b2_c.jpg new file mode 100644 index 00000000..8ee673e8 Binary files /dev/null and b/src/dataset/sunflower/14637340935_efe93de1b2_c.jpg differ diff --git a/src/dataset/sunflower/14648079548_68528345f4_c.jpg b/src/dataset/sunflower/14648079548_68528345f4_c.jpg new file mode 100644 index 00000000..2adb057b Binary files /dev/null and b/src/dataset/sunflower/14648079548_68528345f4_c.jpg differ diff --git a/src/dataset/sunflower/1467830408_5d0b638a2a_c.jpg b/src/dataset/sunflower/1467830408_5d0b638a2a_c.jpg new file mode 100644 index 00000000..d0ca1051 Binary files /dev/null and b/src/dataset/sunflower/1467830408_5d0b638a2a_c.jpg differ diff --git a/src/dataset/sunflower/14681868141_7bf766142d_c.jpg b/src/dataset/sunflower/14681868141_7bf766142d_c.jpg new file mode 100644 index 00000000..7de8d937 Binary files /dev/null and b/src/dataset/sunflower/14681868141_7bf766142d_c.jpg differ diff --git a/src/dataset/sunflower/14700058108_c9db151dc7_c.jpg b/src/dataset/sunflower/14700058108_c9db151dc7_c.jpg new file mode 100644 index 00000000..5ea7b9b1 Binary files /dev/null and b/src/dataset/sunflower/14700058108_c9db151dc7_c.jpg differ diff --git a/src/dataset/sunflower/14713306698_339cf41667_c.jpg b/src/dataset/sunflower/14713306698_339cf41667_c.jpg new file mode 100644 index 00000000..0d623b52 Binary files /dev/null and b/src/dataset/sunflower/14713306698_339cf41667_c.jpg differ diff --git a/src/dataset/sunflower/14729633885_98ea14fb5d_c.jpg b/src/dataset/sunflower/14729633885_98ea14fb5d_c.jpg new file mode 100644 index 00000000..708981a8 Binary files /dev/null and b/src/dataset/sunflower/14729633885_98ea14fb5d_c.jpg differ diff --git a/src/dataset/sunflower/14796434424_4893780911_c.jpg b/src/dataset/sunflower/14796434424_4893780911_c.jpg new file mode 100644 index 00000000..6fca97db Binary files /dev/null and b/src/dataset/sunflower/14796434424_4893780911_c.jpg differ diff --git a/src/dataset/sunflower/14800366901_75c2ce48d2_c.jpg b/src/dataset/sunflower/14800366901_75c2ce48d2_c.jpg new file mode 100644 index 00000000..a4b5ff92 Binary files /dev/null and b/src/dataset/sunflower/14800366901_75c2ce48d2_c.jpg differ diff --git a/src/dataset/sunflower/14820673631_1daeba6f07_c.jpg b/src/dataset/sunflower/14820673631_1daeba6f07_c.jpg new file mode 100644 index 00000000..3c051e9f Binary files /dev/null and b/src/dataset/sunflower/14820673631_1daeba6f07_c.jpg differ diff --git a/src/dataset/sunflower/14829928183_916e756b9a_c.jpg b/src/dataset/sunflower/14829928183_916e756b9a_c.jpg new file mode 100644 index 00000000..47c93929 Binary files /dev/null and b/src/dataset/sunflower/14829928183_916e756b9a_c.jpg differ diff --git a/src/dataset/sunflower/14832734783_c59615ecee_c.jpg b/src/dataset/sunflower/14832734783_c59615ecee_c.jpg new file mode 100644 index 00000000..cebfec2c Binary files /dev/null and b/src/dataset/sunflower/14832734783_c59615ecee_c.jpg differ diff --git a/src/dataset/sunflower/14835369650_f6486928b9_c.jpg b/src/dataset/sunflower/14835369650_f6486928b9_c.jpg new file mode 100644 index 00000000..850f558d Binary files /dev/null and b/src/dataset/sunflower/14835369650_f6486928b9_c.jpg differ diff --git a/src/dataset/sunflower/14842943893_85eb0a52bc_c.jpg b/src/dataset/sunflower/14842943893_85eb0a52bc_c.jpg new file mode 100644 index 00000000..8c9f2eda Binary files /dev/null and b/src/dataset/sunflower/14842943893_85eb0a52bc_c.jpg differ diff --git a/src/dataset/sunflower/14848521426_9c7616591e_c.jpg b/src/dataset/sunflower/14848521426_9c7616591e_c.jpg new file mode 100644 index 00000000..dcab8eb1 Binary files /dev/null and b/src/dataset/sunflower/14848521426_9c7616591e_c.jpg differ diff --git a/src/dataset/sunflower/14864993743_9ddbaf264b_c.jpg b/src/dataset/sunflower/14864993743_9ddbaf264b_c.jpg new file mode 100644 index 00000000..17538192 Binary files /dev/null and b/src/dataset/sunflower/14864993743_9ddbaf264b_c.jpg differ diff --git a/src/dataset/sunflower/14874195352_86d5b2aafb_c.jpg b/src/dataset/sunflower/14874195352_86d5b2aafb_c.jpg new file mode 100644 index 00000000..a9619b08 Binary files /dev/null and b/src/dataset/sunflower/14874195352_86d5b2aafb_c.jpg differ diff --git a/src/dataset/sunflower/14884202314_5c0d47df92_c.jpg b/src/dataset/sunflower/14884202314_5c0d47df92_c.jpg new file mode 100644 index 00000000..8d5f7ab7 Binary files /dev/null and b/src/dataset/sunflower/14884202314_5c0d47df92_c.jpg differ diff --git a/src/dataset/sunflower/14890076223_a39588d8e3_c.jpg b/src/dataset/sunflower/14890076223_a39588d8e3_c.jpg new file mode 100644 index 00000000..40afd63f Binary files /dev/null and b/src/dataset/sunflower/14890076223_a39588d8e3_c.jpg differ diff --git a/src/dataset/sunflower/14891112623_9a7330c62d_c.jpg b/src/dataset/sunflower/14891112623_9a7330c62d_c.jpg new file mode 100644 index 00000000..0eb7803d Binary files /dev/null and b/src/dataset/sunflower/14891112623_9a7330c62d_c.jpg differ diff --git a/src/dataset/sunflower/14906532473_8bb83051b3_c.jpg b/src/dataset/sunflower/14906532473_8bb83051b3_c.jpg new file mode 100644 index 00000000..becbf4fe Binary files /dev/null and b/src/dataset/sunflower/14906532473_8bb83051b3_c.jpg differ diff --git a/src/dataset/sunflower/14935507565_14e4ea7bdc_c.jpg b/src/dataset/sunflower/14935507565_14e4ea7bdc_c.jpg new file mode 100644 index 00000000..c6f7bdfe Binary files /dev/null and b/src/dataset/sunflower/14935507565_14e4ea7bdc_c.jpg differ diff --git a/src/dataset/sunflower/14936197011_80ee872394_c.jpg b/src/dataset/sunflower/14936197011_80ee872394_c.jpg new file mode 100644 index 00000000..3181355f Binary files /dev/null and b/src/dataset/sunflower/14936197011_80ee872394_c.jpg differ diff --git a/src/dataset/sunflower/14950351877_10ab5b44aa_c.jpg b/src/dataset/sunflower/14950351877_10ab5b44aa_c.jpg new file mode 100644 index 00000000..98f6b458 Binary files /dev/null and b/src/dataset/sunflower/14950351877_10ab5b44aa_c.jpg differ diff --git a/src/dataset/sunflower/14967306387_a8dd371b0b_c.jpg b/src/dataset/sunflower/14967306387_a8dd371b0b_c.jpg new file mode 100644 index 00000000..792227ae Binary files /dev/null and b/src/dataset/sunflower/14967306387_a8dd371b0b_c.jpg differ diff --git a/src/dataset/sunflower/14968625416_4973bf5ff7_c.jpg b/src/dataset/sunflower/14968625416_4973bf5ff7_c.jpg new file mode 100644 index 00000000..b57377bf Binary files /dev/null and b/src/dataset/sunflower/14968625416_4973bf5ff7_c.jpg differ diff --git a/src/dataset/sunflower/14990918720_99c7f5b49d_c.jpg b/src/dataset/sunflower/14990918720_99c7f5b49d_c.jpg new file mode 100644 index 00000000..21b51245 Binary files /dev/null and b/src/dataset/sunflower/14990918720_99c7f5b49d_c.jpg differ diff --git a/src/dataset/sunflower/14999013736_ef3e1085bb_c.jpg b/src/dataset/sunflower/14999013736_ef3e1085bb_c.jpg new file mode 100644 index 00000000..a57eb88c Binary files /dev/null and b/src/dataset/sunflower/14999013736_ef3e1085bb_c.jpg differ diff --git a/src/dataset/sunflower/15005361748_58693088d6_c.jpg b/src/dataset/sunflower/15005361748_58693088d6_c.jpg new file mode 100644 index 00000000..ac7590bb Binary files /dev/null and b/src/dataset/sunflower/15005361748_58693088d6_c.jpg differ diff --git a/src/dataset/sunflower/15037552819_5645d061fc_c.jpg b/src/dataset/sunflower/15037552819_5645d061fc_c.jpg new file mode 100644 index 00000000..2a9417ac Binary files /dev/null and b/src/dataset/sunflower/15037552819_5645d061fc_c.jpg differ diff --git a/src/dataset/sunflower/15044100040_4cb296ec53_c.jpg b/src/dataset/sunflower/15044100040_4cb296ec53_c.jpg new file mode 100644 index 00000000..eb3d31a6 Binary files /dev/null and b/src/dataset/sunflower/15044100040_4cb296ec53_c.jpg differ diff --git a/src/dataset/sunflower/15045880631_221500399c_c.jpg b/src/dataset/sunflower/15045880631_221500399c_c.jpg new file mode 100644 index 00000000..2ccb2148 Binary files /dev/null and b/src/dataset/sunflower/15045880631_221500399c_c.jpg differ diff --git a/src/dataset/sunflower/15047853109_13df3107ed_c.jpg b/src/dataset/sunflower/15047853109_13df3107ed_c.jpg new file mode 100644 index 00000000..f2cf6252 Binary files /dev/null and b/src/dataset/sunflower/15047853109_13df3107ed_c.jpg differ diff --git a/src/dataset/sunflower/15052472331_48a475af58_c.jpg b/src/dataset/sunflower/15052472331_48a475af58_c.jpg new file mode 100644 index 00000000..401d4614 Binary files /dev/null and b/src/dataset/sunflower/15052472331_48a475af58_c.jpg differ diff --git a/src/dataset/sunflower/15055242764_ba0cddae22_c.jpg b/src/dataset/sunflower/15055242764_ba0cddae22_c.jpg new file mode 100644 index 00000000..799668c7 Binary files /dev/null and b/src/dataset/sunflower/15055242764_ba0cddae22_c.jpg differ diff --git a/src/dataset/sunflower/15061457701_22fa1ffdb6_c.jpg b/src/dataset/sunflower/15061457701_22fa1ffdb6_c.jpg new file mode 100644 index 00000000..73926675 Binary files /dev/null and b/src/dataset/sunflower/15061457701_22fa1ffdb6_c.jpg differ diff --git a/src/dataset/sunflower/15115651784_ecddbac178_c.jpg b/src/dataset/sunflower/15115651784_ecddbac178_c.jpg new file mode 100644 index 00000000..db6a2085 Binary files /dev/null and b/src/dataset/sunflower/15115651784_ecddbac178_c.jpg differ diff --git a/src/dataset/sunflower/15147659870_31523c79f0_c.jpg b/src/dataset/sunflower/15147659870_31523c79f0_c.jpg new file mode 100644 index 00000000..4fef1760 Binary files /dev/null and b/src/dataset/sunflower/15147659870_31523c79f0_c.jpg differ diff --git a/src/dataset/sunflower/15160519372_c685d0f4f4_c.jpg b/src/dataset/sunflower/15160519372_c685d0f4f4_c.jpg new file mode 100644 index 00000000..d5117764 Binary files /dev/null and b/src/dataset/sunflower/15160519372_c685d0f4f4_c.jpg differ diff --git a/src/dataset/sunflower/15163908748_12507d3c85_c.jpg b/src/dataset/sunflower/15163908748_12507d3c85_c.jpg new file mode 100644 index 00000000..849a7f81 Binary files /dev/null and b/src/dataset/sunflower/15163908748_12507d3c85_c.jpg differ diff --git a/src/dataset/sunflower/15210111935_c407e7a922_c.jpg b/src/dataset/sunflower/15210111935_c407e7a922_c.jpg new file mode 100644 index 00000000..460c42ac Binary files /dev/null and b/src/dataset/sunflower/15210111935_c407e7a922_c.jpg differ diff --git a/src/dataset/sunflower/15349347969_29f214c845_c.jpg b/src/dataset/sunflower/15349347969_29f214c845_c.jpg new file mode 100644 index 00000000..052ef0fb Binary files /dev/null and b/src/dataset/sunflower/15349347969_29f214c845_c.jpg differ diff --git a/src/dataset/sunflower/15352878348_a3b9930e3a_c.jpg b/src/dataset/sunflower/15352878348_a3b9930e3a_c.jpg new file mode 100644 index 00000000..264bcf34 Binary files /dev/null and b/src/dataset/sunflower/15352878348_a3b9930e3a_c.jpg differ diff --git a/src/dataset/sunflower/15353811464_ac9c1edbf4_c.jpg b/src/dataset/sunflower/15353811464_ac9c1edbf4_c.jpg new file mode 100644 index 00000000..0179004d Binary files /dev/null and b/src/dataset/sunflower/15353811464_ac9c1edbf4_c.jpg differ diff --git a/src/dataset/sunflower/15406108742_ba0e49cedc_c.jpg b/src/dataset/sunflower/15406108742_ba0e49cedc_c.jpg new file mode 100644 index 00000000..431b0fc3 Binary files /dev/null and b/src/dataset/sunflower/15406108742_ba0e49cedc_c.jpg differ diff --git a/src/dataset/sunflower/15419785636_24dc08bc15_c.jpg b/src/dataset/sunflower/15419785636_24dc08bc15_c.jpg new file mode 100644 index 00000000..a2f899c9 Binary files /dev/null and b/src/dataset/sunflower/15419785636_24dc08bc15_c.jpg differ diff --git a/src/dataset/sunflower/15454672358_18d2303a56_c.jpg b/src/dataset/sunflower/15454672358_18d2303a56_c.jpg new file mode 100644 index 00000000..380668d7 Binary files /dev/null and b/src/dataset/sunflower/15454672358_18d2303a56_c.jpg differ diff --git a/src/dataset/sunflower/15458392609_6f7607d03b_c.jpg b/src/dataset/sunflower/15458392609_6f7607d03b_c.jpg new file mode 100644 index 00000000..8cdff6be Binary files /dev/null and b/src/dataset/sunflower/15458392609_6f7607d03b_c.jpg differ diff --git a/src/dataset/sunflower/15496328905_d861e28d46_c.jpg b/src/dataset/sunflower/15496328905_d861e28d46_c.jpg new file mode 100644 index 00000000..0ff959cc Binary files /dev/null and b/src/dataset/sunflower/15496328905_d861e28d46_c.jpg differ diff --git a/src/dataset/sunflower/15528777649_2f80612e4c_c.jpg b/src/dataset/sunflower/15528777649_2f80612e4c_c.jpg new file mode 100644 index 00000000..29f136e5 Binary files /dev/null and b/src/dataset/sunflower/15528777649_2f80612e4c_c.jpg differ diff --git a/src/dataset/sunflower/15758687653_f9f13c61bb_c.jpg b/src/dataset/sunflower/15758687653_f9f13c61bb_c.jpg new file mode 100644 index 00000000..37f64625 Binary files /dev/null and b/src/dataset/sunflower/15758687653_f9f13c61bb_c.jpg differ diff --git a/src/dataset/sunflower/15899952623_1062cf4710_c.jpg b/src/dataset/sunflower/15899952623_1062cf4710_c.jpg new file mode 100644 index 00000000..96861801 Binary files /dev/null and b/src/dataset/sunflower/15899952623_1062cf4710_c.jpg differ diff --git a/src/dataset/sunflower/16188181233_e3a538bfbe_c.jpg b/src/dataset/sunflower/16188181233_e3a538bfbe_c.jpg new file mode 100644 index 00000000..d4d2b1d9 Binary files /dev/null and b/src/dataset/sunflower/16188181233_e3a538bfbe_c.jpg differ diff --git a/src/dataset/sunflower/16343445461_d97b7b2771_c.jpg b/src/dataset/sunflower/16343445461_d97b7b2771_c.jpg new file mode 100644 index 00000000..80ed1808 Binary files /dev/null and b/src/dataset/sunflower/16343445461_d97b7b2771_c.jpg differ diff --git a/src/dataset/sunflower/164606136_f9caf5169b_c.jpg b/src/dataset/sunflower/164606136_f9caf5169b_c.jpg new file mode 100644 index 00000000..242b73a3 Binary files /dev/null and b/src/dataset/sunflower/164606136_f9caf5169b_c.jpg differ diff --git a/src/dataset/sunflower/16527650123_fbfe5d6579_c.jpg b/src/dataset/sunflower/16527650123_fbfe5d6579_c.jpg new file mode 100644 index 00000000..350c85f8 Binary files /dev/null and b/src/dataset/sunflower/16527650123_fbfe5d6579_c.jpg differ diff --git a/src/dataset/sunflower/16548793302_a64f71ef7b_c.jpg b/src/dataset/sunflower/16548793302_a64f71ef7b_c.jpg new file mode 100644 index 00000000..72d5d7dc Binary files /dev/null and b/src/dataset/sunflower/16548793302_a64f71ef7b_c.jpg differ diff --git a/src/dataset/sunflower/16729892296_3e1832de7a_c.jpg b/src/dataset/sunflower/16729892296_3e1832de7a_c.jpg new file mode 100644 index 00000000..b1412f7c Binary files /dev/null and b/src/dataset/sunflower/16729892296_3e1832de7a_c.jpg differ diff --git a/src/dataset/sunflower/16773140189_4b9d74720d_c.jpg b/src/dataset/sunflower/16773140189_4b9d74720d_c.jpg new file mode 100644 index 00000000..deace1ae Binary files /dev/null and b/src/dataset/sunflower/16773140189_4b9d74720d_c.jpg differ diff --git a/src/dataset/sunflower/16974427719_358b357d5c_c.jpg b/src/dataset/sunflower/16974427719_358b357d5c_c.jpg new file mode 100644 index 00000000..64251ee7 Binary files /dev/null and b/src/dataset/sunflower/16974427719_358b357d5c_c.jpg differ diff --git a/src/dataset/sunflower/17174090984_6e0cf16d6a_c.jpg b/src/dataset/sunflower/17174090984_6e0cf16d6a_c.jpg new file mode 100644 index 00000000..2a8ac6d5 Binary files /dev/null and b/src/dataset/sunflower/17174090984_6e0cf16d6a_c.jpg differ diff --git a/src/dataset/sunflower/185676223_551dc3342e_c.jpg b/src/dataset/sunflower/185676223_551dc3342e_c.jpg new file mode 100644 index 00000000..fb4822fc Binary files /dev/null and b/src/dataset/sunflower/185676223_551dc3342e_c.jpg differ diff --git a/src/dataset/sunflower/186626582_58d5cb8754_c.jpg b/src/dataset/sunflower/186626582_58d5cb8754_c.jpg new file mode 100644 index 00000000..a6530e0d Binary files /dev/null and b/src/dataset/sunflower/186626582_58d5cb8754_c.jpg differ diff --git a/src/dataset/sunflower/189649093_655dd7f59f_c.jpg b/src/dataset/sunflower/189649093_655dd7f59f_c.jpg new file mode 100644 index 00000000..bac3d36f Binary files /dev/null and b/src/dataset/sunflower/189649093_655dd7f59f_c.jpg differ diff --git a/src/dataset/sunflower/190214666_e9bfb0c1ae_c.jpg b/src/dataset/sunflower/190214666_e9bfb0c1ae_c.jpg new file mode 100644 index 00000000..22110576 Binary files /dev/null and b/src/dataset/sunflower/190214666_e9bfb0c1ae_c.jpg differ diff --git a/src/dataset/sunflower/190566965_808863bfb0_c.jpg b/src/dataset/sunflower/190566965_808863bfb0_c.jpg new file mode 100644 index 00000000..85982840 Binary files /dev/null and b/src/dataset/sunflower/190566965_808863bfb0_c.jpg differ diff --git a/src/dataset/sunflower/19486540708_83f9955c9d_c.jpg b/src/dataset/sunflower/19486540708_83f9955c9d_c.jpg new file mode 100644 index 00000000..a9633356 Binary files /dev/null and b/src/dataset/sunflower/19486540708_83f9955c9d_c.jpg differ diff --git a/src/dataset/sunflower/195230080_6e70ad2409_c.jpg b/src/dataset/sunflower/195230080_6e70ad2409_c.jpg new file mode 100644 index 00000000..39ff6f62 Binary files /dev/null and b/src/dataset/sunflower/195230080_6e70ad2409_c.jpg differ diff --git a/src/dataset/sunflower/19575809689_435c04fb95_c.jpg b/src/dataset/sunflower/19575809689_435c04fb95_c.jpg new file mode 100644 index 00000000..db6f6f66 Binary files /dev/null and b/src/dataset/sunflower/19575809689_435c04fb95_c.jpg differ diff --git a/src/dataset/sunflower/195990601_6c857dff7d_c.jpg b/src/dataset/sunflower/195990601_6c857dff7d_c.jpg new file mode 100644 index 00000000..9e9f273f Binary files /dev/null and b/src/dataset/sunflower/195990601_6c857dff7d_c.jpg differ diff --git a/src/dataset/sunflower/19619005154_0cb8fe2179_c.jpg b/src/dataset/sunflower/19619005154_0cb8fe2179_c.jpg new file mode 100644 index 00000000..dfa06ccf Binary files /dev/null and b/src/dataset/sunflower/19619005154_0cb8fe2179_c.jpg differ diff --git a/src/dataset/sunflower/19739637668_31d54193b2_c.jpg b/src/dataset/sunflower/19739637668_31d54193b2_c.jpg new file mode 100644 index 00000000..a38dbac4 Binary files /dev/null and b/src/dataset/sunflower/19739637668_31d54193b2_c.jpg differ diff --git a/src/dataset/sunflower/198764406_d4ec316757_c.jpg b/src/dataset/sunflower/198764406_d4ec316757_c.jpg new file mode 100644 index 00000000..1f745841 Binary files /dev/null and b/src/dataset/sunflower/198764406_d4ec316757_c.jpg differ diff --git a/src/dataset/sunflower/198946526_5fd743b971_c.jpg b/src/dataset/sunflower/198946526_5fd743b971_c.jpg new file mode 100644 index 00000000..bc957f1e Binary files /dev/null and b/src/dataset/sunflower/198946526_5fd743b971_c.jpg differ diff --git a/src/dataset/sunflower/20023171462_af8ed78a6e_c.jpg b/src/dataset/sunflower/20023171462_af8ed78a6e_c.jpg new file mode 100644 index 00000000..e593b7e3 Binary files /dev/null and b/src/dataset/sunflower/20023171462_af8ed78a6e_c.jpg differ diff --git a/src/dataset/sunflower/20095024563_15f79e235a_c.jpg b/src/dataset/sunflower/20095024563_15f79e235a_c.jpg new file mode 100644 index 00000000..d6b251f5 Binary files /dev/null and b/src/dataset/sunflower/20095024563_15f79e235a_c.jpg differ diff --git a/src/dataset/sunflower/20242292273_9553bcf9c3_c.jpg b/src/dataset/sunflower/20242292273_9553bcf9c3_c.jpg new file mode 100644 index 00000000..e211191e Binary files /dev/null and b/src/dataset/sunflower/20242292273_9553bcf9c3_c.jpg differ diff --git a/src/dataset/sunflower/20295618156_d64ae7672b_c.jpg b/src/dataset/sunflower/20295618156_d64ae7672b_c.jpg new file mode 100644 index 00000000..928cb1e8 Binary files /dev/null and b/src/dataset/sunflower/20295618156_d64ae7672b_c.jpg differ diff --git a/src/dataset/sunflower/20299476942_50e1e56a81_c.jpg b/src/dataset/sunflower/20299476942_50e1e56a81_c.jpg new file mode 100644 index 00000000..99bd27be Binary files /dev/null and b/src/dataset/sunflower/20299476942_50e1e56a81_c.jpg differ diff --git a/src/dataset/sunflower/20431072979_acff2d9459_c.jpg b/src/dataset/sunflower/20431072979_acff2d9459_c.jpg new file mode 100644 index 00000000..1487402c Binary files /dev/null and b/src/dataset/sunflower/20431072979_acff2d9459_c.jpg differ diff --git a/src/dataset/sunflower/204350319_2607326717_c.jpg b/src/dataset/sunflower/204350319_2607326717_c.jpg new file mode 100644 index 00000000..031534e3 Binary files /dev/null and b/src/dataset/sunflower/204350319_2607326717_c.jpg differ diff --git a/src/dataset/sunflower/20501441193_d2aa62f708_c.jpg b/src/dataset/sunflower/20501441193_d2aa62f708_c.jpg new file mode 100644 index 00000000..de2c1719 Binary files /dev/null and b/src/dataset/sunflower/20501441193_d2aa62f708_c.jpg differ diff --git a/src/dataset/sunflower/20520537443_b82ce0b081_c.jpg b/src/dataset/sunflower/20520537443_b82ce0b081_c.jpg new file mode 100644 index 00000000..d72f2c01 Binary files /dev/null and b/src/dataset/sunflower/20520537443_b82ce0b081_c.jpg differ diff --git a/src/dataset/sunflower/20566427890_43df3a0397_c.jpg b/src/dataset/sunflower/20566427890_43df3a0397_c.jpg new file mode 100644 index 00000000..d502342c Binary files /dev/null and b/src/dataset/sunflower/20566427890_43df3a0397_c.jpg differ diff --git a/src/dataset/sunflower/20624532538_663731c86f_c.jpg b/src/dataset/sunflower/20624532538_663731c86f_c.jpg new file mode 100644 index 00000000..a632d0c1 Binary files /dev/null and b/src/dataset/sunflower/20624532538_663731c86f_c.jpg differ diff --git a/src/dataset/sunflower/20627564224_56f0bc2545_c.jpg b/src/dataset/sunflower/20627564224_56f0bc2545_c.jpg new file mode 100644 index 00000000..c9f3c56b Binary files /dev/null and b/src/dataset/sunflower/20627564224_56f0bc2545_c.jpg differ diff --git a/src/dataset/sunflower/206633245_108725cc5d_c.jpg b/src/dataset/sunflower/206633245_108725cc5d_c.jpg new file mode 100644 index 00000000..ae76ce20 Binary files /dev/null and b/src/dataset/sunflower/206633245_108725cc5d_c.jpg differ diff --git a/src/dataset/sunflower/20694832251_7677c8205d_c.jpg b/src/dataset/sunflower/20694832251_7677c8205d_c.jpg new file mode 100644 index 00000000..9e30f39f Binary files /dev/null and b/src/dataset/sunflower/20694832251_7677c8205d_c.jpg differ diff --git a/src/dataset/sunflower/20747433071_41e8ba09f4_c.jpg b/src/dataset/sunflower/20747433071_41e8ba09f4_c.jpg new file mode 100644 index 00000000..ee026b65 Binary files /dev/null and b/src/dataset/sunflower/20747433071_41e8ba09f4_c.jpg differ diff --git a/src/dataset/sunflower/207865649_cda0da9c0c_c.jpg b/src/dataset/sunflower/207865649_cda0da9c0c_c.jpg new file mode 100644 index 00000000..cbae61e8 Binary files /dev/null and b/src/dataset/sunflower/207865649_cda0da9c0c_c.jpg differ diff --git a/src/dataset/sunflower/20793582501_62ddf5aff8_c.jpg b/src/dataset/sunflower/20793582501_62ddf5aff8_c.jpg new file mode 100644 index 00000000..4aa60961 Binary files /dev/null and b/src/dataset/sunflower/20793582501_62ddf5aff8_c.jpg differ diff --git a/src/dataset/sunflower/208292391_825c943cf4_c.jpg b/src/dataset/sunflower/208292391_825c943cf4_c.jpg new file mode 100644 index 00000000..bc2c02b4 Binary files /dev/null and b/src/dataset/sunflower/208292391_825c943cf4_c.jpg differ diff --git a/src/dataset/sunflower/20860721716_62105f0f20_c.jpg b/src/dataset/sunflower/20860721716_62105f0f20_c.jpg new file mode 100644 index 00000000..8eb884b4 Binary files /dev/null and b/src/dataset/sunflower/20860721716_62105f0f20_c.jpg differ diff --git a/src/dataset/sunflower/21028938500_a502452547_c.jpg b/src/dataset/sunflower/21028938500_a502452547_c.jpg new file mode 100644 index 00000000..7a81143d Binary files /dev/null and b/src/dataset/sunflower/21028938500_a502452547_c.jpg differ diff --git a/src/dataset/sunflower/21090872838_b3f5552061_c.jpg b/src/dataset/sunflower/21090872838_b3f5552061_c.jpg new file mode 100644 index 00000000..a68a9e86 Binary files /dev/null and b/src/dataset/sunflower/21090872838_b3f5552061_c.jpg differ diff --git a/src/dataset/sunflower/21096602770_d3edcbde7b_c.jpg b/src/dataset/sunflower/21096602770_d3edcbde7b_c.jpg new file mode 100644 index 00000000..6eaa90e1 Binary files /dev/null and b/src/dataset/sunflower/21096602770_d3edcbde7b_c.jpg differ diff --git a/src/dataset/sunflower/212308726_a7d63276c3_c.jpg b/src/dataset/sunflower/212308726_a7d63276c3_c.jpg new file mode 100644 index 00000000..944bce5c Binary files /dev/null and b/src/dataset/sunflower/212308726_a7d63276c3_c.jpg differ diff --git a/src/dataset/sunflower/21248933369_d9ab5236a8_c.jpg b/src/dataset/sunflower/21248933369_d9ab5236a8_c.jpg new file mode 100644 index 00000000..f7149847 Binary files /dev/null and b/src/dataset/sunflower/21248933369_d9ab5236a8_c.jpg differ diff --git a/src/dataset/sunflower/213958158_ff68ca67cb_c.jpg b/src/dataset/sunflower/213958158_ff68ca67cb_c.jpg new file mode 100644 index 00000000..b3631c84 Binary files /dev/null and b/src/dataset/sunflower/213958158_ff68ca67cb_c.jpg differ diff --git a/src/dataset/sunflower/214096289_e745f2536b_c.jpg b/src/dataset/sunflower/214096289_e745f2536b_c.jpg new file mode 100644 index 00000000..e37c15e4 Binary files /dev/null and b/src/dataset/sunflower/214096289_e745f2536b_c.jpg differ diff --git a/src/dataset/sunflower/21441191205_9df55c1d4a_c.jpg b/src/dataset/sunflower/21441191205_9df55c1d4a_c.jpg new file mode 100644 index 00000000..40de3ce6 Binary files /dev/null and b/src/dataset/sunflower/21441191205_9df55c1d4a_c.jpg differ diff --git a/src/dataset/sunflower/21605638813_a6f268557e_c.jpg b/src/dataset/sunflower/21605638813_a6f268557e_c.jpg new file mode 100644 index 00000000..662fe3db Binary files /dev/null and b/src/dataset/sunflower/21605638813_a6f268557e_c.jpg differ diff --git a/src/dataset/sunflower/21649166029_fe5dc19540_c.jpg b/src/dataset/sunflower/21649166029_fe5dc19540_c.jpg new file mode 100644 index 00000000..d0b5a3d6 Binary files /dev/null and b/src/dataset/sunflower/21649166029_fe5dc19540_c.jpg differ diff --git a/src/dataset/sunflower/21697858814_1c0e0c53e4_c.jpg b/src/dataset/sunflower/21697858814_1c0e0c53e4_c.jpg new file mode 100644 index 00000000..34903df3 Binary files /dev/null and b/src/dataset/sunflower/21697858814_1c0e0c53e4_c.jpg differ diff --git a/src/dataset/sunflower/21991917440_7bd183f72b_c.jpg b/src/dataset/sunflower/21991917440_7bd183f72b_c.jpg new file mode 100644 index 00000000..49d28af2 Binary files /dev/null and b/src/dataset/sunflower/21991917440_7bd183f72b_c.jpg differ diff --git a/src/dataset/sunflower/221238217_7620b4f2c5_c.jpg b/src/dataset/sunflower/221238217_7620b4f2c5_c.jpg new file mode 100644 index 00000000..48ada6c3 Binary files /dev/null and b/src/dataset/sunflower/221238217_7620b4f2c5_c.jpg differ diff --git a/src/dataset/sunflower/22219812483_562ee6126b_c.jpg b/src/dataset/sunflower/22219812483_562ee6126b_c.jpg new file mode 100644 index 00000000..6f9e0e87 Binary files /dev/null and b/src/dataset/sunflower/22219812483_562ee6126b_c.jpg differ diff --git a/src/dataset/sunflower/22309840828_e4fc3509f2_c.jpg b/src/dataset/sunflower/22309840828_e4fc3509f2_c.jpg new file mode 100644 index 00000000..06a771a1 Binary files /dev/null and b/src/dataset/sunflower/22309840828_e4fc3509f2_c.jpg differ diff --git a/src/dataset/sunflower/2231392975_87f79b3135_c.jpg b/src/dataset/sunflower/2231392975_87f79b3135_c.jpg new file mode 100644 index 00000000..d82f2fca Binary files /dev/null and b/src/dataset/sunflower/2231392975_87f79b3135_c.jpg differ diff --git a/src/dataset/sunflower/22327825519_b91c90d513_c.jpg b/src/dataset/sunflower/22327825519_b91c90d513_c.jpg new file mode 100644 index 00000000..7eea08d3 Binary files /dev/null and b/src/dataset/sunflower/22327825519_b91c90d513_c.jpg differ diff --git a/src/dataset/sunflower/2242958519_ab8fd6bb25_c.jpg b/src/dataset/sunflower/2242958519_ab8fd6bb25_c.jpg new file mode 100644 index 00000000..2e4cbaac Binary files /dev/null and b/src/dataset/sunflower/2242958519_ab8fd6bb25_c.jpg differ diff --git a/src/dataset/sunflower/2246723415_38efd482d0_c.jpg b/src/dataset/sunflower/2246723415_38efd482d0_c.jpg new file mode 100644 index 00000000..9c77ca55 Binary files /dev/null and b/src/dataset/sunflower/2246723415_38efd482d0_c.jpg differ diff --git a/src/dataset/sunflower/2279465063_5121180542_c.jpg b/src/dataset/sunflower/2279465063_5121180542_c.jpg new file mode 100644 index 00000000..57ff6014 Binary files /dev/null and b/src/dataset/sunflower/2279465063_5121180542_c.jpg differ diff --git a/src/dataset/sunflower/22810046_90694b793b_c.jpg b/src/dataset/sunflower/22810046_90694b793b_c.jpg new file mode 100644 index 00000000..54df912f Binary files /dev/null and b/src/dataset/sunflower/22810046_90694b793b_c.jpg differ diff --git a/src/dataset/sunflower/230036383_9916d7d0aa_c.jpg b/src/dataset/sunflower/230036383_9916d7d0aa_c.jpg new file mode 100644 index 00000000..9b613dc7 Binary files /dev/null and b/src/dataset/sunflower/230036383_9916d7d0aa_c.jpg differ diff --git a/src/dataset/sunflower/23096152870_5d4e2d6c11_c.jpg b/src/dataset/sunflower/23096152870_5d4e2d6c11_c.jpg new file mode 100644 index 00000000..9b698a14 Binary files /dev/null and b/src/dataset/sunflower/23096152870_5d4e2d6c11_c.jpg differ diff --git a/src/dataset/sunflower/231540146_ec5ec6dd77_c.jpg b/src/dataset/sunflower/231540146_ec5ec6dd77_c.jpg new file mode 100644 index 00000000..f3ceacd9 Binary files /dev/null and b/src/dataset/sunflower/231540146_ec5ec6dd77_c.jpg differ diff --git a/src/dataset/sunflower/232007370_f3f86708dc_c.jpg b/src/dataset/sunflower/232007370_f3f86708dc_c.jpg new file mode 100644 index 00000000..dc10c08f Binary files /dev/null and b/src/dataset/sunflower/232007370_f3f86708dc_c.jpg differ diff --git a/src/dataset/sunflower/2324136963_b382d1b9f3_c.jpg b/src/dataset/sunflower/2324136963_b382d1b9f3_c.jpg new file mode 100644 index 00000000..a931957b Binary files /dev/null and b/src/dataset/sunflower/2324136963_b382d1b9f3_c.jpg differ diff --git a/src/dataset/sunflower/232744510_90f491f310_c.jpg b/src/dataset/sunflower/232744510_90f491f310_c.jpg new file mode 100644 index 00000000..90e0c696 Binary files /dev/null and b/src/dataset/sunflower/232744510_90f491f310_c.jpg differ diff --git a/src/dataset/sunflower/23581199978_8dc09c36ec_c.jpg b/src/dataset/sunflower/23581199978_8dc09c36ec_c.jpg new file mode 100644 index 00000000..09125187 Binary files /dev/null and b/src/dataset/sunflower/23581199978_8dc09c36ec_c.jpg differ diff --git a/src/dataset/sunflower/23865751117_393e88a372_c.jpg b/src/dataset/sunflower/23865751117_393e88a372_c.jpg new file mode 100644 index 00000000..e7248915 Binary files /dev/null and b/src/dataset/sunflower/23865751117_393e88a372_c.jpg differ diff --git a/src/dataset/sunflower/23956976908_a84281b056_c.jpg b/src/dataset/sunflower/23956976908_a84281b056_c.jpg new file mode 100644 index 00000000..764d4121 Binary files /dev/null and b/src/dataset/sunflower/23956976908_a84281b056_c.jpg differ diff --git a/src/dataset/sunflower/2416286480_ebd1a5ef38_c.jpg b/src/dataset/sunflower/2416286480_ebd1a5ef38_c.jpg new file mode 100644 index 00000000..94a6d1ab Binary files /dev/null and b/src/dataset/sunflower/2416286480_ebd1a5ef38_c.jpg differ diff --git a/src/dataset/sunflower/241714531_61a097764a_c.jpg b/src/dataset/sunflower/241714531_61a097764a_c.jpg new file mode 100644 index 00000000..83dff165 Binary files /dev/null and b/src/dataset/sunflower/241714531_61a097764a_c.jpg differ diff --git a/src/dataset/sunflower/243453449_35aef4f459_c.jpg b/src/dataset/sunflower/243453449_35aef4f459_c.jpg new file mode 100644 index 00000000..c5b5ce37 Binary files /dev/null and b/src/dataset/sunflower/243453449_35aef4f459_c.jpg differ diff --git a/src/dataset/sunflower/2441221737_4ea07c6aa2_c.jpg b/src/dataset/sunflower/2441221737_4ea07c6aa2_c.jpg new file mode 100644 index 00000000..9318edba Binary files /dev/null and b/src/dataset/sunflower/2441221737_4ea07c6aa2_c.jpg differ diff --git a/src/dataset/sunflower/245977523_90254e2906_c.jpg b/src/dataset/sunflower/245977523_90254e2906_c.jpg new file mode 100644 index 00000000..485ed20c Binary files /dev/null and b/src/dataset/sunflower/245977523_90254e2906_c.jpg differ diff --git a/src/dataset/sunflower/246103787_46a3443daf_c.jpg b/src/dataset/sunflower/246103787_46a3443daf_c.jpg new file mode 100644 index 00000000..e13dd718 Binary files /dev/null and b/src/dataset/sunflower/246103787_46a3443daf_c.jpg differ diff --git a/src/dataset/sunflower/246819241_1b77232d13_c.jpg b/src/dataset/sunflower/246819241_1b77232d13_c.jpg new file mode 100644 index 00000000..6b6ffaa8 Binary files /dev/null and b/src/dataset/sunflower/246819241_1b77232d13_c.jpg differ diff --git a/src/dataset/sunflower/2471373400_7f6c2acf4a_c.jpg b/src/dataset/sunflower/2471373400_7f6c2acf4a_c.jpg new file mode 100644 index 00000000..acd271a0 Binary files /dev/null and b/src/dataset/sunflower/2471373400_7f6c2acf4a_c.jpg differ diff --git a/src/dataset/sunflower/24755670569_e590bcbf24_c.jpg b/src/dataset/sunflower/24755670569_e590bcbf24_c.jpg new file mode 100644 index 00000000..6e9aa436 Binary files /dev/null and b/src/dataset/sunflower/24755670569_e590bcbf24_c.jpg differ diff --git a/src/dataset/sunflower/24778990972_498423ff12_c.jpg b/src/dataset/sunflower/24778990972_498423ff12_c.jpg new file mode 100644 index 00000000..47e889b9 Binary files /dev/null and b/src/dataset/sunflower/24778990972_498423ff12_c.jpg differ diff --git a/src/dataset/sunflower/24961771498_81d4903138_c.jpg b/src/dataset/sunflower/24961771498_81d4903138_c.jpg new file mode 100644 index 00000000..2e566d57 Binary files /dev/null and b/src/dataset/sunflower/24961771498_81d4903138_c.jpg differ diff --git a/src/dataset/sunflower/251120696_46d8cff761_c.jpg b/src/dataset/sunflower/251120696_46d8cff761_c.jpg new file mode 100644 index 00000000..ef693077 Binary files /dev/null and b/src/dataset/sunflower/251120696_46d8cff761_c.jpg differ diff --git a/src/dataset/sunflower/2547314756_2158dc2d8a_c.jpg b/src/dataset/sunflower/2547314756_2158dc2d8a_c.jpg new file mode 100644 index 00000000..aef9b741 Binary files /dev/null and b/src/dataset/sunflower/2547314756_2158dc2d8a_c.jpg differ diff --git a/src/dataset/sunflower/25484303547_2f40b312df_c.jpg b/src/dataset/sunflower/25484303547_2f40b312df_c.jpg new file mode 100644 index 00000000..6c8e3c9d Binary files /dev/null and b/src/dataset/sunflower/25484303547_2f40b312df_c.jpg differ diff --git a/src/dataset/sunflower/25684803378_63432f9640_c.jpg b/src/dataset/sunflower/25684803378_63432f9640_c.jpg new file mode 100644 index 00000000..af806b4e Binary files /dev/null and b/src/dataset/sunflower/25684803378_63432f9640_c.jpg differ diff --git a/src/dataset/sunflower/25813160383_a7f5d457aa_c.jpg b/src/dataset/sunflower/25813160383_a7f5d457aa_c.jpg new file mode 100644 index 00000000..a90204fd Binary files /dev/null and b/src/dataset/sunflower/25813160383_a7f5d457aa_c.jpg differ diff --git a/src/dataset/sunflower/26145881329_a30f4febe6_c.jpg b/src/dataset/sunflower/26145881329_a30f4febe6_c.jpg new file mode 100644 index 00000000..d42e52de Binary files /dev/null and b/src/dataset/sunflower/26145881329_a30f4febe6_c.jpg differ diff --git a/src/dataset/sunflower/26146630808_c27d3efe52_c.jpg b/src/dataset/sunflower/26146630808_c27d3efe52_c.jpg new file mode 100644 index 00000000..4873b991 Binary files /dev/null and b/src/dataset/sunflower/26146630808_c27d3efe52_c.jpg differ diff --git a/src/dataset/sunflower/26146631478_fa0188a317_c.jpg b/src/dataset/sunflower/26146631478_fa0188a317_c.jpg new file mode 100644 index 00000000..c8663b32 Binary files /dev/null and b/src/dataset/sunflower/26146631478_fa0188a317_c.jpg differ diff --git a/src/dataset/sunflower/2642922427_9c829c074a_c.jpg b/src/dataset/sunflower/2642922427_9c829c074a_c.jpg new file mode 100644 index 00000000..c20c96b1 Binary files /dev/null and b/src/dataset/sunflower/2642922427_9c829c074a_c.jpg differ diff --git a/src/dataset/sunflower/26614946_4a4708a412_c.jpg b/src/dataset/sunflower/26614946_4a4708a412_c.jpg new file mode 100644 index 00000000..1e7e641a Binary files /dev/null and b/src/dataset/sunflower/26614946_4a4708a412_c.jpg differ diff --git a/src/dataset/sunflower/2662136910_56c4d09d69_c.jpg b/src/dataset/sunflower/2662136910_56c4d09d69_c.jpg new file mode 100644 index 00000000..1daa2605 Binary files /dev/null and b/src/dataset/sunflower/2662136910_56c4d09d69_c.jpg differ diff --git a/src/dataset/sunflower/2662138432_59484411f6_c.jpg b/src/dataset/sunflower/2662138432_59484411f6_c.jpg new file mode 100644 index 00000000..a4bdb323 Binary files /dev/null and b/src/dataset/sunflower/2662138432_59484411f6_c.jpg differ diff --git a/src/dataset/sunflower/26628742799_c1fb650ba9_c.jpg b/src/dataset/sunflower/26628742799_c1fb650ba9_c.jpg new file mode 100644 index 00000000..fa9b99c0 Binary files /dev/null and b/src/dataset/sunflower/26628742799_c1fb650ba9_c.jpg differ diff --git a/src/dataset/sunflower/2664071034_b514bfe4eb_c.jpg b/src/dataset/sunflower/2664071034_b514bfe4eb_c.jpg new file mode 100644 index 00000000..5a74fb01 Binary files /dev/null and b/src/dataset/sunflower/2664071034_b514bfe4eb_c.jpg differ diff --git a/src/dataset/sunflower/26663989822_1cdbc36be9_c.jpg b/src/dataset/sunflower/26663989822_1cdbc36be9_c.jpg new file mode 100644 index 00000000..3ab9881a Binary files /dev/null and b/src/dataset/sunflower/26663989822_1cdbc36be9_c.jpg differ diff --git a/src/dataset/sunflower/26695564441_d78471093a_c.jpg b/src/dataset/sunflower/26695564441_d78471093a_c.jpg new file mode 100644 index 00000000..eebd3013 Binary files /dev/null and b/src/dataset/sunflower/26695564441_d78471093a_c.jpg differ diff --git a/src/dataset/sunflower/26698575300_e5010fcea0_c.jpg b/src/dataset/sunflower/26698575300_e5010fcea0_c.jpg new file mode 100644 index 00000000..2677878f Binary files /dev/null and b/src/dataset/sunflower/26698575300_e5010fcea0_c.jpg differ diff --git a/src/dataset/sunflower/2683998113_1fbe21066d_c.jpg b/src/dataset/sunflower/2683998113_1fbe21066d_c.jpg new file mode 100644 index 00000000..d692ceec Binary files /dev/null and b/src/dataset/sunflower/2683998113_1fbe21066d_c.jpg differ diff --git a/src/dataset/sunflower/2684007547_f57ccbff62_c.jpg b/src/dataset/sunflower/2684007547_f57ccbff62_c.jpg new file mode 100644 index 00000000..2781c92b Binary files /dev/null and b/src/dataset/sunflower/2684007547_f57ccbff62_c.jpg differ diff --git a/src/dataset/sunflower/2684010303_f9341bb47f_c.jpg b/src/dataset/sunflower/2684010303_f9341bb47f_c.jpg new file mode 100644 index 00000000..dc444b76 Binary files /dev/null and b/src/dataset/sunflower/2684010303_f9341bb47f_c.jpg differ diff --git a/src/dataset/sunflower/2687779837_bdfec4a01b_c.jpg b/src/dataset/sunflower/2687779837_bdfec4a01b_c.jpg new file mode 100644 index 00000000..5897b31d Binary files /dev/null and b/src/dataset/sunflower/2687779837_bdfec4a01b_c.jpg differ diff --git a/src/dataset/sunflower/2688586436_9062bcd446_c.jpg b/src/dataset/sunflower/2688586436_9062bcd446_c.jpg new file mode 100644 index 00000000..106376aa Binary files /dev/null and b/src/dataset/sunflower/2688586436_9062bcd446_c.jpg differ diff --git a/src/dataset/sunflower/26911925308_a650979f92_c.jpg b/src/dataset/sunflower/26911925308_a650979f92_c.jpg new file mode 100644 index 00000000..7c3f6038 Binary files /dev/null and b/src/dataset/sunflower/26911925308_a650979f92_c.jpg differ diff --git a/src/dataset/sunflower/2697002801_2abfaea013_c.jpg b/src/dataset/sunflower/2697002801_2abfaea013_c.jpg new file mode 100644 index 00000000..90719b8f Binary files /dev/null and b/src/dataset/sunflower/2697002801_2abfaea013_c.jpg differ diff --git a/src/dataset/sunflower/2697710845_4e676afa57_c.jpg b/src/dataset/sunflower/2697710845_4e676afa57_c.jpg new file mode 100644 index 00000000..3a716bf5 Binary files /dev/null and b/src/dataset/sunflower/2697710845_4e676afa57_c.jpg differ diff --git a/src/dataset/sunflower/2697823302_8d9890ddc7_c.jpg b/src/dataset/sunflower/2697823302_8d9890ddc7_c.jpg new file mode 100644 index 00000000..5bb4c027 Binary files /dev/null and b/src/dataset/sunflower/2697823302_8d9890ddc7_c.jpg differ diff --git a/src/dataset/sunflower/27084002409_25f6145a64_c.jpg b/src/dataset/sunflower/27084002409_25f6145a64_c.jpg new file mode 100644 index 00000000..e6444b2b Binary files /dev/null and b/src/dataset/sunflower/27084002409_25f6145a64_c.jpg differ diff --git a/src/dataset/sunflower/27092565336_1cfbbbdc26_c.jpg b/src/dataset/sunflower/27092565336_1cfbbbdc26_c.jpg new file mode 100644 index 00000000..7bb10b3b Binary files /dev/null and b/src/dataset/sunflower/27092565336_1cfbbbdc26_c.jpg differ diff --git a/src/dataset/sunflower/2720410425_6c52b137a7_c.jpg b/src/dataset/sunflower/2720410425_6c52b137a7_c.jpg new file mode 100644 index 00000000..7de66d31 Binary files /dev/null and b/src/dataset/sunflower/2720410425_6c52b137a7_c.jpg differ diff --git a/src/dataset/sunflower/2729149084_356616105d_c.jpg b/src/dataset/sunflower/2729149084_356616105d_c.jpg new file mode 100644 index 00000000..ca266089 Binary files /dev/null and b/src/dataset/sunflower/2729149084_356616105d_c.jpg differ diff --git a/src/dataset/sunflower/2740474773_603a9e9782_c.jpg b/src/dataset/sunflower/2740474773_603a9e9782_c.jpg new file mode 100644 index 00000000..284688ac Binary files /dev/null and b/src/dataset/sunflower/2740474773_603a9e9782_c.jpg differ diff --git a/src/dataset/sunflower/2740478423_b12860a4a7_c.jpg b/src/dataset/sunflower/2740478423_b12860a4a7_c.jpg new file mode 100644 index 00000000..8b61e504 Binary files /dev/null and b/src/dataset/sunflower/2740478423_b12860a4a7_c.jpg differ diff --git a/src/dataset/sunflower/2740482963_e706b04715_c.jpg b/src/dataset/sunflower/2740482963_e706b04715_c.jpg new file mode 100644 index 00000000..1ca67062 Binary files /dev/null and b/src/dataset/sunflower/2740482963_e706b04715_c.jpg differ diff --git a/src/dataset/sunflower/2741332534_5da1925346_c.jpg b/src/dataset/sunflower/2741332534_5da1925346_c.jpg new file mode 100644 index 00000000..799bd889 Binary files /dev/null and b/src/dataset/sunflower/2741332534_5da1925346_c.jpg differ diff --git a/src/dataset/sunflower/2741639271_b76a8f2e40_c.jpg b/src/dataset/sunflower/2741639271_b76a8f2e40_c.jpg new file mode 100644 index 00000000..8487ab52 Binary files /dev/null and b/src/dataset/sunflower/2741639271_b76a8f2e40_c.jpg differ diff --git a/src/dataset/sunflower/2749422786_72f621ff25_c.jpg b/src/dataset/sunflower/2749422786_72f621ff25_c.jpg new file mode 100644 index 00000000..47639835 Binary files /dev/null and b/src/dataset/sunflower/2749422786_72f621ff25_c.jpg differ diff --git a/src/dataset/sunflower/2756946112_657cda5b86_c.jpg b/src/dataset/sunflower/2756946112_657cda5b86_c.jpg new file mode 100644 index 00000000..190a29fa Binary files /dev/null and b/src/dataset/sunflower/2756946112_657cda5b86_c.jpg differ diff --git a/src/dataset/sunflower/27570184417_f749e1c6d1_c.jpg b/src/dataset/sunflower/27570184417_f749e1c6d1_c.jpg new file mode 100644 index 00000000..5f6f9552 Binary files /dev/null and b/src/dataset/sunflower/27570184417_f749e1c6d1_c.jpg differ diff --git a/src/dataset/sunflower/2761481504_f3d13a60b7_c.jpg b/src/dataset/sunflower/2761481504_f3d13a60b7_c.jpg new file mode 100644 index 00000000..520f563e Binary files /dev/null and b/src/dataset/sunflower/2761481504_f3d13a60b7_c.jpg differ diff --git a/src/dataset/sunflower/2770372995_5f3d1dcd21_c.jpg b/src/dataset/sunflower/2770372995_5f3d1dcd21_c.jpg new file mode 100644 index 00000000..b4a1bd70 Binary files /dev/null and b/src/dataset/sunflower/2770372995_5f3d1dcd21_c.jpg differ diff --git a/src/dataset/sunflower/27715391_8956d218b5_c.jpg b/src/dataset/sunflower/27715391_8956d218b5_c.jpg new file mode 100644 index 00000000..9daa756b Binary files /dev/null and b/src/dataset/sunflower/27715391_8956d218b5_c.jpg differ diff --git a/src/dataset/sunflower/2771599115_c6214a859c_c.jpg b/src/dataset/sunflower/2771599115_c6214a859c_c.jpg new file mode 100644 index 00000000..62573c8b Binary files /dev/null and b/src/dataset/sunflower/2771599115_c6214a859c_c.jpg differ diff --git a/src/dataset/sunflower/2771599247_089f01cf5b_c.jpg b/src/dataset/sunflower/2771599247_089f01cf5b_c.jpg new file mode 100644 index 00000000..fd12a176 Binary files /dev/null and b/src/dataset/sunflower/2771599247_089f01cf5b_c.jpg differ diff --git a/src/dataset/sunflower/2778270089_3d61aa9023_c.jpg b/src/dataset/sunflower/2778270089_3d61aa9023_c.jpg new file mode 100644 index 00000000..d9b95a1e Binary files /dev/null and b/src/dataset/sunflower/2778270089_3d61aa9023_c.jpg differ diff --git a/src/dataset/sunflower/2781450336_5b6b1db86c_c.jpg b/src/dataset/sunflower/2781450336_5b6b1db86c_c.jpg new file mode 100644 index 00000000..59204b0a Binary files /dev/null and b/src/dataset/sunflower/2781450336_5b6b1db86c_c.jpg differ diff --git a/src/dataset/sunflower/2785760410_ca8ff4070c_c.jpg b/src/dataset/sunflower/2785760410_ca8ff4070c_c.jpg new file mode 100644 index 00000000..71b54681 Binary files /dev/null and b/src/dataset/sunflower/2785760410_ca8ff4070c_c.jpg differ diff --git a/src/dataset/sunflower/2790465728_bd8d1591fd_c.jpg b/src/dataset/sunflower/2790465728_bd8d1591fd_c.jpg new file mode 100644 index 00000000..3007cd43 Binary files /dev/null and b/src/dataset/sunflower/2790465728_bd8d1591fd_c.jpg differ diff --git a/src/dataset/sunflower/27929274834_26453bbd6d_c.jpg b/src/dataset/sunflower/27929274834_26453bbd6d_c.jpg new file mode 100644 index 00000000..69844fe4 Binary files /dev/null and b/src/dataset/sunflower/27929274834_26453bbd6d_c.jpg differ diff --git a/src/dataset/sunflower/2795360505_65f608cdae_c.jpg b/src/dataset/sunflower/2795360505_65f608cdae_c.jpg new file mode 100644 index 00000000..aded237b Binary files /dev/null and b/src/dataset/sunflower/2795360505_65f608cdae_c.jpg differ diff --git a/src/dataset/sunflower/27983184442_a1176cb925_c.jpg b/src/dataset/sunflower/27983184442_a1176cb925_c.jpg new file mode 100644 index 00000000..6c47d2b0 Binary files /dev/null and b/src/dataset/sunflower/27983184442_a1176cb925_c.jpg differ diff --git a/src/dataset/sunflower/28007037621_8e2ceea243_c.jpg b/src/dataset/sunflower/28007037621_8e2ceea243_c.jpg new file mode 100644 index 00000000..0e028da4 Binary files /dev/null and b/src/dataset/sunflower/28007037621_8e2ceea243_c.jpg differ diff --git a/src/dataset/sunflower/2803480335_491f1bf5be_c.jpg b/src/dataset/sunflower/2803480335_491f1bf5be_c.jpg new file mode 100644 index 00000000..1a6bd915 Binary files /dev/null and b/src/dataset/sunflower/2803480335_491f1bf5be_c.jpg differ diff --git a/src/dataset/sunflower/28069902173_3d30552f8a_c.jpg b/src/dataset/sunflower/28069902173_3d30552f8a_c.jpg new file mode 100644 index 00000000..b82c8c62 Binary files /dev/null and b/src/dataset/sunflower/28069902173_3d30552f8a_c.jpg differ diff --git a/src/dataset/sunflower/2813308667_1ab5b92fdb_c.jpg b/src/dataset/sunflower/2813308667_1ab5b92fdb_c.jpg new file mode 100644 index 00000000..84251bb6 Binary files /dev/null and b/src/dataset/sunflower/2813308667_1ab5b92fdb_c.jpg differ diff --git a/src/dataset/sunflower/2813314237_b607357945_c.jpg b/src/dataset/sunflower/2813314237_b607357945_c.jpg new file mode 100644 index 00000000..3a368559 Binary files /dev/null and b/src/dataset/sunflower/2813314237_b607357945_c.jpg differ diff --git a/src/dataset/sunflower/28163174704_07042d6903_c.jpg b/src/dataset/sunflower/28163174704_07042d6903_c.jpg new file mode 100644 index 00000000..9694be33 Binary files /dev/null and b/src/dataset/sunflower/28163174704_07042d6903_c.jpg differ diff --git a/src/dataset/sunflower/2820460092_66b9b350f1_c.jpg b/src/dataset/sunflower/2820460092_66b9b350f1_c.jpg new file mode 100644 index 00000000..1480ede5 Binary files /dev/null and b/src/dataset/sunflower/2820460092_66b9b350f1_c.jpg differ diff --git a/src/dataset/sunflower/2823080970_799f032145_c.jpg b/src/dataset/sunflower/2823080970_799f032145_c.jpg new file mode 100644 index 00000000..0ab54a8b Binary files /dev/null and b/src/dataset/sunflower/2823080970_799f032145_c.jpg differ diff --git a/src/dataset/sunflower/2824383791_4dfb47e85f_c.jpg b/src/dataset/sunflower/2824383791_4dfb47e85f_c.jpg new file mode 100644 index 00000000..9d41e99e Binary files /dev/null and b/src/dataset/sunflower/2824383791_4dfb47e85f_c.jpg differ diff --git a/src/dataset/sunflower/28266059158_d6388c41fa_c.jpg b/src/dataset/sunflower/28266059158_d6388c41fa_c.jpg new file mode 100644 index 00000000..48bcf2f6 Binary files /dev/null and b/src/dataset/sunflower/28266059158_d6388c41fa_c.jpg differ diff --git a/src/dataset/sunflower/2827424305_3330111024_c.jpg b/src/dataset/sunflower/2827424305_3330111024_c.jpg new file mode 100644 index 00000000..f5c3a8e6 Binary files /dev/null and b/src/dataset/sunflower/2827424305_3330111024_c.jpg differ diff --git a/src/dataset/sunflower/28274671943_5d2c5d49a3_c.jpg b/src/dataset/sunflower/28274671943_5d2c5d49a3_c.jpg new file mode 100644 index 00000000..1a3b843b Binary files /dev/null and b/src/dataset/sunflower/28274671943_5d2c5d49a3_c.jpg differ diff --git a/src/dataset/sunflower/28308227000_740566058a_c.jpg b/src/dataset/sunflower/28308227000_740566058a_c.jpg new file mode 100644 index 00000000..ec549dfa Binary files /dev/null and b/src/dataset/sunflower/28308227000_740566058a_c.jpg differ diff --git a/src/dataset/sunflower/2833878778_ee438592a3_c.jpg b/src/dataset/sunflower/2833878778_ee438592a3_c.jpg new file mode 100644 index 00000000..5096062e Binary files /dev/null and b/src/dataset/sunflower/2833878778_ee438592a3_c.jpg differ diff --git a/src/dataset/sunflower/283524535_0bac09d9ba_c.jpg b/src/dataset/sunflower/283524535_0bac09d9ba_c.jpg new file mode 100644 index 00000000..bbbfd77d Binary files /dev/null and b/src/dataset/sunflower/283524535_0bac09d9ba_c.jpg differ diff --git a/src/dataset/sunflower/2836332535_87328221ae_c.jpg b/src/dataset/sunflower/2836332535_87328221ae_c.jpg new file mode 100644 index 00000000..51d89410 Binary files /dev/null and b/src/dataset/sunflower/2836332535_87328221ae_c.jpg differ diff --git a/src/dataset/sunflower/2836428588_6707dc6272_c.jpg b/src/dataset/sunflower/2836428588_6707dc6272_c.jpg new file mode 100644 index 00000000..212f33eb Binary files /dev/null and b/src/dataset/sunflower/2836428588_6707dc6272_c.jpg differ diff --git a/src/dataset/sunflower/2838721708_f8c7544616_c.jpg b/src/dataset/sunflower/2838721708_f8c7544616_c.jpg new file mode 100644 index 00000000..444875d4 Binary files /dev/null and b/src/dataset/sunflower/2838721708_f8c7544616_c.jpg differ diff --git a/src/dataset/sunflower/28416653561_40fee747a0_c.jpg b/src/dataset/sunflower/28416653561_40fee747a0_c.jpg new file mode 100644 index 00000000..2d471c7b Binary files /dev/null and b/src/dataset/sunflower/28416653561_40fee747a0_c.jpg differ diff --git a/src/dataset/sunflower/2849067229_153705a389_c.jpg b/src/dataset/sunflower/2849067229_153705a389_c.jpg new file mode 100644 index 00000000..cda8438a Binary files /dev/null and b/src/dataset/sunflower/2849067229_153705a389_c.jpg differ diff --git a/src/dataset/sunflower/2849068263_0143c613f4_c.jpg b/src/dataset/sunflower/2849068263_0143c613f4_c.jpg new file mode 100644 index 00000000..860f2fc3 Binary files /dev/null and b/src/dataset/sunflower/2849068263_0143c613f4_c.jpg differ diff --git a/src/dataset/sunflower/2849069651_59e0515815_c.jpg b/src/dataset/sunflower/2849069651_59e0515815_c.jpg new file mode 100644 index 00000000..1cf35335 Binary files /dev/null and b/src/dataset/sunflower/2849069651_59e0515815_c.jpg differ diff --git a/src/dataset/sunflower/2849070379_1ec11b4068_c.jpg b/src/dataset/sunflower/2849070379_1ec11b4068_c.jpg new file mode 100644 index 00000000..8961608e Binary files /dev/null and b/src/dataset/sunflower/2849070379_1ec11b4068_c.jpg differ diff --git a/src/dataset/sunflower/2849071067_b3bce3bd42_c.jpg b/src/dataset/sunflower/2849071067_b3bce3bd42_c.jpg new file mode 100644 index 00000000..bf5f8ab3 Binary files /dev/null and b/src/dataset/sunflower/2849071067_b3bce3bd42_c.jpg differ diff --git a/src/dataset/sunflower/2849071833_dbef416920_c.jpg b/src/dataset/sunflower/2849071833_dbef416920_c.jpg new file mode 100644 index 00000000..d9808142 Binary files /dev/null and b/src/dataset/sunflower/2849071833_dbef416920_c.jpg differ diff --git a/src/dataset/sunflower/2849894782_9612276d00_c.jpg b/src/dataset/sunflower/2849894782_9612276d00_c.jpg new file mode 100644 index 00000000..77735932 Binary files /dev/null and b/src/dataset/sunflower/2849894782_9612276d00_c.jpg differ diff --git a/src/dataset/sunflower/2849898094_c67bfed156_c.jpg b/src/dataset/sunflower/2849898094_c67bfed156_c.jpg new file mode 100644 index 00000000..8cc7b71c Binary files /dev/null and b/src/dataset/sunflower/2849898094_c67bfed156_c.jpg differ diff --git a/src/dataset/sunflower/28514012096_3a682aa726_c.jpg b/src/dataset/sunflower/28514012096_3a682aa726_c.jpg new file mode 100644 index 00000000..ef71ba43 Binary files /dev/null and b/src/dataset/sunflower/28514012096_3a682aa726_c.jpg differ diff --git a/src/dataset/sunflower/2852621835_aed6ab1080_c.jpg b/src/dataset/sunflower/2852621835_aed6ab1080_c.jpg new file mode 100644 index 00000000..e705a6a6 Binary files /dev/null and b/src/dataset/sunflower/2852621835_aed6ab1080_c.jpg differ diff --git a/src/dataset/sunflower/2854537353_e8cd8a1aab_c.jpg b/src/dataset/sunflower/2854537353_e8cd8a1aab_c.jpg new file mode 100644 index 00000000..82423f1b Binary files /dev/null and b/src/dataset/sunflower/2854537353_e8cd8a1aab_c.jpg differ diff --git a/src/dataset/sunflower/2854539987_7e89e1cbd1_c.jpg b/src/dataset/sunflower/2854539987_7e89e1cbd1_c.jpg new file mode 100644 index 00000000..d44b63e6 Binary files /dev/null and b/src/dataset/sunflower/2854539987_7e89e1cbd1_c.jpg differ diff --git a/src/dataset/sunflower/2854602661_4ed031fe41_c.jpg b/src/dataset/sunflower/2854602661_4ed031fe41_c.jpg new file mode 100644 index 00000000..00a809e3 Binary files /dev/null and b/src/dataset/sunflower/2854602661_4ed031fe41_c.jpg differ diff --git a/src/dataset/sunflower/2854605599_54cb20cb93_c.jpg b/src/dataset/sunflower/2854605599_54cb20cb93_c.jpg new file mode 100644 index 00000000..aa298c37 Binary files /dev/null and b/src/dataset/sunflower/2854605599_54cb20cb93_c.jpg differ diff --git a/src/dataset/sunflower/28546062374_6334868fee_c.jpg b/src/dataset/sunflower/28546062374_6334868fee_c.jpg new file mode 100644 index 00000000..0e584cea Binary files /dev/null and b/src/dataset/sunflower/28546062374_6334868fee_c.jpg differ diff --git a/src/dataset/sunflower/2855442350_9a624fe464_c.jpg b/src/dataset/sunflower/2855442350_9a624fe464_c.jpg new file mode 100644 index 00000000..349a4463 Binary files /dev/null and b/src/dataset/sunflower/2855442350_9a624fe464_c.jpg differ diff --git a/src/dataset/sunflower/28563725174_3a2f30577a_c.jpg b/src/dataset/sunflower/28563725174_3a2f30577a_c.jpg new file mode 100644 index 00000000..64d3a053 Binary files /dev/null and b/src/dataset/sunflower/28563725174_3a2f30577a_c.jpg differ diff --git a/src/dataset/sunflower/28613616257_91b33cd3e9_c.jpg b/src/dataset/sunflower/28613616257_91b33cd3e9_c.jpg new file mode 100644 index 00000000..a996fb20 Binary files /dev/null and b/src/dataset/sunflower/28613616257_91b33cd3e9_c.jpg differ diff --git a/src/dataset/sunflower/2870419361_0c22f31621_c.jpg b/src/dataset/sunflower/2870419361_0c22f31621_c.jpg new file mode 100644 index 00000000..1755cbd5 Binary files /dev/null and b/src/dataset/sunflower/2870419361_0c22f31621_c.jpg differ diff --git a/src/dataset/sunflower/28708237126_ffdea27d74_c.jpg b/src/dataset/sunflower/28708237126_ffdea27d74_c.jpg new file mode 100644 index 00000000..b25b441c Binary files /dev/null and b/src/dataset/sunflower/28708237126_ffdea27d74_c.jpg differ diff --git a/src/dataset/sunflower/2872745696_13929dcac1_c.jpg b/src/dataset/sunflower/2872745696_13929dcac1_c.jpg new file mode 100644 index 00000000..7fcaa7b9 Binary files /dev/null and b/src/dataset/sunflower/2872745696_13929dcac1_c.jpg differ diff --git a/src/dataset/sunflower/2873849634_56928dc980_c.jpg b/src/dataset/sunflower/2873849634_56928dc980_c.jpg new file mode 100644 index 00000000..a03f8614 Binary files /dev/null and b/src/dataset/sunflower/2873849634_56928dc980_c.jpg differ diff --git a/src/dataset/sunflower/28742127390_3593df8f11_c.jpg b/src/dataset/sunflower/28742127390_3593df8f11_c.jpg new file mode 100644 index 00000000..00851af1 Binary files /dev/null and b/src/dataset/sunflower/28742127390_3593df8f11_c.jpg differ diff --git a/src/dataset/sunflower/2878331237_80e334b771_c.jpg b/src/dataset/sunflower/2878331237_80e334b771_c.jpg new file mode 100644 index 00000000..1bb52599 Binary files /dev/null and b/src/dataset/sunflower/2878331237_80e334b771_c.jpg differ diff --git a/src/dataset/sunflower/2879259189_d5fc8169bc_c.jpg b/src/dataset/sunflower/2879259189_d5fc8169bc_c.jpg new file mode 100644 index 00000000..bfa60209 Binary files /dev/null and b/src/dataset/sunflower/2879259189_d5fc8169bc_c.jpg differ diff --git a/src/dataset/sunflower/28803952707_04a28d9343_c.jpg b/src/dataset/sunflower/28803952707_04a28d9343_c.jpg new file mode 100644 index 00000000..18be55a0 Binary files /dev/null and b/src/dataset/sunflower/28803952707_04a28d9343_c.jpg differ diff --git a/src/dataset/sunflower/28807203730_276e5d40f8_c.jpg b/src/dataset/sunflower/28807203730_276e5d40f8_c.jpg new file mode 100644 index 00000000..1c8d5c61 Binary files /dev/null and b/src/dataset/sunflower/28807203730_276e5d40f8_c.jpg differ diff --git a/src/dataset/sunflower/28912138637_9f11178279_c.jpg b/src/dataset/sunflower/28912138637_9f11178279_c.jpg new file mode 100644 index 00000000..6bbbf5e7 Binary files /dev/null and b/src/dataset/sunflower/28912138637_9f11178279_c.jpg differ diff --git a/src/dataset/sunflower/28924683327_ef8572d110_c.jpg b/src/dataset/sunflower/28924683327_ef8572d110_c.jpg new file mode 100644 index 00000000..faf14dc4 Binary files /dev/null and b/src/dataset/sunflower/28924683327_ef8572d110_c.jpg differ diff --git a/src/dataset/sunflower/28932236497_cd71fa9b40_c.jpg b/src/dataset/sunflower/28932236497_cd71fa9b40_c.jpg new file mode 100644 index 00000000..e48629d3 Binary files /dev/null and b/src/dataset/sunflower/28932236497_cd71fa9b40_c.jpg differ diff --git a/src/dataset/sunflower/28983943912_d6aedc72b9_c.jpg b/src/dataset/sunflower/28983943912_d6aedc72b9_c.jpg new file mode 100644 index 00000000..08f3b5aa Binary files /dev/null and b/src/dataset/sunflower/28983943912_d6aedc72b9_c.jpg differ diff --git a/src/dataset/sunflower/29024120746_120c79fb5a_c.jpg b/src/dataset/sunflower/29024120746_120c79fb5a_c.jpg new file mode 100644 index 00000000..9ce37d54 Binary files /dev/null and b/src/dataset/sunflower/29024120746_120c79fb5a_c.jpg differ diff --git a/src/dataset/sunflower/2905795939_f0316e0dc6_c.jpg b/src/dataset/sunflower/2905795939_f0316e0dc6_c.jpg new file mode 100644 index 00000000..c4e68e7d Binary files /dev/null and b/src/dataset/sunflower/2905795939_f0316e0dc6_c.jpg differ diff --git a/src/dataset/sunflower/29058402437_4d8673c15e_c.jpg b/src/dataset/sunflower/29058402437_4d8673c15e_c.jpg new file mode 100644 index 00000000..cd1d2b1f Binary files /dev/null and b/src/dataset/sunflower/29058402437_4d8673c15e_c.jpg differ diff --git a/src/dataset/sunflower/29060890561_4dc84f18f4_c.jpg b/src/dataset/sunflower/29060890561_4dc84f18f4_c.jpg new file mode 100644 index 00000000..3458e916 Binary files /dev/null and b/src/dataset/sunflower/29060890561_4dc84f18f4_c.jpg differ diff --git a/src/dataset/sunflower/29111243147_39302887a1_c.jpg b/src/dataset/sunflower/29111243147_39302887a1_c.jpg new file mode 100644 index 00000000..e2b7a7f1 Binary files /dev/null and b/src/dataset/sunflower/29111243147_39302887a1_c.jpg differ diff --git a/src/dataset/sunflower/29133080348_dc8691ba8f_c.jpg b/src/dataset/sunflower/29133080348_dc8691ba8f_c.jpg new file mode 100644 index 00000000..37e8130e Binary files /dev/null and b/src/dataset/sunflower/29133080348_dc8691ba8f_c.jpg differ diff --git a/src/dataset/sunflower/2913709488_f8606d87ba_c.jpg b/src/dataset/sunflower/2913709488_f8606d87ba_c.jpg new file mode 100644 index 00000000..01fd1270 Binary files /dev/null and b/src/dataset/sunflower/2913709488_f8606d87ba_c.jpg differ diff --git a/src/dataset/sunflower/29158621097_7d7915174b_c.jpg b/src/dataset/sunflower/29158621097_7d7915174b_c.jpg new file mode 100644 index 00000000..912f521c Binary files /dev/null and b/src/dataset/sunflower/29158621097_7d7915174b_c.jpg differ diff --git a/src/dataset/sunflower/2920845600_50e4b85b57_c.jpg b/src/dataset/sunflower/2920845600_50e4b85b57_c.jpg new file mode 100644 index 00000000..198204ec Binary files /dev/null and b/src/dataset/sunflower/2920845600_50e4b85b57_c.jpg differ diff --git a/src/dataset/sunflower/29209541754_efca298a60_c.jpg b/src/dataset/sunflower/29209541754_efca298a60_c.jpg new file mode 100644 index 00000000..ad1d55ee Binary files /dev/null and b/src/dataset/sunflower/29209541754_efca298a60_c.jpg differ diff --git a/src/dataset/sunflower/29258450581_f5a0e97849_c.jpg b/src/dataset/sunflower/29258450581_f5a0e97849_c.jpg new file mode 100644 index 00000000..c3706dfb Binary files /dev/null and b/src/dataset/sunflower/29258450581_f5a0e97849_c.jpg differ diff --git a/src/dataset/sunflower/29322448790_e45763d4a9_c.jpg b/src/dataset/sunflower/29322448790_e45763d4a9_c.jpg new file mode 100644 index 00000000..5ed53879 Binary files /dev/null and b/src/dataset/sunflower/29322448790_e45763d4a9_c.jpg differ diff --git a/src/dataset/sunflower/29326709_e086a90c33_c.jpg b/src/dataset/sunflower/29326709_e086a90c33_c.jpg new file mode 100644 index 00000000..c9b222ca Binary files /dev/null and b/src/dataset/sunflower/29326709_e086a90c33_c.jpg differ diff --git a/src/dataset/sunflower/29379510907_3996337a0f_c.jpg b/src/dataset/sunflower/29379510907_3996337a0f_c.jpg new file mode 100644 index 00000000..22ae8b24 Binary files /dev/null and b/src/dataset/sunflower/29379510907_3996337a0f_c.jpg differ diff --git a/src/dataset/sunflower/29460463637_c5145d0a10_c.jpg b/src/dataset/sunflower/29460463637_c5145d0a10_c.jpg new file mode 100644 index 00000000..6f0d8c67 Binary files /dev/null and b/src/dataset/sunflower/29460463637_c5145d0a10_c.jpg differ diff --git a/src/dataset/sunflower/29553688438_d065fc380e_c.jpg b/src/dataset/sunflower/29553688438_d065fc380e_c.jpg new file mode 100644 index 00000000..23946ef3 Binary files /dev/null and b/src/dataset/sunflower/29553688438_d065fc380e_c.jpg differ diff --git a/src/dataset/sunflower/29596259518_c67547a4fa_c.jpg b/src/dataset/sunflower/29596259518_c67547a4fa_c.jpg new file mode 100644 index 00000000..9517e326 Binary files /dev/null and b/src/dataset/sunflower/29596259518_c67547a4fa_c.jpg differ diff --git a/src/dataset/sunflower/2962917516_d7360b9b2b_c.jpg b/src/dataset/sunflower/2962917516_d7360b9b2b_c.jpg new file mode 100644 index 00000000..45d44e15 Binary files /dev/null and b/src/dataset/sunflower/2962917516_d7360b9b2b_c.jpg differ diff --git a/src/dataset/sunflower/29693338438_7568022f7c_c.jpg b/src/dataset/sunflower/29693338438_7568022f7c_c.jpg new file mode 100644 index 00000000..06ebf246 Binary files /dev/null and b/src/dataset/sunflower/29693338438_7568022f7c_c.jpg differ diff --git a/src/dataset/sunflower/29719945936_c8826b8c74_c.jpg b/src/dataset/sunflower/29719945936_c8826b8c74_c.jpg new file mode 100644 index 00000000..48cda91e Binary files /dev/null and b/src/dataset/sunflower/29719945936_c8826b8c74_c.jpg differ diff --git a/src/dataset/sunflower/29776259622_5e6be1e209_c.jpg b/src/dataset/sunflower/29776259622_5e6be1e209_c.jpg new file mode 100644 index 00000000..4bb66bd6 Binary files /dev/null and b/src/dataset/sunflower/29776259622_5e6be1e209_c.jpg differ diff --git a/src/dataset/sunflower/29777891127_23d7bcc52b_c.jpg b/src/dataset/sunflower/29777891127_23d7bcc52b_c.jpg new file mode 100644 index 00000000..e601b2a3 Binary files /dev/null and b/src/dataset/sunflower/29777891127_23d7bcc52b_c.jpg differ diff --git a/src/dataset/sunflower/2979135291_6046c54784_c.jpg b/src/dataset/sunflower/2979135291_6046c54784_c.jpg new file mode 100644 index 00000000..bb012e0a Binary files /dev/null and b/src/dataset/sunflower/2979135291_6046c54784_c.jpg differ diff --git a/src/dataset/sunflower/29835637701_6ec01f7f3d_c.jpg b/src/dataset/sunflower/29835637701_6ec01f7f3d_c.jpg new file mode 100644 index 00000000..ed522778 Binary files /dev/null and b/src/dataset/sunflower/29835637701_6ec01f7f3d_c.jpg differ diff --git a/src/dataset/sunflower/29836995915_4a065fd2d8_c.jpg b/src/dataset/sunflower/29836995915_4a065fd2d8_c.jpg new file mode 100644 index 00000000..2cff4e8f Binary files /dev/null and b/src/dataset/sunflower/29836995915_4a065fd2d8_c.jpg differ diff --git a/src/dataset/sunflower/29872219378_b0bda37e5a_c.jpg b/src/dataset/sunflower/29872219378_b0bda37e5a_c.jpg new file mode 100644 index 00000000..66b0d42c Binary files /dev/null and b/src/dataset/sunflower/29872219378_b0bda37e5a_c.jpg differ diff --git a/src/dataset/sunflower/29884203346_47db74fb82_c.jpg b/src/dataset/sunflower/29884203346_47db74fb82_c.jpg new file mode 100644 index 00000000..f6fd4ca0 Binary files /dev/null and b/src/dataset/sunflower/29884203346_47db74fb82_c.jpg differ diff --git a/src/dataset/sunflower/2993803029_761ec9c43d_c.jpg b/src/dataset/sunflower/2993803029_761ec9c43d_c.jpg new file mode 100644 index 00000000..37e9d4b7 Binary files /dev/null and b/src/dataset/sunflower/2993803029_761ec9c43d_c.jpg differ diff --git a/src/dataset/sunflower/2996085480_0b2144c08a_c.jpg b/src/dataset/sunflower/2996085480_0b2144c08a_c.jpg new file mode 100644 index 00000000..9886c589 Binary files /dev/null and b/src/dataset/sunflower/2996085480_0b2144c08a_c.jpg differ diff --git a/src/dataset/sunflower/29976235266_32a8616c9a_c.jpg b/src/dataset/sunflower/29976235266_32a8616c9a_c.jpg new file mode 100644 index 00000000..b8530e4a Binary files /dev/null and b/src/dataset/sunflower/29976235266_32a8616c9a_c.jpg differ diff --git a/src/dataset/sunflower/29996904345_1c57357567_c.jpg b/src/dataset/sunflower/29996904345_1c57357567_c.jpg new file mode 100644 index 00000000..a8dd1710 Binary files /dev/null and b/src/dataset/sunflower/29996904345_1c57357567_c.jpg differ diff --git a/src/dataset/sunflower/30016852178_cbee462cbd_c.jpg b/src/dataset/sunflower/30016852178_cbee462cbd_c.jpg new file mode 100644 index 00000000..c0711fd6 Binary files /dev/null and b/src/dataset/sunflower/30016852178_cbee462cbd_c.jpg differ diff --git a/src/dataset/sunflower/30127366488_b716a7716c_c.jpg b/src/dataset/sunflower/30127366488_b716a7716c_c.jpg new file mode 100644 index 00000000..e71cb874 Binary files /dev/null and b/src/dataset/sunflower/30127366488_b716a7716c_c.jpg differ diff --git a/src/dataset/sunflower/30131718848_18cccc7b3f_c.jpg b/src/dataset/sunflower/30131718848_18cccc7b3f_c.jpg new file mode 100644 index 00000000..9b66e2a8 Binary files /dev/null and b/src/dataset/sunflower/30131718848_18cccc7b3f_c.jpg differ diff --git a/src/dataset/sunflower/30293903168_afa3d7b803_c.jpg b/src/dataset/sunflower/30293903168_afa3d7b803_c.jpg new file mode 100644 index 00000000..9d88dc79 Binary files /dev/null and b/src/dataset/sunflower/30293903168_afa3d7b803_c.jpg differ diff --git a/src/dataset/sunflower/30293903298_8558f3842e_c.jpg b/src/dataset/sunflower/30293903298_8558f3842e_c.jpg new file mode 100644 index 00000000..80189daf Binary files /dev/null and b/src/dataset/sunflower/30293903298_8558f3842e_c.jpg differ diff --git a/src/dataset/sunflower/30293903528_eebe227f6a_c.jpg b/src/dataset/sunflower/30293903528_eebe227f6a_c.jpg new file mode 100644 index 00000000..b0029501 Binary files /dev/null and b/src/dataset/sunflower/30293903528_eebe227f6a_c.jpg differ diff --git a/src/dataset/sunflower/30293903778_284e05e20b_c.jpg b/src/dataset/sunflower/30293903778_284e05e20b_c.jpg new file mode 100644 index 00000000..dbe52137 Binary files /dev/null and b/src/dataset/sunflower/30293903778_284e05e20b_c.jpg differ diff --git a/src/dataset/sunflower/30293903948_59e5ba3dc0_c.jpg b/src/dataset/sunflower/30293903948_59e5ba3dc0_c.jpg new file mode 100644 index 00000000..c0b5ca4c Binary files /dev/null and b/src/dataset/sunflower/30293903948_59e5ba3dc0_c.jpg differ diff --git a/src/dataset/sunflower/30293904528_5d534a4c5c_c.jpg b/src/dataset/sunflower/30293904528_5d534a4c5c_c.jpg new file mode 100644 index 00000000..67ba4cc4 Binary files /dev/null and b/src/dataset/sunflower/30293904528_5d534a4c5c_c.jpg differ diff --git a/src/dataset/sunflower/3029397804_3b2c5b60ed_c.jpg b/src/dataset/sunflower/3029397804_3b2c5b60ed_c.jpg new file mode 100644 index 00000000..515c86fa Binary files /dev/null and b/src/dataset/sunflower/3029397804_3b2c5b60ed_c.jpg differ diff --git a/src/dataset/sunflower/30337305327_816129fc13_c.jpg b/src/dataset/sunflower/30337305327_816129fc13_c.jpg new file mode 100644 index 00000000..a8572784 Binary files /dev/null and b/src/dataset/sunflower/30337305327_816129fc13_c.jpg differ diff --git a/src/dataset/sunflower/30493857448_846b619de5_c.jpg b/src/dataset/sunflower/30493857448_846b619de5_c.jpg new file mode 100644 index 00000000..6487c46d Binary files /dev/null and b/src/dataset/sunflower/30493857448_846b619de5_c.jpg differ diff --git a/src/dataset/sunflower/30511133957_5e1e11cd35_c.jpg b/src/dataset/sunflower/30511133957_5e1e11cd35_c.jpg new file mode 100644 index 00000000..8a506f58 Binary files /dev/null and b/src/dataset/sunflower/30511133957_5e1e11cd35_c.jpg differ diff --git a/src/dataset/sunflower/30515579658_604897a893_c.jpg b/src/dataset/sunflower/30515579658_604897a893_c.jpg new file mode 100644 index 00000000..71624794 Binary files /dev/null and b/src/dataset/sunflower/30515579658_604897a893_c.jpg differ diff --git a/src/dataset/sunflower/30589756458_c14e1de82e_c.jpg b/src/dataset/sunflower/30589756458_c14e1de82e_c.jpg new file mode 100644 index 00000000..b506f292 Binary files /dev/null and b/src/dataset/sunflower/30589756458_c14e1de82e_c.jpg differ diff --git a/src/dataset/sunflower/30691344138_fd45bb3155_c.jpg b/src/dataset/sunflower/30691344138_fd45bb3155_c.jpg new file mode 100644 index 00000000..7c383cf5 Binary files /dev/null and b/src/dataset/sunflower/30691344138_fd45bb3155_c.jpg differ diff --git a/src/dataset/sunflower/30696938178_43f3fe3acf_c.jpg b/src/dataset/sunflower/30696938178_43f3fe3acf_c.jpg new file mode 100644 index 00000000..134adca8 Binary files /dev/null and b/src/dataset/sunflower/30696938178_43f3fe3acf_c.jpg differ diff --git a/src/dataset/sunflower/30724712552_c17f9b4995_c.jpg b/src/dataset/sunflower/30724712552_c17f9b4995_c.jpg new file mode 100644 index 00000000..96059b77 Binary files /dev/null and b/src/dataset/sunflower/30724712552_c17f9b4995_c.jpg differ diff --git a/src/dataset/sunflower/309167784_4fbce0763a_c.jpg b/src/dataset/sunflower/309167784_4fbce0763a_c.jpg new file mode 100644 index 00000000..380945b5 Binary files /dev/null and b/src/dataset/sunflower/309167784_4fbce0763a_c.jpg differ diff --git a/src/dataset/sunflower/309167791_16befbcc8a_c.jpg b/src/dataset/sunflower/309167791_16befbcc8a_c.jpg new file mode 100644 index 00000000..e2758432 Binary files /dev/null and b/src/dataset/sunflower/309167791_16befbcc8a_c.jpg differ diff --git a/src/dataset/sunflower/31001778968_0d1e1e541a_c.jpg b/src/dataset/sunflower/31001778968_0d1e1e541a_c.jpg new file mode 100644 index 00000000..a5832022 Binary files /dev/null and b/src/dataset/sunflower/31001778968_0d1e1e541a_c.jpg differ diff --git a/src/dataset/sunflower/31047527896_188ca9fa9a_c.jpg b/src/dataset/sunflower/31047527896_188ca9fa9a_c.jpg new file mode 100644 index 00000000..0c022122 Binary files /dev/null and b/src/dataset/sunflower/31047527896_188ca9fa9a_c.jpg differ diff --git a/src/dataset/sunflower/31140204098_276b85ece8_c.jpg b/src/dataset/sunflower/31140204098_276b85ece8_c.jpg new file mode 100644 index 00000000..8b9a908c Binary files /dev/null and b/src/dataset/sunflower/31140204098_276b85ece8_c.jpg differ diff --git a/src/dataset/sunflower/312540668_b946cf5298_c.jpg b/src/dataset/sunflower/312540668_b946cf5298_c.jpg new file mode 100644 index 00000000..d8c9342e Binary files /dev/null and b/src/dataset/sunflower/312540668_b946cf5298_c.jpg differ diff --git a/src/dataset/sunflower/31359847798_548e13f0e0_c.jpg b/src/dataset/sunflower/31359847798_548e13f0e0_c.jpg new file mode 100644 index 00000000..597cbbbe Binary files /dev/null and b/src/dataset/sunflower/31359847798_548e13f0e0_c.jpg differ diff --git a/src/dataset/sunflower/31406369757_f61f005c21_c.jpg b/src/dataset/sunflower/31406369757_f61f005c21_c.jpg new file mode 100644 index 00000000..0ad08196 Binary files /dev/null and b/src/dataset/sunflower/31406369757_f61f005c21_c.jpg differ diff --git a/src/dataset/sunflower/31703994537_a4cc34b9a7_c.jpg b/src/dataset/sunflower/31703994537_a4cc34b9a7_c.jpg new file mode 100644 index 00000000..81da90d8 Binary files /dev/null and b/src/dataset/sunflower/31703994537_a4cc34b9a7_c.jpg differ diff --git a/src/dataset/sunflower/3183266865_3169ca947d_c.jpg b/src/dataset/sunflower/3183266865_3169ca947d_c.jpg new file mode 100644 index 00000000..2476c693 Binary files /dev/null and b/src/dataset/sunflower/3183266865_3169ca947d_c.jpg differ diff --git a/src/dataset/sunflower/31941876268_91be1aefba_c.jpg b/src/dataset/sunflower/31941876268_91be1aefba_c.jpg new file mode 100644 index 00000000..ca0d45a8 Binary files /dev/null and b/src/dataset/sunflower/31941876268_91be1aefba_c.jpg differ diff --git a/src/dataset/sunflower/3242438675_6037ba379e_c.jpg b/src/dataset/sunflower/3242438675_6037ba379e_c.jpg new file mode 100644 index 00000000..1cabfe44 Binary files /dev/null and b/src/dataset/sunflower/3242438675_6037ba379e_c.jpg differ diff --git a/src/dataset/sunflower/32473676348_663147f38c_c.jpg b/src/dataset/sunflower/32473676348_663147f38c_c.jpg new file mode 100644 index 00000000..a5074568 Binary files /dev/null and b/src/dataset/sunflower/32473676348_663147f38c_c.jpg differ diff --git a/src/dataset/sunflower/32499013893_06631217b4_c.jpg b/src/dataset/sunflower/32499013893_06631217b4_c.jpg new file mode 100644 index 00000000..1b25a789 Binary files /dev/null and b/src/dataset/sunflower/32499013893_06631217b4_c.jpg differ diff --git a/src/dataset/sunflower/32541652434_71faabd412_c.jpg b/src/dataset/sunflower/32541652434_71faabd412_c.jpg new file mode 100644 index 00000000..27f70305 Binary files /dev/null and b/src/dataset/sunflower/32541652434_71faabd412_c.jpg differ diff --git a/src/dataset/sunflower/3265316624_cec6a0a4fe_c.jpg b/src/dataset/sunflower/3265316624_cec6a0a4fe_c.jpg new file mode 100644 index 00000000..7c0c42cf Binary files /dev/null and b/src/dataset/sunflower/3265316624_cec6a0a4fe_c.jpg differ diff --git a/src/dataset/sunflower/3270245443_be4877a148_c.jpg b/src/dataset/sunflower/3270245443_be4877a148_c.jpg new file mode 100644 index 00000000..ac2d9573 Binary files /dev/null and b/src/dataset/sunflower/3270245443_be4877a148_c.jpg differ diff --git a/src/dataset/sunflower/3279927933_d9c99356a2_c.jpg b/src/dataset/sunflower/3279927933_d9c99356a2_c.jpg new file mode 100644 index 00000000..8076113d Binary files /dev/null and b/src/dataset/sunflower/3279927933_d9c99356a2_c.jpg differ diff --git a/src/dataset/sunflower/328257848_579e043cd5_c.jpg b/src/dataset/sunflower/328257848_579e043cd5_c.jpg new file mode 100644 index 00000000..79eb30f6 Binary files /dev/null and b/src/dataset/sunflower/328257848_579e043cd5_c.jpg differ diff --git a/src/dataset/sunflower/32941503406_a287bcb81c_c.jpg b/src/dataset/sunflower/32941503406_a287bcb81c_c.jpg new file mode 100644 index 00000000..bd6a8972 Binary files /dev/null and b/src/dataset/sunflower/32941503406_a287bcb81c_c.jpg differ diff --git a/src/dataset/sunflower/330178835_69e055ad04_c.jpg b/src/dataset/sunflower/330178835_69e055ad04_c.jpg new file mode 100644 index 00000000..cb334ad8 Binary files /dev/null and b/src/dataset/sunflower/330178835_69e055ad04_c.jpg differ diff --git a/src/dataset/sunflower/3310980409_e83d0c81b8_c.jpg b/src/dataset/sunflower/3310980409_e83d0c81b8_c.jpg new file mode 100644 index 00000000..518054b9 Binary files /dev/null and b/src/dataset/sunflower/3310980409_e83d0c81b8_c.jpg differ diff --git a/src/dataset/sunflower/3325176736_f83e504842_c.jpg b/src/dataset/sunflower/3325176736_f83e504842_c.jpg new file mode 100644 index 00000000..0d22ee24 Binary files /dev/null and b/src/dataset/sunflower/3325176736_f83e504842_c.jpg differ diff --git a/src/dataset/sunflower/3354200188_4687aac493_c.jpg b/src/dataset/sunflower/3354200188_4687aac493_c.jpg new file mode 100644 index 00000000..a481be12 Binary files /dev/null and b/src/dataset/sunflower/3354200188_4687aac493_c.jpg differ diff --git a/src/dataset/sunflower/3358814828_ee2a68c5a7_c.jpg b/src/dataset/sunflower/3358814828_ee2a68c5a7_c.jpg new file mode 100644 index 00000000..ef5ea839 Binary files /dev/null and b/src/dataset/sunflower/3358814828_ee2a68c5a7_c.jpg differ diff --git a/src/dataset/sunflower/337043613_666ce2f082_c.jpg b/src/dataset/sunflower/337043613_666ce2f082_c.jpg new file mode 100644 index 00000000..69f8aeea Binary files /dev/null and b/src/dataset/sunflower/337043613_666ce2f082_c.jpg differ diff --git a/src/dataset/sunflower/33813929_171ec3ca98_c.jpg b/src/dataset/sunflower/33813929_171ec3ca98_c.jpg new file mode 100644 index 00000000..e8cf59fb Binary files /dev/null and b/src/dataset/sunflower/33813929_171ec3ca98_c.jpg differ diff --git a/src/dataset/sunflower/3381681390_2761ac6a0d_c.jpg b/src/dataset/sunflower/3381681390_2761ac6a0d_c.jpg new file mode 100644 index 00000000..b42ed06b Binary files /dev/null and b/src/dataset/sunflower/3381681390_2761ac6a0d_c.jpg differ diff --git a/src/dataset/sunflower/3389200291_f0790604eb_c.jpg b/src/dataset/sunflower/3389200291_f0790604eb_c.jpg new file mode 100644 index 00000000..bd2fc4a9 Binary files /dev/null and b/src/dataset/sunflower/3389200291_f0790604eb_c.jpg differ diff --git a/src/dataset/sunflower/3390728483_c8ca0b9192_c.jpg b/src/dataset/sunflower/3390728483_c8ca0b9192_c.jpg new file mode 100644 index 00000000..e67ebab5 Binary files /dev/null and b/src/dataset/sunflower/3390728483_c8ca0b9192_c.jpg differ diff --git a/src/dataset/sunflower/340826140_c83749e5e7_c.jpg b/src/dataset/sunflower/340826140_c83749e5e7_c.jpg new file mode 100644 index 00000000..dc4de803 Binary files /dev/null and b/src/dataset/sunflower/340826140_c83749e5e7_c.jpg differ diff --git a/src/dataset/sunflower/34283171450_3daa734504_c.jpg b/src/dataset/sunflower/34283171450_3daa734504_c.jpg new file mode 100644 index 00000000..022fdbdf Binary files /dev/null and b/src/dataset/sunflower/34283171450_3daa734504_c.jpg differ diff --git a/src/dataset/sunflower/34340387614_0922a27cd3_c.jpg b/src/dataset/sunflower/34340387614_0922a27cd3_c.jpg new file mode 100644 index 00000000..5d063448 Binary files /dev/null and b/src/dataset/sunflower/34340387614_0922a27cd3_c.jpg differ diff --git a/src/dataset/sunflower/34340387914_1c679e4860_c.jpg b/src/dataset/sunflower/34340387914_1c679e4860_c.jpg new file mode 100644 index 00000000..6fdf350d Binary files /dev/null and b/src/dataset/sunflower/34340387914_1c679e4860_c.jpg differ diff --git a/src/dataset/sunflower/34340388204_8590d9d750_c.jpg b/src/dataset/sunflower/34340388204_8590d9d750_c.jpg new file mode 100644 index 00000000..09f81992 Binary files /dev/null and b/src/dataset/sunflower/34340388204_8590d9d750_c.jpg differ diff --git a/src/dataset/sunflower/34540238273_b057d5502c_c.jpg b/src/dataset/sunflower/34540238273_b057d5502c_c.jpg new file mode 100644 index 00000000..94aa4ae2 Binary files /dev/null and b/src/dataset/sunflower/34540238273_b057d5502c_c.jpg differ diff --git a/src/dataset/sunflower/34695605616_3b05bb1ef5_c.jpg b/src/dataset/sunflower/34695605616_3b05bb1ef5_c.jpg new file mode 100644 index 00000000..25e2c133 Binary files /dev/null and b/src/dataset/sunflower/34695605616_3b05bb1ef5_c.jpg differ diff --git a/src/dataset/sunflower/34712801396_3f8bedab31_c.jpg b/src/dataset/sunflower/34712801396_3f8bedab31_c.jpg new file mode 100644 index 00000000..3514009e Binary files /dev/null and b/src/dataset/sunflower/34712801396_3f8bedab31_c.jpg differ diff --git a/src/dataset/sunflower/34765162040_f284c336a1_c.jpg b/src/dataset/sunflower/34765162040_f284c336a1_c.jpg new file mode 100644 index 00000000..191a7030 Binary files /dev/null and b/src/dataset/sunflower/34765162040_f284c336a1_c.jpg differ diff --git a/src/dataset/sunflower/34995152160_91863a4f00_c.jpg b/src/dataset/sunflower/34995152160_91863a4f00_c.jpg new file mode 100644 index 00000000..fed97ae4 Binary files /dev/null and b/src/dataset/sunflower/34995152160_91863a4f00_c.jpg differ diff --git a/src/dataset/sunflower/35020174902_412f651654_c.jpg b/src/dataset/sunflower/35020174902_412f651654_c.jpg new file mode 100644 index 00000000..ec561c59 Binary files /dev/null and b/src/dataset/sunflower/35020174902_412f651654_c.jpg differ diff --git a/src/dataset/sunflower/35020175172_ddd4f72284_c.jpg b/src/dataset/sunflower/35020175172_ddd4f72284_c.jpg new file mode 100644 index 00000000..1697dac2 Binary files /dev/null and b/src/dataset/sunflower/35020175172_ddd4f72284_c.jpg differ diff --git a/src/dataset/sunflower/35020175342_c6cb8a215a_c.jpg b/src/dataset/sunflower/35020175342_c6cb8a215a_c.jpg new file mode 100644 index 00000000..cf2f639c Binary files /dev/null and b/src/dataset/sunflower/35020175342_c6cb8a215a_c.jpg differ diff --git a/src/dataset/sunflower/35020175562_33f2b4723b_c.jpg b/src/dataset/sunflower/35020175562_33f2b4723b_c.jpg new file mode 100644 index 00000000..a08b3dca Binary files /dev/null and b/src/dataset/sunflower/35020175562_33f2b4723b_c.jpg differ diff --git a/src/dataset/sunflower/35024348096_54f3acb0a5_c.jpg b/src/dataset/sunflower/35024348096_54f3acb0a5_c.jpg new file mode 100644 index 00000000..a24b56ea Binary files /dev/null and b/src/dataset/sunflower/35024348096_54f3acb0a5_c.jpg differ diff --git a/src/dataset/sunflower/35136563713_a685fa5dc3_c.jpg b/src/dataset/sunflower/35136563713_a685fa5dc3_c.jpg new file mode 100644 index 00000000..8a8c7572 Binary files /dev/null and b/src/dataset/sunflower/35136563713_a685fa5dc3_c.jpg differ diff --git a/src/dataset/sunflower/35212650303_496c2580a0_c.jpg b/src/dataset/sunflower/35212650303_496c2580a0_c.jpg new file mode 100644 index 00000000..62efe8d8 Binary files /dev/null and b/src/dataset/sunflower/35212650303_496c2580a0_c.jpg differ diff --git a/src/dataset/sunflower/35252211281_65856433a3_c.jpg b/src/dataset/sunflower/35252211281_65856433a3_c.jpg new file mode 100644 index 00000000..f700e0e6 Binary files /dev/null and b/src/dataset/sunflower/35252211281_65856433a3_c.jpg differ diff --git a/src/dataset/sunflower/35262907173_344440816e_c.jpg b/src/dataset/sunflower/35262907173_344440816e_c.jpg new file mode 100644 index 00000000..893bc36c Binary files /dev/null and b/src/dataset/sunflower/35262907173_344440816e_c.jpg differ diff --git a/src/dataset/sunflower/35349571271_787da1de42_c.jpg b/src/dataset/sunflower/35349571271_787da1de42_c.jpg new file mode 100644 index 00000000..240bc2fa Binary files /dev/null and b/src/dataset/sunflower/35349571271_787da1de42_c.jpg differ diff --git a/src/dataset/sunflower/35479800685_7732eb441b_c.jpg b/src/dataset/sunflower/35479800685_7732eb441b_c.jpg new file mode 100644 index 00000000..bcd7395c Binary files /dev/null and b/src/dataset/sunflower/35479800685_7732eb441b_c.jpg differ diff --git a/src/dataset/sunflower/3555615111_dcdbeb82b0_c.jpg b/src/dataset/sunflower/3555615111_dcdbeb82b0_c.jpg new file mode 100644 index 00000000..141007f7 Binary files /dev/null and b/src/dataset/sunflower/3555615111_dcdbeb82b0_c.jpg differ diff --git a/src/dataset/sunflower/35557375960_c5d4b04afc_c.jpg b/src/dataset/sunflower/35557375960_c5d4b04afc_c.jpg new file mode 100644 index 00000000..501ea320 Binary files /dev/null and b/src/dataset/sunflower/35557375960_c5d4b04afc_c.jpg differ diff --git a/src/dataset/sunflower/35609988303_7209a17975_c.jpg b/src/dataset/sunflower/35609988303_7209a17975_c.jpg new file mode 100644 index 00000000..7157e38f Binary files /dev/null and b/src/dataset/sunflower/35609988303_7209a17975_c.jpg differ diff --git a/src/dataset/sunflower/35694904224_fe65cbc37f_c.jpg b/src/dataset/sunflower/35694904224_fe65cbc37f_c.jpg new file mode 100644 index 00000000..c09909bb Binary files /dev/null and b/src/dataset/sunflower/35694904224_fe65cbc37f_c.jpg differ diff --git a/src/dataset/sunflower/35790463104_617643221d_c.jpg b/src/dataset/sunflower/35790463104_617643221d_c.jpg new file mode 100644 index 00000000..cc879a28 Binary files /dev/null and b/src/dataset/sunflower/35790463104_617643221d_c.jpg differ diff --git a/src/dataset/sunflower/35806936571_78aa3c3ae5_c.jpg b/src/dataset/sunflower/35806936571_78aa3c3ae5_c.jpg new file mode 100644 index 00000000..4625a591 Binary files /dev/null and b/src/dataset/sunflower/35806936571_78aa3c3ae5_c.jpg differ diff --git a/src/dataset/sunflower/35807328402_37224c938f_c.jpg b/src/dataset/sunflower/35807328402_37224c938f_c.jpg new file mode 100644 index 00000000..b340b0bc Binary files /dev/null and b/src/dataset/sunflower/35807328402_37224c938f_c.jpg differ diff --git a/src/dataset/sunflower/3582273854_04f3e54c1e_c.jpg b/src/dataset/sunflower/3582273854_04f3e54c1e_c.jpg new file mode 100644 index 00000000..e6a1ebbe Binary files /dev/null and b/src/dataset/sunflower/3582273854_04f3e54c1e_c.jpg differ diff --git a/src/dataset/sunflower/35980472944_6c6f8e0f6b_c.jpg b/src/dataset/sunflower/35980472944_6c6f8e0f6b_c.jpg new file mode 100644 index 00000000..9f1bb287 Binary files /dev/null and b/src/dataset/sunflower/35980472944_6c6f8e0f6b_c.jpg differ diff --git a/src/dataset/sunflower/36013765460_ea48ecaf76_c.jpg b/src/dataset/sunflower/36013765460_ea48ecaf76_c.jpg new file mode 100644 index 00000000..01b432e6 Binary files /dev/null and b/src/dataset/sunflower/36013765460_ea48ecaf76_c.jpg differ diff --git a/src/dataset/sunflower/3603343240_5f025484b3_c.jpg b/src/dataset/sunflower/3603343240_5f025484b3_c.jpg new file mode 100644 index 00000000..6202e77b Binary files /dev/null and b/src/dataset/sunflower/3603343240_5f025484b3_c.jpg differ diff --git a/src/dataset/sunflower/36145900540_5c8ee05812_c.jpg b/src/dataset/sunflower/36145900540_5c8ee05812_c.jpg new file mode 100644 index 00000000..1d9c772e Binary files /dev/null and b/src/dataset/sunflower/36145900540_5c8ee05812_c.jpg differ diff --git a/src/dataset/sunflower/36220701101_f520ea61d5_c.jpg b/src/dataset/sunflower/36220701101_f520ea61d5_c.jpg new file mode 100644 index 00000000..2e03ba39 Binary files /dev/null and b/src/dataset/sunflower/36220701101_f520ea61d5_c.jpg differ diff --git a/src/dataset/sunflower/36348408136_15cf4d03ea_c.jpg b/src/dataset/sunflower/36348408136_15cf4d03ea_c.jpg new file mode 100644 index 00000000..b5f35695 Binary files /dev/null and b/src/dataset/sunflower/36348408136_15cf4d03ea_c.jpg differ diff --git a/src/dataset/sunflower/36376545006_5f2daa8a58_c.jpg b/src/dataset/sunflower/36376545006_5f2daa8a58_c.jpg new file mode 100644 index 00000000..8030e790 Binary files /dev/null and b/src/dataset/sunflower/36376545006_5f2daa8a58_c.jpg differ diff --git a/src/dataset/sunflower/36382169502_ee798226a9_c.jpg b/src/dataset/sunflower/36382169502_ee798226a9_c.jpg new file mode 100644 index 00000000..c563b62b Binary files /dev/null and b/src/dataset/sunflower/36382169502_ee798226a9_c.jpg differ diff --git a/src/dataset/sunflower/36388570625_100d6cb388_c.jpg b/src/dataset/sunflower/36388570625_100d6cb388_c.jpg new file mode 100644 index 00000000..6fecdd8e Binary files /dev/null and b/src/dataset/sunflower/36388570625_100d6cb388_c.jpg differ diff --git a/src/dataset/sunflower/36410712992_54f01986c9_c.jpg b/src/dataset/sunflower/36410712992_54f01986c9_c.jpg new file mode 100644 index 00000000..94c02b73 Binary files /dev/null and b/src/dataset/sunflower/36410712992_54f01986c9_c.jpg differ diff --git a/src/dataset/sunflower/36421639025_dc7343c071_c.jpg b/src/dataset/sunflower/36421639025_dc7343c071_c.jpg new file mode 100644 index 00000000..194b14da Binary files /dev/null and b/src/dataset/sunflower/36421639025_dc7343c071_c.jpg differ diff --git a/src/dataset/sunflower/36441600364_bdf4e4cce3_c.jpg b/src/dataset/sunflower/36441600364_bdf4e4cce3_c.jpg new file mode 100644 index 00000000..22ef2896 Binary files /dev/null and b/src/dataset/sunflower/36441600364_bdf4e4cce3_c.jpg differ diff --git a/src/dataset/sunflower/36444816360_4de1b37f0c_c.jpg b/src/dataset/sunflower/36444816360_4de1b37f0c_c.jpg new file mode 100644 index 00000000..e3fa5989 Binary files /dev/null and b/src/dataset/sunflower/36444816360_4de1b37f0c_c.jpg differ diff --git a/src/dataset/sunflower/36477856201_f76b044390_c.jpg b/src/dataset/sunflower/36477856201_f76b044390_c.jpg new file mode 100644 index 00000000..401962b1 Binary files /dev/null and b/src/dataset/sunflower/36477856201_f76b044390_c.jpg differ diff --git a/src/dataset/sunflower/36489223753_37ac462cdb_c.jpg b/src/dataset/sunflower/36489223753_37ac462cdb_c.jpg new file mode 100644 index 00000000..73215761 Binary files /dev/null and b/src/dataset/sunflower/36489223753_37ac462cdb_c.jpg differ diff --git a/src/dataset/sunflower/36524316142_93f1f03047_c.jpg b/src/dataset/sunflower/36524316142_93f1f03047_c.jpg new file mode 100644 index 00000000..5697f4e1 Binary files /dev/null and b/src/dataset/sunflower/36524316142_93f1f03047_c.jpg differ diff --git a/src/dataset/sunflower/3655236791_bf23ccb3aa_c.jpg b/src/dataset/sunflower/3655236791_bf23ccb3aa_c.jpg new file mode 100644 index 00000000..888e17b6 Binary files /dev/null and b/src/dataset/sunflower/3655236791_bf23ccb3aa_c.jpg differ diff --git a/src/dataset/sunflower/36578050065_61049551f9_c.jpg b/src/dataset/sunflower/36578050065_61049551f9_c.jpg new file mode 100644 index 00000000..7a749aca Binary files /dev/null and b/src/dataset/sunflower/36578050065_61049551f9_c.jpg differ diff --git a/src/dataset/sunflower/36652093973_85c52c786b_c.jpg b/src/dataset/sunflower/36652093973_85c52c786b_c.jpg new file mode 100644 index 00000000..0a8540ae Binary files /dev/null and b/src/dataset/sunflower/36652093973_85c52c786b_c.jpg differ diff --git a/src/dataset/sunflower/36656591262_25ec5b05d0_c.jpg b/src/dataset/sunflower/36656591262_25ec5b05d0_c.jpg new file mode 100644 index 00000000..07b494b9 Binary files /dev/null and b/src/dataset/sunflower/36656591262_25ec5b05d0_c.jpg differ diff --git a/src/dataset/sunflower/36660417252_773c992b04_c.jpg b/src/dataset/sunflower/36660417252_773c992b04_c.jpg new file mode 100644 index 00000000..14a341f1 Binary files /dev/null and b/src/dataset/sunflower/36660417252_773c992b04_c.jpg differ diff --git a/src/dataset/sunflower/36664053135_ee488e42e9_c.jpg b/src/dataset/sunflower/36664053135_ee488e42e9_c.jpg new file mode 100644 index 00000000..e5ea47ff Binary files /dev/null and b/src/dataset/sunflower/36664053135_ee488e42e9_c.jpg differ diff --git a/src/dataset/sunflower/36676484091_51d2be9484_c.jpg b/src/dataset/sunflower/36676484091_51d2be9484_c.jpg new file mode 100644 index 00000000..3d40ef99 Binary files /dev/null and b/src/dataset/sunflower/36676484091_51d2be9484_c.jpg differ diff --git a/src/dataset/sunflower/36686383384_71245da30b_c.jpg b/src/dataset/sunflower/36686383384_71245da30b_c.jpg new file mode 100644 index 00000000..62af9f3f Binary files /dev/null and b/src/dataset/sunflower/36686383384_71245da30b_c.jpg differ diff --git a/src/dataset/sunflower/36688517772_845083f854_c.jpg b/src/dataset/sunflower/36688517772_845083f854_c.jpg new file mode 100644 index 00000000..fe79c8c6 Binary files /dev/null and b/src/dataset/sunflower/36688517772_845083f854_c.jpg differ diff --git a/src/dataset/sunflower/36721437322_e2bc8f6020_c.jpg b/src/dataset/sunflower/36721437322_e2bc8f6020_c.jpg new file mode 100644 index 00000000..2700c0ba Binary files /dev/null and b/src/dataset/sunflower/36721437322_e2bc8f6020_c.jpg differ diff --git a/src/dataset/sunflower/36727652801_f687c819f8_c.jpg b/src/dataset/sunflower/36727652801_f687c819f8_c.jpg new file mode 100644 index 00000000..47aa1461 Binary files /dev/null and b/src/dataset/sunflower/36727652801_f687c819f8_c.jpg differ diff --git a/src/dataset/sunflower/3674331390_acb434b133_c.jpg b/src/dataset/sunflower/3674331390_acb434b133_c.jpg new file mode 100644 index 00000000..50e18567 Binary files /dev/null and b/src/dataset/sunflower/3674331390_acb434b133_c.jpg differ diff --git a/src/dataset/sunflower/36827812195_cd8086f86c_c.jpg b/src/dataset/sunflower/36827812195_cd8086f86c_c.jpg new file mode 100644 index 00000000..8c47eef9 Binary files /dev/null and b/src/dataset/sunflower/36827812195_cd8086f86c_c.jpg differ diff --git a/src/dataset/sunflower/3683063088_46e535fa1f_c.jpg b/src/dataset/sunflower/3683063088_46e535fa1f_c.jpg new file mode 100644 index 00000000..24e8451c Binary files /dev/null and b/src/dataset/sunflower/3683063088_46e535fa1f_c.jpg differ diff --git a/src/dataset/sunflower/368360467_9e66c6186e_c.jpg b/src/dataset/sunflower/368360467_9e66c6186e_c.jpg new file mode 100644 index 00000000..14d8e6e9 Binary files /dev/null and b/src/dataset/sunflower/368360467_9e66c6186e_c.jpg differ diff --git a/src/dataset/sunflower/36836841035_7e02ee0873_c.jpg b/src/dataset/sunflower/36836841035_7e02ee0873_c.jpg new file mode 100644 index 00000000..a6d63a73 Binary files /dev/null and b/src/dataset/sunflower/36836841035_7e02ee0873_c.jpg differ diff --git a/src/dataset/sunflower/36850731_f8db64e8cb_c.jpg b/src/dataset/sunflower/36850731_f8db64e8cb_c.jpg new file mode 100644 index 00000000..1d0bffbf Binary files /dev/null and b/src/dataset/sunflower/36850731_f8db64e8cb_c.jpg differ diff --git a/src/dataset/sunflower/36872668446_a623bfb12a_c.jpg b/src/dataset/sunflower/36872668446_a623bfb12a_c.jpg new file mode 100644 index 00000000..5dbee708 Binary files /dev/null and b/src/dataset/sunflower/36872668446_a623bfb12a_c.jpg differ diff --git a/src/dataset/sunflower/36881487400_a814fd99af_c.jpg b/src/dataset/sunflower/36881487400_a814fd99af_c.jpg new file mode 100644 index 00000000..00035080 Binary files /dev/null and b/src/dataset/sunflower/36881487400_a814fd99af_c.jpg differ diff --git a/src/dataset/sunflower/3689656582_25cf9670ce_c.jpg b/src/dataset/sunflower/3689656582_25cf9670ce_c.jpg new file mode 100644 index 00000000..07bc3e27 Binary files /dev/null and b/src/dataset/sunflower/3689656582_25cf9670ce_c.jpg differ diff --git a/src/dataset/sunflower/369121439_d967318dc2_c.jpg b/src/dataset/sunflower/369121439_d967318dc2_c.jpg new file mode 100644 index 00000000..14d8e6e9 Binary files /dev/null and b/src/dataset/sunflower/369121439_d967318dc2_c.jpg differ diff --git a/src/dataset/sunflower/36922312556_641f7ee599_c.jpg b/src/dataset/sunflower/36922312556_641f7ee599_c.jpg new file mode 100644 index 00000000..9c4eed0f Binary files /dev/null and b/src/dataset/sunflower/36922312556_641f7ee599_c.jpg differ diff --git a/src/dataset/sunflower/36923250165_5fce616b97_c.jpg b/src/dataset/sunflower/36923250165_5fce616b97_c.jpg new file mode 100644 index 00000000..087cdbdb Binary files /dev/null and b/src/dataset/sunflower/36923250165_5fce616b97_c.jpg differ diff --git a/src/dataset/sunflower/36939398351_38f63d1a19_c.jpg b/src/dataset/sunflower/36939398351_38f63d1a19_c.jpg new file mode 100644 index 00000000..626b97dd Binary files /dev/null and b/src/dataset/sunflower/36939398351_38f63d1a19_c.jpg differ diff --git a/src/dataset/sunflower/36944339_a69eb0f097_c.jpg b/src/dataset/sunflower/36944339_a69eb0f097_c.jpg new file mode 100644 index 00000000..0c2d956f Binary files /dev/null and b/src/dataset/sunflower/36944339_a69eb0f097_c.jpg differ diff --git a/src/dataset/sunflower/36972913120_48d8608094_c.jpg b/src/dataset/sunflower/36972913120_48d8608094_c.jpg new file mode 100644 index 00000000..fb760d16 Binary files /dev/null and b/src/dataset/sunflower/36972913120_48d8608094_c.jpg differ diff --git a/src/dataset/sunflower/3703104799_e6000ae5c7_c.jpg b/src/dataset/sunflower/3703104799_e6000ae5c7_c.jpg new file mode 100644 index 00000000..d5b1f7ac Binary files /dev/null and b/src/dataset/sunflower/3703104799_e6000ae5c7_c.jpg differ diff --git a/src/dataset/sunflower/3703447864_ec860f4ebd_c.jpg b/src/dataset/sunflower/3703447864_ec860f4ebd_c.jpg new file mode 100644 index 00000000..d24c9ec8 Binary files /dev/null and b/src/dataset/sunflower/3703447864_ec860f4ebd_c.jpg differ diff --git a/src/dataset/sunflower/3703447896_672399cbd5_c.jpg b/src/dataset/sunflower/3703447896_672399cbd5_c.jpg new file mode 100644 index 00000000..a266d124 Binary files /dev/null and b/src/dataset/sunflower/3703447896_672399cbd5_c.jpg differ diff --git a/src/dataset/sunflower/3703911122_dfa98c35e7_c.jpg b/src/dataset/sunflower/3703911122_dfa98c35e7_c.jpg new file mode 100644 index 00000000..ed1fba78 Binary files /dev/null and b/src/dataset/sunflower/3703911122_dfa98c35e7_c.jpg differ diff --git a/src/dataset/sunflower/37061450176_cf754cc527_c.jpg b/src/dataset/sunflower/37061450176_cf754cc527_c.jpg new file mode 100644 index 00000000..8975e29d Binary files /dev/null and b/src/dataset/sunflower/37061450176_cf754cc527_c.jpg differ diff --git a/src/dataset/sunflower/37108863471_a265dd804b_c.jpg b/src/dataset/sunflower/37108863471_a265dd804b_c.jpg new file mode 100644 index 00000000..429bb6be Binary files /dev/null and b/src/dataset/sunflower/37108863471_a265dd804b_c.jpg differ diff --git a/src/dataset/sunflower/3712122433_867776583f_c.jpg b/src/dataset/sunflower/3712122433_867776583f_c.jpg new file mode 100644 index 00000000..55cc2398 Binary files /dev/null and b/src/dataset/sunflower/3712122433_867776583f_c.jpg differ diff --git a/src/dataset/sunflower/3712512460_2e49d469a7_c.jpg b/src/dataset/sunflower/3712512460_2e49d469a7_c.jpg new file mode 100644 index 00000000..35c01a24 Binary files /dev/null and b/src/dataset/sunflower/3712512460_2e49d469a7_c.jpg differ diff --git a/src/dataset/sunflower/37131824466_b3ec4d428c_c.jpg b/src/dataset/sunflower/37131824466_b3ec4d428c_c.jpg new file mode 100644 index 00000000..17d465d1 Binary files /dev/null and b/src/dataset/sunflower/37131824466_b3ec4d428c_c.jpg differ diff --git a/src/dataset/sunflower/37163695645_4414843eb6_c.jpg b/src/dataset/sunflower/37163695645_4414843eb6_c.jpg new file mode 100644 index 00000000..44f5b252 Binary files /dev/null and b/src/dataset/sunflower/37163695645_4414843eb6_c.jpg differ diff --git a/src/dataset/sunflower/37177134862_cb0eeec1d3_c.jpg b/src/dataset/sunflower/37177134862_cb0eeec1d3_c.jpg new file mode 100644 index 00000000..d8e43778 Binary files /dev/null and b/src/dataset/sunflower/37177134862_cb0eeec1d3_c.jpg differ diff --git a/src/dataset/sunflower/3718234597_709e74c127_c.jpg b/src/dataset/sunflower/3718234597_709e74c127_c.jpg new file mode 100644 index 00000000..23fd547d Binary files /dev/null and b/src/dataset/sunflower/3718234597_709e74c127_c.jpg differ diff --git a/src/dataset/sunflower/37200234284_83e301514d_c.jpg b/src/dataset/sunflower/37200234284_83e301514d_c.jpg new file mode 100644 index 00000000..bac339a5 Binary files /dev/null and b/src/dataset/sunflower/37200234284_83e301514d_c.jpg differ diff --git a/src/dataset/sunflower/3724172809_51d4fc505d_c.jpg b/src/dataset/sunflower/3724172809_51d4fc505d_c.jpg new file mode 100644 index 00000000..aa6d1e13 Binary files /dev/null and b/src/dataset/sunflower/3724172809_51d4fc505d_c.jpg differ diff --git a/src/dataset/sunflower/3726064870_f4e3728754_c.jpg b/src/dataset/sunflower/3726064870_f4e3728754_c.jpg new file mode 100644 index 00000000..6f5e196f Binary files /dev/null and b/src/dataset/sunflower/3726064870_f4e3728754_c.jpg differ diff --git a/src/dataset/sunflower/3728666724_56b5410700_c.jpg b/src/dataset/sunflower/3728666724_56b5410700_c.jpg new file mode 100644 index 00000000..0881737b Binary files /dev/null and b/src/dataset/sunflower/3728666724_56b5410700_c.jpg differ diff --git a/src/dataset/sunflower/3731698724_916645ecbb_c.jpg b/src/dataset/sunflower/3731698724_916645ecbb_c.jpg new file mode 100644 index 00000000..3a76daf5 Binary files /dev/null and b/src/dataset/sunflower/3731698724_916645ecbb_c.jpg differ diff --git a/src/dataset/sunflower/37322410115_45c3379c9d_c.jpg b/src/dataset/sunflower/37322410115_45c3379c9d_c.jpg new file mode 100644 index 00000000..c4d255d3 Binary files /dev/null and b/src/dataset/sunflower/37322410115_45c3379c9d_c.jpg differ diff --git a/src/dataset/sunflower/3732842765_a405d0d63b_c.jpg b/src/dataset/sunflower/3732842765_a405d0d63b_c.jpg new file mode 100644 index 00000000..ff128fa6 Binary files /dev/null and b/src/dataset/sunflower/3732842765_a405d0d63b_c.jpg differ diff --git a/src/dataset/sunflower/3732843433_92b5e22381_c.jpg b/src/dataset/sunflower/3732843433_92b5e22381_c.jpg new file mode 100644 index 00000000..b0681c21 Binary files /dev/null and b/src/dataset/sunflower/3732843433_92b5e22381_c.jpg differ diff --git a/src/dataset/sunflower/3737918629_a909065d34_c.jpg b/src/dataset/sunflower/3737918629_a909065d34_c.jpg new file mode 100644 index 00000000..96131523 Binary files /dev/null and b/src/dataset/sunflower/3737918629_a909065d34_c.jpg differ diff --git a/src/dataset/sunflower/3747702223_c899abb07e_c.jpg b/src/dataset/sunflower/3747702223_c899abb07e_c.jpg new file mode 100644 index 00000000..f886a756 Binary files /dev/null and b/src/dataset/sunflower/3747702223_c899abb07e_c.jpg differ diff --git a/src/dataset/sunflower/3748432133_45d9a1468b_c.jpg b/src/dataset/sunflower/3748432133_45d9a1468b_c.jpg new file mode 100644 index 00000000..2548ec50 Binary files /dev/null and b/src/dataset/sunflower/3748432133_45d9a1468b_c.jpg differ diff --git a/src/dataset/sunflower/3752282087_9c9dcb0ff7_c.jpg b/src/dataset/sunflower/3752282087_9c9dcb0ff7_c.jpg new file mode 100644 index 00000000..dee56141 Binary files /dev/null and b/src/dataset/sunflower/3752282087_9c9dcb0ff7_c.jpg differ diff --git a/src/dataset/sunflower/3765090198_e648df4f3f_c.jpg b/src/dataset/sunflower/3765090198_e648df4f3f_c.jpg new file mode 100644 index 00000000..a6fe1a36 Binary files /dev/null and b/src/dataset/sunflower/3765090198_e648df4f3f_c.jpg differ diff --git a/src/dataset/sunflower/3765091218_beabf7fdbe_c.jpg b/src/dataset/sunflower/3765091218_beabf7fdbe_c.jpg new file mode 100644 index 00000000..cad4d098 Binary files /dev/null and b/src/dataset/sunflower/3765091218_beabf7fdbe_c.jpg differ diff --git a/src/dataset/sunflower/3771077168_9d85c76bb6_c.jpg b/src/dataset/sunflower/3771077168_9d85c76bb6_c.jpg new file mode 100644 index 00000000..55d4d8c4 Binary files /dev/null and b/src/dataset/sunflower/3771077168_9d85c76bb6_c.jpg differ diff --git a/src/dataset/sunflower/3771350463_a3e96281fa_c.jpg b/src/dataset/sunflower/3771350463_a3e96281fa_c.jpg new file mode 100644 index 00000000..249c52cc Binary files /dev/null and b/src/dataset/sunflower/3771350463_a3e96281fa_c.jpg differ diff --git a/src/dataset/sunflower/3779833278_de4aebebcb_c.jpg b/src/dataset/sunflower/3779833278_de4aebebcb_c.jpg new file mode 100644 index 00000000..1b96ef19 Binary files /dev/null and b/src/dataset/sunflower/3779833278_de4aebebcb_c.jpg differ diff --git a/src/dataset/sunflower/3781143618_056619d42b_c.jpg b/src/dataset/sunflower/3781143618_056619d42b_c.jpg new file mode 100644 index 00000000..ebc5b598 Binary files /dev/null and b/src/dataset/sunflower/3781143618_056619d42b_c.jpg differ diff --git a/src/dataset/sunflower/378352490_3bfdc53949_c.jpg b/src/dataset/sunflower/378352490_3bfdc53949_c.jpg new file mode 100644 index 00000000..69072591 Binary files /dev/null and b/src/dataset/sunflower/378352490_3bfdc53949_c.jpg differ diff --git a/src/dataset/sunflower/37843205385_36ffde1a26_c.jpg b/src/dataset/sunflower/37843205385_36ffde1a26_c.jpg new file mode 100644 index 00000000..b9233125 Binary files /dev/null and b/src/dataset/sunflower/37843205385_36ffde1a26_c.jpg differ diff --git a/src/dataset/sunflower/3786456851_46cc2ab1d7_c.jpg b/src/dataset/sunflower/3786456851_46cc2ab1d7_c.jpg new file mode 100644 index 00000000..194e6cfd Binary files /dev/null and b/src/dataset/sunflower/3786456851_46cc2ab1d7_c.jpg differ diff --git a/src/dataset/sunflower/3786464463_11529f0a82_c.jpg b/src/dataset/sunflower/3786464463_11529f0a82_c.jpg new file mode 100644 index 00000000..deb198bc Binary files /dev/null and b/src/dataset/sunflower/3786464463_11529f0a82_c.jpg differ diff --git a/src/dataset/sunflower/3787885972_b735900bfe_c.jpg b/src/dataset/sunflower/3787885972_b735900bfe_c.jpg new file mode 100644 index 00000000..e6439847 Binary files /dev/null and b/src/dataset/sunflower/3787885972_b735900bfe_c.jpg differ diff --git a/src/dataset/sunflower/3798882257_637dc96e1e_c.jpg b/src/dataset/sunflower/3798882257_637dc96e1e_c.jpg new file mode 100644 index 00000000..84a8afb9 Binary files /dev/null and b/src/dataset/sunflower/3798882257_637dc96e1e_c.jpg differ diff --git a/src/dataset/sunflower/3799438180_dd1ffb535c_c.jpg b/src/dataset/sunflower/3799438180_dd1ffb535c_c.jpg new file mode 100644 index 00000000..22e20e4a Binary files /dev/null and b/src/dataset/sunflower/3799438180_dd1ffb535c_c.jpg differ diff --git a/src/dataset/sunflower/3800228735_386304784d_c.jpg b/src/dataset/sunflower/3800228735_386304784d_c.jpg new file mode 100644 index 00000000..c88c0c3f Binary files /dev/null and b/src/dataset/sunflower/3800228735_386304784d_c.jpg differ diff --git a/src/dataset/sunflower/38013640784_60a8f8181d_c.jpg b/src/dataset/sunflower/38013640784_60a8f8181d_c.jpg new file mode 100644 index 00000000..bdc58f8d Binary files /dev/null and b/src/dataset/sunflower/38013640784_60a8f8181d_c.jpg differ diff --git a/src/dataset/sunflower/3803645814_16710304d1_c.jpg b/src/dataset/sunflower/3803645814_16710304d1_c.jpg new file mode 100644 index 00000000..2ffe028d Binary files /dev/null and b/src/dataset/sunflower/3803645814_16710304d1_c.jpg differ diff --git a/src/dataset/sunflower/3804128805_c1292931c9_c.jpg b/src/dataset/sunflower/3804128805_c1292931c9_c.jpg new file mode 100644 index 00000000..ac0ed3d2 Binary files /dev/null and b/src/dataset/sunflower/3804128805_c1292931c9_c.jpg differ diff --git a/src/dataset/sunflower/3805155293_440aa252ac_c.jpg b/src/dataset/sunflower/3805155293_440aa252ac_c.jpg new file mode 100644 index 00000000..6e77f1b1 Binary files /dev/null and b/src/dataset/sunflower/3805155293_440aa252ac_c.jpg differ diff --git a/src/dataset/sunflower/3805743281_33f44f83e4_c.jpg b/src/dataset/sunflower/3805743281_33f44f83e4_c.jpg new file mode 100644 index 00000000..ecc14d00 Binary files /dev/null and b/src/dataset/sunflower/3805743281_33f44f83e4_c.jpg differ diff --git a/src/dataset/sunflower/3808058124_39323757b7_c.jpg b/src/dataset/sunflower/3808058124_39323757b7_c.jpg new file mode 100644 index 00000000..b7b2f830 Binary files /dev/null and b/src/dataset/sunflower/3808058124_39323757b7_c.jpg differ diff --git a/src/dataset/sunflower/3808738829_4c6488f88b_c.jpg b/src/dataset/sunflower/3808738829_4c6488f88b_c.jpg new file mode 100644 index 00000000..9a1b1ca1 Binary files /dev/null and b/src/dataset/sunflower/3808738829_4c6488f88b_c.jpg differ diff --git a/src/dataset/sunflower/38090657_6ecd54ea5a_c.jpg b/src/dataset/sunflower/38090657_6ecd54ea5a_c.jpg new file mode 100644 index 00000000..6e7252c2 Binary files /dev/null and b/src/dataset/sunflower/38090657_6ecd54ea5a_c.jpg differ diff --git a/src/dataset/sunflower/38189750235_5a6548956b_c.jpg b/src/dataset/sunflower/38189750235_5a6548956b_c.jpg new file mode 100644 index 00000000..9bc347a6 Binary files /dev/null and b/src/dataset/sunflower/38189750235_5a6548956b_c.jpg differ diff --git a/src/dataset/sunflower/3819973057_0663551360_c.jpg b/src/dataset/sunflower/3819973057_0663551360_c.jpg new file mode 100644 index 00000000..1710857c Binary files /dev/null and b/src/dataset/sunflower/3819973057_0663551360_c.jpg differ diff --git a/src/dataset/sunflower/3829474128_8fc8db9b95_c.jpg b/src/dataset/sunflower/3829474128_8fc8db9b95_c.jpg new file mode 100644 index 00000000..051724c2 Binary files /dev/null and b/src/dataset/sunflower/3829474128_8fc8db9b95_c.jpg differ diff --git a/src/dataset/sunflower/38325085_093ddd6b7b_c.jpg b/src/dataset/sunflower/38325085_093ddd6b7b_c.jpg new file mode 100644 index 00000000..54498936 Binary files /dev/null and b/src/dataset/sunflower/38325085_093ddd6b7b_c.jpg differ diff --git a/src/dataset/sunflower/3835383029_9823382239_c.jpg b/src/dataset/sunflower/3835383029_9823382239_c.jpg new file mode 100644 index 00000000..c215e5ec Binary files /dev/null and b/src/dataset/sunflower/3835383029_9823382239_c.jpg differ diff --git a/src/dataset/sunflower/38372813892_702c98e3f5_c.jpg b/src/dataset/sunflower/38372813892_702c98e3f5_c.jpg new file mode 100644 index 00000000..eb52f927 Binary files /dev/null and b/src/dataset/sunflower/38372813892_702c98e3f5_c.jpg differ diff --git a/src/dataset/sunflower/38372816862_516afd49b5_c.jpg b/src/dataset/sunflower/38372816862_516afd49b5_c.jpg new file mode 100644 index 00000000..2e6a2e6d Binary files /dev/null and b/src/dataset/sunflower/38372816862_516afd49b5_c.jpg differ diff --git a/src/dataset/sunflower/3837301947_0733dcdbb8_c.jpg b/src/dataset/sunflower/3837301947_0733dcdbb8_c.jpg new file mode 100644 index 00000000..b911fb28 Binary files /dev/null and b/src/dataset/sunflower/3837301947_0733dcdbb8_c.jpg differ diff --git a/src/dataset/sunflower/3838094626_5e1752f704_c.jpg b/src/dataset/sunflower/3838094626_5e1752f704_c.jpg new file mode 100644 index 00000000..9a46ad06 Binary files /dev/null and b/src/dataset/sunflower/3838094626_5e1752f704_c.jpg differ diff --git a/src/dataset/sunflower/3838097760_e3703d30e2_c.jpg b/src/dataset/sunflower/3838097760_e3703d30e2_c.jpg new file mode 100644 index 00000000..c47ae089 Binary files /dev/null and b/src/dataset/sunflower/3838097760_e3703d30e2_c.jpg differ diff --git a/src/dataset/sunflower/3839200683_08733e35a8_c.jpg b/src/dataset/sunflower/3839200683_08733e35a8_c.jpg new file mode 100644 index 00000000..671d7d58 Binary files /dev/null and b/src/dataset/sunflower/3839200683_08733e35a8_c.jpg differ diff --git a/src/dataset/sunflower/3842933025_63531575be_c.jpg b/src/dataset/sunflower/3842933025_63531575be_c.jpg new file mode 100644 index 00000000..47d127df Binary files /dev/null and b/src/dataset/sunflower/3842933025_63531575be_c.jpg differ diff --git a/src/dataset/sunflower/3846920637_2955585479_c.jpg b/src/dataset/sunflower/3846920637_2955585479_c.jpg new file mode 100644 index 00000000..4e73df0a Binary files /dev/null and b/src/dataset/sunflower/3846920637_2955585479_c.jpg differ diff --git a/src/dataset/sunflower/3850051407_a1454e96b0_c.jpg b/src/dataset/sunflower/3850051407_a1454e96b0_c.jpg new file mode 100644 index 00000000..6d2d728a Binary files /dev/null and b/src/dataset/sunflower/3850051407_a1454e96b0_c.jpg differ diff --git a/src/dataset/sunflower/3850281418_9b1c382d12_c.jpg b/src/dataset/sunflower/3850281418_9b1c382d12_c.jpg new file mode 100644 index 00000000..c4eddab0 Binary files /dev/null and b/src/dataset/sunflower/3850281418_9b1c382d12_c.jpg differ diff --git a/src/dataset/sunflower/38509942925_d05fc7ab46_c.jpg b/src/dataset/sunflower/38509942925_d05fc7ab46_c.jpg new file mode 100644 index 00000000..a669c0b9 Binary files /dev/null and b/src/dataset/sunflower/38509942925_d05fc7ab46_c.jpg differ diff --git a/src/dataset/sunflower/3854826793_0c397f7c4c_c.jpg b/src/dataset/sunflower/3854826793_0c397f7c4c_c.jpg new file mode 100644 index 00000000..29ff201a Binary files /dev/null and b/src/dataset/sunflower/3854826793_0c397f7c4c_c.jpg differ diff --git a/src/dataset/sunflower/3857661440_6755f7bf63_c.jpg b/src/dataset/sunflower/3857661440_6755f7bf63_c.jpg new file mode 100644 index 00000000..46e5f2b5 Binary files /dev/null and b/src/dataset/sunflower/3857661440_6755f7bf63_c.jpg differ diff --git a/src/dataset/sunflower/38730871131_f704e2e38e_c.jpg b/src/dataset/sunflower/38730871131_f704e2e38e_c.jpg new file mode 100644 index 00000000..c206768d Binary files /dev/null and b/src/dataset/sunflower/38730871131_f704e2e38e_c.jpg differ diff --git a/src/dataset/sunflower/38730884671_672a8bf2f3_c.jpg b/src/dataset/sunflower/38730884671_672a8bf2f3_c.jpg new file mode 100644 index 00000000..73755a5f Binary files /dev/null and b/src/dataset/sunflower/38730884671_672a8bf2f3_c.jpg differ diff --git a/src/dataset/sunflower/3877282691_94617fa0fa_c.jpg b/src/dataset/sunflower/3877282691_94617fa0fa_c.jpg new file mode 100644 index 00000000..b43db1f6 Binary files /dev/null and b/src/dataset/sunflower/3877282691_94617fa0fa_c.jpg differ diff --git a/src/dataset/sunflower/3878076106_f24bcd573c_c.jpg b/src/dataset/sunflower/3878076106_f24bcd573c_c.jpg new file mode 100644 index 00000000..b4b9bb9e Binary files /dev/null and b/src/dataset/sunflower/3878076106_f24bcd573c_c.jpg differ diff --git a/src/dataset/sunflower/38835212470_54c408eea5_c.jpg b/src/dataset/sunflower/38835212470_54c408eea5_c.jpg new file mode 100644 index 00000000..44071cf8 Binary files /dev/null and b/src/dataset/sunflower/38835212470_54c408eea5_c.jpg differ diff --git a/src/dataset/sunflower/3886963964_89cdc5817a_c.jpg b/src/dataset/sunflower/3886963964_89cdc5817a_c.jpg new file mode 100644 index 00000000..10512c94 Binary files /dev/null and b/src/dataset/sunflower/3886963964_89cdc5817a_c.jpg differ diff --git a/src/dataset/sunflower/38922087465_d307c1e426_c.jpg b/src/dataset/sunflower/38922087465_d307c1e426_c.jpg new file mode 100644 index 00000000..6f5ec25e Binary files /dev/null and b/src/dataset/sunflower/38922087465_d307c1e426_c.jpg differ diff --git a/src/dataset/sunflower/3905958813_7c739339ed_c.jpg b/src/dataset/sunflower/3905958813_7c739339ed_c.jpg new file mode 100644 index 00000000..13516cf3 Binary files /dev/null and b/src/dataset/sunflower/3905958813_7c739339ed_c.jpg differ diff --git a/src/dataset/sunflower/3907110919_17b6cafc60_c.jpg b/src/dataset/sunflower/3907110919_17b6cafc60_c.jpg new file mode 100644 index 00000000..223b4b63 Binary files /dev/null and b/src/dataset/sunflower/3907110919_17b6cafc60_c.jpg differ diff --git a/src/dataset/sunflower/3909322522_bfd667f4c1_c.jpg b/src/dataset/sunflower/3909322522_bfd667f4c1_c.jpg new file mode 100644 index 00000000..d297d941 Binary files /dev/null and b/src/dataset/sunflower/3909322522_bfd667f4c1_c.jpg differ diff --git a/src/dataset/sunflower/3917680966_c3ded73742_c.jpg b/src/dataset/sunflower/3917680966_c3ded73742_c.jpg new file mode 100644 index 00000000..47247a78 Binary files /dev/null and b/src/dataset/sunflower/3917680966_c3ded73742_c.jpg differ diff --git a/src/dataset/sunflower/3921077521_915b7181d3_c.jpg b/src/dataset/sunflower/3921077521_915b7181d3_c.jpg new file mode 100644 index 00000000..9cd4fb47 Binary files /dev/null and b/src/dataset/sunflower/3921077521_915b7181d3_c.jpg differ diff --git a/src/dataset/sunflower/3923994944_a8cf99489e_c.jpg b/src/dataset/sunflower/3923994944_a8cf99489e_c.jpg new file mode 100644 index 00000000..7d44a879 Binary files /dev/null and b/src/dataset/sunflower/3923994944_a8cf99489e_c.jpg differ diff --git a/src/dataset/sunflower/3923999852_8afffcf1f2_c.jpg b/src/dataset/sunflower/3923999852_8afffcf1f2_c.jpg new file mode 100644 index 00000000..6e3410bb Binary files /dev/null and b/src/dataset/sunflower/3923999852_8afffcf1f2_c.jpg differ diff --git a/src/dataset/sunflower/3932507237_9ca988705d_c.jpg b/src/dataset/sunflower/3932507237_9ca988705d_c.jpg new file mode 100644 index 00000000..8c5bc52b Binary files /dev/null and b/src/dataset/sunflower/3932507237_9ca988705d_c.jpg differ diff --git a/src/dataset/sunflower/3955033359_9ba00c1918_c.jpg b/src/dataset/sunflower/3955033359_9ba00c1918_c.jpg new file mode 100644 index 00000000..b5550a2e Binary files /dev/null and b/src/dataset/sunflower/3955033359_9ba00c1918_c.jpg differ diff --git a/src/dataset/sunflower/3955260539_eee0766763_c.jpg b/src/dataset/sunflower/3955260539_eee0766763_c.jpg new file mode 100644 index 00000000..4dd94e94 Binary files /dev/null and b/src/dataset/sunflower/3955260539_eee0766763_c.jpg differ diff --git a/src/dataset/sunflower/3955548444_634d032236_c.jpg b/src/dataset/sunflower/3955548444_634d032236_c.jpg new file mode 100644 index 00000000..ed68b4c3 Binary files /dev/null and b/src/dataset/sunflower/3955548444_634d032236_c.jpg differ diff --git a/src/dataset/sunflower/3955909901_2c91ea0a06_c.jpg b/src/dataset/sunflower/3955909901_2c91ea0a06_c.jpg new file mode 100644 index 00000000..8f895d87 Binary files /dev/null and b/src/dataset/sunflower/3955909901_2c91ea0a06_c.jpg differ diff --git a/src/dataset/sunflower/395619823_aa1fe6989e_c.jpg b/src/dataset/sunflower/395619823_aa1fe6989e_c.jpg new file mode 100644 index 00000000..04fb02a5 Binary files /dev/null and b/src/dataset/sunflower/395619823_aa1fe6989e_c.jpg differ diff --git a/src/dataset/sunflower/395619830_d51544c95c_c.jpg b/src/dataset/sunflower/395619830_d51544c95c_c.jpg new file mode 100644 index 00000000..cf36e7fb Binary files /dev/null and b/src/dataset/sunflower/395619830_d51544c95c_c.jpg differ diff --git a/src/dataset/sunflower/395619833_f4ea3c8145_c.jpg b/src/dataset/sunflower/395619833_f4ea3c8145_c.jpg new file mode 100644 index 00000000..8f42f1dd Binary files /dev/null and b/src/dataset/sunflower/395619833_f4ea3c8145_c.jpg differ diff --git a/src/dataset/sunflower/3956685826_c6e632f7d6_c.jpg b/src/dataset/sunflower/3956685826_c6e632f7d6_c.jpg new file mode 100644 index 00000000..860e042e Binary files /dev/null and b/src/dataset/sunflower/3956685826_c6e632f7d6_c.jpg differ diff --git a/src/dataset/sunflower/396100536_dfc519e503_c.jpg b/src/dataset/sunflower/396100536_dfc519e503_c.jpg new file mode 100644 index 00000000..5206ad58 Binary files /dev/null and b/src/dataset/sunflower/396100536_dfc519e503_c.jpg differ diff --git a/src/dataset/sunflower/3962603007_fb96465295_c.jpg b/src/dataset/sunflower/3962603007_fb96465295_c.jpg new file mode 100644 index 00000000..74afa0c4 Binary files /dev/null and b/src/dataset/sunflower/3962603007_fb96465295_c.jpg differ diff --git a/src/dataset/sunflower/3977215302_46a1a958d7_c.jpg b/src/dataset/sunflower/3977215302_46a1a958d7_c.jpg new file mode 100644 index 00000000..7be7ee10 Binary files /dev/null and b/src/dataset/sunflower/3977215302_46a1a958d7_c.jpg differ diff --git a/src/dataset/sunflower/3991310484_ac8bb8f97d_c.jpg b/src/dataset/sunflower/3991310484_ac8bb8f97d_c.jpg new file mode 100644 index 00000000..6b545793 Binary files /dev/null and b/src/dataset/sunflower/3991310484_ac8bb8f97d_c.jpg differ diff --git a/src/dataset/sunflower/3995947000_4c521337d9_c.jpg b/src/dataset/sunflower/3995947000_4c521337d9_c.jpg new file mode 100644 index 00000000..b8f38af4 Binary files /dev/null and b/src/dataset/sunflower/3995947000_4c521337d9_c.jpg differ diff --git a/src/dataset/sunflower/40019255361_e7d4ae5288_c.jpg b/src/dataset/sunflower/40019255361_e7d4ae5288_c.jpg new file mode 100644 index 00000000..ae15a5eb Binary files /dev/null and b/src/dataset/sunflower/40019255361_e7d4ae5288_c.jpg differ diff --git a/src/dataset/sunflower/4011943287_16cbc215ce_c.jpg b/src/dataset/sunflower/4011943287_16cbc215ce_c.jpg new file mode 100644 index 00000000..a1fe3edf Binary files /dev/null and b/src/dataset/sunflower/4011943287_16cbc215ce_c.jpg differ diff --git a/src/dataset/sunflower/401465739_3d91bee458_c.jpg b/src/dataset/sunflower/401465739_3d91bee458_c.jpg new file mode 100644 index 00000000..52cf4925 Binary files /dev/null and b/src/dataset/sunflower/401465739_3d91bee458_c.jpg differ diff --git a/src/dataset/sunflower/40174988761_3cfa6fb3a0_c.jpg b/src/dataset/sunflower/40174988761_3cfa6fb3a0_c.jpg new file mode 100644 index 00000000..9e2b643e Binary files /dev/null and b/src/dataset/sunflower/40174988761_3cfa6fb3a0_c.jpg differ diff --git a/src/dataset/sunflower/4024829134_37209a3c88_c.jpg b/src/dataset/sunflower/4024829134_37209a3c88_c.jpg new file mode 100644 index 00000000..04bae30b Binary files /dev/null and b/src/dataset/sunflower/4024829134_37209a3c88_c.jpg differ diff --git a/src/dataset/sunflower/40645280701_7747ed9846_c.jpg b/src/dataset/sunflower/40645280701_7747ed9846_c.jpg new file mode 100644 index 00000000..913fec34 Binary files /dev/null and b/src/dataset/sunflower/40645280701_7747ed9846_c.jpg differ diff --git a/src/dataset/sunflower/40739971752_a50118b8cf_c.jpg b/src/dataset/sunflower/40739971752_a50118b8cf_c.jpg new file mode 100644 index 00000000..0d9b9209 Binary files /dev/null and b/src/dataset/sunflower/40739971752_a50118b8cf_c.jpg differ diff --git a/src/dataset/sunflower/40745133974_4b0f3dc29d_c.jpg b/src/dataset/sunflower/40745133974_4b0f3dc29d_c.jpg new file mode 100644 index 00000000..04c96076 Binary files /dev/null and b/src/dataset/sunflower/40745133974_4b0f3dc29d_c.jpg differ diff --git a/src/dataset/sunflower/40964877651_e22e3651a9_c.jpg b/src/dataset/sunflower/40964877651_e22e3651a9_c.jpg new file mode 100644 index 00000000..db5a1699 Binary files /dev/null and b/src/dataset/sunflower/40964877651_e22e3651a9_c.jpg differ diff --git a/src/dataset/sunflower/41206214271_e5a4e1fe25_c.jpg b/src/dataset/sunflower/41206214271_e5a4e1fe25_c.jpg new file mode 100644 index 00000000..92567053 Binary files /dev/null and b/src/dataset/sunflower/41206214271_e5a4e1fe25_c.jpg differ diff --git a/src/dataset/sunflower/41453746460_c55c4eb633_c.jpg b/src/dataset/sunflower/41453746460_c55c4eb633_c.jpg new file mode 100644 index 00000000..d1c29a42 Binary files /dev/null and b/src/dataset/sunflower/41453746460_c55c4eb633_c.jpg differ diff --git a/src/dataset/sunflower/4150915224_a5a43eec61_c.jpg b/src/dataset/sunflower/4150915224_a5a43eec61_c.jpg new file mode 100644 index 00000000..19cb19e7 Binary files /dev/null and b/src/dataset/sunflower/4150915224_a5a43eec61_c.jpg differ diff --git a/src/dataset/sunflower/41588018980_a1c34cb58d_c.jpg b/src/dataset/sunflower/41588018980_a1c34cb58d_c.jpg new file mode 100644 index 00000000..2a2e8294 Binary files /dev/null and b/src/dataset/sunflower/41588018980_a1c34cb58d_c.jpg differ diff --git a/src/dataset/sunflower/41617541_8bdb22da17_c.jpg b/src/dataset/sunflower/41617541_8bdb22da17_c.jpg new file mode 100644 index 00000000..b8a32a2a Binary files /dev/null and b/src/dataset/sunflower/41617541_8bdb22da17_c.jpg differ diff --git a/src/dataset/sunflower/4179949144_a3fdb40f4d_c.jpg b/src/dataset/sunflower/4179949144_a3fdb40f4d_c.jpg new file mode 100644 index 00000000..30f51937 Binary files /dev/null and b/src/dataset/sunflower/4179949144_a3fdb40f4d_c.jpg differ diff --git a/src/dataset/sunflower/41903987204_445ef999d9_c.jpg b/src/dataset/sunflower/41903987204_445ef999d9_c.jpg new file mode 100644 index 00000000..00cc8b0d Binary files /dev/null and b/src/dataset/sunflower/41903987204_445ef999d9_c.jpg differ diff --git a/src/dataset/sunflower/41976679850_523192212a_c.jpg b/src/dataset/sunflower/41976679850_523192212a_c.jpg new file mode 100644 index 00000000..c7e918d9 Binary files /dev/null and b/src/dataset/sunflower/41976679850_523192212a_c.jpg differ diff --git a/src/dataset/sunflower/4202404804_ed4ded6357_c.jpg b/src/dataset/sunflower/4202404804_ed4ded6357_c.jpg new file mode 100644 index 00000000..d1ddacd7 Binary files /dev/null and b/src/dataset/sunflower/4202404804_ed4ded6357_c.jpg differ diff --git a/src/dataset/sunflower/42029142164_6b6d5471da_c.jpg b/src/dataset/sunflower/42029142164_6b6d5471da_c.jpg new file mode 100644 index 00000000..199a3b49 Binary files /dev/null and b/src/dataset/sunflower/42029142164_6b6d5471da_c.jpg differ diff --git a/src/dataset/sunflower/42085226270_e54e91204a_c.jpg b/src/dataset/sunflower/42085226270_e54e91204a_c.jpg new file mode 100644 index 00000000..1484546d Binary files /dev/null and b/src/dataset/sunflower/42085226270_e54e91204a_c.jpg differ diff --git a/src/dataset/sunflower/42093884535_4852253afa_c.jpg b/src/dataset/sunflower/42093884535_4852253afa_c.jpg new file mode 100644 index 00000000..4b237507 Binary files /dev/null and b/src/dataset/sunflower/42093884535_4852253afa_c.jpg differ diff --git a/src/dataset/sunflower/42098183140_ab8a807909_c.jpg b/src/dataset/sunflower/42098183140_ab8a807909_c.jpg new file mode 100644 index 00000000..77882820 Binary files /dev/null and b/src/dataset/sunflower/42098183140_ab8a807909_c.jpg differ diff --git a/src/dataset/sunflower/42148954985_a9b53537a5_c.jpg b/src/dataset/sunflower/42148954985_a9b53537a5_c.jpg new file mode 100644 index 00000000..561f1a9c Binary files /dev/null and b/src/dataset/sunflower/42148954985_a9b53537a5_c.jpg differ diff --git a/src/dataset/sunflower/42186824130_9083eb30e6_c.jpg b/src/dataset/sunflower/42186824130_9083eb30e6_c.jpg new file mode 100644 index 00000000..cf0291b5 Binary files /dev/null and b/src/dataset/sunflower/42186824130_9083eb30e6_c.jpg differ diff --git a/src/dataset/sunflower/42186826820_803acd8203_c.jpg b/src/dataset/sunflower/42186826820_803acd8203_c.jpg new file mode 100644 index 00000000..b30129dd Binary files /dev/null and b/src/dataset/sunflower/42186826820_803acd8203_c.jpg differ diff --git a/src/dataset/sunflower/4220923793_c050289251_c.jpg b/src/dataset/sunflower/4220923793_c050289251_c.jpg new file mode 100644 index 00000000..b45bf196 Binary files /dev/null and b/src/dataset/sunflower/4220923793_c050289251_c.jpg differ diff --git a/src/dataset/sunflower/42351551475_b28ba92f15_c.jpg b/src/dataset/sunflower/42351551475_b28ba92f15_c.jpg new file mode 100644 index 00000000..c9d681e7 Binary files /dev/null and b/src/dataset/sunflower/42351551475_b28ba92f15_c.jpg differ diff --git a/src/dataset/sunflower/42523300225_939c082fd4_c.jpg b/src/dataset/sunflower/42523300225_939c082fd4_c.jpg new file mode 100644 index 00000000..211ca5bb Binary files /dev/null and b/src/dataset/sunflower/42523300225_939c082fd4_c.jpg differ diff --git a/src/dataset/sunflower/42523304334_eebc191047_c.jpg b/src/dataset/sunflower/42523304334_eebc191047_c.jpg new file mode 100644 index 00000000..8e9f192f Binary files /dev/null and b/src/dataset/sunflower/42523304334_eebc191047_c.jpg differ diff --git a/src/dataset/sunflower/42563860274_797e1d6a89_c.jpg b/src/dataset/sunflower/42563860274_797e1d6a89_c.jpg new file mode 100644 index 00000000..3678f925 Binary files /dev/null and b/src/dataset/sunflower/42563860274_797e1d6a89_c.jpg differ diff --git a/src/dataset/sunflower/42570239275_bd2f5b488b_c.jpg b/src/dataset/sunflower/42570239275_bd2f5b488b_c.jpg new file mode 100644 index 00000000..6d353034 Binary files /dev/null and b/src/dataset/sunflower/42570239275_bd2f5b488b_c.jpg differ diff --git a/src/dataset/sunflower/42588651114_b5bf227f96_c.jpg b/src/dataset/sunflower/42588651114_b5bf227f96_c.jpg new file mode 100644 index 00000000..b394e0b8 Binary files /dev/null and b/src/dataset/sunflower/42588651114_b5bf227f96_c.jpg differ diff --git a/src/dataset/sunflower/42677099230_d433833a13_c.jpg b/src/dataset/sunflower/42677099230_d433833a13_c.jpg new file mode 100644 index 00000000..bfd4cfa3 Binary files /dev/null and b/src/dataset/sunflower/42677099230_d433833a13_c.jpg differ diff --git a/src/dataset/sunflower/42697881482_4bf576e77d_c.jpg b/src/dataset/sunflower/42697881482_4bf576e77d_c.jpg new file mode 100644 index 00000000..912935a7 Binary files /dev/null and b/src/dataset/sunflower/42697881482_4bf576e77d_c.jpg differ diff --git a/src/dataset/sunflower/42728043481_3eb34fc540_c.jpg b/src/dataset/sunflower/42728043481_3eb34fc540_c.jpg new file mode 100644 index 00000000..63e60162 Binary files /dev/null and b/src/dataset/sunflower/42728043481_3eb34fc540_c.jpg differ diff --git a/src/dataset/sunflower/42760225370_9358d7cf0e_c.jpg b/src/dataset/sunflower/42760225370_9358d7cf0e_c.jpg new file mode 100644 index 00000000..e131d5b2 Binary files /dev/null and b/src/dataset/sunflower/42760225370_9358d7cf0e_c.jpg differ diff --git a/src/dataset/sunflower/42823482832_d344aef034_c.jpg b/src/dataset/sunflower/42823482832_d344aef034_c.jpg new file mode 100644 index 00000000..d994838a Binary files /dev/null and b/src/dataset/sunflower/42823482832_d344aef034_c.jpg differ diff --git a/src/dataset/sunflower/42983723204_c2e61133cb_c.jpg b/src/dataset/sunflower/42983723204_c2e61133cb_c.jpg new file mode 100644 index 00000000..44bf6418 Binary files /dev/null and b/src/dataset/sunflower/42983723204_c2e61133cb_c.jpg differ diff --git a/src/dataset/sunflower/42998902284_71644de658_c.jpg b/src/dataset/sunflower/42998902284_71644de658_c.jpg new file mode 100644 index 00000000..883d9584 Binary files /dev/null and b/src/dataset/sunflower/42998902284_71644de658_c.jpg differ diff --git a/src/dataset/sunflower/42999453555_7297099941_c.jpg b/src/dataset/sunflower/42999453555_7297099941_c.jpg new file mode 100644 index 00000000..c5da05db Binary files /dev/null and b/src/dataset/sunflower/42999453555_7297099941_c.jpg differ diff --git a/src/dataset/sunflower/43007506994_3cdfa45323_c.jpg b/src/dataset/sunflower/43007506994_3cdfa45323_c.jpg new file mode 100644 index 00000000..87e13738 Binary files /dev/null and b/src/dataset/sunflower/43007506994_3cdfa45323_c.jpg differ diff --git a/src/dataset/sunflower/43038998605_b9282c7f30_c.jpg b/src/dataset/sunflower/43038998605_b9282c7f30_c.jpg new file mode 100644 index 00000000..cb927af7 Binary files /dev/null and b/src/dataset/sunflower/43038998605_b9282c7f30_c.jpg differ diff --git a/src/dataset/sunflower/43046377365_7b118c4009_c.jpg b/src/dataset/sunflower/43046377365_7b118c4009_c.jpg new file mode 100644 index 00000000..efd8041a Binary files /dev/null and b/src/dataset/sunflower/43046377365_7b118c4009_c.jpg differ diff --git a/src/dataset/sunflower/43049884550_e9e93cf583_c.jpg b/src/dataset/sunflower/43049884550_e9e93cf583_c.jpg new file mode 100644 index 00000000..e9d4c70f Binary files /dev/null and b/src/dataset/sunflower/43049884550_e9e93cf583_c.jpg differ diff --git a/src/dataset/sunflower/43071229730_67f73bdb7f_c.jpg b/src/dataset/sunflower/43071229730_67f73bdb7f_c.jpg new file mode 100644 index 00000000..3a0deadf Binary files /dev/null and b/src/dataset/sunflower/43071229730_67f73bdb7f_c.jpg differ diff --git a/src/dataset/sunflower/43078908595_4a70d43eaf_c.jpg b/src/dataset/sunflower/43078908595_4a70d43eaf_c.jpg new file mode 100644 index 00000000..100f8ca6 Binary files /dev/null and b/src/dataset/sunflower/43078908595_4a70d43eaf_c.jpg differ diff --git a/src/dataset/sunflower/43090308735_e6c9fb2f26_c.jpg b/src/dataset/sunflower/43090308735_e6c9fb2f26_c.jpg new file mode 100644 index 00000000..73448204 Binary files /dev/null and b/src/dataset/sunflower/43090308735_e6c9fb2f26_c.jpg differ diff --git a/src/dataset/sunflower/43164408202_c62394bd16_c.jpg b/src/dataset/sunflower/43164408202_c62394bd16_c.jpg new file mode 100644 index 00000000..47bf713c Binary files /dev/null and b/src/dataset/sunflower/43164408202_c62394bd16_c.jpg differ diff --git a/src/dataset/sunflower/43249031941_094a3eb394_c.jpg b/src/dataset/sunflower/43249031941_094a3eb394_c.jpg new file mode 100644 index 00000000..efb9dbce Binary files /dev/null and b/src/dataset/sunflower/43249031941_094a3eb394_c.jpg differ diff --git a/src/dataset/sunflower/43255146205_88e5151b85_c.jpg b/src/dataset/sunflower/43255146205_88e5151b85_c.jpg new file mode 100644 index 00000000..7e506d8b Binary files /dev/null and b/src/dataset/sunflower/43255146205_88e5151b85_c.jpg differ diff --git a/src/dataset/sunflower/43277054434_11cdab7835_c.jpg b/src/dataset/sunflower/43277054434_11cdab7835_c.jpg new file mode 100644 index 00000000..7975550d Binary files /dev/null and b/src/dataset/sunflower/43277054434_11cdab7835_c.jpg differ diff --git a/src/dataset/sunflower/43277064584_46fe1b75a0_c.jpg b/src/dataset/sunflower/43277064584_46fe1b75a0_c.jpg new file mode 100644 index 00000000..9c39279f Binary files /dev/null and b/src/dataset/sunflower/43277064584_46fe1b75a0_c.jpg differ diff --git a/src/dataset/sunflower/43280373770_2a77fd7117_c.jpg b/src/dataset/sunflower/43280373770_2a77fd7117_c.jpg new file mode 100644 index 00000000..c146e2da Binary files /dev/null and b/src/dataset/sunflower/43280373770_2a77fd7117_c.jpg differ diff --git a/src/dataset/sunflower/43282560424_725f26130b_c.jpg b/src/dataset/sunflower/43282560424_725f26130b_c.jpg new file mode 100644 index 00000000..7e2f4ee1 Binary files /dev/null and b/src/dataset/sunflower/43282560424_725f26130b_c.jpg differ diff --git a/src/dataset/sunflower/43372398622_19d34e8d0c_c.jpg b/src/dataset/sunflower/43372398622_19d34e8d0c_c.jpg new file mode 100644 index 00000000..723dfc50 Binary files /dev/null and b/src/dataset/sunflower/43372398622_19d34e8d0c_c.jpg differ diff --git a/src/dataset/sunflower/43380126705_71e00872fa_c.jpg b/src/dataset/sunflower/43380126705_71e00872fa_c.jpg new file mode 100644 index 00000000..635ee376 Binary files /dev/null and b/src/dataset/sunflower/43380126705_71e00872fa_c.jpg differ diff --git a/src/dataset/sunflower/4339629169_1fb6b07697_c.jpg b/src/dataset/sunflower/4339629169_1fb6b07697_c.jpg new file mode 100644 index 00000000..537125eb Binary files /dev/null and b/src/dataset/sunflower/4339629169_1fb6b07697_c.jpg differ diff --git a/src/dataset/sunflower/43397750_756e08b417_c.jpg b/src/dataset/sunflower/43397750_756e08b417_c.jpg new file mode 100644 index 00000000..81c0d011 Binary files /dev/null and b/src/dataset/sunflower/43397750_756e08b417_c.jpg differ diff --git a/src/dataset/sunflower/43408830481_6fe1c1e9fa_c.jpg b/src/dataset/sunflower/43408830481_6fe1c1e9fa_c.jpg new file mode 100644 index 00000000..eda481c7 Binary files /dev/null and b/src/dataset/sunflower/43408830481_6fe1c1e9fa_c.jpg differ diff --git a/src/dataset/sunflower/4340993218_9631378f07_c.jpg b/src/dataset/sunflower/4340993218_9631378f07_c.jpg new file mode 100644 index 00000000..cf9490e6 Binary files /dev/null and b/src/dataset/sunflower/4340993218_9631378f07_c.jpg differ diff --git a/src/dataset/sunflower/43555884064_fd9a50eb65_c.jpg b/src/dataset/sunflower/43555884064_fd9a50eb65_c.jpg new file mode 100644 index 00000000..bef05b08 Binary files /dev/null and b/src/dataset/sunflower/43555884064_fd9a50eb65_c.jpg differ diff --git a/src/dataset/sunflower/43579304771_171605a947_c.jpg b/src/dataset/sunflower/43579304771_171605a947_c.jpg new file mode 100644 index 00000000..7903f62a Binary files /dev/null and b/src/dataset/sunflower/43579304771_171605a947_c.jpg differ diff --git a/src/dataset/sunflower/43613775650_1275b2cf04_c.jpg b/src/dataset/sunflower/43613775650_1275b2cf04_c.jpg new file mode 100644 index 00000000..81d77f39 Binary files /dev/null and b/src/dataset/sunflower/43613775650_1275b2cf04_c.jpg differ diff --git a/src/dataset/sunflower/43665953444_2e1e8d79ff_c.jpg b/src/dataset/sunflower/43665953444_2e1e8d79ff_c.jpg new file mode 100644 index 00000000..a7f77875 Binary files /dev/null and b/src/dataset/sunflower/43665953444_2e1e8d79ff_c.jpg differ diff --git a/src/dataset/sunflower/43710393841_71918e031e_c.jpg b/src/dataset/sunflower/43710393841_71918e031e_c.jpg new file mode 100644 index 00000000..73866a7d Binary files /dev/null and b/src/dataset/sunflower/43710393841_71918e031e_c.jpg differ diff --git a/src/dataset/sunflower/43741706160_4b75963667_c.jpg b/src/dataset/sunflower/43741706160_4b75963667_c.jpg new file mode 100644 index 00000000..c6d85217 Binary files /dev/null and b/src/dataset/sunflower/43741706160_4b75963667_c.jpg differ diff --git a/src/dataset/sunflower/43799764772_ba26d31dca_c.jpg b/src/dataset/sunflower/43799764772_ba26d31dca_c.jpg new file mode 100644 index 00000000..2f54d001 Binary files /dev/null and b/src/dataset/sunflower/43799764772_ba26d31dca_c.jpg differ diff --git a/src/dataset/sunflower/43828068982_dabd320012_c.jpg b/src/dataset/sunflower/43828068982_dabd320012_c.jpg new file mode 100644 index 00000000..ec2b6095 Binary files /dev/null and b/src/dataset/sunflower/43828068982_dabd320012_c.jpg differ diff --git a/src/dataset/sunflower/43848342235_0bd192d358_c.jpg b/src/dataset/sunflower/43848342235_0bd192d358_c.jpg new file mode 100644 index 00000000..ebc613c7 Binary files /dev/null and b/src/dataset/sunflower/43848342235_0bd192d358_c.jpg differ diff --git a/src/dataset/sunflower/43872893685_7d8db819d9_c.jpg b/src/dataset/sunflower/43872893685_7d8db819d9_c.jpg new file mode 100644 index 00000000..e23c8bbb Binary files /dev/null and b/src/dataset/sunflower/43872893685_7d8db819d9_c.jpg differ diff --git a/src/dataset/sunflower/44056701354_bfeff8593a_c.jpg b/src/dataset/sunflower/44056701354_bfeff8593a_c.jpg new file mode 100644 index 00000000..72f27846 Binary files /dev/null and b/src/dataset/sunflower/44056701354_bfeff8593a_c.jpg differ diff --git a/src/dataset/sunflower/44084259542_6184054ff3_c.jpg b/src/dataset/sunflower/44084259542_6184054ff3_c.jpg new file mode 100644 index 00000000..3e992787 Binary files /dev/null and b/src/dataset/sunflower/44084259542_6184054ff3_c.jpg differ diff --git a/src/dataset/sunflower/44099440152_aa9963e0dd_c.jpg b/src/dataset/sunflower/44099440152_aa9963e0dd_c.jpg new file mode 100644 index 00000000..0c7f24f9 Binary files /dev/null and b/src/dataset/sunflower/44099440152_aa9963e0dd_c.jpg differ diff --git a/src/dataset/sunflower/4419012463_1bf3f81dd7_c.jpg b/src/dataset/sunflower/4419012463_1bf3f81dd7_c.jpg new file mode 100644 index 00000000..c07c5fb0 Binary files /dev/null and b/src/dataset/sunflower/4419012463_1bf3f81dd7_c.jpg differ diff --git a/src/dataset/sunflower/4437763140_5430e62d51_c.jpg b/src/dataset/sunflower/4437763140_5430e62d51_c.jpg new file mode 100644 index 00000000..acbef336 Binary files /dev/null and b/src/dataset/sunflower/4437763140_5430e62d51_c.jpg differ diff --git a/src/dataset/sunflower/44418375252_28481c002a_c.jpg b/src/dataset/sunflower/44418375252_28481c002a_c.jpg new file mode 100644 index 00000000..26811ac3 Binary files /dev/null and b/src/dataset/sunflower/44418375252_28481c002a_c.jpg differ diff --git a/src/dataset/sunflower/44464254211_dde5b8b124_c.jpg b/src/dataset/sunflower/44464254211_dde5b8b124_c.jpg new file mode 100644 index 00000000..b1b0b509 Binary files /dev/null and b/src/dataset/sunflower/44464254211_dde5b8b124_c.jpg differ diff --git a/src/dataset/sunflower/44854699212_494f57fa2e_c.jpg b/src/dataset/sunflower/44854699212_494f57fa2e_c.jpg new file mode 100644 index 00000000..d58327c8 Binary files /dev/null and b/src/dataset/sunflower/44854699212_494f57fa2e_c.jpg differ diff --git a/src/dataset/sunflower/44965025282_4d29d0279d_c.jpg b/src/dataset/sunflower/44965025282_4d29d0279d_c.jpg new file mode 100644 index 00000000..446dba18 Binary files /dev/null and b/src/dataset/sunflower/44965025282_4d29d0279d_c.jpg differ diff --git a/src/dataset/sunflower/45088241884_27dfbe8bbf_c.jpg b/src/dataset/sunflower/45088241884_27dfbe8bbf_c.jpg new file mode 100644 index 00000000..86e02955 Binary files /dev/null and b/src/dataset/sunflower/45088241884_27dfbe8bbf_c.jpg differ diff --git a/src/dataset/sunflower/45203405961_4d327bc459_c.jpg b/src/dataset/sunflower/45203405961_4d327bc459_c.jpg new file mode 100644 index 00000000..331d65be Binary files /dev/null and b/src/dataset/sunflower/45203405961_4d327bc459_c.jpg differ diff --git a/src/dataset/sunflower/4521619493_356ebdebd4_c.jpg b/src/dataset/sunflower/4521619493_356ebdebd4_c.jpg new file mode 100644 index 00000000..a1c2f472 Binary files /dev/null and b/src/dataset/sunflower/4521619493_356ebdebd4_c.jpg differ diff --git a/src/dataset/sunflower/4530185104_9184abf9ff_c.jpg b/src/dataset/sunflower/4530185104_9184abf9ff_c.jpg new file mode 100644 index 00000000..2eaef36e Binary files /dev/null and b/src/dataset/sunflower/4530185104_9184abf9ff_c.jpg differ diff --git a/src/dataset/sunflower/454269080_3c0a1510ac_c.jpg b/src/dataset/sunflower/454269080_3c0a1510ac_c.jpg new file mode 100644 index 00000000..31e91787 Binary files /dev/null and b/src/dataset/sunflower/454269080_3c0a1510ac_c.jpg differ diff --git a/src/dataset/sunflower/4543673150_1192ee5a7b_c.jpg b/src/dataset/sunflower/4543673150_1192ee5a7b_c.jpg new file mode 100644 index 00000000..28e3c25e Binary files /dev/null and b/src/dataset/sunflower/4543673150_1192ee5a7b_c.jpg differ diff --git a/src/dataset/sunflower/4543673154_b870f5044a_c.jpg b/src/dataset/sunflower/4543673154_b870f5044a_c.jpg new file mode 100644 index 00000000..30a386f5 Binary files /dev/null and b/src/dataset/sunflower/4543673154_b870f5044a_c.jpg differ diff --git a/src/dataset/sunflower/4550491922_32836d783b_c.jpg b/src/dataset/sunflower/4550491922_32836d783b_c.jpg new file mode 100644 index 00000000..0e5c7660 Binary files /dev/null and b/src/dataset/sunflower/4550491922_32836d783b_c.jpg differ diff --git a/src/dataset/sunflower/45629331822_4dbb84bff0_c.jpg b/src/dataset/sunflower/45629331822_4dbb84bff0_c.jpg new file mode 100644 index 00000000..d0448d37 Binary files /dev/null and b/src/dataset/sunflower/45629331822_4dbb84bff0_c.jpg differ diff --git a/src/dataset/sunflower/4566079059_cb1d6aedfc_c.jpg b/src/dataset/sunflower/4566079059_cb1d6aedfc_c.jpg new file mode 100644 index 00000000..c9c16e7e Binary files /dev/null and b/src/dataset/sunflower/4566079059_cb1d6aedfc_c.jpg differ diff --git a/src/dataset/sunflower/45925599532_fdb1a46979_c.jpg b/src/dataset/sunflower/45925599532_fdb1a46979_c.jpg new file mode 100644 index 00000000..a140c80a Binary files /dev/null and b/src/dataset/sunflower/45925599532_fdb1a46979_c.jpg differ diff --git a/src/dataset/sunflower/4617932566_be4f972263_c.jpg b/src/dataset/sunflower/4617932566_be4f972263_c.jpg new file mode 100644 index 00000000..0ca0060e Binary files /dev/null and b/src/dataset/sunflower/4617932566_be4f972263_c.jpg differ diff --git a/src/dataset/sunflower/4627688932_594fcd2571_c.jpg b/src/dataset/sunflower/4627688932_594fcd2571_c.jpg new file mode 100644 index 00000000..fbc6d077 Binary files /dev/null and b/src/dataset/sunflower/4627688932_594fcd2571_c.jpg differ diff --git a/src/dataset/sunflower/46295264632_ec5a4ab7f9_c.jpg b/src/dataset/sunflower/46295264632_ec5a4ab7f9_c.jpg new file mode 100644 index 00000000..98eddb30 Binary files /dev/null and b/src/dataset/sunflower/46295264632_ec5a4ab7f9_c.jpg differ diff --git a/src/dataset/sunflower/46345756611_6c03a394ec_c.jpg b/src/dataset/sunflower/46345756611_6c03a394ec_c.jpg new file mode 100644 index 00000000..5c0b22b0 Binary files /dev/null and b/src/dataset/sunflower/46345756611_6c03a394ec_c.jpg differ diff --git a/src/dataset/sunflower/46345808391_dc7be635e1_c.jpg b/src/dataset/sunflower/46345808391_dc7be635e1_c.jpg new file mode 100644 index 00000000..93d9c851 Binary files /dev/null and b/src/dataset/sunflower/46345808391_dc7be635e1_c.jpg differ diff --git a/src/dataset/sunflower/4638147651_41895002c0_c.jpg b/src/dataset/sunflower/4638147651_41895002c0_c.jpg new file mode 100644 index 00000000..890442aa Binary files /dev/null and b/src/dataset/sunflower/4638147651_41895002c0_c.jpg differ diff --git a/src/dataset/sunflower/46397752225_2babf4721d_c.jpg b/src/dataset/sunflower/46397752225_2babf4721d_c.jpg new file mode 100644 index 00000000..073c552b Binary files /dev/null and b/src/dataset/sunflower/46397752225_2babf4721d_c.jpg differ diff --git a/src/dataset/sunflower/4641330797_324a2949e3_c.jpg b/src/dataset/sunflower/4641330797_324a2949e3_c.jpg new file mode 100644 index 00000000..eeb42a9a Binary files /dev/null and b/src/dataset/sunflower/4641330797_324a2949e3_c.jpg differ diff --git a/src/dataset/sunflower/4650552002_787275bb49_c.jpg b/src/dataset/sunflower/4650552002_787275bb49_c.jpg new file mode 100644 index 00000000..14c015d9 Binary files /dev/null and b/src/dataset/sunflower/4650552002_787275bb49_c.jpg differ diff --git a/src/dataset/sunflower/4650570270_56af9917c5_c.jpg b/src/dataset/sunflower/4650570270_56af9917c5_c.jpg new file mode 100644 index 00000000..ebf02c66 Binary files /dev/null and b/src/dataset/sunflower/4650570270_56af9917c5_c.jpg differ diff --git a/src/dataset/sunflower/46631191_3edf65194b_c.jpg b/src/dataset/sunflower/46631191_3edf65194b_c.jpg new file mode 100644 index 00000000..df99c7eb Binary files /dev/null and b/src/dataset/sunflower/46631191_3edf65194b_c.jpg differ diff --git a/src/dataset/sunflower/4705254320_bf30825dd7_c.jpg b/src/dataset/sunflower/4705254320_bf30825dd7_c.jpg new file mode 100644 index 00000000..cd7431da Binary files /dev/null and b/src/dataset/sunflower/4705254320_bf30825dd7_c.jpg differ diff --git a/src/dataset/sunflower/4710305360_088fffaf0e_c.jpg b/src/dataset/sunflower/4710305360_088fffaf0e_c.jpg new file mode 100644 index 00000000..824b7817 Binary files /dev/null and b/src/dataset/sunflower/4710305360_088fffaf0e_c.jpg differ diff --git a/src/dataset/sunflower/4710828579_d7a96695cc_c.jpg b/src/dataset/sunflower/4710828579_d7a96695cc_c.jpg new file mode 100644 index 00000000..c963f4fd Binary files /dev/null and b/src/dataset/sunflower/4710828579_d7a96695cc_c.jpg differ diff --git a/src/dataset/sunflower/4711469300_22e353bb2e_c.jpg b/src/dataset/sunflower/4711469300_22e353bb2e_c.jpg new file mode 100644 index 00000000..2a60ca01 Binary files /dev/null and b/src/dataset/sunflower/4711469300_22e353bb2e_c.jpg differ diff --git a/src/dataset/sunflower/4745239993_db6d80ae6a_c.jpg b/src/dataset/sunflower/4745239993_db6d80ae6a_c.jpg new file mode 100644 index 00000000..6ae79e36 Binary files /dev/null and b/src/dataset/sunflower/4745239993_db6d80ae6a_c.jpg differ diff --git a/src/dataset/sunflower/4745879490_0064c80464_c.jpg b/src/dataset/sunflower/4745879490_0064c80464_c.jpg new file mode 100644 index 00000000..26fd656a Binary files /dev/null and b/src/dataset/sunflower/4745879490_0064c80464_c.jpg differ diff --git a/src/dataset/sunflower/4754259657_6dd704be12_c.jpg b/src/dataset/sunflower/4754259657_6dd704be12_c.jpg new file mode 100644 index 00000000..ff083cde Binary files /dev/null and b/src/dataset/sunflower/4754259657_6dd704be12_c.jpg differ diff --git a/src/dataset/sunflower/4755861023_c353a16001_c.jpg b/src/dataset/sunflower/4755861023_c353a16001_c.jpg new file mode 100644 index 00000000..f87d4b2c Binary files /dev/null and b/src/dataset/sunflower/4755861023_c353a16001_c.jpg differ diff --git a/src/dataset/sunflower/4758241829_0f3f315318_c.jpg b/src/dataset/sunflower/4758241829_0f3f315318_c.jpg new file mode 100644 index 00000000..235a63eb Binary files /dev/null and b/src/dataset/sunflower/4758241829_0f3f315318_c.jpg differ diff --git a/src/dataset/sunflower/4758878300_8ee300240e_c.jpg b/src/dataset/sunflower/4758878300_8ee300240e_c.jpg new file mode 100644 index 00000000..ba0afd17 Binary files /dev/null and b/src/dataset/sunflower/4758878300_8ee300240e_c.jpg differ diff --git a/src/dataset/sunflower/4774330379_8897baa9b1_c.jpg b/src/dataset/sunflower/4774330379_8897baa9b1_c.jpg new file mode 100644 index 00000000..1a09c404 Binary files /dev/null and b/src/dataset/sunflower/4774330379_8897baa9b1_c.jpg differ diff --git a/src/dataset/sunflower/4775797092_c3b90e88d1_c.jpg b/src/dataset/sunflower/4775797092_c3b90e88d1_c.jpg new file mode 100644 index 00000000..63f0930c Binary files /dev/null and b/src/dataset/sunflower/4775797092_c3b90e88d1_c.jpg differ diff --git a/src/dataset/sunflower/4777992770_ef514a440e_c.jpg b/src/dataset/sunflower/4777992770_ef514a440e_c.jpg new file mode 100644 index 00000000..ca6d6391 Binary files /dev/null and b/src/dataset/sunflower/4777992770_ef514a440e_c.jpg differ diff --git a/src/dataset/sunflower/4778356407_ebb8e799f1_c.jpg b/src/dataset/sunflower/4778356407_ebb8e799f1_c.jpg new file mode 100644 index 00000000..4032cdf8 Binary files /dev/null and b/src/dataset/sunflower/4778356407_ebb8e799f1_c.jpg differ diff --git a/src/dataset/sunflower/4781601452_65d3be7b52_c.jpg b/src/dataset/sunflower/4781601452_65d3be7b52_c.jpg new file mode 100644 index 00000000..83b5f637 Binary files /dev/null and b/src/dataset/sunflower/4781601452_65d3be7b52_c.jpg differ diff --git a/src/dataset/sunflower/4797482397_096daa389b_c.jpg b/src/dataset/sunflower/4797482397_096daa389b_c.jpg new file mode 100644 index 00000000..81687fa1 Binary files /dev/null and b/src/dataset/sunflower/4797482397_096daa389b_c.jpg differ diff --git a/src/dataset/sunflower/4806267220_0aede537a7_c.jpg b/src/dataset/sunflower/4806267220_0aede537a7_c.jpg new file mode 100644 index 00000000..f5874676 Binary files /dev/null and b/src/dataset/sunflower/4806267220_0aede537a7_c.jpg differ diff --git a/src/dataset/sunflower/4809261783_45f7a88556_c.jpg b/src/dataset/sunflower/4809261783_45f7a88556_c.jpg new file mode 100644 index 00000000..eaaccb30 Binary files /dev/null and b/src/dataset/sunflower/4809261783_45f7a88556_c.jpg differ diff --git a/src/dataset/sunflower/4812141164_aa2d67bc00_c.jpg b/src/dataset/sunflower/4812141164_aa2d67bc00_c.jpg new file mode 100644 index 00000000..a10cd567 Binary files /dev/null and b/src/dataset/sunflower/4812141164_aa2d67bc00_c.jpg differ diff --git a/src/dataset/sunflower/4813320214_0b78efbc77_c.jpg b/src/dataset/sunflower/4813320214_0b78efbc77_c.jpg new file mode 100644 index 00000000..9f0c30d5 Binary files /dev/null and b/src/dataset/sunflower/4813320214_0b78efbc77_c.jpg differ diff --git a/src/dataset/sunflower/4816312770_17cab09c54_c.jpg b/src/dataset/sunflower/4816312770_17cab09c54_c.jpg new file mode 100644 index 00000000..cea6f579 Binary files /dev/null and b/src/dataset/sunflower/4816312770_17cab09c54_c.jpg differ diff --git a/src/dataset/sunflower/4817883685_1fe396b13a_c.jpg b/src/dataset/sunflower/4817883685_1fe396b13a_c.jpg new file mode 100644 index 00000000..f09ff0f1 Binary files /dev/null and b/src/dataset/sunflower/4817883685_1fe396b13a_c.jpg differ diff --git a/src/dataset/sunflower/4819090178_a39f0de105_c.jpg b/src/dataset/sunflower/4819090178_a39f0de105_c.jpg new file mode 100644 index 00000000..27bccfa5 Binary files /dev/null and b/src/dataset/sunflower/4819090178_a39f0de105_c.jpg differ diff --git a/src/dataset/sunflower/4822170962_2e8901aa60_c.jpg b/src/dataset/sunflower/4822170962_2e8901aa60_c.jpg new file mode 100644 index 00000000..281a9ad8 Binary files /dev/null and b/src/dataset/sunflower/4822170962_2e8901aa60_c.jpg differ diff --git a/src/dataset/sunflower/4827498255_164dec1514_c.jpg b/src/dataset/sunflower/4827498255_164dec1514_c.jpg new file mode 100644 index 00000000..73b95651 Binary files /dev/null and b/src/dataset/sunflower/4827498255_164dec1514_c.jpg differ diff --git a/src/dataset/sunflower/4829237974_a5dd1b36fc_c.jpg b/src/dataset/sunflower/4829237974_a5dd1b36fc_c.jpg new file mode 100644 index 00000000..3cad0bf6 Binary files /dev/null and b/src/dataset/sunflower/4829237974_a5dd1b36fc_c.jpg differ diff --git a/src/dataset/sunflower/4832335080_45d9b65ef0_c.jpg b/src/dataset/sunflower/4832335080_45d9b65ef0_c.jpg new file mode 100644 index 00000000..899a2393 Binary files /dev/null and b/src/dataset/sunflower/4832335080_45d9b65ef0_c.jpg differ diff --git a/src/dataset/sunflower/4832688133_78111dd9c7_c.jpg b/src/dataset/sunflower/4832688133_78111dd9c7_c.jpg new file mode 100644 index 00000000..fe16e8bd Binary files /dev/null and b/src/dataset/sunflower/4832688133_78111dd9c7_c.jpg differ diff --git a/src/dataset/sunflower/4855005896_077225bd10_c.jpg b/src/dataset/sunflower/4855005896_077225bd10_c.jpg new file mode 100644 index 00000000..1ae3f39a Binary files /dev/null and b/src/dataset/sunflower/4855005896_077225bd10_c.jpg differ diff --git a/src/dataset/sunflower/4859972908_4ceb3c2813_c.jpg b/src/dataset/sunflower/4859972908_4ceb3c2813_c.jpg new file mode 100644 index 00000000..698d7088 Binary files /dev/null and b/src/dataset/sunflower/4859972908_4ceb3c2813_c.jpg differ diff --git a/src/dataset/sunflower/4860249378_8df8d29c65_c.jpg b/src/dataset/sunflower/4860249378_8df8d29c65_c.jpg new file mode 100644 index 00000000..60303273 Binary files /dev/null and b/src/dataset/sunflower/4860249378_8df8d29c65_c.jpg differ diff --git a/src/dataset/sunflower/4861378484_34297dff22_c.jpg b/src/dataset/sunflower/4861378484_34297dff22_c.jpg new file mode 100644 index 00000000..d36fe2ce Binary files /dev/null and b/src/dataset/sunflower/4861378484_34297dff22_c.jpg differ diff --git a/src/dataset/sunflower/4864623927_a93b37bc9b_c.jpg b/src/dataset/sunflower/4864623927_a93b37bc9b_c.jpg new file mode 100644 index 00000000..89b7fa74 Binary files /dev/null and b/src/dataset/sunflower/4864623927_a93b37bc9b_c.jpg differ diff --git a/src/dataset/sunflower/4867374254_419575966d_c.jpg b/src/dataset/sunflower/4867374254_419575966d_c.jpg new file mode 100644 index 00000000..5db0d351 Binary files /dev/null and b/src/dataset/sunflower/4867374254_419575966d_c.jpg differ diff --git a/src/dataset/sunflower/4872393528_ce4cee7e06_c.jpg b/src/dataset/sunflower/4872393528_ce4cee7e06_c.jpg new file mode 100644 index 00000000..9399bf7e Binary files /dev/null and b/src/dataset/sunflower/4872393528_ce4cee7e06_c.jpg differ diff --git a/src/dataset/sunflower/4878380701_dba2139388_c.jpg b/src/dataset/sunflower/4878380701_dba2139388_c.jpg new file mode 100644 index 00000000..91672335 Binary files /dev/null and b/src/dataset/sunflower/4878380701_dba2139388_c.jpg differ diff --git a/src/dataset/sunflower/4879803917_9973ddb9d8_c.jpg b/src/dataset/sunflower/4879803917_9973ddb9d8_c.jpg new file mode 100644 index 00000000..2dac283f Binary files /dev/null and b/src/dataset/sunflower/4879803917_9973ddb9d8_c.jpg differ diff --git a/src/dataset/sunflower/4880027883_d7811d1f81_c.jpg b/src/dataset/sunflower/4880027883_d7811d1f81_c.jpg new file mode 100644 index 00000000..b9188c20 Binary files /dev/null and b/src/dataset/sunflower/4880027883_d7811d1f81_c.jpg differ diff --git a/src/dataset/sunflower/4880769220_8bf5302bfb_c.jpg b/src/dataset/sunflower/4880769220_8bf5302bfb_c.jpg new file mode 100644 index 00000000..888bc087 Binary files /dev/null and b/src/dataset/sunflower/4880769220_8bf5302bfb_c.jpg differ diff --git a/src/dataset/sunflower/4902137584_7976afc793_c.jpg b/src/dataset/sunflower/4902137584_7976afc793_c.jpg new file mode 100644 index 00000000..c7d5ea45 Binary files /dev/null and b/src/dataset/sunflower/4902137584_7976afc793_c.jpg differ diff --git a/src/dataset/sunflower/4902138676_d2f73fba6f_c.jpg b/src/dataset/sunflower/4902138676_d2f73fba6f_c.jpg new file mode 100644 index 00000000..17a00c74 Binary files /dev/null and b/src/dataset/sunflower/4902138676_d2f73fba6f_c.jpg differ diff --git a/src/dataset/sunflower/4907185113_16db013d4b_c.jpg b/src/dataset/sunflower/4907185113_16db013d4b_c.jpg new file mode 100644 index 00000000..4e46a87d Binary files /dev/null and b/src/dataset/sunflower/4907185113_16db013d4b_c.jpg differ diff --git a/src/dataset/sunflower/4917217294_7a2f7d214c_c.jpg b/src/dataset/sunflower/4917217294_7a2f7d214c_c.jpg new file mode 100644 index 00000000..8baa1bf8 Binary files /dev/null and b/src/dataset/sunflower/4917217294_7a2f7d214c_c.jpg differ diff --git a/src/dataset/sunflower/4920475115_a33ea7d032_c.jpg b/src/dataset/sunflower/4920475115_a33ea7d032_c.jpg new file mode 100644 index 00000000..f7eeef7a Binary files /dev/null and b/src/dataset/sunflower/4920475115_a33ea7d032_c.jpg differ diff --git a/src/dataset/sunflower/4921245383_ae529c8e04_c.jpg b/src/dataset/sunflower/4921245383_ae529c8e04_c.jpg new file mode 100644 index 00000000..00d704db Binary files /dev/null and b/src/dataset/sunflower/4921245383_ae529c8e04_c.jpg differ diff --git a/src/dataset/sunflower/4921394414_bd4d2cbc12_c.jpg b/src/dataset/sunflower/4921394414_bd4d2cbc12_c.jpg new file mode 100644 index 00000000..aa829f6d Binary files /dev/null and b/src/dataset/sunflower/4921394414_bd4d2cbc12_c.jpg differ diff --git a/src/dataset/sunflower/4926500946_938c5e4659_c.jpg b/src/dataset/sunflower/4926500946_938c5e4659_c.jpg new file mode 100644 index 00000000..709c3627 Binary files /dev/null and b/src/dataset/sunflower/4926500946_938c5e4659_c.jpg differ diff --git a/src/dataset/sunflower/4932578951_2ba6d512da_c.jpg b/src/dataset/sunflower/4932578951_2ba6d512da_c.jpg new file mode 100644 index 00000000..50b24932 Binary files /dev/null and b/src/dataset/sunflower/4932578951_2ba6d512da_c.jpg differ diff --git a/src/dataset/sunflower/4935274172_58d03e2fe3_c.jpg b/src/dataset/sunflower/4935274172_58d03e2fe3_c.jpg new file mode 100644 index 00000000..e4550ea9 Binary files /dev/null and b/src/dataset/sunflower/4935274172_58d03e2fe3_c.jpg differ diff --git a/src/dataset/sunflower/4955028100_4116f75769_c.jpg b/src/dataset/sunflower/4955028100_4116f75769_c.jpg new file mode 100644 index 00000000..35d0a2ba Binary files /dev/null and b/src/dataset/sunflower/4955028100_4116f75769_c.jpg differ diff --git a/src/dataset/sunflower/4961809142_2e5a601e5b_c.jpg b/src/dataset/sunflower/4961809142_2e5a601e5b_c.jpg new file mode 100644 index 00000000..bd730093 Binary files /dev/null and b/src/dataset/sunflower/4961809142_2e5a601e5b_c.jpg differ diff --git a/src/dataset/sunflower/4969893937_45ccf01199_c.jpg b/src/dataset/sunflower/4969893937_45ccf01199_c.jpg new file mode 100644 index 00000000..53b16a39 Binary files /dev/null and b/src/dataset/sunflower/4969893937_45ccf01199_c.jpg differ diff --git a/src/dataset/sunflower/4971423703_e12e363292_c.jpg b/src/dataset/sunflower/4971423703_e12e363292_c.jpg new file mode 100644 index 00000000..acbaaf5f Binary files /dev/null and b/src/dataset/sunflower/4971423703_e12e363292_c.jpg differ diff --git a/src/dataset/sunflower/4984325181_f2f5b7d796_c.jpg b/src/dataset/sunflower/4984325181_f2f5b7d796_c.jpg new file mode 100644 index 00000000..4e7d927c Binary files /dev/null and b/src/dataset/sunflower/4984325181_f2f5b7d796_c.jpg differ diff --git a/src/dataset/sunflower/4984325651_aaa09ce17e_c.jpg b/src/dataset/sunflower/4984325651_aaa09ce17e_c.jpg new file mode 100644 index 00000000..d80ba93e Binary files /dev/null and b/src/dataset/sunflower/4984325651_aaa09ce17e_c.jpg differ diff --git a/src/dataset/sunflower/4984326749_4b999326ba_c.jpg b/src/dataset/sunflower/4984326749_4b999326ba_c.jpg new file mode 100644 index 00000000..bd4bf508 Binary files /dev/null and b/src/dataset/sunflower/4984326749_4b999326ba_c.jpg differ diff --git a/src/dataset/sunflower/4984926208_6812dde6c1_c.jpg b/src/dataset/sunflower/4984926208_6812dde6c1_c.jpg new file mode 100644 index 00000000..ddd2a949 Binary files /dev/null and b/src/dataset/sunflower/4984926208_6812dde6c1_c.jpg differ diff --git a/src/dataset/sunflower/4984926942_216ae4a19b_c.jpg b/src/dataset/sunflower/4984926942_216ae4a19b_c.jpg new file mode 100644 index 00000000..38cf3298 Binary files /dev/null and b/src/dataset/sunflower/4984926942_216ae4a19b_c.jpg differ diff --git a/src/dataset/sunflower/5008448727_9ee4317530_c.jpg b/src/dataset/sunflower/5008448727_9ee4317530_c.jpg new file mode 100644 index 00000000..6f004345 Binary files /dev/null and b/src/dataset/sunflower/5008448727_9ee4317530_c.jpg differ diff --git a/src/dataset/sunflower/5016899924_54cea70318_c.jpg b/src/dataset/sunflower/5016899924_54cea70318_c.jpg new file mode 100644 index 00000000..b7351002 Binary files /dev/null and b/src/dataset/sunflower/5016899924_54cea70318_c.jpg differ diff --git a/src/dataset/sunflower/5026603283_1b136a96d5_c.jpg b/src/dataset/sunflower/5026603283_1b136a96d5_c.jpg new file mode 100644 index 00000000..bc4d814c Binary files /dev/null and b/src/dataset/sunflower/5026603283_1b136a96d5_c.jpg differ diff --git a/src/dataset/sunflower/5027214438_1eb63e2e32_c.jpg b/src/dataset/sunflower/5027214438_1eb63e2e32_c.jpg new file mode 100644 index 00000000..a030fbe6 Binary files /dev/null and b/src/dataset/sunflower/5027214438_1eb63e2e32_c.jpg differ diff --git a/src/dataset/sunflower/5027233286_a3753e9dc2_c.jpg b/src/dataset/sunflower/5027233286_a3753e9dc2_c.jpg new file mode 100644 index 00000000..180cf74e Binary files /dev/null and b/src/dataset/sunflower/5027233286_a3753e9dc2_c.jpg differ diff --git a/src/dataset/sunflower/5040574292_84cf13c2a7_c.jpg b/src/dataset/sunflower/5040574292_84cf13c2a7_c.jpg new file mode 100644 index 00000000..25bd214f Binary files /dev/null and b/src/dataset/sunflower/5040574292_84cf13c2a7_c.jpg differ diff --git a/src/dataset/sunflower/5055026656_ebf6955f10_c.jpg b/src/dataset/sunflower/5055026656_ebf6955f10_c.jpg new file mode 100644 index 00000000..66e76d28 Binary files /dev/null and b/src/dataset/sunflower/5055026656_ebf6955f10_c.jpg differ diff --git a/src/dataset/sunflower/5069144622_c9074de756_c.jpg b/src/dataset/sunflower/5069144622_c9074de756_c.jpg new file mode 100644 index 00000000..cde9fb1d Binary files /dev/null and b/src/dataset/sunflower/5069144622_c9074de756_c.jpg differ diff --git a/src/dataset/sunflower/5069292727_2b4a3c9306_c.jpg b/src/dataset/sunflower/5069292727_2b4a3c9306_c.jpg new file mode 100644 index 00000000..31474ba4 Binary files /dev/null and b/src/dataset/sunflower/5069292727_2b4a3c9306_c.jpg differ diff --git a/src/dataset/sunflower/50721596_a5a255da80_c.jpg b/src/dataset/sunflower/50721596_a5a255da80_c.jpg new file mode 100644 index 00000000..0b3b3128 Binary files /dev/null and b/src/dataset/sunflower/50721596_a5a255da80_c.jpg differ diff --git a/src/dataset/sunflower/5072559213_f020838516_c.jpg b/src/dataset/sunflower/5072559213_f020838516_c.jpg new file mode 100644 index 00000000..4e6a2ff0 Binary files /dev/null and b/src/dataset/sunflower/5072559213_f020838516_c.jpg differ diff --git a/src/dataset/sunflower/5076065268_dd03b35f33_c.jpg b/src/dataset/sunflower/5076065268_dd03b35f33_c.jpg new file mode 100644 index 00000000..60c65750 Binary files /dev/null and b/src/dataset/sunflower/5076065268_dd03b35f33_c.jpg differ diff --git a/src/dataset/sunflower/5080579747_9976903279_c.jpg b/src/dataset/sunflower/5080579747_9976903279_c.jpg new file mode 100644 index 00000000..2cd2d1d5 Binary files /dev/null and b/src/dataset/sunflower/5080579747_9976903279_c.jpg differ diff --git a/src/dataset/sunflower/5110070449_12f3fc677d_c.jpg b/src/dataset/sunflower/5110070449_12f3fc677d_c.jpg new file mode 100644 index 00000000..6f759f0f Binary files /dev/null and b/src/dataset/sunflower/5110070449_12f3fc677d_c.jpg differ diff --git a/src/dataset/sunflower/5115287579_44b6c81629_c.jpg b/src/dataset/sunflower/5115287579_44b6c81629_c.jpg new file mode 100644 index 00000000..7a0ba9b7 Binary files /dev/null and b/src/dataset/sunflower/5115287579_44b6c81629_c.jpg differ diff --git a/src/dataset/sunflower/5119325022_772b4f8519_c.jpg b/src/dataset/sunflower/5119325022_772b4f8519_c.jpg new file mode 100644 index 00000000..3aa47cb8 Binary files /dev/null and b/src/dataset/sunflower/5119325022_772b4f8519_c.jpg differ diff --git a/src/dataset/sunflower/513372570_1e5758e338_c.jpg b/src/dataset/sunflower/513372570_1e5758e338_c.jpg new file mode 100644 index 00000000..3389fcb6 Binary files /dev/null and b/src/dataset/sunflower/513372570_1e5758e338_c.jpg differ diff --git a/src/dataset/sunflower/5164288404_fe2430ab4d_c.jpg b/src/dataset/sunflower/5164288404_fe2430ab4d_c.jpg new file mode 100644 index 00000000..9accccbc Binary files /dev/null and b/src/dataset/sunflower/5164288404_fe2430ab4d_c.jpg differ diff --git a/src/dataset/sunflower/5200504875_63f7b40584_c.jpg b/src/dataset/sunflower/5200504875_63f7b40584_c.jpg new file mode 100644 index 00000000..cf53e80d Binary files /dev/null and b/src/dataset/sunflower/5200504875_63f7b40584_c.jpg differ diff --git a/src/dataset/sunflower/5230957988_c681bb1238_c.jpg b/src/dataset/sunflower/5230957988_c681bb1238_c.jpg new file mode 100644 index 00000000..7831d758 Binary files /dev/null and b/src/dataset/sunflower/5230957988_c681bb1238_c.jpg differ diff --git a/src/dataset/sunflower/5233876254_e8a3d0e07d_c.jpg b/src/dataset/sunflower/5233876254_e8a3d0e07d_c.jpg new file mode 100644 index 00000000..95cae9fe Binary files /dev/null and b/src/dataset/sunflower/5233876254_e8a3d0e07d_c.jpg differ diff --git a/src/dataset/sunflower/5241746807_1990fa9498_c.jpg b/src/dataset/sunflower/5241746807_1990fa9498_c.jpg new file mode 100644 index 00000000..62f1d5d0 Binary files /dev/null and b/src/dataset/sunflower/5241746807_1990fa9498_c.jpg differ diff --git a/src/dataset/sunflower/5243756976_163f96a542_c.jpg b/src/dataset/sunflower/5243756976_163f96a542_c.jpg new file mode 100644 index 00000000..2be67866 Binary files /dev/null and b/src/dataset/sunflower/5243756976_163f96a542_c.jpg differ diff --git a/src/dataset/sunflower/526541413_78af86a309_c.jpg b/src/dataset/sunflower/526541413_78af86a309_c.jpg new file mode 100644 index 00000000..4013b277 Binary files /dev/null and b/src/dataset/sunflower/526541413_78af86a309_c.jpg differ diff --git a/src/dataset/sunflower/5274979365_503350ab26_c.jpg b/src/dataset/sunflower/5274979365_503350ab26_c.jpg new file mode 100644 index 00000000..476677a1 Binary files /dev/null and b/src/dataset/sunflower/5274979365_503350ab26_c.jpg differ diff --git a/src/dataset/sunflower/5336298343_591fb07d45_c.jpg b/src/dataset/sunflower/5336298343_591fb07d45_c.jpg new file mode 100644 index 00000000..ffb05378 Binary files /dev/null and b/src/dataset/sunflower/5336298343_591fb07d45_c.jpg differ diff --git a/src/dataset/sunflower/5337859511_05e27f36f2_c.jpg b/src/dataset/sunflower/5337859511_05e27f36f2_c.jpg new file mode 100644 index 00000000..c4b0dc03 Binary files /dev/null and b/src/dataset/sunflower/5337859511_05e27f36f2_c.jpg differ diff --git a/src/dataset/sunflower/5340688110_fe584b6f49_c.jpg b/src/dataset/sunflower/5340688110_fe584b6f49_c.jpg new file mode 100644 index 00000000..93ef9556 Binary files /dev/null and b/src/dataset/sunflower/5340688110_fe584b6f49_c.jpg differ diff --git a/src/dataset/sunflower/5349202364_1388827c86_c.jpg b/src/dataset/sunflower/5349202364_1388827c86_c.jpg new file mode 100644 index 00000000..ee2216a6 Binary files /dev/null and b/src/dataset/sunflower/5349202364_1388827c86_c.jpg differ diff --git a/src/dataset/sunflower/5353153522_5271de413c_c.jpg b/src/dataset/sunflower/5353153522_5271de413c_c.jpg new file mode 100644 index 00000000..5bf77057 Binary files /dev/null and b/src/dataset/sunflower/5353153522_5271de413c_c.jpg differ diff --git a/src/dataset/sunflower/5379581500_96ba0db73e_c.jpg b/src/dataset/sunflower/5379581500_96ba0db73e_c.jpg new file mode 100644 index 00000000..5e785dfb Binary files /dev/null and b/src/dataset/sunflower/5379581500_96ba0db73e_c.jpg differ diff --git a/src/dataset/sunflower/5398927338_0ef6203d40_c.jpg b/src/dataset/sunflower/5398927338_0ef6203d40_c.jpg new file mode 100644 index 00000000..3a35ae8b Binary files /dev/null and b/src/dataset/sunflower/5398927338_0ef6203d40_c.jpg differ diff --git a/src/dataset/sunflower/5431052197_4a7208c770_c.jpg b/src/dataset/sunflower/5431052197_4a7208c770_c.jpg new file mode 100644 index 00000000..f2f8f17e Binary files /dev/null and b/src/dataset/sunflower/5431052197_4a7208c770_c.jpg differ diff --git a/src/dataset/sunflower/5433348656_fa25804a53_c.jpg b/src/dataset/sunflower/5433348656_fa25804a53_c.jpg new file mode 100644 index 00000000..5829478f Binary files /dev/null and b/src/dataset/sunflower/5433348656_fa25804a53_c.jpg differ diff --git a/src/dataset/sunflower/543888702_510f08f536_c.jpg b/src/dataset/sunflower/543888702_510f08f536_c.jpg new file mode 100644 index 00000000..50f1c1c9 Binary files /dev/null and b/src/dataset/sunflower/543888702_510f08f536_c.jpg differ diff --git a/src/dataset/sunflower/5470334361_bbd4cb832a_c.jpg b/src/dataset/sunflower/5470334361_bbd4cb832a_c.jpg new file mode 100644 index 00000000..15cdf3e8 Binary files /dev/null and b/src/dataset/sunflower/5470334361_bbd4cb832a_c.jpg differ diff --git a/src/dataset/sunflower/5487148572_a4cd26d850_c.jpg b/src/dataset/sunflower/5487148572_a4cd26d850_c.jpg new file mode 100644 index 00000000..9b403475 Binary files /dev/null and b/src/dataset/sunflower/5487148572_a4cd26d850_c.jpg differ diff --git a/src/dataset/sunflower/5501960299_43eae12f34_c.jpg b/src/dataset/sunflower/5501960299_43eae12f34_c.jpg new file mode 100644 index 00000000..11e97209 Binary files /dev/null and b/src/dataset/sunflower/5501960299_43eae12f34_c.jpg differ diff --git a/src/dataset/sunflower/5507070141_4853a06c28_c.jpg b/src/dataset/sunflower/5507070141_4853a06c28_c.jpg new file mode 100644 index 00000000..9de10db3 Binary files /dev/null and b/src/dataset/sunflower/5507070141_4853a06c28_c.jpg differ diff --git a/src/dataset/sunflower/5514333595_f6d4df0ec3_c.jpg b/src/dataset/sunflower/5514333595_f6d4df0ec3_c.jpg new file mode 100644 index 00000000..59f31faa Binary files /dev/null and b/src/dataset/sunflower/5514333595_f6d4df0ec3_c.jpg differ diff --git a/src/dataset/sunflower/5521713652_2faec10e90_c.jpg b/src/dataset/sunflower/5521713652_2faec10e90_c.jpg new file mode 100644 index 00000000..cd437dfe Binary files /dev/null and b/src/dataset/sunflower/5521713652_2faec10e90_c.jpg differ diff --git a/src/dataset/sunflower/5528601_b7a824d447_c.jpg b/src/dataset/sunflower/5528601_b7a824d447_c.jpg new file mode 100644 index 00000000..5da845f8 Binary files /dev/null and b/src/dataset/sunflower/5528601_b7a824d447_c.jpg differ diff --git a/src/dataset/sunflower/5539869654_77842222e4_c.jpg b/src/dataset/sunflower/5539869654_77842222e4_c.jpg new file mode 100644 index 00000000..39a64420 Binary files /dev/null and b/src/dataset/sunflower/5539869654_77842222e4_c.jpg differ diff --git a/src/dataset/sunflower/5540989292_0076bdb2dc_c.jpg b/src/dataset/sunflower/5540989292_0076bdb2dc_c.jpg new file mode 100644 index 00000000..d754ae35 Binary files /dev/null and b/src/dataset/sunflower/5540989292_0076bdb2dc_c.jpg differ diff --git a/src/dataset/sunflower/5562296755_d50e4e558e_c.jpg b/src/dataset/sunflower/5562296755_d50e4e558e_c.jpg new file mode 100644 index 00000000..7f00eddb Binary files /dev/null and b/src/dataset/sunflower/5562296755_d50e4e558e_c.jpg differ diff --git a/src/dataset/sunflower/5591955950_43b18a1299_c.jpg b/src/dataset/sunflower/5591955950_43b18a1299_c.jpg new file mode 100644 index 00000000..f904b394 Binary files /dev/null and b/src/dataset/sunflower/5591955950_43b18a1299_c.jpg differ diff --git a/src/dataset/sunflower/5604790318_c18f6ee753_c.jpg b/src/dataset/sunflower/5604790318_c18f6ee753_c.jpg new file mode 100644 index 00000000..6f325975 Binary files /dev/null and b/src/dataset/sunflower/5604790318_c18f6ee753_c.jpg differ diff --git a/src/dataset/sunflower/5606757411_fae7b0d7f9_c.jpg b/src/dataset/sunflower/5606757411_fae7b0d7f9_c.jpg new file mode 100644 index 00000000..b7ca6c04 Binary files /dev/null and b/src/dataset/sunflower/5606757411_fae7b0d7f9_c.jpg differ diff --git a/src/dataset/sunflower/5629652231_80e406219f_c.jpg b/src/dataset/sunflower/5629652231_80e406219f_c.jpg new file mode 100644 index 00000000..b1d9cd45 Binary files /dev/null and b/src/dataset/sunflower/5629652231_80e406219f_c.jpg differ diff --git a/src/dataset/sunflower/56373967_6e7f01333f_c.jpg b/src/dataset/sunflower/56373967_6e7f01333f_c.jpg new file mode 100644 index 00000000..f42eba72 Binary files /dev/null and b/src/dataset/sunflower/56373967_6e7f01333f_c.jpg differ diff --git a/src/dataset/sunflower/5642608611_0c24115834_c.jpg b/src/dataset/sunflower/5642608611_0c24115834_c.jpg new file mode 100644 index 00000000..f83425c5 Binary files /dev/null and b/src/dataset/sunflower/5642608611_0c24115834_c.jpg differ diff --git a/src/dataset/sunflower/5650187976_f8ab67774d_c.jpg b/src/dataset/sunflower/5650187976_f8ab67774d_c.jpg new file mode 100644 index 00000000..62c982ba Binary files /dev/null and b/src/dataset/sunflower/5650187976_f8ab67774d_c.jpg differ diff --git a/src/dataset/sunflower/5669327104_d66e5e4a40_c.jpg b/src/dataset/sunflower/5669327104_d66e5e4a40_c.jpg new file mode 100644 index 00000000..0b55e90b Binary files /dev/null and b/src/dataset/sunflower/5669327104_d66e5e4a40_c.jpg differ diff --git a/src/dataset/sunflower/5711369584_fd5af94db6_c.jpg b/src/dataset/sunflower/5711369584_fd5af94db6_c.jpg new file mode 100644 index 00000000..8e7da44c Binary files /dev/null and b/src/dataset/sunflower/5711369584_fd5af94db6_c.jpg differ diff --git a/src/dataset/sunflower/5718065482_4b4aa7388f_c.jpg b/src/dataset/sunflower/5718065482_4b4aa7388f_c.jpg new file mode 100644 index 00000000..fda17042 Binary files /dev/null and b/src/dataset/sunflower/5718065482_4b4aa7388f_c.jpg differ diff --git a/src/dataset/sunflower/578158282_e9ab9cf539_c.jpg b/src/dataset/sunflower/578158282_e9ab9cf539_c.jpg new file mode 100644 index 00000000..2a9045de Binary files /dev/null and b/src/dataset/sunflower/578158282_e9ab9cf539_c.jpg differ diff --git a/src/dataset/sunflower/5815663291_a43fdf3fb6_c.jpg b/src/dataset/sunflower/5815663291_a43fdf3fb6_c.jpg new file mode 100644 index 00000000..cb6c57b5 Binary files /dev/null and b/src/dataset/sunflower/5815663291_a43fdf3fb6_c.jpg differ diff --git a/src/dataset/sunflower/5820201690_3f02c11acd_c.jpg b/src/dataset/sunflower/5820201690_3f02c11acd_c.jpg new file mode 100644 index 00000000..533fa140 Binary files /dev/null and b/src/dataset/sunflower/5820201690_3f02c11acd_c.jpg differ diff --git a/src/dataset/sunflower/5823885797_723b8968ec_c.jpg b/src/dataset/sunflower/5823885797_723b8968ec_c.jpg new file mode 100644 index 00000000..08739254 Binary files /dev/null and b/src/dataset/sunflower/5823885797_723b8968ec_c.jpg differ diff --git a/src/dataset/sunflower/5846397484_a713f3b9c8_c.jpg b/src/dataset/sunflower/5846397484_a713f3b9c8_c.jpg new file mode 100644 index 00000000..5718351f Binary files /dev/null and b/src/dataset/sunflower/5846397484_a713f3b9c8_c.jpg differ diff --git a/src/dataset/sunflower/59050223_e8a2fd14e2_c.jpg b/src/dataset/sunflower/59050223_e8a2fd14e2_c.jpg new file mode 100644 index 00000000..a2749ac7 Binary files /dev/null and b/src/dataset/sunflower/59050223_e8a2fd14e2_c.jpg differ diff --git a/src/dataset/sunflower/5922442211_a97d5fbe87_c.jpg b/src/dataset/sunflower/5922442211_a97d5fbe87_c.jpg new file mode 100644 index 00000000..d96646ec Binary files /dev/null and b/src/dataset/sunflower/5922442211_a97d5fbe87_c.jpg differ diff --git a/src/dataset/sunflower/5925336809_d02b1e1a81_c.jpg b/src/dataset/sunflower/5925336809_d02b1e1a81_c.jpg new file mode 100644 index 00000000..6adebc06 Binary files /dev/null and b/src/dataset/sunflower/5925336809_d02b1e1a81_c.jpg differ diff --git a/src/dataset/sunflower/5928619901_0bf0046534_c.jpg b/src/dataset/sunflower/5928619901_0bf0046534_c.jpg new file mode 100644 index 00000000..dbb23714 Binary files /dev/null and b/src/dataset/sunflower/5928619901_0bf0046534_c.jpg differ diff --git a/src/dataset/sunflower/5929156900_d80b8c2e00_c.jpg b/src/dataset/sunflower/5929156900_d80b8c2e00_c.jpg new file mode 100644 index 00000000..ec99d8bb Binary files /dev/null and b/src/dataset/sunflower/5929156900_d80b8c2e00_c.jpg differ diff --git a/src/dataset/sunflower/5936062942_494ec952ce_c.jpg b/src/dataset/sunflower/5936062942_494ec952ce_c.jpg new file mode 100644 index 00000000..8f1b5812 Binary files /dev/null and b/src/dataset/sunflower/5936062942_494ec952ce_c.jpg differ diff --git a/src/dataset/sunflower/5936457233_c56a1c88d7_c.jpg b/src/dataset/sunflower/5936457233_c56a1c88d7_c.jpg new file mode 100644 index 00000000..aa97a01c Binary files /dev/null and b/src/dataset/sunflower/5936457233_c56a1c88d7_c.jpg differ diff --git a/src/dataset/sunflower/5942407244_c3ab3c8543_c.jpg b/src/dataset/sunflower/5942407244_c3ab3c8543_c.jpg new file mode 100644 index 00000000..5c8c2901 Binary files /dev/null and b/src/dataset/sunflower/5942407244_c3ab3c8543_c.jpg differ diff --git a/src/dataset/sunflower/5945698856_1d22012e54_c.jpg b/src/dataset/sunflower/5945698856_1d22012e54_c.jpg new file mode 100644 index 00000000..c3d9630d Binary files /dev/null and b/src/dataset/sunflower/5945698856_1d22012e54_c.jpg differ diff --git a/src/dataset/sunflower/5947853839_a5d6cd41b2_c.jpg b/src/dataset/sunflower/5947853839_a5d6cd41b2_c.jpg new file mode 100644 index 00000000..0b739778 Binary files /dev/null and b/src/dataset/sunflower/5947853839_a5d6cd41b2_c.jpg differ diff --git a/src/dataset/sunflower/5950287577_a1b9322e02_c.jpg b/src/dataset/sunflower/5950287577_a1b9322e02_c.jpg new file mode 100644 index 00000000..d2e5dcd0 Binary files /dev/null and b/src/dataset/sunflower/5950287577_a1b9322e02_c.jpg differ diff --git a/src/dataset/sunflower/5955988356_22c5c43161_c.jpg b/src/dataset/sunflower/5955988356_22c5c43161_c.jpg new file mode 100644 index 00000000..17bd6eff Binary files /dev/null and b/src/dataset/sunflower/5955988356_22c5c43161_c.jpg differ diff --git a/src/dataset/sunflower/5961036774_b80ddcc46a_c.jpg b/src/dataset/sunflower/5961036774_b80ddcc46a_c.jpg new file mode 100644 index 00000000..06c9a031 Binary files /dev/null and b/src/dataset/sunflower/5961036774_b80ddcc46a_c.jpg differ diff --git a/src/dataset/sunflower/5972296769_914750d509_c.jpg b/src/dataset/sunflower/5972296769_914750d509_c.jpg new file mode 100644 index 00000000..c1ffbf98 Binary files /dev/null and b/src/dataset/sunflower/5972296769_914750d509_c.jpg differ diff --git a/src/dataset/sunflower/5979055757_58d135fc9e_c.jpg b/src/dataset/sunflower/5979055757_58d135fc9e_c.jpg new file mode 100644 index 00000000..b54b835c Binary files /dev/null and b/src/dataset/sunflower/5979055757_58d135fc9e_c.jpg differ diff --git a/src/dataset/sunflower/5979610696_ef6fe7cc92_c.jpg b/src/dataset/sunflower/5979610696_ef6fe7cc92_c.jpg new file mode 100644 index 00000000..31697da6 Binary files /dev/null and b/src/dataset/sunflower/5979610696_ef6fe7cc92_c.jpg differ diff --git a/src/dataset/sunflower/5979616490_b8b32cbc02_c.jpg b/src/dataset/sunflower/5979616490_b8b32cbc02_c.jpg new file mode 100644 index 00000000..a8841560 Binary files /dev/null and b/src/dataset/sunflower/5979616490_b8b32cbc02_c.jpg differ diff --git a/src/dataset/sunflower/5982626867_594c73207e_c.jpg b/src/dataset/sunflower/5982626867_594c73207e_c.jpg new file mode 100644 index 00000000..b6795d6a Binary files /dev/null and b/src/dataset/sunflower/5982626867_594c73207e_c.jpg differ diff --git a/src/dataset/sunflower/5991225406_0040758057_c.jpg b/src/dataset/sunflower/5991225406_0040758057_c.jpg new file mode 100644 index 00000000..f5e6b453 Binary files /dev/null and b/src/dataset/sunflower/5991225406_0040758057_c.jpg differ diff --git a/src/dataset/sunflower/6010401059_0f19d880a3_c.jpg b/src/dataset/sunflower/6010401059_0f19d880a3_c.jpg new file mode 100644 index 00000000..f60e0808 Binary files /dev/null and b/src/dataset/sunflower/6010401059_0f19d880a3_c.jpg differ diff --git a/src/dataset/sunflower/6010943918_8fbc015bfc_c.jpg b/src/dataset/sunflower/6010943918_8fbc015bfc_c.jpg new file mode 100644 index 00000000..7e6243a8 Binary files /dev/null and b/src/dataset/sunflower/6010943918_8fbc015bfc_c.jpg differ diff --git a/src/dataset/sunflower/6010947418_244d6cd580_c.jpg b/src/dataset/sunflower/6010947418_244d6cd580_c.jpg new file mode 100644 index 00000000..1c5c4aad Binary files /dev/null and b/src/dataset/sunflower/6010947418_244d6cd580_c.jpg differ diff --git a/src/dataset/sunflower/6011272430_d9a3e02656_c.jpg b/src/dataset/sunflower/6011272430_d9a3e02656_c.jpg new file mode 100644 index 00000000..53e4c085 Binary files /dev/null and b/src/dataset/sunflower/6011272430_d9a3e02656_c.jpg differ diff --git a/src/dataset/sunflower/6014573136_9ab9622457_c.jpg b/src/dataset/sunflower/6014573136_9ab9622457_c.jpg new file mode 100644 index 00000000..81a7b817 Binary files /dev/null and b/src/dataset/sunflower/6014573136_9ab9622457_c.jpg differ diff --git a/src/dataset/sunflower/6015652068_6233794f78_c.jpg b/src/dataset/sunflower/6015652068_6233794f78_c.jpg new file mode 100644 index 00000000..5e5ad57c Binary files /dev/null and b/src/dataset/sunflower/6015652068_6233794f78_c.jpg differ diff --git a/src/dataset/sunflower/6017025638_1593c4e916_c.jpg b/src/dataset/sunflower/6017025638_1593c4e916_c.jpg new file mode 100644 index 00000000..37c6aa3c Binary files /dev/null and b/src/dataset/sunflower/6017025638_1593c4e916_c.jpg differ diff --git a/src/dataset/sunflower/6024709673_1728a4ac1e_c.jpg b/src/dataset/sunflower/6024709673_1728a4ac1e_c.jpg new file mode 100644 index 00000000..bda6f548 Binary files /dev/null and b/src/dataset/sunflower/6024709673_1728a4ac1e_c.jpg differ diff --git a/src/dataset/sunflower/6029543396_5cd6c183c8_c.jpg b/src/dataset/sunflower/6029543396_5cd6c183c8_c.jpg new file mode 100644 index 00000000..899481cb Binary files /dev/null and b/src/dataset/sunflower/6029543396_5cd6c183c8_c.jpg differ diff --git a/src/dataset/sunflower/6031710913_898a606c9c_c.jpg b/src/dataset/sunflower/6031710913_898a606c9c_c.jpg new file mode 100644 index 00000000..e149a974 Binary files /dev/null and b/src/dataset/sunflower/6031710913_898a606c9c_c.jpg differ diff --git a/src/dataset/sunflower/6035860085_454f441115_c.jpg b/src/dataset/sunflower/6035860085_454f441115_c.jpg new file mode 100644 index 00000000..1fd006c6 Binary files /dev/null and b/src/dataset/sunflower/6035860085_454f441115_c.jpg differ diff --git a/src/dataset/sunflower/6039117976_d959bc1c72_c.jpg b/src/dataset/sunflower/6039117976_d959bc1c72_c.jpg new file mode 100644 index 00000000..587475d0 Binary files /dev/null and b/src/dataset/sunflower/6039117976_d959bc1c72_c.jpg differ diff --git a/src/dataset/sunflower/6041625104_b4b13aedf7_c.jpg b/src/dataset/sunflower/6041625104_b4b13aedf7_c.jpg new file mode 100644 index 00000000..c8855c4f Binary files /dev/null and b/src/dataset/sunflower/6041625104_b4b13aedf7_c.jpg differ diff --git a/src/dataset/sunflower/6053847210_45df0615d3_c.jpg b/src/dataset/sunflower/6053847210_45df0615d3_c.jpg new file mode 100644 index 00000000..5debbf5f Binary files /dev/null and b/src/dataset/sunflower/6053847210_45df0615d3_c.jpg differ diff --git a/src/dataset/sunflower/6056523093_f3bcf1e979_c.jpg b/src/dataset/sunflower/6056523093_f3bcf1e979_c.jpg new file mode 100644 index 00000000..61e2b1f9 Binary files /dev/null and b/src/dataset/sunflower/6056523093_f3bcf1e979_c.jpg differ diff --git a/src/dataset/sunflower/606059227_8010e81b62_c.jpg b/src/dataset/sunflower/606059227_8010e81b62_c.jpg new file mode 100644 index 00000000..b7663a43 Binary files /dev/null and b/src/dataset/sunflower/606059227_8010e81b62_c.jpg differ diff --git a/src/dataset/sunflower/6061070065_2d01c2c059_c.jpg b/src/dataset/sunflower/6061070065_2d01c2c059_c.jpg new file mode 100644 index 00000000..3579e868 Binary files /dev/null and b/src/dataset/sunflower/6061070065_2d01c2c059_c.jpg differ diff --git a/src/dataset/sunflower/6067236826_980575ee9e_c.jpg b/src/dataset/sunflower/6067236826_980575ee9e_c.jpg new file mode 100644 index 00000000..25eb8b01 Binary files /dev/null and b/src/dataset/sunflower/6067236826_980575ee9e_c.jpg differ diff --git a/src/dataset/sunflower/6067822575_2b89de1539_c.jpg b/src/dataset/sunflower/6067822575_2b89de1539_c.jpg new file mode 100644 index 00000000..8c74d3f2 Binary files /dev/null and b/src/dataset/sunflower/6067822575_2b89de1539_c.jpg differ diff --git a/src/dataset/sunflower/6075973816_cb883cec8b_c.jpg b/src/dataset/sunflower/6075973816_cb883cec8b_c.jpg new file mode 100644 index 00000000..903caf72 Binary files /dev/null and b/src/dataset/sunflower/6075973816_cb883cec8b_c.jpg differ diff --git a/src/dataset/sunflower/6077159674_65427628c0_c.jpg b/src/dataset/sunflower/6077159674_65427628c0_c.jpg new file mode 100644 index 00000000..326414dd Binary files /dev/null and b/src/dataset/sunflower/6077159674_65427628c0_c.jpg differ diff --git a/src/dataset/sunflower/6086329164_395431141c_c.jpg b/src/dataset/sunflower/6086329164_395431141c_c.jpg new file mode 100644 index 00000000..bd3b00b4 Binary files /dev/null and b/src/dataset/sunflower/6086329164_395431141c_c.jpg differ diff --git a/src/dataset/sunflower/6090874076_e18f52302c_c.jpg b/src/dataset/sunflower/6090874076_e18f52302c_c.jpg new file mode 100644 index 00000000..d3a42d34 Binary files /dev/null and b/src/dataset/sunflower/6090874076_e18f52302c_c.jpg differ diff --git a/src/dataset/sunflower/6093464385_a79048dd97_c.jpg b/src/dataset/sunflower/6093464385_a79048dd97_c.jpg new file mode 100644 index 00000000..6cb5bab2 Binary files /dev/null and b/src/dataset/sunflower/6093464385_a79048dd97_c.jpg differ diff --git a/src/dataset/sunflower/6100404404_0a65d6122e_c.jpg b/src/dataset/sunflower/6100404404_0a65d6122e_c.jpg new file mode 100644 index 00000000..e6349529 Binary files /dev/null and b/src/dataset/sunflower/6100404404_0a65d6122e_c.jpg differ diff --git a/src/dataset/sunflower/6101744035_2566341f3c_c.jpg b/src/dataset/sunflower/6101744035_2566341f3c_c.jpg new file mode 100644 index 00000000..4cf43799 Binary files /dev/null and b/src/dataset/sunflower/6101744035_2566341f3c_c.jpg differ diff --git a/src/dataset/sunflower/6104384445_102e2d9156_c.jpg b/src/dataset/sunflower/6104384445_102e2d9156_c.jpg new file mode 100644 index 00000000..70746842 Binary files /dev/null and b/src/dataset/sunflower/6104384445_102e2d9156_c.jpg differ diff --git a/src/dataset/sunflower/6112349777_6444f101ac_c.jpg b/src/dataset/sunflower/6112349777_6444f101ac_c.jpg new file mode 100644 index 00000000..dd528252 Binary files /dev/null and b/src/dataset/sunflower/6112349777_6444f101ac_c.jpg differ diff --git a/src/dataset/sunflower/6113543037_8e90fb313e_c.jpg b/src/dataset/sunflower/6113543037_8e90fb313e_c.jpg new file mode 100644 index 00000000..a6810e87 Binary files /dev/null and b/src/dataset/sunflower/6113543037_8e90fb313e_c.jpg differ diff --git a/src/dataset/sunflower/6134155955_0babf44418_c.jpg b/src/dataset/sunflower/6134155955_0babf44418_c.jpg new file mode 100644 index 00000000..b5158dd0 Binary files /dev/null and b/src/dataset/sunflower/6134155955_0babf44418_c.jpg differ diff --git a/src/dataset/sunflower/6138637919_702fa481fd_c.jpg b/src/dataset/sunflower/6138637919_702fa481fd_c.jpg new file mode 100644 index 00000000..6fbe1189 Binary files /dev/null and b/src/dataset/sunflower/6138637919_702fa481fd_c.jpg differ diff --git a/src/dataset/sunflower/6146595181_39ed8e5772_c.jpg b/src/dataset/sunflower/6146595181_39ed8e5772_c.jpg new file mode 100644 index 00000000..ace31ee7 Binary files /dev/null and b/src/dataset/sunflower/6146595181_39ed8e5772_c.jpg differ diff --git a/src/dataset/sunflower/6148060931_31889a1a12_c.jpg b/src/dataset/sunflower/6148060931_31889a1a12_c.jpg new file mode 100644 index 00000000..16fdb33a Binary files /dev/null and b/src/dataset/sunflower/6148060931_31889a1a12_c.jpg differ diff --git a/src/dataset/sunflower/6148210239_d3f61b9907_c.jpg b/src/dataset/sunflower/6148210239_d3f61b9907_c.jpg new file mode 100644 index 00000000..48d913aa Binary files /dev/null and b/src/dataset/sunflower/6148210239_d3f61b9907_c.jpg differ diff --git a/src/dataset/sunflower/6150922708_0748e5889b_c.jpg b/src/dataset/sunflower/6150922708_0748e5889b_c.jpg new file mode 100644 index 00000000..c1993fe7 Binary files /dev/null and b/src/dataset/sunflower/6150922708_0748e5889b_c.jpg differ diff --git a/src/dataset/sunflower/6156450787_19cec866fe_c.jpg b/src/dataset/sunflower/6156450787_19cec866fe_c.jpg new file mode 100644 index 00000000..565ef49b Binary files /dev/null and b/src/dataset/sunflower/6156450787_19cec866fe_c.jpg differ diff --git a/src/dataset/sunflower/6157378420_0c3597c619_c.jpg b/src/dataset/sunflower/6157378420_0c3597c619_c.jpg new file mode 100644 index 00000000..3cb65001 Binary files /dev/null and b/src/dataset/sunflower/6157378420_0c3597c619_c.jpg differ diff --git a/src/dataset/sunflower/6158050316_070c33f289_c.jpg b/src/dataset/sunflower/6158050316_070c33f289_c.jpg new file mode 100644 index 00000000..660eaec3 Binary files /dev/null and b/src/dataset/sunflower/6158050316_070c33f289_c.jpg differ diff --git a/src/dataset/sunflower/6158859642_81c56f4366_c.jpg b/src/dataset/sunflower/6158859642_81c56f4366_c.jpg new file mode 100644 index 00000000..f951d17e Binary files /dev/null and b/src/dataset/sunflower/6158859642_81c56f4366_c.jpg differ diff --git a/src/dataset/sunflower/6164905849_478262cfd3_c.jpg b/src/dataset/sunflower/6164905849_478262cfd3_c.jpg new file mode 100644 index 00000000..079544ba Binary files /dev/null and b/src/dataset/sunflower/6164905849_478262cfd3_c.jpg differ diff --git a/src/dataset/sunflower/6165301763_2979f52d43_c.jpg b/src/dataset/sunflower/6165301763_2979f52d43_c.jpg new file mode 100644 index 00000000..454b1189 Binary files /dev/null and b/src/dataset/sunflower/6165301763_2979f52d43_c.jpg differ diff --git a/src/dataset/sunflower/6165833664_dc722e3e0f_c.jpg b/src/dataset/sunflower/6165833664_dc722e3e0f_c.jpg new file mode 100644 index 00000000..0301affe Binary files /dev/null and b/src/dataset/sunflower/6165833664_dc722e3e0f_c.jpg differ diff --git a/src/dataset/sunflower/6174261344_4f81de0f08_c.jpg b/src/dataset/sunflower/6174261344_4f81de0f08_c.jpg new file mode 100644 index 00000000..0d29a8c1 Binary files /dev/null and b/src/dataset/sunflower/6174261344_4f81de0f08_c.jpg differ diff --git a/src/dataset/sunflower/6176508065_33046e1d9d_c.jpg b/src/dataset/sunflower/6176508065_33046e1d9d_c.jpg new file mode 100644 index 00000000..046558a3 Binary files /dev/null and b/src/dataset/sunflower/6176508065_33046e1d9d_c.jpg differ diff --git a/src/dataset/sunflower/6178630465_971e031f74_c.jpg b/src/dataset/sunflower/6178630465_971e031f74_c.jpg new file mode 100644 index 00000000..a25e0a2d Binary files /dev/null and b/src/dataset/sunflower/6178630465_971e031f74_c.jpg differ diff --git a/src/dataset/sunflower/6180158114_5d0b81355a_c.jpg b/src/dataset/sunflower/6180158114_5d0b81355a_c.jpg new file mode 100644 index 00000000..6ddd5899 Binary files /dev/null and b/src/dataset/sunflower/6180158114_5d0b81355a_c.jpg differ diff --git a/src/dataset/sunflower/6183889222_688872bc58_c.jpg b/src/dataset/sunflower/6183889222_688872bc58_c.jpg new file mode 100644 index 00000000..4433e5f7 Binary files /dev/null and b/src/dataset/sunflower/6183889222_688872bc58_c.jpg differ diff --git a/src/dataset/sunflower/6184985664_daa2c726df_c.jpg b/src/dataset/sunflower/6184985664_daa2c726df_c.jpg new file mode 100644 index 00000000..e1fb0090 Binary files /dev/null and b/src/dataset/sunflower/6184985664_daa2c726df_c.jpg differ diff --git a/src/dataset/sunflower/6186619224_bed335841c_c.jpg b/src/dataset/sunflower/6186619224_bed335841c_c.jpg new file mode 100644 index 00000000..9530eef7 Binary files /dev/null and b/src/dataset/sunflower/6186619224_bed335841c_c.jpg differ diff --git a/src/dataset/sunflower/6190886397_83a62da6dc_c.jpg b/src/dataset/sunflower/6190886397_83a62da6dc_c.jpg new file mode 100644 index 00000000..9173e6b8 Binary files /dev/null and b/src/dataset/sunflower/6190886397_83a62da6dc_c.jpg differ diff --git a/src/dataset/sunflower/6191708853_f62c731916_c.jpg b/src/dataset/sunflower/6191708853_f62c731916_c.jpg new file mode 100644 index 00000000..e37540ea Binary files /dev/null and b/src/dataset/sunflower/6191708853_f62c731916_c.jpg differ diff --git a/src/dataset/sunflower/6193486550_fcf83dacd0_c.jpg b/src/dataset/sunflower/6193486550_fcf83dacd0_c.jpg new file mode 100644 index 00000000..dedd067d Binary files /dev/null and b/src/dataset/sunflower/6193486550_fcf83dacd0_c.jpg differ diff --git a/src/dataset/sunflower/6194591926_dd2b67e1b6_c.jpg b/src/dataset/sunflower/6194591926_dd2b67e1b6_c.jpg new file mode 100644 index 00000000..8e73f01f Binary files /dev/null and b/src/dataset/sunflower/6194591926_dd2b67e1b6_c.jpg differ diff --git a/src/dataset/sunflower/6194592262_f8833d3398_c.jpg b/src/dataset/sunflower/6194592262_f8833d3398_c.jpg new file mode 100644 index 00000000..6857a5a5 Binary files /dev/null and b/src/dataset/sunflower/6194592262_f8833d3398_c.jpg differ diff --git a/src/dataset/sunflower/6195101559_2a07d36da9_c.jpg b/src/dataset/sunflower/6195101559_2a07d36da9_c.jpg new file mode 100644 index 00000000..8802031c Binary files /dev/null and b/src/dataset/sunflower/6195101559_2a07d36da9_c.jpg differ diff --git a/src/dataset/sunflower/6202849052_e36c110fe5_c.jpg b/src/dataset/sunflower/6202849052_e36c110fe5_c.jpg new file mode 100644 index 00000000..a60c5690 Binary files /dev/null and b/src/dataset/sunflower/6202849052_e36c110fe5_c.jpg differ diff --git a/src/dataset/sunflower/6228414996_9a460ec91e_c.jpg b/src/dataset/sunflower/6228414996_9a460ec91e_c.jpg new file mode 100644 index 00000000..0e9c572c Binary files /dev/null and b/src/dataset/sunflower/6228414996_9a460ec91e_c.jpg differ diff --git a/src/dataset/sunflower/6246866446_0902d1f545_c.jpg b/src/dataset/sunflower/6246866446_0902d1f545_c.jpg new file mode 100644 index 00000000..4aafd56c Binary files /dev/null and b/src/dataset/sunflower/6246866446_0902d1f545_c.jpg differ diff --git a/src/dataset/sunflower/6264363949_4736a67ffd_c.jpg b/src/dataset/sunflower/6264363949_4736a67ffd_c.jpg new file mode 100644 index 00000000..ac2ab0ea Binary files /dev/null and b/src/dataset/sunflower/6264363949_4736a67ffd_c.jpg differ diff --git a/src/dataset/sunflower/6264539910_fcb97f518b_c.jpg b/src/dataset/sunflower/6264539910_fcb97f518b_c.jpg new file mode 100644 index 00000000..9f4628d3 Binary files /dev/null and b/src/dataset/sunflower/6264539910_fcb97f518b_c.jpg differ diff --git a/src/dataset/sunflower/6276775105_885928c275_c.jpg b/src/dataset/sunflower/6276775105_885928c275_c.jpg new file mode 100644 index 00000000..e84cbb86 Binary files /dev/null and b/src/dataset/sunflower/6276775105_885928c275_c.jpg differ diff --git a/src/dataset/sunflower/6284474157_f8ccd3d963_c.jpg b/src/dataset/sunflower/6284474157_f8ccd3d963_c.jpg new file mode 100644 index 00000000..bca17b6f Binary files /dev/null and b/src/dataset/sunflower/6284474157_f8ccd3d963_c.jpg differ diff --git a/src/dataset/sunflower/6289025360_a358b13b28_c.jpg b/src/dataset/sunflower/6289025360_a358b13b28_c.jpg new file mode 100644 index 00000000..169d98b8 Binary files /dev/null and b/src/dataset/sunflower/6289025360_a358b13b28_c.jpg differ diff --git a/src/dataset/sunflower/62965859_6931e70b9c_c.jpg b/src/dataset/sunflower/62965859_6931e70b9c_c.jpg new file mode 100644 index 00000000..7b6e3a9f Binary files /dev/null and b/src/dataset/sunflower/62965859_6931e70b9c_c.jpg differ diff --git a/src/dataset/sunflower/6314461038_8df8ce61c0_c.jpg b/src/dataset/sunflower/6314461038_8df8ce61c0_c.jpg new file mode 100644 index 00000000..b01983f9 Binary files /dev/null and b/src/dataset/sunflower/6314461038_8df8ce61c0_c.jpg differ diff --git a/src/dataset/sunflower/6335915983_c4bae8f4e3_c.jpg b/src/dataset/sunflower/6335915983_c4bae8f4e3_c.jpg new file mode 100644 index 00000000..dcf8c60a Binary files /dev/null and b/src/dataset/sunflower/6335915983_c4bae8f4e3_c.jpg differ diff --git a/src/dataset/sunflower/6349895429_f6d171ec60_c.jpg b/src/dataset/sunflower/6349895429_f6d171ec60_c.jpg new file mode 100644 index 00000000..a395049c Binary files /dev/null and b/src/dataset/sunflower/6349895429_f6d171ec60_c.jpg differ diff --git a/src/dataset/sunflower/6350641478_78e813f9d9_c.jpg b/src/dataset/sunflower/6350641478_78e813f9d9_c.jpg new file mode 100644 index 00000000..e98468c6 Binary files /dev/null and b/src/dataset/sunflower/6350641478_78e813f9d9_c.jpg differ diff --git a/src/dataset/sunflower/6351011502_7d52a57528_c.jpg b/src/dataset/sunflower/6351011502_7d52a57528_c.jpg new file mode 100644 index 00000000..420cc62e Binary files /dev/null and b/src/dataset/sunflower/6351011502_7d52a57528_c.jpg differ diff --git a/src/dataset/sunflower/6351013220_d45200e612_c.jpg b/src/dataset/sunflower/6351013220_d45200e612_c.jpg new file mode 100644 index 00000000..bbf287ab Binary files /dev/null and b/src/dataset/sunflower/6351013220_d45200e612_c.jpg differ diff --git a/src/dataset/sunflower/6436166647_c8214e784c_c.jpg b/src/dataset/sunflower/6436166647_c8214e784c_c.jpg new file mode 100644 index 00000000..2e520c15 Binary files /dev/null and b/src/dataset/sunflower/6436166647_c8214e784c_c.jpg differ diff --git a/src/dataset/sunflower/6436167049_65cafb0a65_c.jpg b/src/dataset/sunflower/6436167049_65cafb0a65_c.jpg new file mode 100644 index 00000000..6fa8d3c8 Binary files /dev/null and b/src/dataset/sunflower/6436167049_65cafb0a65_c.jpg differ diff --git a/src/dataset/sunflower/6436167263_bc1b7d5e7d_c.jpg b/src/dataset/sunflower/6436167263_bc1b7d5e7d_c.jpg new file mode 100644 index 00000000..88fb7c89 Binary files /dev/null and b/src/dataset/sunflower/6436167263_bc1b7d5e7d_c.jpg differ diff --git a/src/dataset/sunflower/6436168025_4728fc49e8_c.jpg b/src/dataset/sunflower/6436168025_4728fc49e8_c.jpg new file mode 100644 index 00000000..8dcd124f Binary files /dev/null and b/src/dataset/sunflower/6436168025_4728fc49e8_c.jpg differ diff --git a/src/dataset/sunflower/6436168481_cf09c143b5_c.jpg b/src/dataset/sunflower/6436168481_cf09c143b5_c.jpg new file mode 100644 index 00000000..6b828474 Binary files /dev/null and b/src/dataset/sunflower/6436168481_cf09c143b5_c.jpg differ diff --git a/src/dataset/sunflower/6474496479_2e8f19a193_c.jpg b/src/dataset/sunflower/6474496479_2e8f19a193_c.jpg new file mode 100644 index 00000000..5e032198 Binary files /dev/null and b/src/dataset/sunflower/6474496479_2e8f19a193_c.jpg differ diff --git a/src/dataset/sunflower/6543247149_639134b6d3_c.jpg b/src/dataset/sunflower/6543247149_639134b6d3_c.jpg new file mode 100644 index 00000000..d945f22a Binary files /dev/null and b/src/dataset/sunflower/6543247149_639134b6d3_c.jpg differ diff --git a/src/dataset/sunflower/6555569805_69bcabdbbc_c.jpg b/src/dataset/sunflower/6555569805_69bcabdbbc_c.jpg new file mode 100644 index 00000000..77100311 Binary files /dev/null and b/src/dataset/sunflower/6555569805_69bcabdbbc_c.jpg differ diff --git a/src/dataset/sunflower/6606696569_d228fffed1_c.jpg b/src/dataset/sunflower/6606696569_d228fffed1_c.jpg new file mode 100644 index 00000000..24526cac Binary files /dev/null and b/src/dataset/sunflower/6606696569_d228fffed1_c.jpg differ diff --git a/src/dataset/sunflower/6626154911_849bf30140_c.jpg b/src/dataset/sunflower/6626154911_849bf30140_c.jpg new file mode 100644 index 00000000..dd4485ff Binary files /dev/null and b/src/dataset/sunflower/6626154911_849bf30140_c.jpg differ diff --git a/src/dataset/sunflower/6656761001_ed99414370_c.jpg b/src/dataset/sunflower/6656761001_ed99414370_c.jpg new file mode 100644 index 00000000..2b5f4035 Binary files /dev/null and b/src/dataset/sunflower/6656761001_ed99414370_c.jpg differ diff --git a/src/dataset/sunflower/6675708407_9591759a57_c.jpg b/src/dataset/sunflower/6675708407_9591759a57_c.jpg new file mode 100644 index 00000000..9d58fde6 Binary files /dev/null and b/src/dataset/sunflower/6675708407_9591759a57_c.jpg differ diff --git a/src/dataset/sunflower/6699138673_467b13c12c_c.jpg b/src/dataset/sunflower/6699138673_467b13c12c_c.jpg new file mode 100644 index 00000000..a5e52631 Binary files /dev/null and b/src/dataset/sunflower/6699138673_467b13c12c_c.jpg differ diff --git a/src/dataset/sunflower/6740105779_aa64bf1421_c.jpg b/src/dataset/sunflower/6740105779_aa64bf1421_c.jpg new file mode 100644 index 00000000..2a3808cd Binary files /dev/null and b/src/dataset/sunflower/6740105779_aa64bf1421_c.jpg differ diff --git a/src/dataset/sunflower/6769766203_ab1816eb5e_c.jpg b/src/dataset/sunflower/6769766203_ab1816eb5e_c.jpg new file mode 100644 index 00000000..1907e2ff Binary files /dev/null and b/src/dataset/sunflower/6769766203_ab1816eb5e_c.jpg differ diff --git a/src/dataset/sunflower/6782744702_09a7c983a6_c.jpg b/src/dataset/sunflower/6782744702_09a7c983a6_c.jpg new file mode 100644 index 00000000..68738457 Binary files /dev/null and b/src/dataset/sunflower/6782744702_09a7c983a6_c.jpg differ diff --git a/src/dataset/sunflower/6794074502_b00ef668fe_c.jpg b/src/dataset/sunflower/6794074502_b00ef668fe_c.jpg new file mode 100644 index 00000000..1bdeaed0 Binary files /dev/null and b/src/dataset/sunflower/6794074502_b00ef668fe_c.jpg differ diff --git a/src/dataset/sunflower/6813432722_ddc37cf48e_c.jpg b/src/dataset/sunflower/6813432722_ddc37cf48e_c.jpg new file mode 100644 index 00000000..b2f35b96 Binary files /dev/null and b/src/dataset/sunflower/6813432722_ddc37cf48e_c.jpg differ diff --git a/src/dataset/sunflower/6815481871_575f8c736d_c.jpg b/src/dataset/sunflower/6815481871_575f8c736d_c.jpg new file mode 100644 index 00000000..bfd6f2b2 Binary files /dev/null and b/src/dataset/sunflower/6815481871_575f8c736d_c.jpg differ diff --git a/src/dataset/sunflower/6817420392_8dac4b581e_c.jpg b/src/dataset/sunflower/6817420392_8dac4b581e_c.jpg new file mode 100644 index 00000000..1e6d2ec5 Binary files /dev/null and b/src/dataset/sunflower/6817420392_8dac4b581e_c.jpg differ diff --git a/src/dataset/sunflower/6828929160_53bfdd4abf_c.jpg b/src/dataset/sunflower/6828929160_53bfdd4abf_c.jpg new file mode 100644 index 00000000..50b2bf43 Binary files /dev/null and b/src/dataset/sunflower/6828929160_53bfdd4abf_c.jpg differ diff --git a/src/dataset/sunflower/68656677_c41c558e18_c.jpg b/src/dataset/sunflower/68656677_c41c558e18_c.jpg new file mode 100644 index 00000000..63b7d0bf Binary files /dev/null and b/src/dataset/sunflower/68656677_c41c558e18_c.jpg differ diff --git a/src/dataset/sunflower/6888171976_1c4d1c7fe3_c.jpg b/src/dataset/sunflower/6888171976_1c4d1c7fe3_c.jpg new file mode 100644 index 00000000..4ff366ba Binary files /dev/null and b/src/dataset/sunflower/6888171976_1c4d1c7fe3_c.jpg differ diff --git a/src/dataset/sunflower/6962789991_19f0cb15b5_c.jpg b/src/dataset/sunflower/6962789991_19f0cb15b5_c.jpg new file mode 100644 index 00000000..28d2e5a1 Binary files /dev/null and b/src/dataset/sunflower/6962789991_19f0cb15b5_c.jpg differ diff --git a/src/dataset/sunflower/6971011304_e9ba657676_c.jpg b/src/dataset/sunflower/6971011304_e9ba657676_c.jpg new file mode 100644 index 00000000..867b2b2b Binary files /dev/null and b/src/dataset/sunflower/6971011304_e9ba657676_c.jpg differ diff --git a/src/dataset/sunflower/697923518_a936c3b8a2_c.jpg b/src/dataset/sunflower/697923518_a936c3b8a2_c.jpg new file mode 100644 index 00000000..da69aea4 Binary files /dev/null and b/src/dataset/sunflower/697923518_a936c3b8a2_c.jpg differ diff --git a/src/dataset/sunflower/6985799030_a4e0f88d8a_c.jpg b/src/dataset/sunflower/6985799030_a4e0f88d8a_c.jpg new file mode 100644 index 00000000..1150a48a Binary files /dev/null and b/src/dataset/sunflower/6985799030_a4e0f88d8a_c.jpg differ diff --git a/src/dataset/sunflower/6987902549_01ec99867c_c.jpg b/src/dataset/sunflower/6987902549_01ec99867c_c.jpg new file mode 100644 index 00000000..82a9ae7d Binary files /dev/null and b/src/dataset/sunflower/6987902549_01ec99867c_c.jpg differ diff --git a/src/dataset/sunflower/6999438249_277fa8f614_c.jpg b/src/dataset/sunflower/6999438249_277fa8f614_c.jpg new file mode 100644 index 00000000..53a4f8c4 Binary files /dev/null and b/src/dataset/sunflower/6999438249_277fa8f614_c.jpg differ diff --git a/src/dataset/sunflower/7034269923_4f79ee6794_c.jpg b/src/dataset/sunflower/7034269923_4f79ee6794_c.jpg new file mode 100644 index 00000000..75a7a757 Binary files /dev/null and b/src/dataset/sunflower/7034269923_4f79ee6794_c.jpg differ diff --git a/src/dataset/sunflower/7034274971_0c759d02b1_c.jpg b/src/dataset/sunflower/7034274971_0c759d02b1_c.jpg new file mode 100644 index 00000000..c140a285 Binary files /dev/null and b/src/dataset/sunflower/7034274971_0c759d02b1_c.jpg differ diff --git a/src/dataset/sunflower/7034290597_06fe58d03d_c.jpg b/src/dataset/sunflower/7034290597_06fe58d03d_c.jpg new file mode 100644 index 00000000..7fb65521 Binary files /dev/null and b/src/dataset/sunflower/7034290597_06fe58d03d_c.jpg differ diff --git a/src/dataset/sunflower/7037839001_4d8a164cb1_c.jpg b/src/dataset/sunflower/7037839001_4d8a164cb1_c.jpg new file mode 100644 index 00000000..723c342e Binary files /dev/null and b/src/dataset/sunflower/7037839001_4d8a164cb1_c.jpg differ diff --git a/src/dataset/sunflower/7129745827_f7ce4f6efd_c.jpg b/src/dataset/sunflower/7129745827_f7ce4f6efd_c.jpg new file mode 100644 index 00000000..fa5c72df Binary files /dev/null and b/src/dataset/sunflower/7129745827_f7ce4f6efd_c.jpg differ diff --git a/src/dataset/sunflower/7129765621_e85fca6472_c.jpg b/src/dataset/sunflower/7129765621_e85fca6472_c.jpg new file mode 100644 index 00000000..38ce6961 Binary files /dev/null and b/src/dataset/sunflower/7129765621_e85fca6472_c.jpg differ diff --git a/src/dataset/sunflower/7152907589_638703fa3e_c.jpg b/src/dataset/sunflower/7152907589_638703fa3e_c.jpg new file mode 100644 index 00000000..d9172f10 Binary files /dev/null and b/src/dataset/sunflower/7152907589_638703fa3e_c.jpg differ diff --git a/src/dataset/sunflower/7168733793_e181bdb4e5_c.jpg b/src/dataset/sunflower/7168733793_e181bdb4e5_c.jpg new file mode 100644 index 00000000..17ca70e9 Binary files /dev/null and b/src/dataset/sunflower/7168733793_e181bdb4e5_c.jpg differ diff --git a/src/dataset/sunflower/7188283911_77cfc49e4f_c.jpg b/src/dataset/sunflower/7188283911_77cfc49e4f_c.jpg new file mode 100644 index 00000000..15915617 Binary files /dev/null and b/src/dataset/sunflower/7188283911_77cfc49e4f_c.jpg differ diff --git a/src/dataset/sunflower/7236707780_4ba92d6d3c_c.jpg b/src/dataset/sunflower/7236707780_4ba92d6d3c_c.jpg new file mode 100644 index 00000000..65f61d79 Binary files /dev/null and b/src/dataset/sunflower/7236707780_4ba92d6d3c_c.jpg differ diff --git a/src/dataset/sunflower/730197809_329d22d000_c.jpg b/src/dataset/sunflower/730197809_329d22d000_c.jpg new file mode 100644 index 00000000..5292ad0c Binary files /dev/null and b/src/dataset/sunflower/730197809_329d22d000_c.jpg differ diff --git a/src/dataset/sunflower/7305838118_8f5328aab8_c.jpg b/src/dataset/sunflower/7305838118_8f5328aab8_c.jpg new file mode 100644 index 00000000..00546441 Binary files /dev/null and b/src/dataset/sunflower/7305838118_8f5328aab8_c.jpg differ diff --git a/src/dataset/sunflower/7363858922_8b116892cd_c.jpg b/src/dataset/sunflower/7363858922_8b116892cd_c.jpg new file mode 100644 index 00000000..1b56f3f7 Binary files /dev/null and b/src/dataset/sunflower/7363858922_8b116892cd_c.jpg differ diff --git a/src/dataset/sunflower/7431497976_e5708f21bd_c.jpg b/src/dataset/sunflower/7431497976_e5708f21bd_c.jpg new file mode 100644 index 00000000..d30d717a Binary files /dev/null and b/src/dataset/sunflower/7431497976_e5708f21bd_c.jpg differ diff --git a/src/dataset/sunflower/7431498090_05373191e4_c.jpg b/src/dataset/sunflower/7431498090_05373191e4_c.jpg new file mode 100644 index 00000000..47333d07 Binary files /dev/null and b/src/dataset/sunflower/7431498090_05373191e4_c.jpg differ diff --git a/src/dataset/sunflower/7431498282_e32b547d57_c.jpg b/src/dataset/sunflower/7431498282_e32b547d57_c.jpg new file mode 100644 index 00000000..846ded24 Binary files /dev/null and b/src/dataset/sunflower/7431498282_e32b547d57_c.jpg differ diff --git a/src/dataset/sunflower/7437078984_b8d79e47c7_c.jpg b/src/dataset/sunflower/7437078984_b8d79e47c7_c.jpg new file mode 100644 index 00000000..0f9a1148 Binary files /dev/null and b/src/dataset/sunflower/7437078984_b8d79e47c7_c.jpg differ diff --git a/src/dataset/sunflower/7466719804_88ecefb4ab_c.jpg b/src/dataset/sunflower/7466719804_88ecefb4ab_c.jpg new file mode 100644 index 00000000..06c9a9a9 Binary files /dev/null and b/src/dataset/sunflower/7466719804_88ecefb4ab_c.jpg differ diff --git a/src/dataset/sunflower/7481330676_8be0135d25_c.jpg b/src/dataset/sunflower/7481330676_8be0135d25_c.jpg new file mode 100644 index 00000000..1e90d594 Binary files /dev/null and b/src/dataset/sunflower/7481330676_8be0135d25_c.jpg differ diff --git a/src/dataset/sunflower/7530251558_baf8d2a8c9_c.jpg b/src/dataset/sunflower/7530251558_baf8d2a8c9_c.jpg new file mode 100644 index 00000000..cd33deab Binary files /dev/null and b/src/dataset/sunflower/7530251558_baf8d2a8c9_c.jpg differ diff --git a/src/dataset/sunflower/7535827902_40b0251617_c.jpg b/src/dataset/sunflower/7535827902_40b0251617_c.jpg new file mode 100644 index 00000000..727a553d Binary files /dev/null and b/src/dataset/sunflower/7535827902_40b0251617_c.jpg differ diff --git a/src/dataset/sunflower/7551851762_bfdd956bb8_c.jpg b/src/dataset/sunflower/7551851762_bfdd956bb8_c.jpg new file mode 100644 index 00000000..d11e31e7 Binary files /dev/null and b/src/dataset/sunflower/7551851762_bfdd956bb8_c.jpg differ diff --git a/src/dataset/sunflower/7577081344_d7c07e9458_c.jpg b/src/dataset/sunflower/7577081344_d7c07e9458_c.jpg new file mode 100644 index 00000000..cd8e9717 Binary files /dev/null and b/src/dataset/sunflower/7577081344_d7c07e9458_c.jpg differ diff --git a/src/dataset/sunflower/7593233588_90ab0e68c9_c.jpg b/src/dataset/sunflower/7593233588_90ab0e68c9_c.jpg new file mode 100644 index 00000000..a3950d76 Binary files /dev/null and b/src/dataset/sunflower/7593233588_90ab0e68c9_c.jpg differ diff --git a/src/dataset/sunflower/7612929476_9e3843e688_c.jpg b/src/dataset/sunflower/7612929476_9e3843e688_c.jpg new file mode 100644 index 00000000..09c8db7f Binary files /dev/null and b/src/dataset/sunflower/7612929476_9e3843e688_c.jpg differ diff --git a/src/dataset/sunflower/7615258534_00728a1316_c.jpg b/src/dataset/sunflower/7615258534_00728a1316_c.jpg new file mode 100644 index 00000000..6d85cb60 Binary files /dev/null and b/src/dataset/sunflower/7615258534_00728a1316_c.jpg differ diff --git a/src/dataset/sunflower/7656308102_c8a8ee2992_c.jpg b/src/dataset/sunflower/7656308102_c8a8ee2992_c.jpg new file mode 100644 index 00000000..7858d0e4 Binary files /dev/null and b/src/dataset/sunflower/7656308102_c8a8ee2992_c.jpg differ diff --git a/src/dataset/sunflower/7656320470_1e7d18e850_c.jpg b/src/dataset/sunflower/7656320470_1e7d18e850_c.jpg new file mode 100644 index 00000000..c3d3dec2 Binary files /dev/null and b/src/dataset/sunflower/7656320470_1e7d18e850_c.jpg differ diff --git a/src/dataset/sunflower/7672205_9fa68c871f_c.jpg b/src/dataset/sunflower/7672205_9fa68c871f_c.jpg new file mode 100644 index 00000000..b313acd5 Binary files /dev/null and b/src/dataset/sunflower/7672205_9fa68c871f_c.jpg differ diff --git a/src/dataset/sunflower/7673145688_694fee57d0_c.jpg b/src/dataset/sunflower/7673145688_694fee57d0_c.jpg new file mode 100644 index 00000000..0c324e44 Binary files /dev/null and b/src/dataset/sunflower/7673145688_694fee57d0_c.jpg differ diff --git a/src/dataset/sunflower/7683723710_1c967e92a4_c.jpg b/src/dataset/sunflower/7683723710_1c967e92a4_c.jpg new file mode 100644 index 00000000..be51d836 Binary files /dev/null and b/src/dataset/sunflower/7683723710_1c967e92a4_c.jpg differ diff --git a/src/dataset/sunflower/7687670206_c61eddfd52_c.jpg b/src/dataset/sunflower/7687670206_c61eddfd52_c.jpg new file mode 100644 index 00000000..b1d35171 Binary files /dev/null and b/src/dataset/sunflower/7687670206_c61eddfd52_c.jpg differ diff --git a/src/dataset/sunflower/7687671068_e6de384a96_c.jpg b/src/dataset/sunflower/7687671068_e6de384a96_c.jpg new file mode 100644 index 00000000..587e2ccd Binary files /dev/null and b/src/dataset/sunflower/7687671068_e6de384a96_c.jpg differ diff --git a/src/dataset/sunflower/7687673280_8a8c4d2128_c.jpg b/src/dataset/sunflower/7687673280_8a8c4d2128_c.jpg new file mode 100644 index 00000000..eec2a974 Binary files /dev/null and b/src/dataset/sunflower/7687673280_8a8c4d2128_c.jpg differ diff --git a/src/dataset/sunflower/774458446_a6157e9f6e_c.jpg b/src/dataset/sunflower/774458446_a6157e9f6e_c.jpg new file mode 100644 index 00000000..484416ef Binary files /dev/null and b/src/dataset/sunflower/774458446_a6157e9f6e_c.jpg differ diff --git a/src/dataset/sunflower/7758707926_b397e545d0_c.jpg b/src/dataset/sunflower/7758707926_b397e545d0_c.jpg new file mode 100644 index 00000000..dbe41b0e Binary files /dev/null and b/src/dataset/sunflower/7758707926_b397e545d0_c.jpg differ diff --git a/src/dataset/sunflower/7787905294_c35d5e0005_c.jpg b/src/dataset/sunflower/7787905294_c35d5e0005_c.jpg new file mode 100644 index 00000000..23b162ec Binary files /dev/null and b/src/dataset/sunflower/7787905294_c35d5e0005_c.jpg differ diff --git a/src/dataset/sunflower/7805217330_f346ecf2e4_c.jpg b/src/dataset/sunflower/7805217330_f346ecf2e4_c.jpg new file mode 100644 index 00000000..d08e9c01 Binary files /dev/null and b/src/dataset/sunflower/7805217330_f346ecf2e4_c.jpg differ diff --git a/src/dataset/sunflower/7813722196_74c789fc70_c.jpg b/src/dataset/sunflower/7813722196_74c789fc70_c.jpg new file mode 100644 index 00000000..e97f6f54 Binary files /dev/null and b/src/dataset/sunflower/7813722196_74c789fc70_c.jpg differ diff --git a/src/dataset/sunflower/7817532452_9714719311_c.jpg b/src/dataset/sunflower/7817532452_9714719311_c.jpg new file mode 100644 index 00000000..bb8ba3a6 Binary files /dev/null and b/src/dataset/sunflower/7817532452_9714719311_c.jpg differ diff --git a/src/dataset/sunflower/7818435246_664a375c52_c.jpg b/src/dataset/sunflower/7818435246_664a375c52_c.jpg new file mode 100644 index 00000000..f9ec2ba5 Binary files /dev/null and b/src/dataset/sunflower/7818435246_664a375c52_c.jpg differ diff --git a/src/dataset/sunflower/7830387312_beac3765de_c.jpg b/src/dataset/sunflower/7830387312_beac3765de_c.jpg new file mode 100644 index 00000000..df82296b Binary files /dev/null and b/src/dataset/sunflower/7830387312_beac3765de_c.jpg differ diff --git a/src/dataset/sunflower/7834276974_a3941b5f52_c.jpg b/src/dataset/sunflower/7834276974_a3941b5f52_c.jpg new file mode 100644 index 00000000..f1d73a85 Binary files /dev/null and b/src/dataset/sunflower/7834276974_a3941b5f52_c.jpg differ diff --git a/src/dataset/sunflower/7835241316_9ca80dc788_c.jpg b/src/dataset/sunflower/7835241316_9ca80dc788_c.jpg new file mode 100644 index 00000000..94e0b73d Binary files /dev/null and b/src/dataset/sunflower/7835241316_9ca80dc788_c.jpg differ diff --git a/src/dataset/sunflower/7835243982_388eca3c89_c.jpg b/src/dataset/sunflower/7835243982_388eca3c89_c.jpg new file mode 100644 index 00000000..dc20e257 Binary files /dev/null and b/src/dataset/sunflower/7835243982_388eca3c89_c.jpg differ diff --git a/src/dataset/sunflower/7835246448_a8d763aacf_c.jpg b/src/dataset/sunflower/7835246448_a8d763aacf_c.jpg new file mode 100644 index 00000000..984e3655 Binary files /dev/null and b/src/dataset/sunflower/7835246448_a8d763aacf_c.jpg differ diff --git a/src/dataset/sunflower/7835248722_e4998b95ab_c.jpg b/src/dataset/sunflower/7835248722_e4998b95ab_c.jpg new file mode 100644 index 00000000..abccbb9b Binary files /dev/null and b/src/dataset/sunflower/7835248722_e4998b95ab_c.jpg differ diff --git a/src/dataset/sunflower/7839580380_8328b6b11a_c.jpg b/src/dataset/sunflower/7839580380_8328b6b11a_c.jpg new file mode 100644 index 00000000..c5dabd39 Binary files /dev/null and b/src/dataset/sunflower/7839580380_8328b6b11a_c.jpg differ diff --git a/src/dataset/sunflower/7855896698_a4583ff7be_c.jpg b/src/dataset/sunflower/7855896698_a4583ff7be_c.jpg new file mode 100644 index 00000000..7aef87de Binary files /dev/null and b/src/dataset/sunflower/7855896698_a4583ff7be_c.jpg differ diff --git a/src/dataset/sunflower/7857749950_e0e50e53a9_c.jpg b/src/dataset/sunflower/7857749950_e0e50e53a9_c.jpg new file mode 100644 index 00000000..25ed2027 Binary files /dev/null and b/src/dataset/sunflower/7857749950_e0e50e53a9_c.jpg differ diff --git a/src/dataset/sunflower/7861765000_6b97afb457_c.jpg b/src/dataset/sunflower/7861765000_6b97afb457_c.jpg new file mode 100644 index 00000000..62d80212 Binary files /dev/null and b/src/dataset/sunflower/7861765000_6b97afb457_c.jpg differ diff --git a/src/dataset/sunflower/7878090852_46b1e89e08_c.jpg b/src/dataset/sunflower/7878090852_46b1e89e08_c.jpg new file mode 100644 index 00000000..b194f48e Binary files /dev/null and b/src/dataset/sunflower/7878090852_46b1e89e08_c.jpg differ diff --git a/src/dataset/sunflower/7909435708_7be0e0db0d_c.jpg b/src/dataset/sunflower/7909435708_7be0e0db0d_c.jpg new file mode 100644 index 00000000..3a454da4 Binary files /dev/null and b/src/dataset/sunflower/7909435708_7be0e0db0d_c.jpg differ diff --git a/src/dataset/sunflower/7915751800_fe382af618_c.jpg b/src/dataset/sunflower/7915751800_fe382af618_c.jpg new file mode 100644 index 00000000..60e6c2b3 Binary files /dev/null and b/src/dataset/sunflower/7915751800_fe382af618_c.jpg differ diff --git a/src/dataset/sunflower/7925476456_1b189b9cae_c.jpg b/src/dataset/sunflower/7925476456_1b189b9cae_c.jpg new file mode 100644 index 00000000..13aaacd6 Binary files /dev/null and b/src/dataset/sunflower/7925476456_1b189b9cae_c.jpg differ diff --git a/src/dataset/sunflower/7936570388_3909059798_c.jpg b/src/dataset/sunflower/7936570388_3909059798_c.jpg new file mode 100644 index 00000000..abd1ed23 Binary files /dev/null and b/src/dataset/sunflower/7936570388_3909059798_c.jpg differ diff --git a/src/dataset/sunflower/7951688580_9eaf81089c_c.jpg b/src/dataset/sunflower/7951688580_9eaf81089c_c.jpg new file mode 100644 index 00000000..81b77986 Binary files /dev/null and b/src/dataset/sunflower/7951688580_9eaf81089c_c.jpg differ diff --git a/src/dataset/sunflower/7955084726_16e1424e3e_c.jpg b/src/dataset/sunflower/7955084726_16e1424e3e_c.jpg new file mode 100644 index 00000000..47d27008 Binary files /dev/null and b/src/dataset/sunflower/7955084726_16e1424e3e_c.jpg differ diff --git a/src/dataset/sunflower/79664056_b8ebb5d844_c.jpg b/src/dataset/sunflower/79664056_b8ebb5d844_c.jpg new file mode 100644 index 00000000..bfce59fc Binary files /dev/null and b/src/dataset/sunflower/79664056_b8ebb5d844_c.jpg differ diff --git a/src/dataset/sunflower/7973212856_a7bfb17c8d_c.jpg b/src/dataset/sunflower/7973212856_a7bfb17c8d_c.jpg new file mode 100644 index 00000000..70862ab5 Binary files /dev/null and b/src/dataset/sunflower/7973212856_a7bfb17c8d_c.jpg differ diff --git a/src/dataset/sunflower/7982138674_12af120d49_c.jpg b/src/dataset/sunflower/7982138674_12af120d49_c.jpg new file mode 100644 index 00000000..b25272a8 Binary files /dev/null and b/src/dataset/sunflower/7982138674_12af120d49_c.jpg differ diff --git a/src/dataset/sunflower/7993820473_ca8b44beaa_c.jpg b/src/dataset/sunflower/7993820473_ca8b44beaa_c.jpg new file mode 100644 index 00000000..54709abb Binary files /dev/null and b/src/dataset/sunflower/7993820473_ca8b44beaa_c.jpg differ diff --git a/src/dataset/sunflower/8015528949_2aef3825d9_c.jpg b/src/dataset/sunflower/8015528949_2aef3825d9_c.jpg new file mode 100644 index 00000000..515a2e9e Binary files /dev/null and b/src/dataset/sunflower/8015528949_2aef3825d9_c.jpg differ diff --git a/src/dataset/sunflower/8079654222_04b01a1b5c_c.jpg b/src/dataset/sunflower/8079654222_04b01a1b5c_c.jpg new file mode 100644 index 00000000..a4eb95d9 Binary files /dev/null and b/src/dataset/sunflower/8079654222_04b01a1b5c_c.jpg differ diff --git a/src/dataset/sunflower/8080210306_526a8364de_c.jpg b/src/dataset/sunflower/8080210306_526a8364de_c.jpg new file mode 100644 index 00000000..9481c1a7 Binary files /dev/null and b/src/dataset/sunflower/8080210306_526a8364de_c.jpg differ diff --git a/src/dataset/sunflower/8080210764_e673a3f7d6_c.jpg b/src/dataset/sunflower/8080210764_e673a3f7d6_c.jpg new file mode 100644 index 00000000..309f568a Binary files /dev/null and b/src/dataset/sunflower/8080210764_e673a3f7d6_c.jpg differ diff --git a/src/dataset/sunflower/8080216215_a944a2b2a5_c.jpg b/src/dataset/sunflower/8080216215_a944a2b2a5_c.jpg new file mode 100644 index 00000000..58080df4 Binary files /dev/null and b/src/dataset/sunflower/8080216215_a944a2b2a5_c.jpg differ diff --git a/src/dataset/sunflower/8120665864_9e9d0d184d_c.jpg b/src/dataset/sunflower/8120665864_9e9d0d184d_c.jpg new file mode 100644 index 00000000..df20daef Binary files /dev/null and b/src/dataset/sunflower/8120665864_9e9d0d184d_c.jpg differ diff --git a/src/dataset/sunflower/8120669178_cb6711beb6_c.jpg b/src/dataset/sunflower/8120669178_cb6711beb6_c.jpg new file mode 100644 index 00000000..79ccaffe Binary files /dev/null and b/src/dataset/sunflower/8120669178_cb6711beb6_c.jpg differ diff --git a/src/dataset/sunflower/8192839597_d96f0538e3_c.jpg b/src/dataset/sunflower/8192839597_d96f0538e3_c.jpg new file mode 100644 index 00000000..189135ea Binary files /dev/null and b/src/dataset/sunflower/8192839597_d96f0538e3_c.jpg differ diff --git a/src/dataset/sunflower/8201295037_a6d9d7e3f8_c.jpg b/src/dataset/sunflower/8201295037_a6d9d7e3f8_c.jpg new file mode 100644 index 00000000..a66457b9 Binary files /dev/null and b/src/dataset/sunflower/8201295037_a6d9d7e3f8_c.jpg differ diff --git a/src/dataset/sunflower/8275992143_10ca55f270_c.jpg b/src/dataset/sunflower/8275992143_10ca55f270_c.jpg new file mode 100644 index 00000000..ce0bb41a Binary files /dev/null and b/src/dataset/sunflower/8275992143_10ca55f270_c.jpg differ diff --git a/src/dataset/sunflower/8311628633_0b4b26da1d_c.jpg b/src/dataset/sunflower/8311628633_0b4b26da1d_c.jpg new file mode 100644 index 00000000..ddcf6207 Binary files /dev/null and b/src/dataset/sunflower/8311628633_0b4b26da1d_c.jpg differ diff --git a/src/dataset/sunflower/8312205552_01ae18370b_c.jpg b/src/dataset/sunflower/8312205552_01ae18370b_c.jpg new file mode 100644 index 00000000..3f476dc5 Binary files /dev/null and b/src/dataset/sunflower/8312205552_01ae18370b_c.jpg differ diff --git a/src/dataset/sunflower/8347721748_0357a00209_c.jpg b/src/dataset/sunflower/8347721748_0357a00209_c.jpg new file mode 100644 index 00000000..cb4c2f1e Binary files /dev/null and b/src/dataset/sunflower/8347721748_0357a00209_c.jpg differ diff --git a/src/dataset/sunflower/835750342_625e685ceb_c.jpg b/src/dataset/sunflower/835750342_625e685ceb_c.jpg new file mode 100644 index 00000000..7e147977 Binary files /dev/null and b/src/dataset/sunflower/835750342_625e685ceb_c.jpg differ diff --git a/src/dataset/sunflower/836350493_dfc6326c37_c.jpg b/src/dataset/sunflower/836350493_dfc6326c37_c.jpg new file mode 100644 index 00000000..1ae63715 Binary files /dev/null and b/src/dataset/sunflower/836350493_dfc6326c37_c.jpg differ diff --git a/src/dataset/sunflower/837229370_25445e615b_c.jpg b/src/dataset/sunflower/837229370_25445e615b_c.jpg new file mode 100644 index 00000000..c5255845 Binary files /dev/null and b/src/dataset/sunflower/837229370_25445e615b_c.jpg differ diff --git a/src/dataset/sunflower/8376899463_59b3228674_c.jpg b/src/dataset/sunflower/8376899463_59b3228674_c.jpg new file mode 100644 index 00000000..91f9c654 Binary files /dev/null and b/src/dataset/sunflower/8376899463_59b3228674_c.jpg differ diff --git a/src/dataset/sunflower/838025793_d08af5a33b_c.jpg b/src/dataset/sunflower/838025793_d08af5a33b_c.jpg new file mode 100644 index 00000000..1fcaa3e2 Binary files /dev/null and b/src/dataset/sunflower/838025793_d08af5a33b_c.jpg differ diff --git a/src/dataset/sunflower/84478425_fc15909256_c.jpg b/src/dataset/sunflower/84478425_fc15909256_c.jpg new file mode 100644 index 00000000..da320837 Binary files /dev/null and b/src/dataset/sunflower/84478425_fc15909256_c.jpg differ diff --git a/src/dataset/sunflower/8452189255_671f2ac545_c.jpg b/src/dataset/sunflower/8452189255_671f2ac545_c.jpg new file mode 100644 index 00000000..be71e1a9 Binary files /dev/null and b/src/dataset/sunflower/8452189255_671f2ac545_c.jpg differ diff --git a/src/dataset/sunflower/8452189687_1c463315a1_c.jpg b/src/dataset/sunflower/8452189687_1c463315a1_c.jpg new file mode 100644 index 00000000..13d2954e Binary files /dev/null and b/src/dataset/sunflower/8452189687_1c463315a1_c.jpg differ diff --git a/src/dataset/sunflower/8452191853_9001c810fd_c.jpg b/src/dataset/sunflower/8452191853_9001c810fd_c.jpg new file mode 100644 index 00000000..3e7bce05 Binary files /dev/null and b/src/dataset/sunflower/8452191853_9001c810fd_c.jpg differ diff --git a/src/dataset/sunflower/8452192231_925ff6043e_c.jpg b/src/dataset/sunflower/8452192231_925ff6043e_c.jpg new file mode 100644 index 00000000..f7586327 Binary files /dev/null and b/src/dataset/sunflower/8452192231_925ff6043e_c.jpg differ diff --git a/src/dataset/sunflower/8452192435_f6df027bcd_c.jpg b/src/dataset/sunflower/8452192435_f6df027bcd_c.jpg new file mode 100644 index 00000000..6b50af32 Binary files /dev/null and b/src/dataset/sunflower/8452192435_f6df027bcd_c.jpg differ diff --git a/src/dataset/sunflower/8452367014_e0685941c1_c.jpg b/src/dataset/sunflower/8452367014_e0685941c1_c.jpg new file mode 100644 index 00000000..652e66d8 Binary files /dev/null and b/src/dataset/sunflower/8452367014_e0685941c1_c.jpg differ diff --git a/src/dataset/sunflower/8453280116_96ec9d4e0c_c.jpg b/src/dataset/sunflower/8453280116_96ec9d4e0c_c.jpg new file mode 100644 index 00000000..f7838df2 Binary files /dev/null and b/src/dataset/sunflower/8453280116_96ec9d4e0c_c.jpg differ diff --git a/src/dataset/sunflower/8453280570_d7a0a15c9b_c.jpg b/src/dataset/sunflower/8453280570_d7a0a15c9b_c.jpg new file mode 100644 index 00000000..de0aae11 Binary files /dev/null and b/src/dataset/sunflower/8453280570_d7a0a15c9b_c.jpg differ diff --git a/src/dataset/sunflower/8453280996_0dbbc9e527_c.jpg b/src/dataset/sunflower/8453280996_0dbbc9e527_c.jpg new file mode 100644 index 00000000..e69235ac Binary files /dev/null and b/src/dataset/sunflower/8453280996_0dbbc9e527_c.jpg differ diff --git a/src/dataset/sunflower/8453283150_2bd847d8ef_c.jpg b/src/dataset/sunflower/8453283150_2bd847d8ef_c.jpg new file mode 100644 index 00000000..49412c83 Binary files /dev/null and b/src/dataset/sunflower/8453283150_2bd847d8ef_c.jpg differ diff --git a/src/dataset/sunflower/8453283810_a44cbc9d1e_c.jpg b/src/dataset/sunflower/8453283810_a44cbc9d1e_c.jpg new file mode 100644 index 00000000..16ac8b9a Binary files /dev/null and b/src/dataset/sunflower/8453283810_a44cbc9d1e_c.jpg differ diff --git a/src/dataset/sunflower/853268672_ddaa71e488_c.jpg b/src/dataset/sunflower/853268672_ddaa71e488_c.jpg new file mode 100644 index 00000000..0051e992 Binary files /dev/null and b/src/dataset/sunflower/853268672_ddaa71e488_c.jpg differ diff --git a/src/dataset/sunflower/8591245253_b34f6c3f2d_c.jpg b/src/dataset/sunflower/8591245253_b34f6c3f2d_c.jpg new file mode 100644 index 00000000..6106f228 Binary files /dev/null and b/src/dataset/sunflower/8591245253_b34f6c3f2d_c.jpg differ diff --git a/src/dataset/sunflower/8610469189_3d96c5c756_c.jpg b/src/dataset/sunflower/8610469189_3d96c5c756_c.jpg new file mode 100644 index 00000000..5cc58103 Binary files /dev/null and b/src/dataset/sunflower/8610469189_3d96c5c756_c.jpg differ diff --git a/src/dataset/sunflower/8614311229_2bb50622de_c.jpg b/src/dataset/sunflower/8614311229_2bb50622de_c.jpg new file mode 100644 index 00000000..6e2fad81 Binary files /dev/null and b/src/dataset/sunflower/8614311229_2bb50622de_c.jpg differ diff --git a/src/dataset/sunflower/867129965_e9d3d14725_c.jpg b/src/dataset/sunflower/867129965_e9d3d14725_c.jpg new file mode 100644 index 00000000..ae4ebd6a Binary files /dev/null and b/src/dataset/sunflower/867129965_e9d3d14725_c.jpg differ diff --git a/src/dataset/sunflower/872711166_dc11b5c4b4_c.jpg b/src/dataset/sunflower/872711166_dc11b5c4b4_c.jpg new file mode 100644 index 00000000..4d9b1a2a Binary files /dev/null and b/src/dataset/sunflower/872711166_dc11b5c4b4_c.jpg differ diff --git a/src/dataset/sunflower/8803272728_0d30acefe9_c.jpg b/src/dataset/sunflower/8803272728_0d30acefe9_c.jpg new file mode 100644 index 00000000..13d7aa27 Binary files /dev/null and b/src/dataset/sunflower/8803272728_0d30acefe9_c.jpg differ diff --git a/src/dataset/sunflower/880765266_0c992397ec_c.jpg b/src/dataset/sunflower/880765266_0c992397ec_c.jpg new file mode 100644 index 00000000..e6e267e8 Binary files /dev/null and b/src/dataset/sunflower/880765266_0c992397ec_c.jpg differ diff --git a/src/dataset/sunflower/9080082915_ff6484fc68_c.jpg b/src/dataset/sunflower/9080082915_ff6484fc68_c.jpg new file mode 100644 index 00000000..60bb8894 Binary files /dev/null and b/src/dataset/sunflower/9080082915_ff6484fc68_c.jpg differ diff --git a/src/dataset/sunflower/9080112409_22286757f9_c.jpg b/src/dataset/sunflower/9080112409_22286757f9_c.jpg new file mode 100644 index 00000000..c1ec3fc3 Binary files /dev/null and b/src/dataset/sunflower/9080112409_22286757f9_c.jpg differ diff --git a/src/dataset/sunflower/9082511618_1db9824358_c.jpg b/src/dataset/sunflower/9082511618_1db9824358_c.jpg new file mode 100644 index 00000000..54e78303 Binary files /dev/null and b/src/dataset/sunflower/9082511618_1db9824358_c.jpg differ diff --git a/src/dataset/sunflower/9102424342_b082dbd1b2_c.jpg b/src/dataset/sunflower/9102424342_b082dbd1b2_c.jpg new file mode 100644 index 00000000..1a1481e7 Binary files /dev/null and b/src/dataset/sunflower/9102424342_b082dbd1b2_c.jpg differ diff --git a/src/dataset/sunflower/9245442958_833975e9db_c.jpg b/src/dataset/sunflower/9245442958_833975e9db_c.jpg new file mode 100644 index 00000000..4112ba87 Binary files /dev/null and b/src/dataset/sunflower/9245442958_833975e9db_c.jpg differ diff --git a/src/dataset/sunflower/9340903870_12ca82cfe3_c.jpg b/src/dataset/sunflower/9340903870_12ca82cfe3_c.jpg new file mode 100644 index 00000000..1f193c23 Binary files /dev/null and b/src/dataset/sunflower/9340903870_12ca82cfe3_c.jpg differ diff --git a/src/dataset/sunflower/9366589980_52e417bb62_c.jpg b/src/dataset/sunflower/9366589980_52e417bb62_c.jpg new file mode 100644 index 00000000..55b5fd9a Binary files /dev/null and b/src/dataset/sunflower/9366589980_52e417bb62_c.jpg differ diff --git a/src/dataset/sunflower/9372915013_2aae9798ea_c.jpg b/src/dataset/sunflower/9372915013_2aae9798ea_c.jpg new file mode 100644 index 00000000..0c24f46a Binary files /dev/null and b/src/dataset/sunflower/9372915013_2aae9798ea_c.jpg differ diff --git a/src/dataset/sunflower/94064437_3bec1c07f3_c.jpg b/src/dataset/sunflower/94064437_3bec1c07f3_c.jpg new file mode 100644 index 00000000..f3ac3792 Binary files /dev/null and b/src/dataset/sunflower/94064437_3bec1c07f3_c.jpg differ diff --git a/src/dataset/sunflower/9408557741_b2cb437f10_c.jpg b/src/dataset/sunflower/9408557741_b2cb437f10_c.jpg new file mode 100644 index 00000000..8348c48f Binary files /dev/null and b/src/dataset/sunflower/9408557741_b2cb437f10_c.jpg differ diff --git a/src/dataset/sunflower/9436362241_7f5728d0d8_c.jpg b/src/dataset/sunflower/9436362241_7f5728d0d8_c.jpg new file mode 100644 index 00000000..07ada457 Binary files /dev/null and b/src/dataset/sunflower/9436362241_7f5728d0d8_c.jpg differ diff --git a/src/dataset/sunflower/9436380581_5ab0733323_c.jpg b/src/dataset/sunflower/9436380581_5ab0733323_c.jpg new file mode 100644 index 00000000..6c2417f6 Binary files /dev/null and b/src/dataset/sunflower/9436380581_5ab0733323_c.jpg differ diff --git a/src/dataset/sunflower/9470834318_a48d3fd5a5_c.jpg b/src/dataset/sunflower/9470834318_a48d3fd5a5_c.jpg new file mode 100644 index 00000000..432c0d1f Binary files /dev/null and b/src/dataset/sunflower/9470834318_a48d3fd5a5_c.jpg differ diff --git a/src/dataset/sunflower/9473869886_3e7b06907c_c.jpg b/src/dataset/sunflower/9473869886_3e7b06907c_c.jpg new file mode 100644 index 00000000..dcb8e1f6 Binary files /dev/null and b/src/dataset/sunflower/9473869886_3e7b06907c_c.jpg differ diff --git a/src/dataset/sunflower/9488214560_e2151e428c_c.jpg b/src/dataset/sunflower/9488214560_e2151e428c_c.jpg new file mode 100644 index 00000000..c7e77f8d Binary files /dev/null and b/src/dataset/sunflower/9488214560_e2151e428c_c.jpg differ diff --git a/src/dataset/sunflower/9491570667_5d7deb586b_c.jpg b/src/dataset/sunflower/9491570667_5d7deb586b_c.jpg new file mode 100644 index 00000000..b15dcb58 Binary files /dev/null and b/src/dataset/sunflower/9491570667_5d7deb586b_c.jpg differ diff --git a/src/dataset/sunflower/9491570847_72dee5d230_c.jpg b/src/dataset/sunflower/9491570847_72dee5d230_c.jpg new file mode 100644 index 00000000..ebc77829 Binary files /dev/null and b/src/dataset/sunflower/9491570847_72dee5d230_c.jpg differ diff --git a/src/dataset/sunflower/9491677668_329c4c5603_c.jpg b/src/dataset/sunflower/9491677668_329c4c5603_c.jpg new file mode 100644 index 00000000..8cd2e8a6 Binary files /dev/null and b/src/dataset/sunflower/9491677668_329c4c5603_c.jpg differ diff --git a/src/dataset/sunflower/950465759_2d21ce8326_c.jpg b/src/dataset/sunflower/950465759_2d21ce8326_c.jpg new file mode 100644 index 00000000..256e1be7 Binary files /dev/null and b/src/dataset/sunflower/950465759_2d21ce8326_c.jpg differ diff --git a/src/dataset/sunflower/9507923014_fe77a0f730_c.jpg b/src/dataset/sunflower/9507923014_fe77a0f730_c.jpg new file mode 100644 index 00000000..40a44fc7 Binary files /dev/null and b/src/dataset/sunflower/9507923014_fe77a0f730_c.jpg differ diff --git a/src/dataset/sunflower/9527557189_641dd6d4e0_c.jpg b/src/dataset/sunflower/9527557189_641dd6d4e0_c.jpg new file mode 100644 index 00000000..3b98a547 Binary files /dev/null and b/src/dataset/sunflower/9527557189_641dd6d4e0_c.jpg differ diff --git a/src/dataset/sunflower/9537042285_70b16caf05_c.jpg b/src/dataset/sunflower/9537042285_70b16caf05_c.jpg new file mode 100644 index 00000000..6d462a5c Binary files /dev/null and b/src/dataset/sunflower/9537042285_70b16caf05_c.jpg differ diff --git a/src/dataset/sunflower/9538450028_4358c80ccd_c.jpg b/src/dataset/sunflower/9538450028_4358c80ccd_c.jpg new file mode 100644 index 00000000..e6aae901 Binary files /dev/null and b/src/dataset/sunflower/9538450028_4358c80ccd_c.jpg differ diff --git a/src/dataset/sunflower/9560327458_486e53bc6f_c.jpg b/src/dataset/sunflower/9560327458_486e53bc6f_c.jpg new file mode 100644 index 00000000..30bc236e Binary files /dev/null and b/src/dataset/sunflower/9560327458_486e53bc6f_c.jpg differ diff --git a/src/dataset/sunflower/9568754307_cb4fe18c5d_c.jpg b/src/dataset/sunflower/9568754307_cb4fe18c5d_c.jpg new file mode 100644 index 00000000..6bee7372 Binary files /dev/null and b/src/dataset/sunflower/9568754307_cb4fe18c5d_c.jpg differ diff --git a/src/dataset/sunflower/9592854484_ba9494a015_c.jpg b/src/dataset/sunflower/9592854484_ba9494a015_c.jpg new file mode 100644 index 00000000..dcc25520 Binary files /dev/null and b/src/dataset/sunflower/9592854484_ba9494a015_c.jpg differ diff --git a/src/dataset/sunflower/9613472229_67b635fffd_c.jpg b/src/dataset/sunflower/9613472229_67b635fffd_c.jpg new file mode 100644 index 00000000..11ba0042 Binary files /dev/null and b/src/dataset/sunflower/9613472229_67b635fffd_c.jpg differ diff --git a/src/dataset/sunflower/9617413310_3b05811da7_c.jpg b/src/dataset/sunflower/9617413310_3b05811da7_c.jpg new file mode 100644 index 00000000..fb6897c4 Binary files /dev/null and b/src/dataset/sunflower/9617413310_3b05811da7_c.jpg differ diff --git a/src/dataset/sunflower/9622118638_f00f903fcb_c.jpg b/src/dataset/sunflower/9622118638_f00f903fcb_c.jpg new file mode 100644 index 00000000..6c9e28d7 Binary files /dev/null and b/src/dataset/sunflower/9622118638_f00f903fcb_c.jpg differ diff --git a/src/dataset/sunflower/9658807044_50e68c24b0_c.jpg b/src/dataset/sunflower/9658807044_50e68c24b0_c.jpg new file mode 100644 index 00000000..b022a790 Binary files /dev/null and b/src/dataset/sunflower/9658807044_50e68c24b0_c.jpg differ diff --git a/src/dataset/sunflower/9666018052_04ff606e1b_c.jpg b/src/dataset/sunflower/9666018052_04ff606e1b_c.jpg new file mode 100644 index 00000000..99fd5b07 Binary files /dev/null and b/src/dataset/sunflower/9666018052_04ff606e1b_c.jpg differ diff --git a/src/dataset/sunflower/9685540179_1318254025_c.jpg b/src/dataset/sunflower/9685540179_1318254025_c.jpg new file mode 100644 index 00000000..b7b19655 Binary files /dev/null and b/src/dataset/sunflower/9685540179_1318254025_c.jpg differ diff --git a/src/dataset/sunflower/9685577215_992b700479_c.jpg b/src/dataset/sunflower/9685577215_992b700479_c.jpg new file mode 100644 index 00000000..234a3071 Binary files /dev/null and b/src/dataset/sunflower/9685577215_992b700479_c.jpg differ diff --git a/src/dataset/sunflower/9688772900_427e0083e7_c.jpg b/src/dataset/sunflower/9688772900_427e0083e7_c.jpg new file mode 100644 index 00000000..d60d6e7c Binary files /dev/null and b/src/dataset/sunflower/9688772900_427e0083e7_c.jpg differ diff --git a/src/dataset/sunflower/9700099581_e7f98643ac_c.jpg b/src/dataset/sunflower/9700099581_e7f98643ac_c.jpg new file mode 100644 index 00000000..7852b7ad Binary files /dev/null and b/src/dataset/sunflower/9700099581_e7f98643ac_c.jpg differ diff --git a/src/dataset/sunflower/9701367714_3bbc58dcb0_c.jpg b/src/dataset/sunflower/9701367714_3bbc58dcb0_c.jpg new file mode 100644 index 00000000..a8b67e04 Binary files /dev/null and b/src/dataset/sunflower/9701367714_3bbc58dcb0_c.jpg differ diff --git a/src/dataset/sunflower/9718518727_0f0c909197_c.jpg b/src/dataset/sunflower/9718518727_0f0c909197_c.jpg new file mode 100644 index 00000000..0e991483 Binary files /dev/null and b/src/dataset/sunflower/9718518727_0f0c909197_c.jpg differ diff --git a/src/dataset/sunflower/9718520969_9dabea8e2f_c.jpg b/src/dataset/sunflower/9718520969_9dabea8e2f_c.jpg new file mode 100644 index 00000000..93098aab Binary files /dev/null and b/src/dataset/sunflower/9718520969_9dabea8e2f_c.jpg differ diff --git a/src/dataset/sunflower/9721753036_59fa5e9bb8_c.jpg b/src/dataset/sunflower/9721753036_59fa5e9bb8_c.jpg new file mode 100644 index 00000000..7e24f3e1 Binary files /dev/null and b/src/dataset/sunflower/9721753036_59fa5e9bb8_c.jpg differ diff --git a/src/dataset/sunflower/9753634824_eb861243cc_c.jpg b/src/dataset/sunflower/9753634824_eb861243cc_c.jpg new file mode 100644 index 00000000..aeac0f86 Binary files /dev/null and b/src/dataset/sunflower/9753634824_eb861243cc_c.jpg differ diff --git a/src/dataset/sunflower/9798346653_967229bc49_c.jpg b/src/dataset/sunflower/9798346653_967229bc49_c.jpg new file mode 100644 index 00000000..3c6e78f4 Binary files /dev/null and b/src/dataset/sunflower/9798346653_967229bc49_c.jpg differ diff --git a/src/dataset/sunflower/9904049374_88da37aef0_c.jpg b/src/dataset/sunflower/9904049374_88da37aef0_c.jpg new file mode 100644 index 00000000..355cf24c Binary files /dev/null and b/src/dataset/sunflower/9904049374_88da37aef0_c.jpg differ diff --git a/src/dataset/sunflower/999734703_d1633419ff_c.jpg b/src/dataset/sunflower/999734703_d1633419ff_c.jpg new file mode 100644 index 00000000..831dd299 Binary files /dev/null and b/src/dataset/sunflower/999734703_d1633419ff_c.jpg differ diff --git a/src/dataset/tulip/10005307274_08bd7499e2_c.jpg b/src/dataset/tulip/10005307274_08bd7499e2_c.jpg new file mode 100644 index 00000000..2a55cea2 Binary files /dev/null and b/src/dataset/tulip/10005307274_08bd7499e2_c.jpg differ diff --git a/src/dataset/tulip/10142451266_0c50a6a300_c.jpg b/src/dataset/tulip/10142451266_0c50a6a300_c.jpg new file mode 100644 index 00000000..41fb12db Binary files /dev/null and b/src/dataset/tulip/10142451266_0c50a6a300_c.jpg differ diff --git a/src/dataset/tulip/10356686204_22242d874d_c.jpg b/src/dataset/tulip/10356686204_22242d874d_c.jpg new file mode 100644 index 00000000..f62b2dae Binary files /dev/null and b/src/dataset/tulip/10356686204_22242d874d_c.jpg differ diff --git a/src/dataset/tulip/10356692494_81937a002f_c.jpg b/src/dataset/tulip/10356692494_81937a002f_c.jpg new file mode 100644 index 00000000..c48201b6 Binary files /dev/null and b/src/dataset/tulip/10356692494_81937a002f_c.jpg differ diff --git a/src/dataset/tulip/10356694624_cd918bf87a_c.jpg b/src/dataset/tulip/10356694624_cd918bf87a_c.jpg new file mode 100644 index 00000000..1f66c929 Binary files /dev/null and b/src/dataset/tulip/10356694624_cd918bf87a_c.jpg differ diff --git a/src/dataset/tulip/10356694865_f791f14656_c.jpg b/src/dataset/tulip/10356694865_f791f14656_c.jpg new file mode 100644 index 00000000..9410a279 Binary files /dev/null and b/src/dataset/tulip/10356694865_f791f14656_c.jpg differ diff --git a/src/dataset/tulip/10356697466_7934d4038c_c.jpg b/src/dataset/tulip/10356697466_7934d4038c_c.jpg new file mode 100644 index 00000000..40bd2787 Binary files /dev/null and b/src/dataset/tulip/10356697466_7934d4038c_c.jpg differ diff --git a/src/dataset/tulip/10356698936_266dd2124f_c.jpg b/src/dataset/tulip/10356698936_266dd2124f_c.jpg new file mode 100644 index 00000000..624bc0f2 Binary files /dev/null and b/src/dataset/tulip/10356698936_266dd2124f_c.jpg differ diff --git a/src/dataset/tulip/10356885453_2259e1e2f1_c.jpg b/src/dataset/tulip/10356885453_2259e1e2f1_c.jpg new file mode 100644 index 00000000..001dc921 Binary files /dev/null and b/src/dataset/tulip/10356885453_2259e1e2f1_c.jpg differ diff --git a/src/dataset/tulip/10356889713_54786549bd_c.jpg b/src/dataset/tulip/10356889713_54786549bd_c.jpg new file mode 100644 index 00000000..c6169b7b Binary files /dev/null and b/src/dataset/tulip/10356889713_54786549bd_c.jpg differ diff --git a/src/dataset/tulip/10356890013_ca7dd05f4b_c.jpg b/src/dataset/tulip/10356890013_ca7dd05f4b_c.jpg new file mode 100644 index 00000000..b09c2de7 Binary files /dev/null and b/src/dataset/tulip/10356890013_ca7dd05f4b_c.jpg differ diff --git a/src/dataset/tulip/10400392606_37c44b32dc_c.jpg b/src/dataset/tulip/10400392606_37c44b32dc_c.jpg new file mode 100644 index 00000000..4f117609 Binary files /dev/null and b/src/dataset/tulip/10400392606_37c44b32dc_c.jpg differ diff --git a/src/dataset/tulip/10400415455_7a4796d598_c.jpg b/src/dataset/tulip/10400415455_7a4796d598_c.jpg new file mode 100644 index 00000000..6e51cd1a Binary files /dev/null and b/src/dataset/tulip/10400415455_7a4796d598_c.jpg differ diff --git a/src/dataset/tulip/10400564253_1abc05a6ae_c.jpg b/src/dataset/tulip/10400564253_1abc05a6ae_c.jpg new file mode 100644 index 00000000..4555eecb Binary files /dev/null and b/src/dataset/tulip/10400564253_1abc05a6ae_c.jpg differ diff --git a/src/dataset/tulip/10701654274_818033f09f_c.jpg b/src/dataset/tulip/10701654274_818033f09f_c.jpg new file mode 100644 index 00000000..38135fb0 Binary files /dev/null and b/src/dataset/tulip/10701654274_818033f09f_c.jpg differ diff --git a/src/dataset/tulip/10707317144_7ee33cf7c6_c.jpg b/src/dataset/tulip/10707317144_7ee33cf7c6_c.jpg new file mode 100644 index 00000000..1f241fd0 Binary files /dev/null and b/src/dataset/tulip/10707317144_7ee33cf7c6_c.jpg differ diff --git a/src/dataset/tulip/10709144844_2f8b60203c_c.jpg b/src/dataset/tulip/10709144844_2f8b60203c_c.jpg new file mode 100644 index 00000000..ec5b127b Binary files /dev/null and b/src/dataset/tulip/10709144844_2f8b60203c_c.jpg differ diff --git a/src/dataset/tulip/108001022_4d2f22323b_c.jpg b/src/dataset/tulip/108001022_4d2f22323b_c.jpg new file mode 100644 index 00000000..154ce196 Binary files /dev/null and b/src/dataset/tulip/108001022_4d2f22323b_c.jpg differ diff --git a/src/dataset/tulip/11026298_db8ac99532_c.jpg b/src/dataset/tulip/11026298_db8ac99532_c.jpg new file mode 100644 index 00000000..dc9b003f Binary files /dev/null and b/src/dataset/tulip/11026298_db8ac99532_c.jpg differ diff --git a/src/dataset/tulip/11036171_2aa5cf0325_c.jpg b/src/dataset/tulip/11036171_2aa5cf0325_c.jpg new file mode 100644 index 00000000..c9b1558c Binary files /dev/null and b/src/dataset/tulip/11036171_2aa5cf0325_c.jpg differ diff --git a/src/dataset/tulip/11446086885_7ca88d4ba0_c.jpg b/src/dataset/tulip/11446086885_7ca88d4ba0_c.jpg new file mode 100644 index 00000000..01ba9e49 Binary files /dev/null and b/src/dataset/tulip/11446086885_7ca88d4ba0_c.jpg differ diff --git a/src/dataset/tulip/11616648723_ff93f51ed0_c.jpg b/src/dataset/tulip/11616648723_ff93f51ed0_c.jpg new file mode 100644 index 00000000..a3a4a0c1 Binary files /dev/null and b/src/dataset/tulip/11616648723_ff93f51ed0_c.jpg differ diff --git a/src/dataset/tulip/11664222204_cf67d42ce5_c.jpg b/src/dataset/tulip/11664222204_cf67d42ce5_c.jpg new file mode 100644 index 00000000..c6294027 Binary files /dev/null and b/src/dataset/tulip/11664222204_cf67d42ce5_c.jpg differ diff --git a/src/dataset/tulip/11706032013_966a435fa8_c.jpg b/src/dataset/tulip/11706032013_966a435fa8_c.jpg new file mode 100644 index 00000000..89cf87d3 Binary files /dev/null and b/src/dataset/tulip/11706032013_966a435fa8_c.jpg differ diff --git a/src/dataset/tulip/1173712163_be8792e8c7_c.jpg b/src/dataset/tulip/1173712163_be8792e8c7_c.jpg new file mode 100644 index 00000000..deec4873 Binary files /dev/null and b/src/dataset/tulip/1173712163_be8792e8c7_c.jpg differ diff --git a/src/dataset/tulip/11752030196_0f0b747ba3_c.jpg b/src/dataset/tulip/11752030196_0f0b747ba3_c.jpg new file mode 100644 index 00000000..c5a5b1dc Binary files /dev/null and b/src/dataset/tulip/11752030196_0f0b747ba3_c.jpg differ diff --git a/src/dataset/tulip/11911988443_436e8c3be1_c.jpg b/src/dataset/tulip/11911988443_436e8c3be1_c.jpg new file mode 100644 index 00000000..5192e49d Binary files /dev/null and b/src/dataset/tulip/11911988443_436e8c3be1_c.jpg differ diff --git a/src/dataset/tulip/121811789_3fb50a213f_c.jpg b/src/dataset/tulip/121811789_3fb50a213f_c.jpg new file mode 100644 index 00000000..1b6a2bbf Binary files /dev/null and b/src/dataset/tulip/121811789_3fb50a213f_c.jpg differ diff --git a/src/dataset/tulip/122033121_0c4981d8a1_c.jpg b/src/dataset/tulip/122033121_0c4981d8a1_c.jpg new file mode 100644 index 00000000..a1092cee Binary files /dev/null and b/src/dataset/tulip/122033121_0c4981d8a1_c.jpg differ diff --git a/src/dataset/tulip/12268302143_cc20a9aee4_c.jpg b/src/dataset/tulip/12268302143_cc20a9aee4_c.jpg new file mode 100644 index 00000000..64a886df Binary files /dev/null and b/src/dataset/tulip/12268302143_cc20a9aee4_c.jpg differ diff --git a/src/dataset/tulip/12379575714_ef8b39671a_c.jpg b/src/dataset/tulip/12379575714_ef8b39671a_c.jpg new file mode 100644 index 00000000..082c01c6 Binary files /dev/null and b/src/dataset/tulip/12379575714_ef8b39671a_c.jpg differ diff --git a/src/dataset/tulip/12396147735_ffae6fa34f_c.jpg b/src/dataset/tulip/12396147735_ffae6fa34f_c.jpg new file mode 100644 index 00000000..4c0c3d46 Binary files /dev/null and b/src/dataset/tulip/12396147735_ffae6fa34f_c.jpg differ diff --git a/src/dataset/tulip/125029794_75ed297fce_c.jpg b/src/dataset/tulip/125029794_75ed297fce_c.jpg new file mode 100644 index 00000000..71dba7e1 Binary files /dev/null and b/src/dataset/tulip/125029794_75ed297fce_c.jpg differ diff --git a/src/dataset/tulip/12564772705_d48abd9f89_c.jpg b/src/dataset/tulip/12564772705_d48abd9f89_c.jpg new file mode 100644 index 00000000..060ab323 Binary files /dev/null and b/src/dataset/tulip/12564772705_d48abd9f89_c.jpg differ diff --git a/src/dataset/tulip/12594154_4950ffa83f_c.jpg b/src/dataset/tulip/12594154_4950ffa83f_c.jpg new file mode 100644 index 00000000..562b7b1f Binary files /dev/null and b/src/dataset/tulip/12594154_4950ffa83f_c.jpg differ diff --git a/src/dataset/tulip/126818253_4e4beb597b_c.jpg b/src/dataset/tulip/126818253_4e4beb597b_c.jpg new file mode 100644 index 00000000..5c7c8ba6 Binary files /dev/null and b/src/dataset/tulip/126818253_4e4beb597b_c.jpg differ diff --git a/src/dataset/tulip/12986871263_639e5e5d72_c.jpg b/src/dataset/tulip/12986871263_639e5e5d72_c.jpg new file mode 100644 index 00000000..30335489 Binary files /dev/null and b/src/dataset/tulip/12986871263_639e5e5d72_c.jpg differ diff --git a/src/dataset/tulip/129940748_56683e3386_c.jpg b/src/dataset/tulip/129940748_56683e3386_c.jpg new file mode 100644 index 00000000..8212a42a Binary files /dev/null and b/src/dataset/tulip/129940748_56683e3386_c.jpg differ diff --git a/src/dataset/tulip/129940841_8db3b2e332_c.jpg b/src/dataset/tulip/129940841_8db3b2e332_c.jpg new file mode 100644 index 00000000..ee53ac6b Binary files /dev/null and b/src/dataset/tulip/129940841_8db3b2e332_c.jpg differ diff --git a/src/dataset/tulip/129940870_a9307a1904_c.jpg b/src/dataset/tulip/129940870_a9307a1904_c.jpg new file mode 100644 index 00000000..5aed7744 Binary files /dev/null and b/src/dataset/tulip/129940870_a9307a1904_c.jpg differ diff --git a/src/dataset/tulip/129940894_7ab017c39f_c.jpg b/src/dataset/tulip/129940894_7ab017c39f_c.jpg new file mode 100644 index 00000000..09e906a4 Binary files /dev/null and b/src/dataset/tulip/129940894_7ab017c39f_c.jpg differ diff --git a/src/dataset/tulip/13042254693_569d46639a_c.jpg b/src/dataset/tulip/13042254693_569d46639a_c.jpg new file mode 100644 index 00000000..25464fc2 Binary files /dev/null and b/src/dataset/tulip/13042254693_569d46639a_c.jpg differ diff --git a/src/dataset/tulip/13094267155_d0ae6e744b_c.jpg b/src/dataset/tulip/13094267155_d0ae6e744b_c.jpg new file mode 100644 index 00000000..25031f1f Binary files /dev/null and b/src/dataset/tulip/13094267155_d0ae6e744b_c.jpg differ diff --git a/src/dataset/tulip/13094391953_e946cf6eb4_c.jpg b/src/dataset/tulip/13094391953_e946cf6eb4_c.jpg new file mode 100644 index 00000000..185a961f Binary files /dev/null and b/src/dataset/tulip/13094391953_e946cf6eb4_c.jpg differ diff --git a/src/dataset/tulip/13219123955_aa8f8cbd96_c.jpg b/src/dataset/tulip/13219123955_aa8f8cbd96_c.jpg new file mode 100644 index 00000000..b230e451 Binary files /dev/null and b/src/dataset/tulip/13219123955_aa8f8cbd96_c.jpg differ diff --git a/src/dataset/tulip/132750168_08c1cc8b9a_c.jpg b/src/dataset/tulip/132750168_08c1cc8b9a_c.jpg new file mode 100644 index 00000000..37ac3331 Binary files /dev/null and b/src/dataset/tulip/132750168_08c1cc8b9a_c.jpg differ diff --git a/src/dataset/tulip/13338689413_91e187283f_c.jpg b/src/dataset/tulip/13338689413_91e187283f_c.jpg new file mode 100644 index 00000000..b7eac977 Binary files /dev/null and b/src/dataset/tulip/13338689413_91e187283f_c.jpg differ diff --git a/src/dataset/tulip/13386922324_d8a04c4674_c.jpg b/src/dataset/tulip/13386922324_d8a04c4674_c.jpg new file mode 100644 index 00000000..5fb4379e Binary files /dev/null and b/src/dataset/tulip/13386922324_d8a04c4674_c.jpg differ diff --git a/src/dataset/tulip/13433150085_7f61aa1aa5_c.jpg b/src/dataset/tulip/13433150085_7f61aa1aa5_c.jpg new file mode 100644 index 00000000..a7e5f938 Binary files /dev/null and b/src/dataset/tulip/13433150085_7f61aa1aa5_c.jpg differ diff --git a/src/dataset/tulip/13469886535_0f50f02eb9_c.jpg b/src/dataset/tulip/13469886535_0f50f02eb9_c.jpg new file mode 100644 index 00000000..9836b69c Binary files /dev/null and b/src/dataset/tulip/13469886535_0f50f02eb9_c.jpg differ diff --git a/src/dataset/tulip/13501543664_3f3a6760c1_c.jpg b/src/dataset/tulip/13501543664_3f3a6760c1_c.jpg new file mode 100644 index 00000000..1fc4860d Binary files /dev/null and b/src/dataset/tulip/13501543664_3f3a6760c1_c.jpg differ diff --git a/src/dataset/tulip/13527874805_b43e750043_c.jpg b/src/dataset/tulip/13527874805_b43e750043_c.jpg new file mode 100644 index 00000000..23b76879 Binary files /dev/null and b/src/dataset/tulip/13527874805_b43e750043_c.jpg differ diff --git a/src/dataset/tulip/13527971223_17b0362848_c.jpg b/src/dataset/tulip/13527971223_17b0362848_c.jpg new file mode 100644 index 00000000..e5934f70 Binary files /dev/null and b/src/dataset/tulip/13527971223_17b0362848_c.jpg differ diff --git a/src/dataset/tulip/135680962_d6e32b7393_c.jpg b/src/dataset/tulip/135680962_d6e32b7393_c.jpg new file mode 100644 index 00000000..dc3679b1 Binary files /dev/null and b/src/dataset/tulip/135680962_d6e32b7393_c.jpg differ diff --git a/src/dataset/tulip/13580184525_0bb9331864_c.jpg b/src/dataset/tulip/13580184525_0bb9331864_c.jpg new file mode 100644 index 00000000..0dc4717a Binary files /dev/null and b/src/dataset/tulip/13580184525_0bb9331864_c.jpg differ diff --git a/src/dataset/tulip/13592436983_f0e42873a7_c.jpg b/src/dataset/tulip/13592436983_f0e42873a7_c.jpg new file mode 100644 index 00000000..66d49d40 Binary files /dev/null and b/src/dataset/tulip/13592436983_f0e42873a7_c.jpg differ diff --git a/src/dataset/tulip/13592507555_97b652faff_c.jpg b/src/dataset/tulip/13592507555_97b652faff_c.jpg new file mode 100644 index 00000000..13daa4c2 Binary files /dev/null and b/src/dataset/tulip/13592507555_97b652faff_c.jpg differ diff --git a/src/dataset/tulip/13592509245_43329e904b_c.jpg b/src/dataset/tulip/13592509245_43329e904b_c.jpg new file mode 100644 index 00000000..bf9576ff Binary files /dev/null and b/src/dataset/tulip/13592509245_43329e904b_c.jpg differ diff --git a/src/dataset/tulip/13592510705_cc9f99928d_c.jpg b/src/dataset/tulip/13592510705_cc9f99928d_c.jpg new file mode 100644 index 00000000..32eea6d2 Binary files /dev/null and b/src/dataset/tulip/13592510705_cc9f99928d_c.jpg differ diff --git a/src/dataset/tulip/13592541913_d7b14205e1_c.jpg b/src/dataset/tulip/13592541913_d7b14205e1_c.jpg new file mode 100644 index 00000000..5ea8e928 Binary files /dev/null and b/src/dataset/tulip/13592541913_d7b14205e1_c.jpg differ diff --git a/src/dataset/tulip/136091467_97c1e51700_c.jpg b/src/dataset/tulip/136091467_97c1e51700_c.jpg new file mode 100644 index 00000000..5f0aef3b Binary files /dev/null and b/src/dataset/tulip/136091467_97c1e51700_c.jpg differ diff --git a/src/dataset/tulip/13613850345_7d127fa898_c.jpg b/src/dataset/tulip/13613850345_7d127fa898_c.jpg new file mode 100644 index 00000000..9b1ddb32 Binary files /dev/null and b/src/dataset/tulip/13613850345_7d127fa898_c.jpg differ diff --git a/src/dataset/tulip/13659337814_335109b0f3_c.jpg b/src/dataset/tulip/13659337814_335109b0f3_c.jpg new file mode 100644 index 00000000..fb568fc8 Binary files /dev/null and b/src/dataset/tulip/13659337814_335109b0f3_c.jpg differ diff --git a/src/dataset/tulip/13659500195_bc62316db6_c.jpg b/src/dataset/tulip/13659500195_bc62316db6_c.jpg new file mode 100644 index 00000000..129a8e06 Binary files /dev/null and b/src/dataset/tulip/13659500195_bc62316db6_c.jpg differ diff --git a/src/dataset/tulip/13670612243_63a5579fe4_c.jpg b/src/dataset/tulip/13670612243_63a5579fe4_c.jpg new file mode 100644 index 00000000..654dea91 Binary files /dev/null and b/src/dataset/tulip/13670612243_63a5579fe4_c.jpg differ diff --git a/src/dataset/tulip/136727699_7dcc3b9976_c.jpg b/src/dataset/tulip/136727699_7dcc3b9976_c.jpg new file mode 100644 index 00000000..8a753b44 Binary files /dev/null and b/src/dataset/tulip/136727699_7dcc3b9976_c.jpg differ diff --git a/src/dataset/tulip/136729500_0dbe78b19a_c.jpg b/src/dataset/tulip/136729500_0dbe78b19a_c.jpg new file mode 100644 index 00000000..e58eeb6d Binary files /dev/null and b/src/dataset/tulip/136729500_0dbe78b19a_c.jpg differ diff --git a/src/dataset/tulip/13673527644_cb9f6408a4_c.jpg b/src/dataset/tulip/13673527644_cb9f6408a4_c.jpg new file mode 100644 index 00000000..ce2af000 Binary files /dev/null and b/src/dataset/tulip/13673527644_cb9f6408a4_c.jpg differ diff --git a/src/dataset/tulip/136755060_386b6ae445_c.jpg b/src/dataset/tulip/136755060_386b6ae445_c.jpg new file mode 100644 index 00000000..585d3977 Binary files /dev/null and b/src/dataset/tulip/136755060_386b6ae445_c.jpg differ diff --git a/src/dataset/tulip/13724298105_956ba42378_c.jpg b/src/dataset/tulip/13724298105_956ba42378_c.jpg new file mode 100644 index 00000000..9d97bd56 Binary files /dev/null and b/src/dataset/tulip/13724298105_956ba42378_c.jpg differ diff --git a/src/dataset/tulip/13724386855_d7b7f4e53d_c.jpg b/src/dataset/tulip/13724386855_d7b7f4e53d_c.jpg new file mode 100644 index 00000000..d06e2146 Binary files /dev/null and b/src/dataset/tulip/13724386855_d7b7f4e53d_c.jpg differ diff --git a/src/dataset/tulip/13724404665_09c93f8f82_c.jpg b/src/dataset/tulip/13724404665_09c93f8f82_c.jpg new file mode 100644 index 00000000..ed2f6a89 Binary files /dev/null and b/src/dataset/tulip/13724404665_09c93f8f82_c.jpg differ diff --git a/src/dataset/tulip/13724474803_d860f13da0_c.jpg b/src/dataset/tulip/13724474803_d860f13da0_c.jpg new file mode 100644 index 00000000..a0072696 Binary files /dev/null and b/src/dataset/tulip/13724474803_d860f13da0_c.jpg differ diff --git a/src/dataset/tulip/13724535465_e2ceee6a21_c.jpg b/src/dataset/tulip/13724535465_e2ceee6a21_c.jpg new file mode 100644 index 00000000..b43ba0ce Binary files /dev/null and b/src/dataset/tulip/13724535465_e2ceee6a21_c.jpg differ diff --git a/src/dataset/tulip/13724550795_0f9a08e243_c.jpg b/src/dataset/tulip/13724550795_0f9a08e243_c.jpg new file mode 100644 index 00000000..2072934e Binary files /dev/null and b/src/dataset/tulip/13724550795_0f9a08e243_c.jpg differ diff --git a/src/dataset/tulip/13724736984_98dff7221b_c.jpg b/src/dataset/tulip/13724736984_98dff7221b_c.jpg new file mode 100644 index 00000000..fafa603a Binary files /dev/null and b/src/dataset/tulip/13724736984_98dff7221b_c.jpg differ diff --git a/src/dataset/tulip/13724920544_795f9dd2fb_c.jpg b/src/dataset/tulip/13724920544_795f9dd2fb_c.jpg new file mode 100644 index 00000000..472d695e Binary files /dev/null and b/src/dataset/tulip/13724920544_795f9dd2fb_c.jpg differ diff --git a/src/dataset/tulip/13739148143_558186e13b_c.jpg b/src/dataset/tulip/13739148143_558186e13b_c.jpg new file mode 100644 index 00000000..eef4c379 Binary files /dev/null and b/src/dataset/tulip/13739148143_558186e13b_c.jpg differ diff --git a/src/dataset/tulip/13750699783_c00313de90_c.jpg b/src/dataset/tulip/13750699783_c00313de90_c.jpg new file mode 100644 index 00000000..2c636cf2 Binary files /dev/null and b/src/dataset/tulip/13750699783_c00313de90_c.jpg differ diff --git a/src/dataset/tulip/13793000744_7e73b19d9b_c.jpg b/src/dataset/tulip/13793000744_7e73b19d9b_c.jpg new file mode 100644 index 00000000..2e2cadae Binary files /dev/null and b/src/dataset/tulip/13793000744_7e73b19d9b_c.jpg differ diff --git a/src/dataset/tulip/13793023924_f5fce03efd_c.jpg b/src/dataset/tulip/13793023924_f5fce03efd_c.jpg new file mode 100644 index 00000000..5486eb77 Binary files /dev/null and b/src/dataset/tulip/13793023924_f5fce03efd_c.jpg differ diff --git a/src/dataset/tulip/13821190023_f927d76542_c.jpg b/src/dataset/tulip/13821190023_f927d76542_c.jpg new file mode 100644 index 00000000..8c0e15cc Binary files /dev/null and b/src/dataset/tulip/13821190023_f927d76542_c.jpg differ diff --git a/src/dataset/tulip/13831733305_f462e873f8_c.jpg b/src/dataset/tulip/13831733305_f462e873f8_c.jpg new file mode 100644 index 00000000..4276326a Binary files /dev/null and b/src/dataset/tulip/13831733305_f462e873f8_c.jpg differ diff --git a/src/dataset/tulip/13831741375_7d02001fc6_c.jpg b/src/dataset/tulip/13831741375_7d02001fc6_c.jpg new file mode 100644 index 00000000..38552e9f Binary files /dev/null and b/src/dataset/tulip/13831741375_7d02001fc6_c.jpg differ diff --git a/src/dataset/tulip/13831770483_54fd690e2d_c.jpg b/src/dataset/tulip/13831770483_54fd690e2d_c.jpg new file mode 100644 index 00000000..1a934b49 Binary files /dev/null and b/src/dataset/tulip/13831770483_54fd690e2d_c.jpg differ diff --git a/src/dataset/tulip/13831772125_361fea34b8_c.jpg b/src/dataset/tulip/13831772125_361fea34b8_c.jpg new file mode 100644 index 00000000..b4df883a Binary files /dev/null and b/src/dataset/tulip/13831772125_361fea34b8_c.jpg differ diff --git a/src/dataset/tulip/13831772833_9b54c44895_c.jpg b/src/dataset/tulip/13831772833_9b54c44895_c.jpg new file mode 100644 index 00000000..0ef7cc02 Binary files /dev/null and b/src/dataset/tulip/13831772833_9b54c44895_c.jpg differ diff --git a/src/dataset/tulip/13831777865_316dd20e8f_c.jpg b/src/dataset/tulip/13831777865_316dd20e8f_c.jpg new file mode 100644 index 00000000..a3322f60 Binary files /dev/null and b/src/dataset/tulip/13831777865_316dd20e8f_c.jpg differ diff --git a/src/dataset/tulip/13832107344_ea6f03309a_c.jpg b/src/dataset/tulip/13832107344_ea6f03309a_c.jpg new file mode 100644 index 00000000..def07f73 Binary files /dev/null and b/src/dataset/tulip/13832107344_ea6f03309a_c.jpg differ diff --git a/src/dataset/tulip/13832122414_9934424130_c.jpg b/src/dataset/tulip/13832122414_9934424130_c.jpg new file mode 100644 index 00000000..15a8db65 Binary files /dev/null and b/src/dataset/tulip/13832122414_9934424130_c.jpg differ diff --git a/src/dataset/tulip/138352085_1a1b797628_c.jpg b/src/dataset/tulip/138352085_1a1b797628_c.jpg new file mode 100644 index 00000000..ee1ec9db Binary files /dev/null and b/src/dataset/tulip/138352085_1a1b797628_c.jpg differ diff --git a/src/dataset/tulip/13848533055_fcf9f6b915_c.jpg b/src/dataset/tulip/13848533055_fcf9f6b915_c.jpg new file mode 100644 index 00000000..84ed159b Binary files /dev/null and b/src/dataset/tulip/13848533055_fcf9f6b915_c.jpg differ diff --git a/src/dataset/tulip/13852973674_e6a2714b7b_c.jpg b/src/dataset/tulip/13852973674_e6a2714b7b_c.jpg new file mode 100644 index 00000000..5c612b70 Binary files /dev/null and b/src/dataset/tulip/13852973674_e6a2714b7b_c.jpg differ diff --git a/src/dataset/tulip/13886384114_dcbee70f40_c.jpg b/src/dataset/tulip/13886384114_dcbee70f40_c.jpg new file mode 100644 index 00000000..05c94d7f Binary files /dev/null and b/src/dataset/tulip/13886384114_dcbee70f40_c.jpg differ diff --git a/src/dataset/tulip/13896716489_bfa002defc_c.jpg b/src/dataset/tulip/13896716489_bfa002defc_c.jpg new file mode 100644 index 00000000..9821584f Binary files /dev/null and b/src/dataset/tulip/13896716489_bfa002defc_c.jpg differ diff --git a/src/dataset/tulip/13899722668_cc449908da_c.jpg b/src/dataset/tulip/13899722668_cc449908da_c.jpg new file mode 100644 index 00000000..d4f999a4 Binary files /dev/null and b/src/dataset/tulip/13899722668_cc449908da_c.jpg differ diff --git a/src/dataset/tulip/13899730430_aaea72d3dd_c.jpg b/src/dataset/tulip/13899730430_aaea72d3dd_c.jpg new file mode 100644 index 00000000..6a3967a5 Binary files /dev/null and b/src/dataset/tulip/13899730430_aaea72d3dd_c.jpg differ diff --git a/src/dataset/tulip/13904011084_d408151d80_c.jpg b/src/dataset/tulip/13904011084_d408151d80_c.jpg new file mode 100644 index 00000000..5288a11d Binary files /dev/null and b/src/dataset/tulip/13904011084_d408151d80_c.jpg differ diff --git a/src/dataset/tulip/13909881276_16cdeb7797_c.jpg b/src/dataset/tulip/13909881276_16cdeb7797_c.jpg new file mode 100644 index 00000000..3dc9d5f9 Binary files /dev/null and b/src/dataset/tulip/13909881276_16cdeb7797_c.jpg differ diff --git a/src/dataset/tulip/13913322562_2f89904a26_c.jpg b/src/dataset/tulip/13913322562_2f89904a26_c.jpg new file mode 100644 index 00000000..fa07e85e Binary files /dev/null and b/src/dataset/tulip/13913322562_2f89904a26_c.jpg differ diff --git a/src/dataset/tulip/13913803336_95dd370bb6_c.jpg b/src/dataset/tulip/13913803336_95dd370bb6_c.jpg new file mode 100644 index 00000000..4d33f59b Binary files /dev/null and b/src/dataset/tulip/13913803336_95dd370bb6_c.jpg differ diff --git a/src/dataset/tulip/13913811042_30677e1925_c.jpg b/src/dataset/tulip/13913811042_30677e1925_c.jpg new file mode 100644 index 00000000..3b2fb90d Binary files /dev/null and b/src/dataset/tulip/13913811042_30677e1925_c.jpg differ diff --git a/src/dataset/tulip/13913813272_ab73081f91_c.jpg b/src/dataset/tulip/13913813272_ab73081f91_c.jpg new file mode 100644 index 00000000..afd363af Binary files /dev/null and b/src/dataset/tulip/13913813272_ab73081f91_c.jpg differ diff --git a/src/dataset/tulip/13914774863_e9efb86ce6_c.jpg b/src/dataset/tulip/13914774863_e9efb86ce6_c.jpg new file mode 100644 index 00000000..6c9a5277 Binary files /dev/null and b/src/dataset/tulip/13914774863_e9efb86ce6_c.jpg differ diff --git a/src/dataset/tulip/13914865104_85b76353aa_c.jpg b/src/dataset/tulip/13914865104_85b76353aa_c.jpg new file mode 100644 index 00000000..636a9f19 Binary files /dev/null and b/src/dataset/tulip/13914865104_85b76353aa_c.jpg differ diff --git a/src/dataset/tulip/13916064029_84f14f082f_c.jpg b/src/dataset/tulip/13916064029_84f14f082f_c.jpg new file mode 100644 index 00000000..592777f9 Binary files /dev/null and b/src/dataset/tulip/13916064029_84f14f082f_c.jpg differ diff --git a/src/dataset/tulip/13918660736_c31f2d4b18_c.jpg b/src/dataset/tulip/13918660736_c31f2d4b18_c.jpg new file mode 100644 index 00000000..0f69d38c Binary files /dev/null and b/src/dataset/tulip/13918660736_c31f2d4b18_c.jpg differ diff --git a/src/dataset/tulip/13924946167_ef13f13020_c.jpg b/src/dataset/tulip/13924946167_ef13f13020_c.jpg new file mode 100644 index 00000000..0f988f27 Binary files /dev/null and b/src/dataset/tulip/13924946167_ef13f13020_c.jpg differ diff --git a/src/dataset/tulip/13924952707_81c9d37b01_c.jpg b/src/dataset/tulip/13924952707_81c9d37b01_c.jpg new file mode 100644 index 00000000..07eaa75f Binary files /dev/null and b/src/dataset/tulip/13924952707_81c9d37b01_c.jpg differ diff --git a/src/dataset/tulip/13925026335_6d85314f92_c.jpg b/src/dataset/tulip/13925026335_6d85314f92_c.jpg new file mode 100644 index 00000000..6c480d17 Binary files /dev/null and b/src/dataset/tulip/13925026335_6d85314f92_c.jpg differ diff --git a/src/dataset/tulip/13935420569_8ce370cde6_c.jpg b/src/dataset/tulip/13935420569_8ce370cde6_c.jpg new file mode 100644 index 00000000..2bea2dda Binary files /dev/null and b/src/dataset/tulip/13935420569_8ce370cde6_c.jpg differ diff --git a/src/dataset/tulip/13936477783_1320eca292_c.jpg b/src/dataset/tulip/13936477783_1320eca292_c.jpg new file mode 100644 index 00000000..87daa3e0 Binary files /dev/null and b/src/dataset/tulip/13936477783_1320eca292_c.jpg differ diff --git a/src/dataset/tulip/13936919325_a634abe291_c.jpg b/src/dataset/tulip/13936919325_a634abe291_c.jpg new file mode 100644 index 00000000..20e99c83 Binary files /dev/null and b/src/dataset/tulip/13936919325_a634abe291_c.jpg differ diff --git a/src/dataset/tulip/13936958633_304ddb860f_c.jpg b/src/dataset/tulip/13936958633_304ddb860f_c.jpg new file mode 100644 index 00000000..58ab4b59 Binary files /dev/null and b/src/dataset/tulip/13936958633_304ddb860f_c.jpg differ diff --git a/src/dataset/tulip/13938188795_5d424dcbe4_c.jpg b/src/dataset/tulip/13938188795_5d424dcbe4_c.jpg new file mode 100644 index 00000000..67bd930e Binary files /dev/null and b/src/dataset/tulip/13938188795_5d424dcbe4_c.jpg differ diff --git a/src/dataset/tulip/13938354469_7f7368e63f_c.jpg b/src/dataset/tulip/13938354469_7f7368e63f_c.jpg new file mode 100644 index 00000000..eb19d04b Binary files /dev/null and b/src/dataset/tulip/13938354469_7f7368e63f_c.jpg differ diff --git a/src/dataset/tulip/13956774461_34879849f6_c.jpg b/src/dataset/tulip/13956774461_34879849f6_c.jpg new file mode 100644 index 00000000..1e1b509d Binary files /dev/null and b/src/dataset/tulip/13956774461_34879849f6_c.jpg differ diff --git a/src/dataset/tulip/13971369776_25ab4eb717_c.jpg b/src/dataset/tulip/13971369776_25ab4eb717_c.jpg new file mode 100644 index 00000000..cea8b651 Binary files /dev/null and b/src/dataset/tulip/13971369776_25ab4eb717_c.jpg differ diff --git a/src/dataset/tulip/13972661817_6b35a61856_c.jpg b/src/dataset/tulip/13972661817_6b35a61856_c.jpg new file mode 100644 index 00000000..eea9f5aa Binary files /dev/null and b/src/dataset/tulip/13972661817_6b35a61856_c.jpg differ diff --git a/src/dataset/tulip/13973673658_801e5bb57b_c.jpg b/src/dataset/tulip/13973673658_801e5bb57b_c.jpg new file mode 100644 index 00000000..66d5bd8c Binary files /dev/null and b/src/dataset/tulip/13973673658_801e5bb57b_c.jpg differ diff --git a/src/dataset/tulip/13979502961_57a2736357_c.jpg b/src/dataset/tulip/13979502961_57a2736357_c.jpg new file mode 100644 index 00000000..561a6c2a Binary files /dev/null and b/src/dataset/tulip/13979502961_57a2736357_c.jpg differ diff --git a/src/dataset/tulip/13982237316_f092f1213e_c.jpg b/src/dataset/tulip/13982237316_f092f1213e_c.jpg new file mode 100644 index 00000000..a2c3c0e1 Binary files /dev/null and b/src/dataset/tulip/13982237316_f092f1213e_c.jpg differ diff --git a/src/dataset/tulip/13992798593_b376d93fb5_c.jpg b/src/dataset/tulip/13992798593_b376d93fb5_c.jpg new file mode 100644 index 00000000..d2eadd33 Binary files /dev/null and b/src/dataset/tulip/13992798593_b376d93fb5_c.jpg differ diff --git a/src/dataset/tulip/14001324857_458d8b016e_c.jpg b/src/dataset/tulip/14001324857_458d8b016e_c.jpg new file mode 100644 index 00000000..45072568 Binary files /dev/null and b/src/dataset/tulip/14001324857_458d8b016e_c.jpg differ diff --git a/src/dataset/tulip/14002133662_cb56385c70_c.jpg b/src/dataset/tulip/14002133662_cb56385c70_c.jpg new file mode 100644 index 00000000..35b32f0d Binary files /dev/null and b/src/dataset/tulip/14002133662_cb56385c70_c.jpg differ diff --git a/src/dataset/tulip/14005335485_be74c4c1cf_c.jpg b/src/dataset/tulip/14005335485_be74c4c1cf_c.jpg new file mode 100644 index 00000000..2ebb8fd9 Binary files /dev/null and b/src/dataset/tulip/14005335485_be74c4c1cf_c.jpg differ diff --git a/src/dataset/tulip/14005523225_e8e6f46ac9_c.jpg b/src/dataset/tulip/14005523225_e8e6f46ac9_c.jpg new file mode 100644 index 00000000..4ebd75b3 Binary files /dev/null and b/src/dataset/tulip/14005523225_e8e6f46ac9_c.jpg differ diff --git a/src/dataset/tulip/14005778354_42c0c9d3d4_c.jpg b/src/dataset/tulip/14005778354_42c0c9d3d4_c.jpg new file mode 100644 index 00000000..86e9a111 Binary files /dev/null and b/src/dataset/tulip/14005778354_42c0c9d3d4_c.jpg differ diff --git a/src/dataset/tulip/14006612862_082a21f0be_c.jpg b/src/dataset/tulip/14006612862_082a21f0be_c.jpg new file mode 100644 index 00000000..2f97b667 Binary files /dev/null and b/src/dataset/tulip/14006612862_082a21f0be_c.jpg differ diff --git a/src/dataset/tulip/14012727207_a62db0ef2f_c.jpg b/src/dataset/tulip/14012727207_a62db0ef2f_c.jpg new file mode 100644 index 00000000..78951b10 Binary files /dev/null and b/src/dataset/tulip/14012727207_a62db0ef2f_c.jpg differ diff --git a/src/dataset/tulip/14015141791_fe9da059d3_c.jpg b/src/dataset/tulip/14015141791_fe9da059d3_c.jpg new file mode 100644 index 00000000..4d07dba3 Binary files /dev/null and b/src/dataset/tulip/14015141791_fe9da059d3_c.jpg differ diff --git a/src/dataset/tulip/14018792524_ae59fe5b97_c.jpg b/src/dataset/tulip/14018792524_ae59fe5b97_c.jpg new file mode 100644 index 00000000..e4058b8f Binary files /dev/null and b/src/dataset/tulip/14018792524_ae59fe5b97_c.jpg differ diff --git a/src/dataset/tulip/14025342223_bbec085d10_c.jpg b/src/dataset/tulip/14025342223_bbec085d10_c.jpg new file mode 100644 index 00000000..8ba3eb45 Binary files /dev/null and b/src/dataset/tulip/14025342223_bbec085d10_c.jpg differ diff --git a/src/dataset/tulip/14025346433_cda8076e9f_c.jpg b/src/dataset/tulip/14025346433_cda8076e9f_c.jpg new file mode 100644 index 00000000..d025015d Binary files /dev/null and b/src/dataset/tulip/14025346433_cda8076e9f_c.jpg differ diff --git a/src/dataset/tulip/14025354023_ac17fdf571_c.jpg b/src/dataset/tulip/14025354023_ac17fdf571_c.jpg new file mode 100644 index 00000000..44f7d775 Binary files /dev/null and b/src/dataset/tulip/14025354023_ac17fdf571_c.jpg differ diff --git a/src/dataset/tulip/14030035081_a25c4903a3_c.jpg b/src/dataset/tulip/14030035081_a25c4903a3_c.jpg new file mode 100644 index 00000000..8107c95e Binary files /dev/null and b/src/dataset/tulip/14030035081_a25c4903a3_c.jpg differ diff --git a/src/dataset/tulip/14030042031_c464e82133_c.jpg b/src/dataset/tulip/14030042031_c464e82133_c.jpg new file mode 100644 index 00000000..01938e34 Binary files /dev/null and b/src/dataset/tulip/14030042031_c464e82133_c.jpg differ diff --git a/src/dataset/tulip/14032307722_67b547f2c8_c.jpg b/src/dataset/tulip/14032307722_67b547f2c8_c.jpg new file mode 100644 index 00000000..a89de4d8 Binary files /dev/null and b/src/dataset/tulip/14032307722_67b547f2c8_c.jpg differ diff --git a/src/dataset/tulip/14032915079_352e5d5406_c.jpg b/src/dataset/tulip/14032915079_352e5d5406_c.jpg new file mode 100644 index 00000000..3363a48b Binary files /dev/null and b/src/dataset/tulip/14032915079_352e5d5406_c.jpg differ diff --git a/src/dataset/tulip/14034967076_87620c0414_c.jpg b/src/dataset/tulip/14034967076_87620c0414_c.jpg new file mode 100644 index 00000000..b2a5a7bf Binary files /dev/null and b/src/dataset/tulip/14034967076_87620c0414_c.jpg differ diff --git a/src/dataset/tulip/14035498298_2782264522_c.jpg b/src/dataset/tulip/14035498298_2782264522_c.jpg new file mode 100644 index 00000000..ccaee3c8 Binary files /dev/null and b/src/dataset/tulip/14035498298_2782264522_c.jpg differ diff --git a/src/dataset/tulip/14037025025_aeaa7f7720_c.jpg b/src/dataset/tulip/14037025025_aeaa7f7720_c.jpg new file mode 100644 index 00000000..d4791ad5 Binary files /dev/null and b/src/dataset/tulip/14037025025_aeaa7f7720_c.jpg differ diff --git a/src/dataset/tulip/14038337453_8ed54916b1_c.jpg b/src/dataset/tulip/14038337453_8ed54916b1_c.jpg new file mode 100644 index 00000000..eb8b3acc Binary files /dev/null and b/src/dataset/tulip/14038337453_8ed54916b1_c.jpg differ diff --git a/src/dataset/tulip/14044157584_eb5e4f1d2a_c.jpg b/src/dataset/tulip/14044157584_eb5e4f1d2a_c.jpg new file mode 100644 index 00000000..fe144312 Binary files /dev/null and b/src/dataset/tulip/14044157584_eb5e4f1d2a_c.jpg differ diff --git a/src/dataset/tulip/14050982084_533003841f_c.jpg b/src/dataset/tulip/14050982084_533003841f_c.jpg new file mode 100644 index 00000000..16699666 Binary files /dev/null and b/src/dataset/tulip/14050982084_533003841f_c.jpg differ diff --git a/src/dataset/tulip/14053225753_4774964571_c.jpg b/src/dataset/tulip/14053225753_4774964571_c.jpg new file mode 100644 index 00000000..bbabb95d Binary files /dev/null and b/src/dataset/tulip/14053225753_4774964571_c.jpg differ diff --git a/src/dataset/tulip/14072559157_49b2646637_c.jpg b/src/dataset/tulip/14072559157_49b2646637_c.jpg new file mode 100644 index 00000000..cfc59b2d Binary files /dev/null and b/src/dataset/tulip/14072559157_49b2646637_c.jpg differ diff --git a/src/dataset/tulip/14072905554_cf36723e98_c.jpg b/src/dataset/tulip/14072905554_cf36723e98_c.jpg new file mode 100644 index 00000000..0b85217c Binary files /dev/null and b/src/dataset/tulip/14072905554_cf36723e98_c.jpg differ diff --git a/src/dataset/tulip/14083125281_4619170dde_c.jpg b/src/dataset/tulip/14083125281_4619170dde_c.jpg new file mode 100644 index 00000000..5f7cace3 Binary files /dev/null and b/src/dataset/tulip/14083125281_4619170dde_c.jpg differ diff --git a/src/dataset/tulip/14086310525_347c809d3b_c.jpg b/src/dataset/tulip/14086310525_347c809d3b_c.jpg new file mode 100644 index 00000000..3dfd06af Binary files /dev/null and b/src/dataset/tulip/14086310525_347c809d3b_c.jpg differ diff --git a/src/dataset/tulip/14086799744_9776a8c132_c.jpg b/src/dataset/tulip/14086799744_9776a8c132_c.jpg new file mode 100644 index 00000000..0aa10aa8 Binary files /dev/null and b/src/dataset/tulip/14086799744_9776a8c132_c.jpg differ diff --git a/src/dataset/tulip/14086801984_044ac15b4c_c.jpg b/src/dataset/tulip/14086801984_044ac15b4c_c.jpg new file mode 100644 index 00000000..5e24d4ce Binary files /dev/null and b/src/dataset/tulip/14086801984_044ac15b4c_c.jpg differ diff --git a/src/dataset/tulip/14088465806_6527b1ed8f_c.jpg b/src/dataset/tulip/14088465806_6527b1ed8f_c.jpg new file mode 100644 index 00000000..c14356e3 Binary files /dev/null and b/src/dataset/tulip/14088465806_6527b1ed8f_c.jpg differ diff --git a/src/dataset/tulip/14106386193_c11e0b2f8e_c.jpg b/src/dataset/tulip/14106386193_c11e0b2f8e_c.jpg new file mode 100644 index 00000000..1c68878f Binary files /dev/null and b/src/dataset/tulip/14106386193_c11e0b2f8e_c.jpg differ diff --git a/src/dataset/tulip/14108545152_0eda154674_c.jpg b/src/dataset/tulip/14108545152_0eda154674_c.jpg new file mode 100644 index 00000000..517cb11f Binary files /dev/null and b/src/dataset/tulip/14108545152_0eda154674_c.jpg differ diff --git a/src/dataset/tulip/14110168274_15297495ef_c.jpg b/src/dataset/tulip/14110168274_15297495ef_c.jpg new file mode 100644 index 00000000..f71c72cd Binary files /dev/null and b/src/dataset/tulip/14110168274_15297495ef_c.jpg differ diff --git a/src/dataset/tulip/14111621505_f0b7caa647_c.jpg b/src/dataset/tulip/14111621505_f0b7caa647_c.jpg new file mode 100644 index 00000000..a929e965 Binary files /dev/null and b/src/dataset/tulip/14111621505_f0b7caa647_c.jpg differ diff --git a/src/dataset/tulip/14111983334_347de88de7_c.jpg b/src/dataset/tulip/14111983334_347de88de7_c.jpg new file mode 100644 index 00000000..bf626d7f Binary files /dev/null and b/src/dataset/tulip/14111983334_347de88de7_c.jpg differ diff --git a/src/dataset/tulip/14111984464_b9feec98de_c.jpg b/src/dataset/tulip/14111984464_b9feec98de_c.jpg new file mode 100644 index 00000000..268a3331 Binary files /dev/null and b/src/dataset/tulip/14111984464_b9feec98de_c.jpg differ diff --git a/src/dataset/tulip/14121188152_c8a61033ca_c.jpg b/src/dataset/tulip/14121188152_c8a61033ca_c.jpg new file mode 100644 index 00000000..d51b4294 Binary files /dev/null and b/src/dataset/tulip/14121188152_c8a61033ca_c.jpg differ diff --git a/src/dataset/tulip/14123020398_ae155147ba_c.jpg b/src/dataset/tulip/14123020398_ae155147ba_c.jpg new file mode 100644 index 00000000..0635f740 Binary files /dev/null and b/src/dataset/tulip/14123020398_ae155147ba_c.jpg differ diff --git a/src/dataset/tulip/14125854424_ba5682c986_c.jpg b/src/dataset/tulip/14125854424_ba5682c986_c.jpg new file mode 100644 index 00000000..4acc4d13 Binary files /dev/null and b/src/dataset/tulip/14125854424_ba5682c986_c.jpg differ diff --git a/src/dataset/tulip/14131683053_8179b2470d_c.jpg b/src/dataset/tulip/14131683053_8179b2470d_c.jpg new file mode 100644 index 00000000..2d625b70 Binary files /dev/null and b/src/dataset/tulip/14131683053_8179b2470d_c.jpg differ diff --git a/src/dataset/tulip/14131683513_28c84531d6_c.jpg b/src/dataset/tulip/14131683513_28c84531d6_c.jpg new file mode 100644 index 00000000..20d67c58 Binary files /dev/null and b/src/dataset/tulip/14131683513_28c84531d6_c.jpg differ diff --git a/src/dataset/tulip/14134547222_14178156c0_c.jpg b/src/dataset/tulip/14134547222_14178156c0_c.jpg new file mode 100644 index 00000000..4debc613 Binary files /dev/null and b/src/dataset/tulip/14134547222_14178156c0_c.jpg differ diff --git a/src/dataset/tulip/14134658276_26d4edf489_c.jpg b/src/dataset/tulip/14134658276_26d4edf489_c.jpg new file mode 100644 index 00000000..d085db7a Binary files /dev/null and b/src/dataset/tulip/14134658276_26d4edf489_c.jpg differ diff --git a/src/dataset/tulip/14142149593_272a704e06_c.jpg b/src/dataset/tulip/14142149593_272a704e06_c.jpg new file mode 100644 index 00000000..4bfd568c Binary files /dev/null and b/src/dataset/tulip/14142149593_272a704e06_c.jpg differ diff --git a/src/dataset/tulip/14155621516_b6b8712413_c.jpg b/src/dataset/tulip/14155621516_b6b8712413_c.jpg new file mode 100644 index 00000000..9fdb91b0 Binary files /dev/null and b/src/dataset/tulip/14155621516_b6b8712413_c.jpg differ diff --git a/src/dataset/tulip/14177910893_75f99d66dd_c.jpg b/src/dataset/tulip/14177910893_75f99d66dd_c.jpg new file mode 100644 index 00000000..ee0d6177 Binary files /dev/null and b/src/dataset/tulip/14177910893_75f99d66dd_c.jpg differ diff --git a/src/dataset/tulip/14185227443_b1bd8395d5_c.jpg b/src/dataset/tulip/14185227443_b1bd8395d5_c.jpg new file mode 100644 index 00000000..3341df2a Binary files /dev/null and b/src/dataset/tulip/14185227443_b1bd8395d5_c.jpg differ diff --git a/src/dataset/tulip/14190396837_f43efc3e7e_c.jpg b/src/dataset/tulip/14190396837_f43efc3e7e_c.jpg new file mode 100644 index 00000000..d6c66c83 Binary files /dev/null and b/src/dataset/tulip/14190396837_f43efc3e7e_c.jpg differ diff --git a/src/dataset/tulip/14218276965_d31475784c_c.jpg b/src/dataset/tulip/14218276965_d31475784c_c.jpg new file mode 100644 index 00000000..3df3d69a Binary files /dev/null and b/src/dataset/tulip/14218276965_d31475784c_c.jpg differ diff --git a/src/dataset/tulip/14219781862_c4cdf4c539_c.jpg b/src/dataset/tulip/14219781862_c4cdf4c539_c.jpg new file mode 100644 index 00000000..f9e02833 Binary files /dev/null and b/src/dataset/tulip/14219781862_c4cdf4c539_c.jpg differ diff --git a/src/dataset/tulip/14221947424_4ff2e3ddf1_c.jpg b/src/dataset/tulip/14221947424_4ff2e3ddf1_c.jpg new file mode 100644 index 00000000..8bff19e9 Binary files /dev/null and b/src/dataset/tulip/14221947424_4ff2e3ddf1_c.jpg differ diff --git a/src/dataset/tulip/14222139585_5205ce9525_c.jpg b/src/dataset/tulip/14222139585_5205ce9525_c.jpg new file mode 100644 index 00000000..a8d71b0f Binary files /dev/null and b/src/dataset/tulip/14222139585_5205ce9525_c.jpg differ diff --git a/src/dataset/tulip/14222140775_2de19a4829_c.jpg b/src/dataset/tulip/14222140775_2de19a4829_c.jpg new file mode 100644 index 00000000..4c5aaf6d Binary files /dev/null and b/src/dataset/tulip/14222140775_2de19a4829_c.jpg differ diff --git a/src/dataset/tulip/14222142865_9de7e06594_c.jpg b/src/dataset/tulip/14222142865_9de7e06594_c.jpg new file mode 100644 index 00000000..607293af Binary files /dev/null and b/src/dataset/tulip/14222142865_9de7e06594_c.jpg differ diff --git a/src/dataset/tulip/14222148765_f945243647_c.jpg b/src/dataset/tulip/14222148765_f945243647_c.jpg new file mode 100644 index 00000000..b2adb8a1 Binary files /dev/null and b/src/dataset/tulip/14222148765_f945243647_c.jpg differ diff --git a/src/dataset/tulip/14252112287_c45861f449_c.jpg b/src/dataset/tulip/14252112287_c45861f449_c.jpg new file mode 100644 index 00000000..de2492a5 Binary files /dev/null and b/src/dataset/tulip/14252112287_c45861f449_c.jpg differ diff --git a/src/dataset/tulip/142779150_32ed1bc567_c.jpg b/src/dataset/tulip/142779150_32ed1bc567_c.jpg new file mode 100644 index 00000000..0ff0411c Binary files /dev/null and b/src/dataset/tulip/142779150_32ed1bc567_c.jpg differ diff --git a/src/dataset/tulip/14313404442_e09ebd0f2c_c.jpg b/src/dataset/tulip/14313404442_e09ebd0f2c_c.jpg new file mode 100644 index 00000000..11421106 Binary files /dev/null and b/src/dataset/tulip/14313404442_e09ebd0f2c_c.jpg differ diff --git a/src/dataset/tulip/14359943731_bb368265b6_c.jpg b/src/dataset/tulip/14359943731_bb368265b6_c.jpg new file mode 100644 index 00000000..19e62e2b Binary files /dev/null and b/src/dataset/tulip/14359943731_bb368265b6_c.jpg differ diff --git a/src/dataset/tulip/14387820624_3cd3bf71ff_c.jpg b/src/dataset/tulip/14387820624_3cd3bf71ff_c.jpg new file mode 100644 index 00000000..ea97383c Binary files /dev/null and b/src/dataset/tulip/14387820624_3cd3bf71ff_c.jpg differ diff --git a/src/dataset/tulip/14409566970_b40d5c8af2_c.jpg b/src/dataset/tulip/14409566970_b40d5c8af2_c.jpg new file mode 100644 index 00000000..3eb57c9e Binary files /dev/null and b/src/dataset/tulip/14409566970_b40d5c8af2_c.jpg differ diff --git a/src/dataset/tulip/144774054_dbde80cec1_c.jpg b/src/dataset/tulip/144774054_dbde80cec1_c.jpg new file mode 100644 index 00000000..bf5ef6a9 Binary files /dev/null and b/src/dataset/tulip/144774054_dbde80cec1_c.jpg differ diff --git a/src/dataset/tulip/14496908917_edbe312dab_c.jpg b/src/dataset/tulip/14496908917_edbe312dab_c.jpg new file mode 100644 index 00000000..aac30e96 Binary files /dev/null and b/src/dataset/tulip/14496908917_edbe312dab_c.jpg differ diff --git a/src/dataset/tulip/145116717_944830c24d_c.jpg b/src/dataset/tulip/145116717_944830c24d_c.jpg new file mode 100644 index 00000000..460c8253 Binary files /dev/null and b/src/dataset/tulip/145116717_944830c24d_c.jpg differ diff --git a/src/dataset/tulip/145908032_e02fcec27e_c.jpg b/src/dataset/tulip/145908032_e02fcec27e_c.jpg new file mode 100644 index 00000000..21df4f69 Binary files /dev/null and b/src/dataset/tulip/145908032_e02fcec27e_c.jpg differ diff --git a/src/dataset/tulip/14742827367_8c3b50b7a4_c.jpg b/src/dataset/tulip/14742827367_8c3b50b7a4_c.jpg new file mode 100644 index 00000000..2f8c4004 Binary files /dev/null and b/src/dataset/tulip/14742827367_8c3b50b7a4_c.jpg differ diff --git a/src/dataset/tulip/1477375847_b4213d4a66_c.jpg b/src/dataset/tulip/1477375847_b4213d4a66_c.jpg new file mode 100644 index 00000000..66af521c Binary files /dev/null and b/src/dataset/tulip/1477375847_b4213d4a66_c.jpg differ diff --git a/src/dataset/tulip/14778880295_f9805f1dc4_c.jpg b/src/dataset/tulip/14778880295_f9805f1dc4_c.jpg new file mode 100644 index 00000000..88da68d0 Binary files /dev/null and b/src/dataset/tulip/14778880295_f9805f1dc4_c.jpg differ diff --git a/src/dataset/tulip/15053326739_1dd476af4a_c.jpg b/src/dataset/tulip/15053326739_1dd476af4a_c.jpg new file mode 100644 index 00000000..2e1dd6fe Binary files /dev/null and b/src/dataset/tulip/15053326739_1dd476af4a_c.jpg differ diff --git a/src/dataset/tulip/15085578_2c4e0e43fe_c.jpg b/src/dataset/tulip/15085578_2c4e0e43fe_c.jpg new file mode 100644 index 00000000..f1548bde Binary files /dev/null and b/src/dataset/tulip/15085578_2c4e0e43fe_c.jpg differ diff --git a/src/dataset/tulip/150936539_1a77d05047_c.jpg b/src/dataset/tulip/150936539_1a77d05047_c.jpg new file mode 100644 index 00000000..610572b6 Binary files /dev/null and b/src/dataset/tulip/150936539_1a77d05047_c.jpg differ diff --git a/src/dataset/tulip/15173870512_949a00c8f3_c.jpg b/src/dataset/tulip/15173870512_949a00c8f3_c.jpg new file mode 100644 index 00000000..cd896bd8 Binary files /dev/null and b/src/dataset/tulip/15173870512_949a00c8f3_c.jpg differ diff --git a/src/dataset/tulip/15283989501_d42e845515_c.jpg b/src/dataset/tulip/15283989501_d42e845515_c.jpg new file mode 100644 index 00000000..471b119d Binary files /dev/null and b/src/dataset/tulip/15283989501_d42e845515_c.jpg differ diff --git a/src/dataset/tulip/15287156675_fe7a95b123_c.jpg b/src/dataset/tulip/15287156675_fe7a95b123_c.jpg new file mode 100644 index 00000000..950ecd22 Binary files /dev/null and b/src/dataset/tulip/15287156675_fe7a95b123_c.jpg differ diff --git a/src/dataset/tulip/15369979332_fa76d8bd00_c.jpg b/src/dataset/tulip/15369979332_fa76d8bd00_c.jpg new file mode 100644 index 00000000..5188e148 Binary files /dev/null and b/src/dataset/tulip/15369979332_fa76d8bd00_c.jpg differ diff --git a/src/dataset/tulip/15377854398_db6a8598b9_c.jpg b/src/dataset/tulip/15377854398_db6a8598b9_c.jpg new file mode 100644 index 00000000..8ccfb420 Binary files /dev/null and b/src/dataset/tulip/15377854398_db6a8598b9_c.jpg differ diff --git a/src/dataset/tulip/15636237865_4051e39677_c.jpg b/src/dataset/tulip/15636237865_4051e39677_c.jpg new file mode 100644 index 00000000..8d18a653 Binary files /dev/null and b/src/dataset/tulip/15636237865_4051e39677_c.jpg differ diff --git a/src/dataset/tulip/15662692824_aa6c0332c3_c.jpg b/src/dataset/tulip/15662692824_aa6c0332c3_c.jpg new file mode 100644 index 00000000..979c2730 Binary files /dev/null and b/src/dataset/tulip/15662692824_aa6c0332c3_c.jpg differ diff --git a/src/dataset/tulip/15714530594_d2b3da4c21_c.jpg b/src/dataset/tulip/15714530594_d2b3da4c21_c.jpg new file mode 100644 index 00000000..0e8a0121 Binary files /dev/null and b/src/dataset/tulip/15714530594_d2b3da4c21_c.jpg differ diff --git a/src/dataset/tulip/15721838401_122ce2925f_c.jpg b/src/dataset/tulip/15721838401_122ce2925f_c.jpg new file mode 100644 index 00000000..68283b71 Binary files /dev/null and b/src/dataset/tulip/15721838401_122ce2925f_c.jpg differ diff --git a/src/dataset/tulip/1574033704_2b958a9e37_c.jpg b/src/dataset/tulip/1574033704_2b958a9e37_c.jpg new file mode 100644 index 00000000..0ce0c40e Binary files /dev/null and b/src/dataset/tulip/1574033704_2b958a9e37_c.jpg differ diff --git a/src/dataset/tulip/158565233_0b329a6ae3_c.jpg b/src/dataset/tulip/158565233_0b329a6ae3_c.jpg new file mode 100644 index 00000000..8d06c904 Binary files /dev/null and b/src/dataset/tulip/158565233_0b329a6ae3_c.jpg differ diff --git a/src/dataset/tulip/15877723907_a283a3c820_c.jpg b/src/dataset/tulip/15877723907_a283a3c820_c.jpg new file mode 100644 index 00000000..64c6c43a Binary files /dev/null and b/src/dataset/tulip/15877723907_a283a3c820_c.jpg differ diff --git a/src/dataset/tulip/16003190447_0ea5b5ca50_c.jpg b/src/dataset/tulip/16003190447_0ea5b5ca50_c.jpg new file mode 100644 index 00000000..60ed5f1c Binary files /dev/null and b/src/dataset/tulip/16003190447_0ea5b5ca50_c.jpg differ diff --git a/src/dataset/tulip/16057978909_eff31de9c6_c.jpg b/src/dataset/tulip/16057978909_eff31de9c6_c.jpg new file mode 100644 index 00000000..99078af1 Binary files /dev/null and b/src/dataset/tulip/16057978909_eff31de9c6_c.jpg differ diff --git a/src/dataset/tulip/16066045318_9f4c005e44_c.jpg b/src/dataset/tulip/16066045318_9f4c005e44_c.jpg new file mode 100644 index 00000000..8b647ed8 Binary files /dev/null and b/src/dataset/tulip/16066045318_9f4c005e44_c.jpg differ diff --git a/src/dataset/tulip/16121964218_fa715d58de_c.jpg b/src/dataset/tulip/16121964218_fa715d58de_c.jpg new file mode 100644 index 00000000..f80f9104 Binary files /dev/null and b/src/dataset/tulip/16121964218_fa715d58de_c.jpg differ diff --git a/src/dataset/tulip/16181659573_b789fa92b5_c.jpg b/src/dataset/tulip/16181659573_b789fa92b5_c.jpg new file mode 100644 index 00000000..137459c2 Binary files /dev/null and b/src/dataset/tulip/16181659573_b789fa92b5_c.jpg differ diff --git a/src/dataset/tulip/16224812675_b7bb2c1ab2_c.jpg b/src/dataset/tulip/16224812675_b7bb2c1ab2_c.jpg new file mode 100644 index 00000000..4ae1493f Binary files /dev/null and b/src/dataset/tulip/16224812675_b7bb2c1ab2_c.jpg differ diff --git a/src/dataset/tulip/16231116259_eaec04685d_c.jpg b/src/dataset/tulip/16231116259_eaec04685d_c.jpg new file mode 100644 index 00000000..f4fe229f Binary files /dev/null and b/src/dataset/tulip/16231116259_eaec04685d_c.jpg differ diff --git a/src/dataset/tulip/16236186917_d0dc0a6daa_c.jpg b/src/dataset/tulip/16236186917_d0dc0a6daa_c.jpg new file mode 100644 index 00000000..90cc2301 Binary files /dev/null and b/src/dataset/tulip/16236186917_d0dc0a6daa_c.jpg differ diff --git a/src/dataset/tulip/16299550833_688ea63bb6_c.jpg b/src/dataset/tulip/16299550833_688ea63bb6_c.jpg new file mode 100644 index 00000000..de73812a Binary files /dev/null and b/src/dataset/tulip/16299550833_688ea63bb6_c.jpg differ diff --git a/src/dataset/tulip/16421127092_e1d4d5f744_c.jpg b/src/dataset/tulip/16421127092_e1d4d5f744_c.jpg new file mode 100644 index 00000000..b207b6e3 Binary files /dev/null and b/src/dataset/tulip/16421127092_e1d4d5f744_c.jpg differ diff --git a/src/dataset/tulip/16538060663_567cca48e1_c.jpg b/src/dataset/tulip/16538060663_567cca48e1_c.jpg new file mode 100644 index 00000000..2841b0a7 Binary files /dev/null and b/src/dataset/tulip/16538060663_567cca48e1_c.jpg differ diff --git a/src/dataset/tulip/16542309488_608b59b2c4_c.jpg b/src/dataset/tulip/16542309488_608b59b2c4_c.jpg new file mode 100644 index 00000000..4cb0cd6b Binary files /dev/null and b/src/dataset/tulip/16542309488_608b59b2c4_c.jpg differ diff --git a/src/dataset/tulip/16567621146_aaaa8ff685_c.jpg b/src/dataset/tulip/16567621146_aaaa8ff685_c.jpg new file mode 100644 index 00000000..92bc0ee6 Binary files /dev/null and b/src/dataset/tulip/16567621146_aaaa8ff685_c.jpg differ diff --git a/src/dataset/tulip/16576330933_c4fa5e4e16_c.jpg b/src/dataset/tulip/16576330933_c4fa5e4e16_c.jpg new file mode 100644 index 00000000..5db68be0 Binary files /dev/null and b/src/dataset/tulip/16576330933_c4fa5e4e16_c.jpg differ diff --git a/src/dataset/tulip/16581135283_9ac007f57b_c.jpg b/src/dataset/tulip/16581135283_9ac007f57b_c.jpg new file mode 100644 index 00000000..46f483b6 Binary files /dev/null and b/src/dataset/tulip/16581135283_9ac007f57b_c.jpg differ diff --git a/src/dataset/tulip/16624622463_e017508e47_c.jpg b/src/dataset/tulip/16624622463_e017508e47_c.jpg new file mode 100644 index 00000000..cbd7bbf7 Binary files /dev/null and b/src/dataset/tulip/16624622463_e017508e47_c.jpg differ diff --git a/src/dataset/tulip/16629300204_94258c702f_c.jpg b/src/dataset/tulip/16629300204_94258c702f_c.jpg new file mode 100644 index 00000000..e0054f36 Binary files /dev/null and b/src/dataset/tulip/16629300204_94258c702f_c.jpg differ diff --git a/src/dataset/tulip/16634721013_37c6f80d39_c.jpg b/src/dataset/tulip/16634721013_37c6f80d39_c.jpg new file mode 100644 index 00000000..799c5728 Binary files /dev/null and b/src/dataset/tulip/16634721013_37c6f80d39_c.jpg differ diff --git a/src/dataset/tulip/16656490833_f9a3ffe3e7_c.jpg b/src/dataset/tulip/16656490833_f9a3ffe3e7_c.jpg new file mode 100644 index 00000000..bd0570a8 Binary files /dev/null and b/src/dataset/tulip/16656490833_f9a3ffe3e7_c.jpg differ diff --git a/src/dataset/tulip/16660289283_6aac7472df_c.jpg b/src/dataset/tulip/16660289283_6aac7472df_c.jpg new file mode 100644 index 00000000..270bcf43 Binary files /dev/null and b/src/dataset/tulip/16660289283_6aac7472df_c.jpg differ diff --git a/src/dataset/tulip/16674945187_2aa40a52eb_c.jpg b/src/dataset/tulip/16674945187_2aa40a52eb_c.jpg new file mode 100644 index 00000000..80227df1 Binary files /dev/null and b/src/dataset/tulip/16674945187_2aa40a52eb_c.jpg differ diff --git a/src/dataset/tulip/16711068397_d5e31c804f_c.jpg b/src/dataset/tulip/16711068397_d5e31c804f_c.jpg new file mode 100644 index 00000000..c43681d2 Binary files /dev/null and b/src/dataset/tulip/16711068397_d5e31c804f_c.jpg differ diff --git a/src/dataset/tulip/16726946223_c9b004b11d_c.jpg b/src/dataset/tulip/16726946223_c9b004b11d_c.jpg new file mode 100644 index 00000000..befe4dc3 Binary files /dev/null and b/src/dataset/tulip/16726946223_c9b004b11d_c.jpg differ diff --git a/src/dataset/tulip/16730734878_620751bb2e_c.jpg b/src/dataset/tulip/16730734878_620751bb2e_c.jpg new file mode 100644 index 00000000..141cc4eb Binary files /dev/null and b/src/dataset/tulip/16730734878_620751bb2e_c.jpg differ diff --git a/src/dataset/tulip/16783143903_4ff33e4e50_c.jpg b/src/dataset/tulip/16783143903_4ff33e4e50_c.jpg new file mode 100644 index 00000000..92591170 Binary files /dev/null and b/src/dataset/tulip/16783143903_4ff33e4e50_c.jpg differ diff --git a/src/dataset/tulip/16832968049_22e8f38109_c.jpg b/src/dataset/tulip/16832968049_22e8f38109_c.jpg new file mode 100644 index 00000000..b47f3ab2 Binary files /dev/null and b/src/dataset/tulip/16832968049_22e8f38109_c.jpg differ diff --git a/src/dataset/tulip/16859971794_531987bfc2_c.jpg b/src/dataset/tulip/16859971794_531987bfc2_c.jpg new file mode 100644 index 00000000..6a318bb5 Binary files /dev/null and b/src/dataset/tulip/16859971794_531987bfc2_c.jpg differ diff --git a/src/dataset/tulip/16881454207_0af63d314a_c.jpg b/src/dataset/tulip/16881454207_0af63d314a_c.jpg new file mode 100644 index 00000000..72230cf9 Binary files /dev/null and b/src/dataset/tulip/16881454207_0af63d314a_c.jpg differ diff --git a/src/dataset/tulip/16884995745_c14337109f_c.jpg b/src/dataset/tulip/16884995745_c14337109f_c.jpg new file mode 100644 index 00000000..fa22a767 Binary files /dev/null and b/src/dataset/tulip/16884995745_c14337109f_c.jpg differ diff --git a/src/dataset/tulip/16891607282_be0102719a_c.jpg b/src/dataset/tulip/16891607282_be0102719a_c.jpg new file mode 100644 index 00000000..a1269745 Binary files /dev/null and b/src/dataset/tulip/16891607282_be0102719a_c.jpg differ diff --git a/src/dataset/tulip/16923731798_1bb2aa90cd_c.jpg b/src/dataset/tulip/16923731798_1bb2aa90cd_c.jpg new file mode 100644 index 00000000..1a74376b Binary files /dev/null and b/src/dataset/tulip/16923731798_1bb2aa90cd_c.jpg differ diff --git a/src/dataset/tulip/16923880949_cd8b8b26f6_c.jpg b/src/dataset/tulip/16923880949_cd8b8b26f6_c.jpg new file mode 100644 index 00000000..02cb1799 Binary files /dev/null and b/src/dataset/tulip/16923880949_cd8b8b26f6_c.jpg differ diff --git a/src/dataset/tulip/16955803792_74e2f0512c_c.jpg b/src/dataset/tulip/16955803792_74e2f0512c_c.jpg new file mode 100644 index 00000000..5873f3c7 Binary files /dev/null and b/src/dataset/tulip/16955803792_74e2f0512c_c.jpg differ diff --git a/src/dataset/tulip/16967733480_1f0584b491_c.jpg b/src/dataset/tulip/16967733480_1f0584b491_c.jpg new file mode 100644 index 00000000..93a67808 Binary files /dev/null and b/src/dataset/tulip/16967733480_1f0584b491_c.jpg differ diff --git a/src/dataset/tulip/16970689310_58dd227e49_c.jpg b/src/dataset/tulip/16970689310_58dd227e49_c.jpg new file mode 100644 index 00000000..0e65a060 Binary files /dev/null and b/src/dataset/tulip/16970689310_58dd227e49_c.jpg differ diff --git a/src/dataset/tulip/16990574989_84ea935171_c.jpg b/src/dataset/tulip/16990574989_84ea935171_c.jpg new file mode 100644 index 00000000..929e6f5f Binary files /dev/null and b/src/dataset/tulip/16990574989_84ea935171_c.jpg differ diff --git a/src/dataset/tulip/17000063538_a272e0f586_c.jpg b/src/dataset/tulip/17000063538_a272e0f586_c.jpg new file mode 100644 index 00000000..1310f00d Binary files /dev/null and b/src/dataset/tulip/17000063538_a272e0f586_c.jpg differ diff --git a/src/dataset/tulip/17014817238_35f0560483_c.jpg b/src/dataset/tulip/17014817238_35f0560483_c.jpg new file mode 100644 index 00000000..d2dcd3c1 Binary files /dev/null and b/src/dataset/tulip/17014817238_35f0560483_c.jpg differ diff --git a/src/dataset/tulip/17028343328_1de02cffc9_c.jpg b/src/dataset/tulip/17028343328_1de02cffc9_c.jpg new file mode 100644 index 00000000..1292d903 Binary files /dev/null and b/src/dataset/tulip/17028343328_1de02cffc9_c.jpg differ diff --git a/src/dataset/tulip/17029220466_85005b24d2_c.jpg b/src/dataset/tulip/17029220466_85005b24d2_c.jpg new file mode 100644 index 00000000..6472a6b1 Binary files /dev/null and b/src/dataset/tulip/17029220466_85005b24d2_c.jpg differ diff --git a/src/dataset/tulip/17039290000_27dd4c6d07_c.jpg b/src/dataset/tulip/17039290000_27dd4c6d07_c.jpg new file mode 100644 index 00000000..57d14dd2 Binary files /dev/null and b/src/dataset/tulip/17039290000_27dd4c6d07_c.jpg differ diff --git a/src/dataset/tulip/17048633025_5ddcfe6466_c.jpg b/src/dataset/tulip/17048633025_5ddcfe6466_c.jpg new file mode 100644 index 00000000..d126111d Binary files /dev/null and b/src/dataset/tulip/17048633025_5ddcfe6466_c.jpg differ diff --git a/src/dataset/tulip/17053805085_947023e8a7_c.jpg b/src/dataset/tulip/17053805085_947023e8a7_c.jpg new file mode 100644 index 00000000..bcae7e15 Binary files /dev/null and b/src/dataset/tulip/17053805085_947023e8a7_c.jpg differ diff --git a/src/dataset/tulip/17058580469_863a99df14_c.jpg b/src/dataset/tulip/17058580469_863a99df14_c.jpg new file mode 100644 index 00000000..4bd2aa06 Binary files /dev/null and b/src/dataset/tulip/17058580469_863a99df14_c.jpg differ diff --git a/src/dataset/tulip/17062879586_2563d59208_c.jpg b/src/dataset/tulip/17062879586_2563d59208_c.jpg new file mode 100644 index 00000000..a77c4582 Binary files /dev/null and b/src/dataset/tulip/17062879586_2563d59208_c.jpg differ diff --git a/src/dataset/tulip/17069348027_75a44e05ba_c.jpg b/src/dataset/tulip/17069348027_75a44e05ba_c.jpg new file mode 100644 index 00000000..e494923d Binary files /dev/null and b/src/dataset/tulip/17069348027_75a44e05ba_c.jpg differ diff --git a/src/dataset/tulip/17077994718_0946d35734_c.jpg b/src/dataset/tulip/17077994718_0946d35734_c.jpg new file mode 100644 index 00000000..7585c466 Binary files /dev/null and b/src/dataset/tulip/17077994718_0946d35734_c.jpg differ diff --git a/src/dataset/tulip/17083842888_991b082cb4_c.jpg b/src/dataset/tulip/17083842888_991b082cb4_c.jpg new file mode 100644 index 00000000..b50a7fdf Binary files /dev/null and b/src/dataset/tulip/17083842888_991b082cb4_c.jpg differ diff --git a/src/dataset/tulip/17088136461_0d484dddb9_c.jpg b/src/dataset/tulip/17088136461_0d484dddb9_c.jpg new file mode 100644 index 00000000..c8110ef2 Binary files /dev/null and b/src/dataset/tulip/17088136461_0d484dddb9_c.jpg differ diff --git a/src/dataset/tulip/17088849315_269b49d6a3_c.jpg b/src/dataset/tulip/17088849315_269b49d6a3_c.jpg new file mode 100644 index 00000000..e10f5a91 Binary files /dev/null and b/src/dataset/tulip/17088849315_269b49d6a3_c.jpg differ diff --git a/src/dataset/tulip/17089172180_eb753e9d71_c.jpg b/src/dataset/tulip/17089172180_eb753e9d71_c.jpg new file mode 100644 index 00000000..3f3a52e9 Binary files /dev/null and b/src/dataset/tulip/17089172180_eb753e9d71_c.jpg differ diff --git a/src/dataset/tulip/17089204150_20c2582a83_c.jpg b/src/dataset/tulip/17089204150_20c2582a83_c.jpg new file mode 100644 index 00000000..86e9138a Binary files /dev/null and b/src/dataset/tulip/17089204150_20c2582a83_c.jpg differ diff --git a/src/dataset/tulip/17094051828_645c44e83f_c.jpg b/src/dataset/tulip/17094051828_645c44e83f_c.jpg new file mode 100644 index 00000000..f5079bc0 Binary files /dev/null and b/src/dataset/tulip/17094051828_645c44e83f_c.jpg differ diff --git a/src/dataset/tulip/17114258361_b2a72c35b7_c.jpg b/src/dataset/tulip/17114258361_b2a72c35b7_c.jpg new file mode 100644 index 00000000..eb15af90 Binary files /dev/null and b/src/dataset/tulip/17114258361_b2a72c35b7_c.jpg differ diff --git a/src/dataset/tulip/17137751025_89bb099e3b_c.jpg b/src/dataset/tulip/17137751025_89bb099e3b_c.jpg new file mode 100644 index 00000000..2f941c8a Binary files /dev/null and b/src/dataset/tulip/17137751025_89bb099e3b_c.jpg differ diff --git a/src/dataset/tulip/171423959_764f705df5_c.jpg b/src/dataset/tulip/171423959_764f705df5_c.jpg new file mode 100644 index 00000000..852f3ebb Binary files /dev/null and b/src/dataset/tulip/171423959_764f705df5_c.jpg differ diff --git a/src/dataset/tulip/171424094_7295b8ab65_c.jpg b/src/dataset/tulip/171424094_7295b8ab65_c.jpg new file mode 100644 index 00000000..a0b60532 Binary files /dev/null and b/src/dataset/tulip/171424094_7295b8ab65_c.jpg differ diff --git a/src/dataset/tulip/171424340_b6887692af_c.jpg b/src/dataset/tulip/171424340_b6887692af_c.jpg new file mode 100644 index 00000000..b0f1b01e Binary files /dev/null and b/src/dataset/tulip/171424340_b6887692af_c.jpg differ diff --git a/src/dataset/tulip/171424408_2afabfbc3b_c.jpg b/src/dataset/tulip/171424408_2afabfbc3b_c.jpg new file mode 100644 index 00000000..17d46fb3 Binary files /dev/null and b/src/dataset/tulip/171424408_2afabfbc3b_c.jpg differ diff --git a/src/dataset/tulip/171424956_bfd8b88c1d_c.jpg b/src/dataset/tulip/171424956_bfd8b88c1d_c.jpg new file mode 100644 index 00000000..33da50f8 Binary files /dev/null and b/src/dataset/tulip/171424956_bfd8b88c1d_c.jpg differ diff --git a/src/dataset/tulip/171425055_a7df82f003_c.jpg b/src/dataset/tulip/171425055_a7df82f003_c.jpg new file mode 100644 index 00000000..14d6cc43 Binary files /dev/null and b/src/dataset/tulip/171425055_a7df82f003_c.jpg differ diff --git a/src/dataset/tulip/171425736_3802a2c612_c.jpg b/src/dataset/tulip/171425736_3802a2c612_c.jpg new file mode 100644 index 00000000..9f4fd190 Binary files /dev/null and b/src/dataset/tulip/171425736_3802a2c612_c.jpg differ diff --git a/src/dataset/tulip/171425825_507c149a63_c.jpg b/src/dataset/tulip/171425825_507c149a63_c.jpg new file mode 100644 index 00000000..95fe40ee Binary files /dev/null and b/src/dataset/tulip/171425825_507c149a63_c.jpg differ diff --git a/src/dataset/tulip/171426499_77e167683b_c.jpg b/src/dataset/tulip/171426499_77e167683b_c.jpg new file mode 100644 index 00000000..4ee8ba63 Binary files /dev/null and b/src/dataset/tulip/171426499_77e167683b_c.jpg differ diff --git a/src/dataset/tulip/17148225400_6a971ed490_c.jpg b/src/dataset/tulip/17148225400_6a971ed490_c.jpg new file mode 100644 index 00000000..50c161db Binary files /dev/null and b/src/dataset/tulip/17148225400_6a971ed490_c.jpg differ diff --git a/src/dataset/tulip/17149559759_b900574244_c.jpg b/src/dataset/tulip/17149559759_b900574244_c.jpg new file mode 100644 index 00000000..20fee471 Binary files /dev/null and b/src/dataset/tulip/17149559759_b900574244_c.jpg differ diff --git a/src/dataset/tulip/17168705046_01c951de83_c.jpg b/src/dataset/tulip/17168705046_01c951de83_c.jpg new file mode 100644 index 00000000..6f3dec48 Binary files /dev/null and b/src/dataset/tulip/17168705046_01c951de83_c.jpg differ diff --git a/src/dataset/tulip/17174969548_0f855629f6_c.jpg b/src/dataset/tulip/17174969548_0f855629f6_c.jpg new file mode 100644 index 00000000..0c026ed4 Binary files /dev/null and b/src/dataset/tulip/17174969548_0f855629f6_c.jpg differ diff --git a/src/dataset/tulip/17185236587_42e0463ae0_c.jpg b/src/dataset/tulip/17185236587_42e0463ae0_c.jpg new file mode 100644 index 00000000..0bc5a91a Binary files /dev/null and b/src/dataset/tulip/17185236587_42e0463ae0_c.jpg differ diff --git a/src/dataset/tulip/1721148764_3cc91a3b9f_c.jpg b/src/dataset/tulip/1721148764_3cc91a3b9f_c.jpg new file mode 100644 index 00000000..9f7bca20 Binary files /dev/null and b/src/dataset/tulip/1721148764_3cc91a3b9f_c.jpg differ diff --git a/src/dataset/tulip/17228579256_4a31671048_c.jpg b/src/dataset/tulip/17228579256_4a31671048_c.jpg new file mode 100644 index 00000000..124fb1f5 Binary files /dev/null and b/src/dataset/tulip/17228579256_4a31671048_c.jpg differ diff --git a/src/dataset/tulip/17272450095_c77eb3270b_c.jpg b/src/dataset/tulip/17272450095_c77eb3270b_c.jpg new file mode 100644 index 00000000..3266cad1 Binary files /dev/null and b/src/dataset/tulip/17272450095_c77eb3270b_c.jpg differ diff --git a/src/dataset/tulip/17274390900_7ef0d4e583_c.jpg b/src/dataset/tulip/17274390900_7ef0d4e583_c.jpg new file mode 100644 index 00000000..a287ed0c Binary files /dev/null and b/src/dataset/tulip/17274390900_7ef0d4e583_c.jpg differ diff --git a/src/dataset/tulip/17278427062_e780fd4dfc_c.jpg b/src/dataset/tulip/17278427062_e780fd4dfc_c.jpg new file mode 100644 index 00000000..aa162959 Binary files /dev/null and b/src/dataset/tulip/17278427062_e780fd4dfc_c.jpg differ diff --git a/src/dataset/tulip/17291960505_1932c839de_c.jpg b/src/dataset/tulip/17291960505_1932c839de_c.jpg new file mode 100644 index 00000000..a8c12063 Binary files /dev/null and b/src/dataset/tulip/17291960505_1932c839de_c.jpg differ diff --git a/src/dataset/tulip/17301743510_5a7c845bc4_c.jpg b/src/dataset/tulip/17301743510_5a7c845bc4_c.jpg new file mode 100644 index 00000000..81c98d2c Binary files /dev/null and b/src/dataset/tulip/17301743510_5a7c845bc4_c.jpg differ diff --git a/src/dataset/tulip/17335399221_c9c7631b7f_c.jpg b/src/dataset/tulip/17335399221_c9c7631b7f_c.jpg new file mode 100644 index 00000000..3b3efac9 Binary files /dev/null and b/src/dataset/tulip/17335399221_c9c7631b7f_c.jpg differ diff --git a/src/dataset/tulip/173579160_b1dbd2be38_c.jpg b/src/dataset/tulip/173579160_b1dbd2be38_c.jpg new file mode 100644 index 00000000..52f12726 Binary files /dev/null and b/src/dataset/tulip/173579160_b1dbd2be38_c.jpg differ diff --git a/src/dataset/tulip/17378050612_e153c53ba5_c.jpg b/src/dataset/tulip/17378050612_e153c53ba5_c.jpg new file mode 100644 index 00000000..fa1fccd3 Binary files /dev/null and b/src/dataset/tulip/17378050612_e153c53ba5_c.jpg differ diff --git a/src/dataset/tulip/17390719782_0002fa98a9_c.jpg b/src/dataset/tulip/17390719782_0002fa98a9_c.jpg new file mode 100644 index 00000000..59cbff78 Binary files /dev/null and b/src/dataset/tulip/17390719782_0002fa98a9_c.jpg differ diff --git a/src/dataset/tulip/174469419_cb561d9a5d_c.jpg b/src/dataset/tulip/174469419_cb561d9a5d_c.jpg new file mode 100644 index 00000000..8458aa50 Binary files /dev/null and b/src/dataset/tulip/174469419_cb561d9a5d_c.jpg differ diff --git a/src/dataset/tulip/17471970152_af8b033eae_c.jpg b/src/dataset/tulip/17471970152_af8b033eae_c.jpg new file mode 100644 index 00000000..0a1194d7 Binary files /dev/null and b/src/dataset/tulip/17471970152_af8b033eae_c.jpg differ diff --git a/src/dataset/tulip/17535699379_6d230c47f2_c.jpg b/src/dataset/tulip/17535699379_6d230c47f2_c.jpg new file mode 100644 index 00000000..63679732 Binary files /dev/null and b/src/dataset/tulip/17535699379_6d230c47f2_c.jpg differ diff --git a/src/dataset/tulip/17557452795_339574cab2_c.jpg b/src/dataset/tulip/17557452795_339574cab2_c.jpg new file mode 100644 index 00000000..ab583438 Binary files /dev/null and b/src/dataset/tulip/17557452795_339574cab2_c.jpg differ diff --git a/src/dataset/tulip/17622858052_71b447a7ed_c.jpg b/src/dataset/tulip/17622858052_71b447a7ed_c.jpg new file mode 100644 index 00000000..313941fa Binary files /dev/null and b/src/dataset/tulip/17622858052_71b447a7ed_c.jpg differ diff --git a/src/dataset/tulip/17735822381_75a17d7fcb_c.jpg b/src/dataset/tulip/17735822381_75a17d7fcb_c.jpg new file mode 100644 index 00000000..4e6e606f Binary files /dev/null and b/src/dataset/tulip/17735822381_75a17d7fcb_c.jpg differ diff --git a/src/dataset/tulip/177487054_c6615e3e58_c.jpg b/src/dataset/tulip/177487054_c6615e3e58_c.jpg new file mode 100644 index 00000000..36186a04 Binary files /dev/null and b/src/dataset/tulip/177487054_c6615e3e58_c.jpg differ diff --git a/src/dataset/tulip/17767794932_7ba87ce94d_c.jpg b/src/dataset/tulip/17767794932_7ba87ce94d_c.jpg new file mode 100644 index 00000000..d85ef5d2 Binary files /dev/null and b/src/dataset/tulip/17767794932_7ba87ce94d_c.jpg differ diff --git a/src/dataset/tulip/18540105_8b126d6915_c.jpg b/src/dataset/tulip/18540105_8b126d6915_c.jpg new file mode 100644 index 00000000..fdf3fa8b Binary files /dev/null and b/src/dataset/tulip/18540105_8b126d6915_c.jpg differ diff --git a/src/dataset/tulip/18825046698_29d023bb36_c.jpg b/src/dataset/tulip/18825046698_29d023bb36_c.jpg new file mode 100644 index 00000000..47f9ad9c Binary files /dev/null and b/src/dataset/tulip/18825046698_29d023bb36_c.jpg differ diff --git a/src/dataset/tulip/1895056794_f932bdece2_c.jpg b/src/dataset/tulip/1895056794_f932bdece2_c.jpg new file mode 100644 index 00000000..71cb4267 Binary files /dev/null and b/src/dataset/tulip/1895056794_f932bdece2_c.jpg differ diff --git a/src/dataset/tulip/18975647922_c77b0fa319_c.jpg b/src/dataset/tulip/18975647922_c77b0fa319_c.jpg new file mode 100644 index 00000000..91ec8132 Binary files /dev/null and b/src/dataset/tulip/18975647922_c77b0fa319_c.jpg differ diff --git a/src/dataset/tulip/19062984151_199079de2d_c.jpg b/src/dataset/tulip/19062984151_199079de2d_c.jpg new file mode 100644 index 00000000..1b811ff9 Binary files /dev/null and b/src/dataset/tulip/19062984151_199079de2d_c.jpg differ diff --git a/src/dataset/tulip/19561908365_a62e1d39d1_c.jpg b/src/dataset/tulip/19561908365_a62e1d39d1_c.jpg new file mode 100644 index 00000000..f4152454 Binary files /dev/null and b/src/dataset/tulip/19561908365_a62e1d39d1_c.jpg differ diff --git a/src/dataset/tulip/19587722976_2ed35f9df8_c.jpg b/src/dataset/tulip/19587722976_2ed35f9df8_c.jpg new file mode 100644 index 00000000..6d130c00 Binary files /dev/null and b/src/dataset/tulip/19587722976_2ed35f9df8_c.jpg differ diff --git a/src/dataset/tulip/19712960178_dc1fa5564f_c.jpg b/src/dataset/tulip/19712960178_dc1fa5564f_c.jpg new file mode 100644 index 00000000..2d1f29bc Binary files /dev/null and b/src/dataset/tulip/19712960178_dc1fa5564f_c.jpg differ diff --git a/src/dataset/tulip/20681033482_3210c288bc_c.jpg b/src/dataset/tulip/20681033482_3210c288bc_c.jpg new file mode 100644 index 00000000..a06ca81b Binary files /dev/null and b/src/dataset/tulip/20681033482_3210c288bc_c.jpg differ diff --git a/src/dataset/tulip/20762451504_87218d6a6b_c.jpg b/src/dataset/tulip/20762451504_87218d6a6b_c.jpg new file mode 100644 index 00000000..04614990 Binary files /dev/null and b/src/dataset/tulip/20762451504_87218d6a6b_c.jpg differ diff --git a/src/dataset/tulip/2085688195_e0ac4d2306_c.jpg b/src/dataset/tulip/2085688195_e0ac4d2306_c.jpg new file mode 100644 index 00000000..5a963b00 Binary files /dev/null and b/src/dataset/tulip/2085688195_e0ac4d2306_c.jpg differ diff --git a/src/dataset/tulip/2103628987_35cca218f8_c.jpg b/src/dataset/tulip/2103628987_35cca218f8_c.jpg new file mode 100644 index 00000000..641de9c3 Binary files /dev/null and b/src/dataset/tulip/2103628987_35cca218f8_c.jpg differ diff --git a/src/dataset/tulip/21150536012_6d587773a0_c.jpg b/src/dataset/tulip/21150536012_6d587773a0_c.jpg new file mode 100644 index 00000000..67de8b91 Binary files /dev/null and b/src/dataset/tulip/21150536012_6d587773a0_c.jpg differ diff --git a/src/dataset/tulip/214766724_3e74f45fc9_c.jpg b/src/dataset/tulip/214766724_3e74f45fc9_c.jpg new file mode 100644 index 00000000..c6c39993 Binary files /dev/null and b/src/dataset/tulip/214766724_3e74f45fc9_c.jpg differ diff --git a/src/dataset/tulip/21531554708_8ff67424d7_c.jpg b/src/dataset/tulip/21531554708_8ff67424d7_c.jpg new file mode 100644 index 00000000..d0fd3a54 Binary files /dev/null and b/src/dataset/tulip/21531554708_8ff67424d7_c.jpg differ diff --git a/src/dataset/tulip/21567227544_216388ea44_c.jpg b/src/dataset/tulip/21567227544_216388ea44_c.jpg new file mode 100644 index 00000000..1286540f Binary files /dev/null and b/src/dataset/tulip/21567227544_216388ea44_c.jpg differ diff --git a/src/dataset/tulip/2178263519_d5a6f5dd1c_c.jpg b/src/dataset/tulip/2178263519_d5a6f5dd1c_c.jpg new file mode 100644 index 00000000..297fd4dc Binary files /dev/null and b/src/dataset/tulip/2178263519_d5a6f5dd1c_c.jpg differ diff --git a/src/dataset/tulip/2189404890_fe5c3f3466_c.jpg b/src/dataset/tulip/2189404890_fe5c3f3466_c.jpg new file mode 100644 index 00000000..0e78fce9 Binary files /dev/null and b/src/dataset/tulip/2189404890_fe5c3f3466_c.jpg differ diff --git a/src/dataset/tulip/2208795918_c25ba32a6e_c.jpg b/src/dataset/tulip/2208795918_c25ba32a6e_c.jpg new file mode 100644 index 00000000..e6878e8a Binary files /dev/null and b/src/dataset/tulip/2208795918_c25ba32a6e_c.jpg differ diff --git a/src/dataset/tulip/2208831354_d0ce44e853_c.jpg b/src/dataset/tulip/2208831354_d0ce44e853_c.jpg new file mode 100644 index 00000000..7eec1cae Binary files /dev/null and b/src/dataset/tulip/2208831354_d0ce44e853_c.jpg differ diff --git a/src/dataset/tulip/22147615098_490ed6b74f_c.jpg b/src/dataset/tulip/22147615098_490ed6b74f_c.jpg new file mode 100644 index 00000000..d75d9cd1 Binary files /dev/null and b/src/dataset/tulip/22147615098_490ed6b74f_c.jpg differ diff --git a/src/dataset/tulip/2223101114_c2beef974d_c.jpg b/src/dataset/tulip/2223101114_c2beef974d_c.jpg new file mode 100644 index 00000000..293dcf20 Binary files /dev/null and b/src/dataset/tulip/2223101114_c2beef974d_c.jpg differ diff --git a/src/dataset/tulip/2242416445_0613041279_c.jpg b/src/dataset/tulip/2242416445_0613041279_c.jpg new file mode 100644 index 00000000..9f0eb1ad Binary files /dev/null and b/src/dataset/tulip/2242416445_0613041279_c.jpg differ diff --git a/src/dataset/tulip/227954048_4443d75bb4_c.jpg b/src/dataset/tulip/227954048_4443d75bb4_c.jpg new file mode 100644 index 00000000..31cf0da5 Binary files /dev/null and b/src/dataset/tulip/227954048_4443d75bb4_c.jpg differ diff --git a/src/dataset/tulip/2291474338_77257f1976_c.jpg b/src/dataset/tulip/2291474338_77257f1976_c.jpg new file mode 100644 index 00000000..0204b470 Binary files /dev/null and b/src/dataset/tulip/2291474338_77257f1976_c.jpg differ diff --git a/src/dataset/tulip/2304224721_4e7e8279a0_c.jpg b/src/dataset/tulip/2304224721_4e7e8279a0_c.jpg new file mode 100644 index 00000000..b10d2b73 Binary files /dev/null and b/src/dataset/tulip/2304224721_4e7e8279a0_c.jpg differ diff --git a/src/dataset/tulip/2305612096_da7af73aca_c.jpg b/src/dataset/tulip/2305612096_da7af73aca_c.jpg new file mode 100644 index 00000000..56ca184c Binary files /dev/null and b/src/dataset/tulip/2305612096_da7af73aca_c.jpg differ diff --git a/src/dataset/tulip/2320206103_929b4010ca_c.jpg b/src/dataset/tulip/2320206103_929b4010ca_c.jpg new file mode 100644 index 00000000..9700bd31 Binary files /dev/null and b/src/dataset/tulip/2320206103_929b4010ca_c.jpg differ diff --git a/src/dataset/tulip/2325178461_9c49b4db1b_c.jpg b/src/dataset/tulip/2325178461_9c49b4db1b_c.jpg new file mode 100644 index 00000000..094bdaf6 Binary files /dev/null and b/src/dataset/tulip/2325178461_9c49b4db1b_c.jpg differ diff --git a/src/dataset/tulip/2327966382_35f177eaa0_c.jpg b/src/dataset/tulip/2327966382_35f177eaa0_c.jpg new file mode 100644 index 00000000..779dca45 Binary files /dev/null and b/src/dataset/tulip/2327966382_35f177eaa0_c.jpg differ diff --git a/src/dataset/tulip/2331586901_31f1e1a755_c.jpg b/src/dataset/tulip/2331586901_31f1e1a755_c.jpg new file mode 100644 index 00000000..3c5a2da4 Binary files /dev/null and b/src/dataset/tulip/2331586901_31f1e1a755_c.jpg differ diff --git a/src/dataset/tulip/2347680478_2dda610f1b_c.jpg b/src/dataset/tulip/2347680478_2dda610f1b_c.jpg new file mode 100644 index 00000000..7e941f25 Binary files /dev/null and b/src/dataset/tulip/2347680478_2dda610f1b_c.jpg differ diff --git a/src/dataset/tulip/2368101420_b4bc2d4abc_c.jpg b/src/dataset/tulip/2368101420_b4bc2d4abc_c.jpg new file mode 100644 index 00000000..a96b6366 Binary files /dev/null and b/src/dataset/tulip/2368101420_b4bc2d4abc_c.jpg differ diff --git a/src/dataset/tulip/23729019323_9b43841ee8_c.jpg b/src/dataset/tulip/23729019323_9b43841ee8_c.jpg new file mode 100644 index 00000000..bd6da19b Binary files /dev/null and b/src/dataset/tulip/23729019323_9b43841ee8_c.jpg differ diff --git a/src/dataset/tulip/2382849663_f84933309a_c.jpg b/src/dataset/tulip/2382849663_f84933309a_c.jpg new file mode 100644 index 00000000..4d73cf86 Binary files /dev/null and b/src/dataset/tulip/2382849663_f84933309a_c.jpg differ diff --git a/src/dataset/tulip/2397144113_d22a624b97_c.jpg b/src/dataset/tulip/2397144113_d22a624b97_c.jpg new file mode 100644 index 00000000..d0649016 Binary files /dev/null and b/src/dataset/tulip/2397144113_d22a624b97_c.jpg differ diff --git a/src/dataset/tulip/2397144165_526ace4706_c.jpg b/src/dataset/tulip/2397144165_526ace4706_c.jpg new file mode 100644 index 00000000..2d3d7005 Binary files /dev/null and b/src/dataset/tulip/2397144165_526ace4706_c.jpg differ diff --git a/src/dataset/tulip/2409756318_29be966b2f_c.jpg b/src/dataset/tulip/2409756318_29be966b2f_c.jpg new file mode 100644 index 00000000..f68606f8 Binary files /dev/null and b/src/dataset/tulip/2409756318_29be966b2f_c.jpg differ diff --git a/src/dataset/tulip/2421503311_be9a820c35_c.jpg b/src/dataset/tulip/2421503311_be9a820c35_c.jpg new file mode 100644 index 00000000..a4b8b3c4 Binary files /dev/null and b/src/dataset/tulip/2421503311_be9a820c35_c.jpg differ diff --git a/src/dataset/tulip/2422326836_7c1d5c0b6f_c.jpg b/src/dataset/tulip/2422326836_7c1d5c0b6f_c.jpg new file mode 100644 index 00000000..d746c0ad Binary files /dev/null and b/src/dataset/tulip/2422326836_7c1d5c0b6f_c.jpg differ diff --git a/src/dataset/tulip/2425273072_e0685dfdbf_c.jpg b/src/dataset/tulip/2425273072_e0685dfdbf_c.jpg new file mode 100644 index 00000000..93b075d8 Binary files /dev/null and b/src/dataset/tulip/2425273072_e0685dfdbf_c.jpg differ diff --git a/src/dataset/tulip/2425781990_26ddd1b983_c.jpg b/src/dataset/tulip/2425781990_26ddd1b983_c.jpg new file mode 100644 index 00000000..ac01aeab Binary files /dev/null and b/src/dataset/tulip/2425781990_26ddd1b983_c.jpg differ diff --git a/src/dataset/tulip/2426573912_3b445cb9b0_c.jpg b/src/dataset/tulip/2426573912_3b445cb9b0_c.jpg new file mode 100644 index 00000000..e0965706 Binary files /dev/null and b/src/dataset/tulip/2426573912_3b445cb9b0_c.jpg differ diff --git a/src/dataset/tulip/2427481879_83c0a91c29_c.jpg b/src/dataset/tulip/2427481879_83c0a91c29_c.jpg new file mode 100644 index 00000000..a68bd36b Binary files /dev/null and b/src/dataset/tulip/2427481879_83c0a91c29_c.jpg differ diff --git a/src/dataset/tulip/2427484129_a5c0f8bbff_c.jpg b/src/dataset/tulip/2427484129_a5c0f8bbff_c.jpg new file mode 100644 index 00000000..85643239 Binary files /dev/null and b/src/dataset/tulip/2427484129_a5c0f8bbff_c.jpg differ diff --git a/src/dataset/tulip/2427487941_47a60ed00c_c.jpg b/src/dataset/tulip/2427487941_47a60ed00c_c.jpg new file mode 100644 index 00000000..622f88b7 Binary files /dev/null and b/src/dataset/tulip/2427487941_47a60ed00c_c.jpg differ diff --git a/src/dataset/tulip/2427488773_184d629d9d_c.jpg b/src/dataset/tulip/2427488773_184d629d9d_c.jpg new file mode 100644 index 00000000..e3b6f47d Binary files /dev/null and b/src/dataset/tulip/2427488773_184d629d9d_c.jpg differ diff --git a/src/dataset/tulip/2430047970_d2e4e1514a_c.jpg b/src/dataset/tulip/2430047970_d2e4e1514a_c.jpg new file mode 100644 index 00000000..77620c61 Binary files /dev/null and b/src/dataset/tulip/2430047970_d2e4e1514a_c.jpg differ diff --git a/src/dataset/tulip/2431851182_1a61b483f8_c.jpg b/src/dataset/tulip/2431851182_1a61b483f8_c.jpg new file mode 100644 index 00000000..37ad583d Binary files /dev/null and b/src/dataset/tulip/2431851182_1a61b483f8_c.jpg differ diff --git a/src/dataset/tulip/24375022979_c16a048b50_c.jpg b/src/dataset/tulip/24375022979_c16a048b50_c.jpg new file mode 100644 index 00000000..f70d1935 Binary files /dev/null and b/src/dataset/tulip/24375022979_c16a048b50_c.jpg differ diff --git a/src/dataset/tulip/2438788848_9fb73374bd_c.jpg b/src/dataset/tulip/2438788848_9fb73374bd_c.jpg new file mode 100644 index 00000000..808f7238 Binary files /dev/null and b/src/dataset/tulip/2438788848_9fb73374bd_c.jpg differ diff --git a/src/dataset/tulip/2442468117_de7ba496b9_c.jpg b/src/dataset/tulip/2442468117_de7ba496b9_c.jpg new file mode 100644 index 00000000..d3f6fac1 Binary files /dev/null and b/src/dataset/tulip/2442468117_de7ba496b9_c.jpg differ diff --git a/src/dataset/tulip/2442468277_13bd1c7be7_c.jpg b/src/dataset/tulip/2442468277_13bd1c7be7_c.jpg new file mode 100644 index 00000000..4cc8f7c0 Binary files /dev/null and b/src/dataset/tulip/2442468277_13bd1c7be7_c.jpg differ diff --git a/src/dataset/tulip/2446176442_5534827a2f_c.jpg b/src/dataset/tulip/2446176442_5534827a2f_c.jpg new file mode 100644 index 00000000..69e7dfd8 Binary files /dev/null and b/src/dataset/tulip/2446176442_5534827a2f_c.jpg differ diff --git a/src/dataset/tulip/24499984643_847e8f52ab_c.jpg b/src/dataset/tulip/24499984643_847e8f52ab_c.jpg new file mode 100644 index 00000000..9dcbc1ff Binary files /dev/null and b/src/dataset/tulip/24499984643_847e8f52ab_c.jpg differ diff --git a/src/dataset/tulip/2450191372_b683dd7b0b_c.jpg b/src/dataset/tulip/2450191372_b683dd7b0b_c.jpg new file mode 100644 index 00000000..98c4c4f8 Binary files /dev/null and b/src/dataset/tulip/2450191372_b683dd7b0b_c.jpg differ diff --git a/src/dataset/tulip/2457998022_a4519ba6ca_c.jpg b/src/dataset/tulip/2457998022_a4519ba6ca_c.jpg new file mode 100644 index 00000000..ea55fea1 Binary files /dev/null and b/src/dataset/tulip/2457998022_a4519ba6ca_c.jpg differ diff --git a/src/dataset/tulip/2458187364_5b987d6662_c.jpg b/src/dataset/tulip/2458187364_5b987d6662_c.jpg new file mode 100644 index 00000000..ecb8e408 Binary files /dev/null and b/src/dataset/tulip/2458187364_5b987d6662_c.jpg differ diff --git a/src/dataset/tulip/24588707570_da8e3d86fb_c.jpg b/src/dataset/tulip/24588707570_da8e3d86fb_c.jpg new file mode 100644 index 00000000..6392b984 Binary files /dev/null and b/src/dataset/tulip/24588707570_da8e3d86fb_c.jpg differ diff --git a/src/dataset/tulip/2467694139_3f35ddbc57_c.jpg b/src/dataset/tulip/2467694139_3f35ddbc57_c.jpg new file mode 100644 index 00000000..cb54168c Binary files /dev/null and b/src/dataset/tulip/2467694139_3f35ddbc57_c.jpg differ diff --git a/src/dataset/tulip/2468677508_093efed4df_c.jpg b/src/dataset/tulip/2468677508_093efed4df_c.jpg new file mode 100644 index 00000000..50c5908c Binary files /dev/null and b/src/dataset/tulip/2468677508_093efed4df_c.jpg differ diff --git a/src/dataset/tulip/2469214491_c5c6944847_c.jpg b/src/dataset/tulip/2469214491_c5c6944847_c.jpg new file mode 100644 index 00000000..5ed80cf0 Binary files /dev/null and b/src/dataset/tulip/2469214491_c5c6944847_c.jpg differ diff --git a/src/dataset/tulip/2469214749_03d63f69c1_c.jpg b/src/dataset/tulip/2469214749_03d63f69c1_c.jpg new file mode 100644 index 00000000..8bce7c68 Binary files /dev/null and b/src/dataset/tulip/2469214749_03d63f69c1_c.jpg differ diff --git a/src/dataset/tulip/2469914212_cb37f31f0e_c.jpg b/src/dataset/tulip/2469914212_cb37f31f0e_c.jpg new file mode 100644 index 00000000..84197f0d Binary files /dev/null and b/src/dataset/tulip/2469914212_cb37f31f0e_c.jpg differ diff --git a/src/dataset/tulip/2471738814_c1cd461424_c.jpg b/src/dataset/tulip/2471738814_c1cd461424_c.jpg new file mode 100644 index 00000000..42bb12a5 Binary files /dev/null and b/src/dataset/tulip/2471738814_c1cd461424_c.jpg differ diff --git a/src/dataset/tulip/2472976997_44b88d39c9_c.jpg b/src/dataset/tulip/2472976997_44b88d39c9_c.jpg new file mode 100644 index 00000000..af5ace93 Binary files /dev/null and b/src/dataset/tulip/2472976997_44b88d39c9_c.jpg differ diff --git a/src/dataset/tulip/24732645970_cf0d0dd94b_c.jpg b/src/dataset/tulip/24732645970_cf0d0dd94b_c.jpg new file mode 100644 index 00000000..2e79e63b Binary files /dev/null and b/src/dataset/tulip/24732645970_cf0d0dd94b_c.jpg differ diff --git a/src/dataset/tulip/2476252028_c85772f612_c.jpg b/src/dataset/tulip/2476252028_c85772f612_c.jpg new file mode 100644 index 00000000..01ff5e24 Binary files /dev/null and b/src/dataset/tulip/2476252028_c85772f612_c.jpg differ diff --git a/src/dataset/tulip/24806304776_05b479a165_c.jpg b/src/dataset/tulip/24806304776_05b479a165_c.jpg new file mode 100644 index 00000000..68cdae0b Binary files /dev/null and b/src/dataset/tulip/24806304776_05b479a165_c.jpg differ diff --git a/src/dataset/tulip/24901631102_54f22a1ba9_c.jpg b/src/dataset/tulip/24901631102_54f22a1ba9_c.jpg new file mode 100644 index 00000000..44dae173 Binary files /dev/null and b/src/dataset/tulip/24901631102_54f22a1ba9_c.jpg differ diff --git a/src/dataset/tulip/2490182031_777c661c08_c.jpg b/src/dataset/tulip/2490182031_777c661c08_c.jpg new file mode 100644 index 00000000..df68a5eb Binary files /dev/null and b/src/dataset/tulip/2490182031_777c661c08_c.jpg differ diff --git a/src/dataset/tulip/2490680018_3c0e64cf27_c.jpg b/src/dataset/tulip/2490680018_3c0e64cf27_c.jpg new file mode 100644 index 00000000..5e475e2f Binary files /dev/null and b/src/dataset/tulip/2490680018_3c0e64cf27_c.jpg differ diff --git a/src/dataset/tulip/2490997852_372227c4d8_c.jpg b/src/dataset/tulip/2490997852_372227c4d8_c.jpg new file mode 100644 index 00000000..5b8b68f5 Binary files /dev/null and b/src/dataset/tulip/2490997852_372227c4d8_c.jpg differ diff --git a/src/dataset/tulip/2500309962_7fcacf8bbe_c.jpg b/src/dataset/tulip/2500309962_7fcacf8bbe_c.jpg new file mode 100644 index 00000000..d1599ada Binary files /dev/null and b/src/dataset/tulip/2500309962_7fcacf8bbe_c.jpg differ diff --git a/src/dataset/tulip/25008601582_7822d4c001_c.jpg b/src/dataset/tulip/25008601582_7822d4c001_c.jpg new file mode 100644 index 00000000..f719bed5 Binary files /dev/null and b/src/dataset/tulip/25008601582_7822d4c001_c.jpg differ diff --git a/src/dataset/tulip/2501342185_4422b4d33f_c.jpg b/src/dataset/tulip/2501342185_4422b4d33f_c.jpg new file mode 100644 index 00000000..9747cbc0 Binary files /dev/null and b/src/dataset/tulip/2501342185_4422b4d33f_c.jpg differ diff --git a/src/dataset/tulip/25048430162_ed6f2f4106_c.jpg b/src/dataset/tulip/25048430162_ed6f2f4106_c.jpg new file mode 100644 index 00000000..e4f104d2 Binary files /dev/null and b/src/dataset/tulip/25048430162_ed6f2f4106_c.jpg differ diff --git a/src/dataset/tulip/2509124717_38da8b71b2_c.jpg b/src/dataset/tulip/2509124717_38da8b71b2_c.jpg new file mode 100644 index 00000000..2a5a9f84 Binary files /dev/null and b/src/dataset/tulip/2509124717_38da8b71b2_c.jpg differ diff --git a/src/dataset/tulip/25112947843_074c4e8113_c.jpg b/src/dataset/tulip/25112947843_074c4e8113_c.jpg new file mode 100644 index 00000000..24b5704d Binary files /dev/null and b/src/dataset/tulip/25112947843_074c4e8113_c.jpg differ diff --git a/src/dataset/tulip/2515093296_fb5414fcc3_c.jpg b/src/dataset/tulip/2515093296_fb5414fcc3_c.jpg new file mode 100644 index 00000000..561cf494 Binary files /dev/null and b/src/dataset/tulip/2515093296_fb5414fcc3_c.jpg differ diff --git a/src/dataset/tulip/2517865710_e060911905_c.jpg b/src/dataset/tulip/2517865710_e060911905_c.jpg new file mode 100644 index 00000000..84ea5175 Binary files /dev/null and b/src/dataset/tulip/2517865710_e060911905_c.jpg differ diff --git a/src/dataset/tulip/25507258043_b3df890907_c.jpg b/src/dataset/tulip/25507258043_b3df890907_c.jpg new file mode 100644 index 00000000..421d090e Binary files /dev/null and b/src/dataset/tulip/25507258043_b3df890907_c.jpg differ diff --git a/src/dataset/tulip/25549434781_9fa47da143_c.jpg b/src/dataset/tulip/25549434781_9fa47da143_c.jpg new file mode 100644 index 00000000..0b53c915 Binary files /dev/null and b/src/dataset/tulip/25549434781_9fa47da143_c.jpg differ diff --git a/src/dataset/tulip/25556954502_15c00eae85_c.jpg b/src/dataset/tulip/25556954502_15c00eae85_c.jpg new file mode 100644 index 00000000..ba29557a Binary files /dev/null and b/src/dataset/tulip/25556954502_15c00eae85_c.jpg differ diff --git a/src/dataset/tulip/25575097843_9568cd2a4f_c.jpg b/src/dataset/tulip/25575097843_9568cd2a4f_c.jpg new file mode 100644 index 00000000..81ee35ac Binary files /dev/null and b/src/dataset/tulip/25575097843_9568cd2a4f_c.jpg differ diff --git a/src/dataset/tulip/25583477203_89bda289e6_c.jpg b/src/dataset/tulip/25583477203_89bda289e6_c.jpg new file mode 100644 index 00000000..28506c57 Binary files /dev/null and b/src/dataset/tulip/25583477203_89bda289e6_c.jpg differ diff --git a/src/dataset/tulip/25588346963_476d2df7a9_c.jpg b/src/dataset/tulip/25588346963_476d2df7a9_c.jpg new file mode 100644 index 00000000..3e06bd08 Binary files /dev/null and b/src/dataset/tulip/25588346963_476d2df7a9_c.jpg differ diff --git a/src/dataset/tulip/25631104341_4d52b6f165_c.jpg b/src/dataset/tulip/25631104341_4d52b6f165_c.jpg new file mode 100644 index 00000000..82dbb824 Binary files /dev/null and b/src/dataset/tulip/25631104341_4d52b6f165_c.jpg differ diff --git a/src/dataset/tulip/25644836461_8bc6ed53e7_c.jpg b/src/dataset/tulip/25644836461_8bc6ed53e7_c.jpg new file mode 100644 index 00000000..a54c0f66 Binary files /dev/null and b/src/dataset/tulip/25644836461_8bc6ed53e7_c.jpg differ diff --git a/src/dataset/tulip/2565512203_c20b0ff2ef_c.jpg b/src/dataset/tulip/2565512203_c20b0ff2ef_c.jpg new file mode 100644 index 00000000..cdabb504 Binary files /dev/null and b/src/dataset/tulip/2565512203_c20b0ff2ef_c.jpg differ diff --git a/src/dataset/tulip/25719155344_cb87cf3ac2_c.jpg b/src/dataset/tulip/25719155344_cb87cf3ac2_c.jpg new file mode 100644 index 00000000..aa6dd694 Binary files /dev/null and b/src/dataset/tulip/25719155344_cb87cf3ac2_c.jpg differ diff --git a/src/dataset/tulip/25719172754_4eb3b70597_c.jpg b/src/dataset/tulip/25719172754_4eb3b70597_c.jpg new file mode 100644 index 00000000..7e7f1f39 Binary files /dev/null and b/src/dataset/tulip/25719172754_4eb3b70597_c.jpg differ diff --git a/src/dataset/tulip/25721245503_9c6f86f48e_c.jpg b/src/dataset/tulip/25721245503_9c6f86f48e_c.jpg new file mode 100644 index 00000000..8ea96ba7 Binary files /dev/null and b/src/dataset/tulip/25721245503_9c6f86f48e_c.jpg differ diff --git a/src/dataset/tulip/25733156914_4106ec6c50_c.jpg b/src/dataset/tulip/25733156914_4106ec6c50_c.jpg new file mode 100644 index 00000000..d4df5494 Binary files /dev/null and b/src/dataset/tulip/25733156914_4106ec6c50_c.jpg differ diff --git a/src/dataset/tulip/2573718443_2b1498f05d_c.jpg b/src/dataset/tulip/2573718443_2b1498f05d_c.jpg new file mode 100644 index 00000000..f436c960 Binary files /dev/null and b/src/dataset/tulip/2573718443_2b1498f05d_c.jpg differ diff --git a/src/dataset/tulip/25737493953_ea818d174f_c.jpg b/src/dataset/tulip/25737493953_ea818d174f_c.jpg new file mode 100644 index 00000000..8cc99d48 Binary files /dev/null and b/src/dataset/tulip/25737493953_ea818d174f_c.jpg differ diff --git a/src/dataset/tulip/2573951201_214427ca20_c.jpg b/src/dataset/tulip/2573951201_214427ca20_c.jpg new file mode 100644 index 00000000..eba16c13 Binary files /dev/null and b/src/dataset/tulip/2573951201_214427ca20_c.jpg differ diff --git a/src/dataset/tulip/2580538369_3f1e88790e_c.jpg b/src/dataset/tulip/2580538369_3f1e88790e_c.jpg new file mode 100644 index 00000000..11f90651 Binary files /dev/null and b/src/dataset/tulip/2580538369_3f1e88790e_c.jpg differ diff --git a/src/dataset/tulip/2581351476_0ff3618374_c.jpg b/src/dataset/tulip/2581351476_0ff3618374_c.jpg new file mode 100644 index 00000000..76b4c0d3 Binary files /dev/null and b/src/dataset/tulip/2581351476_0ff3618374_c.jpg differ diff --git a/src/dataset/tulip/2581355948_004e41a341_c.jpg b/src/dataset/tulip/2581355948_004e41a341_c.jpg new file mode 100644 index 00000000..342c7799 Binary files /dev/null and b/src/dataset/tulip/2581355948_004e41a341_c.jpg differ diff --git a/src/dataset/tulip/2581360032_436d88726f_c.jpg b/src/dataset/tulip/2581360032_436d88726f_c.jpg new file mode 100644 index 00000000..539d1ce6 Binary files /dev/null and b/src/dataset/tulip/2581360032_436d88726f_c.jpg differ diff --git a/src/dataset/tulip/2581362934_53c8c22ef8_c.jpg b/src/dataset/tulip/2581362934_53c8c22ef8_c.jpg new file mode 100644 index 00000000..71d65a05 Binary files /dev/null and b/src/dataset/tulip/2581362934_53c8c22ef8_c.jpg differ diff --git a/src/dataset/tulip/2581380698_1b69526799_c.jpg b/src/dataset/tulip/2581380698_1b69526799_c.jpg new file mode 100644 index 00000000..f23dc3d3 Binary files /dev/null and b/src/dataset/tulip/2581380698_1b69526799_c.jpg differ diff --git a/src/dataset/tulip/25823281684_6d7d509677_c.jpg b/src/dataset/tulip/25823281684_6d7d509677_c.jpg new file mode 100644 index 00000000..078ba509 Binary files /dev/null and b/src/dataset/tulip/25823281684_6d7d509677_c.jpg differ diff --git a/src/dataset/tulip/25885579914_18a2cfd716_c.jpg b/src/dataset/tulip/25885579914_18a2cfd716_c.jpg new file mode 100644 index 00000000..2db7c3ca Binary files /dev/null and b/src/dataset/tulip/25885579914_18a2cfd716_c.jpg differ diff --git a/src/dataset/tulip/25886425933_80f9942654_c.jpg b/src/dataset/tulip/25886425933_80f9942654_c.jpg new file mode 100644 index 00000000..4d55b4d5 Binary files /dev/null and b/src/dataset/tulip/25886425933_80f9942654_c.jpg differ diff --git a/src/dataset/tulip/25896454655_d7c2cb95f6_c.jpg b/src/dataset/tulip/25896454655_d7c2cb95f6_c.jpg new file mode 100644 index 00000000..11df0674 Binary files /dev/null and b/src/dataset/tulip/25896454655_d7c2cb95f6_c.jpg differ diff --git a/src/dataset/tulip/25918148970_b31de9fdc0_c.jpg b/src/dataset/tulip/25918148970_b31de9fdc0_c.jpg new file mode 100644 index 00000000..68124686 Binary files /dev/null and b/src/dataset/tulip/25918148970_b31de9fdc0_c.jpg differ diff --git a/src/dataset/tulip/25918392793_c8ddf2b0b3_c.jpg b/src/dataset/tulip/25918392793_c8ddf2b0b3_c.jpg new file mode 100644 index 00000000..a377f355 Binary files /dev/null and b/src/dataset/tulip/25918392793_c8ddf2b0b3_c.jpg differ diff --git a/src/dataset/tulip/25955265910_9dc681b6de_c.jpg b/src/dataset/tulip/25955265910_9dc681b6de_c.jpg new file mode 100644 index 00000000..e38f799b Binary files /dev/null and b/src/dataset/tulip/25955265910_9dc681b6de_c.jpg differ diff --git a/src/dataset/tulip/26009099724_6bd18fe794_c.jpg b/src/dataset/tulip/26009099724_6bd18fe794_c.jpg new file mode 100644 index 00000000..c2123691 Binary files /dev/null and b/src/dataset/tulip/26009099724_6bd18fe794_c.jpg differ diff --git a/src/dataset/tulip/26042838032_727e3ca103_c.jpg b/src/dataset/tulip/26042838032_727e3ca103_c.jpg new file mode 100644 index 00000000..4680e3bb Binary files /dev/null and b/src/dataset/tulip/26042838032_727e3ca103_c.jpg differ diff --git a/src/dataset/tulip/26045486794_51419883bb_c.jpg b/src/dataset/tulip/26045486794_51419883bb_c.jpg new file mode 100644 index 00000000..9913fe92 Binary files /dev/null and b/src/dataset/tulip/26045486794_51419883bb_c.jpg differ diff --git a/src/dataset/tulip/26053688363_830cb91bfb_c.jpg b/src/dataset/tulip/26053688363_830cb91bfb_c.jpg new file mode 100644 index 00000000..d2e9edde Binary files /dev/null and b/src/dataset/tulip/26053688363_830cb91bfb_c.jpg differ diff --git a/src/dataset/tulip/260904578_d37801d52e_c.jpg b/src/dataset/tulip/260904578_d37801d52e_c.jpg new file mode 100644 index 00000000..71e7e407 Binary files /dev/null and b/src/dataset/tulip/260904578_d37801d52e_c.jpg differ diff --git a/src/dataset/tulip/26096925041_c397163e7f_c.jpg b/src/dataset/tulip/26096925041_c397163e7f_c.jpg new file mode 100644 index 00000000..082ac5d0 Binary files /dev/null and b/src/dataset/tulip/26096925041_c397163e7f_c.jpg differ diff --git a/src/dataset/tulip/26098544102_baecd74c8b_c.jpg b/src/dataset/tulip/26098544102_baecd74c8b_c.jpg new file mode 100644 index 00000000..4648bc73 Binary files /dev/null and b/src/dataset/tulip/26098544102_baecd74c8b_c.jpg differ diff --git a/src/dataset/tulip/26098560492_b08ce0d714_c.jpg b/src/dataset/tulip/26098560492_b08ce0d714_c.jpg new file mode 100644 index 00000000..2862a1b2 Binary files /dev/null and b/src/dataset/tulip/26098560492_b08ce0d714_c.jpg differ diff --git a/src/dataset/tulip/26106955220_9be30d12c4_c.jpg b/src/dataset/tulip/26106955220_9be30d12c4_c.jpg new file mode 100644 index 00000000..61245276 Binary files /dev/null and b/src/dataset/tulip/26106955220_9be30d12c4_c.jpg differ diff --git a/src/dataset/tulip/26165070966_c49c3c19eb_c.jpg b/src/dataset/tulip/26165070966_c49c3c19eb_c.jpg new file mode 100644 index 00000000..bae42d55 Binary files /dev/null and b/src/dataset/tulip/26165070966_c49c3c19eb_c.jpg differ diff --git a/src/dataset/tulip/26165072296_4ac7c83c08_c.jpg b/src/dataset/tulip/26165072296_4ac7c83c08_c.jpg new file mode 100644 index 00000000..ca436b52 Binary files /dev/null and b/src/dataset/tulip/26165072296_4ac7c83c08_c.jpg differ diff --git a/src/dataset/tulip/26165075966_170a54f941_c.jpg b/src/dataset/tulip/26165075966_170a54f941_c.jpg new file mode 100644 index 00000000..854682b6 Binary files /dev/null and b/src/dataset/tulip/26165075966_170a54f941_c.jpg differ diff --git a/src/dataset/tulip/26173387464_76d9786818_c.jpg b/src/dataset/tulip/26173387464_76d9786818_c.jpg new file mode 100644 index 00000000..ad565622 Binary files /dev/null and b/src/dataset/tulip/26173387464_76d9786818_c.jpg differ diff --git a/src/dataset/tulip/26184116882_8f3a2f3924_c.jpg b/src/dataset/tulip/26184116882_8f3a2f3924_c.jpg new file mode 100644 index 00000000..2feb195c Binary files /dev/null and b/src/dataset/tulip/26184116882_8f3a2f3924_c.jpg differ diff --git a/src/dataset/tulip/26192673126_dfb45f7b39_c.jpg b/src/dataset/tulip/26192673126_dfb45f7b39_c.jpg new file mode 100644 index 00000000..669aea45 Binary files /dev/null and b/src/dataset/tulip/26192673126_dfb45f7b39_c.jpg differ diff --git a/src/dataset/tulip/26226081973_a5157c0d8f_c.jpg b/src/dataset/tulip/26226081973_a5157c0d8f_c.jpg new file mode 100644 index 00000000..abe9cd56 Binary files /dev/null and b/src/dataset/tulip/26226081973_a5157c0d8f_c.jpg differ diff --git a/src/dataset/tulip/26246978395_3792ec09ab_c.jpg b/src/dataset/tulip/26246978395_3792ec09ab_c.jpg new file mode 100644 index 00000000..25aaba6b Binary files /dev/null and b/src/dataset/tulip/26246978395_3792ec09ab_c.jpg differ diff --git a/src/dataset/tulip/26252479473_a579972746_c.jpg b/src/dataset/tulip/26252479473_a579972746_c.jpg new file mode 100644 index 00000000..60adc3b2 Binary files /dev/null and b/src/dataset/tulip/26252479473_a579972746_c.jpg differ diff --git a/src/dataset/tulip/26264721746_f8c954df29_c.jpg b/src/dataset/tulip/26264721746_f8c954df29_c.jpg new file mode 100644 index 00000000..44a6736e Binary files /dev/null and b/src/dataset/tulip/26264721746_f8c954df29_c.jpg differ diff --git a/src/dataset/tulip/26273460465_fe4367e05b_c.jpg b/src/dataset/tulip/26273460465_fe4367e05b_c.jpg new file mode 100644 index 00000000..8c054c51 Binary files /dev/null and b/src/dataset/tulip/26273460465_fe4367e05b_c.jpg differ diff --git a/src/dataset/tulip/26301922320_9a5294080e_c.jpg b/src/dataset/tulip/26301922320_9a5294080e_c.jpg new file mode 100644 index 00000000..56122b75 Binary files /dev/null and b/src/dataset/tulip/26301922320_9a5294080e_c.jpg differ diff --git a/src/dataset/tulip/26313354756_2978eb9a7b_c.jpg b/src/dataset/tulip/26313354756_2978eb9a7b_c.jpg new file mode 100644 index 00000000..884feb46 Binary files /dev/null and b/src/dataset/tulip/26313354756_2978eb9a7b_c.jpg differ diff --git a/src/dataset/tulip/26347273022_a36891b642_c.jpg b/src/dataset/tulip/26347273022_a36891b642_c.jpg new file mode 100644 index 00000000..12d030dd Binary files /dev/null and b/src/dataset/tulip/26347273022_a36891b642_c.jpg differ diff --git a/src/dataset/tulip/26350857964_2ba4921cb3_c.jpg b/src/dataset/tulip/26350857964_2ba4921cb3_c.jpg new file mode 100644 index 00000000..838b7d57 Binary files /dev/null and b/src/dataset/tulip/26350857964_2ba4921cb3_c.jpg differ diff --git a/src/dataset/tulip/26367332111_5310311091_c.jpg b/src/dataset/tulip/26367332111_5310311091_c.jpg new file mode 100644 index 00000000..aa7ee20e Binary files /dev/null and b/src/dataset/tulip/26367332111_5310311091_c.jpg differ diff --git a/src/dataset/tulip/26370713202_e011b2d5d7_c.jpg b/src/dataset/tulip/26370713202_e011b2d5d7_c.jpg new file mode 100644 index 00000000..0ab3fa36 Binary files /dev/null and b/src/dataset/tulip/26370713202_e011b2d5d7_c.jpg differ diff --git a/src/dataset/tulip/26401433440_154c74f68e_c.jpg b/src/dataset/tulip/26401433440_154c74f68e_c.jpg new file mode 100644 index 00000000..0ffaa17f Binary files /dev/null and b/src/dataset/tulip/26401433440_154c74f68e_c.jpg differ diff --git a/src/dataset/tulip/26401510753_3e1859e776_c.jpg b/src/dataset/tulip/26401510753_3e1859e776_c.jpg new file mode 100644 index 00000000..9e72c1e5 Binary files /dev/null and b/src/dataset/tulip/26401510753_3e1859e776_c.jpg differ diff --git a/src/dataset/tulip/26428652305_1ee15f6328_c.jpg b/src/dataset/tulip/26428652305_1ee15f6328_c.jpg new file mode 100644 index 00000000..b67f97bd Binary files /dev/null and b/src/dataset/tulip/26428652305_1ee15f6328_c.jpg differ diff --git a/src/dataset/tulip/26433113431_8ddb0aab56_c.jpg b/src/dataset/tulip/26433113431_8ddb0aab56_c.jpg new file mode 100644 index 00000000..011a69e7 Binary files /dev/null and b/src/dataset/tulip/26433113431_8ddb0aab56_c.jpg differ diff --git a/src/dataset/tulip/26437272955_68725f60c2_c.jpg b/src/dataset/tulip/26437272955_68725f60c2_c.jpg new file mode 100644 index 00000000..e24f85bc Binary files /dev/null and b/src/dataset/tulip/26437272955_68725f60c2_c.jpg differ diff --git a/src/dataset/tulip/26460718206_a410693208_c.jpg b/src/dataset/tulip/26460718206_a410693208_c.jpg new file mode 100644 index 00000000..b65051ee Binary files /dev/null and b/src/dataset/tulip/26460718206_a410693208_c.jpg differ diff --git a/src/dataset/tulip/26468572781_5295554fd9_c.jpg b/src/dataset/tulip/26468572781_5295554fd9_c.jpg new file mode 100644 index 00000000..2f95e277 Binary files /dev/null and b/src/dataset/tulip/26468572781_5295554fd9_c.jpg differ diff --git a/src/dataset/tulip/26473285296_d6e6ddebe5_c.jpg b/src/dataset/tulip/26473285296_d6e6ddebe5_c.jpg new file mode 100644 index 00000000..6acff003 Binary files /dev/null and b/src/dataset/tulip/26473285296_d6e6ddebe5_c.jpg differ diff --git a/src/dataset/tulip/26480940321_bc6e40cc78_c.jpg b/src/dataset/tulip/26480940321_bc6e40cc78_c.jpg new file mode 100644 index 00000000..82b09e01 Binary files /dev/null and b/src/dataset/tulip/26480940321_bc6e40cc78_c.jpg differ diff --git a/src/dataset/tulip/26485403600_2db1a77c99_c.jpg b/src/dataset/tulip/26485403600_2db1a77c99_c.jpg new file mode 100644 index 00000000..5e4275c1 Binary files /dev/null and b/src/dataset/tulip/26485403600_2db1a77c99_c.jpg differ diff --git a/src/dataset/tulip/26502069995_ebf0f8ca11_c.jpg b/src/dataset/tulip/26502069995_ebf0f8ca11_c.jpg new file mode 100644 index 00000000..434d25d0 Binary files /dev/null and b/src/dataset/tulip/26502069995_ebf0f8ca11_c.jpg differ diff --git a/src/dataset/tulip/26508062122_dc802de55e_c.jpg b/src/dataset/tulip/26508062122_dc802de55e_c.jpg new file mode 100644 index 00000000..34cb96f6 Binary files /dev/null and b/src/dataset/tulip/26508062122_dc802de55e_c.jpg differ diff --git a/src/dataset/tulip/26524110401_24e58962bc_c.jpg b/src/dataset/tulip/26524110401_24e58962bc_c.jpg new file mode 100644 index 00000000..d44eec2b Binary files /dev/null and b/src/dataset/tulip/26524110401_24e58962bc_c.jpg differ diff --git a/src/dataset/tulip/26529315715_42d38dbe70_c.jpg b/src/dataset/tulip/26529315715_42d38dbe70_c.jpg new file mode 100644 index 00000000..81dc3341 Binary files /dev/null and b/src/dataset/tulip/26529315715_42d38dbe70_c.jpg differ diff --git a/src/dataset/tulip/26532078565_2f9e6f5f17_c.jpg b/src/dataset/tulip/26532078565_2f9e6f5f17_c.jpg new file mode 100644 index 00000000..7245e8ce Binary files /dev/null and b/src/dataset/tulip/26532078565_2f9e6f5f17_c.jpg differ diff --git a/src/dataset/tulip/26536485576_c8bca6e0e2_c.jpg b/src/dataset/tulip/26536485576_c8bca6e0e2_c.jpg new file mode 100644 index 00000000..5d72ee89 Binary files /dev/null and b/src/dataset/tulip/26536485576_c8bca6e0e2_c.jpg differ diff --git a/src/dataset/tulip/26563022276_0415cccfef_c.jpg b/src/dataset/tulip/26563022276_0415cccfef_c.jpg new file mode 100644 index 00000000..f264592a Binary files /dev/null and b/src/dataset/tulip/26563022276_0415cccfef_c.jpg differ diff --git a/src/dataset/tulip/26568545243_168bbbcc7b_c.jpg b/src/dataset/tulip/26568545243_168bbbcc7b_c.jpg new file mode 100644 index 00000000..ff6ac52d Binary files /dev/null and b/src/dataset/tulip/26568545243_168bbbcc7b_c.jpg differ diff --git a/src/dataset/tulip/26593149975_bf1eb67a4f_c.jpg b/src/dataset/tulip/26593149975_bf1eb67a4f_c.jpg new file mode 100644 index 00000000..07d17cb4 Binary files /dev/null and b/src/dataset/tulip/26593149975_bf1eb67a4f_c.jpg differ diff --git a/src/dataset/tulip/26598142995_c124acc639_c.jpg b/src/dataset/tulip/26598142995_c124acc639_c.jpg new file mode 100644 index 00000000..03bde72d Binary files /dev/null and b/src/dataset/tulip/26598142995_c124acc639_c.jpg differ diff --git a/src/dataset/tulip/26623880806_a135358d74_c.jpg b/src/dataset/tulip/26623880806_a135358d74_c.jpg new file mode 100644 index 00000000..78c3a11c Binary files /dev/null and b/src/dataset/tulip/26623880806_a135358d74_c.jpg differ diff --git a/src/dataset/tulip/26628001721_bb1d340cc5_c.jpg b/src/dataset/tulip/26628001721_bb1d340cc5_c.jpg new file mode 100644 index 00000000..1c028618 Binary files /dev/null and b/src/dataset/tulip/26628001721_bb1d340cc5_c.jpg differ diff --git a/src/dataset/tulip/26628986786_a91ce5a31e_c.jpg b/src/dataset/tulip/26628986786_a91ce5a31e_c.jpg new file mode 100644 index 00000000..c371888e Binary files /dev/null and b/src/dataset/tulip/26628986786_a91ce5a31e_c.jpg differ diff --git a/src/dataset/tulip/26675566065_7ec2a438f3_c.jpg b/src/dataset/tulip/26675566065_7ec2a438f3_c.jpg new file mode 100644 index 00000000..3042aa60 Binary files /dev/null and b/src/dataset/tulip/26675566065_7ec2a438f3_c.jpg differ diff --git a/src/dataset/tulip/26756749334_0a5ce7d633_c.jpg b/src/dataset/tulip/26756749334_0a5ce7d633_c.jpg new file mode 100644 index 00000000..5239f2ec Binary files /dev/null and b/src/dataset/tulip/26756749334_0a5ce7d633_c.jpg differ diff --git a/src/dataset/tulip/26828680606_740d1c6930_c.jpg b/src/dataset/tulip/26828680606_740d1c6930_c.jpg new file mode 100644 index 00000000..57e28f44 Binary files /dev/null and b/src/dataset/tulip/26828680606_740d1c6930_c.jpg differ diff --git a/src/dataset/tulip/26830703125_b3f219f707_c.jpg b/src/dataset/tulip/26830703125_b3f219f707_c.jpg new file mode 100644 index 00000000..e09352ef Binary files /dev/null and b/src/dataset/tulip/26830703125_b3f219f707_c.jpg differ diff --git a/src/dataset/tulip/26838468156_6df50a3cf2_c.jpg b/src/dataset/tulip/26838468156_6df50a3cf2_c.jpg new file mode 100644 index 00000000..8070c723 Binary files /dev/null and b/src/dataset/tulip/26838468156_6df50a3cf2_c.jpg differ diff --git a/src/dataset/tulip/26912662953_0ceb9f31f6_c.jpg b/src/dataset/tulip/26912662953_0ceb9f31f6_c.jpg new file mode 100644 index 00000000..35a23eec Binary files /dev/null and b/src/dataset/tulip/26912662953_0ceb9f31f6_c.jpg differ diff --git a/src/dataset/tulip/26977796872_660296af11_c.jpg b/src/dataset/tulip/26977796872_660296af11_c.jpg new file mode 100644 index 00000000..5effbc2c Binary files /dev/null and b/src/dataset/tulip/26977796872_660296af11_c.jpg differ diff --git a/src/dataset/tulip/26997035126_6bbe0a59c4_c.jpg b/src/dataset/tulip/26997035126_6bbe0a59c4_c.jpg new file mode 100644 index 00000000..6f51d270 Binary files /dev/null and b/src/dataset/tulip/26997035126_6bbe0a59c4_c.jpg differ diff --git a/src/dataset/tulip/27122968901_f2c81e29a7_c.jpg b/src/dataset/tulip/27122968901_f2c81e29a7_c.jpg new file mode 100644 index 00000000..b952af52 Binary files /dev/null and b/src/dataset/tulip/27122968901_f2c81e29a7_c.jpg differ diff --git a/src/dataset/tulip/2714254656_b31c1293d6_c.jpg b/src/dataset/tulip/2714254656_b31c1293d6_c.jpg new file mode 100644 index 00000000..4bd4859e Binary files /dev/null and b/src/dataset/tulip/2714254656_b31c1293d6_c.jpg differ diff --git a/src/dataset/tulip/27153462636_1793113a65_c.jpg b/src/dataset/tulip/27153462636_1793113a65_c.jpg new file mode 100644 index 00000000..f5f06399 Binary files /dev/null and b/src/dataset/tulip/27153462636_1793113a65_c.jpg differ diff --git a/src/dataset/tulip/27204994370_ff970ffa21_c.jpg b/src/dataset/tulip/27204994370_ff970ffa21_c.jpg new file mode 100644 index 00000000..dab849a7 Binary files /dev/null and b/src/dataset/tulip/27204994370_ff970ffa21_c.jpg differ diff --git a/src/dataset/tulip/27204996260_d3968cd8b0_c.jpg b/src/dataset/tulip/27204996260_d3968cd8b0_c.jpg new file mode 100644 index 00000000..97d2cb56 Binary files /dev/null and b/src/dataset/tulip/27204996260_d3968cd8b0_c.jpg differ diff --git a/src/dataset/tulip/27228825062_b6a2fb2571_c.jpg b/src/dataset/tulip/27228825062_b6a2fb2571_c.jpg new file mode 100644 index 00000000..e9a84454 Binary files /dev/null and b/src/dataset/tulip/27228825062_b6a2fb2571_c.jpg differ diff --git a/src/dataset/tulip/27238670401_8bf8d4cf73_c.jpg b/src/dataset/tulip/27238670401_8bf8d4cf73_c.jpg new file mode 100644 index 00000000..fac514f9 Binary files /dev/null and b/src/dataset/tulip/27238670401_8bf8d4cf73_c.jpg differ diff --git a/src/dataset/tulip/27245129182_d50313e9a4_c.jpg b/src/dataset/tulip/27245129182_d50313e9a4_c.jpg new file mode 100644 index 00000000..160158bb Binary files /dev/null and b/src/dataset/tulip/27245129182_d50313e9a4_c.jpg differ diff --git a/src/dataset/tulip/2726796001_8e1e7430e8_c.jpg b/src/dataset/tulip/2726796001_8e1e7430e8_c.jpg new file mode 100644 index 00000000..df1eddca Binary files /dev/null and b/src/dataset/tulip/2726796001_8e1e7430e8_c.jpg differ diff --git a/src/dataset/tulip/27292122652_532aef233a_c.jpg b/src/dataset/tulip/27292122652_532aef233a_c.jpg new file mode 100644 index 00000000..9ce5fe96 Binary files /dev/null and b/src/dataset/tulip/27292122652_532aef233a_c.jpg differ diff --git a/src/dataset/tulip/27342474595_99641b3c06_c.jpg b/src/dataset/tulip/27342474595_99641b3c06_c.jpg new file mode 100644 index 00000000..a980ebb4 Binary files /dev/null and b/src/dataset/tulip/27342474595_99641b3c06_c.jpg differ diff --git a/src/dataset/tulip/27345888124_1fbf5ef2a7_c.jpg b/src/dataset/tulip/27345888124_1fbf5ef2a7_c.jpg new file mode 100644 index 00000000..bc3e4b06 Binary files /dev/null and b/src/dataset/tulip/27345888124_1fbf5ef2a7_c.jpg differ diff --git a/src/dataset/tulip/27356736916_bcf0c44657_c.jpg b/src/dataset/tulip/27356736916_bcf0c44657_c.jpg new file mode 100644 index 00000000..10541fc3 Binary files /dev/null and b/src/dataset/tulip/27356736916_bcf0c44657_c.jpg differ diff --git a/src/dataset/tulip/27477791346_cf145c46ae_c.jpg b/src/dataset/tulip/27477791346_cf145c46ae_c.jpg new file mode 100644 index 00000000..f37dc153 Binary files /dev/null and b/src/dataset/tulip/27477791346_cf145c46ae_c.jpg differ diff --git a/src/dataset/tulip/27521783082_35a54912da_c.jpg b/src/dataset/tulip/27521783082_35a54912da_c.jpg new file mode 100644 index 00000000..f2d89ff3 Binary files /dev/null and b/src/dataset/tulip/27521783082_35a54912da_c.jpg differ diff --git a/src/dataset/tulip/2758742012_d3813f2e1a_c.jpg b/src/dataset/tulip/2758742012_d3813f2e1a_c.jpg new file mode 100644 index 00000000..d8fc4d2b Binary files /dev/null and b/src/dataset/tulip/2758742012_d3813f2e1a_c.jpg differ diff --git a/src/dataset/tulip/27651277255_d46a8f89b7_c.jpg b/src/dataset/tulip/27651277255_d46a8f89b7_c.jpg new file mode 100644 index 00000000..09855d14 Binary files /dev/null and b/src/dataset/tulip/27651277255_d46a8f89b7_c.jpg differ diff --git a/src/dataset/tulip/2773609989_02a4c5f0de_c.jpg b/src/dataset/tulip/2773609989_02a4c5f0de_c.jpg new file mode 100644 index 00000000..9c18204a Binary files /dev/null and b/src/dataset/tulip/2773609989_02a4c5f0de_c.jpg differ diff --git a/src/dataset/tulip/2774435956_2248844b8a_c.jpg b/src/dataset/tulip/2774435956_2248844b8a_c.jpg new file mode 100644 index 00000000..cabc6fc2 Binary files /dev/null and b/src/dataset/tulip/2774435956_2248844b8a_c.jpg differ diff --git a/src/dataset/tulip/27856580762_68e09478f2_c.jpg b/src/dataset/tulip/27856580762_68e09478f2_c.jpg new file mode 100644 index 00000000..e8e2dfe5 Binary files /dev/null and b/src/dataset/tulip/27856580762_68e09478f2_c.jpg differ diff --git a/src/dataset/tulip/2804734621_809048f756_c.jpg b/src/dataset/tulip/2804734621_809048f756_c.jpg new file mode 100644 index 00000000..e09414be Binary files /dev/null and b/src/dataset/tulip/2804734621_809048f756_c.jpg differ diff --git a/src/dataset/tulip/2851065268_021bcaf7c3_c.jpg b/src/dataset/tulip/2851065268_021bcaf7c3_c.jpg new file mode 100644 index 00000000..15966fdf Binary files /dev/null and b/src/dataset/tulip/2851065268_021bcaf7c3_c.jpg differ diff --git a/src/dataset/tulip/2871895419_77e85acfc5_c.jpg b/src/dataset/tulip/2871895419_77e85acfc5_c.jpg new file mode 100644 index 00000000..25be19fd Binary files /dev/null and b/src/dataset/tulip/2871895419_77e85acfc5_c.jpg differ diff --git a/src/dataset/tulip/28793510571_25ae5bbb80_c.jpg b/src/dataset/tulip/28793510571_25ae5bbb80_c.jpg new file mode 100644 index 00000000..90587b93 Binary files /dev/null and b/src/dataset/tulip/28793510571_25ae5bbb80_c.jpg differ diff --git a/src/dataset/tulip/28828992066_9be7e658db_c.jpg b/src/dataset/tulip/28828992066_9be7e658db_c.jpg new file mode 100644 index 00000000..63a2ddf5 Binary files /dev/null and b/src/dataset/tulip/28828992066_9be7e658db_c.jpg differ diff --git a/src/dataset/tulip/28871011900_29dac9189e_c.jpg b/src/dataset/tulip/28871011900_29dac9189e_c.jpg new file mode 100644 index 00000000..0b21e744 Binary files /dev/null and b/src/dataset/tulip/28871011900_29dac9189e_c.jpg differ diff --git a/src/dataset/tulip/2897873399_82ac5314a7_c.jpg b/src/dataset/tulip/2897873399_82ac5314a7_c.jpg new file mode 100644 index 00000000..090e49c3 Binary files /dev/null and b/src/dataset/tulip/2897873399_82ac5314a7_c.jpg differ diff --git a/src/dataset/tulip/2897874027_83b2d2d116_c.jpg b/src/dataset/tulip/2897874027_83b2d2d116_c.jpg new file mode 100644 index 00000000..860c642b Binary files /dev/null and b/src/dataset/tulip/2897874027_83b2d2d116_c.jpg differ diff --git a/src/dataset/tulip/2904218215_e34f42c753_c.jpg b/src/dataset/tulip/2904218215_e34f42c753_c.jpg new file mode 100644 index 00000000..d75a41ea Binary files /dev/null and b/src/dataset/tulip/2904218215_e34f42c753_c.jpg differ diff --git a/src/dataset/tulip/2909259918_1c8c75e01b_c.jpg b/src/dataset/tulip/2909259918_1c8c75e01b_c.jpg new file mode 100644 index 00000000..803c4694 Binary files /dev/null and b/src/dataset/tulip/2909259918_1c8c75e01b_c.jpg differ diff --git a/src/dataset/tulip/29116252135_dd3ea21867_c.jpg b/src/dataset/tulip/29116252135_dd3ea21867_c.jpg new file mode 100644 index 00000000..9005d331 Binary files /dev/null and b/src/dataset/tulip/29116252135_dd3ea21867_c.jpg differ diff --git a/src/dataset/tulip/2920135077_92bf1638e9_c.jpg b/src/dataset/tulip/2920135077_92bf1638e9_c.jpg new file mode 100644 index 00000000..8c69f4aa Binary files /dev/null and b/src/dataset/tulip/2920135077_92bf1638e9_c.jpg differ diff --git a/src/dataset/tulip/29323935811_e3f2061836_c.jpg b/src/dataset/tulip/29323935811_e3f2061836_c.jpg new file mode 100644 index 00000000..ec446a73 Binary files /dev/null and b/src/dataset/tulip/29323935811_e3f2061836_c.jpg differ diff --git a/src/dataset/tulip/2933708308_8cf4cc930b_c.jpg b/src/dataset/tulip/2933708308_8cf4cc930b_c.jpg new file mode 100644 index 00000000..0f3353c5 Binary files /dev/null and b/src/dataset/tulip/2933708308_8cf4cc930b_c.jpg differ diff --git a/src/dataset/tulip/30369492935_c5bf8f4e9d_c.jpg b/src/dataset/tulip/30369492935_c5bf8f4e9d_c.jpg new file mode 100644 index 00000000..47db529b Binary files /dev/null and b/src/dataset/tulip/30369492935_c5bf8f4e9d_c.jpg differ diff --git a/src/dataset/tulip/30527077264_0c16c3277d_c.jpg b/src/dataset/tulip/30527077264_0c16c3277d_c.jpg new file mode 100644 index 00000000..4ea522dd Binary files /dev/null and b/src/dataset/tulip/30527077264_0c16c3277d_c.jpg differ diff --git a/src/dataset/tulip/3126586386_2c469be779_c.jpg b/src/dataset/tulip/3126586386_2c469be779_c.jpg new file mode 100644 index 00000000..5ac250da Binary files /dev/null and b/src/dataset/tulip/3126586386_2c469be779_c.jpg differ diff --git a/src/dataset/tulip/3132800803_a521598c00_c.jpg b/src/dataset/tulip/3132800803_a521598c00_c.jpg new file mode 100644 index 00000000..62643f25 Binary files /dev/null and b/src/dataset/tulip/3132800803_a521598c00_c.jpg differ diff --git a/src/dataset/tulip/31457757_fed3ca91fe_c.jpg b/src/dataset/tulip/31457757_fed3ca91fe_c.jpg new file mode 100644 index 00000000..3641d1c8 Binary files /dev/null and b/src/dataset/tulip/31457757_fed3ca91fe_c.jpg differ diff --git a/src/dataset/tulip/3163661796_c36e2e284c_c.jpg b/src/dataset/tulip/3163661796_c36e2e284c_c.jpg new file mode 100644 index 00000000..586eec15 Binary files /dev/null and b/src/dataset/tulip/3163661796_c36e2e284c_c.jpg differ diff --git a/src/dataset/tulip/3170200495_d23ddd7478_c.jpg b/src/dataset/tulip/3170200495_d23ddd7478_c.jpg new file mode 100644 index 00000000..df10c4e0 Binary files /dev/null and b/src/dataset/tulip/3170200495_d23ddd7478_c.jpg differ diff --git a/src/dataset/tulip/32200019375_b8fa224221_c.jpg b/src/dataset/tulip/32200019375_b8fa224221_c.jpg new file mode 100644 index 00000000..629e2d98 Binary files /dev/null and b/src/dataset/tulip/32200019375_b8fa224221_c.jpg differ diff --git a/src/dataset/tulip/3234269522_eb916f7f89_c.jpg b/src/dataset/tulip/3234269522_eb916f7f89_c.jpg new file mode 100644 index 00000000..aea021c8 Binary files /dev/null and b/src/dataset/tulip/3234269522_eb916f7f89_c.jpg differ diff --git a/src/dataset/tulip/32481967821_f456bcdc25_c.jpg b/src/dataset/tulip/32481967821_f456bcdc25_c.jpg new file mode 100644 index 00000000..92dfbc0b Binary files /dev/null and b/src/dataset/tulip/32481967821_f456bcdc25_c.jpg differ diff --git a/src/dataset/tulip/32520864331_5af7f07c62_c.jpg b/src/dataset/tulip/32520864331_5af7f07c62_c.jpg new file mode 100644 index 00000000..e80c26bc Binary files /dev/null and b/src/dataset/tulip/32520864331_5af7f07c62_c.jpg differ diff --git a/src/dataset/tulip/32559587066_cd65efd3a5_c.jpg b/src/dataset/tulip/32559587066_cd65efd3a5_c.jpg new file mode 100644 index 00000000..27cea4e0 Binary files /dev/null and b/src/dataset/tulip/32559587066_cd65efd3a5_c.jpg differ diff --git a/src/dataset/tulip/3268231061_f147019f1a_c.jpg b/src/dataset/tulip/3268231061_f147019f1a_c.jpg new file mode 100644 index 00000000..c102a2aa Binary files /dev/null and b/src/dataset/tulip/3268231061_f147019f1a_c.jpg differ diff --git a/src/dataset/tulip/3269059518_8ff7826a24_c.jpg b/src/dataset/tulip/3269059518_8ff7826a24_c.jpg new file mode 100644 index 00000000..540d5c01 Binary files /dev/null and b/src/dataset/tulip/3269059518_8ff7826a24_c.jpg differ diff --git a/src/dataset/tulip/3276444009_b261348a60_c.jpg b/src/dataset/tulip/3276444009_b261348a60_c.jpg new file mode 100644 index 00000000..cbf37e1d Binary files /dev/null and b/src/dataset/tulip/3276444009_b261348a60_c.jpg differ diff --git a/src/dataset/tulip/331103989_4901ac69d5_c.jpg b/src/dataset/tulip/331103989_4901ac69d5_c.jpg new file mode 100644 index 00000000..638779e8 Binary files /dev/null and b/src/dataset/tulip/331103989_4901ac69d5_c.jpg differ diff --git a/src/dataset/tulip/3314640701_2de60eceda_c.jpg b/src/dataset/tulip/3314640701_2de60eceda_c.jpg new file mode 100644 index 00000000..5ff126b1 Binary files /dev/null and b/src/dataset/tulip/3314640701_2de60eceda_c.jpg differ diff --git a/src/dataset/tulip/33187168234_b524e1a6e5_c.jpg b/src/dataset/tulip/33187168234_b524e1a6e5_c.jpg new file mode 100644 index 00000000..092a1a7b Binary files /dev/null and b/src/dataset/tulip/33187168234_b524e1a6e5_c.jpg differ diff --git a/src/dataset/tulip/33354472940_d009e70925_c.jpg b/src/dataset/tulip/33354472940_d009e70925_c.jpg new file mode 100644 index 00000000..dbb6b45b Binary files /dev/null and b/src/dataset/tulip/33354472940_d009e70925_c.jpg differ diff --git a/src/dataset/tulip/3335875115_0898dffa7d_c.jpg b/src/dataset/tulip/3335875115_0898dffa7d_c.jpg new file mode 100644 index 00000000..ce83f797 Binary files /dev/null and b/src/dataset/tulip/3335875115_0898dffa7d_c.jpg differ diff --git a/src/dataset/tulip/3337656642_46d019f699_c.jpg b/src/dataset/tulip/3337656642_46d019f699_c.jpg new file mode 100644 index 00000000..3369e109 Binary files /dev/null and b/src/dataset/tulip/3337656642_46d019f699_c.jpg differ diff --git a/src/dataset/tulip/3349270403_2a201e5ab0_c.jpg b/src/dataset/tulip/3349270403_2a201e5ab0_c.jpg new file mode 100644 index 00000000..ecb47fbe Binary files /dev/null and b/src/dataset/tulip/3349270403_2a201e5ab0_c.jpg differ diff --git a/src/dataset/tulip/33596584351_bacedf8720_c.jpg b/src/dataset/tulip/33596584351_bacedf8720_c.jpg new file mode 100644 index 00000000..8283230c Binary files /dev/null and b/src/dataset/tulip/33596584351_bacedf8720_c.jpg differ diff --git a/src/dataset/tulip/3364323459_daf40206e7_c.jpg b/src/dataset/tulip/3364323459_daf40206e7_c.jpg new file mode 100644 index 00000000..6468c31b Binary files /dev/null and b/src/dataset/tulip/3364323459_daf40206e7_c.jpg differ diff --git a/src/dataset/tulip/33691596863_f13c333073_c.jpg b/src/dataset/tulip/33691596863_f13c333073_c.jpg new file mode 100644 index 00000000..48e0af95 Binary files /dev/null and b/src/dataset/tulip/33691596863_f13c333073_c.jpg differ diff --git a/src/dataset/tulip/3372400749_bc07abbae8_c.jpg b/src/dataset/tulip/3372400749_bc07abbae8_c.jpg new file mode 100644 index 00000000..922c42e7 Binary files /dev/null and b/src/dataset/tulip/3372400749_bc07abbae8_c.jpg differ diff --git a/src/dataset/tulip/3372504047_1ac1f87827_c.jpg b/src/dataset/tulip/3372504047_1ac1f87827_c.jpg new file mode 100644 index 00000000..e617e3e5 Binary files /dev/null and b/src/dataset/tulip/3372504047_1ac1f87827_c.jpg differ diff --git a/src/dataset/tulip/3373219158_0dd68224b9_c.jpg b/src/dataset/tulip/3373219158_0dd68224b9_c.jpg new file mode 100644 index 00000000..6ad70d78 Binary files /dev/null and b/src/dataset/tulip/3373219158_0dd68224b9_c.jpg differ diff --git a/src/dataset/tulip/3385839524_40d98e73c0_c.jpg b/src/dataset/tulip/3385839524_40d98e73c0_c.jpg new file mode 100644 index 00000000..5b0b8409 Binary files /dev/null and b/src/dataset/tulip/3385839524_40d98e73c0_c.jpg differ diff --git a/src/dataset/tulip/3386884477_2d40336080_c.jpg b/src/dataset/tulip/3386884477_2d40336080_c.jpg new file mode 100644 index 00000000..b68bfdcf Binary files /dev/null and b/src/dataset/tulip/3386884477_2d40336080_c.jpg differ diff --git a/src/dataset/tulip/3389229995_2eebabfcbe_c.jpg b/src/dataset/tulip/3389229995_2eebabfcbe_c.jpg new file mode 100644 index 00000000..9bdfaa83 Binary files /dev/null and b/src/dataset/tulip/3389229995_2eebabfcbe_c.jpg differ diff --git a/src/dataset/tulip/33939461325_ee7365dfda_c.jpg b/src/dataset/tulip/33939461325_ee7365dfda_c.jpg new file mode 100644 index 00000000..ad23a213 Binary files /dev/null and b/src/dataset/tulip/33939461325_ee7365dfda_c.jpg differ diff --git a/src/dataset/tulip/3395996925_1c1fe657ea_c.jpg b/src/dataset/tulip/3395996925_1c1fe657ea_c.jpg new file mode 100644 index 00000000..bf281553 Binary files /dev/null and b/src/dataset/tulip/3395996925_1c1fe657ea_c.jpg differ diff --git a/src/dataset/tulip/33960407225_d929399f97_c.jpg b/src/dataset/tulip/33960407225_d929399f97_c.jpg new file mode 100644 index 00000000..224e74e6 Binary files /dev/null and b/src/dataset/tulip/33960407225_d929399f97_c.jpg differ diff --git a/src/dataset/tulip/33973331695_e7d627ec96_c.jpg b/src/dataset/tulip/33973331695_e7d627ec96_c.jpg new file mode 100644 index 00000000..fea1354f Binary files /dev/null and b/src/dataset/tulip/33973331695_e7d627ec96_c.jpg differ diff --git a/src/dataset/tulip/3402920451_3697524813_c.jpg b/src/dataset/tulip/3402920451_3697524813_c.jpg new file mode 100644 index 00000000..b8d56b70 Binary files /dev/null and b/src/dataset/tulip/3402920451_3697524813_c.jpg differ diff --git a/src/dataset/tulip/34075046050_d51cc15695_c.jpg b/src/dataset/tulip/34075046050_d51cc15695_c.jpg new file mode 100644 index 00000000..e2bbb6cd Binary files /dev/null and b/src/dataset/tulip/34075046050_d51cc15695_c.jpg differ diff --git a/src/dataset/tulip/34081352245_5f784cfda1_c.jpg b/src/dataset/tulip/34081352245_5f784cfda1_c.jpg new file mode 100644 index 00000000..92e94df6 Binary files /dev/null and b/src/dataset/tulip/34081352245_5f784cfda1_c.jpg differ diff --git a/src/dataset/tulip/3408571559_80de106414_c.jpg b/src/dataset/tulip/3408571559_80de106414_c.jpg new file mode 100644 index 00000000..68eaf6b8 Binary files /dev/null and b/src/dataset/tulip/3408571559_80de106414_c.jpg differ diff --git a/src/dataset/tulip/3410179134_bfa6b5f592_c.jpg b/src/dataset/tulip/3410179134_bfa6b5f592_c.jpg new file mode 100644 index 00000000..f5422775 Binary files /dev/null and b/src/dataset/tulip/3410179134_bfa6b5f592_c.jpg differ diff --git a/src/dataset/tulip/3426992389_4f9e96e140_c.jpg b/src/dataset/tulip/3426992389_4f9e96e140_c.jpg new file mode 100644 index 00000000..0569cda9 Binary files /dev/null and b/src/dataset/tulip/3426992389_4f9e96e140_c.jpg differ diff --git a/src/dataset/tulip/3427800748_f6d41543f7_c.jpg b/src/dataset/tulip/3427800748_f6d41543f7_c.jpg new file mode 100644 index 00000000..b711fc43 Binary files /dev/null and b/src/dataset/tulip/3427800748_f6d41543f7_c.jpg differ diff --git a/src/dataset/tulip/3427800888_2f309575f5_c.jpg b/src/dataset/tulip/3427800888_2f309575f5_c.jpg new file mode 100644 index 00000000..b8a03e57 Binary files /dev/null and b/src/dataset/tulip/3427800888_2f309575f5_c.jpg differ diff --git a/src/dataset/tulip/3434403301_793cb9be2d_c.jpg b/src/dataset/tulip/3434403301_793cb9be2d_c.jpg new file mode 100644 index 00000000..7499fa84 Binary files /dev/null and b/src/dataset/tulip/3434403301_793cb9be2d_c.jpg differ diff --git a/src/dataset/tulip/34413993532_ca89c314db_c.jpg b/src/dataset/tulip/34413993532_ca89c314db_c.jpg new file mode 100644 index 00000000..5e5779fe Binary files /dev/null and b/src/dataset/tulip/34413993532_ca89c314db_c.jpg differ diff --git a/src/dataset/tulip/3446635823_ec5a97b34f_c.jpg b/src/dataset/tulip/3446635823_ec5a97b34f_c.jpg new file mode 100644 index 00000000..4db69544 Binary files /dev/null and b/src/dataset/tulip/3446635823_ec5a97b34f_c.jpg differ diff --git a/src/dataset/tulip/3446845255_1d80cc275a_c.jpg b/src/dataset/tulip/3446845255_1d80cc275a_c.jpg new file mode 100644 index 00000000..6ed33951 Binary files /dev/null and b/src/dataset/tulip/3446845255_1d80cc275a_c.jpg differ diff --git a/src/dataset/tulip/3449585950_17c23f7dfc_c.jpg b/src/dataset/tulip/3449585950_17c23f7dfc_c.jpg new file mode 100644 index 00000000..cb6af73b Binary files /dev/null and b/src/dataset/tulip/3449585950_17c23f7dfc_c.jpg differ diff --git a/src/dataset/tulip/3449585962_6218465bfe_c.jpg b/src/dataset/tulip/3449585962_6218465bfe_c.jpg new file mode 100644 index 00000000..8381af01 Binary files /dev/null and b/src/dataset/tulip/3449585962_6218465bfe_c.jpg differ diff --git a/src/dataset/tulip/3449862398_139ceed93f_c.jpg b/src/dataset/tulip/3449862398_139ceed93f_c.jpg new file mode 100644 index 00000000..9bae4bd4 Binary files /dev/null and b/src/dataset/tulip/3449862398_139ceed93f_c.jpg differ diff --git a/src/dataset/tulip/3452300687_5e0522f886_c.jpg b/src/dataset/tulip/3452300687_5e0522f886_c.jpg new file mode 100644 index 00000000..66d5ec2f Binary files /dev/null and b/src/dataset/tulip/3452300687_5e0522f886_c.jpg differ diff --git a/src/dataset/tulip/3452463457_28b988888f_c.jpg b/src/dataset/tulip/3452463457_28b988888f_c.jpg new file mode 100644 index 00000000..cc7964b2 Binary files /dev/null and b/src/dataset/tulip/3452463457_28b988888f_c.jpg differ diff --git a/src/dataset/tulip/3453662876_2c555f9070_c.jpg b/src/dataset/tulip/3453662876_2c555f9070_c.jpg new file mode 100644 index 00000000..b52eebff Binary files /dev/null and b/src/dataset/tulip/3453662876_2c555f9070_c.jpg differ diff --git a/src/dataset/tulip/3464076064_80d7c216d0_c.jpg b/src/dataset/tulip/3464076064_80d7c216d0_c.jpg new file mode 100644 index 00000000..e8c0e512 Binary files /dev/null and b/src/dataset/tulip/3464076064_80d7c216d0_c.jpg differ diff --git a/src/dataset/tulip/3472914254_b749939aa1_c.jpg b/src/dataset/tulip/3472914254_b749939aa1_c.jpg new file mode 100644 index 00000000..a982e4de Binary files /dev/null and b/src/dataset/tulip/3472914254_b749939aa1_c.jpg differ diff --git a/src/dataset/tulip/3473536701_8ddfd6efa9_c.jpg b/src/dataset/tulip/3473536701_8ddfd6efa9_c.jpg new file mode 100644 index 00000000..eadf6e84 Binary files /dev/null and b/src/dataset/tulip/3473536701_8ddfd6efa9_c.jpg differ diff --git a/src/dataset/tulip/3475604861_b7eebcb4aa_c.jpg b/src/dataset/tulip/3475604861_b7eebcb4aa_c.jpg new file mode 100644 index 00000000..fb3eaadc Binary files /dev/null and b/src/dataset/tulip/3475604861_b7eebcb4aa_c.jpg differ diff --git a/src/dataset/tulip/3480914557_b9c48841d5_c.jpg b/src/dataset/tulip/3480914557_b9c48841d5_c.jpg new file mode 100644 index 00000000..a8e2263b Binary files /dev/null and b/src/dataset/tulip/3480914557_b9c48841d5_c.jpg differ diff --git a/src/dataset/tulip/3481826294_c52f986379_c.jpg b/src/dataset/tulip/3481826294_c52f986379_c.jpg new file mode 100644 index 00000000..c6ce5abd Binary files /dev/null and b/src/dataset/tulip/3481826294_c52f986379_c.jpg differ diff --git a/src/dataset/tulip/3483149645_4e611091c4_c.jpg b/src/dataset/tulip/3483149645_4e611091c4_c.jpg new file mode 100644 index 00000000..242f7aad Binary files /dev/null and b/src/dataset/tulip/3483149645_4e611091c4_c.jpg differ diff --git a/src/dataset/tulip/3483962199_26238f61a3_c.jpg b/src/dataset/tulip/3483962199_26238f61a3_c.jpg new file mode 100644 index 00000000..5c1e6bfd Binary files /dev/null and b/src/dataset/tulip/3483962199_26238f61a3_c.jpg differ diff --git a/src/dataset/tulip/3488643708_909b89b9b9_c.jpg b/src/dataset/tulip/3488643708_909b89b9b9_c.jpg new file mode 100644 index 00000000..5b6a743e Binary files /dev/null and b/src/dataset/tulip/3488643708_909b89b9b9_c.jpg differ diff --git a/src/dataset/tulip/3498120108_a48ee646d7_c.jpg b/src/dataset/tulip/3498120108_a48ee646d7_c.jpg new file mode 100644 index 00000000..b4707e83 Binary files /dev/null and b/src/dataset/tulip/3498120108_a48ee646d7_c.jpg differ diff --git a/src/dataset/tulip/3500697223_103e30ecf1_c.jpg b/src/dataset/tulip/3500697223_103e30ecf1_c.jpg new file mode 100644 index 00000000..4f0b3d1f Binary files /dev/null and b/src/dataset/tulip/3500697223_103e30ecf1_c.jpg differ diff --git a/src/dataset/tulip/3501096389_fb4030898f_c.jpg b/src/dataset/tulip/3501096389_fb4030898f_c.jpg new file mode 100644 index 00000000..55f43f6e Binary files /dev/null and b/src/dataset/tulip/3501096389_fb4030898f_c.jpg differ diff --git a/src/dataset/tulip/3502418092_75f1dce5ac_c.jpg b/src/dataset/tulip/3502418092_75f1dce5ac_c.jpg new file mode 100644 index 00000000..abdeace0 Binary files /dev/null and b/src/dataset/tulip/3502418092_75f1dce5ac_c.jpg differ diff --git a/src/dataset/tulip/3503921197_9842944f09_c.jpg b/src/dataset/tulip/3503921197_9842944f09_c.jpg new file mode 100644 index 00000000..ba1cff19 Binary files /dev/null and b/src/dataset/tulip/3503921197_9842944f09_c.jpg differ diff --git a/src/dataset/tulip/3506905785_eb812e499a_c.jpg b/src/dataset/tulip/3506905785_eb812e499a_c.jpg new file mode 100644 index 00000000..921e4d17 Binary files /dev/null and b/src/dataset/tulip/3506905785_eb812e499a_c.jpg differ diff --git a/src/dataset/tulip/3510431312_4f6603960a_c.jpg b/src/dataset/tulip/3510431312_4f6603960a_c.jpg new file mode 100644 index 00000000..186d3add Binary files /dev/null and b/src/dataset/tulip/3510431312_4f6603960a_c.jpg differ diff --git a/src/dataset/tulip/3512126918_a5fa9b0754_c.jpg b/src/dataset/tulip/3512126918_a5fa9b0754_c.jpg new file mode 100644 index 00000000..76a9bc61 Binary files /dev/null and b/src/dataset/tulip/3512126918_a5fa9b0754_c.jpg differ diff --git a/src/dataset/tulip/3513802610_088c7cfb3e_c.jpg b/src/dataset/tulip/3513802610_088c7cfb3e_c.jpg new file mode 100644 index 00000000..3d031e2f Binary files /dev/null and b/src/dataset/tulip/3513802610_088c7cfb3e_c.jpg differ diff --git a/src/dataset/tulip/3515731171_30680fe09b_c.jpg b/src/dataset/tulip/3515731171_30680fe09b_c.jpg new file mode 100644 index 00000000..c4405573 Binary files /dev/null and b/src/dataset/tulip/3515731171_30680fe09b_c.jpg differ diff --git a/src/dataset/tulip/3518898301_557ba552bd_c.jpg b/src/dataset/tulip/3518898301_557ba552bd_c.jpg new file mode 100644 index 00000000..09206725 Binary files /dev/null and b/src/dataset/tulip/3518898301_557ba552bd_c.jpg differ diff --git a/src/dataset/tulip/3521904275_a4717035bb_c.jpg b/src/dataset/tulip/3521904275_a4717035bb_c.jpg new file mode 100644 index 00000000..67bf165e Binary files /dev/null and b/src/dataset/tulip/3521904275_a4717035bb_c.jpg differ diff --git a/src/dataset/tulip/3523570134_3fc6235531_c.jpg b/src/dataset/tulip/3523570134_3fc6235531_c.jpg new file mode 100644 index 00000000..600195a3 Binary files /dev/null and b/src/dataset/tulip/3523570134_3fc6235531_c.jpg differ diff --git a/src/dataset/tulip/3526556604_bb4c39e54c_c.jpg b/src/dataset/tulip/3526556604_bb4c39e54c_c.jpg new file mode 100644 index 00000000..9bf2d6ba Binary files /dev/null and b/src/dataset/tulip/3526556604_bb4c39e54c_c.jpg differ diff --git a/src/dataset/tulip/3530752703_816e32a5a3_c.jpg b/src/dataset/tulip/3530752703_816e32a5a3_c.jpg new file mode 100644 index 00000000..55343e95 Binary files /dev/null and b/src/dataset/tulip/3530752703_816e32a5a3_c.jpg differ diff --git a/src/dataset/tulip/3531787914_3e11ef8e80_c.jpg b/src/dataset/tulip/3531787914_3e11ef8e80_c.jpg new file mode 100644 index 00000000..a5417ad5 Binary files /dev/null and b/src/dataset/tulip/3531787914_3e11ef8e80_c.jpg differ diff --git a/src/dataset/tulip/3531792282_7a7393a8d1_c.jpg b/src/dataset/tulip/3531792282_7a7393a8d1_c.jpg new file mode 100644 index 00000000..514a6868 Binary files /dev/null and b/src/dataset/tulip/3531792282_7a7393a8d1_c.jpg differ diff --git a/src/dataset/tulip/3532616657_d61b4631f5_c.jpg b/src/dataset/tulip/3532616657_d61b4631f5_c.jpg new file mode 100644 index 00000000..0cddaedc Binary files /dev/null and b/src/dataset/tulip/3532616657_d61b4631f5_c.jpg differ diff --git a/src/dataset/tulip/3537389234_58fd548cd4_c.jpg b/src/dataset/tulip/3537389234_58fd548cd4_c.jpg new file mode 100644 index 00000000..df1c3939 Binary files /dev/null and b/src/dataset/tulip/3537389234_58fd548cd4_c.jpg differ diff --git a/src/dataset/tulip/3540137223_a6c9ccee8a_c.jpg b/src/dataset/tulip/3540137223_a6c9ccee8a_c.jpg new file mode 100644 index 00000000..4aa4a87c Binary files /dev/null and b/src/dataset/tulip/3540137223_a6c9ccee8a_c.jpg differ diff --git a/src/dataset/tulip/3552977151_22f3fc1c1d_c.jpg b/src/dataset/tulip/3552977151_22f3fc1c1d_c.jpg new file mode 100644 index 00000000..6abe1c02 Binary files /dev/null and b/src/dataset/tulip/3552977151_22f3fc1c1d_c.jpg differ diff --git a/src/dataset/tulip/3556416619_cc03cce27e_c.jpg b/src/dataset/tulip/3556416619_cc03cce27e_c.jpg new file mode 100644 index 00000000..58fd2f1a Binary files /dev/null and b/src/dataset/tulip/3556416619_cc03cce27e_c.jpg differ diff --git a/src/dataset/tulip/3558372958_e894eb3a1e_c.jpg b/src/dataset/tulip/3558372958_e894eb3a1e_c.jpg new file mode 100644 index 00000000..bfec79a9 Binary files /dev/null and b/src/dataset/tulip/3558372958_e894eb3a1e_c.jpg differ diff --git a/src/dataset/tulip/3561814755_9a5f2870a3_c.jpg b/src/dataset/tulip/3561814755_9a5f2870a3_c.jpg new file mode 100644 index 00000000..38f6947a Binary files /dev/null and b/src/dataset/tulip/3561814755_9a5f2870a3_c.jpg differ diff --git a/src/dataset/tulip/3561815407_96edc01a6f_c.jpg b/src/dataset/tulip/3561815407_96edc01a6f_c.jpg new file mode 100644 index 00000000..cb0b589b Binary files /dev/null and b/src/dataset/tulip/3561815407_96edc01a6f_c.jpg differ diff --git a/src/dataset/tulip/3563589957_38180f7a36_c.jpg b/src/dataset/tulip/3563589957_38180f7a36_c.jpg new file mode 100644 index 00000000..28c21913 Binary files /dev/null and b/src/dataset/tulip/3563589957_38180f7a36_c.jpg differ diff --git a/src/dataset/tulip/3608900760_dea52e132a_c.jpg b/src/dataset/tulip/3608900760_dea52e132a_c.jpg new file mode 100644 index 00000000..936384e3 Binary files /dev/null and b/src/dataset/tulip/3608900760_dea52e132a_c.jpg differ diff --git a/src/dataset/tulip/3659084952_fb42488010_c.jpg b/src/dataset/tulip/3659084952_fb42488010_c.jpg new file mode 100644 index 00000000..d162dc35 Binary files /dev/null and b/src/dataset/tulip/3659084952_fb42488010_c.jpg differ diff --git a/src/dataset/tulip/3691662110_f65854b859_c.jpg b/src/dataset/tulip/3691662110_f65854b859_c.jpg new file mode 100644 index 00000000..e8380fcc Binary files /dev/null and b/src/dataset/tulip/3691662110_f65854b859_c.jpg differ diff --git a/src/dataset/tulip/369251999_c4bebed864_c.jpg b/src/dataset/tulip/369251999_c4bebed864_c.jpg new file mode 100644 index 00000000..ef3b862d Binary files /dev/null and b/src/dataset/tulip/369251999_c4bebed864_c.jpg differ diff --git a/src/dataset/tulip/3697531473_f921137e9f_c.jpg b/src/dataset/tulip/3697531473_f921137e9f_c.jpg new file mode 100644 index 00000000..3ef804cb Binary files /dev/null and b/src/dataset/tulip/3697531473_f921137e9f_c.jpg differ diff --git a/src/dataset/tulip/3714381837_6340ed12f1_c.jpg b/src/dataset/tulip/3714381837_6340ed12f1_c.jpg new file mode 100644 index 00000000..daaeedfd Binary files /dev/null and b/src/dataset/tulip/3714381837_6340ed12f1_c.jpg differ diff --git a/src/dataset/tulip/372476471_0c4e1f7ac2_c.jpg b/src/dataset/tulip/372476471_0c4e1f7ac2_c.jpg new file mode 100644 index 00000000..dca3394a Binary files /dev/null and b/src/dataset/tulip/372476471_0c4e1f7ac2_c.jpg differ diff --git a/src/dataset/tulip/378816067_93136b9623_c.jpg b/src/dataset/tulip/378816067_93136b9623_c.jpg new file mode 100644 index 00000000..6f798d20 Binary files /dev/null and b/src/dataset/tulip/378816067_93136b9623_c.jpg differ diff --git a/src/dataset/tulip/3825333026_0086470dfb_c.jpg b/src/dataset/tulip/3825333026_0086470dfb_c.jpg new file mode 100644 index 00000000..35f3dddd Binary files /dev/null and b/src/dataset/tulip/3825333026_0086470dfb_c.jpg differ diff --git a/src/dataset/tulip/383534813_f0439cf22a_c.jpg b/src/dataset/tulip/383534813_f0439cf22a_c.jpg new file mode 100644 index 00000000..195c75bb Binary files /dev/null and b/src/dataset/tulip/383534813_f0439cf22a_c.jpg differ diff --git a/src/dataset/tulip/3849004453_b53d81f55e_c.jpg b/src/dataset/tulip/3849004453_b53d81f55e_c.jpg new file mode 100644 index 00000000..116ec76e Binary files /dev/null and b/src/dataset/tulip/3849004453_b53d81f55e_c.jpg differ diff --git a/src/dataset/tulip/3852335976_ec2e0437f1_c.jpg b/src/dataset/tulip/3852335976_ec2e0437f1_c.jpg new file mode 100644 index 00000000..61c0ddd5 Binary files /dev/null and b/src/dataset/tulip/3852335976_ec2e0437f1_c.jpg differ diff --git a/src/dataset/tulip/386074401_6047e92e94_c.jpg b/src/dataset/tulip/386074401_6047e92e94_c.jpg new file mode 100644 index 00000000..986ba5bf Binary files /dev/null and b/src/dataset/tulip/386074401_6047e92e94_c.jpg differ diff --git a/src/dataset/tulip/386341974_56baff9c05_c.jpg b/src/dataset/tulip/386341974_56baff9c05_c.jpg new file mode 100644 index 00000000..6be70b73 Binary files /dev/null and b/src/dataset/tulip/386341974_56baff9c05_c.jpg differ diff --git a/src/dataset/tulip/3885819853_6751a7ea62_c.jpg b/src/dataset/tulip/3885819853_6751a7ea62_c.jpg new file mode 100644 index 00000000..81e6ea90 Binary files /dev/null and b/src/dataset/tulip/3885819853_6751a7ea62_c.jpg differ diff --git a/src/dataset/tulip/3989759864_5977be1f83_c.jpg b/src/dataset/tulip/3989759864_5977be1f83_c.jpg new file mode 100644 index 00000000..d5f78f2d Binary files /dev/null and b/src/dataset/tulip/3989759864_5977be1f83_c.jpg differ diff --git a/src/dataset/tulip/3998687441_edf6cd3fc5_c.jpg b/src/dataset/tulip/3998687441_edf6cd3fc5_c.jpg new file mode 100644 index 00000000..dab3b2f5 Binary files /dev/null and b/src/dataset/tulip/3998687441_edf6cd3fc5_c.jpg differ diff --git a/src/dataset/tulip/3998700133_5bbf1bf643_c.jpg b/src/dataset/tulip/3998700133_5bbf1bf643_c.jpg new file mode 100644 index 00000000..b79860ae Binary files /dev/null and b/src/dataset/tulip/3998700133_5bbf1bf643_c.jpg differ diff --git a/src/dataset/tulip/4004602946_801866c8bc_c.jpg b/src/dataset/tulip/4004602946_801866c8bc_c.jpg new file mode 100644 index 00000000..8fb99499 Binary files /dev/null and b/src/dataset/tulip/4004602946_801866c8bc_c.jpg differ diff --git a/src/dataset/tulip/4119019656_4237002811_c.jpg b/src/dataset/tulip/4119019656_4237002811_c.jpg new file mode 100644 index 00000000..e8650a4e Binary files /dev/null and b/src/dataset/tulip/4119019656_4237002811_c.jpg differ diff --git a/src/dataset/tulip/4232973352_3ac91d8728_c.jpg b/src/dataset/tulip/4232973352_3ac91d8728_c.jpg new file mode 100644 index 00000000..6c8e9133 Binary files /dev/null and b/src/dataset/tulip/4232973352_3ac91d8728_c.jpg differ diff --git a/src/dataset/tulip/4281136251_39d73c77ca_c.jpg b/src/dataset/tulip/4281136251_39d73c77ca_c.jpg new file mode 100644 index 00000000..57fbf0f7 Binary files /dev/null and b/src/dataset/tulip/4281136251_39d73c77ca_c.jpg differ diff --git a/src/dataset/tulip/4305095198_fe51649fbb_c.jpg b/src/dataset/tulip/4305095198_fe51649fbb_c.jpg new file mode 100644 index 00000000..c9251de4 Binary files /dev/null and b/src/dataset/tulip/4305095198_fe51649fbb_c.jpg differ diff --git a/src/dataset/tulip/4322553185_dd2f8b0a20_c.jpg b/src/dataset/tulip/4322553185_dd2f8b0a20_c.jpg new file mode 100644 index 00000000..1c73833a Binary files /dev/null and b/src/dataset/tulip/4322553185_dd2f8b0a20_c.jpg differ diff --git a/src/dataset/tulip/432758760_b27d346342_c.jpg b/src/dataset/tulip/432758760_b27d346342_c.jpg new file mode 100644 index 00000000..d51c9573 Binary files /dev/null and b/src/dataset/tulip/432758760_b27d346342_c.jpg differ diff --git a/src/dataset/tulip/4335891100_fd00e3f63f_c.jpg b/src/dataset/tulip/4335891100_fd00e3f63f_c.jpg new file mode 100644 index 00000000..76a9763d Binary files /dev/null and b/src/dataset/tulip/4335891100_fd00e3f63f_c.jpg differ diff --git a/src/dataset/tulip/4358820369_c0487c8257_c.jpg b/src/dataset/tulip/4358820369_c0487c8257_c.jpg new file mode 100644 index 00000000..8ed728fa Binary files /dev/null and b/src/dataset/tulip/4358820369_c0487c8257_c.jpg differ diff --git a/src/dataset/tulip/439482672_8ec9c80ae7_c.jpg b/src/dataset/tulip/439482672_8ec9c80ae7_c.jpg new file mode 100644 index 00000000..590c039f Binary files /dev/null and b/src/dataset/tulip/439482672_8ec9c80ae7_c.jpg differ diff --git a/src/dataset/tulip/4408984770_fa817f1ae8_c.jpg b/src/dataset/tulip/4408984770_fa817f1ae8_c.jpg new file mode 100644 index 00000000..7a03d31a Binary files /dev/null and b/src/dataset/tulip/4408984770_fa817f1ae8_c.jpg differ diff --git a/src/dataset/tulip/4416022046_1694a0dfa1_c.jpg b/src/dataset/tulip/4416022046_1694a0dfa1_c.jpg new file mode 100644 index 00000000..6e1a6e22 Binary files /dev/null and b/src/dataset/tulip/4416022046_1694a0dfa1_c.jpg differ diff --git a/src/dataset/tulip/4418463118_ba5de77237_c.jpg b/src/dataset/tulip/4418463118_ba5de77237_c.jpg new file mode 100644 index 00000000..2ca17440 Binary files /dev/null and b/src/dataset/tulip/4418463118_ba5de77237_c.jpg differ diff --git a/src/dataset/tulip/4446180727_2fec55d8d0_c.jpg b/src/dataset/tulip/4446180727_2fec55d8d0_c.jpg new file mode 100644 index 00000000..885d3f84 Binary files /dev/null and b/src/dataset/tulip/4446180727_2fec55d8d0_c.jpg differ diff --git a/src/dataset/tulip/4451285806_a34695f753_c.jpg b/src/dataset/tulip/4451285806_a34695f753_c.jpg new file mode 100644 index 00000000..2a0ba3fc Binary files /dev/null and b/src/dataset/tulip/4451285806_a34695f753_c.jpg differ diff --git a/src/dataset/tulip/4451916809_d6b3d230fa_c.jpg b/src/dataset/tulip/4451916809_d6b3d230fa_c.jpg new file mode 100644 index 00000000..a674363f Binary files /dev/null and b/src/dataset/tulip/4451916809_d6b3d230fa_c.jpg differ diff --git a/src/dataset/tulip/445474376_f7a0e5fdd3_c.jpg b/src/dataset/tulip/445474376_f7a0e5fdd3_c.jpg new file mode 100644 index 00000000..b3d35e06 Binary files /dev/null and b/src/dataset/tulip/445474376_f7a0e5fdd3_c.jpg differ diff --git a/src/dataset/tulip/4470200587_005725e525_c.jpg b/src/dataset/tulip/4470200587_005725e525_c.jpg new file mode 100644 index 00000000..133bda7c Binary files /dev/null and b/src/dataset/tulip/4470200587_005725e525_c.jpg differ diff --git a/src/dataset/tulip/4470223283_13ab25387a_c.jpg b/src/dataset/tulip/4470223283_13ab25387a_c.jpg new file mode 100644 index 00000000..aa9244d6 Binary files /dev/null and b/src/dataset/tulip/4470223283_13ab25387a_c.jpg differ diff --git a/src/dataset/tulip/4471260868_8fd8e4d2bb_c.jpg b/src/dataset/tulip/4471260868_8fd8e4d2bb_c.jpg new file mode 100644 index 00000000..1b369646 Binary files /dev/null and b/src/dataset/tulip/4471260868_8fd8e4d2bb_c.jpg differ diff --git a/src/dataset/tulip/4477321257_6d35df404d_c.jpg b/src/dataset/tulip/4477321257_6d35df404d_c.jpg new file mode 100644 index 00000000..555fb48d Binary files /dev/null and b/src/dataset/tulip/4477321257_6d35df404d_c.jpg differ diff --git a/src/dataset/tulip/4479294125_5035fe72b3_c.jpg b/src/dataset/tulip/4479294125_5035fe72b3_c.jpg new file mode 100644 index 00000000..7573b5ab Binary files /dev/null and b/src/dataset/tulip/4479294125_5035fe72b3_c.jpg differ diff --git a/src/dataset/tulip/4490215888_477064967c_c.jpg b/src/dataset/tulip/4490215888_477064967c_c.jpg new file mode 100644 index 00000000..76034402 Binary files /dev/null and b/src/dataset/tulip/4490215888_477064967c_c.jpg differ diff --git a/src/dataset/tulip/449800518_2e78217e05_c.jpg b/src/dataset/tulip/449800518_2e78217e05_c.jpg new file mode 100644 index 00000000..5f021984 Binary files /dev/null and b/src/dataset/tulip/449800518_2e78217e05_c.jpg differ diff --git a/src/dataset/tulip/449968641_7a565b0462_c.jpg b/src/dataset/tulip/449968641_7a565b0462_c.jpg new file mode 100644 index 00000000..5d90c748 Binary files /dev/null and b/src/dataset/tulip/449968641_7a565b0462_c.jpg differ diff --git a/src/dataset/tulip/4502601012_3568cb0b81_c.jpg b/src/dataset/tulip/4502601012_3568cb0b81_c.jpg new file mode 100644 index 00000000..c53db8b9 Binary files /dev/null and b/src/dataset/tulip/4502601012_3568cb0b81_c.jpg differ diff --git a/src/dataset/tulip/451164048_4278006f1c_c.jpg b/src/dataset/tulip/451164048_4278006f1c_c.jpg new file mode 100644 index 00000000..5ed527bf Binary files /dev/null and b/src/dataset/tulip/451164048_4278006f1c_c.jpg differ diff --git a/src/dataset/tulip/4512396232_ab6523e345_c.jpg b/src/dataset/tulip/4512396232_ab6523e345_c.jpg new file mode 100644 index 00000000..1fc315b0 Binary files /dev/null and b/src/dataset/tulip/4512396232_ab6523e345_c.jpg differ diff --git a/src/dataset/tulip/4513628479_9859c4f649_c.jpg b/src/dataset/tulip/4513628479_9859c4f649_c.jpg new file mode 100644 index 00000000..92e5eccb Binary files /dev/null and b/src/dataset/tulip/4513628479_9859c4f649_c.jpg differ diff --git a/src/dataset/tulip/4513969045_4358544743_c.jpg b/src/dataset/tulip/4513969045_4358544743_c.jpg new file mode 100644 index 00000000..4663abb5 Binary files /dev/null and b/src/dataset/tulip/4513969045_4358544743_c.jpg differ diff --git a/src/dataset/tulip/4514268926_cc1f9157a3_c.jpg b/src/dataset/tulip/4514268926_cc1f9157a3_c.jpg new file mode 100644 index 00000000..607fa90c Binary files /dev/null and b/src/dataset/tulip/4514268926_cc1f9157a3_c.jpg differ diff --git a/src/dataset/tulip/4517045284_df6436f3c8_c.jpg b/src/dataset/tulip/4517045284_df6436f3c8_c.jpg new file mode 100644 index 00000000..5a17e6c4 Binary files /dev/null and b/src/dataset/tulip/4517045284_df6436f3c8_c.jpg differ diff --git a/src/dataset/tulip/4517643854_63612952c0_c.jpg b/src/dataset/tulip/4517643854_63612952c0_c.jpg new file mode 100644 index 00000000..f5c450ab Binary files /dev/null and b/src/dataset/tulip/4517643854_63612952c0_c.jpg differ diff --git a/src/dataset/tulip/4518727990_c9576a7458_c.jpg b/src/dataset/tulip/4518727990_c9576a7458_c.jpg new file mode 100644 index 00000000..8da25fbc Binary files /dev/null and b/src/dataset/tulip/4518727990_c9576a7458_c.jpg differ diff --git a/src/dataset/tulip/4518755377_936c6e6463_c.jpg b/src/dataset/tulip/4518755377_936c6e6463_c.jpg new file mode 100644 index 00000000..6868e61d Binary files /dev/null and b/src/dataset/tulip/4518755377_936c6e6463_c.jpg differ diff --git a/src/dataset/tulip/4519691254_a05f3611aa_c.jpg b/src/dataset/tulip/4519691254_a05f3611aa_c.jpg new file mode 100644 index 00000000..82e985d1 Binary files /dev/null and b/src/dataset/tulip/4519691254_a05f3611aa_c.jpg differ diff --git a/src/dataset/tulip/4521294_363f6273e8_c.jpg b/src/dataset/tulip/4521294_363f6273e8_c.jpg new file mode 100644 index 00000000..b5054ce5 Binary files /dev/null and b/src/dataset/tulip/4521294_363f6273e8_c.jpg differ diff --git a/src/dataset/tulip/4529587097_9ff673d8bf_c.jpg b/src/dataset/tulip/4529587097_9ff673d8bf_c.jpg new file mode 100644 index 00000000..ec939ff7 Binary files /dev/null and b/src/dataset/tulip/4529587097_9ff673d8bf_c.jpg differ diff --git a/src/dataset/tulip/4530217118_a281de17df_c.jpg b/src/dataset/tulip/4530217118_a281de17df_c.jpg new file mode 100644 index 00000000..7a3d13e5 Binary files /dev/null and b/src/dataset/tulip/4530217118_a281de17df_c.jpg differ diff --git a/src/dataset/tulip/4531346009_0fe8a79cc7_c.jpg b/src/dataset/tulip/4531346009_0fe8a79cc7_c.jpg new file mode 100644 index 00000000..34b56b17 Binary files /dev/null and b/src/dataset/tulip/4531346009_0fe8a79cc7_c.jpg differ diff --git a/src/dataset/tulip/4533231147_7016fd298a_c.jpg b/src/dataset/tulip/4533231147_7016fd298a_c.jpg new file mode 100644 index 00000000..42cec7e6 Binary files /dev/null and b/src/dataset/tulip/4533231147_7016fd298a_c.jpg differ diff --git a/src/dataset/tulip/4534327964_7c3d3cce0f_c.jpg b/src/dataset/tulip/4534327964_7c3d3cce0f_c.jpg new file mode 100644 index 00000000..cc869a22 Binary files /dev/null and b/src/dataset/tulip/4534327964_7c3d3cce0f_c.jpg differ diff --git a/src/dataset/tulip/4535802340_92a4bae825_c.jpg b/src/dataset/tulip/4535802340_92a4bae825_c.jpg new file mode 100644 index 00000000..16181711 Binary files /dev/null and b/src/dataset/tulip/4535802340_92a4bae825_c.jpg differ diff --git a/src/dataset/tulip/4537678729_0d655f741a_c.jpg b/src/dataset/tulip/4537678729_0d655f741a_c.jpg new file mode 100644 index 00000000..71852e2b Binary files /dev/null and b/src/dataset/tulip/4537678729_0d655f741a_c.jpg differ diff --git a/src/dataset/tulip/4542260111_24d3a573d5_c.jpg b/src/dataset/tulip/4542260111_24d3a573d5_c.jpg new file mode 100644 index 00000000..9e3ce079 Binary files /dev/null and b/src/dataset/tulip/4542260111_24d3a573d5_c.jpg differ diff --git a/src/dataset/tulip/4543488105_0808854829_c.jpg b/src/dataset/tulip/4543488105_0808854829_c.jpg new file mode 100644 index 00000000..457b45a7 Binary files /dev/null and b/src/dataset/tulip/4543488105_0808854829_c.jpg differ diff --git a/src/dataset/tulip/4548949757_1dff02a1c0_c.jpg b/src/dataset/tulip/4548949757_1dff02a1c0_c.jpg new file mode 100644 index 00000000..253c4949 Binary files /dev/null and b/src/dataset/tulip/4548949757_1dff02a1c0_c.jpg differ diff --git a/src/dataset/tulip/4550313191_a726b8e1ef_c.jpg b/src/dataset/tulip/4550313191_a726b8e1ef_c.jpg new file mode 100644 index 00000000..b8d6a02e Binary files /dev/null and b/src/dataset/tulip/4550313191_a726b8e1ef_c.jpg differ diff --git a/src/dataset/tulip/4550845075_9840830ca7_c.jpg b/src/dataset/tulip/4550845075_9840830ca7_c.jpg new file mode 100644 index 00000000..59c6e6b4 Binary files /dev/null and b/src/dataset/tulip/4550845075_9840830ca7_c.jpg differ diff --git a/src/dataset/tulip/4555166957_b483287e24_c.jpg b/src/dataset/tulip/4555166957_b483287e24_c.jpg new file mode 100644 index 00000000..bdb4d6fc Binary files /dev/null and b/src/dataset/tulip/4555166957_b483287e24_c.jpg differ diff --git a/src/dataset/tulip/4555166991_fa70652313_c.jpg b/src/dataset/tulip/4555166991_fa70652313_c.jpg new file mode 100644 index 00000000..bc04c7a4 Binary files /dev/null and b/src/dataset/tulip/4555166991_fa70652313_c.jpg differ diff --git a/src/dataset/tulip/4555842504_b7174f55ff_c.jpg b/src/dataset/tulip/4555842504_b7174f55ff_c.jpg new file mode 100644 index 00000000..8a4b9d65 Binary files /dev/null and b/src/dataset/tulip/4555842504_b7174f55ff_c.jpg differ diff --git a/src/dataset/tulip/4556406789_43b14fefcc_c.jpg b/src/dataset/tulip/4556406789_43b14fefcc_c.jpg new file mode 100644 index 00000000..e6af5051 Binary files /dev/null and b/src/dataset/tulip/4556406789_43b14fefcc_c.jpg differ diff --git a/src/dataset/tulip/4557693184_7dcb08e457_c.jpg b/src/dataset/tulip/4557693184_7dcb08e457_c.jpg new file mode 100644 index 00000000..2d75d37b Binary files /dev/null and b/src/dataset/tulip/4557693184_7dcb08e457_c.jpg differ diff --git a/src/dataset/tulip/4558573095_0e027281c6_c.jpg b/src/dataset/tulip/4558573095_0e027281c6_c.jpg new file mode 100644 index 00000000..44320b8b Binary files /dev/null and b/src/dataset/tulip/4558573095_0e027281c6_c.jpg differ diff --git a/src/dataset/tulip/4559897554_e42d696283_c.jpg b/src/dataset/tulip/4559897554_e42d696283_c.jpg new file mode 100644 index 00000000..99bef84c Binary files /dev/null and b/src/dataset/tulip/4559897554_e42d696283_c.jpg differ diff --git a/src/dataset/tulip/4563024511_4f3a8732d7_c.jpg b/src/dataset/tulip/4563024511_4f3a8732d7_c.jpg new file mode 100644 index 00000000..9a170ce0 Binary files /dev/null and b/src/dataset/tulip/4563024511_4f3a8732d7_c.jpg differ diff --git a/src/dataset/tulip/4563337292_7a7276ca8b_c.jpg b/src/dataset/tulip/4563337292_7a7276ca8b_c.jpg new file mode 100644 index 00000000..a05a307a Binary files /dev/null and b/src/dataset/tulip/4563337292_7a7276ca8b_c.jpg differ diff --git a/src/dataset/tulip/4564885308_685f5a87b7_c.jpg b/src/dataset/tulip/4564885308_685f5a87b7_c.jpg new file mode 100644 index 00000000..9e9a342b Binary files /dev/null and b/src/dataset/tulip/4564885308_685f5a87b7_c.jpg differ diff --git a/src/dataset/tulip/4568648142_654e89db97_c.jpg b/src/dataset/tulip/4568648142_654e89db97_c.jpg new file mode 100644 index 00000000..67610aca Binary files /dev/null and b/src/dataset/tulip/4568648142_654e89db97_c.jpg differ diff --git a/src/dataset/tulip/4571338847_ccdced7c35_c.jpg b/src/dataset/tulip/4571338847_ccdced7c35_c.jpg new file mode 100644 index 00000000..419e7edc Binary files /dev/null and b/src/dataset/tulip/4571338847_ccdced7c35_c.jpg differ diff --git a/src/dataset/tulip/4571396675_9d2d562e8b_c.jpg b/src/dataset/tulip/4571396675_9d2d562e8b_c.jpg new file mode 100644 index 00000000..7c6adf97 Binary files /dev/null and b/src/dataset/tulip/4571396675_9d2d562e8b_c.jpg differ diff --git a/src/dataset/tulip/4571404301_78528f627c_c.jpg b/src/dataset/tulip/4571404301_78528f627c_c.jpg new file mode 100644 index 00000000..1c2116d3 Binary files /dev/null and b/src/dataset/tulip/4571404301_78528f627c_c.jpg differ diff --git a/src/dataset/tulip/4572044146_b4704d3ea3_c.jpg b/src/dataset/tulip/4572044146_b4704d3ea3_c.jpg new file mode 100644 index 00000000..e5eccc14 Binary files /dev/null and b/src/dataset/tulip/4572044146_b4704d3ea3_c.jpg differ diff --git a/src/dataset/tulip/4576058309_776d71d4dc_c.jpg b/src/dataset/tulip/4576058309_776d71d4dc_c.jpg new file mode 100644 index 00000000..330c43ce Binary files /dev/null and b/src/dataset/tulip/4576058309_776d71d4dc_c.jpg differ diff --git a/src/dataset/tulip/4579326811_2dea607bfe_c.jpg b/src/dataset/tulip/4579326811_2dea607bfe_c.jpg new file mode 100644 index 00000000..8e926445 Binary files /dev/null and b/src/dataset/tulip/4579326811_2dea607bfe_c.jpg differ diff --git a/src/dataset/tulip/4582194943_05296a9592_c.jpg b/src/dataset/tulip/4582194943_05296a9592_c.jpg new file mode 100644 index 00000000..a58763b2 Binary files /dev/null and b/src/dataset/tulip/4582194943_05296a9592_c.jpg differ diff --git a/src/dataset/tulip/4584730339_95e766f4d8_c.jpg b/src/dataset/tulip/4584730339_95e766f4d8_c.jpg new file mode 100644 index 00000000..bd2015a7 Binary files /dev/null and b/src/dataset/tulip/4584730339_95e766f4d8_c.jpg differ diff --git a/src/dataset/tulip/4586091602_f2524105f2_c.jpg b/src/dataset/tulip/4586091602_f2524105f2_c.jpg new file mode 100644 index 00000000..cf3c103b Binary files /dev/null and b/src/dataset/tulip/4586091602_f2524105f2_c.jpg differ diff --git a/src/dataset/tulip/458661250_8c11ed7023_c.jpg b/src/dataset/tulip/458661250_8c11ed7023_c.jpg new file mode 100644 index 00000000..274a0507 Binary files /dev/null and b/src/dataset/tulip/458661250_8c11ed7023_c.jpg differ diff --git a/src/dataset/tulip/4588109128_38eae3d0b4_c.jpg b/src/dataset/tulip/4588109128_38eae3d0b4_c.jpg new file mode 100644 index 00000000..2df24cd3 Binary files /dev/null and b/src/dataset/tulip/4588109128_38eae3d0b4_c.jpg differ diff --git a/src/dataset/tulip/4589045663_653cc64f8b_c.jpg b/src/dataset/tulip/4589045663_653cc64f8b_c.jpg new file mode 100644 index 00000000..52a3371a Binary files /dev/null and b/src/dataset/tulip/4589045663_653cc64f8b_c.jpg differ diff --git a/src/dataset/tulip/4590088191_4bb7be0358_c.jpg b/src/dataset/tulip/4590088191_4bb7be0358_c.jpg new file mode 100644 index 00000000..b9e372ae Binary files /dev/null and b/src/dataset/tulip/4590088191_4bb7be0358_c.jpg differ diff --git a/src/dataset/tulip/4590088533_15bacd2734_c.jpg b/src/dataset/tulip/4590088533_15bacd2734_c.jpg new file mode 100644 index 00000000..7826ab7b Binary files /dev/null and b/src/dataset/tulip/4590088533_15bacd2734_c.jpg differ diff --git a/src/dataset/tulip/4590088643_e22a2ced60_c.jpg b/src/dataset/tulip/4590088643_e22a2ced60_c.jpg new file mode 100644 index 00000000..b4871606 Binary files /dev/null and b/src/dataset/tulip/4590088643_e22a2ced60_c.jpg differ diff --git a/src/dataset/tulip/4590708978_8a627d476c_c.jpg b/src/dataset/tulip/4590708978_8a627d476c_c.jpg new file mode 100644 index 00000000..7862cb77 Binary files /dev/null and b/src/dataset/tulip/4590708978_8a627d476c_c.jpg differ diff --git a/src/dataset/tulip/4590709144_dfd495235a_c.jpg b/src/dataset/tulip/4590709144_dfd495235a_c.jpg new file mode 100644 index 00000000..153afa97 Binary files /dev/null and b/src/dataset/tulip/4590709144_dfd495235a_c.jpg differ diff --git a/src/dataset/tulip/4591203919_4f94639c9d_c.jpg b/src/dataset/tulip/4591203919_4f94639c9d_c.jpg new file mode 100644 index 00000000..01552979 Binary files /dev/null and b/src/dataset/tulip/4591203919_4f94639c9d_c.jpg differ diff --git a/src/dataset/tulip/4592114710_71b5f8ee17_c.jpg b/src/dataset/tulip/4592114710_71b5f8ee17_c.jpg new file mode 100644 index 00000000..1036d4c3 Binary files /dev/null and b/src/dataset/tulip/4592114710_71b5f8ee17_c.jpg differ diff --git a/src/dataset/tulip/459484658_9b4d5270c1_c.jpg b/src/dataset/tulip/459484658_9b4d5270c1_c.jpg new file mode 100644 index 00000000..1c207deb Binary files /dev/null and b/src/dataset/tulip/459484658_9b4d5270c1_c.jpg differ diff --git a/src/dataset/tulip/4608657384_3491cb6029_c.jpg b/src/dataset/tulip/4608657384_3491cb6029_c.jpg new file mode 100644 index 00000000..447afcdc Binary files /dev/null and b/src/dataset/tulip/4608657384_3491cb6029_c.jpg differ diff --git a/src/dataset/tulip/4614571463_74ee14bb2f_c.jpg b/src/dataset/tulip/4614571463_74ee14bb2f_c.jpg new file mode 100644 index 00000000..a1fb47e7 Binary files /dev/null and b/src/dataset/tulip/4614571463_74ee14bb2f_c.jpg differ diff --git a/src/dataset/tulip/4627875780_848c7998aa_c.jpg b/src/dataset/tulip/4627875780_848c7998aa_c.jpg new file mode 100644 index 00000000..6995d6cd Binary files /dev/null and b/src/dataset/tulip/4627875780_848c7998aa_c.jpg differ diff --git a/src/dataset/tulip/465118834_5f5c202f9d_c.jpg b/src/dataset/tulip/465118834_5f5c202f9d_c.jpg new file mode 100644 index 00000000..80f06a5b Binary files /dev/null and b/src/dataset/tulip/465118834_5f5c202f9d_c.jpg differ diff --git a/src/dataset/tulip/4662145147_fc519b30d1_c.jpg b/src/dataset/tulip/4662145147_fc519b30d1_c.jpg new file mode 100644 index 00000000..eedebb04 Binary files /dev/null and b/src/dataset/tulip/4662145147_fc519b30d1_c.jpg differ diff --git a/src/dataset/tulip/466444121_507cd7e5b0_c.jpg b/src/dataset/tulip/466444121_507cd7e5b0_c.jpg new file mode 100644 index 00000000..7f110619 Binary files /dev/null and b/src/dataset/tulip/466444121_507cd7e5b0_c.jpg differ diff --git a/src/dataset/tulip/4664442822_21d3f6d70a_c.jpg b/src/dataset/tulip/4664442822_21d3f6d70a_c.jpg new file mode 100644 index 00000000..d845c5a4 Binary files /dev/null and b/src/dataset/tulip/4664442822_21d3f6d70a_c.jpg differ diff --git a/src/dataset/tulip/4667423507_37260cbdb9_c.jpg b/src/dataset/tulip/4667423507_37260cbdb9_c.jpg new file mode 100644 index 00000000..e66d17ea Binary files /dev/null and b/src/dataset/tulip/4667423507_37260cbdb9_c.jpg differ diff --git a/src/dataset/tulip/4667490085_ce3be9cc92_c.jpg b/src/dataset/tulip/4667490085_ce3be9cc92_c.jpg new file mode 100644 index 00000000..43a0a30b Binary files /dev/null and b/src/dataset/tulip/4667490085_ce3be9cc92_c.jpg differ diff --git a/src/dataset/tulip/466827942_acd1916117_c.jpg b/src/dataset/tulip/466827942_acd1916117_c.jpg new file mode 100644 index 00000000..3251c7d6 Binary files /dev/null and b/src/dataset/tulip/466827942_acd1916117_c.jpg differ diff --git a/src/dataset/tulip/467326548_f249777226_c.jpg b/src/dataset/tulip/467326548_f249777226_c.jpg new file mode 100644 index 00000000..6a83a3c3 Binary files /dev/null and b/src/dataset/tulip/467326548_f249777226_c.jpg differ diff --git a/src/dataset/tulip/467327306_3a2e074e7f_c.jpg b/src/dataset/tulip/467327306_3a2e074e7f_c.jpg new file mode 100644 index 00000000..bc982a41 Binary files /dev/null and b/src/dataset/tulip/467327306_3a2e074e7f_c.jpg differ diff --git a/src/dataset/tulip/467328078_8f6516e48a_c.jpg b/src/dataset/tulip/467328078_8f6516e48a_c.jpg new file mode 100644 index 00000000..57d0101b Binary files /dev/null and b/src/dataset/tulip/467328078_8f6516e48a_c.jpg differ diff --git a/src/dataset/tulip/467337249_a4f6bf6c3c_c.jpg b/src/dataset/tulip/467337249_a4f6bf6c3c_c.jpg new file mode 100644 index 00000000..444c7749 Binary files /dev/null and b/src/dataset/tulip/467337249_a4f6bf6c3c_c.jpg differ diff --git a/src/dataset/tulip/467337971_02e28453a6_c.jpg b/src/dataset/tulip/467337971_02e28453a6_c.jpg new file mode 100644 index 00000000..d5920de2 Binary files /dev/null and b/src/dataset/tulip/467337971_02e28453a6_c.jpg differ diff --git a/src/dataset/tulip/467338017_2c72040203_c.jpg b/src/dataset/tulip/467338017_2c72040203_c.jpg new file mode 100644 index 00000000..0a3131bd Binary files /dev/null and b/src/dataset/tulip/467338017_2c72040203_c.jpg differ diff --git a/src/dataset/tulip/467338221_2f094ec262_c.jpg b/src/dataset/tulip/467338221_2f094ec262_c.jpg new file mode 100644 index 00000000..b3ffca35 Binary files /dev/null and b/src/dataset/tulip/467338221_2f094ec262_c.jpg differ diff --git a/src/dataset/tulip/467339363_361b565292_c.jpg b/src/dataset/tulip/467339363_361b565292_c.jpg new file mode 100644 index 00000000..cf1883ea Binary files /dev/null and b/src/dataset/tulip/467339363_361b565292_c.jpg differ diff --git a/src/dataset/tulip/467339561_eacfe391f3_c.jpg b/src/dataset/tulip/467339561_eacfe391f3_c.jpg new file mode 100644 index 00000000..6bcce3f8 Binary files /dev/null and b/src/dataset/tulip/467339561_eacfe391f3_c.jpg differ diff --git a/src/dataset/tulip/467958046_6db98b844c_c.jpg b/src/dataset/tulip/467958046_6db98b844c_c.jpg new file mode 100644 index 00000000..85613ec4 Binary files /dev/null and b/src/dataset/tulip/467958046_6db98b844c_c.jpg differ diff --git a/src/dataset/tulip/4698459446_210bbe9e4a_c.jpg b/src/dataset/tulip/4698459446_210bbe9e4a_c.jpg new file mode 100644 index 00000000..b5f552a0 Binary files /dev/null and b/src/dataset/tulip/4698459446_210bbe9e4a_c.jpg differ diff --git a/src/dataset/tulip/4701276181_e4ddf4d2d7_c.jpg b/src/dataset/tulip/4701276181_e4ddf4d2d7_c.jpg new file mode 100644 index 00000000..8e08c433 Binary files /dev/null and b/src/dataset/tulip/4701276181_e4ddf4d2d7_c.jpg differ diff --git a/src/dataset/tulip/473408540_c18bcd8a81_c.jpg b/src/dataset/tulip/473408540_c18bcd8a81_c.jpg new file mode 100644 index 00000000..76254e25 Binary files /dev/null and b/src/dataset/tulip/473408540_c18bcd8a81_c.jpg differ diff --git a/src/dataset/tulip/475079278_07189a13c1_c.jpg b/src/dataset/tulip/475079278_07189a13c1_c.jpg new file mode 100644 index 00000000..c79a3541 Binary files /dev/null and b/src/dataset/tulip/475079278_07189a13c1_c.jpg differ diff --git a/src/dataset/tulip/476814323_20aa790b52_c.jpg b/src/dataset/tulip/476814323_20aa790b52_c.jpg new file mode 100644 index 00000000..497809e3 Binary files /dev/null and b/src/dataset/tulip/476814323_20aa790b52_c.jpg differ diff --git a/src/dataset/tulip/4820164636_7ef164b55e_c.jpg b/src/dataset/tulip/4820164636_7ef164b55e_c.jpg new file mode 100644 index 00000000..ead273da Binary files /dev/null and b/src/dataset/tulip/4820164636_7ef164b55e_c.jpg differ diff --git a/src/dataset/tulip/485594839_6611e9d5ac_c.jpg b/src/dataset/tulip/485594839_6611e9d5ac_c.jpg new file mode 100644 index 00000000..d8ed6c6f Binary files /dev/null and b/src/dataset/tulip/485594839_6611e9d5ac_c.jpg differ diff --git a/src/dataset/tulip/486322089_421629c6c7_c.jpg b/src/dataset/tulip/486322089_421629c6c7_c.jpg new file mode 100644 index 00000000..34bc8c94 Binary files /dev/null and b/src/dataset/tulip/486322089_421629c6c7_c.jpg differ diff --git a/src/dataset/tulip/486377394_97c7c8a104_c.jpg b/src/dataset/tulip/486377394_97c7c8a104_c.jpg new file mode 100644 index 00000000..4103a0d4 Binary files /dev/null and b/src/dataset/tulip/486377394_97c7c8a104_c.jpg differ diff --git a/src/dataset/tulip/486392035_059f76abfb_c.jpg b/src/dataset/tulip/486392035_059f76abfb_c.jpg new file mode 100644 index 00000000..9b4211ba Binary files /dev/null and b/src/dataset/tulip/486392035_059f76abfb_c.jpg differ diff --git a/src/dataset/tulip/487341234_1d7af05bf9_c.jpg b/src/dataset/tulip/487341234_1d7af05bf9_c.jpg new file mode 100644 index 00000000..70452617 Binary files /dev/null and b/src/dataset/tulip/487341234_1d7af05bf9_c.jpg differ diff --git a/src/dataset/tulip/492046938_d09967359f_c.jpg b/src/dataset/tulip/492046938_d09967359f_c.jpg new file mode 100644 index 00000000..625a5648 Binary files /dev/null and b/src/dataset/tulip/492046938_d09967359f_c.jpg differ diff --git a/src/dataset/tulip/492049658_7500225021_c.jpg b/src/dataset/tulip/492049658_7500225021_c.jpg new file mode 100644 index 00000000..996eeaff Binary files /dev/null and b/src/dataset/tulip/492049658_7500225021_c.jpg differ diff --git a/src/dataset/tulip/492050980_fbaf04d264_c.jpg b/src/dataset/tulip/492050980_fbaf04d264_c.jpg new file mode 100644 index 00000000..743e2584 Binary files /dev/null and b/src/dataset/tulip/492050980_fbaf04d264_c.jpg differ diff --git a/src/dataset/tulip/492051436_186d01b183_c.jpg b/src/dataset/tulip/492051436_186d01b183_c.jpg new file mode 100644 index 00000000..d7cef13f Binary files /dev/null and b/src/dataset/tulip/492051436_186d01b183_c.jpg differ diff --git a/src/dataset/tulip/492065471_441cdcf61d_c.jpg b/src/dataset/tulip/492065471_441cdcf61d_c.jpg new file mode 100644 index 00000000..5e9255a3 Binary files /dev/null and b/src/dataset/tulip/492065471_441cdcf61d_c.jpg differ diff --git a/src/dataset/tulip/493210069_d4c45fb246_c.jpg b/src/dataset/tulip/493210069_d4c45fb246_c.jpg new file mode 100644 index 00000000..11ca9d63 Binary files /dev/null and b/src/dataset/tulip/493210069_d4c45fb246_c.jpg differ diff --git a/src/dataset/tulip/493740374_ebaddfed31_c.jpg b/src/dataset/tulip/493740374_ebaddfed31_c.jpg new file mode 100644 index 00000000..697ca532 Binary files /dev/null and b/src/dataset/tulip/493740374_ebaddfed31_c.jpg differ diff --git a/src/dataset/tulip/4962669925_43051ab4ee_c.jpg b/src/dataset/tulip/4962669925_43051ab4ee_c.jpg new file mode 100644 index 00000000..c3ecdc27 Binary files /dev/null and b/src/dataset/tulip/4962669925_43051ab4ee_c.jpg differ diff --git a/src/dataset/tulip/500859607_33a7c0cd28_c.jpg b/src/dataset/tulip/500859607_33a7c0cd28_c.jpg new file mode 100644 index 00000000..c25cbab2 Binary files /dev/null and b/src/dataset/tulip/500859607_33a7c0cd28_c.jpg differ diff --git a/src/dataset/tulip/5015238713_ec82499393_c.jpg b/src/dataset/tulip/5015238713_ec82499393_c.jpg new file mode 100644 index 00000000..35197027 Binary files /dev/null and b/src/dataset/tulip/5015238713_ec82499393_c.jpg differ diff --git a/src/dataset/tulip/503962049_d910a59a6b_c.jpg b/src/dataset/tulip/503962049_d910a59a6b_c.jpg new file mode 100644 index 00000000..bd438473 Binary files /dev/null and b/src/dataset/tulip/503962049_d910a59a6b_c.jpg differ diff --git a/src/dataset/tulip/507377149_fa9a1c4f84_c.jpg b/src/dataset/tulip/507377149_fa9a1c4f84_c.jpg new file mode 100644 index 00000000..3a5405c0 Binary files /dev/null and b/src/dataset/tulip/507377149_fa9a1c4f84_c.jpg differ diff --git a/src/dataset/tulip/51348499_278f5b4136_c.jpg b/src/dataset/tulip/51348499_278f5b4136_c.jpg new file mode 100644 index 00000000..56f4c19a Binary files /dev/null and b/src/dataset/tulip/51348499_278f5b4136_c.jpg differ diff --git a/src/dataset/tulip/514223302_e8f3738706_c.jpg b/src/dataset/tulip/514223302_e8f3738706_c.jpg new file mode 100644 index 00000000..076f1691 Binary files /dev/null and b/src/dataset/tulip/514223302_e8f3738706_c.jpg differ diff --git a/src/dataset/tulip/514252335_7b5e6040c6_c.jpg b/src/dataset/tulip/514252335_7b5e6040c6_c.jpg new file mode 100644 index 00000000..41c6f9e8 Binary files /dev/null and b/src/dataset/tulip/514252335_7b5e6040c6_c.jpg differ diff --git a/src/dataset/tulip/5173143605_a28ddccaf8_c.jpg b/src/dataset/tulip/5173143605_a28ddccaf8_c.jpg new file mode 100644 index 00000000..0e6aee23 Binary files /dev/null and b/src/dataset/tulip/5173143605_a28ddccaf8_c.jpg differ diff --git a/src/dataset/tulip/5225455356_a09cfd2439_c.jpg b/src/dataset/tulip/5225455356_a09cfd2439_c.jpg new file mode 100644 index 00000000..52288bd6 Binary files /dev/null and b/src/dataset/tulip/5225455356_a09cfd2439_c.jpg differ diff --git a/src/dataset/tulip/5258691442_7192a87efa_c.jpg b/src/dataset/tulip/5258691442_7192a87efa_c.jpg new file mode 100644 index 00000000..cbe4c636 Binary files /dev/null and b/src/dataset/tulip/5258691442_7192a87efa_c.jpg differ diff --git a/src/dataset/tulip/5380763137_b79cba68a3_c.jpg b/src/dataset/tulip/5380763137_b79cba68a3_c.jpg new file mode 100644 index 00000000..43f5a635 Binary files /dev/null and b/src/dataset/tulip/5380763137_b79cba68a3_c.jpg differ diff --git a/src/dataset/tulip/5380763949_c0444923b0_c.jpg b/src/dataset/tulip/5380763949_c0444923b0_c.jpg new file mode 100644 index 00000000..5dedfc2a Binary files /dev/null and b/src/dataset/tulip/5380763949_c0444923b0_c.jpg differ diff --git a/src/dataset/tulip/5380766011_e4fe08eb3b_c.jpg b/src/dataset/tulip/5380766011_e4fe08eb3b_c.jpg new file mode 100644 index 00000000..f4405ceb Binary files /dev/null and b/src/dataset/tulip/5380766011_e4fe08eb3b_c.jpg differ diff --git a/src/dataset/tulip/5380767813_20b902159e_c.jpg b/src/dataset/tulip/5380767813_20b902159e_c.jpg new file mode 100644 index 00000000..e5cfa4e4 Binary files /dev/null and b/src/dataset/tulip/5380767813_20b902159e_c.jpg differ diff --git a/src/dataset/tulip/5393528637_b9d2c4c4d5_c.jpg b/src/dataset/tulip/5393528637_b9d2c4c4d5_c.jpg new file mode 100644 index 00000000..bf96a3ca Binary files /dev/null and b/src/dataset/tulip/5393528637_b9d2c4c4d5_c.jpg differ diff --git a/src/dataset/tulip/5406966602_84c49d363e_c.jpg b/src/dataset/tulip/5406966602_84c49d363e_c.jpg new file mode 100644 index 00000000..48f91da6 Binary files /dev/null and b/src/dataset/tulip/5406966602_84c49d363e_c.jpg differ diff --git a/src/dataset/tulip/5407579588_de20a81823_c.jpg b/src/dataset/tulip/5407579588_de20a81823_c.jpg new file mode 100644 index 00000000..d51791c4 Binary files /dev/null and b/src/dataset/tulip/5407579588_de20a81823_c.jpg differ diff --git a/src/dataset/tulip/5420935062_ef7f1c0ba7_c.jpg b/src/dataset/tulip/5420935062_ef7f1c0ba7_c.jpg new file mode 100644 index 00000000..2a7f6fc2 Binary files /dev/null and b/src/dataset/tulip/5420935062_ef7f1c0ba7_c.jpg differ diff --git a/src/dataset/tulip/5442117707_5221867930_c.jpg b/src/dataset/tulip/5442117707_5221867930_c.jpg new file mode 100644 index 00000000..b691df33 Binary files /dev/null and b/src/dataset/tulip/5442117707_5221867930_c.jpg differ diff --git a/src/dataset/tulip/5457463219_af99b7b016_c.jpg b/src/dataset/tulip/5457463219_af99b7b016_c.jpg new file mode 100644 index 00000000..a562742d Binary files /dev/null and b/src/dataset/tulip/5457463219_af99b7b016_c.jpg differ diff --git a/src/dataset/tulip/5463375824_ce73b993b8_c.jpg b/src/dataset/tulip/5463375824_ce73b993b8_c.jpg new file mode 100644 index 00000000..648c7102 Binary files /dev/null and b/src/dataset/tulip/5463375824_ce73b993b8_c.jpg differ diff --git a/src/dataset/tulip/5466118204_3e970871bb_c.jpg b/src/dataset/tulip/5466118204_3e970871bb_c.jpg new file mode 100644 index 00000000..51341907 Binary files /dev/null and b/src/dataset/tulip/5466118204_3e970871bb_c.jpg differ diff --git a/src/dataset/tulip/5467324449_6a1d43bb18_c.jpg b/src/dataset/tulip/5467324449_6a1d43bb18_c.jpg new file mode 100644 index 00000000..d9b51486 Binary files /dev/null and b/src/dataset/tulip/5467324449_6a1d43bb18_c.jpg differ diff --git a/src/dataset/tulip/5470898169_52a5ab876c_c.jpg b/src/dataset/tulip/5470898169_52a5ab876c_c.jpg new file mode 100644 index 00000000..fde826d1 Binary files /dev/null and b/src/dataset/tulip/5470898169_52a5ab876c_c.jpg differ diff --git a/src/dataset/tulip/5487564980_b08f5e87fc_c.jpg b/src/dataset/tulip/5487564980_b08f5e87fc_c.jpg new file mode 100644 index 00000000..2d067e98 Binary files /dev/null and b/src/dataset/tulip/5487564980_b08f5e87fc_c.jpg differ diff --git a/src/dataset/tulip/5488085135_82111d8506_c.jpg b/src/dataset/tulip/5488085135_82111d8506_c.jpg new file mode 100644 index 00000000..676499f5 Binary files /dev/null and b/src/dataset/tulip/5488085135_82111d8506_c.jpg differ diff --git a/src/dataset/tulip/5488085547_5847195f47_c.jpg b/src/dataset/tulip/5488085547_5847195f47_c.jpg new file mode 100644 index 00000000..ff4577c2 Binary files /dev/null and b/src/dataset/tulip/5488085547_5847195f47_c.jpg differ diff --git a/src/dataset/tulip/5512168506_0872b70028_c.jpg b/src/dataset/tulip/5512168506_0872b70028_c.jpg new file mode 100644 index 00000000..87291445 Binary files /dev/null and b/src/dataset/tulip/5512168506_0872b70028_c.jpg differ diff --git a/src/dataset/tulip/5512171548_f1e477b5c2_c.jpg b/src/dataset/tulip/5512171548_f1e477b5c2_c.jpg new file mode 100644 index 00000000..a2a84205 Binary files /dev/null and b/src/dataset/tulip/5512171548_f1e477b5c2_c.jpg differ diff --git a/src/dataset/tulip/5519167578_aa82f22c95_c.jpg b/src/dataset/tulip/5519167578_aa82f22c95_c.jpg new file mode 100644 index 00000000..17b193b9 Binary files /dev/null and b/src/dataset/tulip/5519167578_aa82f22c95_c.jpg differ diff --git a/src/dataset/tulip/5536137680_9681fbf1af_c.jpg b/src/dataset/tulip/5536137680_9681fbf1af_c.jpg new file mode 100644 index 00000000..c3b7708b Binary files /dev/null and b/src/dataset/tulip/5536137680_9681fbf1af_c.jpg differ diff --git a/src/dataset/tulip/5539156807_db87a42748_c.jpg b/src/dataset/tulip/5539156807_db87a42748_c.jpg new file mode 100644 index 00000000..d56d7e08 Binary files /dev/null and b/src/dataset/tulip/5539156807_db87a42748_c.jpg differ diff --git a/src/dataset/tulip/5544327230_1061f9d38b_c.jpg b/src/dataset/tulip/5544327230_1061f9d38b_c.jpg new file mode 100644 index 00000000..542b9845 Binary files /dev/null and b/src/dataset/tulip/5544327230_1061f9d38b_c.jpg differ diff --git a/src/dataset/tulip/5564616258_802a732988_c.jpg b/src/dataset/tulip/5564616258_802a732988_c.jpg new file mode 100644 index 00000000..47dd2436 Binary files /dev/null and b/src/dataset/tulip/5564616258_802a732988_c.jpg differ diff --git a/src/dataset/tulip/5595177656_92f55bdb43_c.jpg b/src/dataset/tulip/5595177656_92f55bdb43_c.jpg new file mode 100644 index 00000000..e9877b73 Binary files /dev/null and b/src/dataset/tulip/5595177656_92f55bdb43_c.jpg differ diff --git a/src/dataset/tulip/5598928488_8bea8e6362_c.jpg b/src/dataset/tulip/5598928488_8bea8e6362_c.jpg new file mode 100644 index 00000000..f9eb5702 Binary files /dev/null and b/src/dataset/tulip/5598928488_8bea8e6362_c.jpg differ diff --git a/src/dataset/tulip/5600968069_6ff4ef6d7e_c.jpg b/src/dataset/tulip/5600968069_6ff4ef6d7e_c.jpg new file mode 100644 index 00000000..e419292f Binary files /dev/null and b/src/dataset/tulip/5600968069_6ff4ef6d7e_c.jpg differ diff --git a/src/dataset/tulip/5606577169_63ed0337ea_c.jpg b/src/dataset/tulip/5606577169_63ed0337ea_c.jpg new file mode 100644 index 00000000..c2497d5a Binary files /dev/null and b/src/dataset/tulip/5606577169_63ed0337ea_c.jpg differ diff --git a/src/dataset/tulip/5607699491_534b40b827_c.jpg b/src/dataset/tulip/5607699491_534b40b827_c.jpg new file mode 100644 index 00000000..18e6e6ae Binary files /dev/null and b/src/dataset/tulip/5607699491_534b40b827_c.jpg differ diff --git a/src/dataset/tulip/5622387248_15f888bf14_c.jpg b/src/dataset/tulip/5622387248_15f888bf14_c.jpg new file mode 100644 index 00000000..dcbcf29d Binary files /dev/null and b/src/dataset/tulip/5622387248_15f888bf14_c.jpg differ diff --git a/src/dataset/tulip/5622840285_0620b1dec8_c.jpg b/src/dataset/tulip/5622840285_0620b1dec8_c.jpg new file mode 100644 index 00000000..aff12e8a Binary files /dev/null and b/src/dataset/tulip/5622840285_0620b1dec8_c.jpg differ diff --git a/src/dataset/tulip/5623693702_2a0785697b_c.jpg b/src/dataset/tulip/5623693702_2a0785697b_c.jpg new file mode 100644 index 00000000..d67fbc7b Binary files /dev/null and b/src/dataset/tulip/5623693702_2a0785697b_c.jpg differ diff --git a/src/dataset/tulip/5624360941_3b54b0ecdd_c.jpg b/src/dataset/tulip/5624360941_3b54b0ecdd_c.jpg new file mode 100644 index 00000000..6e570f01 Binary files /dev/null and b/src/dataset/tulip/5624360941_3b54b0ecdd_c.jpg differ diff --git a/src/dataset/tulip/5626046061_54ed2c2f5c_c.jpg b/src/dataset/tulip/5626046061_54ed2c2f5c_c.jpg new file mode 100644 index 00000000..202834b9 Binary files /dev/null and b/src/dataset/tulip/5626046061_54ed2c2f5c_c.jpg differ diff --git a/src/dataset/tulip/5632341996_565001767f_c.jpg b/src/dataset/tulip/5632341996_565001767f_c.jpg new file mode 100644 index 00000000..8c79947e Binary files /dev/null and b/src/dataset/tulip/5632341996_565001767f_c.jpg differ diff --git a/src/dataset/tulip/5633740522_593141d252_c.jpg b/src/dataset/tulip/5633740522_593141d252_c.jpg new file mode 100644 index 00000000..e008da4a Binary files /dev/null and b/src/dataset/tulip/5633740522_593141d252_c.jpg differ diff --git a/src/dataset/tulip/5633741708_39102d3943_c.jpg b/src/dataset/tulip/5633741708_39102d3943_c.jpg new file mode 100644 index 00000000..fd0f1188 Binary files /dev/null and b/src/dataset/tulip/5633741708_39102d3943_c.jpg differ diff --git a/src/dataset/tulip/5633743289_0327edb43b_c.jpg b/src/dataset/tulip/5633743289_0327edb43b_c.jpg new file mode 100644 index 00000000..e3101a7c Binary files /dev/null and b/src/dataset/tulip/5633743289_0327edb43b_c.jpg differ diff --git a/src/dataset/tulip/5633998226_facd03c69e_c.jpg b/src/dataset/tulip/5633998226_facd03c69e_c.jpg new file mode 100644 index 00000000..4c96de3c Binary files /dev/null and b/src/dataset/tulip/5633998226_facd03c69e_c.jpg differ diff --git a/src/dataset/tulip/5642163428_311d76aa0e_c.jpg b/src/dataset/tulip/5642163428_311d76aa0e_c.jpg new file mode 100644 index 00000000..b8be0892 Binary files /dev/null and b/src/dataset/tulip/5642163428_311d76aa0e_c.jpg differ diff --git a/src/dataset/tulip/5644203573_2b8cf4410b_c.jpg b/src/dataset/tulip/5644203573_2b8cf4410b_c.jpg new file mode 100644 index 00000000..c26fb68d Binary files /dev/null and b/src/dataset/tulip/5644203573_2b8cf4410b_c.jpg differ diff --git a/src/dataset/tulip/5645190971_fba2bd4558_c.jpg b/src/dataset/tulip/5645190971_fba2bd4558_c.jpg new file mode 100644 index 00000000..34783101 Binary files /dev/null and b/src/dataset/tulip/5645190971_fba2bd4558_c.jpg differ diff --git a/src/dataset/tulip/5645753876_261fe98660_c.jpg b/src/dataset/tulip/5645753876_261fe98660_c.jpg new file mode 100644 index 00000000..be10ef1d Binary files /dev/null and b/src/dataset/tulip/5645753876_261fe98660_c.jpg differ diff --git a/src/dataset/tulip/5649315898_30c83ca27c_c.jpg b/src/dataset/tulip/5649315898_30c83ca27c_c.jpg new file mode 100644 index 00000000..56b55fce Binary files /dev/null and b/src/dataset/tulip/5649315898_30c83ca27c_c.jpg differ diff --git a/src/dataset/tulip/5650314070_f2ec26ab4a_c.jpg b/src/dataset/tulip/5650314070_f2ec26ab4a_c.jpg new file mode 100644 index 00000000..5864d360 Binary files /dev/null and b/src/dataset/tulip/5650314070_f2ec26ab4a_c.jpg differ diff --git a/src/dataset/tulip/5650315206_0fd199298a_c.jpg b/src/dataset/tulip/5650315206_0fd199298a_c.jpg new file mode 100644 index 00000000..499fc267 Binary files /dev/null and b/src/dataset/tulip/5650315206_0fd199298a_c.jpg differ diff --git a/src/dataset/tulip/5650668743_2d4a7cf9ab_c.jpg b/src/dataset/tulip/5650668743_2d4a7cf9ab_c.jpg new file mode 100644 index 00000000..e089464d Binary files /dev/null and b/src/dataset/tulip/5650668743_2d4a7cf9ab_c.jpg differ diff --git a/src/dataset/tulip/5654839752_8173a7372e_c.jpg b/src/dataset/tulip/5654839752_8173a7372e_c.jpg new file mode 100644 index 00000000..2dff6d98 Binary files /dev/null and b/src/dataset/tulip/5654839752_8173a7372e_c.jpg differ diff --git a/src/dataset/tulip/5658403681_2f4314aeeb_c.jpg b/src/dataset/tulip/5658403681_2f4314aeeb_c.jpg new file mode 100644 index 00000000..9e69b765 Binary files /dev/null and b/src/dataset/tulip/5658403681_2f4314aeeb_c.jpg differ diff --git a/src/dataset/tulip/5658792455_4dac3093fc_c.jpg b/src/dataset/tulip/5658792455_4dac3093fc_c.jpg new file mode 100644 index 00000000..fc375f56 Binary files /dev/null and b/src/dataset/tulip/5658792455_4dac3093fc_c.jpg differ diff --git a/src/dataset/tulip/5668319663_d401197fb1_c.jpg b/src/dataset/tulip/5668319663_d401197fb1_c.jpg new file mode 100644 index 00000000..95e9137e Binary files /dev/null and b/src/dataset/tulip/5668319663_d401197fb1_c.jpg differ diff --git a/src/dataset/tulip/5668879980_8e9f5283c5_c.jpg b/src/dataset/tulip/5668879980_8e9f5283c5_c.jpg new file mode 100644 index 00000000..990191fa Binary files /dev/null and b/src/dataset/tulip/5668879980_8e9f5283c5_c.jpg differ diff --git a/src/dataset/tulip/5671367507_eea5439498_c.jpg b/src/dataset/tulip/5671367507_eea5439498_c.jpg new file mode 100644 index 00000000..7a4bad68 Binary files /dev/null and b/src/dataset/tulip/5671367507_eea5439498_c.jpg differ diff --git a/src/dataset/tulip/5676925814_75a55ed06c_c.jpg b/src/dataset/tulip/5676925814_75a55ed06c_c.jpg new file mode 100644 index 00000000..813aad5d Binary files /dev/null and b/src/dataset/tulip/5676925814_75a55ed06c_c.jpg differ diff --git a/src/dataset/tulip/5676994792_e75ae9c322_c.jpg b/src/dataset/tulip/5676994792_e75ae9c322_c.jpg new file mode 100644 index 00000000..97b97d6c Binary files /dev/null and b/src/dataset/tulip/5676994792_e75ae9c322_c.jpg differ diff --git a/src/dataset/tulip/5676995868_8f49587b02_c.jpg b/src/dataset/tulip/5676995868_8f49587b02_c.jpg new file mode 100644 index 00000000..211fc03f Binary files /dev/null and b/src/dataset/tulip/5676995868_8f49587b02_c.jpg differ diff --git a/src/dataset/tulip/5678377397_b58beed418_c.jpg b/src/dataset/tulip/5678377397_b58beed418_c.jpg new file mode 100644 index 00000000..3bb5f834 Binary files /dev/null and b/src/dataset/tulip/5678377397_b58beed418_c.jpg differ diff --git a/src/dataset/tulip/5688042001_eaf187030e_c.jpg b/src/dataset/tulip/5688042001_eaf187030e_c.jpg new file mode 100644 index 00000000..8aefac3a Binary files /dev/null and b/src/dataset/tulip/5688042001_eaf187030e_c.jpg differ diff --git a/src/dataset/tulip/5691207591_01df43df6a_c.jpg b/src/dataset/tulip/5691207591_01df43df6a_c.jpg new file mode 100644 index 00000000..f249544a Binary files /dev/null and b/src/dataset/tulip/5691207591_01df43df6a_c.jpg differ diff --git a/src/dataset/tulip/5691248281_f2b6f52507_c.jpg b/src/dataset/tulip/5691248281_f2b6f52507_c.jpg new file mode 100644 index 00000000..9aae03e8 Binary files /dev/null and b/src/dataset/tulip/5691248281_f2b6f52507_c.jpg differ diff --git a/src/dataset/tulip/5691727641_24a06150f4_c.jpg b/src/dataset/tulip/5691727641_24a06150f4_c.jpg new file mode 100644 index 00000000..4c08a8d5 Binary files /dev/null and b/src/dataset/tulip/5691727641_24a06150f4_c.jpg differ diff --git a/src/dataset/tulip/5691728635_1ccabaf209_c.jpg b/src/dataset/tulip/5691728635_1ccabaf209_c.jpg new file mode 100644 index 00000000..cd778e4a Binary files /dev/null and b/src/dataset/tulip/5691728635_1ccabaf209_c.jpg differ diff --git a/src/dataset/tulip/5691729437_fdb22f2b19_c.jpg b/src/dataset/tulip/5691729437_fdb22f2b19_c.jpg new file mode 100644 index 00000000..ee6bbf14 Binary files /dev/null and b/src/dataset/tulip/5691729437_fdb22f2b19_c.jpg differ diff --git a/src/dataset/tulip/5691730281_c2c9de3b1c_c.jpg b/src/dataset/tulip/5691730281_c2c9de3b1c_c.jpg new file mode 100644 index 00000000..45e8c3fb Binary files /dev/null and b/src/dataset/tulip/5691730281_c2c9de3b1c_c.jpg differ diff --git a/src/dataset/tulip/5691746801_1e009afb15_c.jpg b/src/dataset/tulip/5691746801_1e009afb15_c.jpg new file mode 100644 index 00000000..dd6f4774 Binary files /dev/null and b/src/dataset/tulip/5691746801_1e009afb15_c.jpg differ diff --git a/src/dataset/tulip/5691747335_897594f6ea_c.jpg b/src/dataset/tulip/5691747335_897594f6ea_c.jpg new file mode 100644 index 00000000..bcd082a5 Binary files /dev/null and b/src/dataset/tulip/5691747335_897594f6ea_c.jpg differ diff --git a/src/dataset/tulip/5691760887_eaab5f14d2_c.jpg b/src/dataset/tulip/5691760887_eaab5f14d2_c.jpg new file mode 100644 index 00000000..6a58fadf Binary files /dev/null and b/src/dataset/tulip/5691760887_eaab5f14d2_c.jpg differ diff --git a/src/dataset/tulip/5691779912_cb3cdebcab_c.jpg b/src/dataset/tulip/5691779912_cb3cdebcab_c.jpg new file mode 100644 index 00000000..19e2d997 Binary files /dev/null and b/src/dataset/tulip/5691779912_cb3cdebcab_c.jpg differ diff --git a/src/dataset/tulip/5691780480_bf61049f60_c.jpg b/src/dataset/tulip/5691780480_bf61049f60_c.jpg new file mode 100644 index 00000000..670a92bd Binary files /dev/null and b/src/dataset/tulip/5691780480_bf61049f60_c.jpg differ diff --git a/src/dataset/tulip/5692301230_9c2e8195c0_c.jpg b/src/dataset/tulip/5692301230_9c2e8195c0_c.jpg new file mode 100644 index 00000000..adaf59ba Binary files /dev/null and b/src/dataset/tulip/5692301230_9c2e8195c0_c.jpg differ diff --git a/src/dataset/tulip/5692316346_8e3e78fccd_c.jpg b/src/dataset/tulip/5692316346_8e3e78fccd_c.jpg new file mode 100644 index 00000000..d440985a Binary files /dev/null and b/src/dataset/tulip/5692316346_8e3e78fccd_c.jpg differ diff --git a/src/dataset/tulip/5693302821_67c48876a2_c.jpg b/src/dataset/tulip/5693302821_67c48876a2_c.jpg new file mode 100644 index 00000000..c285586d Binary files /dev/null and b/src/dataset/tulip/5693302821_67c48876a2_c.jpg differ diff --git a/src/dataset/tulip/5697732034_1173d08fd7_c.jpg b/src/dataset/tulip/5697732034_1173d08fd7_c.jpg new file mode 100644 index 00000000..19062185 Binary files /dev/null and b/src/dataset/tulip/5697732034_1173d08fd7_c.jpg differ diff --git a/src/dataset/tulip/5699994479_76b3884245_c.jpg b/src/dataset/tulip/5699994479_76b3884245_c.jpg new file mode 100644 index 00000000..50df1e4e Binary files /dev/null and b/src/dataset/tulip/5699994479_76b3884245_c.jpg differ diff --git a/src/dataset/tulip/5699996939_12526b127e_c.jpg b/src/dataset/tulip/5699996939_12526b127e_c.jpg new file mode 100644 index 00000000..a610e1b3 Binary files /dev/null and b/src/dataset/tulip/5699996939_12526b127e_c.jpg differ diff --git a/src/dataset/tulip/5700560474_d50d3364b7_c.jpg b/src/dataset/tulip/5700560474_d50d3364b7_c.jpg new file mode 100644 index 00000000..c92e3054 Binary files /dev/null and b/src/dataset/tulip/5700560474_d50d3364b7_c.jpg differ diff --git a/src/dataset/tulip/5700570246_7f457c965c_c.jpg b/src/dataset/tulip/5700570246_7f457c965c_c.jpg new file mode 100644 index 00000000..109479dd Binary files /dev/null and b/src/dataset/tulip/5700570246_7f457c965c_c.jpg differ diff --git a/src/dataset/tulip/5700572638_296ef0743e_c.jpg b/src/dataset/tulip/5700572638_296ef0743e_c.jpg new file mode 100644 index 00000000..bfa6fc2b Binary files /dev/null and b/src/dataset/tulip/5700572638_296ef0743e_c.jpg differ diff --git a/src/dataset/tulip/5700576160_7f521aee82_c.jpg b/src/dataset/tulip/5700576160_7f521aee82_c.jpg new file mode 100644 index 00000000..91fdbcb9 Binary files /dev/null and b/src/dataset/tulip/5700576160_7f521aee82_c.jpg differ diff --git a/src/dataset/tulip/5702211752_a2b0029991_c.jpg b/src/dataset/tulip/5702211752_a2b0029991_c.jpg new file mode 100644 index 00000000..ed8e70a7 Binary files /dev/null and b/src/dataset/tulip/5702211752_a2b0029991_c.jpg differ diff --git a/src/dataset/tulip/5702866627_6c55f8a844_c.jpg b/src/dataset/tulip/5702866627_6c55f8a844_c.jpg new file mode 100644 index 00000000..3226cc50 Binary files /dev/null and b/src/dataset/tulip/5702866627_6c55f8a844_c.jpg differ diff --git a/src/dataset/tulip/5703436266_2e01bcfd96_c.jpg b/src/dataset/tulip/5703436266_2e01bcfd96_c.jpg new file mode 100644 index 00000000..ce03fab1 Binary files /dev/null and b/src/dataset/tulip/5703436266_2e01bcfd96_c.jpg differ diff --git a/src/dataset/tulip/5705231079_22b27df2de_c.jpg b/src/dataset/tulip/5705231079_22b27df2de_c.jpg new file mode 100644 index 00000000..dd67f03a Binary files /dev/null and b/src/dataset/tulip/5705231079_22b27df2de_c.jpg differ diff --git a/src/dataset/tulip/5707621250_858aba6ecc_c.jpg b/src/dataset/tulip/5707621250_858aba6ecc_c.jpg new file mode 100644 index 00000000..f4c5583c Binary files /dev/null and b/src/dataset/tulip/5707621250_858aba6ecc_c.jpg differ diff --git a/src/dataset/tulip/5707621472_78edafc284_c.jpg b/src/dataset/tulip/5707621472_78edafc284_c.jpg new file mode 100644 index 00000000..b8e398ec Binary files /dev/null and b/src/dataset/tulip/5707621472_78edafc284_c.jpg differ diff --git a/src/dataset/tulip/5714392231_395f5c377d_c.jpg b/src/dataset/tulip/5714392231_395f5c377d_c.jpg new file mode 100644 index 00000000..85b7b47e Binary files /dev/null and b/src/dataset/tulip/5714392231_395f5c377d_c.jpg differ diff --git a/src/dataset/tulip/5724895609_c19f0db9a9_c.jpg b/src/dataset/tulip/5724895609_c19f0db9a9_c.jpg new file mode 100644 index 00000000..ec327f33 Binary files /dev/null and b/src/dataset/tulip/5724895609_c19f0db9a9_c.jpg differ diff --git a/src/dataset/tulip/5727203424_d9f398743e_c.jpg b/src/dataset/tulip/5727203424_d9f398743e_c.jpg new file mode 100644 index 00000000..1c9d6e79 Binary files /dev/null and b/src/dataset/tulip/5727203424_d9f398743e_c.jpg differ diff --git a/src/dataset/tulip/5729773260_5f530bd4ba_c.jpg b/src/dataset/tulip/5729773260_5f530bd4ba_c.jpg new file mode 100644 index 00000000..8867edc0 Binary files /dev/null and b/src/dataset/tulip/5729773260_5f530bd4ba_c.jpg differ diff --git a/src/dataset/tulip/5735307324_83faf93a25_c.jpg b/src/dataset/tulip/5735307324_83faf93a25_c.jpg new file mode 100644 index 00000000..cbd123f5 Binary files /dev/null and b/src/dataset/tulip/5735307324_83faf93a25_c.jpg differ diff --git a/src/dataset/tulip/5738797242_2d958b7de8_c.jpg b/src/dataset/tulip/5738797242_2d958b7de8_c.jpg new file mode 100644 index 00000000..c29ad2e3 Binary files /dev/null and b/src/dataset/tulip/5738797242_2d958b7de8_c.jpg differ diff --git a/src/dataset/tulip/5743350031_64138997de_c.jpg b/src/dataset/tulip/5743350031_64138997de_c.jpg new file mode 100644 index 00000000..935687de Binary files /dev/null and b/src/dataset/tulip/5743350031_64138997de_c.jpg differ diff --git a/src/dataset/tulip/5748576959_2156dd8133_c.jpg b/src/dataset/tulip/5748576959_2156dd8133_c.jpg new file mode 100644 index 00000000..8b0e83b9 Binary files /dev/null and b/src/dataset/tulip/5748576959_2156dd8133_c.jpg differ diff --git a/src/dataset/tulip/5748914148_cda67049d4_c.jpg b/src/dataset/tulip/5748914148_cda67049d4_c.jpg new file mode 100644 index 00000000..67add1cd Binary files /dev/null and b/src/dataset/tulip/5748914148_cda67049d4_c.jpg differ diff --git a/src/dataset/tulip/5764470975_b846519c6b_c.jpg b/src/dataset/tulip/5764470975_b846519c6b_c.jpg new file mode 100644 index 00000000..544f6d6b Binary files /dev/null and b/src/dataset/tulip/5764470975_b846519c6b_c.jpg differ diff --git a/src/dataset/tulip/5784750424_89e7a378ce_c.jpg b/src/dataset/tulip/5784750424_89e7a378ce_c.jpg new file mode 100644 index 00000000..3cc428be Binary files /dev/null and b/src/dataset/tulip/5784750424_89e7a378ce_c.jpg differ diff --git a/src/dataset/tulip/5784759362_c4cea8a01e_c.jpg b/src/dataset/tulip/5784759362_c4cea8a01e_c.jpg new file mode 100644 index 00000000..b70b2814 Binary files /dev/null and b/src/dataset/tulip/5784759362_c4cea8a01e_c.jpg differ diff --git a/src/dataset/tulip/5784761612_9b920af310_c.jpg b/src/dataset/tulip/5784761612_9b920af310_c.jpg new file mode 100644 index 00000000..870ea30b Binary files /dev/null and b/src/dataset/tulip/5784761612_9b920af310_c.jpg differ diff --git a/src/dataset/tulip/5810294779_fd2af7c953_c.jpg b/src/dataset/tulip/5810294779_fd2af7c953_c.jpg new file mode 100644 index 00000000..4f79c3cb Binary files /dev/null and b/src/dataset/tulip/5810294779_fd2af7c953_c.jpg differ diff --git a/src/dataset/tulip/5824297122_f5f689052f_c.jpg b/src/dataset/tulip/5824297122_f5f689052f_c.jpg new file mode 100644 index 00000000..a9af5612 Binary files /dev/null and b/src/dataset/tulip/5824297122_f5f689052f_c.jpg differ diff --git a/src/dataset/tulip/5825363288_0738737f2c_c.jpg b/src/dataset/tulip/5825363288_0738737f2c_c.jpg new file mode 100644 index 00000000..e1c3ee4e Binary files /dev/null and b/src/dataset/tulip/5825363288_0738737f2c_c.jpg differ diff --git a/src/dataset/tulip/5832456201_f98ec10d6b_c.jpg b/src/dataset/tulip/5832456201_f98ec10d6b_c.jpg new file mode 100644 index 00000000..4ccb539d Binary files /dev/null and b/src/dataset/tulip/5832456201_f98ec10d6b_c.jpg differ diff --git a/src/dataset/tulip/5859746409_7143a5ab7e_c.jpg b/src/dataset/tulip/5859746409_7143a5ab7e_c.jpg new file mode 100644 index 00000000..c34b8277 Binary files /dev/null and b/src/dataset/tulip/5859746409_7143a5ab7e_c.jpg differ diff --git a/src/dataset/tulip/5868189747_5a27ce4274_c.jpg b/src/dataset/tulip/5868189747_5a27ce4274_c.jpg new file mode 100644 index 00000000..71bc906d Binary files /dev/null and b/src/dataset/tulip/5868189747_5a27ce4274_c.jpg differ diff --git a/src/dataset/tulip/5875946787_320cdb27a3_c.jpg b/src/dataset/tulip/5875946787_320cdb27a3_c.jpg new file mode 100644 index 00000000..398f3cb0 Binary files /dev/null and b/src/dataset/tulip/5875946787_320cdb27a3_c.jpg differ diff --git a/src/dataset/tulip/5906289717_4ace668c72_c.jpg b/src/dataset/tulip/5906289717_4ace668c72_c.jpg new file mode 100644 index 00000000..081a7ee9 Binary files /dev/null and b/src/dataset/tulip/5906289717_4ace668c72_c.jpg differ diff --git a/src/dataset/tulip/5941475180_ce15733ac4_c.jpg b/src/dataset/tulip/5941475180_ce15733ac4_c.jpg new file mode 100644 index 00000000..62011ed8 Binary files /dev/null and b/src/dataset/tulip/5941475180_ce15733ac4_c.jpg differ diff --git a/src/dataset/tulip/5957203286_3cb3d92c6e_c.jpg b/src/dataset/tulip/5957203286_3cb3d92c6e_c.jpg new file mode 100644 index 00000000..ee2e7082 Binary files /dev/null and b/src/dataset/tulip/5957203286_3cb3d92c6e_c.jpg differ diff --git a/src/dataset/tulip/6009552377_31dcea1331_c.jpg b/src/dataset/tulip/6009552377_31dcea1331_c.jpg new file mode 100644 index 00000000..cdde625b Binary files /dev/null and b/src/dataset/tulip/6009552377_31dcea1331_c.jpg differ diff --git a/src/dataset/tulip/605761305_994f8f9948_c.jpg b/src/dataset/tulip/605761305_994f8f9948_c.jpg new file mode 100644 index 00000000..bd0d3035 Binary files /dev/null and b/src/dataset/tulip/605761305_994f8f9948_c.jpg differ diff --git a/src/dataset/tulip/6059914598_92be1d0a94_c.jpg b/src/dataset/tulip/6059914598_92be1d0a94_c.jpg new file mode 100644 index 00000000..50017f0d Binary files /dev/null and b/src/dataset/tulip/6059914598_92be1d0a94_c.jpg differ diff --git a/src/dataset/tulip/6068502492_882af46aca_c.jpg b/src/dataset/tulip/6068502492_882af46aca_c.jpg new file mode 100644 index 00000000..bc420edc Binary files /dev/null and b/src/dataset/tulip/6068502492_882af46aca_c.jpg differ diff --git a/src/dataset/tulip/6091066111_a154bdb4f2_c.jpg b/src/dataset/tulip/6091066111_a154bdb4f2_c.jpg new file mode 100644 index 00000000..c144cd4e Binary files /dev/null and b/src/dataset/tulip/6091066111_a154bdb4f2_c.jpg differ diff --git a/src/dataset/tulip/6091066229_c80ff3be09_c.jpg b/src/dataset/tulip/6091066229_c80ff3be09_c.jpg new file mode 100644 index 00000000..669999d9 Binary files /dev/null and b/src/dataset/tulip/6091066229_c80ff3be09_c.jpg differ diff --git a/src/dataset/tulip/6091609734_cb3090bedd_c.jpg b/src/dataset/tulip/6091609734_cb3090bedd_c.jpg new file mode 100644 index 00000000..ae9233f1 Binary files /dev/null and b/src/dataset/tulip/6091609734_cb3090bedd_c.jpg differ diff --git a/src/dataset/tulip/6091612012_7db13664a5_c.jpg b/src/dataset/tulip/6091612012_7db13664a5_c.jpg new file mode 100644 index 00000000..a81c2b96 Binary files /dev/null and b/src/dataset/tulip/6091612012_7db13664a5_c.jpg differ diff --git a/src/dataset/tulip/6121650877_f0ae062f2d_c.jpg b/src/dataset/tulip/6121650877_f0ae062f2d_c.jpg new file mode 100644 index 00000000..a0feafac Binary files /dev/null and b/src/dataset/tulip/6121650877_f0ae062f2d_c.jpg differ diff --git a/src/dataset/tulip/6122191612_cbdbf38794_c.jpg b/src/dataset/tulip/6122191612_cbdbf38794_c.jpg new file mode 100644 index 00000000..32d68203 Binary files /dev/null and b/src/dataset/tulip/6122191612_cbdbf38794_c.jpg differ diff --git a/src/dataset/tulip/6122212172_ce1b9ff4a7_c.jpg b/src/dataset/tulip/6122212172_ce1b9ff4a7_c.jpg new file mode 100644 index 00000000..ac3f6bf3 Binary files /dev/null and b/src/dataset/tulip/6122212172_ce1b9ff4a7_c.jpg differ diff --git a/src/dataset/tulip/6150100642_9cef1ff0d0_c.jpg b/src/dataset/tulip/6150100642_9cef1ff0d0_c.jpg new file mode 100644 index 00000000..da6123df Binary files /dev/null and b/src/dataset/tulip/6150100642_9cef1ff0d0_c.jpg differ diff --git a/src/dataset/tulip/6150100648_8a800eae4b_c.jpg b/src/dataset/tulip/6150100648_8a800eae4b_c.jpg new file mode 100644 index 00000000..e2c126c7 Binary files /dev/null and b/src/dataset/tulip/6150100648_8a800eae4b_c.jpg differ diff --git a/src/dataset/tulip/6165355787_551ec7130f_c.jpg b/src/dataset/tulip/6165355787_551ec7130f_c.jpg new file mode 100644 index 00000000..26a0c8bd Binary files /dev/null and b/src/dataset/tulip/6165355787_551ec7130f_c.jpg differ diff --git a/src/dataset/tulip/6189273178_e1d8b4ce67_c.jpg b/src/dataset/tulip/6189273178_e1d8b4ce67_c.jpg new file mode 100644 index 00000000..9262875c Binary files /dev/null and b/src/dataset/tulip/6189273178_e1d8b4ce67_c.jpg differ diff --git a/src/dataset/tulip/6258188995_dd3698b382_c.jpg b/src/dataset/tulip/6258188995_dd3698b382_c.jpg new file mode 100644 index 00000000..ca0032cf Binary files /dev/null and b/src/dataset/tulip/6258188995_dd3698b382_c.jpg differ diff --git a/src/dataset/tulip/6258774996_b528a94cd4_c.jpg b/src/dataset/tulip/6258774996_b528a94cd4_c.jpg new file mode 100644 index 00000000..1346ebd4 Binary files /dev/null and b/src/dataset/tulip/6258774996_b528a94cd4_c.jpg differ diff --git a/src/dataset/tulip/6271748567_d82975fb95_c.jpg b/src/dataset/tulip/6271748567_d82975fb95_c.jpg new file mode 100644 index 00000000..52e53434 Binary files /dev/null and b/src/dataset/tulip/6271748567_d82975fb95_c.jpg differ diff --git a/src/dataset/tulip/6306277484_c0e2162540_c.jpg b/src/dataset/tulip/6306277484_c0e2162540_c.jpg new file mode 100644 index 00000000..43465e77 Binary files /dev/null and b/src/dataset/tulip/6306277484_c0e2162540_c.jpg differ diff --git a/src/dataset/tulip/6374718997_893b35e4c1_c.jpg b/src/dataset/tulip/6374718997_893b35e4c1_c.jpg new file mode 100644 index 00000000..ead908d4 Binary files /dev/null and b/src/dataset/tulip/6374718997_893b35e4c1_c.jpg differ diff --git a/src/dataset/tulip/6505524429_48864ee92d_c.jpg b/src/dataset/tulip/6505524429_48864ee92d_c.jpg new file mode 100644 index 00000000..79b9d125 Binary files /dev/null and b/src/dataset/tulip/6505524429_48864ee92d_c.jpg differ diff --git a/src/dataset/tulip/653688690_9953c551d0_c.jpg b/src/dataset/tulip/653688690_9953c551d0_c.jpg new file mode 100644 index 00000000..e348849b Binary files /dev/null and b/src/dataset/tulip/653688690_9953c551d0_c.jpg differ diff --git a/src/dataset/tulip/6641143485_2f8ebed2de_c.jpg b/src/dataset/tulip/6641143485_2f8ebed2de_c.jpg new file mode 100644 index 00000000..ef12f506 Binary files /dev/null and b/src/dataset/tulip/6641143485_2f8ebed2de_c.jpg differ diff --git a/src/dataset/tulip/6641456991_9d41f16851_c.jpg b/src/dataset/tulip/6641456991_9d41f16851_c.jpg new file mode 100644 index 00000000..bcdc3ac2 Binary files /dev/null and b/src/dataset/tulip/6641456991_9d41f16851_c.jpg differ diff --git a/src/dataset/tulip/6653745133_fb5eba9753_c.jpg b/src/dataset/tulip/6653745133_fb5eba9753_c.jpg new file mode 100644 index 00000000..0fb1442f Binary files /dev/null and b/src/dataset/tulip/6653745133_fb5eba9753_c.jpg differ diff --git a/src/dataset/tulip/6693882085_fa08e67e0c_c.jpg b/src/dataset/tulip/6693882085_fa08e67e0c_c.jpg new file mode 100644 index 00000000..d69a5196 Binary files /dev/null and b/src/dataset/tulip/6693882085_fa08e67e0c_c.jpg differ diff --git a/src/dataset/tulip/6707412081_b81aac399c_c.jpg b/src/dataset/tulip/6707412081_b81aac399c_c.jpg new file mode 100644 index 00000000..bec1636a Binary files /dev/null and b/src/dataset/tulip/6707412081_b81aac399c_c.jpg differ diff --git a/src/dataset/tulip/6793660853_d2eae0e94c_c.jpg b/src/dataset/tulip/6793660853_d2eae0e94c_c.jpg new file mode 100644 index 00000000..b821ff2b Binary files /dev/null and b/src/dataset/tulip/6793660853_d2eae0e94c_c.jpg differ diff --git a/src/dataset/tulip/6801325614_c73b9a1f7e_c.jpg b/src/dataset/tulip/6801325614_c73b9a1f7e_c.jpg new file mode 100644 index 00000000..7da645b6 Binary files /dev/null and b/src/dataset/tulip/6801325614_c73b9a1f7e_c.jpg differ diff --git a/src/dataset/tulip/6803062556_6b6f100975_c.jpg b/src/dataset/tulip/6803062556_6b6f100975_c.jpg new file mode 100644 index 00000000..f4941a76 Binary files /dev/null and b/src/dataset/tulip/6803062556_6b6f100975_c.jpg differ diff --git a/src/dataset/tulip/6822877094_7a36b955ef_c.jpg b/src/dataset/tulip/6822877094_7a36b955ef_c.jpg new file mode 100644 index 00000000..f844dab7 Binary files /dev/null and b/src/dataset/tulip/6822877094_7a36b955ef_c.jpg differ diff --git a/src/dataset/tulip/6830957862_f56f6f2e5b_c.jpg b/src/dataset/tulip/6830957862_f56f6f2e5b_c.jpg new file mode 100644 index 00000000..c9a2c619 Binary files /dev/null and b/src/dataset/tulip/6830957862_f56f6f2e5b_c.jpg differ diff --git a/src/dataset/tulip/6850747833_e5012ee4be_c.jpg b/src/dataset/tulip/6850747833_e5012ee4be_c.jpg new file mode 100644 index 00000000..18f3af81 Binary files /dev/null and b/src/dataset/tulip/6850747833_e5012ee4be_c.jpg differ diff --git a/src/dataset/tulip/6851671105_5eb9ab5f63_c.jpg b/src/dataset/tulip/6851671105_5eb9ab5f63_c.jpg new file mode 100644 index 00000000..a3f3a880 Binary files /dev/null and b/src/dataset/tulip/6851671105_5eb9ab5f63_c.jpg differ diff --git a/src/dataset/tulip/6851671321_4b371b43d9_c.jpg b/src/dataset/tulip/6851671321_4b371b43d9_c.jpg new file mode 100644 index 00000000..c883f98b Binary files /dev/null and b/src/dataset/tulip/6851671321_4b371b43d9_c.jpg differ diff --git a/src/dataset/tulip/6851671443_dce47694e1_c.jpg b/src/dataset/tulip/6851671443_dce47694e1_c.jpg new file mode 100644 index 00000000..2d16390b Binary files /dev/null and b/src/dataset/tulip/6851671443_dce47694e1_c.jpg differ diff --git a/src/dataset/tulip/6851672267_2e1b1c6a96_c.jpg b/src/dataset/tulip/6851672267_2e1b1c6a96_c.jpg new file mode 100644 index 00000000..cf33fe42 Binary files /dev/null and b/src/dataset/tulip/6851672267_2e1b1c6a96_c.jpg differ diff --git a/src/dataset/tulip/6879259432_ffe8fbc321_c.jpg b/src/dataset/tulip/6879259432_ffe8fbc321_c.jpg new file mode 100644 index 00000000..2fb705f8 Binary files /dev/null and b/src/dataset/tulip/6879259432_ffe8fbc321_c.jpg differ diff --git a/src/dataset/tulip/6892978682_cb58816647_c.jpg b/src/dataset/tulip/6892978682_cb58816647_c.jpg new file mode 100644 index 00000000..be3ed8bc Binary files /dev/null and b/src/dataset/tulip/6892978682_cb58816647_c.jpg differ diff --git a/src/dataset/tulip/6893743196_efae9cb96c_c.jpg b/src/dataset/tulip/6893743196_efae9cb96c_c.jpg new file mode 100644 index 00000000..846851a7 Binary files /dev/null and b/src/dataset/tulip/6893743196_efae9cb96c_c.jpg differ diff --git a/src/dataset/tulip/6897496334_8706b0b703_c.jpg b/src/dataset/tulip/6897496334_8706b0b703_c.jpg new file mode 100644 index 00000000..6f24482d Binary files /dev/null and b/src/dataset/tulip/6897496334_8706b0b703_c.jpg differ diff --git a/src/dataset/tulip/6899764606_e6c03f6eea_c.jpg b/src/dataset/tulip/6899764606_e6c03f6eea_c.jpg new file mode 100644 index 00000000..54618aa0 Binary files /dev/null and b/src/dataset/tulip/6899764606_e6c03f6eea_c.jpg differ diff --git a/src/dataset/tulip/6902095592_4264c28c0a_c.jpg b/src/dataset/tulip/6902095592_4264c28c0a_c.jpg new file mode 100644 index 00000000..720c53d8 Binary files /dev/null and b/src/dataset/tulip/6902095592_4264c28c0a_c.jpg differ diff --git a/src/dataset/tulip/6908894688_d42f49e82c_c.jpg b/src/dataset/tulip/6908894688_d42f49e82c_c.jpg new file mode 100644 index 00000000..5a127883 Binary files /dev/null and b/src/dataset/tulip/6908894688_d42f49e82c_c.jpg differ diff --git a/src/dataset/tulip/6912049674_72e7d0412f_c.jpg b/src/dataset/tulip/6912049674_72e7d0412f_c.jpg new file mode 100644 index 00000000..2c13a216 Binary files /dev/null and b/src/dataset/tulip/6912049674_72e7d0412f_c.jpg differ diff --git a/src/dataset/tulip/6928190250_3d30276301_c.jpg b/src/dataset/tulip/6928190250_3d30276301_c.jpg new file mode 100644 index 00000000..abfd9bd5 Binary files /dev/null and b/src/dataset/tulip/6928190250_3d30276301_c.jpg differ diff --git a/src/dataset/tulip/6930593386_eb3bfe832f_c.jpg b/src/dataset/tulip/6930593386_eb3bfe832f_c.jpg new file mode 100644 index 00000000..8c2312ab Binary files /dev/null and b/src/dataset/tulip/6930593386_eb3bfe832f_c.jpg differ diff --git a/src/dataset/tulip/6937116018_2c46ff5b10_c.jpg b/src/dataset/tulip/6937116018_2c46ff5b10_c.jpg new file mode 100644 index 00000000..bd922470 Binary files /dev/null and b/src/dataset/tulip/6937116018_2c46ff5b10_c.jpg differ diff --git a/src/dataset/tulip/6940574674_78bf91c8ec_c.jpg b/src/dataset/tulip/6940574674_78bf91c8ec_c.jpg new file mode 100644 index 00000000..3c311a41 Binary files /dev/null and b/src/dataset/tulip/6940574674_78bf91c8ec_c.jpg differ diff --git a/src/dataset/tulip/6942128138_5c5f2f1c1c_c.jpg b/src/dataset/tulip/6942128138_5c5f2f1c1c_c.jpg new file mode 100644 index 00000000..1dfcc60a Binary files /dev/null and b/src/dataset/tulip/6942128138_5c5f2f1c1c_c.jpg differ diff --git a/src/dataset/tulip/6946391500_5d4a90ed29_c.jpg b/src/dataset/tulip/6946391500_5d4a90ed29_c.jpg new file mode 100644 index 00000000..c0e36f53 Binary files /dev/null and b/src/dataset/tulip/6946391500_5d4a90ed29_c.jpg differ diff --git a/src/dataset/tulip/6955349268_9fe6f1484a_c.jpg b/src/dataset/tulip/6955349268_9fe6f1484a_c.jpg new file mode 100644 index 00000000..d9570c6e Binary files /dev/null and b/src/dataset/tulip/6955349268_9fe6f1484a_c.jpg differ diff --git a/src/dataset/tulip/6966733121_9a064e2a6d_c.jpg b/src/dataset/tulip/6966733121_9a064e2a6d_c.jpg new file mode 100644 index 00000000..4f446840 Binary files /dev/null and b/src/dataset/tulip/6966733121_9a064e2a6d_c.jpg differ diff --git a/src/dataset/tulip/6968254855_56fffa7deb_c.jpg b/src/dataset/tulip/6968254855_56fffa7deb_c.jpg new file mode 100644 index 00000000..e3a55070 Binary files /dev/null and b/src/dataset/tulip/6968254855_56fffa7deb_c.jpg differ diff --git a/src/dataset/tulip/6984777966_526b73703c_c.jpg b/src/dataset/tulip/6984777966_526b73703c_c.jpg new file mode 100644 index 00000000..ca6df620 Binary files /dev/null and b/src/dataset/tulip/6984777966_526b73703c_c.jpg differ diff --git a/src/dataset/tulip/6984778154_78e626981a_c.jpg b/src/dataset/tulip/6984778154_78e626981a_c.jpg new file mode 100644 index 00000000..d13fbeb6 Binary files /dev/null and b/src/dataset/tulip/6984778154_78e626981a_c.jpg differ diff --git a/src/dataset/tulip/6984778398_6253d66a89_c.jpg b/src/dataset/tulip/6984778398_6253d66a89_c.jpg new file mode 100644 index 00000000..143017eb Binary files /dev/null and b/src/dataset/tulip/6984778398_6253d66a89_c.jpg differ diff --git a/src/dataset/tulip/6998265558_0a0780a12c_c.jpg b/src/dataset/tulip/6998265558_0a0780a12c_c.jpg new file mode 100644 index 00000000..ba67db7b Binary files /dev/null and b/src/dataset/tulip/6998265558_0a0780a12c_c.jpg differ diff --git a/src/dataset/tulip/7010285305_50fc12c378_c.jpg b/src/dataset/tulip/7010285305_50fc12c378_c.jpg new file mode 100644 index 00000000..8592e66c Binary files /dev/null and b/src/dataset/tulip/7010285305_50fc12c378_c.jpg differ diff --git a/src/dataset/tulip/7017771985_ecf7bdba0f_c.jpg b/src/dataset/tulip/7017771985_ecf7bdba0f_c.jpg new file mode 100644 index 00000000..4617cba5 Binary files /dev/null and b/src/dataset/tulip/7017771985_ecf7bdba0f_c.jpg differ diff --git a/src/dataset/tulip/7022134665_262b822352_c.jpg b/src/dataset/tulip/7022134665_262b822352_c.jpg new file mode 100644 index 00000000..fc98be7b Binary files /dev/null and b/src/dataset/tulip/7022134665_262b822352_c.jpg differ diff --git a/src/dataset/tulip/7032702015_06f60a8f98_c.jpg b/src/dataset/tulip/7032702015_06f60a8f98_c.jpg new file mode 100644 index 00000000..c9f16535 Binary files /dev/null and b/src/dataset/tulip/7032702015_06f60a8f98_c.jpg differ diff --git a/src/dataset/tulip/7034620263_6c8a669b35_c.jpg b/src/dataset/tulip/7034620263_6c8a669b35_c.jpg new file mode 100644 index 00000000..52e3df77 Binary files /dev/null and b/src/dataset/tulip/7034620263_6c8a669b35_c.jpg differ diff --git a/src/dataset/tulip/7040098495_af7d650d2a_c.jpg b/src/dataset/tulip/7040098495_af7d650d2a_c.jpg new file mode 100644 index 00000000..b11dd69e Binary files /dev/null and b/src/dataset/tulip/7040098495_af7d650d2a_c.jpg differ diff --git a/src/dataset/tulip/7040581591_444cc6beb5_c.jpg b/src/dataset/tulip/7040581591_444cc6beb5_c.jpg new file mode 100644 index 00000000..31dd8894 Binary files /dev/null and b/src/dataset/tulip/7040581591_444cc6beb5_c.jpg differ diff --git a/src/dataset/tulip/7048185957_8148538335_c.jpg b/src/dataset/tulip/7048185957_8148538335_c.jpg new file mode 100644 index 00000000..4210b5d4 Binary files /dev/null and b/src/dataset/tulip/7048185957_8148538335_c.jpg differ diff --git a/src/dataset/tulip/7051845027_0f4880037d_c.jpg b/src/dataset/tulip/7051845027_0f4880037d_c.jpg new file mode 100644 index 00000000..8bc44155 Binary files /dev/null and b/src/dataset/tulip/7051845027_0f4880037d_c.jpg differ diff --git a/src/dataset/tulip/7074272363_1b038afb4f_c.jpg b/src/dataset/tulip/7074272363_1b038afb4f_c.jpg new file mode 100644 index 00000000..2599f6b0 Binary files /dev/null and b/src/dataset/tulip/7074272363_1b038afb4f_c.jpg differ diff --git a/src/dataset/tulip/7075686003_cb7fdabd06_c.jpg b/src/dataset/tulip/7075686003_cb7fdabd06_c.jpg new file mode 100644 index 00000000..db723a4e Binary files /dev/null and b/src/dataset/tulip/7075686003_cb7fdabd06_c.jpg differ diff --git a/src/dataset/tulip/7083191981_e390cc01ef_c.jpg b/src/dataset/tulip/7083191981_e390cc01ef_c.jpg new file mode 100644 index 00000000..00a0e0e2 Binary files /dev/null and b/src/dataset/tulip/7083191981_e390cc01ef_c.jpg differ diff --git a/src/dataset/tulip/7083192179_3457a28e5d_c.jpg b/src/dataset/tulip/7083192179_3457a28e5d_c.jpg new file mode 100644 index 00000000..53b0fbb9 Binary files /dev/null and b/src/dataset/tulip/7083192179_3457a28e5d_c.jpg differ diff --git a/src/dataset/tulip/7088393639_296d32a051_c.jpg b/src/dataset/tulip/7088393639_296d32a051_c.jpg new file mode 100644 index 00000000..944a8f92 Binary files /dev/null and b/src/dataset/tulip/7088393639_296d32a051_c.jpg differ diff --git a/src/dataset/tulip/7089761881_b27f270ae0_c.jpg b/src/dataset/tulip/7089761881_b27f270ae0_c.jpg new file mode 100644 index 00000000..792b92f5 Binary files /dev/null and b/src/dataset/tulip/7089761881_b27f270ae0_c.jpg differ diff --git a/src/dataset/tulip/7090733983_4bc50e60bc_c.jpg b/src/dataset/tulip/7090733983_4bc50e60bc_c.jpg new file mode 100644 index 00000000..96d29c38 Binary files /dev/null and b/src/dataset/tulip/7090733983_4bc50e60bc_c.jpg differ diff --git a/src/dataset/tulip/7091054823_f186c7b166_c.jpg b/src/dataset/tulip/7091054823_f186c7b166_c.jpg new file mode 100644 index 00000000..fafc7fb3 Binary files /dev/null and b/src/dataset/tulip/7091054823_f186c7b166_c.jpg differ diff --git a/src/dataset/tulip/7091143847_8751ce3f08_c.jpg b/src/dataset/tulip/7091143847_8751ce3f08_c.jpg new file mode 100644 index 00000000..4a3aed03 Binary files /dev/null and b/src/dataset/tulip/7091143847_8751ce3f08_c.jpg differ diff --git a/src/dataset/tulip/7092461475_5c9e178826_c.jpg b/src/dataset/tulip/7092461475_5c9e178826_c.jpg new file mode 100644 index 00000000..7e6e2789 Binary files /dev/null and b/src/dataset/tulip/7092461475_5c9e178826_c.jpg differ diff --git a/src/dataset/tulip/7092461707_c8dc774ae5_c.jpg b/src/dataset/tulip/7092461707_c8dc774ae5_c.jpg new file mode 100644 index 00000000..6d48e01f Binary files /dev/null and b/src/dataset/tulip/7092461707_c8dc774ae5_c.jpg differ diff --git a/src/dataset/tulip/7092835201_8165a141c8_c.jpg b/src/dataset/tulip/7092835201_8165a141c8_c.jpg new file mode 100644 index 00000000..cf103500 Binary files /dev/null and b/src/dataset/tulip/7092835201_8165a141c8_c.jpg differ diff --git a/src/dataset/tulip/7094642013_d2acd0ba5e_c.jpg b/src/dataset/tulip/7094642013_d2acd0ba5e_c.jpg new file mode 100644 index 00000000..3b6b8cc6 Binary files /dev/null and b/src/dataset/tulip/7094642013_d2acd0ba5e_c.jpg differ diff --git a/src/dataset/tulip/7101417673_82a3df9f19_c.jpg b/src/dataset/tulip/7101417673_82a3df9f19_c.jpg new file mode 100644 index 00000000..47918ae4 Binary files /dev/null and b/src/dataset/tulip/7101417673_82a3df9f19_c.jpg differ diff --git a/src/dataset/tulip/7110931121_3837dfc2d8_c.jpg b/src/dataset/tulip/7110931121_3837dfc2d8_c.jpg new file mode 100644 index 00000000..2c57780b Binary files /dev/null and b/src/dataset/tulip/7110931121_3837dfc2d8_c.jpg differ diff --git a/src/dataset/tulip/7117921587_fe22d35f10_c.jpg b/src/dataset/tulip/7117921587_fe22d35f10_c.jpg new file mode 100644 index 00000000..125f4c4b Binary files /dev/null and b/src/dataset/tulip/7117921587_fe22d35f10_c.jpg differ diff --git a/src/dataset/tulip/7117927925_dc4ff185d8_c.jpg b/src/dataset/tulip/7117927925_dc4ff185d8_c.jpg new file mode 100644 index 00000000..3b063587 Binary files /dev/null and b/src/dataset/tulip/7117927925_dc4ff185d8_c.jpg differ diff --git a/src/dataset/tulip/7123667105_46ae50f227_c.jpg b/src/dataset/tulip/7123667105_46ae50f227_c.jpg new file mode 100644 index 00000000..e6a9a33b Binary files /dev/null and b/src/dataset/tulip/7123667105_46ae50f227_c.jpg differ diff --git a/src/dataset/tulip/7126651139_501a305ea4_c.jpg b/src/dataset/tulip/7126651139_501a305ea4_c.jpg new file mode 100644 index 00000000..a696e6ae Binary files /dev/null and b/src/dataset/tulip/7126651139_501a305ea4_c.jpg differ diff --git a/src/dataset/tulip/7130862541_c21820d212_c.jpg b/src/dataset/tulip/7130862541_c21820d212_c.jpg new file mode 100644 index 00000000..7ef59bae Binary files /dev/null and b/src/dataset/tulip/7130862541_c21820d212_c.jpg differ diff --git a/src/dataset/tulip/7131956969_b7e866a1d8_c.jpg b/src/dataset/tulip/7131956969_b7e866a1d8_c.jpg new file mode 100644 index 00000000..f0f1e60e Binary files /dev/null and b/src/dataset/tulip/7131956969_b7e866a1d8_c.jpg differ diff --git a/src/dataset/tulip/7135848897_c632737e41_c.jpg b/src/dataset/tulip/7135848897_c632737e41_c.jpg new file mode 100644 index 00000000..eca89c51 Binary files /dev/null and b/src/dataset/tulip/7135848897_c632737e41_c.jpg differ diff --git a/src/dataset/tulip/7164990829_2ecce05d56_c.jpg b/src/dataset/tulip/7164990829_2ecce05d56_c.jpg new file mode 100644 index 00000000..49a43928 Binary files /dev/null and b/src/dataset/tulip/7164990829_2ecce05d56_c.jpg differ diff --git a/src/dataset/tulip/7176840340_b1a796cf76_c.jpg b/src/dataset/tulip/7176840340_b1a796cf76_c.jpg new file mode 100644 index 00000000..3c272a56 Binary files /dev/null and b/src/dataset/tulip/7176840340_b1a796cf76_c.jpg differ diff --git a/src/dataset/tulip/7184534458_a1bab8b6ff_c.jpg b/src/dataset/tulip/7184534458_a1bab8b6ff_c.jpg new file mode 100644 index 00000000..2edc53b8 Binary files /dev/null and b/src/dataset/tulip/7184534458_a1bab8b6ff_c.jpg differ diff --git a/src/dataset/tulip/7210798858_5fbac32536_c.jpg b/src/dataset/tulip/7210798858_5fbac32536_c.jpg new file mode 100644 index 00000000..217772a1 Binary files /dev/null and b/src/dataset/tulip/7210798858_5fbac32536_c.jpg differ diff --git a/src/dataset/tulip/7214591742_4b87e2a92e_c.jpg b/src/dataset/tulip/7214591742_4b87e2a92e_c.jpg new file mode 100644 index 00000000..b11ebc06 Binary files /dev/null and b/src/dataset/tulip/7214591742_4b87e2a92e_c.jpg differ diff --git a/src/dataset/tulip/7238901048_60c8688583_c.jpg b/src/dataset/tulip/7238901048_60c8688583_c.jpg new file mode 100644 index 00000000..0cb2f822 Binary files /dev/null and b/src/dataset/tulip/7238901048_60c8688583_c.jpg differ diff --git a/src/dataset/tulip/7241946234_87ce85be20_c.jpg b/src/dataset/tulip/7241946234_87ce85be20_c.jpg new file mode 100644 index 00000000..296d40b1 Binary files /dev/null and b/src/dataset/tulip/7241946234_87ce85be20_c.jpg differ diff --git a/src/dataset/tulip/7271976112_762dc2856f_c.jpg b/src/dataset/tulip/7271976112_762dc2856f_c.jpg new file mode 100644 index 00000000..ae314f85 Binary files /dev/null and b/src/dataset/tulip/7271976112_762dc2856f_c.jpg differ diff --git a/src/dataset/tulip/7272008546_3708a4ffd8_c.jpg b/src/dataset/tulip/7272008546_3708a4ffd8_c.jpg new file mode 100644 index 00000000..4fca4257 Binary files /dev/null and b/src/dataset/tulip/7272008546_3708a4ffd8_c.jpg differ diff --git a/src/dataset/tulip/7420999282_0188aa843b_c.jpg b/src/dataset/tulip/7420999282_0188aa843b_c.jpg new file mode 100644 index 00000000..8966288d Binary files /dev/null and b/src/dataset/tulip/7420999282_0188aa843b_c.jpg differ diff --git a/src/dataset/tulip/7454667_0da4ef4e35_c.jpg b/src/dataset/tulip/7454667_0da4ef4e35_c.jpg new file mode 100644 index 00000000..e1ceceb8 Binary files /dev/null and b/src/dataset/tulip/7454667_0da4ef4e35_c.jpg differ diff --git a/src/dataset/tulip/7454668_a55fa02419_c.jpg b/src/dataset/tulip/7454668_a55fa02419_c.jpg new file mode 100644 index 00000000..5ef21c4e Binary files /dev/null and b/src/dataset/tulip/7454668_a55fa02419_c.jpg differ diff --git a/src/dataset/tulip/7454669_e684750727_c.jpg b/src/dataset/tulip/7454669_e684750727_c.jpg new file mode 100644 index 00000000..1ff416af Binary files /dev/null and b/src/dataset/tulip/7454669_e684750727_c.jpg differ diff --git a/src/dataset/tulip/7455424_dd5160529f_c.jpg b/src/dataset/tulip/7455424_dd5160529f_c.jpg new file mode 100644 index 00000000..5f1279b7 Binary files /dev/null and b/src/dataset/tulip/7455424_dd5160529f_c.jpg differ diff --git a/src/dataset/tulip/7891305002_d8402b4dbe_c.jpg b/src/dataset/tulip/7891305002_d8402b4dbe_c.jpg new file mode 100644 index 00000000..3c477d66 Binary files /dev/null and b/src/dataset/tulip/7891305002_d8402b4dbe_c.jpg differ diff --git a/src/dataset/tulip/7969467690_b5c922a231_c.jpg b/src/dataset/tulip/7969467690_b5c922a231_c.jpg new file mode 100644 index 00000000..daf915d8 Binary files /dev/null and b/src/dataset/tulip/7969467690_b5c922a231_c.jpg differ diff --git a/src/dataset/tulip/8000671848_fbc0621dab_c.jpg b/src/dataset/tulip/8000671848_fbc0621dab_c.jpg new file mode 100644 index 00000000..c54d807f Binary files /dev/null and b/src/dataset/tulip/8000671848_fbc0621dab_c.jpg differ diff --git a/src/dataset/tulip/8026025022_6a526b6d79_c.jpg b/src/dataset/tulip/8026025022_6a526b6d79_c.jpg new file mode 100644 index 00000000..900ab2ec Binary files /dev/null and b/src/dataset/tulip/8026025022_6a526b6d79_c.jpg differ diff --git a/src/dataset/tulip/8174747266_b7a18910c1_c.jpg b/src/dataset/tulip/8174747266_b7a18910c1_c.jpg new file mode 100644 index 00000000..81e8211d Binary files /dev/null and b/src/dataset/tulip/8174747266_b7a18910c1_c.jpg differ diff --git a/src/dataset/tulip/8391790895_65da017376_c.jpg b/src/dataset/tulip/8391790895_65da017376_c.jpg new file mode 100644 index 00000000..6521f874 Binary files /dev/null and b/src/dataset/tulip/8391790895_65da017376_c.jpg differ diff --git a/src/dataset/tulip/8391950709_ec41a2358b_c.jpg b/src/dataset/tulip/8391950709_ec41a2358b_c.jpg new file mode 100644 index 00000000..47496b19 Binary files /dev/null and b/src/dataset/tulip/8391950709_ec41a2358b_c.jpg differ diff --git a/src/dataset/tulip/8393033526_79ba30fda2_c.jpg b/src/dataset/tulip/8393033526_79ba30fda2_c.jpg new file mode 100644 index 00000000..ed685229 Binary files /dev/null and b/src/dataset/tulip/8393033526_79ba30fda2_c.jpg differ diff --git a/src/dataset/tulip/8395066855_b869a39982_c.jpg b/src/dataset/tulip/8395066855_b869a39982_c.jpg new file mode 100644 index 00000000..e9a67bac Binary files /dev/null and b/src/dataset/tulip/8395066855_b869a39982_c.jpg differ diff --git a/src/dataset/tulip/84291874_e7a873a650_c.jpg b/src/dataset/tulip/84291874_e7a873a650_c.jpg new file mode 100644 index 00000000..26d77826 Binary files /dev/null and b/src/dataset/tulip/84291874_e7a873a650_c.jpg differ diff --git a/src/dataset/tulip/8468969058_74f616f920_c.jpg b/src/dataset/tulip/8468969058_74f616f920_c.jpg new file mode 100644 index 00000000..804ed947 Binary files /dev/null and b/src/dataset/tulip/8468969058_74f616f920_c.jpg differ diff --git a/src/dataset/tulip/8480457565_18d0098c0f_c.jpg b/src/dataset/tulip/8480457565_18d0098c0f_c.jpg new file mode 100644 index 00000000..e11cd772 Binary files /dev/null and b/src/dataset/tulip/8480457565_18d0098c0f_c.jpg differ diff --git a/src/dataset/tulip/8483127401_556c3d0ff2_c.jpg b/src/dataset/tulip/8483127401_556c3d0ff2_c.jpg new file mode 100644 index 00000000..a32411e1 Binary files /dev/null and b/src/dataset/tulip/8483127401_556c3d0ff2_c.jpg differ diff --git a/src/dataset/tulip/8517311176_357f91ee1c_c.jpg b/src/dataset/tulip/8517311176_357f91ee1c_c.jpg new file mode 100644 index 00000000..b0026003 Binary files /dev/null and b/src/dataset/tulip/8517311176_357f91ee1c_c.jpg differ diff --git a/src/dataset/tulip/8539268181_dbd4cc5bc8_c.jpg b/src/dataset/tulip/8539268181_dbd4cc5bc8_c.jpg new file mode 100644 index 00000000..c7baae78 Binary files /dev/null and b/src/dataset/tulip/8539268181_dbd4cc5bc8_c.jpg differ diff --git a/src/dataset/tulip/8561399157_2ff439cf32_c.jpg b/src/dataset/tulip/8561399157_2ff439cf32_c.jpg new file mode 100644 index 00000000..58631a73 Binary files /dev/null and b/src/dataset/tulip/8561399157_2ff439cf32_c.jpg differ diff --git a/src/dataset/tulip/85700059_dab8cbf21e_c.jpg b/src/dataset/tulip/85700059_dab8cbf21e_c.jpg new file mode 100644 index 00000000..2388ca6a Binary files /dev/null and b/src/dataset/tulip/85700059_dab8cbf21e_c.jpg differ diff --git a/src/dataset/tulip/8577427550_78884368e6_c.jpg b/src/dataset/tulip/8577427550_78884368e6_c.jpg new file mode 100644 index 00000000..b0db9dd5 Binary files /dev/null and b/src/dataset/tulip/8577427550_78884368e6_c.jpg differ diff --git a/src/dataset/tulip/8591674907_6fb71ee4ac_c.jpg b/src/dataset/tulip/8591674907_6fb71ee4ac_c.jpg new file mode 100644 index 00000000..e6207739 Binary files /dev/null and b/src/dataset/tulip/8591674907_6fb71ee4ac_c.jpg differ diff --git a/src/dataset/tulip/8617024262_9ea26fe535_c.jpg b/src/dataset/tulip/8617024262_9ea26fe535_c.jpg new file mode 100644 index 00000000..46599a8b Binary files /dev/null and b/src/dataset/tulip/8617024262_9ea26fe535_c.jpg differ diff --git a/src/dataset/tulip/8618601202_0e0577ee24_c.jpg b/src/dataset/tulip/8618601202_0e0577ee24_c.jpg new file mode 100644 index 00000000..641786bb Binary files /dev/null and b/src/dataset/tulip/8618601202_0e0577ee24_c.jpg differ diff --git a/src/dataset/tulip/8619649628_19cd33c5a3_c.jpg b/src/dataset/tulip/8619649628_19cd33c5a3_c.jpg new file mode 100644 index 00000000..8cf57108 Binary files /dev/null and b/src/dataset/tulip/8619649628_19cd33c5a3_c.jpg differ diff --git a/src/dataset/tulip/8620286401_f8ced1a9cf_c.jpg b/src/dataset/tulip/8620286401_f8ced1a9cf_c.jpg new file mode 100644 index 00000000..7f1374a9 Binary files /dev/null and b/src/dataset/tulip/8620286401_f8ced1a9cf_c.jpg differ diff --git a/src/dataset/tulip/8621381790_3fc2955f3b_c.jpg b/src/dataset/tulip/8621381790_3fc2955f3b_c.jpg new file mode 100644 index 00000000..4ca6fd43 Binary files /dev/null and b/src/dataset/tulip/8621381790_3fc2955f3b_c.jpg differ diff --git a/src/dataset/tulip/8624522483_0627c5af46_c.jpg b/src/dataset/tulip/8624522483_0627c5af46_c.jpg new file mode 100644 index 00000000..c436e6cc Binary files /dev/null and b/src/dataset/tulip/8624522483_0627c5af46_c.jpg differ diff --git a/src/dataset/tulip/8624663647_3c28c4b323_c.jpg b/src/dataset/tulip/8624663647_3c28c4b323_c.jpg new file mode 100644 index 00000000..0a615d55 Binary files /dev/null and b/src/dataset/tulip/8624663647_3c28c4b323_c.jpg differ diff --git a/src/dataset/tulip/8628286834_bb715b4870_c.jpg b/src/dataset/tulip/8628286834_bb715b4870_c.jpg new file mode 100644 index 00000000..a420f4d5 Binary files /dev/null and b/src/dataset/tulip/8628286834_bb715b4870_c.jpg differ diff --git a/src/dataset/tulip/8628290488_25c6ac2c2f_c.jpg b/src/dataset/tulip/8628290488_25c6ac2c2f_c.jpg new file mode 100644 index 00000000..c1788703 Binary files /dev/null and b/src/dataset/tulip/8628290488_25c6ac2c2f_c.jpg differ diff --git a/src/dataset/tulip/8629578793_76bb3685cd_c.jpg b/src/dataset/tulip/8629578793_76bb3685cd_c.jpg new file mode 100644 index 00000000..398f1504 Binary files /dev/null and b/src/dataset/tulip/8629578793_76bb3685cd_c.jpg differ diff --git a/src/dataset/tulip/8629578821_a9957148fa_c.jpg b/src/dataset/tulip/8629578821_a9957148fa_c.jpg new file mode 100644 index 00000000..99050543 Binary files /dev/null and b/src/dataset/tulip/8629578821_a9957148fa_c.jpg differ diff --git a/src/dataset/tulip/8632084103_70c3132d7b_c.jpg b/src/dataset/tulip/8632084103_70c3132d7b_c.jpg new file mode 100644 index 00000000..4937e4da Binary files /dev/null and b/src/dataset/tulip/8632084103_70c3132d7b_c.jpg differ diff --git a/src/dataset/tulip/8632155776_4538eedfbf_c.jpg b/src/dataset/tulip/8632155776_4538eedfbf_c.jpg new file mode 100644 index 00000000..4dce28d8 Binary files /dev/null and b/src/dataset/tulip/8632155776_4538eedfbf_c.jpg differ diff --git a/src/dataset/tulip/8637158469_725bf02b71_c.jpg b/src/dataset/tulip/8637158469_725bf02b71_c.jpg new file mode 100644 index 00000000..ef12f506 Binary files /dev/null and b/src/dataset/tulip/8637158469_725bf02b71_c.jpg differ diff --git a/src/dataset/tulip/8639565457_ea03372b7e_c.jpg b/src/dataset/tulip/8639565457_ea03372b7e_c.jpg new file mode 100644 index 00000000..ef12f506 Binary files /dev/null and b/src/dataset/tulip/8639565457_ea03372b7e_c.jpg differ diff --git a/src/dataset/tulip/8644461235_419a1fd12c_c.jpg b/src/dataset/tulip/8644461235_419a1fd12c_c.jpg new file mode 100644 index 00000000..fb03b1f6 Binary files /dev/null and b/src/dataset/tulip/8644461235_419a1fd12c_c.jpg differ diff --git a/src/dataset/tulip/8647361190_e647699a42_c.jpg b/src/dataset/tulip/8647361190_e647699a42_c.jpg new file mode 100644 index 00000000..b6c427d0 Binary files /dev/null and b/src/dataset/tulip/8647361190_e647699a42_c.jpg differ diff --git a/src/dataset/tulip/8648078282_0edec6376c_c.jpg b/src/dataset/tulip/8648078282_0edec6376c_c.jpg new file mode 100644 index 00000000..90e01652 Binary files /dev/null and b/src/dataset/tulip/8648078282_0edec6376c_c.jpg differ diff --git a/src/dataset/tulip/8648391817_a0c20a3f4a_c.jpg b/src/dataset/tulip/8648391817_a0c20a3f4a_c.jpg new file mode 100644 index 00000000..278b1d83 Binary files /dev/null and b/src/dataset/tulip/8648391817_a0c20a3f4a_c.jpg differ diff --git a/src/dataset/tulip/8648699963_0fd6642fa8_c.jpg b/src/dataset/tulip/8648699963_0fd6642fa8_c.jpg new file mode 100644 index 00000000..7200a6f8 Binary files /dev/null and b/src/dataset/tulip/8648699963_0fd6642fa8_c.jpg differ diff --git a/src/dataset/tulip/8648707565_5f3b232f5d_c.jpg b/src/dataset/tulip/8648707565_5f3b232f5d_c.jpg new file mode 100644 index 00000000..d4007cc4 Binary files /dev/null and b/src/dataset/tulip/8648707565_5f3b232f5d_c.jpg differ diff --git a/src/dataset/tulip/8648770537_7f6387209c_c.jpg b/src/dataset/tulip/8648770537_7f6387209c_c.jpg new file mode 100644 index 00000000..504a9051 Binary files /dev/null and b/src/dataset/tulip/8648770537_7f6387209c_c.jpg differ diff --git a/src/dataset/tulip/8649527122_abcca77ee5_c.jpg b/src/dataset/tulip/8649527122_abcca77ee5_c.jpg new file mode 100644 index 00000000..0da5a200 Binary files /dev/null and b/src/dataset/tulip/8649527122_abcca77ee5_c.jpg differ diff --git a/src/dataset/tulip/8651602330_b2e8c20051_c.jpg b/src/dataset/tulip/8651602330_b2e8c20051_c.jpg new file mode 100644 index 00000000..614f2166 Binary files /dev/null and b/src/dataset/tulip/8651602330_b2e8c20051_c.jpg differ diff --git a/src/dataset/tulip/8655935619_cbe65c2989_c.jpg b/src/dataset/tulip/8655935619_cbe65c2989_c.jpg new file mode 100644 index 00000000..4bc16385 Binary files /dev/null and b/src/dataset/tulip/8655935619_cbe65c2989_c.jpg differ diff --git a/src/dataset/tulip/8657268249_b34caceca2_c.jpg b/src/dataset/tulip/8657268249_b34caceca2_c.jpg new file mode 100644 index 00000000..1da2120d Binary files /dev/null and b/src/dataset/tulip/8657268249_b34caceca2_c.jpg differ diff --git a/src/dataset/tulip/8658349851_5339204321_c.jpg b/src/dataset/tulip/8658349851_5339204321_c.jpg new file mode 100644 index 00000000..95d8a5f7 Binary files /dev/null and b/src/dataset/tulip/8658349851_5339204321_c.jpg differ diff --git a/src/dataset/tulip/8658432789_6a95e57387_c.jpg b/src/dataset/tulip/8658432789_6a95e57387_c.jpg new file mode 100644 index 00000000..bc035607 Binary files /dev/null and b/src/dataset/tulip/8658432789_6a95e57387_c.jpg differ diff --git a/src/dataset/tulip/8659467160_527d5db636_c.jpg b/src/dataset/tulip/8659467160_527d5db636_c.jpg new file mode 100644 index 00000000..e84034d4 Binary files /dev/null and b/src/dataset/tulip/8659467160_527d5db636_c.jpg differ diff --git a/src/dataset/tulip/8660161405_0731570f34_c.jpg b/src/dataset/tulip/8660161405_0731570f34_c.jpg new file mode 100644 index 00000000..5588d53c Binary files /dev/null and b/src/dataset/tulip/8660161405_0731570f34_c.jpg differ diff --git a/src/dataset/tulip/8663256492_64422a81e2_c.jpg b/src/dataset/tulip/8663256492_64422a81e2_c.jpg new file mode 100644 index 00000000..31233809 Binary files /dev/null and b/src/dataset/tulip/8663256492_64422a81e2_c.jpg differ diff --git a/src/dataset/tulip/8666558936_39f15e231b_c.jpg b/src/dataset/tulip/8666558936_39f15e231b_c.jpg new file mode 100644 index 00000000..2ae69a3a Binary files /dev/null and b/src/dataset/tulip/8666558936_39f15e231b_c.jpg differ diff --git a/src/dataset/tulip/8680140578_0fe2422db4_c.jpg b/src/dataset/tulip/8680140578_0fe2422db4_c.jpg new file mode 100644 index 00000000..65266d51 Binary files /dev/null and b/src/dataset/tulip/8680140578_0fe2422db4_c.jpg differ diff --git a/src/dataset/tulip/8680991654_08ed81ac39_c.jpg b/src/dataset/tulip/8680991654_08ed81ac39_c.jpg new file mode 100644 index 00000000..995d2137 Binary files /dev/null and b/src/dataset/tulip/8680991654_08ed81ac39_c.jpg differ diff --git a/src/dataset/tulip/8681098931_39af81f2bd_c.jpg b/src/dataset/tulip/8681098931_39af81f2bd_c.jpg new file mode 100644 index 00000000..b8b5ecde Binary files /dev/null and b/src/dataset/tulip/8681098931_39af81f2bd_c.jpg differ diff --git a/src/dataset/tulip/8685013914_c0027d03d9_c.jpg b/src/dataset/tulip/8685013914_c0027d03d9_c.jpg new file mode 100644 index 00000000..cd111e66 Binary files /dev/null and b/src/dataset/tulip/8685013914_c0027d03d9_c.jpg differ diff --git a/src/dataset/tulip/8691174034_d209951e7c_c.jpg b/src/dataset/tulip/8691174034_d209951e7c_c.jpg new file mode 100644 index 00000000..1da9aceb Binary files /dev/null and b/src/dataset/tulip/8691174034_d209951e7c_c.jpg differ diff --git a/src/dataset/tulip/8694339441_d418bea5dc_c.jpg b/src/dataset/tulip/8694339441_d418bea5dc_c.jpg new file mode 100644 index 00000000..2353d679 Binary files /dev/null and b/src/dataset/tulip/8694339441_d418bea5dc_c.jpg differ diff --git a/src/dataset/tulip/8695459694_9212033522_c.jpg b/src/dataset/tulip/8695459694_9212033522_c.jpg new file mode 100644 index 00000000..73f86cbf Binary files /dev/null and b/src/dataset/tulip/8695459694_9212033522_c.jpg differ diff --git a/src/dataset/tulip/8697784345_e75913d220_c.jpg b/src/dataset/tulip/8697784345_e75913d220_c.jpg new file mode 100644 index 00000000..9aae211c Binary files /dev/null and b/src/dataset/tulip/8697784345_e75913d220_c.jpg differ diff --git a/src/dataset/tulip/8698646950_5778f3f8a2_c.jpg b/src/dataset/tulip/8698646950_5778f3f8a2_c.jpg new file mode 100644 index 00000000..960bb9dc Binary files /dev/null and b/src/dataset/tulip/8698646950_5778f3f8a2_c.jpg differ diff --git a/src/dataset/tulip/8708215299_accb25fff9_c.jpg b/src/dataset/tulip/8708215299_accb25fff9_c.jpg new file mode 100644 index 00000000..c3d7358a Binary files /dev/null and b/src/dataset/tulip/8708215299_accb25fff9_c.jpg differ diff --git a/src/dataset/tulip/8708215419_1c91fd40d7_c.jpg b/src/dataset/tulip/8708215419_1c91fd40d7_c.jpg new file mode 100644 index 00000000..817f8d26 Binary files /dev/null and b/src/dataset/tulip/8708215419_1c91fd40d7_c.jpg differ diff --git a/src/dataset/tulip/8714198602_cd478c535a_c.jpg b/src/dataset/tulip/8714198602_cd478c535a_c.jpg new file mode 100644 index 00000000..f3374960 Binary files /dev/null and b/src/dataset/tulip/8714198602_cd478c535a_c.jpg differ diff --git a/src/dataset/tulip/8714214732_97d7793acc_c.jpg b/src/dataset/tulip/8714214732_97d7793acc_c.jpg new file mode 100644 index 00000000..3b78de19 Binary files /dev/null and b/src/dataset/tulip/8714214732_97d7793acc_c.jpg differ diff --git a/src/dataset/tulip/8718228585_1e910645ff_c.jpg b/src/dataset/tulip/8718228585_1e910645ff_c.jpg new file mode 100644 index 00000000..52e66402 Binary files /dev/null and b/src/dataset/tulip/8718228585_1e910645ff_c.jpg differ diff --git a/src/dataset/tulip/8723863372_e45035803b_c.jpg b/src/dataset/tulip/8723863372_e45035803b_c.jpg new file mode 100644 index 00000000..616978e1 Binary files /dev/null and b/src/dataset/tulip/8723863372_e45035803b_c.jpg differ diff --git a/src/dataset/tulip/8725778973_a12ed323c5_c.jpg b/src/dataset/tulip/8725778973_a12ed323c5_c.jpg new file mode 100644 index 00000000..4916324e Binary files /dev/null and b/src/dataset/tulip/8725778973_a12ed323c5_c.jpg differ diff --git a/src/dataset/tulip/8731450512_5d62a43243_c.jpg b/src/dataset/tulip/8731450512_5d62a43243_c.jpg new file mode 100644 index 00000000..b03f3345 Binary files /dev/null and b/src/dataset/tulip/8731450512_5d62a43243_c.jpg differ diff --git a/src/dataset/tulip/8734875833_e2547e9db3_c.jpg b/src/dataset/tulip/8734875833_e2547e9db3_c.jpg new file mode 100644 index 00000000..bb7e4732 Binary files /dev/null and b/src/dataset/tulip/8734875833_e2547e9db3_c.jpg differ diff --git a/src/dataset/tulip/8736486895_eae31fb07c_c.jpg b/src/dataset/tulip/8736486895_eae31fb07c_c.jpg new file mode 100644 index 00000000..6413d284 Binary files /dev/null and b/src/dataset/tulip/8736486895_eae31fb07c_c.jpg differ diff --git a/src/dataset/tulip/8738207517_686ff1000f_c.jpg b/src/dataset/tulip/8738207517_686ff1000f_c.jpg new file mode 100644 index 00000000..22da88f8 Binary files /dev/null and b/src/dataset/tulip/8738207517_686ff1000f_c.jpg differ diff --git a/src/dataset/tulip/8738207541_59880d2791_c.jpg b/src/dataset/tulip/8738207541_59880d2791_c.jpg new file mode 100644 index 00000000..d3feed3a Binary files /dev/null and b/src/dataset/tulip/8738207541_59880d2791_c.jpg differ diff --git a/src/dataset/tulip/8738207559_d977f0e85d_c.jpg b/src/dataset/tulip/8738207559_d977f0e85d_c.jpg new file mode 100644 index 00000000..cb163919 Binary files /dev/null and b/src/dataset/tulip/8738207559_d977f0e85d_c.jpg differ diff --git a/src/dataset/tulip/8738207579_c115cc0b06_c.jpg b/src/dataset/tulip/8738207579_c115cc0b06_c.jpg new file mode 100644 index 00000000..f136f932 Binary files /dev/null and b/src/dataset/tulip/8738207579_c115cc0b06_c.jpg differ diff --git a/src/dataset/tulip/8738207713_37a911cd0d_c.jpg b/src/dataset/tulip/8738207713_37a911cd0d_c.jpg new file mode 100644 index 00000000..deebcbd8 Binary files /dev/null and b/src/dataset/tulip/8738207713_37a911cd0d_c.jpg differ diff --git a/src/dataset/tulip/8739327284_9752117d71_c.jpg b/src/dataset/tulip/8739327284_9752117d71_c.jpg new file mode 100644 index 00000000..864bbabe Binary files /dev/null and b/src/dataset/tulip/8739327284_9752117d71_c.jpg differ diff --git a/src/dataset/tulip/8739327296_fd7c1d8c26_c.jpg b/src/dataset/tulip/8739327296_fd7c1d8c26_c.jpg new file mode 100644 index 00000000..85f33b12 Binary files /dev/null and b/src/dataset/tulip/8739327296_fd7c1d8c26_c.jpg differ diff --git a/src/dataset/tulip/8739327324_6f49923ab9_c.jpg b/src/dataset/tulip/8739327324_6f49923ab9_c.jpg new file mode 100644 index 00000000..c74fcda1 Binary files /dev/null and b/src/dataset/tulip/8739327324_6f49923ab9_c.jpg differ diff --git a/src/dataset/tulip/8739327374_b5ea2ddfce_c.jpg b/src/dataset/tulip/8739327374_b5ea2ddfce_c.jpg new file mode 100644 index 00000000..a6b79ffd Binary files /dev/null and b/src/dataset/tulip/8739327374_b5ea2ddfce_c.jpg differ diff --git a/src/dataset/tulip/8746063451_2ef7cd07b2_c.jpg b/src/dataset/tulip/8746063451_2ef7cd07b2_c.jpg new file mode 100644 index 00000000..cda1c212 Binary files /dev/null and b/src/dataset/tulip/8746063451_2ef7cd07b2_c.jpg differ diff --git a/src/dataset/tulip/8750998453_bc0621a305_c.jpg b/src/dataset/tulip/8750998453_bc0621a305_c.jpg new file mode 100644 index 00000000..5db2875b Binary files /dev/null and b/src/dataset/tulip/8750998453_bc0621a305_c.jpg differ diff --git a/src/dataset/tulip/8752120454_897392919e_c.jpg b/src/dataset/tulip/8752120454_897392919e_c.jpg new file mode 100644 index 00000000..e406ae4c Binary files /dev/null and b/src/dataset/tulip/8752120454_897392919e_c.jpg differ diff --git a/src/dataset/tulip/8772916588_0ebe7447ed_c.jpg b/src/dataset/tulip/8772916588_0ebe7447ed_c.jpg new file mode 100644 index 00000000..96f84be7 Binary files /dev/null and b/src/dataset/tulip/8772916588_0ebe7447ed_c.jpg differ diff --git a/src/dataset/tulip/8774823470_b1d63b955a_c.jpg b/src/dataset/tulip/8774823470_b1d63b955a_c.jpg new file mode 100644 index 00000000..39bfe29a Binary files /dev/null and b/src/dataset/tulip/8774823470_b1d63b955a_c.jpg differ diff --git a/src/dataset/tulip/8805715073_a854fd7e67_c.jpg b/src/dataset/tulip/8805715073_a854fd7e67_c.jpg new file mode 100644 index 00000000..c53d3355 Binary files /dev/null and b/src/dataset/tulip/8805715073_a854fd7e67_c.jpg differ diff --git a/src/dataset/tulip/8850735319_674610bb0f_c.jpg b/src/dataset/tulip/8850735319_674610bb0f_c.jpg new file mode 100644 index 00000000..cdf9f7fd Binary files /dev/null and b/src/dataset/tulip/8850735319_674610bb0f_c.jpg differ diff --git a/src/dataset/tulip/8916896927_21696fae72_c.jpg b/src/dataset/tulip/8916896927_21696fae72_c.jpg new file mode 100644 index 00000000..d7c9cfe6 Binary files /dev/null and b/src/dataset/tulip/8916896927_21696fae72_c.jpg differ diff --git a/src/dataset/tulip/8947972927_b20a723a9e_c.jpg b/src/dataset/tulip/8947972927_b20a723a9e_c.jpg new file mode 100644 index 00000000..f8292b34 Binary files /dev/null and b/src/dataset/tulip/8947972927_b20a723a9e_c.jpg differ diff --git a/src/dataset/tulip/8999773576_793e694972_c.jpg b/src/dataset/tulip/8999773576_793e694972_c.jpg new file mode 100644 index 00000000..a0ba7f93 Binary files /dev/null and b/src/dataset/tulip/8999773576_793e694972_c.jpg differ diff --git a/src/dataset/tulip/9007029_09910fc69b_c.jpg b/src/dataset/tulip/9007029_09910fc69b_c.jpg new file mode 100644 index 00000000..e5643fad Binary files /dev/null and b/src/dataset/tulip/9007029_09910fc69b_c.jpg differ diff --git a/src/dataset/tulip/9017992_2e180ff8be_c.jpg b/src/dataset/tulip/9017992_2e180ff8be_c.jpg new file mode 100644 index 00000000..4c544fbf Binary files /dev/null and b/src/dataset/tulip/9017992_2e180ff8be_c.jpg differ diff --git a/src/dataset/tulip/9070860996_5ba45ba2e0_c.jpg b/src/dataset/tulip/9070860996_5ba45ba2e0_c.jpg new file mode 100644 index 00000000..db5bd6df Binary files /dev/null and b/src/dataset/tulip/9070860996_5ba45ba2e0_c.jpg differ diff --git a/src/dataset/tulip/9080296693_14e64ace98_c.jpg b/src/dataset/tulip/9080296693_14e64ace98_c.jpg new file mode 100644 index 00000000..ae4aa108 Binary files /dev/null and b/src/dataset/tulip/9080296693_14e64ace98_c.jpg differ diff --git a/src/dataset/tulip/9116278267_f6ae158085_c.jpg b/src/dataset/tulip/9116278267_f6ae158085_c.jpg new file mode 100644 index 00000000..619ab9b4 Binary files /dev/null and b/src/dataset/tulip/9116278267_f6ae158085_c.jpg differ diff --git a/src/dataset/tulip/9138194745_a22d0f4520_c.jpg b/src/dataset/tulip/9138194745_a22d0f4520_c.jpg new file mode 100644 index 00000000..13f3aebf Binary files /dev/null and b/src/dataset/tulip/9138194745_a22d0f4520_c.jpg differ diff --git a/src/dataset/tulip/9140422964_674d0cbbaf_c.jpg b/src/dataset/tulip/9140422964_674d0cbbaf_c.jpg new file mode 100644 index 00000000..9f76ac43 Binary files /dev/null and b/src/dataset/tulip/9140422964_674d0cbbaf_c.jpg differ diff --git a/src/dataset/tulip/9215073463_71b3fd3bb3_c.jpg b/src/dataset/tulip/9215073463_71b3fd3bb3_c.jpg new file mode 100644 index 00000000..a9a6d636 Binary files /dev/null and b/src/dataset/tulip/9215073463_71b3fd3bb3_c.jpg differ diff --git a/src/dataset/tulip/9243977356_ba6521aafb_c.jpg b/src/dataset/tulip/9243977356_ba6521aafb_c.jpg new file mode 100644 index 00000000..cb4f3222 Binary files /dev/null and b/src/dataset/tulip/9243977356_ba6521aafb_c.jpg differ diff --git a/src/dataset/tulip/928566789_f5664b597d_c.jpg b/src/dataset/tulip/928566789_f5664b597d_c.jpg new file mode 100644 index 00000000..117cd6fe Binary files /dev/null and b/src/dataset/tulip/928566789_f5664b597d_c.jpg differ diff --git a/src/dataset/tulip/9380817325_5d43163b8f_c.jpg b/src/dataset/tulip/9380817325_5d43163b8f_c.jpg new file mode 100644 index 00000000..c2a4fdc8 Binary files /dev/null and b/src/dataset/tulip/9380817325_5d43163b8f_c.jpg differ diff --git a/src/dataset/tulip/94192080_bfbf9f128c_c.jpg b/src/dataset/tulip/94192080_bfbf9f128c_c.jpg new file mode 100644 index 00000000..69f5d0ec Binary files /dev/null and b/src/dataset/tulip/94192080_bfbf9f128c_c.jpg differ diff --git a/src/dataset/tulip/9719846469_f964888bfa_c.jpg b/src/dataset/tulip/9719846469_f964888bfa_c.jpg new file mode 100644 index 00000000..176b2f04 Binary files /dev/null and b/src/dataset/tulip/9719846469_f964888bfa_c.jpg differ diff --git a/src/dataset/tulip/974527167_ce61c3fb3b_c.jpg b/src/dataset/tulip/974527167_ce61c3fb3b_c.jpg new file mode 100644 index 00000000..f3401dac Binary files /dev/null and b/src/dataset/tulip/974527167_ce61c3fb3b_c.jpg differ diff --git a/src/dataset/tulip/974534965_08abc80943_c.jpg b/src/dataset/tulip/974534965_08abc80943_c.jpg new file mode 100644 index 00000000..31ca78e2 Binary files /dev/null and b/src/dataset/tulip/974534965_08abc80943_c.jpg differ diff --git a/src/dataset/tulip/975379298_605e63a43f_c.jpg b/src/dataset/tulip/975379298_605e63a43f_c.jpg new file mode 100644 index 00000000..5a3c1288 Binary files /dev/null and b/src/dataset/tulip/975379298_605e63a43f_c.jpg differ diff --git a/src/dataset/tulip/9777619034_220396ac1e_c.jpg b/src/dataset/tulip/9777619034_220396ac1e_c.jpg new file mode 100644 index 00000000..3b1ddadb Binary files /dev/null and b/src/dataset/tulip/9777619034_220396ac1e_c.jpg differ diff --git a/src/dataset/tulip/98310385_9d882eff74_c.jpg b/src/dataset/tulip/98310385_9d882eff74_c.jpg new file mode 100644 index 00000000..c541e307 Binary files /dev/null and b/src/dataset/tulip/98310385_9d882eff74_c.jpg differ diff --git a/src/dataset/water_lily/10287165674_91f5f05317_c.jpg b/src/dataset/water_lily/10287165674_91f5f05317_c.jpg new file mode 100644 index 00000000..29219717 Binary files /dev/null and b/src/dataset/water_lily/10287165674_91f5f05317_c.jpg differ diff --git a/src/dataset/water_lily/10671001584_870210e89e_c.jpg b/src/dataset/water_lily/10671001584_870210e89e_c.jpg new file mode 100644 index 00000000..cb73bb12 Binary files /dev/null and b/src/dataset/water_lily/10671001584_870210e89e_c.jpg differ diff --git a/src/dataset/water_lily/12357315064_e5d6b5216c_c.jpg b/src/dataset/water_lily/12357315064_e5d6b5216c_c.jpg new file mode 100644 index 00000000..a0d16e65 Binary files /dev/null and b/src/dataset/water_lily/12357315064_e5d6b5216c_c.jpg differ diff --git a/src/dataset/water_lily/12950427094_9d6d452b20_c.jpg b/src/dataset/water_lily/12950427094_9d6d452b20_c.jpg new file mode 100644 index 00000000..c5ed3751 Binary files /dev/null and b/src/dataset/water_lily/12950427094_9d6d452b20_c.jpg differ diff --git a/src/dataset/water_lily/13076859873_b07bf5dd55_c.jpg b/src/dataset/water_lily/13076859873_b07bf5dd55_c.jpg new file mode 100644 index 00000000..d64c37b6 Binary files /dev/null and b/src/dataset/water_lily/13076859873_b07bf5dd55_c.jpg differ diff --git a/src/dataset/water_lily/13399993013_9a7a2c37fc_c.jpg b/src/dataset/water_lily/13399993013_9a7a2c37fc_c.jpg new file mode 100644 index 00000000..1a9ca83c Binary files /dev/null and b/src/dataset/water_lily/13399993013_9a7a2c37fc_c.jpg differ diff --git a/src/dataset/water_lily/13717426085_658430a18e_c.jpg b/src/dataset/water_lily/13717426085_658430a18e_c.jpg new file mode 100644 index 00000000..e3bc21a6 Binary files /dev/null and b/src/dataset/water_lily/13717426085_658430a18e_c.jpg differ diff --git a/src/dataset/water_lily/13758802195_7f4a222023_c.jpg b/src/dataset/water_lily/13758802195_7f4a222023_c.jpg new file mode 100644 index 00000000..0313b72a Binary files /dev/null and b/src/dataset/water_lily/13758802195_7f4a222023_c.jpg differ diff --git a/src/dataset/water_lily/14332007793_2565441ee9_c.jpg b/src/dataset/water_lily/14332007793_2565441ee9_c.jpg new file mode 100644 index 00000000..e850ce38 Binary files /dev/null and b/src/dataset/water_lily/14332007793_2565441ee9_c.jpg differ diff --git a/src/dataset/water_lily/14391524589_09205c4469_c.jpg b/src/dataset/water_lily/14391524589_09205c4469_c.jpg new file mode 100644 index 00000000..80debf76 Binary files /dev/null and b/src/dataset/water_lily/14391524589_09205c4469_c.jpg differ diff --git a/src/dataset/water_lily/14402752721_610137c614_c.jpg b/src/dataset/water_lily/14402752721_610137c614_c.jpg new file mode 100644 index 00000000..5ac888fd Binary files /dev/null and b/src/dataset/water_lily/14402752721_610137c614_c.jpg differ diff --git a/src/dataset/water_lily/14422203084_ce7408aeb4_c.jpg b/src/dataset/water_lily/14422203084_ce7408aeb4_c.jpg new file mode 100644 index 00000000..4a9fcee6 Binary files /dev/null and b/src/dataset/water_lily/14422203084_ce7408aeb4_c.jpg differ diff --git a/src/dataset/water_lily/14423119208_e1c07b75f1_c.jpg b/src/dataset/water_lily/14423119208_e1c07b75f1_c.jpg new file mode 100644 index 00000000..fc6e5071 Binary files /dev/null and b/src/dataset/water_lily/14423119208_e1c07b75f1_c.jpg differ diff --git a/src/dataset/water_lily/14560858441_2440ec84c5_c.jpg b/src/dataset/water_lily/14560858441_2440ec84c5_c.jpg new file mode 100644 index 00000000..97fc1f0a Binary files /dev/null and b/src/dataset/water_lily/14560858441_2440ec84c5_c.jpg differ diff --git a/src/dataset/water_lily/14626496123_0fddc49563_c.jpg b/src/dataset/water_lily/14626496123_0fddc49563_c.jpg new file mode 100644 index 00000000..dc58e37c Binary files /dev/null and b/src/dataset/water_lily/14626496123_0fddc49563_c.jpg differ diff --git a/src/dataset/water_lily/14640181869_4039fce87a_c.jpg b/src/dataset/water_lily/14640181869_4039fce87a_c.jpg new file mode 100644 index 00000000..9ff5d407 Binary files /dev/null and b/src/dataset/water_lily/14640181869_4039fce87a_c.jpg differ diff --git a/src/dataset/water_lily/14731235837_d5ab151f93_c.jpg b/src/dataset/water_lily/14731235837_d5ab151f93_c.jpg new file mode 100644 index 00000000..890ba46e Binary files /dev/null and b/src/dataset/water_lily/14731235837_d5ab151f93_c.jpg differ diff --git a/src/dataset/water_lily/14731824968_d6845cc3d9_c.jpg b/src/dataset/water_lily/14731824968_d6845cc3d9_c.jpg new file mode 100644 index 00000000..413a5c0c Binary files /dev/null and b/src/dataset/water_lily/14731824968_d6845cc3d9_c.jpg differ diff --git a/src/dataset/water_lily/14736892537_11e3ebb94f_c.jpg b/src/dataset/water_lily/14736892537_11e3ebb94f_c.jpg new file mode 100644 index 00000000..06238a35 Binary files /dev/null and b/src/dataset/water_lily/14736892537_11e3ebb94f_c.jpg differ diff --git a/src/dataset/water_lily/14739829837_3b98b5f326_c.jpg b/src/dataset/water_lily/14739829837_3b98b5f326_c.jpg new file mode 100644 index 00000000..aecc3825 Binary files /dev/null and b/src/dataset/water_lily/14739829837_3b98b5f326_c.jpg differ diff --git a/src/dataset/water_lily/14800415418_a32dc140fe_c.jpg b/src/dataset/water_lily/14800415418_a32dc140fe_c.jpg new file mode 100644 index 00000000..1bb1cdc2 Binary files /dev/null and b/src/dataset/water_lily/14800415418_a32dc140fe_c.jpg differ diff --git a/src/dataset/water_lily/14911419152_1138bd1724_c.jpg b/src/dataset/water_lily/14911419152_1138bd1724_c.jpg new file mode 100644 index 00000000..adad9d63 Binary files /dev/null and b/src/dataset/water_lily/14911419152_1138bd1724_c.jpg differ diff --git a/src/dataset/water_lily/14933945383_ff20b1f1f8_c.jpg b/src/dataset/water_lily/14933945383_ff20b1f1f8_c.jpg new file mode 100644 index 00000000..2087cbf9 Binary files /dev/null and b/src/dataset/water_lily/14933945383_ff20b1f1f8_c.jpg differ diff --git a/src/dataset/water_lily/14936975475_70f67b6c3f_c.jpg b/src/dataset/water_lily/14936975475_70f67b6c3f_c.jpg new file mode 100644 index 00000000..0299eb22 Binary files /dev/null and b/src/dataset/water_lily/14936975475_70f67b6c3f_c.jpg differ diff --git a/src/dataset/water_lily/14948206667_53d275a1c8_c.jpg b/src/dataset/water_lily/14948206667_53d275a1c8_c.jpg new file mode 100644 index 00000000..c99ac4e4 Binary files /dev/null and b/src/dataset/water_lily/14948206667_53d275a1c8_c.jpg differ diff --git a/src/dataset/water_lily/14963539571_fac79110c6_c.jpg b/src/dataset/water_lily/14963539571_fac79110c6_c.jpg new file mode 100644 index 00000000..b6d78110 Binary files /dev/null and b/src/dataset/water_lily/14963539571_fac79110c6_c.jpg differ diff --git a/src/dataset/water_lily/14973939731_a71af7c133_c.jpg b/src/dataset/water_lily/14973939731_a71af7c133_c.jpg new file mode 100644 index 00000000..65b1755d Binary files /dev/null and b/src/dataset/water_lily/14973939731_a71af7c133_c.jpg differ diff --git a/src/dataset/water_lily/14995594331_157aa25987_c.jpg b/src/dataset/water_lily/14995594331_157aa25987_c.jpg new file mode 100644 index 00000000..5e2a03f3 Binary files /dev/null and b/src/dataset/water_lily/14995594331_157aa25987_c.jpg differ diff --git a/src/dataset/water_lily/15072889691_483624bcdb_c.jpg b/src/dataset/water_lily/15072889691_483624bcdb_c.jpg new file mode 100644 index 00000000..0e898bb7 Binary files /dev/null and b/src/dataset/water_lily/15072889691_483624bcdb_c.jpg differ diff --git a/src/dataset/water_lily/15129320988_0033487194_c.jpg b/src/dataset/water_lily/15129320988_0033487194_c.jpg new file mode 100644 index 00000000..4de290ee Binary files /dev/null and b/src/dataset/water_lily/15129320988_0033487194_c.jpg differ diff --git a/src/dataset/water_lily/15300153321_09053b3862_c.jpg b/src/dataset/water_lily/15300153321_09053b3862_c.jpg new file mode 100644 index 00000000..3dc2defa Binary files /dev/null and b/src/dataset/water_lily/15300153321_09053b3862_c.jpg differ diff --git a/src/dataset/water_lily/153099944_62dad1ed58_c.jpg b/src/dataset/water_lily/153099944_62dad1ed58_c.jpg new file mode 100644 index 00000000..8336c8d5 Binary files /dev/null and b/src/dataset/water_lily/153099944_62dad1ed58_c.jpg differ diff --git a/src/dataset/water_lily/15313562241_ce0b9806c6_c.jpg b/src/dataset/water_lily/15313562241_ce0b9806c6_c.jpg new file mode 100644 index 00000000..7ea500ad Binary files /dev/null and b/src/dataset/water_lily/15313562241_ce0b9806c6_c.jpg differ diff --git a/src/dataset/water_lily/15329039410_ebb90c90f3_c.jpg b/src/dataset/water_lily/15329039410_ebb90c90f3_c.jpg new file mode 100644 index 00000000..19df5676 Binary files /dev/null and b/src/dataset/water_lily/15329039410_ebb90c90f3_c.jpg differ diff --git a/src/dataset/water_lily/15367983108_041836031a_c.jpg b/src/dataset/water_lily/15367983108_041836031a_c.jpg new file mode 100644 index 00000000..43dcb909 Binary files /dev/null and b/src/dataset/water_lily/15367983108_041836031a_c.jpg differ diff --git a/src/dataset/water_lily/15436028147_a62a187c2c_c.jpg b/src/dataset/water_lily/15436028147_a62a187c2c_c.jpg new file mode 100644 index 00000000..f4ad21b7 Binary files /dev/null and b/src/dataset/water_lily/15436028147_a62a187c2c_c.jpg differ diff --git a/src/dataset/water_lily/15591065106_4d2b462798_c.jpg b/src/dataset/water_lily/15591065106_4d2b462798_c.jpg new file mode 100644 index 00000000..a3dafcbd Binary files /dev/null and b/src/dataset/water_lily/15591065106_4d2b462798_c.jpg differ diff --git a/src/dataset/water_lily/15628172898_87147a9f18_c.jpg b/src/dataset/water_lily/15628172898_87147a9f18_c.jpg new file mode 100644 index 00000000..daaf0e01 Binary files /dev/null and b/src/dataset/water_lily/15628172898_87147a9f18_c.jpg differ diff --git a/src/dataset/water_lily/15685771949_8a2d6a7991_c.jpg b/src/dataset/water_lily/15685771949_8a2d6a7991_c.jpg new file mode 100644 index 00000000..65b2ce30 Binary files /dev/null and b/src/dataset/water_lily/15685771949_8a2d6a7991_c.jpg differ diff --git a/src/dataset/water_lily/15976535861_4ce6ef5481_c.jpg b/src/dataset/water_lily/15976535861_4ce6ef5481_c.jpg new file mode 100644 index 00000000..79712b1e Binary files /dev/null and b/src/dataset/water_lily/15976535861_4ce6ef5481_c.jpg differ diff --git a/src/dataset/water_lily/16091801268_8f2759444d_c.jpg b/src/dataset/water_lily/16091801268_8f2759444d_c.jpg new file mode 100644 index 00000000..ff9606f6 Binary files /dev/null and b/src/dataset/water_lily/16091801268_8f2759444d_c.jpg differ diff --git a/src/dataset/water_lily/16594538760_b96b560155_c.jpg b/src/dataset/water_lily/16594538760_b96b560155_c.jpg new file mode 100644 index 00000000..da89806d Binary files /dev/null and b/src/dataset/water_lily/16594538760_b96b560155_c.jpg differ diff --git a/src/dataset/water_lily/16839747309_d402c5b28e_c.jpg b/src/dataset/water_lily/16839747309_d402c5b28e_c.jpg new file mode 100644 index 00000000..e91d7c69 Binary files /dev/null and b/src/dataset/water_lily/16839747309_d402c5b28e_c.jpg differ diff --git a/src/dataset/water_lily/16899386455_a0bb659295_c.jpg b/src/dataset/water_lily/16899386455_a0bb659295_c.jpg new file mode 100644 index 00000000..ae88bb2b Binary files /dev/null and b/src/dataset/water_lily/16899386455_a0bb659295_c.jpg differ diff --git a/src/dataset/water_lily/17274217473_1f31ffeafd_c.jpg b/src/dataset/water_lily/17274217473_1f31ffeafd_c.jpg new file mode 100644 index 00000000..40d95765 Binary files /dev/null and b/src/dataset/water_lily/17274217473_1f31ffeafd_c.jpg differ diff --git a/src/dataset/water_lily/17374041068_3cf3a4aa5d_c.jpg b/src/dataset/water_lily/17374041068_3cf3a4aa5d_c.jpg new file mode 100644 index 00000000..f32aefa8 Binary files /dev/null and b/src/dataset/water_lily/17374041068_3cf3a4aa5d_c.jpg differ diff --git a/src/dataset/water_lily/17610894544_590bbdbec3_c.jpg b/src/dataset/water_lily/17610894544_590bbdbec3_c.jpg new file mode 100644 index 00000000..3e484a04 Binary files /dev/null and b/src/dataset/water_lily/17610894544_590bbdbec3_c.jpg differ diff --git a/src/dataset/water_lily/17821711772_0456b8ba31_c.jpg b/src/dataset/water_lily/17821711772_0456b8ba31_c.jpg new file mode 100644 index 00000000..8856e36d Binary files /dev/null and b/src/dataset/water_lily/17821711772_0456b8ba31_c.jpg differ diff --git a/src/dataset/water_lily/17854372768_fa7794ce78_c.jpg b/src/dataset/water_lily/17854372768_fa7794ce78_c.jpg new file mode 100644 index 00000000..e1daedf2 Binary files /dev/null and b/src/dataset/water_lily/17854372768_fa7794ce78_c.jpg differ diff --git a/src/dataset/water_lily/18133967948_23c564cfa8_c.jpg b/src/dataset/water_lily/18133967948_23c564cfa8_c.jpg new file mode 100644 index 00000000..68e58ee5 Binary files /dev/null and b/src/dataset/water_lily/18133967948_23c564cfa8_c.jpg differ diff --git a/src/dataset/water_lily/1813975350_44e081d7a7_c.jpg b/src/dataset/water_lily/1813975350_44e081d7a7_c.jpg new file mode 100644 index 00000000..dd46aa70 Binary files /dev/null and b/src/dataset/water_lily/1813975350_44e081d7a7_c.jpg differ diff --git a/src/dataset/water_lily/18424437954_a770680191_c.jpg b/src/dataset/water_lily/18424437954_a770680191_c.jpg new file mode 100644 index 00000000..b977e7e1 Binary files /dev/null and b/src/dataset/water_lily/18424437954_a770680191_c.jpg differ diff --git a/src/dataset/water_lily/18668745150_2a6ceeb314_c.jpg b/src/dataset/water_lily/18668745150_2a6ceeb314_c.jpg new file mode 100644 index 00000000..563c3f5b Binary files /dev/null and b/src/dataset/water_lily/18668745150_2a6ceeb314_c.jpg differ diff --git a/src/dataset/water_lily/18768504329_689b0a168d_c.jpg b/src/dataset/water_lily/18768504329_689b0a168d_c.jpg new file mode 100644 index 00000000..2e72536a Binary files /dev/null and b/src/dataset/water_lily/18768504329_689b0a168d_c.jpg differ diff --git a/src/dataset/water_lily/18836241343_fdc9408188_c.jpg b/src/dataset/water_lily/18836241343_fdc9408188_c.jpg new file mode 100644 index 00000000..00201ada Binary files /dev/null and b/src/dataset/water_lily/18836241343_fdc9408188_c.jpg differ diff --git a/src/dataset/water_lily/18942562141_245d2e4125_c.jpg b/src/dataset/water_lily/18942562141_245d2e4125_c.jpg new file mode 100644 index 00000000..49bde853 Binary files /dev/null and b/src/dataset/water_lily/18942562141_245d2e4125_c.jpg differ diff --git a/src/dataset/water_lily/18968395745_278bbeabc1_c.jpg b/src/dataset/water_lily/18968395745_278bbeabc1_c.jpg new file mode 100644 index 00000000..48faef0c Binary files /dev/null and b/src/dataset/water_lily/18968395745_278bbeabc1_c.jpg differ diff --git a/src/dataset/water_lily/19024878656_3e118633af_c.jpg b/src/dataset/water_lily/19024878656_3e118633af_c.jpg new file mode 100644 index 00000000..d16eb75b Binary files /dev/null and b/src/dataset/water_lily/19024878656_3e118633af_c.jpg differ diff --git a/src/dataset/water_lily/19080471710_58d0044b7c_c.jpg b/src/dataset/water_lily/19080471710_58d0044b7c_c.jpg new file mode 100644 index 00000000..1d90fe2f Binary files /dev/null and b/src/dataset/water_lily/19080471710_58d0044b7c_c.jpg differ diff --git a/src/dataset/water_lily/19117971270_f1e722dc90_c.jpg b/src/dataset/water_lily/19117971270_f1e722dc90_c.jpg new file mode 100644 index 00000000..7d7c78b2 Binary files /dev/null and b/src/dataset/water_lily/19117971270_f1e722dc90_c.jpg differ diff --git a/src/dataset/water_lily/19145243085_d4fba7eca7_c.jpg b/src/dataset/water_lily/19145243085_d4fba7eca7_c.jpg new file mode 100644 index 00000000..48efae67 Binary files /dev/null and b/src/dataset/water_lily/19145243085_d4fba7eca7_c.jpg differ diff --git a/src/dataset/water_lily/19324996661_4676b644e6_c.jpg b/src/dataset/water_lily/19324996661_4676b644e6_c.jpg new file mode 100644 index 00000000..2af16341 Binary files /dev/null and b/src/dataset/water_lily/19324996661_4676b644e6_c.jpg differ diff --git a/src/dataset/water_lily/19334585971_1b49888c66_c.jpg b/src/dataset/water_lily/19334585971_1b49888c66_c.jpg new file mode 100644 index 00000000..311af87d Binary files /dev/null and b/src/dataset/water_lily/19334585971_1b49888c66_c.jpg differ diff --git a/src/dataset/water_lily/19411111331_ae1c547e9e_c.jpg b/src/dataset/water_lily/19411111331_ae1c547e9e_c.jpg new file mode 100644 index 00000000..c9a737cc Binary files /dev/null and b/src/dataset/water_lily/19411111331_ae1c547e9e_c.jpg differ diff --git a/src/dataset/water_lily/19444519023_3ac7be8f38_c.jpg b/src/dataset/water_lily/19444519023_3ac7be8f38_c.jpg new file mode 100644 index 00000000..eb0ea025 Binary files /dev/null and b/src/dataset/water_lily/19444519023_3ac7be8f38_c.jpg differ diff --git a/src/dataset/water_lily/19524072205_4826b0822d_c.jpg b/src/dataset/water_lily/19524072205_4826b0822d_c.jpg new file mode 100644 index 00000000..6e707aa7 Binary files /dev/null and b/src/dataset/water_lily/19524072205_4826b0822d_c.jpg differ diff --git a/src/dataset/water_lily/19582187841_9959f3f138_c.jpg b/src/dataset/water_lily/19582187841_9959f3f138_c.jpg new file mode 100644 index 00000000..79aa0892 Binary files /dev/null and b/src/dataset/water_lily/19582187841_9959f3f138_c.jpg differ diff --git a/src/dataset/water_lily/19749071159_55273608c3_c.jpg b/src/dataset/water_lily/19749071159_55273608c3_c.jpg new file mode 100644 index 00000000..951ff960 Binary files /dev/null and b/src/dataset/water_lily/19749071159_55273608c3_c.jpg differ diff --git a/src/dataset/water_lily/19906312496_9d918be2a9_c.jpg b/src/dataset/water_lily/19906312496_9d918be2a9_c.jpg new file mode 100644 index 00000000..5334b399 Binary files /dev/null and b/src/dataset/water_lily/19906312496_9d918be2a9_c.jpg differ diff --git a/src/dataset/water_lily/19920015119_fd14bf0f67_c.jpg b/src/dataset/water_lily/19920015119_fd14bf0f67_c.jpg new file mode 100644 index 00000000..b04063ae Binary files /dev/null and b/src/dataset/water_lily/19920015119_fd14bf0f67_c.jpg differ diff --git a/src/dataset/water_lily/19922303732_566c83db36_c.jpg b/src/dataset/water_lily/19922303732_566c83db36_c.jpg new file mode 100644 index 00000000..d94ffd9a Binary files /dev/null and b/src/dataset/water_lily/19922303732_566c83db36_c.jpg differ diff --git a/src/dataset/water_lily/19934238610_efdb3f57da_c.jpg b/src/dataset/water_lily/19934238610_efdb3f57da_c.jpg new file mode 100644 index 00000000..f3dce59f Binary files /dev/null and b/src/dataset/water_lily/19934238610_efdb3f57da_c.jpg differ diff --git a/src/dataset/water_lily/19969527794_94b45575de_c.jpg b/src/dataset/water_lily/19969527794_94b45575de_c.jpg new file mode 100644 index 00000000..961f143c Binary files /dev/null and b/src/dataset/water_lily/19969527794_94b45575de_c.jpg differ diff --git a/src/dataset/water_lily/19982627726_b53ca8212d_c.jpg b/src/dataset/water_lily/19982627726_b53ca8212d_c.jpg new file mode 100644 index 00000000..d17efb4c Binary files /dev/null and b/src/dataset/water_lily/19982627726_b53ca8212d_c.jpg differ diff --git a/src/dataset/water_lily/20008735096_3235ba98e5_c.jpg b/src/dataset/water_lily/20008735096_3235ba98e5_c.jpg new file mode 100644 index 00000000..9183f92a Binary files /dev/null and b/src/dataset/water_lily/20008735096_3235ba98e5_c.jpg differ diff --git a/src/dataset/water_lily/20015923402_9f9fbc4b54_c.jpg b/src/dataset/water_lily/20015923402_9f9fbc4b54_c.jpg new file mode 100644 index 00000000..7f87d88b Binary files /dev/null and b/src/dataset/water_lily/20015923402_9f9fbc4b54_c.jpg differ diff --git a/src/dataset/water_lily/20026956322_97db951f51_c.jpg b/src/dataset/water_lily/20026956322_97db951f51_c.jpg new file mode 100644 index 00000000..fbaa1b4f Binary files /dev/null and b/src/dataset/water_lily/20026956322_97db951f51_c.jpg differ diff --git a/src/dataset/water_lily/20046942729_5ec1cc8b1e_c.jpg b/src/dataset/water_lily/20046942729_5ec1cc8b1e_c.jpg new file mode 100644 index 00000000..63d2dd84 Binary files /dev/null and b/src/dataset/water_lily/20046942729_5ec1cc8b1e_c.jpg differ diff --git a/src/dataset/water_lily/20074522328_fcae1c53b3_c.jpg b/src/dataset/water_lily/20074522328_fcae1c53b3_c.jpg new file mode 100644 index 00000000..b86a1d46 Binary files /dev/null and b/src/dataset/water_lily/20074522328_fcae1c53b3_c.jpg differ diff --git a/src/dataset/water_lily/20137885345_399f739a16_c.jpg b/src/dataset/water_lily/20137885345_399f739a16_c.jpg new file mode 100644 index 00000000..d8e14359 Binary files /dev/null and b/src/dataset/water_lily/20137885345_399f739a16_c.jpg differ diff --git a/src/dataset/water_lily/20171104669_7ab4b5fdd4_c.jpg b/src/dataset/water_lily/20171104669_7ab4b5fdd4_c.jpg new file mode 100644 index 00000000..d6c412d9 Binary files /dev/null and b/src/dataset/water_lily/20171104669_7ab4b5fdd4_c.jpg differ diff --git a/src/dataset/water_lily/20261425772_39cff001da_c.jpg b/src/dataset/water_lily/20261425772_39cff001da_c.jpg new file mode 100644 index 00000000..fb085d54 Binary files /dev/null and b/src/dataset/water_lily/20261425772_39cff001da_c.jpg differ diff --git a/src/dataset/water_lily/20280953940_c9fc148ed2_c.jpg b/src/dataset/water_lily/20280953940_c9fc148ed2_c.jpg new file mode 100644 index 00000000..52655069 Binary files /dev/null and b/src/dataset/water_lily/20280953940_c9fc148ed2_c.jpg differ diff --git a/src/dataset/water_lily/20416868441_a642f75788_c.jpg b/src/dataset/water_lily/20416868441_a642f75788_c.jpg new file mode 100644 index 00000000..0d77cf85 Binary files /dev/null and b/src/dataset/water_lily/20416868441_a642f75788_c.jpg differ diff --git a/src/dataset/water_lily/20480348468_1745333386_c.jpg b/src/dataset/water_lily/20480348468_1745333386_c.jpg new file mode 100644 index 00000000..1efb1cfa Binary files /dev/null and b/src/dataset/water_lily/20480348468_1745333386_c.jpg differ diff --git a/src/dataset/water_lily/20498998416_802ac03389_c.jpg b/src/dataset/water_lily/20498998416_802ac03389_c.jpg new file mode 100644 index 00000000..28352f33 Binary files /dev/null and b/src/dataset/water_lily/20498998416_802ac03389_c.jpg differ diff --git a/src/dataset/water_lily/2057330263_a9e6b71d20_c.jpg b/src/dataset/water_lily/2057330263_a9e6b71d20_c.jpg new file mode 100644 index 00000000..ca13735c Binary files /dev/null and b/src/dataset/water_lily/2057330263_a9e6b71d20_c.jpg differ diff --git a/src/dataset/water_lily/20575205499_b3025a0357_c.jpg b/src/dataset/water_lily/20575205499_b3025a0357_c.jpg new file mode 100644 index 00000000..9e21f31f Binary files /dev/null and b/src/dataset/water_lily/20575205499_b3025a0357_c.jpg differ diff --git a/src/dataset/water_lily/20580331291_a3ee03f8c0_c.jpg b/src/dataset/water_lily/20580331291_a3ee03f8c0_c.jpg new file mode 100644 index 00000000..15d82b37 Binary files /dev/null and b/src/dataset/water_lily/20580331291_a3ee03f8c0_c.jpg differ diff --git a/src/dataset/water_lily/20651276696_126972da08_c.jpg b/src/dataset/water_lily/20651276696_126972da08_c.jpg new file mode 100644 index 00000000..52ec270c Binary files /dev/null and b/src/dataset/water_lily/20651276696_126972da08_c.jpg differ diff --git a/src/dataset/water_lily/20729135922_f9ae82db82_c.jpg b/src/dataset/water_lily/20729135922_f9ae82db82_c.jpg new file mode 100644 index 00000000..b8c1f13d Binary files /dev/null and b/src/dataset/water_lily/20729135922_f9ae82db82_c.jpg differ diff --git a/src/dataset/water_lily/20739505485_7b48247547_c.jpg b/src/dataset/water_lily/20739505485_7b48247547_c.jpg new file mode 100644 index 00000000..da0d5477 Binary files /dev/null and b/src/dataset/water_lily/20739505485_7b48247547_c.jpg differ diff --git a/src/dataset/water_lily/207417838_dbcfc57ea9_c.jpg b/src/dataset/water_lily/207417838_dbcfc57ea9_c.jpg new file mode 100644 index 00000000..a7620f63 Binary files /dev/null and b/src/dataset/water_lily/207417838_dbcfc57ea9_c.jpg differ diff --git a/src/dataset/water_lily/2084000855_13cbd4a5ca_c.jpg b/src/dataset/water_lily/2084000855_13cbd4a5ca_c.jpg new file mode 100644 index 00000000..a669dbf0 Binary files /dev/null and b/src/dataset/water_lily/2084000855_13cbd4a5ca_c.jpg differ diff --git a/src/dataset/water_lily/20864243850_f5c0a1b109_c.jpg b/src/dataset/water_lily/20864243850_f5c0a1b109_c.jpg new file mode 100644 index 00000000..28629d67 Binary files /dev/null and b/src/dataset/water_lily/20864243850_f5c0a1b109_c.jpg differ diff --git a/src/dataset/water_lily/20875086024_8b92906b44_c.jpg b/src/dataset/water_lily/20875086024_8b92906b44_c.jpg new file mode 100644 index 00000000..6118da5e Binary files /dev/null and b/src/dataset/water_lily/20875086024_8b92906b44_c.jpg differ diff --git a/src/dataset/water_lily/21040830848_b258b5d2f5_c.jpg b/src/dataset/water_lily/21040830848_b258b5d2f5_c.jpg new file mode 100644 index 00000000..c29cfe82 Binary files /dev/null and b/src/dataset/water_lily/21040830848_b258b5d2f5_c.jpg differ diff --git a/src/dataset/water_lily/21155228431_9ffcb0528f_c.jpg b/src/dataset/water_lily/21155228431_9ffcb0528f_c.jpg new file mode 100644 index 00000000..7ecaef3f Binary files /dev/null and b/src/dataset/water_lily/21155228431_9ffcb0528f_c.jpg differ diff --git a/src/dataset/water_lily/21189056105_fb7ee05c33_c.jpg b/src/dataset/water_lily/21189056105_fb7ee05c33_c.jpg new file mode 100644 index 00000000..a159cc9e Binary files /dev/null and b/src/dataset/water_lily/21189056105_fb7ee05c33_c.jpg differ diff --git a/src/dataset/water_lily/21204586494_974a7a1462_c.jpg b/src/dataset/water_lily/21204586494_974a7a1462_c.jpg new file mode 100644 index 00000000..1b4aee9b Binary files /dev/null and b/src/dataset/water_lily/21204586494_974a7a1462_c.jpg differ diff --git a/src/dataset/water_lily/21223739499_26270569f3_c.jpg b/src/dataset/water_lily/21223739499_26270569f3_c.jpg new file mode 100644 index 00000000..2c33f2a4 Binary files /dev/null and b/src/dataset/water_lily/21223739499_26270569f3_c.jpg differ diff --git a/src/dataset/water_lily/21334385008_93d2cf73e6_c.jpg b/src/dataset/water_lily/21334385008_93d2cf73e6_c.jpg new file mode 100644 index 00000000..95195f95 Binary files /dev/null and b/src/dataset/water_lily/21334385008_93d2cf73e6_c.jpg differ diff --git a/src/dataset/water_lily/2141059138_f31f97120f_c.jpg b/src/dataset/water_lily/2141059138_f31f97120f_c.jpg new file mode 100644 index 00000000..e7eba81d Binary files /dev/null and b/src/dataset/water_lily/2141059138_f31f97120f_c.jpg differ diff --git a/src/dataset/water_lily/2172727010_981fcc947e_c.jpg b/src/dataset/water_lily/2172727010_981fcc947e_c.jpg new file mode 100644 index 00000000..de10cddf Binary files /dev/null and b/src/dataset/water_lily/2172727010_981fcc947e_c.jpg differ diff --git a/src/dataset/water_lily/2187928922_a0605af365_c.jpg b/src/dataset/water_lily/2187928922_a0605af365_c.jpg new file mode 100644 index 00000000..d26cc506 Binary files /dev/null and b/src/dataset/water_lily/2187928922_a0605af365_c.jpg differ diff --git a/src/dataset/water_lily/21966197108_8351088181_c.jpg b/src/dataset/water_lily/21966197108_8351088181_c.jpg new file mode 100644 index 00000000..061de83d Binary files /dev/null and b/src/dataset/water_lily/21966197108_8351088181_c.jpg differ diff --git a/src/dataset/water_lily/22067173086_473afa90d6_c.jpg b/src/dataset/water_lily/22067173086_473afa90d6_c.jpg new file mode 100644 index 00000000..4a0d0578 Binary files /dev/null and b/src/dataset/water_lily/22067173086_473afa90d6_c.jpg differ diff --git a/src/dataset/water_lily/22077145002_437ae70e4c_c.jpg b/src/dataset/water_lily/22077145002_437ae70e4c_c.jpg new file mode 100644 index 00000000..85d41cb6 Binary files /dev/null and b/src/dataset/water_lily/22077145002_437ae70e4c_c.jpg differ diff --git a/src/dataset/water_lily/22145417034_381a575ccd_c.jpg b/src/dataset/water_lily/22145417034_381a575ccd_c.jpg new file mode 100644 index 00000000..cbc5291b Binary files /dev/null and b/src/dataset/water_lily/22145417034_381a575ccd_c.jpg differ diff --git a/src/dataset/water_lily/22171447001_a931ce9a2f_c.jpg b/src/dataset/water_lily/22171447001_a931ce9a2f_c.jpg new file mode 100644 index 00000000..0aa2425d Binary files /dev/null and b/src/dataset/water_lily/22171447001_a931ce9a2f_c.jpg differ diff --git a/src/dataset/water_lily/22197462416_d9687635d7_c.jpg b/src/dataset/water_lily/22197462416_d9687635d7_c.jpg new file mode 100644 index 00000000..cc1d147f Binary files /dev/null and b/src/dataset/water_lily/22197462416_d9687635d7_c.jpg differ diff --git a/src/dataset/water_lily/22250791069_7bd1b68ec0_c.jpg b/src/dataset/water_lily/22250791069_7bd1b68ec0_c.jpg new file mode 100644 index 00000000..a00bff76 Binary files /dev/null and b/src/dataset/water_lily/22250791069_7bd1b68ec0_c.jpg differ diff --git a/src/dataset/water_lily/22285730873_60b0b96f63_c.jpg b/src/dataset/water_lily/22285730873_60b0b96f63_c.jpg new file mode 100644 index 00000000..ef69e39f Binary files /dev/null and b/src/dataset/water_lily/22285730873_60b0b96f63_c.jpg differ diff --git a/src/dataset/water_lily/22560849294_3375fdcf86_c.jpg b/src/dataset/water_lily/22560849294_3375fdcf86_c.jpg new file mode 100644 index 00000000..b2878a64 Binary files /dev/null and b/src/dataset/water_lily/22560849294_3375fdcf86_c.jpg differ diff --git a/src/dataset/water_lily/22758974622_cd865bcc6b_c.jpg b/src/dataset/water_lily/22758974622_cd865bcc6b_c.jpg new file mode 100644 index 00000000..e37ef549 Binary files /dev/null and b/src/dataset/water_lily/22758974622_cd865bcc6b_c.jpg differ diff --git a/src/dataset/water_lily/22823027186_13870184e3_c.jpg b/src/dataset/water_lily/22823027186_13870184e3_c.jpg new file mode 100644 index 00000000..fa53fedf Binary files /dev/null and b/src/dataset/water_lily/22823027186_13870184e3_c.jpg differ diff --git a/src/dataset/water_lily/22990051399_31be86ab11_c.jpg b/src/dataset/water_lily/22990051399_31be86ab11_c.jpg new file mode 100644 index 00000000..c3664979 Binary files /dev/null and b/src/dataset/water_lily/22990051399_31be86ab11_c.jpg differ diff --git a/src/dataset/water_lily/23240034323_a153081129_c.jpg b/src/dataset/water_lily/23240034323_a153081129_c.jpg new file mode 100644 index 00000000..8149f0d6 Binary files /dev/null and b/src/dataset/water_lily/23240034323_a153081129_c.jpg differ diff --git a/src/dataset/water_lily/23322779129_1f7b2ae554_c.jpg b/src/dataset/water_lily/23322779129_1f7b2ae554_c.jpg new file mode 100644 index 00000000..930080b4 Binary files /dev/null and b/src/dataset/water_lily/23322779129_1f7b2ae554_c.jpg differ diff --git a/src/dataset/water_lily/2339065548_d0723a4f36_c.jpg b/src/dataset/water_lily/2339065548_d0723a4f36_c.jpg new file mode 100644 index 00000000..7573b652 Binary files /dev/null and b/src/dataset/water_lily/2339065548_d0723a4f36_c.jpg differ diff --git a/src/dataset/water_lily/23414001236_11d56805f8_c.jpg b/src/dataset/water_lily/23414001236_11d56805f8_c.jpg new file mode 100644 index 00000000..d73533c3 Binary files /dev/null and b/src/dataset/water_lily/23414001236_11d56805f8_c.jpg differ diff --git a/src/dataset/water_lily/23470942380_ff66cc6c0f_c.jpg b/src/dataset/water_lily/23470942380_ff66cc6c0f_c.jpg new file mode 100644 index 00000000..f2eec438 Binary files /dev/null and b/src/dataset/water_lily/23470942380_ff66cc6c0f_c.jpg differ diff --git a/src/dataset/water_lily/23577804582_c87efd097b_c.jpg b/src/dataset/water_lily/23577804582_c87efd097b_c.jpg new file mode 100644 index 00000000..bd7aa0fd Binary files /dev/null and b/src/dataset/water_lily/23577804582_c87efd097b_c.jpg differ diff --git a/src/dataset/water_lily/236439228_9638ab84ec_c.jpg b/src/dataset/water_lily/236439228_9638ab84ec_c.jpg new file mode 100644 index 00000000..f29e09f2 Binary files /dev/null and b/src/dataset/water_lily/236439228_9638ab84ec_c.jpg differ diff --git a/src/dataset/water_lily/23680136014_80b111015b_c.jpg b/src/dataset/water_lily/23680136014_80b111015b_c.jpg new file mode 100644 index 00000000..44943e7a Binary files /dev/null and b/src/dataset/water_lily/23680136014_80b111015b_c.jpg differ diff --git a/src/dataset/water_lily/23739927522_cf6cc0dece_c.jpg b/src/dataset/water_lily/23739927522_cf6cc0dece_c.jpg new file mode 100644 index 00000000..7ad9751e Binary files /dev/null and b/src/dataset/water_lily/23739927522_cf6cc0dece_c.jpg differ diff --git a/src/dataset/water_lily/23779696659_b8226c087a_c.jpg b/src/dataset/water_lily/23779696659_b8226c087a_c.jpg new file mode 100644 index 00000000..bad75643 Binary files /dev/null and b/src/dataset/water_lily/23779696659_b8226c087a_c.jpg differ diff --git a/src/dataset/water_lily/24061974375_eee33da340_c.jpg b/src/dataset/water_lily/24061974375_eee33da340_c.jpg new file mode 100644 index 00000000..46045596 Binary files /dev/null and b/src/dataset/water_lily/24061974375_eee33da340_c.jpg differ diff --git a/src/dataset/water_lily/24462786755_8d3b53213b_c.jpg b/src/dataset/water_lily/24462786755_8d3b53213b_c.jpg new file mode 100644 index 00000000..0a6d836f Binary files /dev/null and b/src/dataset/water_lily/24462786755_8d3b53213b_c.jpg differ diff --git a/src/dataset/water_lily/24543401166_7e861b1b36_c.jpg b/src/dataset/water_lily/24543401166_7e861b1b36_c.jpg new file mode 100644 index 00000000..78061e5b Binary files /dev/null and b/src/dataset/water_lily/24543401166_7e861b1b36_c.jpg differ diff --git a/src/dataset/water_lily/24630045920_41cfa03c47_c.jpg b/src/dataset/water_lily/24630045920_41cfa03c47_c.jpg new file mode 100644 index 00000000..db79e538 Binary files /dev/null and b/src/dataset/water_lily/24630045920_41cfa03c47_c.jpg differ diff --git a/src/dataset/water_lily/24633639241_23fe512e68_c.jpg b/src/dataset/water_lily/24633639241_23fe512e68_c.jpg new file mode 100644 index 00000000..e256e5ad Binary files /dev/null and b/src/dataset/water_lily/24633639241_23fe512e68_c.jpg differ diff --git a/src/dataset/water_lily/24661725090_7e9b0aff73_c.jpg b/src/dataset/water_lily/24661725090_7e9b0aff73_c.jpg new file mode 100644 index 00000000..0657c015 Binary files /dev/null and b/src/dataset/water_lily/24661725090_7e9b0aff73_c.jpg differ diff --git a/src/dataset/water_lily/24761190347_c2fafd3a80_c.jpg b/src/dataset/water_lily/24761190347_c2fafd3a80_c.jpg new file mode 100644 index 00000000..715d61cd Binary files /dev/null and b/src/dataset/water_lily/24761190347_c2fafd3a80_c.jpg differ diff --git a/src/dataset/water_lily/25042060941_eeae45b65a_c.jpg b/src/dataset/water_lily/25042060941_eeae45b65a_c.jpg new file mode 100644 index 00000000..b32f8dde Binary files /dev/null and b/src/dataset/water_lily/25042060941_eeae45b65a_c.jpg differ diff --git a/src/dataset/water_lily/25194582009_d0b83033c2_c.jpg b/src/dataset/water_lily/25194582009_d0b83033c2_c.jpg new file mode 100644 index 00000000..9b700b3e Binary files /dev/null and b/src/dataset/water_lily/25194582009_d0b83033c2_c.jpg differ diff --git a/src/dataset/water_lily/25198971548_012e20f892_c.jpg b/src/dataset/water_lily/25198971548_012e20f892_c.jpg new file mode 100644 index 00000000..ed7fa29b Binary files /dev/null and b/src/dataset/water_lily/25198971548_012e20f892_c.jpg differ diff --git a/src/dataset/water_lily/25260284640_c16c0bf3d3_c.jpg b/src/dataset/water_lily/25260284640_c16c0bf3d3_c.jpg new file mode 100644 index 00000000..4ecd2415 Binary files /dev/null and b/src/dataset/water_lily/25260284640_c16c0bf3d3_c.jpg differ diff --git a/src/dataset/water_lily/2571887508_c20d6759c3_c.jpg b/src/dataset/water_lily/2571887508_c20d6759c3_c.jpg new file mode 100644 index 00000000..c0f89fbd Binary files /dev/null and b/src/dataset/water_lily/2571887508_c20d6759c3_c.jpg differ diff --git a/src/dataset/water_lily/2583214181_9c04443de1_c.jpg b/src/dataset/water_lily/2583214181_9c04443de1_c.jpg new file mode 100644 index 00000000..3c621d4c Binary files /dev/null and b/src/dataset/water_lily/2583214181_9c04443de1_c.jpg differ diff --git a/src/dataset/water_lily/25874377346_e2bd9d28ea_c.jpg b/src/dataset/water_lily/25874377346_e2bd9d28ea_c.jpg new file mode 100644 index 00000000..15196a85 Binary files /dev/null and b/src/dataset/water_lily/25874377346_e2bd9d28ea_c.jpg differ diff --git a/src/dataset/water_lily/26164357503_87a982b590_c.jpg b/src/dataset/water_lily/26164357503_87a982b590_c.jpg new file mode 100644 index 00000000..300cbee2 Binary files /dev/null and b/src/dataset/water_lily/26164357503_87a982b590_c.jpg differ diff --git a/src/dataset/water_lily/26204668580_f9cc5a794c_c.jpg b/src/dataset/water_lily/26204668580_f9cc5a794c_c.jpg new file mode 100644 index 00000000..86a65d4d Binary files /dev/null and b/src/dataset/water_lily/26204668580_f9cc5a794c_c.jpg differ diff --git a/src/dataset/water_lily/2624323986_f47c67562d_c.jpg b/src/dataset/water_lily/2624323986_f47c67562d_c.jpg new file mode 100644 index 00000000..075e6bb0 Binary files /dev/null and b/src/dataset/water_lily/2624323986_f47c67562d_c.jpg differ diff --git a/src/dataset/water_lily/26270912119_24371f0413_c.jpg b/src/dataset/water_lily/26270912119_24371f0413_c.jpg new file mode 100644 index 00000000..826df9f4 Binary files /dev/null and b/src/dataset/water_lily/26270912119_24371f0413_c.jpg differ diff --git a/src/dataset/water_lily/26365019178_1d990827c0_c.jpg b/src/dataset/water_lily/26365019178_1d990827c0_c.jpg new file mode 100644 index 00000000..c7f99445 Binary files /dev/null and b/src/dataset/water_lily/26365019178_1d990827c0_c.jpg differ diff --git a/src/dataset/water_lily/26477154110_9a9ee41b20_c.jpg b/src/dataset/water_lily/26477154110_9a9ee41b20_c.jpg new file mode 100644 index 00000000..d6af39e4 Binary files /dev/null and b/src/dataset/water_lily/26477154110_9a9ee41b20_c.jpg differ diff --git a/src/dataset/water_lily/26533538628_64d9c503f4_c.jpg b/src/dataset/water_lily/26533538628_64d9c503f4_c.jpg new file mode 100644 index 00000000..018a504f Binary files /dev/null and b/src/dataset/water_lily/26533538628_64d9c503f4_c.jpg differ diff --git a/src/dataset/water_lily/26549889187_9ba2770443_c.jpg b/src/dataset/water_lily/26549889187_9ba2770443_c.jpg new file mode 100644 index 00000000..e1fbb336 Binary files /dev/null and b/src/dataset/water_lily/26549889187_9ba2770443_c.jpg differ diff --git a/src/dataset/water_lily/2657086252_3804074922_c.jpg b/src/dataset/water_lily/2657086252_3804074922_c.jpg new file mode 100644 index 00000000..d3e9b6e0 Binary files /dev/null and b/src/dataset/water_lily/2657086252_3804074922_c.jpg differ diff --git a/src/dataset/water_lily/26604606578_c5e5d862db_c.jpg b/src/dataset/water_lily/26604606578_c5e5d862db_c.jpg new file mode 100644 index 00000000..30b6a392 Binary files /dev/null and b/src/dataset/water_lily/26604606578_c5e5d862db_c.jpg differ diff --git a/src/dataset/water_lily/2660738370_de833be4eb_c.jpg b/src/dataset/water_lily/2660738370_de833be4eb_c.jpg new file mode 100644 index 00000000..a664cfc6 Binary files /dev/null and b/src/dataset/water_lily/2660738370_de833be4eb_c.jpg differ diff --git a/src/dataset/water_lily/26796668673_5aca5337e3_c.jpg b/src/dataset/water_lily/26796668673_5aca5337e3_c.jpg new file mode 100644 index 00000000..87fa11c1 Binary files /dev/null and b/src/dataset/water_lily/26796668673_5aca5337e3_c.jpg differ diff --git a/src/dataset/water_lily/26867458139_da24a51a1c_c.jpg b/src/dataset/water_lily/26867458139_da24a51a1c_c.jpg new file mode 100644 index 00000000..710575bc Binary files /dev/null and b/src/dataset/water_lily/26867458139_da24a51a1c_c.jpg differ diff --git a/src/dataset/water_lily/27032139896_1fb249e238_c.jpg b/src/dataset/water_lily/27032139896_1fb249e238_c.jpg new file mode 100644 index 00000000..947b2d5d Binary files /dev/null and b/src/dataset/water_lily/27032139896_1fb249e238_c.jpg differ diff --git a/src/dataset/water_lily/27119672093_81beb54f9e_c.jpg b/src/dataset/water_lily/27119672093_81beb54f9e_c.jpg new file mode 100644 index 00000000..ddff4d49 Binary files /dev/null and b/src/dataset/water_lily/27119672093_81beb54f9e_c.jpg differ diff --git a/src/dataset/water_lily/27132525512_0260d37ceb_c.jpg b/src/dataset/water_lily/27132525512_0260d37ceb_c.jpg new file mode 100644 index 00000000..1505726e Binary files /dev/null and b/src/dataset/water_lily/27132525512_0260d37ceb_c.jpg differ diff --git a/src/dataset/water_lily/27154497152_ed85c06b85_c.jpg b/src/dataset/water_lily/27154497152_ed85c06b85_c.jpg new file mode 100644 index 00000000..1f496323 Binary files /dev/null and b/src/dataset/water_lily/27154497152_ed85c06b85_c.jpg differ diff --git a/src/dataset/water_lily/27172013820_32157bce8b_c.jpg b/src/dataset/water_lily/27172013820_32157bce8b_c.jpg new file mode 100644 index 00000000..b515b2fc Binary files /dev/null and b/src/dataset/water_lily/27172013820_32157bce8b_c.jpg differ diff --git a/src/dataset/water_lily/2720333508_6463c4c04b_c.jpg b/src/dataset/water_lily/2720333508_6463c4c04b_c.jpg new file mode 100644 index 00000000..59371ad1 Binary files /dev/null and b/src/dataset/water_lily/2720333508_6463c4c04b_c.jpg differ diff --git a/src/dataset/water_lily/27391627623_26d37d6315_c.jpg b/src/dataset/water_lily/27391627623_26d37d6315_c.jpg new file mode 100644 index 00000000..674faa1e Binary files /dev/null and b/src/dataset/water_lily/27391627623_26d37d6315_c.jpg differ diff --git a/src/dataset/water_lily/27424214686_494ee55747_c.jpg b/src/dataset/water_lily/27424214686_494ee55747_c.jpg new file mode 100644 index 00000000..2ee7245b Binary files /dev/null and b/src/dataset/water_lily/27424214686_494ee55747_c.jpg differ diff --git a/src/dataset/water_lily/27473436115_c00c4423cc_c.jpg b/src/dataset/water_lily/27473436115_c00c4423cc_c.jpg new file mode 100644 index 00000000..389c5d9f Binary files /dev/null and b/src/dataset/water_lily/27473436115_c00c4423cc_c.jpg differ diff --git a/src/dataset/water_lily/27516867095_fbe01ca968_c.jpg b/src/dataset/water_lily/27516867095_fbe01ca968_c.jpg new file mode 100644 index 00000000..6a4055d7 Binary files /dev/null and b/src/dataset/water_lily/27516867095_fbe01ca968_c.jpg differ diff --git a/src/dataset/water_lily/27556761653_866743705b_c.jpg b/src/dataset/water_lily/27556761653_866743705b_c.jpg new file mode 100644 index 00000000..e5003dba Binary files /dev/null and b/src/dataset/water_lily/27556761653_866743705b_c.jpg differ diff --git a/src/dataset/water_lily/27590159800_0386c36df9_c.jpg b/src/dataset/water_lily/27590159800_0386c36df9_c.jpg new file mode 100644 index 00000000..baaf757b Binary files /dev/null and b/src/dataset/water_lily/27590159800_0386c36df9_c.jpg differ diff --git a/src/dataset/water_lily/27636450604_8bb57a0acf_c.jpg b/src/dataset/water_lily/27636450604_8bb57a0acf_c.jpg new file mode 100644 index 00000000..c7d08f9a Binary files /dev/null and b/src/dataset/water_lily/27636450604_8bb57a0acf_c.jpg differ diff --git a/src/dataset/water_lily/27702153875_5579430ce6_c.jpg b/src/dataset/water_lily/27702153875_5579430ce6_c.jpg new file mode 100644 index 00000000..b0f8ac41 Binary files /dev/null and b/src/dataset/water_lily/27702153875_5579430ce6_c.jpg differ diff --git a/src/dataset/water_lily/27815748414_f6423ccee6_c.jpg b/src/dataset/water_lily/27815748414_f6423ccee6_c.jpg new file mode 100644 index 00000000..cbafea05 Binary files /dev/null and b/src/dataset/water_lily/27815748414_f6423ccee6_c.jpg differ diff --git a/src/dataset/water_lily/27815755324_f5c4cec328_c.jpg b/src/dataset/water_lily/27815755324_f5c4cec328_c.jpg new file mode 100644 index 00000000..2aa03cd3 Binary files /dev/null and b/src/dataset/water_lily/27815755324_f5c4cec328_c.jpg differ diff --git a/src/dataset/water_lily/27818411424_b953ccae65_c.jpg b/src/dataset/water_lily/27818411424_b953ccae65_c.jpg new file mode 100644 index 00000000..c30914c2 Binary files /dev/null and b/src/dataset/water_lily/27818411424_b953ccae65_c.jpg differ diff --git a/src/dataset/water_lily/27871536280_3ab97d1a15_c.jpg b/src/dataset/water_lily/27871536280_3ab97d1a15_c.jpg new file mode 100644 index 00000000..5def3d6a Binary files /dev/null and b/src/dataset/water_lily/27871536280_3ab97d1a15_c.jpg differ diff --git a/src/dataset/water_lily/27889568982_25cce940a8_c.jpg b/src/dataset/water_lily/27889568982_25cce940a8_c.jpg new file mode 100644 index 00000000..cd72d6a2 Binary files /dev/null and b/src/dataset/water_lily/27889568982_25cce940a8_c.jpg differ diff --git a/src/dataset/water_lily/27897217510_8c228e9edc_c.jpg b/src/dataset/water_lily/27897217510_8c228e9edc_c.jpg new file mode 100644 index 00000000..7e9c936b Binary files /dev/null and b/src/dataset/water_lily/27897217510_8c228e9edc_c.jpg differ diff --git a/src/dataset/water_lily/27934703776_cfdd9902de_c.jpg b/src/dataset/water_lily/27934703776_cfdd9902de_c.jpg new file mode 100644 index 00000000..b635a962 Binary files /dev/null and b/src/dataset/water_lily/27934703776_cfdd9902de_c.jpg differ diff --git a/src/dataset/water_lily/2794474501_3171d8d537_c.jpg b/src/dataset/water_lily/2794474501_3171d8d537_c.jpg new file mode 100644 index 00000000..7533a765 Binary files /dev/null and b/src/dataset/water_lily/2794474501_3171d8d537_c.jpg differ diff --git a/src/dataset/water_lily/27983261886_40383b0ffd_c.jpg b/src/dataset/water_lily/27983261886_40383b0ffd_c.jpg new file mode 100644 index 00000000..15136325 Binary files /dev/null and b/src/dataset/water_lily/27983261886_40383b0ffd_c.jpg differ diff --git a/src/dataset/water_lily/28012340011_1d52cd2397_c.jpg b/src/dataset/water_lily/28012340011_1d52cd2397_c.jpg new file mode 100644 index 00000000..6e8f98ff Binary files /dev/null and b/src/dataset/water_lily/28012340011_1d52cd2397_c.jpg differ diff --git a/src/dataset/water_lily/28026009903_33816bd189_c.jpg b/src/dataset/water_lily/28026009903_33816bd189_c.jpg new file mode 100644 index 00000000..0fdf5227 Binary files /dev/null and b/src/dataset/water_lily/28026009903_33816bd189_c.jpg differ diff --git a/src/dataset/water_lily/28070260171_0b25edbbae_c.jpg b/src/dataset/water_lily/28070260171_0b25edbbae_c.jpg new file mode 100644 index 00000000..854660cc Binary files /dev/null and b/src/dataset/water_lily/28070260171_0b25edbbae_c.jpg differ diff --git a/src/dataset/water_lily/28078904524_9fb5ae72d7_c.jpg b/src/dataset/water_lily/28078904524_9fb5ae72d7_c.jpg new file mode 100644 index 00000000..bec0d115 Binary files /dev/null and b/src/dataset/water_lily/28078904524_9fb5ae72d7_c.jpg differ diff --git a/src/dataset/water_lily/28109796777_17c7c909fc_c.jpg b/src/dataset/water_lily/28109796777_17c7c909fc_c.jpg new file mode 100644 index 00000000..195ebb40 Binary files /dev/null and b/src/dataset/water_lily/28109796777_17c7c909fc_c.jpg differ diff --git a/src/dataset/water_lily/28112616974_35abebaa69_c.jpg b/src/dataset/water_lily/28112616974_35abebaa69_c.jpg new file mode 100644 index 00000000..bb5a5b3b Binary files /dev/null and b/src/dataset/water_lily/28112616974_35abebaa69_c.jpg differ diff --git a/src/dataset/water_lily/28127171281_0b34981031_c.jpg b/src/dataset/water_lily/28127171281_0b34981031_c.jpg new file mode 100644 index 00000000..4aebcf86 Binary files /dev/null and b/src/dataset/water_lily/28127171281_0b34981031_c.jpg differ diff --git a/src/dataset/water_lily/28146789953_4935bf9994_c.jpg b/src/dataset/water_lily/28146789953_4935bf9994_c.jpg new file mode 100644 index 00000000..6708943f Binary files /dev/null and b/src/dataset/water_lily/28146789953_4935bf9994_c.jpg differ diff --git a/src/dataset/water_lily/28177847921_e261ace0a1_c.jpg b/src/dataset/water_lily/28177847921_e261ace0a1_c.jpg new file mode 100644 index 00000000..20cccb08 Binary files /dev/null and b/src/dataset/water_lily/28177847921_e261ace0a1_c.jpg differ diff --git a/src/dataset/water_lily/28183471306_a6c8895e0d_c.jpg b/src/dataset/water_lily/28183471306_a6c8895e0d_c.jpg new file mode 100644 index 00000000..ce1d467e Binary files /dev/null and b/src/dataset/water_lily/28183471306_a6c8895e0d_c.jpg differ diff --git a/src/dataset/water_lily/28197453485_91a4e69eec_c.jpg b/src/dataset/water_lily/28197453485_91a4e69eec_c.jpg new file mode 100644 index 00000000..e3f558ca Binary files /dev/null and b/src/dataset/water_lily/28197453485_91a4e69eec_c.jpg differ diff --git a/src/dataset/water_lily/28200295045_57ceb51425_c.jpg b/src/dataset/water_lily/28200295045_57ceb51425_c.jpg new file mode 100644 index 00000000..cde60eb3 Binary files /dev/null and b/src/dataset/water_lily/28200295045_57ceb51425_c.jpg differ diff --git a/src/dataset/water_lily/28217443134_39434a2262_c.jpg b/src/dataset/water_lily/28217443134_39434a2262_c.jpg new file mode 100644 index 00000000..0958c29b Binary files /dev/null and b/src/dataset/water_lily/28217443134_39434a2262_c.jpg differ diff --git a/src/dataset/water_lily/28222749374_2a5011735e_c.jpg b/src/dataset/water_lily/28222749374_2a5011735e_c.jpg new file mode 100644 index 00000000..b3d6b9a1 Binary files /dev/null and b/src/dataset/water_lily/28222749374_2a5011735e_c.jpg differ diff --git a/src/dataset/water_lily/28238045642_3004280e93_c.jpg b/src/dataset/water_lily/28238045642_3004280e93_c.jpg new file mode 100644 index 00000000..74c4f880 Binary files /dev/null and b/src/dataset/water_lily/28238045642_3004280e93_c.jpg differ diff --git a/src/dataset/water_lily/28252655086_1cb1ee6dbd_c.jpg b/src/dataset/water_lily/28252655086_1cb1ee6dbd_c.jpg new file mode 100644 index 00000000..46c497cb Binary files /dev/null and b/src/dataset/water_lily/28252655086_1cb1ee6dbd_c.jpg differ diff --git a/src/dataset/water_lily/28264096313_69cb81f746_c.jpg b/src/dataset/water_lily/28264096313_69cb81f746_c.jpg new file mode 100644 index 00000000..99893c7f Binary files /dev/null and b/src/dataset/water_lily/28264096313_69cb81f746_c.jpg differ diff --git a/src/dataset/water_lily/28365536445_415fde4198_c.jpg b/src/dataset/water_lily/28365536445_415fde4198_c.jpg new file mode 100644 index 00000000..293bd5a2 Binary files /dev/null and b/src/dataset/water_lily/28365536445_415fde4198_c.jpg differ diff --git a/src/dataset/water_lily/28405767931_480c64592c_c.jpg b/src/dataset/water_lily/28405767931_480c64592c_c.jpg new file mode 100644 index 00000000..2dcca16d Binary files /dev/null and b/src/dataset/water_lily/28405767931_480c64592c_c.jpg differ diff --git a/src/dataset/water_lily/2842853695_8ee8a892f8_c.jpg b/src/dataset/water_lily/2842853695_8ee8a892f8_c.jpg new file mode 100644 index 00000000..9e65da48 Binary files /dev/null and b/src/dataset/water_lily/2842853695_8ee8a892f8_c.jpg differ diff --git a/src/dataset/water_lily/28444096140_a2e127af51_c.jpg b/src/dataset/water_lily/28444096140_a2e127af51_c.jpg new file mode 100644 index 00000000..9f586501 Binary files /dev/null and b/src/dataset/water_lily/28444096140_a2e127af51_c.jpg differ diff --git a/src/dataset/water_lily/28449151351_d01782655a_c.jpg b/src/dataset/water_lily/28449151351_d01782655a_c.jpg new file mode 100644 index 00000000..8e07ba66 Binary files /dev/null and b/src/dataset/water_lily/28449151351_d01782655a_c.jpg differ diff --git a/src/dataset/water_lily/28469551410_17b00f5a6b_c.jpg b/src/dataset/water_lily/28469551410_17b00f5a6b_c.jpg new file mode 100644 index 00000000..1210d81a Binary files /dev/null and b/src/dataset/water_lily/28469551410_17b00f5a6b_c.jpg differ diff --git a/src/dataset/water_lily/28492182202_ec75bbd94b_c.jpg b/src/dataset/water_lily/28492182202_ec75bbd94b_c.jpg new file mode 100644 index 00000000..fdcbaf04 Binary files /dev/null and b/src/dataset/water_lily/28492182202_ec75bbd94b_c.jpg differ diff --git a/src/dataset/water_lily/28498772786_64cdff27df_c.jpg b/src/dataset/water_lily/28498772786_64cdff27df_c.jpg new file mode 100644 index 00000000..a975ae77 Binary files /dev/null and b/src/dataset/water_lily/28498772786_64cdff27df_c.jpg differ diff --git a/src/dataset/water_lily/28513722202_1951d44f96_c.jpg b/src/dataset/water_lily/28513722202_1951d44f96_c.jpg new file mode 100644 index 00000000..6af9db6c Binary files /dev/null and b/src/dataset/water_lily/28513722202_1951d44f96_c.jpg differ diff --git a/src/dataset/water_lily/28545026566_b7ea3c5b5f_c.jpg b/src/dataset/water_lily/28545026566_b7ea3c5b5f_c.jpg new file mode 100644 index 00000000..84121b45 Binary files /dev/null and b/src/dataset/water_lily/28545026566_b7ea3c5b5f_c.jpg differ diff --git a/src/dataset/water_lily/28577276956_94e45d81e2_c.jpg b/src/dataset/water_lily/28577276956_94e45d81e2_c.jpg new file mode 100644 index 00000000..7f19a8c2 Binary files /dev/null and b/src/dataset/water_lily/28577276956_94e45d81e2_c.jpg differ diff --git a/src/dataset/water_lily/28627158530_f636c28fa9_c.jpg b/src/dataset/water_lily/28627158530_f636c28fa9_c.jpg new file mode 100644 index 00000000..b45dbfb7 Binary files /dev/null and b/src/dataset/water_lily/28627158530_f636c28fa9_c.jpg differ diff --git a/src/dataset/water_lily/28821393924_fb3931445a_c.jpg b/src/dataset/water_lily/28821393924_fb3931445a_c.jpg new file mode 100644 index 00000000..8475191a Binary files /dev/null and b/src/dataset/water_lily/28821393924_fb3931445a_c.jpg differ diff --git a/src/dataset/water_lily/28874623760_805889200e_c.jpg b/src/dataset/water_lily/28874623760_805889200e_c.jpg new file mode 100644 index 00000000..d625810e Binary files /dev/null and b/src/dataset/water_lily/28874623760_805889200e_c.jpg differ diff --git a/src/dataset/water_lily/28888368524_8712dcecec_c.jpg b/src/dataset/water_lily/28888368524_8712dcecec_c.jpg new file mode 100644 index 00000000..37cb389e Binary files /dev/null and b/src/dataset/water_lily/28888368524_8712dcecec_c.jpg differ diff --git a/src/dataset/water_lily/28904408602_d757ae1269_c.jpg b/src/dataset/water_lily/28904408602_d757ae1269_c.jpg new file mode 100644 index 00000000..7da9062c Binary files /dev/null and b/src/dataset/water_lily/28904408602_d757ae1269_c.jpg differ diff --git a/src/dataset/water_lily/28916026184_aab2b73858_c.jpg b/src/dataset/water_lily/28916026184_aab2b73858_c.jpg new file mode 100644 index 00000000..514a9cc9 Binary files /dev/null and b/src/dataset/water_lily/28916026184_aab2b73858_c.jpg differ diff --git a/src/dataset/water_lily/28938429180_dfec58bf4a_c.jpg b/src/dataset/water_lily/28938429180_dfec58bf4a_c.jpg new file mode 100644 index 00000000..b655660e Binary files /dev/null and b/src/dataset/water_lily/28938429180_dfec58bf4a_c.jpg differ diff --git a/src/dataset/water_lily/28939387691_2e08285512_c.jpg b/src/dataset/water_lily/28939387691_2e08285512_c.jpg new file mode 100644 index 00000000..74366bbf Binary files /dev/null and b/src/dataset/water_lily/28939387691_2e08285512_c.jpg differ diff --git a/src/dataset/water_lily/28947935590_8a467e8808_c.jpg b/src/dataset/water_lily/28947935590_8a467e8808_c.jpg new file mode 100644 index 00000000..1492b91e Binary files /dev/null and b/src/dataset/water_lily/28947935590_8a467e8808_c.jpg differ diff --git a/src/dataset/water_lily/28954734224_7a38fc6090_c.jpg b/src/dataset/water_lily/28954734224_7a38fc6090_c.jpg new file mode 100644 index 00000000..a0aa47c5 Binary files /dev/null and b/src/dataset/water_lily/28954734224_7a38fc6090_c.jpg differ diff --git a/src/dataset/water_lily/28967620284_fd27c44d9a_c.jpg b/src/dataset/water_lily/28967620284_fd27c44d9a_c.jpg new file mode 100644 index 00000000..60da5e9a Binary files /dev/null and b/src/dataset/water_lily/28967620284_fd27c44d9a_c.jpg differ diff --git a/src/dataset/water_lily/28972443765_ac260ab3e8_c.jpg b/src/dataset/water_lily/28972443765_ac260ab3e8_c.jpg new file mode 100644 index 00000000..b320e2b7 Binary files /dev/null and b/src/dataset/water_lily/28972443765_ac260ab3e8_c.jpg differ diff --git a/src/dataset/water_lily/29009382240_55b0fc7268_c.jpg b/src/dataset/water_lily/29009382240_55b0fc7268_c.jpg new file mode 100644 index 00000000..92613014 Binary files /dev/null and b/src/dataset/water_lily/29009382240_55b0fc7268_c.jpg differ diff --git a/src/dataset/water_lily/29022341173_448edb8e08_c.jpg b/src/dataset/water_lily/29022341173_448edb8e08_c.jpg new file mode 100644 index 00000000..2658e715 Binary files /dev/null and b/src/dataset/water_lily/29022341173_448edb8e08_c.jpg differ diff --git a/src/dataset/water_lily/29033677262_dff35d7789_c.jpg b/src/dataset/water_lily/29033677262_dff35d7789_c.jpg new file mode 100644 index 00000000..4ef16cd2 Binary files /dev/null and b/src/dataset/water_lily/29033677262_dff35d7789_c.jpg differ diff --git a/src/dataset/water_lily/29127832097_db48d8cdac_c.jpg b/src/dataset/water_lily/29127832097_db48d8cdac_c.jpg new file mode 100644 index 00000000..6bf77741 Binary files /dev/null and b/src/dataset/water_lily/29127832097_db48d8cdac_c.jpg differ diff --git a/src/dataset/water_lily/29130697437_2de39e0e70_c.jpg b/src/dataset/water_lily/29130697437_2de39e0e70_c.jpg new file mode 100644 index 00000000..77362883 Binary files /dev/null and b/src/dataset/water_lily/29130697437_2de39e0e70_c.jpg differ diff --git a/src/dataset/water_lily/29185164612_ae8e18a1c9_c.jpg b/src/dataset/water_lily/29185164612_ae8e18a1c9_c.jpg new file mode 100644 index 00000000..5af770ed Binary files /dev/null and b/src/dataset/water_lily/29185164612_ae8e18a1c9_c.jpg differ diff --git a/src/dataset/water_lily/29202330620_a859379d87_c.jpg b/src/dataset/water_lily/29202330620_a859379d87_c.jpg new file mode 100644 index 00000000..12b77dfd Binary files /dev/null and b/src/dataset/water_lily/29202330620_a859379d87_c.jpg differ diff --git a/src/dataset/water_lily/29240668014_4a69d60ab5_c.jpg b/src/dataset/water_lily/29240668014_4a69d60ab5_c.jpg new file mode 100644 index 00000000..9f2a8ed2 Binary files /dev/null and b/src/dataset/water_lily/29240668014_4a69d60ab5_c.jpg differ diff --git a/src/dataset/water_lily/29253650910_775509ba58_c.jpg b/src/dataset/water_lily/29253650910_775509ba58_c.jpg new file mode 100644 index 00000000..4dc8e5a7 Binary files /dev/null and b/src/dataset/water_lily/29253650910_775509ba58_c.jpg differ diff --git a/src/dataset/water_lily/29287197920_3d6a8a00c3_c.jpg b/src/dataset/water_lily/29287197920_3d6a8a00c3_c.jpg new file mode 100644 index 00000000..e57d56e4 Binary files /dev/null and b/src/dataset/water_lily/29287197920_3d6a8a00c3_c.jpg differ diff --git a/src/dataset/water_lily/29306724163_1cdc4eca7a_c.jpg b/src/dataset/water_lily/29306724163_1cdc4eca7a_c.jpg new file mode 100644 index 00000000..c0e2ac71 Binary files /dev/null and b/src/dataset/water_lily/29306724163_1cdc4eca7a_c.jpg differ diff --git a/src/dataset/water_lily/29317104211_81dbd9d7d0_c.jpg b/src/dataset/water_lily/29317104211_81dbd9d7d0_c.jpg new file mode 100644 index 00000000..f22c19a3 Binary files /dev/null and b/src/dataset/water_lily/29317104211_81dbd9d7d0_c.jpg differ diff --git a/src/dataset/water_lily/29352074451_753c0e10a6_c.jpg b/src/dataset/water_lily/29352074451_753c0e10a6_c.jpg new file mode 100644 index 00000000..aa350da6 Binary files /dev/null and b/src/dataset/water_lily/29352074451_753c0e10a6_c.jpg differ diff --git a/src/dataset/water_lily/29370580923_a04005699c_c.jpg b/src/dataset/water_lily/29370580923_a04005699c_c.jpg new file mode 100644 index 00000000..8db92db4 Binary files /dev/null and b/src/dataset/water_lily/29370580923_a04005699c_c.jpg differ diff --git a/src/dataset/water_lily/2937815329_fbe8539611_c.jpg b/src/dataset/water_lily/2937815329_fbe8539611_c.jpg new file mode 100644 index 00000000..18199be0 Binary files /dev/null and b/src/dataset/water_lily/2937815329_fbe8539611_c.jpg differ diff --git a/src/dataset/water_lily/2938673186_39108ecc34_c.jpg b/src/dataset/water_lily/2938673186_39108ecc34_c.jpg new file mode 100644 index 00000000..d4bef744 Binary files /dev/null and b/src/dataset/water_lily/2938673186_39108ecc34_c.jpg differ diff --git a/src/dataset/water_lily/29391206165_d7cb2a3afa_c.jpg b/src/dataset/water_lily/29391206165_d7cb2a3afa_c.jpg new file mode 100644 index 00000000..c07e048d Binary files /dev/null and b/src/dataset/water_lily/29391206165_d7cb2a3afa_c.jpg differ diff --git a/src/dataset/water_lily/29405247590_6f0142d9f7_c.jpg b/src/dataset/water_lily/29405247590_6f0142d9f7_c.jpg new file mode 100644 index 00000000..380bf271 Binary files /dev/null and b/src/dataset/water_lily/29405247590_6f0142d9f7_c.jpg differ diff --git a/src/dataset/water_lily/29411642815_810edf1a96_c.jpg b/src/dataset/water_lily/29411642815_810edf1a96_c.jpg new file mode 100644 index 00000000..2594bbef Binary files /dev/null and b/src/dataset/water_lily/29411642815_810edf1a96_c.jpg differ diff --git a/src/dataset/water_lily/29446172605_95922319dd_c.jpg b/src/dataset/water_lily/29446172605_95922319dd_c.jpg new file mode 100644 index 00000000..c837d073 Binary files /dev/null and b/src/dataset/water_lily/29446172605_95922319dd_c.jpg differ diff --git a/src/dataset/water_lily/29455934337_5a93e62ae7_c.jpg b/src/dataset/water_lily/29455934337_5a93e62ae7_c.jpg new file mode 100644 index 00000000..8280290e Binary files /dev/null and b/src/dataset/water_lily/29455934337_5a93e62ae7_c.jpg differ diff --git a/src/dataset/water_lily/29471952734_1e6446dcc4_c.jpg b/src/dataset/water_lily/29471952734_1e6446dcc4_c.jpg new file mode 100644 index 00000000..09e83d93 Binary files /dev/null and b/src/dataset/water_lily/29471952734_1e6446dcc4_c.jpg differ diff --git a/src/dataset/water_lily/29481328402_79e6dccea7_c.jpg b/src/dataset/water_lily/29481328402_79e6dccea7_c.jpg new file mode 100644 index 00000000..d30a829a Binary files /dev/null and b/src/dataset/water_lily/29481328402_79e6dccea7_c.jpg differ diff --git a/src/dataset/water_lily/29528063916_2588c052bb_c.jpg b/src/dataset/water_lily/29528063916_2588c052bb_c.jpg new file mode 100644 index 00000000..a6c9e9ff Binary files /dev/null and b/src/dataset/water_lily/29528063916_2588c052bb_c.jpg differ diff --git a/src/dataset/water_lily/29587302905_09cde43857_c.jpg b/src/dataset/water_lily/29587302905_09cde43857_c.jpg new file mode 100644 index 00000000..67edf998 Binary files /dev/null and b/src/dataset/water_lily/29587302905_09cde43857_c.jpg differ diff --git a/src/dataset/water_lily/29645429356_c6bd9ecab3_c.jpg b/src/dataset/water_lily/29645429356_c6bd9ecab3_c.jpg new file mode 100644 index 00000000..631ccb42 Binary files /dev/null and b/src/dataset/water_lily/29645429356_c6bd9ecab3_c.jpg differ diff --git a/src/dataset/water_lily/29705560428_c6e7578963_c.jpg b/src/dataset/water_lily/29705560428_c6e7578963_c.jpg new file mode 100644 index 00000000..33a07279 Binary files /dev/null and b/src/dataset/water_lily/29705560428_c6e7578963_c.jpg differ diff --git a/src/dataset/water_lily/29961429585_c74f0e5939_c.jpg b/src/dataset/water_lily/29961429585_c74f0e5939_c.jpg new file mode 100644 index 00000000..5190f9d5 Binary files /dev/null and b/src/dataset/water_lily/29961429585_c74f0e5939_c.jpg differ diff --git a/src/dataset/water_lily/30124498556_fea07c945a_c.jpg b/src/dataset/water_lily/30124498556_fea07c945a_c.jpg new file mode 100644 index 00000000..9fa59191 Binary files /dev/null and b/src/dataset/water_lily/30124498556_fea07c945a_c.jpg differ diff --git a/src/dataset/water_lily/30149228654_812cd4a50e_c.jpg b/src/dataset/water_lily/30149228654_812cd4a50e_c.jpg new file mode 100644 index 00000000..8b29d0f8 Binary files /dev/null and b/src/dataset/water_lily/30149228654_812cd4a50e_c.jpg differ diff --git a/src/dataset/water_lily/30153204563_e7780ed8ba_c.jpg b/src/dataset/water_lily/30153204563_e7780ed8ba_c.jpg new file mode 100644 index 00000000..e4fa6aa7 Binary files /dev/null and b/src/dataset/water_lily/30153204563_e7780ed8ba_c.jpg differ diff --git a/src/dataset/water_lily/30157303013_dc748807e6_c.jpg b/src/dataset/water_lily/30157303013_dc748807e6_c.jpg new file mode 100644 index 00000000..1754c16f Binary files /dev/null and b/src/dataset/water_lily/30157303013_dc748807e6_c.jpg differ diff --git a/src/dataset/water_lily/30182308772_e6dea6d37e_c.jpg b/src/dataset/water_lily/30182308772_e6dea6d37e_c.jpg new file mode 100644 index 00000000..d8f6e3e1 Binary files /dev/null and b/src/dataset/water_lily/30182308772_e6dea6d37e_c.jpg differ diff --git a/src/dataset/water_lily/30339259392_8ae5df2dfa_c.jpg b/src/dataset/water_lily/30339259392_8ae5df2dfa_c.jpg new file mode 100644 index 00000000..f5536e9f Binary files /dev/null and b/src/dataset/water_lily/30339259392_8ae5df2dfa_c.jpg differ diff --git a/src/dataset/water_lily/3039320484_30c9d3c610_c.jpg b/src/dataset/water_lily/3039320484_30c9d3c610_c.jpg new file mode 100644 index 00000000..3346ca3d Binary files /dev/null and b/src/dataset/water_lily/3039320484_30c9d3c610_c.jpg differ diff --git a/src/dataset/water_lily/3040178086_c1a9d8cd6f_c.jpg b/src/dataset/water_lily/3040178086_c1a9d8cd6f_c.jpg new file mode 100644 index 00000000..bfc4eafc Binary files /dev/null and b/src/dataset/water_lily/3040178086_c1a9d8cd6f_c.jpg differ diff --git a/src/dataset/water_lily/30558714303_6851149c51_c.jpg b/src/dataset/water_lily/30558714303_6851149c51_c.jpg new file mode 100644 index 00000000..d99aaec0 Binary files /dev/null and b/src/dataset/water_lily/30558714303_6851149c51_c.jpg differ diff --git a/src/dataset/water_lily/30603027060_6175f3f918_c.jpg b/src/dataset/water_lily/30603027060_6175f3f918_c.jpg new file mode 100644 index 00000000..394ad2fe Binary files /dev/null and b/src/dataset/water_lily/30603027060_6175f3f918_c.jpg differ diff --git a/src/dataset/water_lily/30652156538_72b938234f_c.jpg b/src/dataset/water_lily/30652156538_72b938234f_c.jpg new file mode 100644 index 00000000..f9d711b1 Binary files /dev/null and b/src/dataset/water_lily/30652156538_72b938234f_c.jpg differ diff --git a/src/dataset/water_lily/30825495153_49548deef8_c.jpg b/src/dataset/water_lily/30825495153_49548deef8_c.jpg new file mode 100644 index 00000000..1e1e28ff Binary files /dev/null and b/src/dataset/water_lily/30825495153_49548deef8_c.jpg differ diff --git a/src/dataset/water_lily/30941088771_b81e70651f_c.jpg b/src/dataset/water_lily/30941088771_b81e70651f_c.jpg new file mode 100644 index 00000000..4ffd7a17 Binary files /dev/null and b/src/dataset/water_lily/30941088771_b81e70651f_c.jpg differ diff --git a/src/dataset/water_lily/31053915401_8a67014381_c.jpg b/src/dataset/water_lily/31053915401_8a67014381_c.jpg new file mode 100644 index 00000000..9162c71e Binary files /dev/null and b/src/dataset/water_lily/31053915401_8a67014381_c.jpg differ diff --git a/src/dataset/water_lily/31268426302_2579821bc5_c.jpg b/src/dataset/water_lily/31268426302_2579821bc5_c.jpg new file mode 100644 index 00000000..0daf2b92 Binary files /dev/null and b/src/dataset/water_lily/31268426302_2579821bc5_c.jpg differ diff --git a/src/dataset/water_lily/31289886025_ecc73fec85_c.jpg b/src/dataset/water_lily/31289886025_ecc73fec85_c.jpg new file mode 100644 index 00000000..9b5f5431 Binary files /dev/null and b/src/dataset/water_lily/31289886025_ecc73fec85_c.jpg differ diff --git a/src/dataset/water_lily/31407449713_1a59e3fb4a_c.jpg b/src/dataset/water_lily/31407449713_1a59e3fb4a_c.jpg new file mode 100644 index 00000000..bfba68eb Binary files /dev/null and b/src/dataset/water_lily/31407449713_1a59e3fb4a_c.jpg differ diff --git a/src/dataset/water_lily/31452057810_38a8573fa6_c.jpg b/src/dataset/water_lily/31452057810_38a8573fa6_c.jpg new file mode 100644 index 00000000..1f1d1339 Binary files /dev/null and b/src/dataset/water_lily/31452057810_38a8573fa6_c.jpg differ diff --git a/src/dataset/water_lily/31470616735_bc02469faf_c.jpg b/src/dataset/water_lily/31470616735_bc02469faf_c.jpg new file mode 100644 index 00000000..8cbc302b Binary files /dev/null and b/src/dataset/water_lily/31470616735_bc02469faf_c.jpg differ diff --git a/src/dataset/water_lily/31544540835_04a66b3e9b_c.jpg b/src/dataset/water_lily/31544540835_04a66b3e9b_c.jpg new file mode 100644 index 00000000..2ec0b05c Binary files /dev/null and b/src/dataset/water_lily/31544540835_04a66b3e9b_c.jpg differ diff --git a/src/dataset/water_lily/31554949686_88610c6b2d_c.jpg b/src/dataset/water_lily/31554949686_88610c6b2d_c.jpg new file mode 100644 index 00000000..cc1b6c7b Binary files /dev/null and b/src/dataset/water_lily/31554949686_88610c6b2d_c.jpg differ diff --git a/src/dataset/water_lily/31561774260_0e1aa4898a_c.jpg b/src/dataset/water_lily/31561774260_0e1aa4898a_c.jpg new file mode 100644 index 00000000..7338a9f9 Binary files /dev/null and b/src/dataset/water_lily/31561774260_0e1aa4898a_c.jpg differ diff --git a/src/dataset/water_lily/31633990812_f4ddb9d538_c.jpg b/src/dataset/water_lily/31633990812_f4ddb9d538_c.jpg new file mode 100644 index 00000000..d7d3b576 Binary files /dev/null and b/src/dataset/water_lily/31633990812_f4ddb9d538_c.jpg differ diff --git a/src/dataset/water_lily/31738421404_6c322264ce_c.jpg b/src/dataset/water_lily/31738421404_6c322264ce_c.jpg new file mode 100644 index 00000000..b1a758da Binary files /dev/null and b/src/dataset/water_lily/31738421404_6c322264ce_c.jpg differ diff --git a/src/dataset/water_lily/31752366074_dd2b7901ce_c.jpg b/src/dataset/water_lily/31752366074_dd2b7901ce_c.jpg new file mode 100644 index 00000000..cf83b758 Binary files /dev/null and b/src/dataset/water_lily/31752366074_dd2b7901ce_c.jpg differ diff --git a/src/dataset/water_lily/31899191858_82a57bcf8b_c.jpg b/src/dataset/water_lily/31899191858_82a57bcf8b_c.jpg new file mode 100644 index 00000000..9bafc5d3 Binary files /dev/null and b/src/dataset/water_lily/31899191858_82a57bcf8b_c.jpg differ diff --git a/src/dataset/water_lily/31918692497_d4692b9a3b_c.jpg b/src/dataset/water_lily/31918692497_d4692b9a3b_c.jpg new file mode 100644 index 00000000..bda7ec50 Binary files /dev/null and b/src/dataset/water_lily/31918692497_d4692b9a3b_c.jpg differ diff --git a/src/dataset/water_lily/31922157587_d7cfea5f54_c.jpg b/src/dataset/water_lily/31922157587_d7cfea5f54_c.jpg new file mode 100644 index 00000000..8d78b728 Binary files /dev/null and b/src/dataset/water_lily/31922157587_d7cfea5f54_c.jpg differ diff --git a/src/dataset/water_lily/31979478996_1a08ba095a_c.jpg b/src/dataset/water_lily/31979478996_1a08ba095a_c.jpg new file mode 100644 index 00000000..83c4e864 Binary files /dev/null and b/src/dataset/water_lily/31979478996_1a08ba095a_c.jpg differ diff --git a/src/dataset/water_lily/3211456411_884db84be0_c.jpg b/src/dataset/water_lily/3211456411_884db84be0_c.jpg new file mode 100644 index 00000000..03c7572a Binary files /dev/null and b/src/dataset/water_lily/3211456411_884db84be0_c.jpg differ diff --git a/src/dataset/water_lily/32254956148_9a25d6d3d8_c.jpg b/src/dataset/water_lily/32254956148_9a25d6d3d8_c.jpg new file mode 100644 index 00000000..080a49ff Binary files /dev/null and b/src/dataset/water_lily/32254956148_9a25d6d3d8_c.jpg differ diff --git a/src/dataset/water_lily/32545201726_03b411b0de_c.jpg b/src/dataset/water_lily/32545201726_03b411b0de_c.jpg new file mode 100644 index 00000000..a044d0a3 Binary files /dev/null and b/src/dataset/water_lily/32545201726_03b411b0de_c.jpg differ diff --git a/src/dataset/water_lily/32612341185_8dd4670cf2_c.jpg b/src/dataset/water_lily/32612341185_8dd4670cf2_c.jpg new file mode 100644 index 00000000..f0b19372 Binary files /dev/null and b/src/dataset/water_lily/32612341185_8dd4670cf2_c.jpg differ diff --git a/src/dataset/water_lily/32625487667_900100406f_c.jpg b/src/dataset/water_lily/32625487667_900100406f_c.jpg new file mode 100644 index 00000000..08482817 Binary files /dev/null and b/src/dataset/water_lily/32625487667_900100406f_c.jpg differ diff --git a/src/dataset/water_lily/32650970406_4108c0c6c8_c.jpg b/src/dataset/water_lily/32650970406_4108c0c6c8_c.jpg new file mode 100644 index 00000000..78e01cc3 Binary files /dev/null and b/src/dataset/water_lily/32650970406_4108c0c6c8_c.jpg differ diff --git a/src/dataset/water_lily/32843073748_0759340d97_c.jpg b/src/dataset/water_lily/32843073748_0759340d97_c.jpg new file mode 100644 index 00000000..d8a46807 Binary files /dev/null and b/src/dataset/water_lily/32843073748_0759340d97_c.jpg differ diff --git a/src/dataset/water_lily/32918200068_a439cf4322_c.jpg b/src/dataset/water_lily/32918200068_a439cf4322_c.jpg new file mode 100644 index 00000000..affb43af Binary files /dev/null and b/src/dataset/water_lily/32918200068_a439cf4322_c.jpg differ diff --git a/src/dataset/water_lily/33422456168_a51c9666a8_c.jpg b/src/dataset/water_lily/33422456168_a51c9666a8_c.jpg new file mode 100644 index 00000000..8ab60f0a Binary files /dev/null and b/src/dataset/water_lily/33422456168_a51c9666a8_c.jpg differ diff --git a/src/dataset/water_lily/33443485342_2663c69c8d_c.jpg b/src/dataset/water_lily/33443485342_2663c69c8d_c.jpg new file mode 100644 index 00000000..6ef6c80b Binary files /dev/null and b/src/dataset/water_lily/33443485342_2663c69c8d_c.jpg differ diff --git a/src/dataset/water_lily/33536228608_a267e7b41c_c.jpg b/src/dataset/water_lily/33536228608_a267e7b41c_c.jpg new file mode 100644 index 00000000..c5d3ab04 Binary files /dev/null and b/src/dataset/water_lily/33536228608_a267e7b41c_c.jpg differ diff --git a/src/dataset/water_lily/33609783608_3594510083_c.jpg b/src/dataset/water_lily/33609783608_3594510083_c.jpg new file mode 100644 index 00000000..b773613b Binary files /dev/null and b/src/dataset/water_lily/33609783608_3594510083_c.jpg differ diff --git a/src/dataset/water_lily/33687704748_042be8ea7c_c.jpg b/src/dataset/water_lily/33687704748_042be8ea7c_c.jpg new file mode 100644 index 00000000..cc5d4347 Binary files /dev/null and b/src/dataset/water_lily/33687704748_042be8ea7c_c.jpg differ diff --git a/src/dataset/water_lily/33851968528_3880e9efdb_c.jpg b/src/dataset/water_lily/33851968528_3880e9efdb_c.jpg new file mode 100644 index 00000000..ab3e9915 Binary files /dev/null and b/src/dataset/water_lily/33851968528_3880e9efdb_c.jpg differ diff --git a/src/dataset/water_lily/33899892818_66d6d0ccb0_c.jpg b/src/dataset/water_lily/33899892818_66d6d0ccb0_c.jpg new file mode 100644 index 00000000..750b1781 Binary files /dev/null and b/src/dataset/water_lily/33899892818_66d6d0ccb0_c.jpg differ diff --git a/src/dataset/water_lily/34272742595_616769e3b1_c.jpg b/src/dataset/water_lily/34272742595_616769e3b1_c.jpg new file mode 100644 index 00000000..0ce3c804 Binary files /dev/null and b/src/dataset/water_lily/34272742595_616769e3b1_c.jpg differ diff --git a/src/dataset/water_lily/34327725623_7809ef8b0d_c.jpg b/src/dataset/water_lily/34327725623_7809ef8b0d_c.jpg new file mode 100644 index 00000000..9cd9f9df Binary files /dev/null and b/src/dataset/water_lily/34327725623_7809ef8b0d_c.jpg differ diff --git a/src/dataset/water_lily/34539721653_90ec878a9b_c.jpg b/src/dataset/water_lily/34539721653_90ec878a9b_c.jpg new file mode 100644 index 00000000..e96efc3f Binary files /dev/null and b/src/dataset/water_lily/34539721653_90ec878a9b_c.jpg differ diff --git a/src/dataset/water_lily/34556071346_0a99bdc89f_c.jpg b/src/dataset/water_lily/34556071346_0a99bdc89f_c.jpg new file mode 100644 index 00000000..ab6e1f97 Binary files /dev/null and b/src/dataset/water_lily/34556071346_0a99bdc89f_c.jpg differ diff --git a/src/dataset/water_lily/34659121404_a023019ae0_c.jpg b/src/dataset/water_lily/34659121404_a023019ae0_c.jpg new file mode 100644 index 00000000..d8d8990f Binary files /dev/null and b/src/dataset/water_lily/34659121404_a023019ae0_c.jpg differ diff --git a/src/dataset/water_lily/34675246092_3f6354f6b0_c.jpg b/src/dataset/water_lily/34675246092_3f6354f6b0_c.jpg new file mode 100644 index 00000000..5fd3c0ac Binary files /dev/null and b/src/dataset/water_lily/34675246092_3f6354f6b0_c.jpg differ diff --git a/src/dataset/water_lily/34686459783_c45369de93_c.jpg b/src/dataset/water_lily/34686459783_c45369de93_c.jpg new file mode 100644 index 00000000..cd8f08b7 Binary files /dev/null and b/src/dataset/water_lily/34686459783_c45369de93_c.jpg differ diff --git a/src/dataset/water_lily/34706597750_9868cd5242_c.jpg b/src/dataset/water_lily/34706597750_9868cd5242_c.jpg new file mode 100644 index 00000000..14538ae9 Binary files /dev/null and b/src/dataset/water_lily/34706597750_9868cd5242_c.jpg differ diff --git a/src/dataset/water_lily/34747638734_2b8d6d57c1_c.jpg b/src/dataset/water_lily/34747638734_2b8d6d57c1_c.jpg new file mode 100644 index 00000000..3b7b0bb2 Binary files /dev/null and b/src/dataset/water_lily/34747638734_2b8d6d57c1_c.jpg differ diff --git a/src/dataset/water_lily/3476530450_34b855d543_c.jpg b/src/dataset/water_lily/3476530450_34b855d543_c.jpg new file mode 100644 index 00000000..1f049a63 Binary files /dev/null and b/src/dataset/water_lily/3476530450_34b855d543_c.jpg differ diff --git a/src/dataset/water_lily/34779998313_26cd65b8ef_c.jpg b/src/dataset/water_lily/34779998313_26cd65b8ef_c.jpg new file mode 100644 index 00000000..b9dcf15d Binary files /dev/null and b/src/dataset/water_lily/34779998313_26cd65b8ef_c.jpg differ diff --git a/src/dataset/water_lily/34804426690_d896c741da_c.jpg b/src/dataset/water_lily/34804426690_d896c741da_c.jpg new file mode 100644 index 00000000..00d5195e Binary files /dev/null and b/src/dataset/water_lily/34804426690_d896c741da_c.jpg differ diff --git a/src/dataset/water_lily/34893770754_0427bd6d7f_c.jpg b/src/dataset/water_lily/34893770754_0427bd6d7f_c.jpg new file mode 100644 index 00000000..d212b9aa Binary files /dev/null and b/src/dataset/water_lily/34893770754_0427bd6d7f_c.jpg differ diff --git a/src/dataset/water_lily/34896969880_cab8f6247a_c.jpg b/src/dataset/water_lily/34896969880_cab8f6247a_c.jpg new file mode 100644 index 00000000..39877208 Binary files /dev/null and b/src/dataset/water_lily/34896969880_cab8f6247a_c.jpg differ diff --git a/src/dataset/water_lily/34941418194_70788f9838_c.jpg b/src/dataset/water_lily/34941418194_70788f9838_c.jpg new file mode 100644 index 00000000..8daaa727 Binary files /dev/null and b/src/dataset/water_lily/34941418194_70788f9838_c.jpg differ diff --git a/src/dataset/water_lily/34948385291_d580cdd7be_c.jpg b/src/dataset/water_lily/34948385291_d580cdd7be_c.jpg new file mode 100644 index 00000000..751c1523 Binary files /dev/null and b/src/dataset/water_lily/34948385291_d580cdd7be_c.jpg differ diff --git a/src/dataset/water_lily/34955707314_9d646211cc_c.jpg b/src/dataset/water_lily/34955707314_9d646211cc_c.jpg new file mode 100644 index 00000000..63408064 Binary files /dev/null and b/src/dataset/water_lily/34955707314_9d646211cc_c.jpg differ diff --git a/src/dataset/water_lily/34960269513_a45051893b_c.jpg b/src/dataset/water_lily/34960269513_a45051893b_c.jpg new file mode 100644 index 00000000..fbf64553 Binary files /dev/null and b/src/dataset/water_lily/34960269513_a45051893b_c.jpg differ diff --git a/src/dataset/water_lily/35034485101_67b0fca4f1_c.jpg b/src/dataset/water_lily/35034485101_67b0fca4f1_c.jpg new file mode 100644 index 00000000..2e6691f5 Binary files /dev/null and b/src/dataset/water_lily/35034485101_67b0fca4f1_c.jpg differ diff --git a/src/dataset/water_lily/35045450985_fd57929bf5_c.jpg b/src/dataset/water_lily/35045450985_fd57929bf5_c.jpg new file mode 100644 index 00000000..25428833 Binary files /dev/null and b/src/dataset/water_lily/35045450985_fd57929bf5_c.jpg differ diff --git a/src/dataset/water_lily/3509924949_be64e04470_c.jpg b/src/dataset/water_lily/3509924949_be64e04470_c.jpg new file mode 100644 index 00000000..aeb42a71 Binary files /dev/null and b/src/dataset/water_lily/3509924949_be64e04470_c.jpg differ diff --git a/src/dataset/water_lily/35268897364_d45f87cdce_c.jpg b/src/dataset/water_lily/35268897364_d45f87cdce_c.jpg new file mode 100644 index 00000000..0b7dbbb6 Binary files /dev/null and b/src/dataset/water_lily/35268897364_d45f87cdce_c.jpg differ diff --git a/src/dataset/water_lily/35310088852_d4a06f3a22_c.jpg b/src/dataset/water_lily/35310088852_d4a06f3a22_c.jpg new file mode 100644 index 00000000..e38df42b Binary files /dev/null and b/src/dataset/water_lily/35310088852_d4a06f3a22_c.jpg differ diff --git a/src/dataset/water_lily/35338351330_746fce1430_c.jpg b/src/dataset/water_lily/35338351330_746fce1430_c.jpg new file mode 100644 index 00000000..d39b0ec7 Binary files /dev/null and b/src/dataset/water_lily/35338351330_746fce1430_c.jpg differ diff --git a/src/dataset/water_lily/35341634130_1116064683_c.jpg b/src/dataset/water_lily/35341634130_1116064683_c.jpg new file mode 100644 index 00000000..4543e2e5 Binary files /dev/null and b/src/dataset/water_lily/35341634130_1116064683_c.jpg differ diff --git a/src/dataset/water_lily/35389584643_366b691acb_c.jpg b/src/dataset/water_lily/35389584643_366b691acb_c.jpg new file mode 100644 index 00000000..37023f8b Binary files /dev/null and b/src/dataset/water_lily/35389584643_366b691acb_c.jpg differ diff --git a/src/dataset/water_lily/35415559103_44701a699b_c.jpg b/src/dataset/water_lily/35415559103_44701a699b_c.jpg new file mode 100644 index 00000000..06c328ba Binary files /dev/null and b/src/dataset/water_lily/35415559103_44701a699b_c.jpg differ diff --git a/src/dataset/water_lily/35502017172_d88d3ab19c_c.jpg b/src/dataset/water_lily/35502017172_d88d3ab19c_c.jpg new file mode 100644 index 00000000..ad0d1cfd Binary files /dev/null and b/src/dataset/water_lily/35502017172_d88d3ab19c_c.jpg differ diff --git a/src/dataset/water_lily/35525817833_29721b7959_c.jpg b/src/dataset/water_lily/35525817833_29721b7959_c.jpg new file mode 100644 index 00000000..fd94867a Binary files /dev/null and b/src/dataset/water_lily/35525817833_29721b7959_c.jpg differ diff --git a/src/dataset/water_lily/35544067535_6fc069bb25_c.jpg b/src/dataset/water_lily/35544067535_6fc069bb25_c.jpg new file mode 100644 index 00000000..3a9c60f6 Binary files /dev/null and b/src/dataset/water_lily/35544067535_6fc069bb25_c.jpg differ diff --git a/src/dataset/water_lily/35568806941_20091fd6ae_c.jpg b/src/dataset/water_lily/35568806941_20091fd6ae_c.jpg new file mode 100644 index 00000000..f02fb104 Binary files /dev/null and b/src/dataset/water_lily/35568806941_20091fd6ae_c.jpg differ diff --git a/src/dataset/water_lily/35578643983_96f1f8930f_c.jpg b/src/dataset/water_lily/35578643983_96f1f8930f_c.jpg new file mode 100644 index 00000000..1e7d0b41 Binary files /dev/null and b/src/dataset/water_lily/35578643983_96f1f8930f_c.jpg differ diff --git a/src/dataset/water_lily/35651200791_c2860a41c9_c.jpg b/src/dataset/water_lily/35651200791_c2860a41c9_c.jpg new file mode 100644 index 00000000..f27d524b Binary files /dev/null and b/src/dataset/water_lily/35651200791_c2860a41c9_c.jpg differ diff --git a/src/dataset/water_lily/3565696061_8e489849e0_c.jpg b/src/dataset/water_lily/3565696061_8e489849e0_c.jpg new file mode 100644 index 00000000..a5807cce Binary files /dev/null and b/src/dataset/water_lily/3565696061_8e489849e0_c.jpg differ diff --git a/src/dataset/water_lily/35793773795_966c3988b2_c.jpg b/src/dataset/water_lily/35793773795_966c3988b2_c.jpg new file mode 100644 index 00000000..178d3bba Binary files /dev/null and b/src/dataset/water_lily/35793773795_966c3988b2_c.jpg differ diff --git a/src/dataset/water_lily/35799297142_bf9c63c68e_c.jpg b/src/dataset/water_lily/35799297142_bf9c63c68e_c.jpg new file mode 100644 index 00000000..5659bed3 Binary files /dev/null and b/src/dataset/water_lily/35799297142_bf9c63c68e_c.jpg differ diff --git a/src/dataset/water_lily/35845576790_a214fab47e_c.jpg b/src/dataset/water_lily/35845576790_a214fab47e_c.jpg new file mode 100644 index 00000000..033a13b1 Binary files /dev/null and b/src/dataset/water_lily/35845576790_a214fab47e_c.jpg differ diff --git a/src/dataset/water_lily/35845579000_bd66af47cd_c.jpg b/src/dataset/water_lily/35845579000_bd66af47cd_c.jpg new file mode 100644 index 00000000..91c88eb7 Binary files /dev/null and b/src/dataset/water_lily/35845579000_bd66af47cd_c.jpg differ diff --git a/src/dataset/water_lily/35860530476_9d04f48f81_c.jpg b/src/dataset/water_lily/35860530476_9d04f48f81_c.jpg new file mode 100644 index 00000000..88c356e5 Binary files /dev/null and b/src/dataset/water_lily/35860530476_9d04f48f81_c.jpg differ diff --git a/src/dataset/water_lily/35924644481_47c0b6d595_c.jpg b/src/dataset/water_lily/35924644481_47c0b6d595_c.jpg new file mode 100644 index 00000000..7c790656 Binary files /dev/null and b/src/dataset/water_lily/35924644481_47c0b6d595_c.jpg differ diff --git a/src/dataset/water_lily/35960410453_fba6525ccb_c.jpg b/src/dataset/water_lily/35960410453_fba6525ccb_c.jpg new file mode 100644 index 00000000..e4713baa Binary files /dev/null and b/src/dataset/water_lily/35960410453_fba6525ccb_c.jpg differ diff --git a/src/dataset/water_lily/35999873916_d8c22c710f_c.jpg b/src/dataset/water_lily/35999873916_d8c22c710f_c.jpg new file mode 100644 index 00000000..3d349272 Binary files /dev/null and b/src/dataset/water_lily/35999873916_d8c22c710f_c.jpg differ diff --git a/src/dataset/water_lily/36053902933_6dfd377a15_c.jpg b/src/dataset/water_lily/36053902933_6dfd377a15_c.jpg new file mode 100644 index 00000000..622f0719 Binary files /dev/null and b/src/dataset/water_lily/36053902933_6dfd377a15_c.jpg differ diff --git a/src/dataset/water_lily/36145782586_000a721b4d_c.jpg b/src/dataset/water_lily/36145782586_000a721b4d_c.jpg new file mode 100644 index 00000000..c144b064 Binary files /dev/null and b/src/dataset/water_lily/36145782586_000a721b4d_c.jpg differ diff --git a/src/dataset/water_lily/36150929056_9026beb3de_c.jpg b/src/dataset/water_lily/36150929056_9026beb3de_c.jpg new file mode 100644 index 00000000..a79816bc Binary files /dev/null and b/src/dataset/water_lily/36150929056_9026beb3de_c.jpg differ diff --git a/src/dataset/water_lily/36225123472_be1a7ba2be_c.jpg b/src/dataset/water_lily/36225123472_be1a7ba2be_c.jpg new file mode 100644 index 00000000..80a49191 Binary files /dev/null and b/src/dataset/water_lily/36225123472_be1a7ba2be_c.jpg differ diff --git a/src/dataset/water_lily/36336208876_7a144bda33_c.jpg b/src/dataset/water_lily/36336208876_7a144bda33_c.jpg new file mode 100644 index 00000000..a82a8b67 Binary files /dev/null and b/src/dataset/water_lily/36336208876_7a144bda33_c.jpg differ diff --git a/src/dataset/water_lily/36336654370_d89cb8e61f_c.jpg b/src/dataset/water_lily/36336654370_d89cb8e61f_c.jpg new file mode 100644 index 00000000..74bc136e Binary files /dev/null and b/src/dataset/water_lily/36336654370_d89cb8e61f_c.jpg differ diff --git a/src/dataset/water_lily/3636415436_0886b27cfd_c.jpg b/src/dataset/water_lily/3636415436_0886b27cfd_c.jpg new file mode 100644 index 00000000..6191e0e0 Binary files /dev/null and b/src/dataset/water_lily/3636415436_0886b27cfd_c.jpg differ diff --git a/src/dataset/water_lily/3642944177_9c6dff5c76_c.jpg b/src/dataset/water_lily/3642944177_9c6dff5c76_c.jpg new file mode 100644 index 00000000..ea4914a4 Binary files /dev/null and b/src/dataset/water_lily/3642944177_9c6dff5c76_c.jpg differ diff --git a/src/dataset/water_lily/36441763872_a3d8386980_c.jpg b/src/dataset/water_lily/36441763872_a3d8386980_c.jpg new file mode 100644 index 00000000..bc9f9114 Binary files /dev/null and b/src/dataset/water_lily/36441763872_a3d8386980_c.jpg differ diff --git a/src/dataset/water_lily/36551129185_c03fcf41f8_c.jpg b/src/dataset/water_lily/36551129185_c03fcf41f8_c.jpg new file mode 100644 index 00000000..998d3b14 Binary files /dev/null and b/src/dataset/water_lily/36551129185_c03fcf41f8_c.jpg differ diff --git a/src/dataset/water_lily/36594589491_7ff072c318_c.jpg b/src/dataset/water_lily/36594589491_7ff072c318_c.jpg new file mode 100644 index 00000000..fea7bbda Binary files /dev/null and b/src/dataset/water_lily/36594589491_7ff072c318_c.jpg differ diff --git a/src/dataset/water_lily/36749086022_49d0bc69e4_c.jpg b/src/dataset/water_lily/36749086022_49d0bc69e4_c.jpg new file mode 100644 index 00000000..135f9ccd Binary files /dev/null and b/src/dataset/water_lily/36749086022_49d0bc69e4_c.jpg differ diff --git a/src/dataset/water_lily/36761660096_7c091095aa_c.jpg b/src/dataset/water_lily/36761660096_7c091095aa_c.jpg new file mode 100644 index 00000000..f666cb69 Binary files /dev/null and b/src/dataset/water_lily/36761660096_7c091095aa_c.jpg differ diff --git a/src/dataset/water_lily/36796521566_d3f2d3f60a_c.jpg b/src/dataset/water_lily/36796521566_d3f2d3f60a_c.jpg new file mode 100644 index 00000000..c1bb4cce Binary files /dev/null and b/src/dataset/water_lily/36796521566_d3f2d3f60a_c.jpg differ diff --git a/src/dataset/water_lily/36803966286_a97035e120_c.jpg b/src/dataset/water_lily/36803966286_a97035e120_c.jpg new file mode 100644 index 00000000..0caadbf5 Binary files /dev/null and b/src/dataset/water_lily/36803966286_a97035e120_c.jpg differ diff --git a/src/dataset/water_lily/37055136084_bfb51f6040_c.jpg b/src/dataset/water_lily/37055136084_bfb51f6040_c.jpg new file mode 100644 index 00000000..6b1a2234 Binary files /dev/null and b/src/dataset/water_lily/37055136084_bfb51f6040_c.jpg differ diff --git a/src/dataset/water_lily/37083037405_bd980e1d1d_c.jpg b/src/dataset/water_lily/37083037405_bd980e1d1d_c.jpg new file mode 100644 index 00000000..9551f932 Binary files /dev/null and b/src/dataset/water_lily/37083037405_bd980e1d1d_c.jpg differ diff --git a/src/dataset/water_lily/37104024350_8cec1a1681_c.jpg b/src/dataset/water_lily/37104024350_8cec1a1681_c.jpg new file mode 100644 index 00000000..4fc5a434 Binary files /dev/null and b/src/dataset/water_lily/37104024350_8cec1a1681_c.jpg differ diff --git a/src/dataset/water_lily/3753768906_8150dab2f9_c.jpg b/src/dataset/water_lily/3753768906_8150dab2f9_c.jpg new file mode 100644 index 00000000..d0a6a3cf Binary files /dev/null and b/src/dataset/water_lily/3753768906_8150dab2f9_c.jpg differ diff --git a/src/dataset/water_lily/375534490_c9e9a062f4_c.jpg b/src/dataset/water_lily/375534490_c9e9a062f4_c.jpg new file mode 100644 index 00000000..ea98bd1e Binary files /dev/null and b/src/dataset/water_lily/375534490_c9e9a062f4_c.jpg differ diff --git a/src/dataset/water_lily/3782185225_e27eb59036_c.jpg b/src/dataset/water_lily/3782185225_e27eb59036_c.jpg new file mode 100644 index 00000000..2d388ed7 Binary files /dev/null and b/src/dataset/water_lily/3782185225_e27eb59036_c.jpg differ diff --git a/src/dataset/water_lily/3783684368_93b77eb77b_c.jpg b/src/dataset/water_lily/3783684368_93b77eb77b_c.jpg new file mode 100644 index 00000000..24944292 Binary files /dev/null and b/src/dataset/water_lily/3783684368_93b77eb77b_c.jpg differ diff --git a/src/dataset/water_lily/3787175666_da0a5134fa_c.jpg b/src/dataset/water_lily/3787175666_da0a5134fa_c.jpg new file mode 100644 index 00000000..bd419a00 Binary files /dev/null and b/src/dataset/water_lily/3787175666_da0a5134fa_c.jpg differ diff --git a/src/dataset/water_lily/3797669310_27fb24af5d_c.jpg b/src/dataset/water_lily/3797669310_27fb24af5d_c.jpg new file mode 100644 index 00000000..a70cf847 Binary files /dev/null and b/src/dataset/water_lily/3797669310_27fb24af5d_c.jpg differ diff --git a/src/dataset/water_lily/3819747149_0581ec082c_c.jpg b/src/dataset/water_lily/3819747149_0581ec082c_c.jpg new file mode 100644 index 00000000..990140b0 Binary files /dev/null and b/src/dataset/water_lily/3819747149_0581ec082c_c.jpg differ diff --git a/src/dataset/water_lily/3848537001_fc53e1c47b_c.jpg b/src/dataset/water_lily/3848537001_fc53e1c47b_c.jpg new file mode 100644 index 00000000..0d65666e Binary files /dev/null and b/src/dataset/water_lily/3848537001_fc53e1c47b_c.jpg differ diff --git a/src/dataset/water_lily/3848616705_9ec22582d9_c.jpg b/src/dataset/water_lily/3848616705_9ec22582d9_c.jpg new file mode 100644 index 00000000..195d78a8 Binary files /dev/null and b/src/dataset/water_lily/3848616705_9ec22582d9_c.jpg differ diff --git a/src/dataset/water_lily/38496219496_b9f510f87a_c.jpg b/src/dataset/water_lily/38496219496_b9f510f87a_c.jpg new file mode 100644 index 00000000..1350620c Binary files /dev/null and b/src/dataset/water_lily/38496219496_b9f510f87a_c.jpg differ diff --git a/src/dataset/water_lily/38758228635_23bd371106_c.jpg b/src/dataset/water_lily/38758228635_23bd371106_c.jpg new file mode 100644 index 00000000..a8a8603a Binary files /dev/null and b/src/dataset/water_lily/38758228635_23bd371106_c.jpg differ diff --git a/src/dataset/water_lily/38779976424_c90efab024_c.jpg b/src/dataset/water_lily/38779976424_c90efab024_c.jpg new file mode 100644 index 00000000..71ab8d20 Binary files /dev/null and b/src/dataset/water_lily/38779976424_c90efab024_c.jpg differ diff --git a/src/dataset/water_lily/3880312795_ee375a54bd_c.jpg b/src/dataset/water_lily/3880312795_ee375a54bd_c.jpg new file mode 100644 index 00000000..f133d3c5 Binary files /dev/null and b/src/dataset/water_lily/3880312795_ee375a54bd_c.jpg differ diff --git a/src/dataset/water_lily/3907025075_166fbc0866_c.jpg b/src/dataset/water_lily/3907025075_166fbc0866_c.jpg new file mode 100644 index 00000000..717d8150 Binary files /dev/null and b/src/dataset/water_lily/3907025075_166fbc0866_c.jpg differ diff --git a/src/dataset/water_lily/3963636579_f80ed27a8c_c.jpg b/src/dataset/water_lily/3963636579_f80ed27a8c_c.jpg new file mode 100644 index 00000000..680aa9b0 Binary files /dev/null and b/src/dataset/water_lily/3963636579_f80ed27a8c_c.jpg differ diff --git a/src/dataset/water_lily/39863516211_207131410a_c.jpg b/src/dataset/water_lily/39863516211_207131410a_c.jpg new file mode 100644 index 00000000..d3c495c9 Binary files /dev/null and b/src/dataset/water_lily/39863516211_207131410a_c.jpg differ diff --git a/src/dataset/water_lily/40167248593_c5211bdd69_c.jpg b/src/dataset/water_lily/40167248593_c5211bdd69_c.jpg new file mode 100644 index 00000000..80991908 Binary files /dev/null and b/src/dataset/water_lily/40167248593_c5211bdd69_c.jpg differ diff --git a/src/dataset/water_lily/40272433082_2dc6eae614_c.jpg b/src/dataset/water_lily/40272433082_2dc6eae614_c.jpg new file mode 100644 index 00000000..762da782 Binary files /dev/null and b/src/dataset/water_lily/40272433082_2dc6eae614_c.jpg differ diff --git a/src/dataset/water_lily/40279894463_8b0f899626_c.jpg b/src/dataset/water_lily/40279894463_8b0f899626_c.jpg new file mode 100644 index 00000000..41efaa15 Binary files /dev/null and b/src/dataset/water_lily/40279894463_8b0f899626_c.jpg differ diff --git a/src/dataset/water_lily/40665930004_c04c59b7e9_c.jpg b/src/dataset/water_lily/40665930004_c04c59b7e9_c.jpg new file mode 100644 index 00000000..c089a572 Binary files /dev/null and b/src/dataset/water_lily/40665930004_c04c59b7e9_c.jpg differ diff --git a/src/dataset/water_lily/40806241950_54d8c7893a_c.jpg b/src/dataset/water_lily/40806241950_54d8c7893a_c.jpg new file mode 100644 index 00000000..964806c0 Binary files /dev/null and b/src/dataset/water_lily/40806241950_54d8c7893a_c.jpg differ diff --git a/src/dataset/water_lily/40819919073_57ef5e0cf4_c.jpg b/src/dataset/water_lily/40819919073_57ef5e0cf4_c.jpg new file mode 100644 index 00000000..bb151bcc Binary files /dev/null and b/src/dataset/water_lily/40819919073_57ef5e0cf4_c.jpg differ diff --git a/src/dataset/water_lily/40917575430_03a1ee7a96_c.jpg b/src/dataset/water_lily/40917575430_03a1ee7a96_c.jpg new file mode 100644 index 00000000..3775f116 Binary files /dev/null and b/src/dataset/water_lily/40917575430_03a1ee7a96_c.jpg differ diff --git a/src/dataset/water_lily/41141284670_6dc7f588a7_c.jpg b/src/dataset/water_lily/41141284670_6dc7f588a7_c.jpg new file mode 100644 index 00000000..779bb41e Binary files /dev/null and b/src/dataset/water_lily/41141284670_6dc7f588a7_c.jpg differ diff --git a/src/dataset/water_lily/41660259904_dcc24f309d_c.jpg b/src/dataset/water_lily/41660259904_dcc24f309d_c.jpg new file mode 100644 index 00000000..7d68332d Binary files /dev/null and b/src/dataset/water_lily/41660259904_dcc24f309d_c.jpg differ diff --git a/src/dataset/water_lily/41892888175_c01bff92fe_c.jpg b/src/dataset/water_lily/41892888175_c01bff92fe_c.jpg new file mode 100644 index 00000000..0d4e9324 Binary files /dev/null and b/src/dataset/water_lily/41892888175_c01bff92fe_c.jpg differ diff --git a/src/dataset/water_lily/41985845920_ba9dd8364f_c.jpg b/src/dataset/water_lily/41985845920_ba9dd8364f_c.jpg new file mode 100644 index 00000000..03d73160 Binary files /dev/null and b/src/dataset/water_lily/41985845920_ba9dd8364f_c.jpg differ diff --git a/src/dataset/water_lily/42443066604_15ce61fe7e_c.jpg b/src/dataset/water_lily/42443066604_15ce61fe7e_c.jpg new file mode 100644 index 00000000..250d6216 Binary files /dev/null and b/src/dataset/water_lily/42443066604_15ce61fe7e_c.jpg differ diff --git a/src/dataset/water_lily/4255735116_48c3b38e49_c.jpg b/src/dataset/water_lily/4255735116_48c3b38e49_c.jpg new file mode 100644 index 00000000..1d97a285 Binary files /dev/null and b/src/dataset/water_lily/4255735116_48c3b38e49_c.jpg differ diff --git a/src/dataset/water_lily/42669286574_0e11355a29_c.jpg b/src/dataset/water_lily/42669286574_0e11355a29_c.jpg new file mode 100644 index 00000000..12c43fd9 Binary files /dev/null and b/src/dataset/water_lily/42669286574_0e11355a29_c.jpg differ diff --git a/src/dataset/water_lily/43048048414_b3f2655fe8_c.jpg b/src/dataset/water_lily/43048048414_b3f2655fe8_c.jpg new file mode 100644 index 00000000..1aa4901f Binary files /dev/null and b/src/dataset/water_lily/43048048414_b3f2655fe8_c.jpg differ diff --git a/src/dataset/water_lily/43048059454_53720f22dd_c.jpg b/src/dataset/water_lily/43048059454_53720f22dd_c.jpg new file mode 100644 index 00000000..05e92658 Binary files /dev/null and b/src/dataset/water_lily/43048059454_53720f22dd_c.jpg differ diff --git a/src/dataset/water_lily/43071183512_f08e651b74_c.jpg b/src/dataset/water_lily/43071183512_f08e651b74_c.jpg new file mode 100644 index 00000000..8e7cfda5 Binary files /dev/null and b/src/dataset/water_lily/43071183512_f08e651b74_c.jpg differ diff --git a/src/dataset/water_lily/4314292857_005536e15c_c.jpg b/src/dataset/water_lily/4314292857_005536e15c_c.jpg new file mode 100644 index 00000000..f5f04ec4 Binary files /dev/null and b/src/dataset/water_lily/4314292857_005536e15c_c.jpg differ diff --git a/src/dataset/water_lily/43718783324_b30cc3f9e1_c.jpg b/src/dataset/water_lily/43718783324_b30cc3f9e1_c.jpg new file mode 100644 index 00000000..3177ce4c Binary files /dev/null and b/src/dataset/water_lily/43718783324_b30cc3f9e1_c.jpg differ diff --git a/src/dataset/water_lily/43862899942_4bb4d41b3f_c.jpg b/src/dataset/water_lily/43862899942_4bb4d41b3f_c.jpg new file mode 100644 index 00000000..b9ec8954 Binary files /dev/null and b/src/dataset/water_lily/43862899942_4bb4d41b3f_c.jpg differ diff --git a/src/dataset/water_lily/44104237970_65f572ddd5_c.jpg b/src/dataset/water_lily/44104237970_65f572ddd5_c.jpg new file mode 100644 index 00000000..48058400 Binary files /dev/null and b/src/dataset/water_lily/44104237970_65f572ddd5_c.jpg differ diff --git a/src/dataset/water_lily/44294748990_1be55d5347_c.jpg b/src/dataset/water_lily/44294748990_1be55d5347_c.jpg new file mode 100644 index 00000000..e4f9c0b0 Binary files /dev/null and b/src/dataset/water_lily/44294748990_1be55d5347_c.jpg differ diff --git a/src/dataset/water_lily/44309187381_77c4474fdc_c.jpg b/src/dataset/water_lily/44309187381_77c4474fdc_c.jpg new file mode 100644 index 00000000..a26fef8b Binary files /dev/null and b/src/dataset/water_lily/44309187381_77c4474fdc_c.jpg differ diff --git a/src/dataset/water_lily/44581958944_6bb49ac29d_c.jpg b/src/dataset/water_lily/44581958944_6bb49ac29d_c.jpg new file mode 100644 index 00000000..1a6fdfe4 Binary files /dev/null and b/src/dataset/water_lily/44581958944_6bb49ac29d_c.jpg differ diff --git a/src/dataset/water_lily/45209817135_aa7870dbc1_c.jpg b/src/dataset/water_lily/45209817135_aa7870dbc1_c.jpg new file mode 100644 index 00000000..ad622c49 Binary files /dev/null and b/src/dataset/water_lily/45209817135_aa7870dbc1_c.jpg differ diff --git a/src/dataset/water_lily/45351115225_3a5c894f27_c.jpg b/src/dataset/water_lily/45351115225_3a5c894f27_c.jpg new file mode 100644 index 00000000..fe28b88c Binary files /dev/null and b/src/dataset/water_lily/45351115225_3a5c894f27_c.jpg differ diff --git a/src/dataset/water_lily/45431329444_a3d4383516_c.jpg b/src/dataset/water_lily/45431329444_a3d4383516_c.jpg new file mode 100644 index 00000000..2cb0f030 Binary files /dev/null and b/src/dataset/water_lily/45431329444_a3d4383516_c.jpg differ diff --git a/src/dataset/water_lily/4548046680_2d9d4f8cee_c.jpg b/src/dataset/water_lily/4548046680_2d9d4f8cee_c.jpg new file mode 100644 index 00000000..5fa63d9d Binary files /dev/null and b/src/dataset/water_lily/4548046680_2d9d4f8cee_c.jpg differ diff --git a/src/dataset/water_lily/45558326265_4abdd75297_c.jpg b/src/dataset/water_lily/45558326265_4abdd75297_c.jpg new file mode 100644 index 00000000..8ccb59f7 Binary files /dev/null and b/src/dataset/water_lily/45558326265_4abdd75297_c.jpg differ diff --git a/src/dataset/water_lily/45639873915_8d88d49b3b_c.jpg b/src/dataset/water_lily/45639873915_8d88d49b3b_c.jpg new file mode 100644 index 00000000..2ee65a9c Binary files /dev/null and b/src/dataset/water_lily/45639873915_8d88d49b3b_c.jpg differ diff --git a/src/dataset/water_lily/45863887982_161df52de4_c.jpg b/src/dataset/water_lily/45863887982_161df52de4_c.jpg new file mode 100644 index 00000000..0fdd54c2 Binary files /dev/null and b/src/dataset/water_lily/45863887982_161df52de4_c.jpg differ diff --git a/src/dataset/water_lily/45901939284_29c58183cd_c.jpg b/src/dataset/water_lily/45901939284_29c58183cd_c.jpg new file mode 100644 index 00000000..da7a0e3f Binary files /dev/null and b/src/dataset/water_lily/45901939284_29c58183cd_c.jpg differ diff --git a/src/dataset/water_lily/46179011152_39018cdbca_c.jpg b/src/dataset/water_lily/46179011152_39018cdbca_c.jpg new file mode 100644 index 00000000..1aa49fb6 Binary files /dev/null and b/src/dataset/water_lily/46179011152_39018cdbca_c.jpg differ diff --git a/src/dataset/water_lily/46220888111_24bce9c475_c.jpg b/src/dataset/water_lily/46220888111_24bce9c475_c.jpg new file mode 100644 index 00000000..f6441ddb Binary files /dev/null and b/src/dataset/water_lily/46220888111_24bce9c475_c.jpg differ diff --git a/src/dataset/water_lily/4627222961_7d98b49ced_c.jpg b/src/dataset/water_lily/4627222961_7d98b49ced_c.jpg new file mode 100644 index 00000000..653f3d2f Binary files /dev/null and b/src/dataset/water_lily/4627222961_7d98b49ced_c.jpg differ diff --git a/src/dataset/water_lily/4627827460_62b012cf17_c.jpg b/src/dataset/water_lily/4627827460_62b012cf17_c.jpg new file mode 100644 index 00000000..d5152fda Binary files /dev/null and b/src/dataset/water_lily/4627827460_62b012cf17_c.jpg differ diff --git a/src/dataset/water_lily/4638958635_6961be8700_c.jpg b/src/dataset/water_lily/4638958635_6961be8700_c.jpg new file mode 100644 index 00000000..27c727b6 Binary files /dev/null and b/src/dataset/water_lily/4638958635_6961be8700_c.jpg differ diff --git a/src/dataset/water_lily/46522999932_ac241afb44_c.jpg b/src/dataset/water_lily/46522999932_ac241afb44_c.jpg new file mode 100644 index 00000000..9a68e13b Binary files /dev/null and b/src/dataset/water_lily/46522999932_ac241afb44_c.jpg differ diff --git a/src/dataset/water_lily/46594993952_c52b71cf5e_c.jpg b/src/dataset/water_lily/46594993952_c52b71cf5e_c.jpg new file mode 100644 index 00000000..18b24c48 Binary files /dev/null and b/src/dataset/water_lily/46594993952_c52b71cf5e_c.jpg differ diff --git a/src/dataset/water_lily/4680718622_7cd92c3c8b_c.jpg b/src/dataset/water_lily/4680718622_7cd92c3c8b_c.jpg new file mode 100644 index 00000000..a4e5c48f Binary files /dev/null and b/src/dataset/water_lily/4680718622_7cd92c3c8b_c.jpg differ diff --git a/src/dataset/water_lily/46877352254_d711a93c45_c.jpg b/src/dataset/water_lily/46877352254_d711a93c45_c.jpg new file mode 100644 index 00000000..f64b1cf9 Binary files /dev/null and b/src/dataset/water_lily/46877352254_d711a93c45_c.jpg differ diff --git a/src/dataset/water_lily/46976594045_2ae749f477_c.jpg b/src/dataset/water_lily/46976594045_2ae749f477_c.jpg new file mode 100644 index 00000000..71eac3f1 Binary files /dev/null and b/src/dataset/water_lily/46976594045_2ae749f477_c.jpg differ diff --git a/src/dataset/water_lily/4725211100_b48ce62585_c.jpg b/src/dataset/water_lily/4725211100_b48ce62585_c.jpg new file mode 100644 index 00000000..649ea8b0 Binary files /dev/null and b/src/dataset/water_lily/4725211100_b48ce62585_c.jpg differ diff --git a/src/dataset/water_lily/47267205001_c45dff2300_c.jpg b/src/dataset/water_lily/47267205001_c45dff2300_c.jpg new file mode 100644 index 00000000..70e8588d Binary files /dev/null and b/src/dataset/water_lily/47267205001_c45dff2300_c.jpg differ diff --git a/src/dataset/water_lily/4737297596_900d9445e4_c.jpg b/src/dataset/water_lily/4737297596_900d9445e4_c.jpg new file mode 100644 index 00000000..4e62215f Binary files /dev/null and b/src/dataset/water_lily/4737297596_900d9445e4_c.jpg differ diff --git a/src/dataset/water_lily/4748780487_0f5c5a3b90_c.jpg b/src/dataset/water_lily/4748780487_0f5c5a3b90_c.jpg new file mode 100644 index 00000000..cb100920 Binary files /dev/null and b/src/dataset/water_lily/4748780487_0f5c5a3b90_c.jpg differ diff --git a/src/dataset/water_lily/47733735262_dff985170d_c.jpg b/src/dataset/water_lily/47733735262_dff985170d_c.jpg new file mode 100644 index 00000000..aa9f84ee Binary files /dev/null and b/src/dataset/water_lily/47733735262_dff985170d_c.jpg differ diff --git a/src/dataset/water_lily/47786151481_3ce381062b_c.jpg b/src/dataset/water_lily/47786151481_3ce381062b_c.jpg new file mode 100644 index 00000000..c1890b04 Binary files /dev/null and b/src/dataset/water_lily/47786151481_3ce381062b_c.jpg differ diff --git a/src/dataset/water_lily/47791753331_a71e35cc09_c.jpg b/src/dataset/water_lily/47791753331_a71e35cc09_c.jpg new file mode 100644 index 00000000..2bece821 Binary files /dev/null and b/src/dataset/water_lily/47791753331_a71e35cc09_c.jpg differ diff --git a/src/dataset/water_lily/47802017791_1a5267b284_c.jpg b/src/dataset/water_lily/47802017791_1a5267b284_c.jpg new file mode 100644 index 00000000..b0acefab Binary files /dev/null and b/src/dataset/water_lily/47802017791_1a5267b284_c.jpg differ diff --git a/src/dataset/water_lily/47820846652_c108ed46c7_c.jpg b/src/dataset/water_lily/47820846652_c108ed46c7_c.jpg new file mode 100644 index 00000000..c75c9811 Binary files /dev/null and b/src/dataset/water_lily/47820846652_c108ed46c7_c.jpg differ diff --git a/src/dataset/water_lily/47929731756_40fdce0a0d_c.jpg b/src/dataset/water_lily/47929731756_40fdce0a0d_c.jpg new file mode 100644 index 00000000..67bc06e9 Binary files /dev/null and b/src/dataset/water_lily/47929731756_40fdce0a0d_c.jpg differ diff --git a/src/dataset/water_lily/47932558647_29db48c359_c.jpg b/src/dataset/water_lily/47932558647_29db48c359_c.jpg new file mode 100644 index 00000000..a559c2cc Binary files /dev/null and b/src/dataset/water_lily/47932558647_29db48c359_c.jpg differ diff --git a/src/dataset/water_lily/47942931868_111653a001_c.jpg b/src/dataset/water_lily/47942931868_111653a001_c.jpg new file mode 100644 index 00000000..a843d554 Binary files /dev/null and b/src/dataset/water_lily/47942931868_111653a001_c.jpg differ diff --git a/src/dataset/water_lily/47957947738_bff8a6eb38_c.jpg b/src/dataset/water_lily/47957947738_bff8a6eb38_c.jpg new file mode 100644 index 00000000..85ab52c6 Binary files /dev/null and b/src/dataset/water_lily/47957947738_bff8a6eb38_c.jpg differ diff --git a/src/dataset/water_lily/47958739391_50b36147ac_c.jpg b/src/dataset/water_lily/47958739391_50b36147ac_c.jpg new file mode 100644 index 00000000..41ad88ab Binary files /dev/null and b/src/dataset/water_lily/47958739391_50b36147ac_c.jpg differ diff --git a/src/dataset/water_lily/47978168156_5259ec7280_c.jpg b/src/dataset/water_lily/47978168156_5259ec7280_c.jpg new file mode 100644 index 00000000..2554cca8 Binary files /dev/null and b/src/dataset/water_lily/47978168156_5259ec7280_c.jpg differ diff --git a/src/dataset/water_lily/47980815263_85810eb355_c.jpg b/src/dataset/water_lily/47980815263_85810eb355_c.jpg new file mode 100644 index 00000000..ed27ff60 Binary files /dev/null and b/src/dataset/water_lily/47980815263_85810eb355_c.jpg differ diff --git a/src/dataset/water_lily/47985079347_0de8724f6b_c.jpg b/src/dataset/water_lily/47985079347_0de8724f6b_c.jpg new file mode 100644 index 00000000..03d8c9e0 Binary files /dev/null and b/src/dataset/water_lily/47985079347_0de8724f6b_c.jpg differ diff --git a/src/dataset/water_lily/47986736126_736ccea666_c.jpg b/src/dataset/water_lily/47986736126_736ccea666_c.jpg new file mode 100644 index 00000000..298fbf46 Binary files /dev/null and b/src/dataset/water_lily/47986736126_736ccea666_c.jpg differ diff --git a/src/dataset/water_lily/48020631336_55ef3a8731_c.jpg b/src/dataset/water_lily/48020631336_55ef3a8731_c.jpg new file mode 100644 index 00000000..66dc9d6c Binary files /dev/null and b/src/dataset/water_lily/48020631336_55ef3a8731_c.jpg differ diff --git a/src/dataset/water_lily/48020856057_6fb8b7b2b0_c.jpg b/src/dataset/water_lily/48020856057_6fb8b7b2b0_c.jpg new file mode 100644 index 00000000..e4022b1e Binary files /dev/null and b/src/dataset/water_lily/48020856057_6fb8b7b2b0_c.jpg differ diff --git a/src/dataset/water_lily/48036526076_254db021e5_c.jpg b/src/dataset/water_lily/48036526076_254db021e5_c.jpg new file mode 100644 index 00000000..ef80d517 Binary files /dev/null and b/src/dataset/water_lily/48036526076_254db021e5_c.jpg differ diff --git a/src/dataset/water_lily/48042410743_e4e8c4d533_c.jpg b/src/dataset/water_lily/48042410743_e4e8c4d533_c.jpg new file mode 100644 index 00000000..22cc3947 Binary files /dev/null and b/src/dataset/water_lily/48042410743_e4e8c4d533_c.jpg differ diff --git a/src/dataset/water_lily/48048702593_9312ff09e9_c.jpg b/src/dataset/water_lily/48048702593_9312ff09e9_c.jpg new file mode 100644 index 00000000..39f41eeb Binary files /dev/null and b/src/dataset/water_lily/48048702593_9312ff09e9_c.jpg differ diff --git a/src/dataset/water_lily/48050688067_f4402fe0fd_c.jpg b/src/dataset/water_lily/48050688067_f4402fe0fd_c.jpg new file mode 100644 index 00000000..85b78a48 Binary files /dev/null and b/src/dataset/water_lily/48050688067_f4402fe0fd_c.jpg differ diff --git a/src/dataset/water_lily/48067935267_5daf7ace97_c.jpg b/src/dataset/water_lily/48067935267_5daf7ace97_c.jpg new file mode 100644 index 00000000..dae07b92 Binary files /dev/null and b/src/dataset/water_lily/48067935267_5daf7ace97_c.jpg differ diff --git a/src/dataset/water_lily/48086043606_0a17eb363c_c.jpg b/src/dataset/water_lily/48086043606_0a17eb363c_c.jpg new file mode 100644 index 00000000..992471e9 Binary files /dev/null and b/src/dataset/water_lily/48086043606_0a17eb363c_c.jpg differ diff --git a/src/dataset/water_lily/48089555363_b71676d9e0_c.jpg b/src/dataset/water_lily/48089555363_b71676d9e0_c.jpg new file mode 100644 index 00000000..d31c2876 Binary files /dev/null and b/src/dataset/water_lily/48089555363_b71676d9e0_c.jpg differ diff --git a/src/dataset/water_lily/48090929818_ae45e93199_c.jpg b/src/dataset/water_lily/48090929818_ae45e93199_c.jpg new file mode 100644 index 00000000..01b0c53f Binary files /dev/null and b/src/dataset/water_lily/48090929818_ae45e93199_c.jpg differ diff --git a/src/dataset/water_lily/48130096422_c2661fac48_c.jpg b/src/dataset/water_lily/48130096422_c2661fac48_c.jpg new file mode 100644 index 00000000..8464c01d Binary files /dev/null and b/src/dataset/water_lily/48130096422_c2661fac48_c.jpg differ diff --git a/src/dataset/water_lily/48150471152_d65a08435f_c.jpg b/src/dataset/water_lily/48150471152_d65a08435f_c.jpg new file mode 100644 index 00000000..d5ffd31a Binary files /dev/null and b/src/dataset/water_lily/48150471152_d65a08435f_c.jpg differ diff --git a/src/dataset/water_lily/48153054297_1686fa508e_c.jpg b/src/dataset/water_lily/48153054297_1686fa508e_c.jpg new file mode 100644 index 00000000..43d68b17 Binary files /dev/null and b/src/dataset/water_lily/48153054297_1686fa508e_c.jpg differ diff --git a/src/dataset/water_lily/48157397911_cfd31fc470_c.jpg b/src/dataset/water_lily/48157397911_cfd31fc470_c.jpg new file mode 100644 index 00000000..ee8003af Binary files /dev/null and b/src/dataset/water_lily/48157397911_cfd31fc470_c.jpg differ diff --git a/src/dataset/water_lily/48184690421_6bda7c8163_c.jpg b/src/dataset/water_lily/48184690421_6bda7c8163_c.jpg new file mode 100644 index 00000000..db4de089 Binary files /dev/null and b/src/dataset/water_lily/48184690421_6bda7c8163_c.jpg differ diff --git a/src/dataset/water_lily/48184798717_a871a1cc83_c.jpg b/src/dataset/water_lily/48184798717_a871a1cc83_c.jpg new file mode 100644 index 00000000..5a3ca3f0 Binary files /dev/null and b/src/dataset/water_lily/48184798717_a871a1cc83_c.jpg differ diff --git a/src/dataset/water_lily/48190009696_cd745e9dda_c.jpg b/src/dataset/water_lily/48190009696_cd745e9dda_c.jpg new file mode 100644 index 00000000..cdaa0ba2 Binary files /dev/null and b/src/dataset/water_lily/48190009696_cd745e9dda_c.jpg differ diff --git a/src/dataset/water_lily/48207667497_315421706f_c.jpg b/src/dataset/water_lily/48207667497_315421706f_c.jpg new file mode 100644 index 00000000..6484a277 Binary files /dev/null and b/src/dataset/water_lily/48207667497_315421706f_c.jpg differ diff --git a/src/dataset/water_lily/48237682216_93a4e32077_c.jpg b/src/dataset/water_lily/48237682216_93a4e32077_c.jpg new file mode 100644 index 00000000..598433ac Binary files /dev/null and b/src/dataset/water_lily/48237682216_93a4e32077_c.jpg differ diff --git a/src/dataset/water_lily/48251562687_ec809cd451_c.jpg b/src/dataset/water_lily/48251562687_ec809cd451_c.jpg new file mode 100644 index 00000000..58f1889d Binary files /dev/null and b/src/dataset/water_lily/48251562687_ec809cd451_c.jpg differ diff --git a/src/dataset/water_lily/4825157890_2e20f1739e_c.jpg b/src/dataset/water_lily/4825157890_2e20f1739e_c.jpg new file mode 100644 index 00000000..4ee3201a Binary files /dev/null and b/src/dataset/water_lily/4825157890_2e20f1739e_c.jpg differ diff --git a/src/dataset/water_lily/48256728367_0a6903ce4d_c.jpg b/src/dataset/water_lily/48256728367_0a6903ce4d_c.jpg new file mode 100644 index 00000000..eb2c2916 Binary files /dev/null and b/src/dataset/water_lily/48256728367_0a6903ce4d_c.jpg differ diff --git a/src/dataset/water_lily/48258835392_1a3ba5c62d_c.jpg b/src/dataset/water_lily/48258835392_1a3ba5c62d_c.jpg new file mode 100644 index 00000000..65eb1f60 Binary files /dev/null and b/src/dataset/water_lily/48258835392_1a3ba5c62d_c.jpg differ diff --git a/src/dataset/water_lily/48261492466_ec343c7ec4_c.jpg b/src/dataset/water_lily/48261492466_ec343c7ec4_c.jpg new file mode 100644 index 00000000..b3bbd578 Binary files /dev/null and b/src/dataset/water_lily/48261492466_ec343c7ec4_c.jpg differ diff --git a/src/dataset/water_lily/48277721946_5fe0af473d_c.jpg b/src/dataset/water_lily/48277721946_5fe0af473d_c.jpg new file mode 100644 index 00000000..0d152831 Binary files /dev/null and b/src/dataset/water_lily/48277721946_5fe0af473d_c.jpg differ diff --git a/src/dataset/water_lily/48281648072_1e4fe502b3_c.jpg b/src/dataset/water_lily/48281648072_1e4fe502b3_c.jpg new file mode 100644 index 00000000..12cb655d Binary files /dev/null and b/src/dataset/water_lily/48281648072_1e4fe502b3_c.jpg differ diff --git a/src/dataset/water_lily/48302325021_490200789a_c.jpg b/src/dataset/water_lily/48302325021_490200789a_c.jpg new file mode 100644 index 00000000..0f4ca76d Binary files /dev/null and b/src/dataset/water_lily/48302325021_490200789a_c.jpg differ diff --git a/src/dataset/water_lily/48302333271_2c9dc475f2_c.jpg b/src/dataset/water_lily/48302333271_2c9dc475f2_c.jpg new file mode 100644 index 00000000..23dd5216 Binary files /dev/null and b/src/dataset/water_lily/48302333271_2c9dc475f2_c.jpg differ diff --git a/src/dataset/water_lily/48302414237_c53487ce81_c.jpg b/src/dataset/water_lily/48302414237_c53487ce81_c.jpg new file mode 100644 index 00000000..56c4000e Binary files /dev/null and b/src/dataset/water_lily/48302414237_c53487ce81_c.jpg differ diff --git a/src/dataset/water_lily/48302446527_ef3902522e_c.jpg b/src/dataset/water_lily/48302446527_ef3902522e_c.jpg new file mode 100644 index 00000000..eda63966 Binary files /dev/null and b/src/dataset/water_lily/48302446527_ef3902522e_c.jpg differ diff --git a/src/dataset/water_lily/48302450507_1caa72e74f_c.jpg b/src/dataset/water_lily/48302450507_1caa72e74f_c.jpg new file mode 100644 index 00000000..8280262b Binary files /dev/null and b/src/dataset/water_lily/48302450507_1caa72e74f_c.jpg differ diff --git a/src/dataset/water_lily/48311022477_0817b22e92_c.jpg b/src/dataset/water_lily/48311022477_0817b22e92_c.jpg new file mode 100644 index 00000000..0f21d38e Binary files /dev/null and b/src/dataset/water_lily/48311022477_0817b22e92_c.jpg differ diff --git a/src/dataset/water_lily/48311814547_aeb9157726_c.jpg b/src/dataset/water_lily/48311814547_aeb9157726_c.jpg new file mode 100644 index 00000000..58aa2d89 Binary files /dev/null and b/src/dataset/water_lily/48311814547_aeb9157726_c.jpg differ diff --git a/src/dataset/water_lily/4832071271_77a9a16f28_c.jpg b/src/dataset/water_lily/4832071271_77a9a16f28_c.jpg new file mode 100644 index 00000000..82bf3148 Binary files /dev/null and b/src/dataset/water_lily/4832071271_77a9a16f28_c.jpg differ diff --git a/src/dataset/water_lily/48324394556_e49fd98c04_c.jpg b/src/dataset/water_lily/48324394556_e49fd98c04_c.jpg new file mode 100644 index 00000000..83699fb8 Binary files /dev/null and b/src/dataset/water_lily/48324394556_e49fd98c04_c.jpg differ diff --git a/src/dataset/water_lily/48324400856_aa5c4680a7_c.jpg b/src/dataset/water_lily/48324400856_aa5c4680a7_c.jpg new file mode 100644 index 00000000..aa7a408c Binary files /dev/null and b/src/dataset/water_lily/48324400856_aa5c4680a7_c.jpg differ diff --git a/src/dataset/water_lily/48324531392_d8fd2de7cb_c.jpg b/src/dataset/water_lily/48324531392_d8fd2de7cb_c.jpg new file mode 100644 index 00000000..83fe8452 Binary files /dev/null and b/src/dataset/water_lily/48324531392_d8fd2de7cb_c.jpg differ diff --git a/src/dataset/water_lily/48372471686_12b2b8d7e7_c.jpg b/src/dataset/water_lily/48372471686_12b2b8d7e7_c.jpg new file mode 100644 index 00000000..e2f31faa Binary files /dev/null and b/src/dataset/water_lily/48372471686_12b2b8d7e7_c.jpg differ diff --git a/src/dataset/water_lily/48392363046_e6894b619e_c.jpg b/src/dataset/water_lily/48392363046_e6894b619e_c.jpg new file mode 100644 index 00000000..609eec9a Binary files /dev/null and b/src/dataset/water_lily/48392363046_e6894b619e_c.jpg differ diff --git a/src/dataset/water_lily/483943428_856e4b09d1_c.jpg b/src/dataset/water_lily/483943428_856e4b09d1_c.jpg new file mode 100644 index 00000000..db816029 Binary files /dev/null and b/src/dataset/water_lily/483943428_856e4b09d1_c.jpg differ diff --git a/src/dataset/water_lily/48397869331_d2d80166e7_c.jpg b/src/dataset/water_lily/48397869331_d2d80166e7_c.jpg new file mode 100644 index 00000000..fcf73f3f Binary files /dev/null and b/src/dataset/water_lily/48397869331_d2d80166e7_c.jpg differ diff --git a/src/dataset/water_lily/48400499366_0e8f814dd2_c.jpg b/src/dataset/water_lily/48400499366_0e8f814dd2_c.jpg new file mode 100644 index 00000000..8504bfb0 Binary files /dev/null and b/src/dataset/water_lily/48400499366_0e8f814dd2_c.jpg differ diff --git a/src/dataset/water_lily/48401500322_64ea3021f0_c.jpg b/src/dataset/water_lily/48401500322_64ea3021f0_c.jpg new file mode 100644 index 00000000..d6f0fa96 Binary files /dev/null and b/src/dataset/water_lily/48401500322_64ea3021f0_c.jpg differ diff --git a/src/dataset/water_lily/48402108442_489d814de3_c.jpg b/src/dataset/water_lily/48402108442_489d814de3_c.jpg new file mode 100644 index 00000000..3c6aacfa Binary files /dev/null and b/src/dataset/water_lily/48402108442_489d814de3_c.jpg differ diff --git a/src/dataset/water_lily/48420424381_72678216b7_c.jpg b/src/dataset/water_lily/48420424381_72678216b7_c.jpg new file mode 100644 index 00000000..ce69cda6 Binary files /dev/null and b/src/dataset/water_lily/48420424381_72678216b7_c.jpg differ diff --git a/src/dataset/water_lily/48434674461_0feb1abeb8_c.jpg b/src/dataset/water_lily/48434674461_0feb1abeb8_c.jpg new file mode 100644 index 00000000..94650ce1 Binary files /dev/null and b/src/dataset/water_lily/48434674461_0feb1abeb8_c.jpg differ diff --git a/src/dataset/water_lily/48446913687_c7abc0b61e_c.jpg b/src/dataset/water_lily/48446913687_c7abc0b61e_c.jpg new file mode 100644 index 00000000..ebe47d58 Binary files /dev/null and b/src/dataset/water_lily/48446913687_c7abc0b61e_c.jpg differ diff --git a/src/dataset/water_lily/48448444501_d1a55ef86e_c.jpg b/src/dataset/water_lily/48448444501_d1a55ef86e_c.jpg new file mode 100644 index 00000000..6129f5f8 Binary files /dev/null and b/src/dataset/water_lily/48448444501_d1a55ef86e_c.jpg differ diff --git a/src/dataset/water_lily/48451471592_90597ef655_c.jpg b/src/dataset/water_lily/48451471592_90597ef655_c.jpg new file mode 100644 index 00000000..04952942 Binary files /dev/null and b/src/dataset/water_lily/48451471592_90597ef655_c.jpg differ diff --git a/src/dataset/water_lily/48458422977_2da24365c6_c.jpg b/src/dataset/water_lily/48458422977_2da24365c6_c.jpg new file mode 100644 index 00000000..a05febb5 Binary files /dev/null and b/src/dataset/water_lily/48458422977_2da24365c6_c.jpg differ diff --git a/src/dataset/water_lily/48459527987_6e83cba51b_c.jpg b/src/dataset/water_lily/48459527987_6e83cba51b_c.jpg new file mode 100644 index 00000000..98621a85 Binary files /dev/null and b/src/dataset/water_lily/48459527987_6e83cba51b_c.jpg differ diff --git a/src/dataset/water_lily/48509050872_35227d49a5_c.jpg b/src/dataset/water_lily/48509050872_35227d49a5_c.jpg new file mode 100644 index 00000000..b27a08e2 Binary files /dev/null and b/src/dataset/water_lily/48509050872_35227d49a5_c.jpg differ diff --git a/src/dataset/water_lily/48509635162_12f5464a01_c.jpg b/src/dataset/water_lily/48509635162_12f5464a01_c.jpg new file mode 100644 index 00000000..f4b086b6 Binary files /dev/null and b/src/dataset/water_lily/48509635162_12f5464a01_c.jpg differ diff --git a/src/dataset/water_lily/48509789467_b3efbb63cf_c.jpg b/src/dataset/water_lily/48509789467_b3efbb63cf_c.jpg new file mode 100644 index 00000000..c2692ac3 Binary files /dev/null and b/src/dataset/water_lily/48509789467_b3efbb63cf_c.jpg differ diff --git a/src/dataset/water_lily/48515659046_32e305dcd6_c.jpg b/src/dataset/water_lily/48515659046_32e305dcd6_c.jpg new file mode 100644 index 00000000..77cc0a32 Binary files /dev/null and b/src/dataset/water_lily/48515659046_32e305dcd6_c.jpg differ diff --git a/src/dataset/water_lily/48519235977_9d877e2fbd_c.jpg b/src/dataset/water_lily/48519235977_9d877e2fbd_c.jpg new file mode 100644 index 00000000..ebb45fa9 Binary files /dev/null and b/src/dataset/water_lily/48519235977_9d877e2fbd_c.jpg differ diff --git a/src/dataset/water_lily/48523454967_5dbccd0f98_c.jpg b/src/dataset/water_lily/48523454967_5dbccd0f98_c.jpg new file mode 100644 index 00000000..848b414c Binary files /dev/null and b/src/dataset/water_lily/48523454967_5dbccd0f98_c.jpg differ diff --git a/src/dataset/water_lily/48523993641_c2ac3cfc5e_c.jpg b/src/dataset/water_lily/48523993641_c2ac3cfc5e_c.jpg new file mode 100644 index 00000000..702c39c5 Binary files /dev/null and b/src/dataset/water_lily/48523993641_c2ac3cfc5e_c.jpg differ diff --git a/src/dataset/water_lily/48529680122_c2e5c8dcba_c.jpg b/src/dataset/water_lily/48529680122_c2e5c8dcba_c.jpg new file mode 100644 index 00000000..639698ae Binary files /dev/null and b/src/dataset/water_lily/48529680122_c2e5c8dcba_c.jpg differ diff --git a/src/dataset/water_lily/48551070417_49fee22631_c.jpg b/src/dataset/water_lily/48551070417_49fee22631_c.jpg new file mode 100644 index 00000000..0b5eb2fb Binary files /dev/null and b/src/dataset/water_lily/48551070417_49fee22631_c.jpg differ diff --git a/src/dataset/water_lily/48560038667_198c6e7797_c.jpg b/src/dataset/water_lily/48560038667_198c6e7797_c.jpg new file mode 100644 index 00000000..0da76926 Binary files /dev/null and b/src/dataset/water_lily/48560038667_198c6e7797_c.jpg differ diff --git a/src/dataset/water_lily/48568862912_7fa0aaf2eb_c.jpg b/src/dataset/water_lily/48568862912_7fa0aaf2eb_c.jpg new file mode 100644 index 00000000..6008416c Binary files /dev/null and b/src/dataset/water_lily/48568862912_7fa0aaf2eb_c.jpg differ diff --git a/src/dataset/water_lily/48577456001_3fdb2e2bae_c.jpg b/src/dataset/water_lily/48577456001_3fdb2e2bae_c.jpg new file mode 100644 index 00000000..023d8a42 Binary files /dev/null and b/src/dataset/water_lily/48577456001_3fdb2e2bae_c.jpg differ diff --git a/src/dataset/water_lily/48584238307_dae21b3361_c.jpg b/src/dataset/water_lily/48584238307_dae21b3361_c.jpg new file mode 100644 index 00000000..77518e16 Binary files /dev/null and b/src/dataset/water_lily/48584238307_dae21b3361_c.jpg differ diff --git a/src/dataset/water_lily/48595079167_98ee720059_c.jpg b/src/dataset/water_lily/48595079167_98ee720059_c.jpg new file mode 100644 index 00000000..32426938 Binary files /dev/null and b/src/dataset/water_lily/48595079167_98ee720059_c.jpg differ diff --git a/src/dataset/water_lily/48598250221_c5a9802f56_c.jpg b/src/dataset/water_lily/48598250221_c5a9802f56_c.jpg new file mode 100644 index 00000000..f0223d6c Binary files /dev/null and b/src/dataset/water_lily/48598250221_c5a9802f56_c.jpg differ diff --git a/src/dataset/water_lily/48608363118_3414881da2_c.jpg b/src/dataset/water_lily/48608363118_3414881da2_c.jpg new file mode 100644 index 00000000..1daceea7 Binary files /dev/null and b/src/dataset/water_lily/48608363118_3414881da2_c.jpg differ diff --git a/src/dataset/water_lily/48617099112_6db1f32578_c.jpg b/src/dataset/water_lily/48617099112_6db1f32578_c.jpg new file mode 100644 index 00000000..fa667673 Binary files /dev/null and b/src/dataset/water_lily/48617099112_6db1f32578_c.jpg differ diff --git a/src/dataset/water_lily/48627217711_1b3eaa7fc5_c.jpg b/src/dataset/water_lily/48627217711_1b3eaa7fc5_c.jpg new file mode 100644 index 00000000..ef9febea Binary files /dev/null and b/src/dataset/water_lily/48627217711_1b3eaa7fc5_c.jpg differ diff --git a/src/dataset/water_lily/48629413906_3645f19021_c.jpg b/src/dataset/water_lily/48629413906_3645f19021_c.jpg new file mode 100644 index 00000000..fe4462ca Binary files /dev/null and b/src/dataset/water_lily/48629413906_3645f19021_c.jpg differ diff --git a/src/dataset/water_lily/48641249348_a4b4be3c17_c.jpg b/src/dataset/water_lily/48641249348_a4b4be3c17_c.jpg new file mode 100644 index 00000000..9a873888 Binary files /dev/null and b/src/dataset/water_lily/48641249348_a4b4be3c17_c.jpg differ diff --git a/src/dataset/water_lily/48652051417_b1c14c5541_c.jpg b/src/dataset/water_lily/48652051417_b1c14c5541_c.jpg new file mode 100644 index 00000000..8ab944de Binary files /dev/null and b/src/dataset/water_lily/48652051417_b1c14c5541_c.jpg differ diff --git a/src/dataset/water_lily/48668191727_49e710afc6_c.jpg b/src/dataset/water_lily/48668191727_49e710afc6_c.jpg new file mode 100644 index 00000000..3bc78e25 Binary files /dev/null and b/src/dataset/water_lily/48668191727_49e710afc6_c.jpg differ diff --git a/src/dataset/water_lily/48671201536_f185e7a3e0_c.jpg b/src/dataset/water_lily/48671201536_f185e7a3e0_c.jpg new file mode 100644 index 00000000..464ad606 Binary files /dev/null and b/src/dataset/water_lily/48671201536_f185e7a3e0_c.jpg differ diff --git a/src/dataset/water_lily/48675216596_8e93bc7b9d_c.jpg b/src/dataset/water_lily/48675216596_8e93bc7b9d_c.jpg new file mode 100644 index 00000000..a014b5c3 Binary files /dev/null and b/src/dataset/water_lily/48675216596_8e93bc7b9d_c.jpg differ diff --git a/src/dataset/water_lily/4867687456_f746576e93_c.jpg b/src/dataset/water_lily/4867687456_f746576e93_c.jpg new file mode 100644 index 00000000..71c72eac Binary files /dev/null and b/src/dataset/water_lily/4867687456_f746576e93_c.jpg differ diff --git a/src/dataset/water_lily/48682951613_38ae005136_c.jpg b/src/dataset/water_lily/48682951613_38ae005136_c.jpg new file mode 100644 index 00000000..d0b5a32d Binary files /dev/null and b/src/dataset/water_lily/48682951613_38ae005136_c.jpg differ diff --git a/src/dataset/water_lily/48686996421_68c2d51f0c_c.jpg b/src/dataset/water_lily/48686996421_68c2d51f0c_c.jpg new file mode 100644 index 00000000..3c10ad14 Binary files /dev/null and b/src/dataset/water_lily/48686996421_68c2d51f0c_c.jpg differ diff --git a/src/dataset/water_lily/48690314108_a26dfb2de9_c.jpg b/src/dataset/water_lily/48690314108_a26dfb2de9_c.jpg new file mode 100644 index 00000000..68cc0cf9 Binary files /dev/null and b/src/dataset/water_lily/48690314108_a26dfb2de9_c.jpg differ diff --git a/src/dataset/water_lily/48693863328_726495990a_c.jpg b/src/dataset/water_lily/48693863328_726495990a_c.jpg new file mode 100644 index 00000000..cba9cd28 Binary files /dev/null and b/src/dataset/water_lily/48693863328_726495990a_c.jpg differ diff --git a/src/dataset/water_lily/48700848836_ee4fa1d5db_c.jpg b/src/dataset/water_lily/48700848836_ee4fa1d5db_c.jpg new file mode 100644 index 00000000..2bf9675d Binary files /dev/null and b/src/dataset/water_lily/48700848836_ee4fa1d5db_c.jpg differ diff --git a/src/dataset/water_lily/48719652648_91d4bedf91_c.jpg b/src/dataset/water_lily/48719652648_91d4bedf91_c.jpg new file mode 100644 index 00000000..2348e95e Binary files /dev/null and b/src/dataset/water_lily/48719652648_91d4bedf91_c.jpg differ diff --git a/src/dataset/water_lily/48724682612_eb825d7d67_c.jpg b/src/dataset/water_lily/48724682612_eb825d7d67_c.jpg new file mode 100644 index 00000000..99266227 Binary files /dev/null and b/src/dataset/water_lily/48724682612_eb825d7d67_c.jpg differ diff --git a/src/dataset/water_lily/48728956833_17984d5374_c.jpg b/src/dataset/water_lily/48728956833_17984d5374_c.jpg new file mode 100644 index 00000000..a5d03376 Binary files /dev/null and b/src/dataset/water_lily/48728956833_17984d5374_c.jpg differ diff --git a/src/dataset/water_lily/48745525256_1385137b0d_c.jpg b/src/dataset/water_lily/48745525256_1385137b0d_c.jpg new file mode 100644 index 00000000..5caf513c Binary files /dev/null and b/src/dataset/water_lily/48745525256_1385137b0d_c.jpg differ diff --git a/src/dataset/water_lily/48750113441_14cd3bb9c0_c.jpg b/src/dataset/water_lily/48750113441_14cd3bb9c0_c.jpg new file mode 100644 index 00000000..0cfa8d60 Binary files /dev/null and b/src/dataset/water_lily/48750113441_14cd3bb9c0_c.jpg differ diff --git a/src/dataset/water_lily/48766168146_6432eb315c_c.jpg b/src/dataset/water_lily/48766168146_6432eb315c_c.jpg new file mode 100644 index 00000000..752aa135 Binary files /dev/null and b/src/dataset/water_lily/48766168146_6432eb315c_c.jpg differ diff --git a/src/dataset/water_lily/48790617551_daf9941cf2_c.jpg b/src/dataset/water_lily/48790617551_daf9941cf2_c.jpg new file mode 100644 index 00000000..ba1e6681 Binary files /dev/null and b/src/dataset/water_lily/48790617551_daf9941cf2_c.jpg differ diff --git a/src/dataset/water_lily/48791329277_68be7eccfd_c.jpg b/src/dataset/water_lily/48791329277_68be7eccfd_c.jpg new file mode 100644 index 00000000..40a731e1 Binary files /dev/null and b/src/dataset/water_lily/48791329277_68be7eccfd_c.jpg differ diff --git a/src/dataset/water_lily/48802479732_e68e6e22b5_c.jpg b/src/dataset/water_lily/48802479732_e68e6e22b5_c.jpg new file mode 100644 index 00000000..61be45a1 Binary files /dev/null and b/src/dataset/water_lily/48802479732_e68e6e22b5_c.jpg differ diff --git a/src/dataset/water_lily/48814737901_2de89f073e_c.jpg b/src/dataset/water_lily/48814737901_2de89f073e_c.jpg new file mode 100644 index 00000000..faf02956 Binary files /dev/null and b/src/dataset/water_lily/48814737901_2de89f073e_c.jpg differ diff --git a/src/dataset/water_lily/48824633231_ed3190a42e_c.jpg b/src/dataset/water_lily/48824633231_ed3190a42e_c.jpg new file mode 100644 index 00000000..292f8b42 Binary files /dev/null and b/src/dataset/water_lily/48824633231_ed3190a42e_c.jpg differ diff --git a/src/dataset/water_lily/48836834467_d9594c52e7_c.jpg b/src/dataset/water_lily/48836834467_d9594c52e7_c.jpg new file mode 100644 index 00000000..0a926b06 Binary files /dev/null and b/src/dataset/water_lily/48836834467_d9594c52e7_c.jpg differ diff --git a/src/dataset/water_lily/48854753862_bbb9abd363_c.jpg b/src/dataset/water_lily/48854753862_bbb9abd363_c.jpg new file mode 100644 index 00000000..999f274c Binary files /dev/null and b/src/dataset/water_lily/48854753862_bbb9abd363_c.jpg differ diff --git a/src/dataset/water_lily/48862431726_bb68570e82_c.jpg b/src/dataset/water_lily/48862431726_bb68570e82_c.jpg new file mode 100644 index 00000000..5bd0e11f Binary files /dev/null and b/src/dataset/water_lily/48862431726_bb68570e82_c.jpg differ diff --git a/src/dataset/water_lily/48870299836_f08f3249ac_c.jpg b/src/dataset/water_lily/48870299836_f08f3249ac_c.jpg new file mode 100644 index 00000000..7921cd23 Binary files /dev/null and b/src/dataset/water_lily/48870299836_f08f3249ac_c.jpg differ diff --git a/src/dataset/water_lily/48873493058_ca76f3c449_c.jpg b/src/dataset/water_lily/48873493058_ca76f3c449_c.jpg new file mode 100644 index 00000000..b3766d46 Binary files /dev/null and b/src/dataset/water_lily/48873493058_ca76f3c449_c.jpg differ diff --git a/src/dataset/water_lily/4888009734_bf1c24267c_c.jpg b/src/dataset/water_lily/4888009734_bf1c24267c_c.jpg new file mode 100644 index 00000000..a7c75715 Binary files /dev/null and b/src/dataset/water_lily/4888009734_bf1c24267c_c.jpg differ diff --git a/src/dataset/water_lily/48884171587_b9ce7c114f_c.jpg b/src/dataset/water_lily/48884171587_b9ce7c114f_c.jpg new file mode 100644 index 00000000..f6df59f0 Binary files /dev/null and b/src/dataset/water_lily/48884171587_b9ce7c114f_c.jpg differ diff --git a/src/dataset/water_lily/4890024951_2e2bcef25a_c.jpg b/src/dataset/water_lily/4890024951_2e2bcef25a_c.jpg new file mode 100644 index 00000000..a284c302 Binary files /dev/null and b/src/dataset/water_lily/4890024951_2e2bcef25a_c.jpg differ diff --git a/src/dataset/water_lily/48903013987_981495421e_c.jpg b/src/dataset/water_lily/48903013987_981495421e_c.jpg new file mode 100644 index 00000000..13dd81ca Binary files /dev/null and b/src/dataset/water_lily/48903013987_981495421e_c.jpg differ diff --git a/src/dataset/water_lily/48922265473_47697099bb_c.jpg b/src/dataset/water_lily/48922265473_47697099bb_c.jpg new file mode 100644 index 00000000..28eaceb1 Binary files /dev/null and b/src/dataset/water_lily/48922265473_47697099bb_c.jpg differ diff --git a/src/dataset/water_lily/48923948327_937ece110b_c.jpg b/src/dataset/water_lily/48923948327_937ece110b_c.jpg new file mode 100644 index 00000000..aef2b843 Binary files /dev/null and b/src/dataset/water_lily/48923948327_937ece110b_c.jpg differ diff --git a/src/dataset/water_lily/48924950988_01c03d1d36_c.jpg b/src/dataset/water_lily/48924950988_01c03d1d36_c.jpg new file mode 100644 index 00000000..d8181993 Binary files /dev/null and b/src/dataset/water_lily/48924950988_01c03d1d36_c.jpg differ diff --git a/src/dataset/water_lily/48945330127_8f424460e7_c.jpg b/src/dataset/water_lily/48945330127_8f424460e7_c.jpg new file mode 100644 index 00000000..1758f7a0 Binary files /dev/null and b/src/dataset/water_lily/48945330127_8f424460e7_c.jpg differ diff --git a/src/dataset/water_lily/48949924682_8b5ce8c82e_c.jpg b/src/dataset/water_lily/48949924682_8b5ce8c82e_c.jpg new file mode 100644 index 00000000..05f96ebf Binary files /dev/null and b/src/dataset/water_lily/48949924682_8b5ce8c82e_c.jpg differ diff --git a/src/dataset/water_lily/48980635176_bbe0d574b8_c.jpg b/src/dataset/water_lily/48980635176_bbe0d574b8_c.jpg new file mode 100644 index 00000000..479eabab Binary files /dev/null and b/src/dataset/water_lily/48980635176_bbe0d574b8_c.jpg differ diff --git a/src/dataset/water_lily/48985415548_f3c911ea8c_c.jpg b/src/dataset/water_lily/48985415548_f3c911ea8c_c.jpg new file mode 100644 index 00000000..95b3e057 Binary files /dev/null and b/src/dataset/water_lily/48985415548_f3c911ea8c_c.jpg differ diff --git a/src/dataset/water_lily/49003598057_46860bf55a_c.jpg b/src/dataset/water_lily/49003598057_46860bf55a_c.jpg new file mode 100644 index 00000000..6d4277d3 Binary files /dev/null and b/src/dataset/water_lily/49003598057_46860bf55a_c.jpg differ diff --git a/src/dataset/water_lily/49010304642_facec282b9_c.jpg b/src/dataset/water_lily/49010304642_facec282b9_c.jpg new file mode 100644 index 00000000..c9f571e9 Binary files /dev/null and b/src/dataset/water_lily/49010304642_facec282b9_c.jpg differ diff --git a/src/dataset/water_lily/49017657492_c08182e1c2_c.jpg b/src/dataset/water_lily/49017657492_c08182e1c2_c.jpg new file mode 100644 index 00000000..05096f5b Binary files /dev/null and b/src/dataset/water_lily/49017657492_c08182e1c2_c.jpg differ diff --git a/src/dataset/water_lily/49020616988_f5c2fcc572_c.jpg b/src/dataset/water_lily/49020616988_f5c2fcc572_c.jpg new file mode 100644 index 00000000..b5c03aef Binary files /dev/null and b/src/dataset/water_lily/49020616988_f5c2fcc572_c.jpg differ diff --git a/src/dataset/water_lily/49027883627_837e1647f4_c.jpg b/src/dataset/water_lily/49027883627_837e1647f4_c.jpg new file mode 100644 index 00000000..d9d26ea6 Binary files /dev/null and b/src/dataset/water_lily/49027883627_837e1647f4_c.jpg differ diff --git a/src/dataset/water_lily/49039112011_76d89dce6c_c.jpg b/src/dataset/water_lily/49039112011_76d89dce6c_c.jpg new file mode 100644 index 00000000..b7a18018 Binary files /dev/null and b/src/dataset/water_lily/49039112011_76d89dce6c_c.jpg differ diff --git a/src/dataset/water_lily/49092901702_1c9c66b43d_c.jpg b/src/dataset/water_lily/49092901702_1c9c66b43d_c.jpg new file mode 100644 index 00000000..b7aafe96 Binary files /dev/null and b/src/dataset/water_lily/49092901702_1c9c66b43d_c.jpg differ diff --git a/src/dataset/water_lily/49097853693_7f4aabfc91_c.jpg b/src/dataset/water_lily/49097853693_7f4aabfc91_c.jpg new file mode 100644 index 00000000..98eed784 Binary files /dev/null and b/src/dataset/water_lily/49097853693_7f4aabfc91_c.jpg differ diff --git a/src/dataset/water_lily/49106510603_346f4ae2eb_c.jpg b/src/dataset/water_lily/49106510603_346f4ae2eb_c.jpg new file mode 100644 index 00000000..c0896244 Binary files /dev/null and b/src/dataset/water_lily/49106510603_346f4ae2eb_c.jpg differ diff --git a/src/dataset/water_lily/49116305371_49d6b1a620_c.jpg b/src/dataset/water_lily/49116305371_49d6b1a620_c.jpg new file mode 100644 index 00000000..7dd791d9 Binary files /dev/null and b/src/dataset/water_lily/49116305371_49d6b1a620_c.jpg differ diff --git a/src/dataset/water_lily/4912041285_6c43136f36_c.jpg b/src/dataset/water_lily/4912041285_6c43136f36_c.jpg new file mode 100644 index 00000000..5be3d5be Binary files /dev/null and b/src/dataset/water_lily/4912041285_6c43136f36_c.jpg differ diff --git a/src/dataset/water_lily/49139918722_6874ae3910_c.jpg b/src/dataset/water_lily/49139918722_6874ae3910_c.jpg new file mode 100644 index 00000000..07a8cad5 Binary files /dev/null and b/src/dataset/water_lily/49139918722_6874ae3910_c.jpg differ diff --git a/src/dataset/water_lily/49150175447_102d4c28d3_c.jpg b/src/dataset/water_lily/49150175447_102d4c28d3_c.jpg new file mode 100644 index 00000000..4a7ec0e6 Binary files /dev/null and b/src/dataset/water_lily/49150175447_102d4c28d3_c.jpg differ diff --git a/src/dataset/water_lily/49169905452_0530b76a04_c.jpg b/src/dataset/water_lily/49169905452_0530b76a04_c.jpg new file mode 100644 index 00000000..d71d37fe Binary files /dev/null and b/src/dataset/water_lily/49169905452_0530b76a04_c.jpg differ diff --git a/src/dataset/water_lily/49174627902_c4eaed9a09_c.jpg b/src/dataset/water_lily/49174627902_c4eaed9a09_c.jpg new file mode 100644 index 00000000..3e051e0e Binary files /dev/null and b/src/dataset/water_lily/49174627902_c4eaed9a09_c.jpg differ diff --git a/src/dataset/water_lily/49181271656_1f9df0af78_c.jpg b/src/dataset/water_lily/49181271656_1f9df0af78_c.jpg new file mode 100644 index 00000000..b78ec3e2 Binary files /dev/null and b/src/dataset/water_lily/49181271656_1f9df0af78_c.jpg differ diff --git a/src/dataset/water_lily/49236164093_26db33b934_c.jpg b/src/dataset/water_lily/49236164093_26db33b934_c.jpg new file mode 100644 index 00000000..c50db4bc Binary files /dev/null and b/src/dataset/water_lily/49236164093_26db33b934_c.jpg differ diff --git a/src/dataset/water_lily/49236386616_7426350da0_c.jpg b/src/dataset/water_lily/49236386616_7426350da0_c.jpg new file mode 100644 index 00000000..8eb73454 Binary files /dev/null and b/src/dataset/water_lily/49236386616_7426350da0_c.jpg differ diff --git a/src/dataset/water_lily/49246109686_408b9830dd_c.jpg b/src/dataset/water_lily/49246109686_408b9830dd_c.jpg new file mode 100644 index 00000000..3fc05500 Binary files /dev/null and b/src/dataset/water_lily/49246109686_408b9830dd_c.jpg differ diff --git a/src/dataset/water_lily/492872809_d626dfe493_c.jpg b/src/dataset/water_lily/492872809_d626dfe493_c.jpg new file mode 100644 index 00000000..ebde2365 Binary files /dev/null and b/src/dataset/water_lily/492872809_d626dfe493_c.jpg differ diff --git a/src/dataset/water_lily/49320084491_c04a7412b6_c.jpg b/src/dataset/water_lily/49320084491_c04a7412b6_c.jpg new file mode 100644 index 00000000..147ba5ac Binary files /dev/null and b/src/dataset/water_lily/49320084491_c04a7412b6_c.jpg differ diff --git a/src/dataset/water_lily/49337757276_99d924ca8d_c.jpg b/src/dataset/water_lily/49337757276_99d924ca8d_c.jpg new file mode 100644 index 00000000..c031bddc Binary files /dev/null and b/src/dataset/water_lily/49337757276_99d924ca8d_c.jpg differ diff --git a/src/dataset/water_lily/49371044766_e6bae61d1e_c.jpg b/src/dataset/water_lily/49371044766_e6bae61d1e_c.jpg new file mode 100644 index 00000000..012a9c7e Binary files /dev/null and b/src/dataset/water_lily/49371044766_e6bae61d1e_c.jpg differ diff --git a/src/dataset/water_lily/49378646208_1f53b0b879_c.jpg b/src/dataset/water_lily/49378646208_1f53b0b879_c.jpg new file mode 100644 index 00000000..17ed51e7 Binary files /dev/null and b/src/dataset/water_lily/49378646208_1f53b0b879_c.jpg differ diff --git a/src/dataset/water_lily/49407054107_6a292982aa_c.jpg b/src/dataset/water_lily/49407054107_6a292982aa_c.jpg new file mode 100644 index 00000000..6f65d943 Binary files /dev/null and b/src/dataset/water_lily/49407054107_6a292982aa_c.jpg differ diff --git a/src/dataset/water_lily/49413145137_8cd3dd3280_c.jpg b/src/dataset/water_lily/49413145137_8cd3dd3280_c.jpg new file mode 100644 index 00000000..2f5e9dc7 Binary files /dev/null and b/src/dataset/water_lily/49413145137_8cd3dd3280_c.jpg differ diff --git a/src/dataset/water_lily/49428092237_f91d557221_c.jpg b/src/dataset/water_lily/49428092237_f91d557221_c.jpg new file mode 100644 index 00000000..93eb1518 Binary files /dev/null and b/src/dataset/water_lily/49428092237_f91d557221_c.jpg differ diff --git a/src/dataset/water_lily/49448279552_f214544bef_c.jpg b/src/dataset/water_lily/49448279552_f214544bef_c.jpg new file mode 100644 index 00000000..9be82cdc Binary files /dev/null and b/src/dataset/water_lily/49448279552_f214544bef_c.jpg differ diff --git a/src/dataset/water_lily/49473013782_656fd4e613_c.jpg b/src/dataset/water_lily/49473013782_656fd4e613_c.jpg new file mode 100644 index 00000000..09532219 Binary files /dev/null and b/src/dataset/water_lily/49473013782_656fd4e613_c.jpg differ diff --git a/src/dataset/water_lily/49475371298_229e9355d7_c.jpg b/src/dataset/water_lily/49475371298_229e9355d7_c.jpg new file mode 100644 index 00000000..9f831b13 Binary files /dev/null and b/src/dataset/water_lily/49475371298_229e9355d7_c.jpg differ diff --git a/src/dataset/water_lily/49529994851_ae73fb1c60_c.jpg b/src/dataset/water_lily/49529994851_ae73fb1c60_c.jpg new file mode 100644 index 00000000..3d30b54a Binary files /dev/null and b/src/dataset/water_lily/49529994851_ae73fb1c60_c.jpg differ diff --git a/src/dataset/water_lily/49532973056_538cbf87d3_c.jpg b/src/dataset/water_lily/49532973056_538cbf87d3_c.jpg new file mode 100644 index 00000000..d4d1532a Binary files /dev/null and b/src/dataset/water_lily/49532973056_538cbf87d3_c.jpg differ diff --git a/src/dataset/water_lily/49544841238_701608dbc9_c.jpg b/src/dataset/water_lily/49544841238_701608dbc9_c.jpg new file mode 100644 index 00000000..bdf31cc1 Binary files /dev/null and b/src/dataset/water_lily/49544841238_701608dbc9_c.jpg differ diff --git a/src/dataset/water_lily/49563379928_b834f65f2b_c.jpg b/src/dataset/water_lily/49563379928_b834f65f2b_c.jpg new file mode 100644 index 00000000..f4dae0fb Binary files /dev/null and b/src/dataset/water_lily/49563379928_b834f65f2b_c.jpg differ diff --git a/src/dataset/water_lily/49575550348_27a9c8c430_c.jpg b/src/dataset/water_lily/49575550348_27a9c8c430_c.jpg new file mode 100644 index 00000000..959acc88 Binary files /dev/null and b/src/dataset/water_lily/49575550348_27a9c8c430_c.jpg differ diff --git a/src/dataset/water_lily/49576230143_7ff5050d44_c.jpg b/src/dataset/water_lily/49576230143_7ff5050d44_c.jpg new file mode 100644 index 00000000..5d7cad92 Binary files /dev/null and b/src/dataset/water_lily/49576230143_7ff5050d44_c.jpg differ diff --git a/src/dataset/water_lily/49583935081_b86480a646_c.jpg b/src/dataset/water_lily/49583935081_b86480a646_c.jpg new file mode 100644 index 00000000..9132950a Binary files /dev/null and b/src/dataset/water_lily/49583935081_b86480a646_c.jpg differ diff --git a/src/dataset/water_lily/49602998183_e6b5bc612e_c.jpg b/src/dataset/water_lily/49602998183_e6b5bc612e_c.jpg new file mode 100644 index 00000000..151b784d Binary files /dev/null and b/src/dataset/water_lily/49602998183_e6b5bc612e_c.jpg differ diff --git a/src/dataset/water_lily/49607271202_2ffdc2d2aa_c.jpg b/src/dataset/water_lily/49607271202_2ffdc2d2aa_c.jpg new file mode 100644 index 00000000..449e2e94 Binary files /dev/null and b/src/dataset/water_lily/49607271202_2ffdc2d2aa_c.jpg differ diff --git a/src/dataset/water_lily/49659498411_9cae73c46a_c.jpg b/src/dataset/water_lily/49659498411_9cae73c46a_c.jpg new file mode 100644 index 00000000..22c5252a Binary files /dev/null and b/src/dataset/water_lily/49659498411_9cae73c46a_c.jpg differ diff --git a/src/dataset/water_lily/49694566057_daf6ec999e_c.jpg b/src/dataset/water_lily/49694566057_daf6ec999e_c.jpg new file mode 100644 index 00000000..0c512e3c Binary files /dev/null and b/src/dataset/water_lily/49694566057_daf6ec999e_c.jpg differ diff --git a/src/dataset/water_lily/49707010958_00a2ece035_c.jpg b/src/dataset/water_lily/49707010958_00a2ece035_c.jpg new file mode 100644 index 00000000..b495296b Binary files /dev/null and b/src/dataset/water_lily/49707010958_00a2ece035_c.jpg differ diff --git a/src/dataset/water_lily/49730160003_31f1288993_c.jpg b/src/dataset/water_lily/49730160003_31f1288993_c.jpg new file mode 100644 index 00000000..e74609cf Binary files /dev/null and b/src/dataset/water_lily/49730160003_31f1288993_c.jpg differ diff --git a/src/dataset/water_lily/49782434787_9663dcfdd5_c.jpg b/src/dataset/water_lily/49782434787_9663dcfdd5_c.jpg new file mode 100644 index 00000000..25ace5ea Binary files /dev/null and b/src/dataset/water_lily/49782434787_9663dcfdd5_c.jpg differ diff --git a/src/dataset/water_lily/49822242862_b2a717ceb9_c.jpg b/src/dataset/water_lily/49822242862_b2a717ceb9_c.jpg new file mode 100644 index 00000000..48c3da74 Binary files /dev/null and b/src/dataset/water_lily/49822242862_b2a717ceb9_c.jpg differ diff --git a/src/dataset/water_lily/49837214746_d5a1768a41_c.jpg b/src/dataset/water_lily/49837214746_d5a1768a41_c.jpg new file mode 100644 index 00000000..1ecdfe9d Binary files /dev/null and b/src/dataset/water_lily/49837214746_d5a1768a41_c.jpg differ diff --git a/src/dataset/water_lily/49841941923_aed19a52de_c.jpg b/src/dataset/water_lily/49841941923_aed19a52de_c.jpg new file mode 100644 index 00000000..b407bcbf Binary files /dev/null and b/src/dataset/water_lily/49841941923_aed19a52de_c.jpg differ diff --git a/src/dataset/water_lily/49877545831_9f92b7ee3b_c.jpg b/src/dataset/water_lily/49877545831_9f92b7ee3b_c.jpg new file mode 100644 index 00000000..21dba989 Binary files /dev/null and b/src/dataset/water_lily/49877545831_9f92b7ee3b_c.jpg differ diff --git a/src/dataset/water_lily/49890956743_7bbe5b4563_c.jpg b/src/dataset/water_lily/49890956743_7bbe5b4563_c.jpg new file mode 100644 index 00000000..df22a734 Binary files /dev/null and b/src/dataset/water_lily/49890956743_7bbe5b4563_c.jpg differ diff --git a/src/dataset/water_lily/49926634522_52fa5c44d0_c.jpg b/src/dataset/water_lily/49926634522_52fa5c44d0_c.jpg new file mode 100644 index 00000000..4894de99 Binary files /dev/null and b/src/dataset/water_lily/49926634522_52fa5c44d0_c.jpg differ diff --git a/src/dataset/water_lily/49936031133_46d7f534f5_c.jpg b/src/dataset/water_lily/49936031133_46d7f534f5_c.jpg new file mode 100644 index 00000000..85780533 Binary files /dev/null and b/src/dataset/water_lily/49936031133_46d7f534f5_c.jpg differ diff --git a/src/dataset/water_lily/49938799852_3cab3679fe_c.jpg b/src/dataset/water_lily/49938799852_3cab3679fe_c.jpg new file mode 100644 index 00000000..2380b866 Binary files /dev/null and b/src/dataset/water_lily/49938799852_3cab3679fe_c.jpg differ diff --git a/src/dataset/water_lily/49939007546_0a5dc66fde_c.jpg b/src/dataset/water_lily/49939007546_0a5dc66fde_c.jpg new file mode 100644 index 00000000..1b843aca Binary files /dev/null and b/src/dataset/water_lily/49939007546_0a5dc66fde_c.jpg differ diff --git a/src/dataset/water_lily/49949980057_d44b669d47_c.jpg b/src/dataset/water_lily/49949980057_d44b669d47_c.jpg new file mode 100644 index 00000000..f2c81d03 Binary files /dev/null and b/src/dataset/water_lily/49949980057_d44b669d47_c.jpg differ diff --git a/src/dataset/water_lily/49952319876_28edc84b3e_c.jpg b/src/dataset/water_lily/49952319876_28edc84b3e_c.jpg new file mode 100644 index 00000000..f3b31770 Binary files /dev/null and b/src/dataset/water_lily/49952319876_28edc84b3e_c.jpg differ diff --git a/src/dataset/water_lily/49956941346_689568833f_c.jpg b/src/dataset/water_lily/49956941346_689568833f_c.jpg new file mode 100644 index 00000000..c8202ccd Binary files /dev/null and b/src/dataset/water_lily/49956941346_689568833f_c.jpg differ diff --git a/src/dataset/water_lily/49957707037_fe5f81bcb2_c.jpg b/src/dataset/water_lily/49957707037_fe5f81bcb2_c.jpg new file mode 100644 index 00000000..c9e1b2d0 Binary files /dev/null and b/src/dataset/water_lily/49957707037_fe5f81bcb2_c.jpg differ diff --git a/src/dataset/water_lily/49964058942_08ee1f7a85_c.jpg b/src/dataset/water_lily/49964058942_08ee1f7a85_c.jpg new file mode 100644 index 00000000..c2d3b962 Binary files /dev/null and b/src/dataset/water_lily/49964058942_08ee1f7a85_c.jpg differ diff --git a/src/dataset/water_lily/49974727581_ed60d027c1_c.jpg b/src/dataset/water_lily/49974727581_ed60d027c1_c.jpg new file mode 100644 index 00000000..b5456321 Binary files /dev/null and b/src/dataset/water_lily/49974727581_ed60d027c1_c.jpg differ diff --git a/src/dataset/water_lily/49978756758_1a38d7d4f4_c.jpg b/src/dataset/water_lily/49978756758_1a38d7d4f4_c.jpg new file mode 100644 index 00000000..493a1848 Binary files /dev/null and b/src/dataset/water_lily/49978756758_1a38d7d4f4_c.jpg differ diff --git a/src/dataset/water_lily/49987958022_2a3b198366_c.jpg b/src/dataset/water_lily/49987958022_2a3b198366_c.jpg new file mode 100644 index 00000000..cb6aea05 Binary files /dev/null and b/src/dataset/water_lily/49987958022_2a3b198366_c.jpg differ diff --git a/src/dataset/water_lily/50002466347_8f414a540e_c.jpg b/src/dataset/water_lily/50002466347_8f414a540e_c.jpg new file mode 100644 index 00000000..82f858a1 Binary files /dev/null and b/src/dataset/water_lily/50002466347_8f414a540e_c.jpg differ diff --git a/src/dataset/water_lily/50006175626_d78c6494ac_c.jpg b/src/dataset/water_lily/50006175626_d78c6494ac_c.jpg new file mode 100644 index 00000000..974b9e61 Binary files /dev/null and b/src/dataset/water_lily/50006175626_d78c6494ac_c.jpg differ diff --git a/src/dataset/water_lily/50008964916_259d0d42e2_c.jpg b/src/dataset/water_lily/50008964916_259d0d42e2_c.jpg new file mode 100644 index 00000000..1b27bf76 Binary files /dev/null and b/src/dataset/water_lily/50008964916_259d0d42e2_c.jpg differ diff --git a/src/dataset/water_lily/50011985368_4e9cf396e1_c.jpg b/src/dataset/water_lily/50011985368_4e9cf396e1_c.jpg new file mode 100644 index 00000000..7034fcbe Binary files /dev/null and b/src/dataset/water_lily/50011985368_4e9cf396e1_c.jpg differ diff --git a/src/dataset/water_lily/50014666431_dffcb78041_c.jpg b/src/dataset/water_lily/50014666431_dffcb78041_c.jpg new file mode 100644 index 00000000..0be694ce Binary files /dev/null and b/src/dataset/water_lily/50014666431_dffcb78041_c.jpg differ diff --git a/src/dataset/water_lily/50016197143_292fba91b6_c.jpg b/src/dataset/water_lily/50016197143_292fba91b6_c.jpg new file mode 100644 index 00000000..167bb20f Binary files /dev/null and b/src/dataset/water_lily/50016197143_292fba91b6_c.jpg differ diff --git a/src/dataset/water_lily/50019695852_f16b23515e_c.jpg b/src/dataset/water_lily/50019695852_f16b23515e_c.jpg new file mode 100644 index 00000000..3bbee7c0 Binary files /dev/null and b/src/dataset/water_lily/50019695852_f16b23515e_c.jpg differ diff --git a/src/dataset/water_lily/50022429763_4e866e53bd_c.jpg b/src/dataset/water_lily/50022429763_4e866e53bd_c.jpg new file mode 100644 index 00000000..7fdaf618 Binary files /dev/null and b/src/dataset/water_lily/50022429763_4e866e53bd_c.jpg differ diff --git a/src/dataset/water_lily/50023435616_00c205a67e_c.jpg b/src/dataset/water_lily/50023435616_00c205a67e_c.jpg new file mode 100644 index 00000000..acb5bc40 Binary files /dev/null and b/src/dataset/water_lily/50023435616_00c205a67e_c.jpg differ diff --git a/src/dataset/water_lily/50023438716_16aeb6ae27_c.jpg b/src/dataset/water_lily/50023438716_16aeb6ae27_c.jpg new file mode 100644 index 00000000..e7cf1468 Binary files /dev/null and b/src/dataset/water_lily/50023438716_16aeb6ae27_c.jpg differ diff --git a/src/dataset/water_lily/50031777473_8800ebedfc_c.jpg b/src/dataset/water_lily/50031777473_8800ebedfc_c.jpg new file mode 100644 index 00000000..f9058653 Binary files /dev/null and b/src/dataset/water_lily/50031777473_8800ebedfc_c.jpg differ diff --git a/src/dataset/water_lily/50032316141_c09c48c20e_c.jpg b/src/dataset/water_lily/50032316141_c09c48c20e_c.jpg new file mode 100644 index 00000000..11ea2db0 Binary files /dev/null and b/src/dataset/water_lily/50032316141_c09c48c20e_c.jpg differ diff --git a/src/dataset/water_lily/50032574182_b5e5b5b5c9_c.jpg b/src/dataset/water_lily/50032574182_b5e5b5b5c9_c.jpg new file mode 100644 index 00000000..dd30ee80 Binary files /dev/null and b/src/dataset/water_lily/50032574182_b5e5b5b5c9_c.jpg differ diff --git a/src/dataset/water_lily/50032574332_e8c19db71a_c.jpg b/src/dataset/water_lily/50032574332_e8c19db71a_c.jpg new file mode 100644 index 00000000..88e5de6b Binary files /dev/null and b/src/dataset/water_lily/50032574332_e8c19db71a_c.jpg differ diff --git a/src/dataset/water_lily/50032574687_68c9879102_c.jpg b/src/dataset/water_lily/50032574687_68c9879102_c.jpg new file mode 100644 index 00000000..c6da5e92 Binary files /dev/null and b/src/dataset/water_lily/50032574687_68c9879102_c.jpg differ diff --git a/src/dataset/water_lily/50037368486_f832c9b3c8_c.jpg b/src/dataset/water_lily/50037368486_f832c9b3c8_c.jpg new file mode 100644 index 00000000..72e2d02f Binary files /dev/null and b/src/dataset/water_lily/50037368486_f832c9b3c8_c.jpg differ diff --git a/src/dataset/water_lily/50039465497_825ef1d1de_c.jpg b/src/dataset/water_lily/50039465497_825ef1d1de_c.jpg new file mode 100644 index 00000000..30179ffa Binary files /dev/null and b/src/dataset/water_lily/50039465497_825ef1d1de_c.jpg differ diff --git a/src/dataset/water_lily/50039718283_df6d24dd68_c.jpg b/src/dataset/water_lily/50039718283_df6d24dd68_c.jpg new file mode 100644 index 00000000..217d4e1c Binary files /dev/null and b/src/dataset/water_lily/50039718283_df6d24dd68_c.jpg differ diff --git a/src/dataset/water_lily/50040486546_f258255320_c.jpg b/src/dataset/water_lily/50040486546_f258255320_c.jpg new file mode 100644 index 00000000..7a94e6d6 Binary files /dev/null and b/src/dataset/water_lily/50040486546_f258255320_c.jpg differ diff --git a/src/dataset/water_lily/50051641246_0df28fd603_c.jpg b/src/dataset/water_lily/50051641246_0df28fd603_c.jpg new file mode 100644 index 00000000..b55ae124 Binary files /dev/null and b/src/dataset/water_lily/50051641246_0df28fd603_c.jpg differ diff --git a/src/dataset/water_lily/50052839393_c27c73072b_c.jpg b/src/dataset/water_lily/50052839393_c27c73072b_c.jpg new file mode 100644 index 00000000..3cc5c857 Binary files /dev/null and b/src/dataset/water_lily/50052839393_c27c73072b_c.jpg differ diff --git a/src/dataset/water_lily/50054590678_72995eb073_c.jpg b/src/dataset/water_lily/50054590678_72995eb073_c.jpg new file mode 100644 index 00000000..45d5a3d8 Binary files /dev/null and b/src/dataset/water_lily/50054590678_72995eb073_c.jpg differ diff --git a/src/dataset/water_lily/50054951643_12e96eabca_c.jpg b/src/dataset/water_lily/50054951643_12e96eabca_c.jpg new file mode 100644 index 00000000..3a622d91 Binary files /dev/null and b/src/dataset/water_lily/50054951643_12e96eabca_c.jpg differ diff --git a/src/dataset/water_lily/50058826837_c298918623_c.jpg b/src/dataset/water_lily/50058826837_c298918623_c.jpg new file mode 100644 index 00000000..c2e5c6d4 Binary files /dev/null and b/src/dataset/water_lily/50058826837_c298918623_c.jpg differ diff --git a/src/dataset/water_lily/50080615956_f8e6c33902_c.jpg b/src/dataset/water_lily/50080615956_f8e6c33902_c.jpg new file mode 100644 index 00000000..f96e536e Binary files /dev/null and b/src/dataset/water_lily/50080615956_f8e6c33902_c.jpg differ diff --git a/src/dataset/water_lily/50080782493_e4046bdd2c_c.jpg b/src/dataset/water_lily/50080782493_e4046bdd2c_c.jpg new file mode 100644 index 00000000..2da950a0 Binary files /dev/null and b/src/dataset/water_lily/50080782493_e4046bdd2c_c.jpg differ diff --git a/src/dataset/water_lily/50083325406_87e48de1e7_c.jpg b/src/dataset/water_lily/50083325406_87e48de1e7_c.jpg new file mode 100644 index 00000000..d66d9871 Binary files /dev/null and b/src/dataset/water_lily/50083325406_87e48de1e7_c.jpg differ diff --git a/src/dataset/water_lily/50088279668_8c2888d0ce_c.jpg b/src/dataset/water_lily/50088279668_8c2888d0ce_c.jpg new file mode 100644 index 00000000..3f506ce7 Binary files /dev/null and b/src/dataset/water_lily/50088279668_8c2888d0ce_c.jpg differ diff --git a/src/dataset/water_lily/50100273687_21dd72d152_c.jpg b/src/dataset/water_lily/50100273687_21dd72d152_c.jpg new file mode 100644 index 00000000..2796c05c Binary files /dev/null and b/src/dataset/water_lily/50100273687_21dd72d152_c.jpg differ diff --git a/src/dataset/water_lily/50101514298_56005e451a_c.jpg b/src/dataset/water_lily/50101514298_56005e451a_c.jpg new file mode 100644 index 00000000..ef1c9598 Binary files /dev/null and b/src/dataset/water_lily/50101514298_56005e451a_c.jpg differ diff --git a/src/dataset/water_lily/50102151436_516379ee38_c.jpg b/src/dataset/water_lily/50102151436_516379ee38_c.jpg new file mode 100644 index 00000000..72460c73 Binary files /dev/null and b/src/dataset/water_lily/50102151436_516379ee38_c.jpg differ diff --git a/src/dataset/water_lily/50109569236_cd4d1a3a0e_c.jpg b/src/dataset/water_lily/50109569236_cd4d1a3a0e_c.jpg new file mode 100644 index 00000000..46f12ba7 Binary files /dev/null and b/src/dataset/water_lily/50109569236_cd4d1a3a0e_c.jpg differ diff --git a/src/dataset/water_lily/50109603677_c057b13f70_c.jpg b/src/dataset/water_lily/50109603677_c057b13f70_c.jpg new file mode 100644 index 00000000..2e56a543 Binary files /dev/null and b/src/dataset/water_lily/50109603677_c057b13f70_c.jpg differ diff --git a/src/dataset/water_lily/50110326492_5d93d50d00_c.jpg b/src/dataset/water_lily/50110326492_5d93d50d00_c.jpg new file mode 100644 index 00000000..a97293b9 Binary files /dev/null and b/src/dataset/water_lily/50110326492_5d93d50d00_c.jpg differ diff --git a/src/dataset/water_lily/50113077403_d83faab665_c.jpg b/src/dataset/water_lily/50113077403_d83faab665_c.jpg new file mode 100644 index 00000000..78ee0de5 Binary files /dev/null and b/src/dataset/water_lily/50113077403_d83faab665_c.jpg differ diff --git a/src/dataset/water_lily/50114708737_b140b1ce61_c.jpg b/src/dataset/water_lily/50114708737_b140b1ce61_c.jpg new file mode 100644 index 00000000..33cf9afd Binary files /dev/null and b/src/dataset/water_lily/50114708737_b140b1ce61_c.jpg differ diff --git a/src/dataset/water_lily/50114710977_238a1537e4_c.jpg b/src/dataset/water_lily/50114710977_238a1537e4_c.jpg new file mode 100644 index 00000000..b6b47e76 Binary files /dev/null and b/src/dataset/water_lily/50114710977_238a1537e4_c.jpg differ diff --git a/src/dataset/water_lily/50115908031_613df7721d_c.jpg b/src/dataset/water_lily/50115908031_613df7721d_c.jpg new file mode 100644 index 00000000..6f573c45 Binary files /dev/null and b/src/dataset/water_lily/50115908031_613df7721d_c.jpg differ diff --git a/src/dataset/water_lily/50118675386_ff4cff75f4_c.jpg b/src/dataset/water_lily/50118675386_ff4cff75f4_c.jpg new file mode 100644 index 00000000..14f6a9c0 Binary files /dev/null and b/src/dataset/water_lily/50118675386_ff4cff75f4_c.jpg differ diff --git a/src/dataset/water_lily/50127368603_f81dceb743_c.jpg b/src/dataset/water_lily/50127368603_f81dceb743_c.jpg new file mode 100644 index 00000000..33ddeadd Binary files /dev/null and b/src/dataset/water_lily/50127368603_f81dceb743_c.jpg differ diff --git a/src/dataset/water_lily/50133006242_61b27790af_c.jpg b/src/dataset/water_lily/50133006242_61b27790af_c.jpg new file mode 100644 index 00000000..64136968 Binary files /dev/null and b/src/dataset/water_lily/50133006242_61b27790af_c.jpg differ diff --git a/src/dataset/water_lily/50139993716_b2cc3787e3_c.jpg b/src/dataset/water_lily/50139993716_b2cc3787e3_c.jpg new file mode 100644 index 00000000..a3b6d736 Binary files /dev/null and b/src/dataset/water_lily/50139993716_b2cc3787e3_c.jpg differ diff --git a/src/dataset/water_lily/50146700356_9b9b2cda76_c.jpg b/src/dataset/water_lily/50146700356_9b9b2cda76_c.jpg new file mode 100644 index 00000000..1a67b073 Binary files /dev/null and b/src/dataset/water_lily/50146700356_9b9b2cda76_c.jpg differ diff --git a/src/dataset/water_lily/50146746726_b416a60600_c.jpg b/src/dataset/water_lily/50146746726_b416a60600_c.jpg new file mode 100644 index 00000000..bd66f6df Binary files /dev/null and b/src/dataset/water_lily/50146746726_b416a60600_c.jpg differ diff --git a/src/dataset/water_lily/50150599963_8236d8cea5_c.jpg b/src/dataset/water_lily/50150599963_8236d8cea5_c.jpg new file mode 100644 index 00000000..20b5d13e Binary files /dev/null and b/src/dataset/water_lily/50150599963_8236d8cea5_c.jpg differ diff --git a/src/dataset/water_lily/50150639543_148f77e90b_c.jpg b/src/dataset/water_lily/50150639543_148f77e90b_c.jpg new file mode 100644 index 00000000..36f7d0f6 Binary files /dev/null and b/src/dataset/water_lily/50150639543_148f77e90b_c.jpg differ diff --git a/src/dataset/water_lily/50152865817_2fd8c0ffed_c.jpg b/src/dataset/water_lily/50152865817_2fd8c0ffed_c.jpg new file mode 100644 index 00000000..b80a1582 Binary files /dev/null and b/src/dataset/water_lily/50152865817_2fd8c0ffed_c.jpg differ diff --git a/src/dataset/water_lily/50156322157_4e20138c6c_c.jpg b/src/dataset/water_lily/50156322157_4e20138c6c_c.jpg new file mode 100644 index 00000000..55d68569 Binary files /dev/null and b/src/dataset/water_lily/50156322157_4e20138c6c_c.jpg differ diff --git a/src/dataset/water_lily/50159916618_7a113e6b25_c.jpg b/src/dataset/water_lily/50159916618_7a113e6b25_c.jpg new file mode 100644 index 00000000..ff4f787a Binary files /dev/null and b/src/dataset/water_lily/50159916618_7a113e6b25_c.jpg differ diff --git a/src/dataset/water_lily/50161490998_5d21e37897_c.jpg b/src/dataset/water_lily/50161490998_5d21e37897_c.jpg new file mode 100644 index 00000000..adc78295 Binary files /dev/null and b/src/dataset/water_lily/50161490998_5d21e37897_c.jpg differ diff --git a/src/dataset/water_lily/50164389863_a29f141606_c.jpg b/src/dataset/water_lily/50164389863_a29f141606_c.jpg new file mode 100644 index 00000000..02a877ec Binary files /dev/null and b/src/dataset/water_lily/50164389863_a29f141606_c.jpg differ diff --git a/src/dataset/water_lily/50174173257_d3cef334eb_c.jpg b/src/dataset/water_lily/50174173257_d3cef334eb_c.jpg new file mode 100644 index 00000000..f89a5895 Binary files /dev/null and b/src/dataset/water_lily/50174173257_d3cef334eb_c.jpg differ diff --git a/src/dataset/water_lily/50178128883_6a893310ee_c.jpg b/src/dataset/water_lily/50178128883_6a893310ee_c.jpg new file mode 100644 index 00000000..dce4b627 Binary files /dev/null and b/src/dataset/water_lily/50178128883_6a893310ee_c.jpg differ diff --git a/src/dataset/water_lily/50179558488_ef64a1765e_c.jpg b/src/dataset/water_lily/50179558488_ef64a1765e_c.jpg new file mode 100644 index 00000000..9af9c079 Binary files /dev/null and b/src/dataset/water_lily/50179558488_ef64a1765e_c.jpg differ diff --git a/src/dataset/water_lily/50180378431_d2825b181b_c.jpg b/src/dataset/water_lily/50180378431_d2825b181b_c.jpg new file mode 100644 index 00000000..76aad756 Binary files /dev/null and b/src/dataset/water_lily/50180378431_d2825b181b_c.jpg differ diff --git a/src/dataset/water_lily/50185423763_b5f2341f37_c.jpg b/src/dataset/water_lily/50185423763_b5f2341f37_c.jpg new file mode 100644 index 00000000..8c02ee49 Binary files /dev/null and b/src/dataset/water_lily/50185423763_b5f2341f37_c.jpg differ diff --git a/src/dataset/water_lily/50185504777_d764d5b4eb_c.jpg b/src/dataset/water_lily/50185504777_d764d5b4eb_c.jpg new file mode 100644 index 00000000..5e7fb109 Binary files /dev/null and b/src/dataset/water_lily/50185504777_d764d5b4eb_c.jpg differ diff --git a/src/dataset/water_lily/50187533448_e41685bcc1_c.jpg b/src/dataset/water_lily/50187533448_e41685bcc1_c.jpg new file mode 100644 index 00000000..27549884 Binary files /dev/null and b/src/dataset/water_lily/50187533448_e41685bcc1_c.jpg differ diff --git a/src/dataset/water_lily/50193663533_a4710da908_c.jpg b/src/dataset/water_lily/50193663533_a4710da908_c.jpg new file mode 100644 index 00000000..9775eb89 Binary files /dev/null and b/src/dataset/water_lily/50193663533_a4710da908_c.jpg differ diff --git a/src/dataset/water_lily/50193671482_426aa49abc_c.jpg b/src/dataset/water_lily/50193671482_426aa49abc_c.jpg new file mode 100644 index 00000000..95535b0a Binary files /dev/null and b/src/dataset/water_lily/50193671482_426aa49abc_c.jpg differ diff --git a/src/dataset/water_lily/50198314188_7a19145530_c.jpg b/src/dataset/water_lily/50198314188_7a19145530_c.jpg new file mode 100644 index 00000000..1957e127 Binary files /dev/null and b/src/dataset/water_lily/50198314188_7a19145530_c.jpg differ diff --git a/src/dataset/water_lily/50202818411_55c5174fd5_c.jpg b/src/dataset/water_lily/50202818411_55c5174fd5_c.jpg new file mode 100644 index 00000000..5ad36cda Binary files /dev/null and b/src/dataset/water_lily/50202818411_55c5174fd5_c.jpg differ diff --git a/src/dataset/water_lily/50203113423_1e97b91f51_c.jpg b/src/dataset/water_lily/50203113423_1e97b91f51_c.jpg new file mode 100644 index 00000000..8ac0bf45 Binary files /dev/null and b/src/dataset/water_lily/50203113423_1e97b91f51_c.jpg differ diff --git a/src/dataset/water_lily/50203783366_18242a9022_c.jpg b/src/dataset/water_lily/50203783366_18242a9022_c.jpg new file mode 100644 index 00000000..2e8156cb Binary files /dev/null and b/src/dataset/water_lily/50203783366_18242a9022_c.jpg differ diff --git a/src/dataset/water_lily/50208629661_55d3967b13_c.jpg b/src/dataset/water_lily/50208629661_55d3967b13_c.jpg new file mode 100644 index 00000000..b58972ef Binary files /dev/null and b/src/dataset/water_lily/50208629661_55d3967b13_c.jpg differ diff --git a/src/dataset/water_lily/50220679161_7137649524_c.jpg b/src/dataset/water_lily/50220679161_7137649524_c.jpg new file mode 100644 index 00000000..e72414d1 Binary files /dev/null and b/src/dataset/water_lily/50220679161_7137649524_c.jpg differ diff --git a/src/dataset/water_lily/50224686503_2a5c06b5b5_c.jpg b/src/dataset/water_lily/50224686503_2a5c06b5b5_c.jpg new file mode 100644 index 00000000..03b45342 Binary files /dev/null and b/src/dataset/water_lily/50224686503_2a5c06b5b5_c.jpg differ diff --git a/src/dataset/water_lily/50231170051_70f3c38192_c.jpg b/src/dataset/water_lily/50231170051_70f3c38192_c.jpg new file mode 100644 index 00000000..ce0bb40d Binary files /dev/null and b/src/dataset/water_lily/50231170051_70f3c38192_c.jpg differ diff --git a/src/dataset/water_lily/50232588946_3d19e8e2d2_c.jpg b/src/dataset/water_lily/50232588946_3d19e8e2d2_c.jpg new file mode 100644 index 00000000..fe9d064b Binary files /dev/null and b/src/dataset/water_lily/50232588946_3d19e8e2d2_c.jpg differ diff --git a/src/dataset/water_lily/50243963061_cd8ba2180a_c.jpg b/src/dataset/water_lily/50243963061_cd8ba2180a_c.jpg new file mode 100644 index 00000000..ae8086cf Binary files /dev/null and b/src/dataset/water_lily/50243963061_cd8ba2180a_c.jpg differ diff --git a/src/dataset/water_lily/50244846306_961db5cf51_c.jpg b/src/dataset/water_lily/50244846306_961db5cf51_c.jpg new file mode 100644 index 00000000..577ae772 Binary files /dev/null and b/src/dataset/water_lily/50244846306_961db5cf51_c.jpg differ diff --git a/src/dataset/water_lily/50245117307_0224a1d39e_c.jpg b/src/dataset/water_lily/50245117307_0224a1d39e_c.jpg new file mode 100644 index 00000000..62dde40d Binary files /dev/null and b/src/dataset/water_lily/50245117307_0224a1d39e_c.jpg differ diff --git a/src/dataset/water_lily/50264166747_982050b241_c.jpg b/src/dataset/water_lily/50264166747_982050b241_c.jpg new file mode 100644 index 00000000..4166dc34 Binary files /dev/null and b/src/dataset/water_lily/50264166747_982050b241_c.jpg differ diff --git a/src/dataset/water_lily/50269632602_0b79723bdf_c.jpg b/src/dataset/water_lily/50269632602_0b79723bdf_c.jpg new file mode 100644 index 00000000..51f255e8 Binary files /dev/null and b/src/dataset/water_lily/50269632602_0b79723bdf_c.jpg differ diff --git a/src/dataset/water_lily/50278882931_ccf0a214cb_c.jpg b/src/dataset/water_lily/50278882931_ccf0a214cb_c.jpg new file mode 100644 index 00000000..5a63c14c Binary files /dev/null and b/src/dataset/water_lily/50278882931_ccf0a214cb_c.jpg differ diff --git a/src/dataset/water_lily/50282712783_51466984c8_c.jpg b/src/dataset/water_lily/50282712783_51466984c8_c.jpg new file mode 100644 index 00000000..95c0bd57 Binary files /dev/null and b/src/dataset/water_lily/50282712783_51466984c8_c.jpg differ diff --git a/src/dataset/water_lily/50283910382_ceb0795966_c.jpg b/src/dataset/water_lily/50283910382_ceb0795966_c.jpg new file mode 100644 index 00000000..05dd5615 Binary files /dev/null and b/src/dataset/water_lily/50283910382_ceb0795966_c.jpg differ diff --git a/src/dataset/water_lily/50286759421_f040912ba7_c.jpg b/src/dataset/water_lily/50286759421_f040912ba7_c.jpg new file mode 100644 index 00000000..99644d46 Binary files /dev/null and b/src/dataset/water_lily/50286759421_f040912ba7_c.jpg differ diff --git a/src/dataset/water_lily/50287393602_87b22b0a2b_c.jpg b/src/dataset/water_lily/50287393602_87b22b0a2b_c.jpg new file mode 100644 index 00000000..d5ece604 Binary files /dev/null and b/src/dataset/water_lily/50287393602_87b22b0a2b_c.jpg differ diff --git a/src/dataset/water_lily/50288123307_51651c6162_c.jpg b/src/dataset/water_lily/50288123307_51651c6162_c.jpg new file mode 100644 index 00000000..6a694269 Binary files /dev/null and b/src/dataset/water_lily/50288123307_51651c6162_c.jpg differ diff --git a/src/dataset/water_lily/50299614928_31d0bb91cc_c.jpg b/src/dataset/water_lily/50299614928_31d0bb91cc_c.jpg new file mode 100644 index 00000000..a9c4d009 Binary files /dev/null and b/src/dataset/water_lily/50299614928_31d0bb91cc_c.jpg differ diff --git a/src/dataset/water_lily/50300367736_a8010f8e34_c.jpg b/src/dataset/water_lily/50300367736_a8010f8e34_c.jpg new file mode 100644 index 00000000..09fdd323 Binary files /dev/null and b/src/dataset/water_lily/50300367736_a8010f8e34_c.jpg differ diff --git a/src/dataset/water_lily/50309152197_397e97af12_c.jpg b/src/dataset/water_lily/50309152197_397e97af12_c.jpg new file mode 100644 index 00000000..876ab536 Binary files /dev/null and b/src/dataset/water_lily/50309152197_397e97af12_c.jpg differ diff --git a/src/dataset/water_lily/50314018127_5d5a55bb8f_c.jpg b/src/dataset/water_lily/50314018127_5d5a55bb8f_c.jpg new file mode 100644 index 00000000..4e5d9c0c Binary files /dev/null and b/src/dataset/water_lily/50314018127_5d5a55bb8f_c.jpg differ diff --git a/src/dataset/water_lily/50320434283_494957506a_c.jpg b/src/dataset/water_lily/50320434283_494957506a_c.jpg new file mode 100644 index 00000000..0286b7ba Binary files /dev/null and b/src/dataset/water_lily/50320434283_494957506a_c.jpg differ diff --git a/src/dataset/water_lily/50323069517_7ae6ef2983_c.jpg b/src/dataset/water_lily/50323069517_7ae6ef2983_c.jpg new file mode 100644 index 00000000..10a2f73b Binary files /dev/null and b/src/dataset/water_lily/50323069517_7ae6ef2983_c.jpg differ diff --git a/src/dataset/water_lily/50323870558_da151dbe89_c.jpg b/src/dataset/water_lily/50323870558_da151dbe89_c.jpg new file mode 100644 index 00000000..420d06d2 Binary files /dev/null and b/src/dataset/water_lily/50323870558_da151dbe89_c.jpg differ diff --git a/src/dataset/water_lily/50336852837_c15df62094_c.jpg b/src/dataset/water_lily/50336852837_c15df62094_c.jpg new file mode 100644 index 00000000..f9abe714 Binary files /dev/null and b/src/dataset/water_lily/50336852837_c15df62094_c.jpg differ diff --git a/src/dataset/water_lily/50338606181_3a57e68496_c.jpg b/src/dataset/water_lily/50338606181_3a57e68496_c.jpg new file mode 100644 index 00000000..2b8c94c2 Binary files /dev/null and b/src/dataset/water_lily/50338606181_3a57e68496_c.jpg differ diff --git a/src/dataset/water_lily/50338867442_514722f305_c.jpg b/src/dataset/water_lily/50338867442_514722f305_c.jpg new file mode 100644 index 00000000..48546081 Binary files /dev/null and b/src/dataset/water_lily/50338867442_514722f305_c.jpg differ diff --git a/src/dataset/water_lily/50338878441_00ab6f85b6_c.jpg b/src/dataset/water_lily/50338878441_00ab6f85b6_c.jpg new file mode 100644 index 00000000..3ed7fcd2 Binary files /dev/null and b/src/dataset/water_lily/50338878441_00ab6f85b6_c.jpg differ diff --git a/src/dataset/water_lily/50339876887_84ec2d0800_c.jpg b/src/dataset/water_lily/50339876887_84ec2d0800_c.jpg new file mode 100644 index 00000000..57745c2f Binary files /dev/null and b/src/dataset/water_lily/50339876887_84ec2d0800_c.jpg differ diff --git a/src/dataset/water_lily/50345299557_d7960c25c6_c.jpg b/src/dataset/water_lily/50345299557_d7960c25c6_c.jpg new file mode 100644 index 00000000..4a92c594 Binary files /dev/null and b/src/dataset/water_lily/50345299557_d7960c25c6_c.jpg differ diff --git a/src/dataset/water_lily/50346725122_15b771c83e_c.jpg b/src/dataset/water_lily/50346725122_15b771c83e_c.jpg new file mode 100644 index 00000000..dc3bde2d Binary files /dev/null and b/src/dataset/water_lily/50346725122_15b771c83e_c.jpg differ diff --git a/src/dataset/water_lily/50349872972_1964e34279_c.jpg b/src/dataset/water_lily/50349872972_1964e34279_c.jpg new file mode 100644 index 00000000..22c5e512 Binary files /dev/null and b/src/dataset/water_lily/50349872972_1964e34279_c.jpg differ diff --git a/src/dataset/water_lily/50360068426_3175cc8479_c.jpg b/src/dataset/water_lily/50360068426_3175cc8479_c.jpg new file mode 100644 index 00000000..6e5b5054 Binary files /dev/null and b/src/dataset/water_lily/50360068426_3175cc8479_c.jpg differ diff --git a/src/dataset/water_lily/50367751981_b3accce210_c.jpg b/src/dataset/water_lily/50367751981_b3accce210_c.jpg new file mode 100644 index 00000000..c2a29e79 Binary files /dev/null and b/src/dataset/water_lily/50367751981_b3accce210_c.jpg differ diff --git a/src/dataset/water_lily/50378939686_620515ca48_c.jpg b/src/dataset/water_lily/50378939686_620515ca48_c.jpg new file mode 100644 index 00000000..61f878dc Binary files /dev/null and b/src/dataset/water_lily/50378939686_620515ca48_c.jpg differ diff --git a/src/dataset/water_lily/50384107421_3076cbe284_c.jpg b/src/dataset/water_lily/50384107421_3076cbe284_c.jpg new file mode 100644 index 00000000..571a49a2 Binary files /dev/null and b/src/dataset/water_lily/50384107421_3076cbe284_c.jpg differ diff --git a/src/dataset/water_lily/50384283093_c0aa42b690_c.jpg b/src/dataset/water_lily/50384283093_c0aa42b690_c.jpg new file mode 100644 index 00000000..b72cb3c4 Binary files /dev/null and b/src/dataset/water_lily/50384283093_c0aa42b690_c.jpg differ diff --git a/src/dataset/water_lily/50388168787_31727b34b7_c.jpg b/src/dataset/water_lily/50388168787_31727b34b7_c.jpg new file mode 100644 index 00000000..2f9768fa Binary files /dev/null and b/src/dataset/water_lily/50388168787_31727b34b7_c.jpg differ diff --git a/src/dataset/water_lily/50388222477_6fb7f811e8_c.jpg b/src/dataset/water_lily/50388222477_6fb7f811e8_c.jpg new file mode 100644 index 00000000..6add030c Binary files /dev/null and b/src/dataset/water_lily/50388222477_6fb7f811e8_c.jpg differ diff --git a/src/dataset/water_lily/50401953738_0765cb91f4_c.jpg b/src/dataset/water_lily/50401953738_0765cb91f4_c.jpg new file mode 100644 index 00000000..5a7a41bd Binary files /dev/null and b/src/dataset/water_lily/50401953738_0765cb91f4_c.jpg differ diff --git a/src/dataset/water_lily/50404493856_6ffaf61fdd_c.jpg b/src/dataset/water_lily/50404493856_6ffaf61fdd_c.jpg new file mode 100644 index 00000000..ae626822 Binary files /dev/null and b/src/dataset/water_lily/50404493856_6ffaf61fdd_c.jpg differ diff --git a/src/dataset/water_lily/50404864951_1f40b40350_c.jpg b/src/dataset/water_lily/50404864951_1f40b40350_c.jpg new file mode 100644 index 00000000..3659d7d6 Binary files /dev/null and b/src/dataset/water_lily/50404864951_1f40b40350_c.jpg differ diff --git a/src/dataset/water_lily/50427060538_15715c6d0c_c.jpg b/src/dataset/water_lily/50427060538_15715c6d0c_c.jpg new file mode 100644 index 00000000..c08d6b5a Binary files /dev/null and b/src/dataset/water_lily/50427060538_15715c6d0c_c.jpg differ diff --git a/src/dataset/water_lily/50433824947_3d604685b7_c.jpg b/src/dataset/water_lily/50433824947_3d604685b7_c.jpg new file mode 100644 index 00000000..044b0630 Binary files /dev/null and b/src/dataset/water_lily/50433824947_3d604685b7_c.jpg differ diff --git a/src/dataset/water_lily/50448893691_a2e73b8587_c.jpg b/src/dataset/water_lily/50448893691_a2e73b8587_c.jpg new file mode 100644 index 00000000..8b712d2a Binary files /dev/null and b/src/dataset/water_lily/50448893691_a2e73b8587_c.jpg differ diff --git a/src/dataset/water_lily/50450956992_a7f533ac6c_c.jpg b/src/dataset/water_lily/50450956992_a7f533ac6c_c.jpg new file mode 100644 index 00000000..5c91e7ac Binary files /dev/null and b/src/dataset/water_lily/50450956992_a7f533ac6c_c.jpg differ diff --git a/src/dataset/water_lily/50462862491_eb23ac6051_c.jpg b/src/dataset/water_lily/50462862491_eb23ac6051_c.jpg new file mode 100644 index 00000000..e8780460 Binary files /dev/null and b/src/dataset/water_lily/50462862491_eb23ac6051_c.jpg differ diff --git a/src/dataset/water_lily/50466329521_45e4a8c20d_c.jpg b/src/dataset/water_lily/50466329521_45e4a8c20d_c.jpg new file mode 100644 index 00000000..9bc08844 Binary files /dev/null and b/src/dataset/water_lily/50466329521_45e4a8c20d_c.jpg differ diff --git a/src/dataset/water_lily/50471136571_6cf00bafdc_c.jpg b/src/dataset/water_lily/50471136571_6cf00bafdc_c.jpg new file mode 100644 index 00000000..4894de99 Binary files /dev/null and b/src/dataset/water_lily/50471136571_6cf00bafdc_c.jpg differ diff --git a/src/dataset/water_lily/50489693752_2958f8a790_c.jpg b/src/dataset/water_lily/50489693752_2958f8a790_c.jpg new file mode 100644 index 00000000..72146755 Binary files /dev/null and b/src/dataset/water_lily/50489693752_2958f8a790_c.jpg differ diff --git a/src/dataset/water_lily/50494623403_7cc7fe7c88_c.jpg b/src/dataset/water_lily/50494623403_7cc7fe7c88_c.jpg new file mode 100644 index 00000000..1b3e2780 Binary files /dev/null and b/src/dataset/water_lily/50494623403_7cc7fe7c88_c.jpg differ diff --git a/src/dataset/water_lily/50496177451_8aef02914c_c.jpg b/src/dataset/water_lily/50496177451_8aef02914c_c.jpg new file mode 100644 index 00000000..7877f9fa Binary files /dev/null and b/src/dataset/water_lily/50496177451_8aef02914c_c.jpg differ diff --git a/src/dataset/water_lily/50497295143_678b2f3e37_c.jpg b/src/dataset/water_lily/50497295143_678b2f3e37_c.jpg new file mode 100644 index 00000000..8b0c6e82 Binary files /dev/null and b/src/dataset/water_lily/50497295143_678b2f3e37_c.jpg differ diff --git a/src/dataset/water_lily/50497733213_2aa2dbaab7_c.jpg b/src/dataset/water_lily/50497733213_2aa2dbaab7_c.jpg new file mode 100644 index 00000000..dca3326f Binary files /dev/null and b/src/dataset/water_lily/50497733213_2aa2dbaab7_c.jpg differ diff --git a/src/dataset/water_lily/50515746758_bc2fd893fa_c.jpg b/src/dataset/water_lily/50515746758_bc2fd893fa_c.jpg new file mode 100644 index 00000000..73b18522 Binary files /dev/null and b/src/dataset/water_lily/50515746758_bc2fd893fa_c.jpg differ diff --git a/src/dataset/water_lily/50516439501_54140e3909_c.jpg b/src/dataset/water_lily/50516439501_54140e3909_c.jpg new file mode 100644 index 00000000..09690843 Binary files /dev/null and b/src/dataset/water_lily/50516439501_54140e3909_c.jpg differ diff --git a/src/dataset/water_lily/50518725538_6c449150e1_c.jpg b/src/dataset/water_lily/50518725538_6c449150e1_c.jpg new file mode 100644 index 00000000..3bfa91f9 Binary files /dev/null and b/src/dataset/water_lily/50518725538_6c449150e1_c.jpg differ diff --git a/src/dataset/water_lily/50536951391_dd62b4231f_c.jpg b/src/dataset/water_lily/50536951391_dd62b4231f_c.jpg new file mode 100644 index 00000000..27a7f9a6 Binary files /dev/null and b/src/dataset/water_lily/50536951391_dd62b4231f_c.jpg differ diff --git a/src/dataset/water_lily/50547131817_d6af642d4b_c.jpg b/src/dataset/water_lily/50547131817_d6af642d4b_c.jpg new file mode 100644 index 00000000..12084ba9 Binary files /dev/null and b/src/dataset/water_lily/50547131817_d6af642d4b_c.jpg differ diff --git a/src/dataset/water_lily/50547912622_14f3d507cd_c.jpg b/src/dataset/water_lily/50547912622_14f3d507cd_c.jpg new file mode 100644 index 00000000..b9e82a83 Binary files /dev/null and b/src/dataset/water_lily/50547912622_14f3d507cd_c.jpg differ diff --git a/src/dataset/water_lily/50578544521_e62cfe5817_c.jpg b/src/dataset/water_lily/50578544521_e62cfe5817_c.jpg new file mode 100644 index 00000000..ddc8b93c Binary files /dev/null and b/src/dataset/water_lily/50578544521_e62cfe5817_c.jpg differ diff --git a/src/dataset/water_lily/50606145547_5a9b52678c_c.jpg b/src/dataset/water_lily/50606145547_5a9b52678c_c.jpg new file mode 100644 index 00000000..5ee4ba19 Binary files /dev/null and b/src/dataset/water_lily/50606145547_5a9b52678c_c.jpg differ diff --git a/src/dataset/water_lily/50607051933_2e26d2d1cb_c.jpg b/src/dataset/water_lily/50607051933_2e26d2d1cb_c.jpg new file mode 100644 index 00000000..f2a72cd3 Binary files /dev/null and b/src/dataset/water_lily/50607051933_2e26d2d1cb_c.jpg differ diff --git a/src/dataset/water_lily/50616463098_27da45b73b_c.jpg b/src/dataset/water_lily/50616463098_27da45b73b_c.jpg new file mode 100644 index 00000000..df901b10 Binary files /dev/null and b/src/dataset/water_lily/50616463098_27da45b73b_c.jpg differ diff --git a/src/dataset/water_lily/50629477402_1dfe6ecb1f_c.jpg b/src/dataset/water_lily/50629477402_1dfe6ecb1f_c.jpg new file mode 100644 index 00000000..9e0ed05c Binary files /dev/null and b/src/dataset/water_lily/50629477402_1dfe6ecb1f_c.jpg differ diff --git a/src/dataset/water_lily/50649226262_aaf6068640_c.jpg b/src/dataset/water_lily/50649226262_aaf6068640_c.jpg new file mode 100644 index 00000000..64d48a96 Binary files /dev/null and b/src/dataset/water_lily/50649226262_aaf6068640_c.jpg differ diff --git a/src/dataset/water_lily/50677261106_56652e5074_c.jpg b/src/dataset/water_lily/50677261106_56652e5074_c.jpg new file mode 100644 index 00000000..b81c26c3 Binary files /dev/null and b/src/dataset/water_lily/50677261106_56652e5074_c.jpg differ diff --git a/src/dataset/water_lily/50683833847_dfe5497d9b_c.jpg b/src/dataset/water_lily/50683833847_dfe5497d9b_c.jpg new file mode 100644 index 00000000..726d60d6 Binary files /dev/null and b/src/dataset/water_lily/50683833847_dfe5497d9b_c.jpg differ diff --git a/src/dataset/water_lily/50710073013_e30d7ecb1b_c.jpg b/src/dataset/water_lily/50710073013_e30d7ecb1b_c.jpg new file mode 100644 index 00000000..dd7e594f Binary files /dev/null and b/src/dataset/water_lily/50710073013_e30d7ecb1b_c.jpg differ diff --git a/src/dataset/water_lily/50731654708_f8862351a0_c.jpg b/src/dataset/water_lily/50731654708_f8862351a0_c.jpg new file mode 100644 index 00000000..8744f7b2 Binary files /dev/null and b/src/dataset/water_lily/50731654708_f8862351a0_c.jpg differ diff --git a/src/dataset/water_lily/50740349933_e269070ffb_c.jpg b/src/dataset/water_lily/50740349933_e269070ffb_c.jpg new file mode 100644 index 00000000..926e2f55 Binary files /dev/null and b/src/dataset/water_lily/50740349933_e269070ffb_c.jpg differ diff --git a/src/dataset/water_lily/50760494992_b6ff430f93_c.jpg b/src/dataset/water_lily/50760494992_b6ff430f93_c.jpg new file mode 100644 index 00000000..56c90399 Binary files /dev/null and b/src/dataset/water_lily/50760494992_b6ff430f93_c.jpg differ diff --git a/src/dataset/water_lily/50772042958_f84e8e6918_c.jpg b/src/dataset/water_lily/50772042958_f84e8e6918_c.jpg new file mode 100644 index 00000000..a2700700 Binary files /dev/null and b/src/dataset/water_lily/50772042958_f84e8e6918_c.jpg differ diff --git a/src/dataset/water_lily/50775317987_6c1260879b_c.jpg b/src/dataset/water_lily/50775317987_6c1260879b_c.jpg new file mode 100644 index 00000000..d7800c20 Binary files /dev/null and b/src/dataset/water_lily/50775317987_6c1260879b_c.jpg differ diff --git a/src/dataset/water_lily/50793359791_b0420a12b2_c.jpg b/src/dataset/water_lily/50793359791_b0420a12b2_c.jpg new file mode 100644 index 00000000..cfea890d Binary files /dev/null and b/src/dataset/water_lily/50793359791_b0420a12b2_c.jpg differ diff --git a/src/dataset/water_lily/50802432913_b8d6bdce17_c.jpg b/src/dataset/water_lily/50802432913_b8d6bdce17_c.jpg new file mode 100644 index 00000000..b4930452 Binary files /dev/null and b/src/dataset/water_lily/50802432913_b8d6bdce17_c.jpg differ diff --git a/src/dataset/water_lily/50805894037_acf79e7484_c.jpg b/src/dataset/water_lily/50805894037_acf79e7484_c.jpg new file mode 100644 index 00000000..541fd5e4 Binary files /dev/null and b/src/dataset/water_lily/50805894037_acf79e7484_c.jpg differ diff --git a/src/dataset/water_lily/50817611208_2632eb2957_c.jpg b/src/dataset/water_lily/50817611208_2632eb2957_c.jpg new file mode 100644 index 00000000..0250c19d Binary files /dev/null and b/src/dataset/water_lily/50817611208_2632eb2957_c.jpg differ diff --git a/src/dataset/water_lily/50820428656_690ea7a060_c.jpg b/src/dataset/water_lily/50820428656_690ea7a060_c.jpg new file mode 100644 index 00000000..49e20cec Binary files /dev/null and b/src/dataset/water_lily/50820428656_690ea7a060_c.jpg differ diff --git a/src/dataset/water_lily/50824344836_e87b56922c_c.jpg b/src/dataset/water_lily/50824344836_e87b56922c_c.jpg new file mode 100644 index 00000000..aced7e67 Binary files /dev/null and b/src/dataset/water_lily/50824344836_e87b56922c_c.jpg differ diff --git a/src/dataset/water_lily/50829451156_f81e430877_c.jpg b/src/dataset/water_lily/50829451156_f81e430877_c.jpg new file mode 100644 index 00000000..b4e37b14 Binary files /dev/null and b/src/dataset/water_lily/50829451156_f81e430877_c.jpg differ diff --git a/src/dataset/water_lily/50853067517_59c2762b43_c.jpg b/src/dataset/water_lily/50853067517_59c2762b43_c.jpg new file mode 100644 index 00000000..cc220982 Binary files /dev/null and b/src/dataset/water_lily/50853067517_59c2762b43_c.jpg differ diff --git a/src/dataset/water_lily/50861825941_e1d589c213_c.jpg b/src/dataset/water_lily/50861825941_e1d589c213_c.jpg new file mode 100644 index 00000000..4412ebc2 Binary files /dev/null and b/src/dataset/water_lily/50861825941_e1d589c213_c.jpg differ diff --git a/src/dataset/water_lily/50866256638_573d2fcabf_c.jpg b/src/dataset/water_lily/50866256638_573d2fcabf_c.jpg new file mode 100644 index 00000000..78a383bd Binary files /dev/null and b/src/dataset/water_lily/50866256638_573d2fcabf_c.jpg differ diff --git a/src/dataset/water_lily/50877262277_3cb35353c1_c.jpg b/src/dataset/water_lily/50877262277_3cb35353c1_c.jpg new file mode 100644 index 00000000..48556a9d Binary files /dev/null and b/src/dataset/water_lily/50877262277_3cb35353c1_c.jpg differ diff --git a/src/dataset/water_lily/50888294361_9e93f736ab_c.jpg b/src/dataset/water_lily/50888294361_9e93f736ab_c.jpg new file mode 100644 index 00000000..9c343439 Binary files /dev/null and b/src/dataset/water_lily/50888294361_9e93f736ab_c.jpg differ diff --git a/src/dataset/water_lily/50909388493_3df8a307e6_c.jpg b/src/dataset/water_lily/50909388493_3df8a307e6_c.jpg new file mode 100644 index 00000000..661e8ebd Binary files /dev/null and b/src/dataset/water_lily/50909388493_3df8a307e6_c.jpg differ diff --git a/src/dataset/water_lily/50914321562_c531095cfe_c.jpg b/src/dataset/water_lily/50914321562_c531095cfe_c.jpg new file mode 100644 index 00000000..ce24b1c8 Binary files /dev/null and b/src/dataset/water_lily/50914321562_c531095cfe_c.jpg differ diff --git a/src/dataset/water_lily/50934540366_95ebd88de9_c.jpg b/src/dataset/water_lily/50934540366_95ebd88de9_c.jpg new file mode 100644 index 00000000..da428f99 Binary files /dev/null and b/src/dataset/water_lily/50934540366_95ebd88de9_c.jpg differ diff --git a/src/dataset/water_lily/50943674481_1e28edf06b_c.jpg b/src/dataset/water_lily/50943674481_1e28edf06b_c.jpg new file mode 100644 index 00000000..54dbb3bb Binary files /dev/null and b/src/dataset/water_lily/50943674481_1e28edf06b_c.jpg differ diff --git a/src/dataset/water_lily/50970031972_ab89771c57_c.jpg b/src/dataset/water_lily/50970031972_ab89771c57_c.jpg new file mode 100644 index 00000000..5fea4996 Binary files /dev/null and b/src/dataset/water_lily/50970031972_ab89771c57_c.jpg differ diff --git a/src/dataset/water_lily/50980824086_3fd1817523_c.jpg b/src/dataset/water_lily/50980824086_3fd1817523_c.jpg new file mode 100644 index 00000000..4b9b762f Binary files /dev/null and b/src/dataset/water_lily/50980824086_3fd1817523_c.jpg differ diff --git a/src/dataset/water_lily/50985545703_596bb7e753_c.jpg b/src/dataset/water_lily/50985545703_596bb7e753_c.jpg new file mode 100644 index 00000000..1f258448 Binary files /dev/null and b/src/dataset/water_lily/50985545703_596bb7e753_c.jpg differ diff --git a/src/dataset/water_lily/50989771507_3aea9f5b18_c.jpg b/src/dataset/water_lily/50989771507_3aea9f5b18_c.jpg new file mode 100644 index 00000000..73476f41 Binary files /dev/null and b/src/dataset/water_lily/50989771507_3aea9f5b18_c.jpg differ diff --git a/src/dataset/water_lily/50997619410_2ae93ab541_c.jpg b/src/dataset/water_lily/50997619410_2ae93ab541_c.jpg new file mode 100644 index 00000000..db10790a Binary files /dev/null and b/src/dataset/water_lily/50997619410_2ae93ab541_c.jpg differ diff --git a/src/dataset/water_lily/51001576381_9d9e85466b_c.jpg b/src/dataset/water_lily/51001576381_9d9e85466b_c.jpg new file mode 100644 index 00000000..06a6f637 Binary files /dev/null and b/src/dataset/water_lily/51001576381_9d9e85466b_c.jpg differ diff --git a/src/dataset/water_lily/51004949391_42411d970e_c.jpg b/src/dataset/water_lily/51004949391_42411d970e_c.jpg new file mode 100644 index 00000000..945228a7 Binary files /dev/null and b/src/dataset/water_lily/51004949391_42411d970e_c.jpg differ diff --git a/src/dataset/water_lily/51005984027_f406339dbd_c.jpg b/src/dataset/water_lily/51005984027_f406339dbd_c.jpg new file mode 100644 index 00000000..6e34e97c Binary files /dev/null and b/src/dataset/water_lily/51005984027_f406339dbd_c.jpg differ diff --git a/src/dataset/water_lily/51030694043_6b86198399_c.jpg b/src/dataset/water_lily/51030694043_6b86198399_c.jpg new file mode 100644 index 00000000..12ec4662 Binary files /dev/null and b/src/dataset/water_lily/51030694043_6b86198399_c.jpg differ diff --git a/src/dataset/water_lily/51036592016_e9bb157d94_c.jpg b/src/dataset/water_lily/51036592016_e9bb157d94_c.jpg new file mode 100644 index 00000000..dffe312f Binary files /dev/null and b/src/dataset/water_lily/51036592016_e9bb157d94_c.jpg differ diff --git a/src/dataset/water_lily/51097519162_2d27f1fe86_c.jpg b/src/dataset/water_lily/51097519162_2d27f1fe86_c.jpg new file mode 100644 index 00000000..1d3a4648 Binary files /dev/null and b/src/dataset/water_lily/51097519162_2d27f1fe86_c.jpg differ diff --git a/src/dataset/water_lily/51106873998_0b6f10590d_c.jpg b/src/dataset/water_lily/51106873998_0b6f10590d_c.jpg new file mode 100644 index 00000000..1abfdd67 Binary files /dev/null and b/src/dataset/water_lily/51106873998_0b6f10590d_c.jpg differ diff --git a/src/dataset/water_lily/51127208997_6381ac3c18_c.jpg b/src/dataset/water_lily/51127208997_6381ac3c18_c.jpg new file mode 100644 index 00000000..12a1e29f Binary files /dev/null and b/src/dataset/water_lily/51127208997_6381ac3c18_c.jpg differ diff --git a/src/dataset/water_lily/51131827750_8bb208e94f_c.jpg b/src/dataset/water_lily/51131827750_8bb208e94f_c.jpg new file mode 100644 index 00000000..97f57724 Binary files /dev/null and b/src/dataset/water_lily/51131827750_8bb208e94f_c.jpg differ diff --git a/src/dataset/water_lily/51152443834_51edb68a4b_c.jpg b/src/dataset/water_lily/51152443834_51edb68a4b_c.jpg new file mode 100644 index 00000000..e578cd2e Binary files /dev/null and b/src/dataset/water_lily/51152443834_51edb68a4b_c.jpg differ diff --git a/src/dataset/water_lily/51154553047_8bc0654b7e_c.jpg b/src/dataset/water_lily/51154553047_8bc0654b7e_c.jpg new file mode 100644 index 00000000..5a0a0ac3 Binary files /dev/null and b/src/dataset/water_lily/51154553047_8bc0654b7e_c.jpg differ diff --git a/src/dataset/water_lily/51161279464_8947c102ef_c.jpg b/src/dataset/water_lily/51161279464_8947c102ef_c.jpg new file mode 100644 index 00000000..a10ac608 Binary files /dev/null and b/src/dataset/water_lily/51161279464_8947c102ef_c.jpg differ diff --git a/src/dataset/water_lily/51171007613_3e37698b5c_c.jpg b/src/dataset/water_lily/51171007613_3e37698b5c_c.jpg new file mode 100644 index 00000000..e7a6e06c Binary files /dev/null and b/src/dataset/water_lily/51171007613_3e37698b5c_c.jpg differ diff --git a/src/dataset/water_lily/51181876433_46bdec06d8_c.jpg b/src/dataset/water_lily/51181876433_46bdec06d8_c.jpg new file mode 100644 index 00000000..349f48b0 Binary files /dev/null and b/src/dataset/water_lily/51181876433_46bdec06d8_c.jpg differ diff --git a/src/dataset/water_lily/51186327789_73f6e00549_c.jpg b/src/dataset/water_lily/51186327789_73f6e00549_c.jpg new file mode 100644 index 00000000..66d161c2 Binary files /dev/null and b/src/dataset/water_lily/51186327789_73f6e00549_c.jpg differ diff --git a/src/dataset/water_lily/51195522420_0e2dbe4fae_c.jpg b/src/dataset/water_lily/51195522420_0e2dbe4fae_c.jpg new file mode 100644 index 00000000..f1f24154 Binary files /dev/null and b/src/dataset/water_lily/51195522420_0e2dbe4fae_c.jpg differ diff --git a/src/dataset/water_lily/51197253294_55cd4f33ea_c.jpg b/src/dataset/water_lily/51197253294_55cd4f33ea_c.jpg new file mode 100644 index 00000000..4b9abde3 Binary files /dev/null and b/src/dataset/water_lily/51197253294_55cd4f33ea_c.jpg differ diff --git a/src/dataset/water_lily/51207421682_fafd8025d2_c.jpg b/src/dataset/water_lily/51207421682_fafd8025d2_c.jpg new file mode 100644 index 00000000..d65e6a7d Binary files /dev/null and b/src/dataset/water_lily/51207421682_fafd8025d2_c.jpg differ diff --git a/src/dataset/water_lily/51216586424_7294a8f4df_c.jpg b/src/dataset/water_lily/51216586424_7294a8f4df_c.jpg new file mode 100644 index 00000000..b3941e00 Binary files /dev/null and b/src/dataset/water_lily/51216586424_7294a8f4df_c.jpg differ diff --git a/src/dataset/water_lily/51226234503_37bd5a8d88_c.jpg b/src/dataset/water_lily/51226234503_37bd5a8d88_c.jpg new file mode 100644 index 00000000..57b92826 Binary files /dev/null and b/src/dataset/water_lily/51226234503_37bd5a8d88_c.jpg differ diff --git a/src/dataset/water_lily/51227634392_ac9bf76c09_c.jpg b/src/dataset/water_lily/51227634392_ac9bf76c09_c.jpg new file mode 100644 index 00000000..ea149fd8 Binary files /dev/null and b/src/dataset/water_lily/51227634392_ac9bf76c09_c.jpg differ diff --git a/src/dataset/water_lily/51230178017_e02d69b338_c.jpg b/src/dataset/water_lily/51230178017_e02d69b338_c.jpg new file mode 100644 index 00000000..d1fcfc68 Binary files /dev/null and b/src/dataset/water_lily/51230178017_e02d69b338_c.jpg differ diff --git a/src/dataset/water_lily/51235769113_5acbcdbb50_c.jpg b/src/dataset/water_lily/51235769113_5acbcdbb50_c.jpg new file mode 100644 index 00000000..6de67937 Binary files /dev/null and b/src/dataset/water_lily/51235769113_5acbcdbb50_c.jpg differ diff --git a/src/dataset/water_lily/51236379119_fc2e448e7b_c.jpg b/src/dataset/water_lily/51236379119_fc2e448e7b_c.jpg new file mode 100644 index 00000000..bd82b0a0 Binary files /dev/null and b/src/dataset/water_lily/51236379119_fc2e448e7b_c.jpg differ diff --git a/src/dataset/water_lily/51243163118_43beacd19a_c.jpg b/src/dataset/water_lily/51243163118_43beacd19a_c.jpg new file mode 100644 index 00000000..9003b93d Binary files /dev/null and b/src/dataset/water_lily/51243163118_43beacd19a_c.jpg differ diff --git a/src/dataset/water_lily/51243284058_fc155e2be1_c.jpg b/src/dataset/water_lily/51243284058_fc155e2be1_c.jpg new file mode 100644 index 00000000..dfc361f4 Binary files /dev/null and b/src/dataset/water_lily/51243284058_fc155e2be1_c.jpg differ diff --git a/src/dataset/water_lily/51248438051_a7e6285b57_c.jpg b/src/dataset/water_lily/51248438051_a7e6285b57_c.jpg new file mode 100644 index 00000000..e3302223 Binary files /dev/null and b/src/dataset/water_lily/51248438051_a7e6285b57_c.jpg differ diff --git a/src/dataset/water_lily/51249285893_cb4bf95a3b_c.jpg b/src/dataset/water_lily/51249285893_cb4bf95a3b_c.jpg new file mode 100644 index 00000000..dac82939 Binary files /dev/null and b/src/dataset/water_lily/51249285893_cb4bf95a3b_c.jpg differ diff --git a/src/dataset/water_lily/51250249923_091e49cea4_c.jpg b/src/dataset/water_lily/51250249923_091e49cea4_c.jpg new file mode 100644 index 00000000..b468c444 Binary files /dev/null and b/src/dataset/water_lily/51250249923_091e49cea4_c.jpg differ diff --git a/src/dataset/water_lily/51254505572_46ae62bfd3_c.jpg b/src/dataset/water_lily/51254505572_46ae62bfd3_c.jpg new file mode 100644 index 00000000..ec036287 Binary files /dev/null and b/src/dataset/water_lily/51254505572_46ae62bfd3_c.jpg differ diff --git a/src/dataset/water_lily/51255544672_ab1d370294_c.jpg b/src/dataset/water_lily/51255544672_ab1d370294_c.jpg new file mode 100644 index 00000000..7239983d Binary files /dev/null and b/src/dataset/water_lily/51255544672_ab1d370294_c.jpg differ diff --git a/src/dataset/water_lily/51256600736_6de0058116_c.jpg b/src/dataset/water_lily/51256600736_6de0058116_c.jpg new file mode 100644 index 00000000..de05be08 Binary files /dev/null and b/src/dataset/water_lily/51256600736_6de0058116_c.jpg differ diff --git a/src/dataset/water_lily/51257025778_1e71efded0_c.jpg b/src/dataset/water_lily/51257025778_1e71efded0_c.jpg new file mode 100644 index 00000000..f3f97f51 Binary files /dev/null and b/src/dataset/water_lily/51257025778_1e71efded0_c.jpg differ diff --git a/src/dataset/water_lily/51257585548_ab8a56d3b3_c.jpg b/src/dataset/water_lily/51257585548_ab8a56d3b3_c.jpg new file mode 100644 index 00000000..abd735bc Binary files /dev/null and b/src/dataset/water_lily/51257585548_ab8a56d3b3_c.jpg differ diff --git a/src/dataset/water_lily/51262183556_d25cb3f640_c.jpg b/src/dataset/water_lily/51262183556_d25cb3f640_c.jpg new file mode 100644 index 00000000..281cb83b Binary files /dev/null and b/src/dataset/water_lily/51262183556_d25cb3f640_c.jpg differ diff --git a/src/dataset/water_lily/51262352372_0ca1e91621_c.jpg b/src/dataset/water_lily/51262352372_0ca1e91621_c.jpg new file mode 100644 index 00000000..48a3bb9f Binary files /dev/null and b/src/dataset/water_lily/51262352372_0ca1e91621_c.jpg differ diff --git a/src/dataset/water_lily/51263234882_38a469e8ec_c.jpg b/src/dataset/water_lily/51263234882_38a469e8ec_c.jpg new file mode 100644 index 00000000..92c992a7 Binary files /dev/null and b/src/dataset/water_lily/51263234882_38a469e8ec_c.jpg differ diff --git a/src/dataset/water_lily/51264326488_c859e1ffe0_c.jpg b/src/dataset/water_lily/51264326488_c859e1ffe0_c.jpg new file mode 100644 index 00000000..9b01731f Binary files /dev/null and b/src/dataset/water_lily/51264326488_c859e1ffe0_c.jpg differ diff --git a/src/dataset/water_lily/51269330332_c73938fa27_c.jpg b/src/dataset/water_lily/51269330332_c73938fa27_c.jpg new file mode 100644 index 00000000..419dea5a Binary files /dev/null and b/src/dataset/water_lily/51269330332_c73938fa27_c.jpg differ diff --git a/src/dataset/water_lily/51271189478_a12f59df64_c.jpg b/src/dataset/water_lily/51271189478_a12f59df64_c.jpg new file mode 100644 index 00000000..c40683b5 Binary files /dev/null and b/src/dataset/water_lily/51271189478_a12f59df64_c.jpg differ diff --git a/src/dataset/water_lily/51272859055_c419c4a111_c.jpg b/src/dataset/water_lily/51272859055_c419c4a111_c.jpg new file mode 100644 index 00000000..105fb8f7 Binary files /dev/null and b/src/dataset/water_lily/51272859055_c419c4a111_c.jpg differ diff --git a/src/dataset/water_lily/51273499944_8065084288_c.jpg b/src/dataset/water_lily/51273499944_8065084288_c.jpg new file mode 100644 index 00000000..3a44659b Binary files /dev/null and b/src/dataset/water_lily/51273499944_8065084288_c.jpg differ diff --git a/src/dataset/water_lily/51274923394_a8beeeb8f8_c.jpg b/src/dataset/water_lily/51274923394_a8beeeb8f8_c.jpg new file mode 100644 index 00000000..e39602ec Binary files /dev/null and b/src/dataset/water_lily/51274923394_a8beeeb8f8_c.jpg differ diff --git a/src/dataset/water_lily/51277454452_f522b7b352_c.jpg b/src/dataset/water_lily/51277454452_f522b7b352_c.jpg new file mode 100644 index 00000000..ab9b8cc8 Binary files /dev/null and b/src/dataset/water_lily/51277454452_f522b7b352_c.jpg differ diff --git a/src/dataset/water_lily/51277467820_53197bfcae_c.jpg b/src/dataset/water_lily/51277467820_53197bfcae_c.jpg new file mode 100644 index 00000000..8013d313 Binary files /dev/null and b/src/dataset/water_lily/51277467820_53197bfcae_c.jpg differ diff --git a/src/dataset/water_lily/51277492562_252518d4c5_c.jpg b/src/dataset/water_lily/51277492562_252518d4c5_c.jpg new file mode 100644 index 00000000..8f05f65d Binary files /dev/null and b/src/dataset/water_lily/51277492562_252518d4c5_c.jpg differ diff --git a/src/dataset/water_lily/51277593880_b18ab6bd68_c.jpg b/src/dataset/water_lily/51277593880_b18ab6bd68_c.jpg new file mode 100644 index 00000000..737b6a3c Binary files /dev/null and b/src/dataset/water_lily/51277593880_b18ab6bd68_c.jpg differ diff --git a/src/dataset/water_lily/51277778029_18bed51fa5_c.jpg b/src/dataset/water_lily/51277778029_18bed51fa5_c.jpg new file mode 100644 index 00000000..5b9c98be Binary files /dev/null and b/src/dataset/water_lily/51277778029_18bed51fa5_c.jpg differ diff --git a/src/dataset/water_lily/51280983956_e237895bf3_c.jpg b/src/dataset/water_lily/51280983956_e237895bf3_c.jpg new file mode 100644 index 00000000..a00638c9 Binary files /dev/null and b/src/dataset/water_lily/51280983956_e237895bf3_c.jpg differ diff --git a/src/dataset/water_lily/51282956581_356e58ab4d_c.jpg b/src/dataset/water_lily/51282956581_356e58ab4d_c.jpg new file mode 100644 index 00000000..37c60980 Binary files /dev/null and b/src/dataset/water_lily/51282956581_356e58ab4d_c.jpg differ diff --git a/src/dataset/water_lily/51283570753_0fc882791d_c.jpg b/src/dataset/water_lily/51283570753_0fc882791d_c.jpg new file mode 100644 index 00000000..50688ab2 Binary files /dev/null and b/src/dataset/water_lily/51283570753_0fc882791d_c.jpg differ diff --git a/src/dataset/water_lily/51285338586_4ef4789522_c.jpg b/src/dataset/water_lily/51285338586_4ef4789522_c.jpg new file mode 100644 index 00000000..6e6769b2 Binary files /dev/null and b/src/dataset/water_lily/51285338586_4ef4789522_c.jpg differ diff --git a/src/dataset/water_lily/51286062164_bd8f39baea_c.jpg b/src/dataset/water_lily/51286062164_bd8f39baea_c.jpg new file mode 100644 index 00000000..13e313ea Binary files /dev/null and b/src/dataset/water_lily/51286062164_bd8f39baea_c.jpg differ diff --git a/src/dataset/water_lily/51287033572_cee8a7551b_c.jpg b/src/dataset/water_lily/51287033572_cee8a7551b_c.jpg new file mode 100644 index 00000000..b6a4a9ed Binary files /dev/null and b/src/dataset/water_lily/51287033572_cee8a7551b_c.jpg differ diff --git a/src/dataset/water_lily/51288910526_9f902de9c1_c.jpg b/src/dataset/water_lily/51288910526_9f902de9c1_c.jpg new file mode 100644 index 00000000..ddae46fa Binary files /dev/null and b/src/dataset/water_lily/51288910526_9f902de9c1_c.jpg differ diff --git a/src/dataset/water_lily/51290951111_4cd0c865bf_c.jpg b/src/dataset/water_lily/51290951111_4cd0c865bf_c.jpg new file mode 100644 index 00000000..cce13898 Binary files /dev/null and b/src/dataset/water_lily/51290951111_4cd0c865bf_c.jpg differ diff --git a/src/dataset/water_lily/51291905376_7894312a0d_c.jpg b/src/dataset/water_lily/51291905376_7894312a0d_c.jpg new file mode 100644 index 00000000..e1e704d6 Binary files /dev/null and b/src/dataset/water_lily/51291905376_7894312a0d_c.jpg differ diff --git a/src/dataset/water_lily/51294248837_cc97f56c07_c.jpg b/src/dataset/water_lily/51294248837_cc97f56c07_c.jpg new file mode 100644 index 00000000..309df530 Binary files /dev/null and b/src/dataset/water_lily/51294248837_cc97f56c07_c.jpg differ diff --git a/src/dataset/water_lily/51296941525_4cb144f1f1_c.jpg b/src/dataset/water_lily/51296941525_4cb144f1f1_c.jpg new file mode 100644 index 00000000..0d5a7452 Binary files /dev/null and b/src/dataset/water_lily/51296941525_4cb144f1f1_c.jpg differ diff --git a/src/dataset/water_lily/51299776609_5925876f47_c.jpg b/src/dataset/water_lily/51299776609_5925876f47_c.jpg new file mode 100644 index 00000000..621b37c0 Binary files /dev/null and b/src/dataset/water_lily/51299776609_5925876f47_c.jpg differ diff --git a/src/dataset/water_lily/51303318306_7f0f004471_c.jpg b/src/dataset/water_lily/51303318306_7f0f004471_c.jpg new file mode 100644 index 00000000..aa4f4346 Binary files /dev/null and b/src/dataset/water_lily/51303318306_7f0f004471_c.jpg differ diff --git a/src/dataset/water_lily/51303342048_e145a8aaa9_c.jpg b/src/dataset/water_lily/51303342048_e145a8aaa9_c.jpg new file mode 100644 index 00000000..f1edc15a Binary files /dev/null and b/src/dataset/water_lily/51303342048_e145a8aaa9_c.jpg differ diff --git a/src/dataset/water_lily/51304526681_f93532dd15_c.jpg b/src/dataset/water_lily/51304526681_f93532dd15_c.jpg new file mode 100644 index 00000000..0e7d9d85 Binary files /dev/null and b/src/dataset/water_lily/51304526681_f93532dd15_c.jpg differ diff --git a/src/dataset/water_lily/51306387478_d3f2ab1177_c.jpg b/src/dataset/water_lily/51306387478_d3f2ab1177_c.jpg new file mode 100644 index 00000000..f32b2fb8 Binary files /dev/null and b/src/dataset/water_lily/51306387478_d3f2ab1177_c.jpg differ diff --git a/src/dataset/water_lily/51308170252_62af0fb29a_c.jpg b/src/dataset/water_lily/51308170252_62af0fb29a_c.jpg new file mode 100644 index 00000000..9c8a4864 Binary files /dev/null and b/src/dataset/water_lily/51308170252_62af0fb29a_c.jpg differ diff --git a/src/dataset/water_lily/51308880080_5065d52445_c.jpg b/src/dataset/water_lily/51308880080_5065d52445_c.jpg new file mode 100644 index 00000000..3bc156c6 Binary files /dev/null and b/src/dataset/water_lily/51308880080_5065d52445_c.jpg differ diff --git a/src/dataset/water_lily/51311669392_2e1c60af01_c.jpg b/src/dataset/water_lily/51311669392_2e1c60af01_c.jpg new file mode 100644 index 00000000..9181073d Binary files /dev/null and b/src/dataset/water_lily/51311669392_2e1c60af01_c.jpg differ diff --git a/src/dataset/water_lily/51313001497_a2e9d9e0f7_c.jpg b/src/dataset/water_lily/51313001497_a2e9d9e0f7_c.jpg new file mode 100644 index 00000000..08378ba7 Binary files /dev/null and b/src/dataset/water_lily/51313001497_a2e9d9e0f7_c.jpg differ diff --git a/src/dataset/water_lily/51315529813_5ce1645995_c.jpg b/src/dataset/water_lily/51315529813_5ce1645995_c.jpg new file mode 100644 index 00000000..4c9c642c Binary files /dev/null and b/src/dataset/water_lily/51315529813_5ce1645995_c.jpg differ diff --git a/src/dataset/water_lily/51320116965_5774025661_c.jpg b/src/dataset/water_lily/51320116965_5774025661_c.jpg new file mode 100644 index 00000000..2c4b4b2d Binary files /dev/null and b/src/dataset/water_lily/51320116965_5774025661_c.jpg differ diff --git a/src/dataset/water_lily/51323962683_232b2b7cea_c.jpg b/src/dataset/water_lily/51323962683_232b2b7cea_c.jpg new file mode 100644 index 00000000..41091b65 Binary files /dev/null and b/src/dataset/water_lily/51323962683_232b2b7cea_c.jpg differ diff --git a/src/dataset/water_lily/51331449115_a104827de0_c.jpg b/src/dataset/water_lily/51331449115_a104827de0_c.jpg new file mode 100644 index 00000000..1d82ab77 Binary files /dev/null and b/src/dataset/water_lily/51331449115_a104827de0_c.jpg differ diff --git a/src/dataset/water_lily/51332043270_5e6480b277_c.jpg b/src/dataset/water_lily/51332043270_5e6480b277_c.jpg new file mode 100644 index 00000000..58812e1a Binary files /dev/null and b/src/dataset/water_lily/51332043270_5e6480b277_c.jpg differ diff --git a/src/dataset/water_lily/51339460839_61c16b3ce3_c.jpg b/src/dataset/water_lily/51339460839_61c16b3ce3_c.jpg new file mode 100644 index 00000000..b2f5e6cf Binary files /dev/null and b/src/dataset/water_lily/51339460839_61c16b3ce3_c.jpg differ diff --git a/src/dataset/water_lily/51340424630_eeeab1b510_c.jpg b/src/dataset/water_lily/51340424630_eeeab1b510_c.jpg new file mode 100644 index 00000000..2e6424b6 Binary files /dev/null and b/src/dataset/water_lily/51340424630_eeeab1b510_c.jpg differ diff --git a/src/dataset/water_lily/51341147467_b9491ec66e_c.jpg b/src/dataset/water_lily/51341147467_b9491ec66e_c.jpg new file mode 100644 index 00000000..35b3edcb Binary files /dev/null and b/src/dataset/water_lily/51341147467_b9491ec66e_c.jpg differ diff --git a/src/dataset/water_lily/51351713718_5474ea8c70_c.jpg b/src/dataset/water_lily/51351713718_5474ea8c70_c.jpg new file mode 100644 index 00000000..9e368425 Binary files /dev/null and b/src/dataset/water_lily/51351713718_5474ea8c70_c.jpg differ diff --git a/src/dataset/water_lily/51352784765_5f800d7d18_c.jpg b/src/dataset/water_lily/51352784765_5f800d7d18_c.jpg new file mode 100644 index 00000000..2a621284 Binary files /dev/null and b/src/dataset/water_lily/51352784765_5f800d7d18_c.jpg differ diff --git a/src/dataset/water_lily/51354424532_4e38db965f_c.jpg b/src/dataset/water_lily/51354424532_4e38db965f_c.jpg new file mode 100644 index 00000000..1dbaab8f Binary files /dev/null and b/src/dataset/water_lily/51354424532_4e38db965f_c.jpg differ diff --git a/src/dataset/water_lily/51360860841_1fed774857_c.jpg b/src/dataset/water_lily/51360860841_1fed774857_c.jpg new file mode 100644 index 00000000..871a3f17 Binary files /dev/null and b/src/dataset/water_lily/51360860841_1fed774857_c.jpg differ diff --git a/src/dataset/water_lily/51361701067_2dcfdea4fb_c.jpg b/src/dataset/water_lily/51361701067_2dcfdea4fb_c.jpg new file mode 100644 index 00000000..86e739f8 Binary files /dev/null and b/src/dataset/water_lily/51361701067_2dcfdea4fb_c.jpg differ diff --git a/src/dataset/water_lily/51364977726_dbc195686d_c.jpg b/src/dataset/water_lily/51364977726_dbc195686d_c.jpg new file mode 100644 index 00000000..b9e7f0ec Binary files /dev/null and b/src/dataset/water_lily/51364977726_dbc195686d_c.jpg differ diff --git a/src/dataset/water_lily/51365174229_1d5215c76b_c.jpg b/src/dataset/water_lily/51365174229_1d5215c76b_c.jpg new file mode 100644 index 00000000..92b8de73 Binary files /dev/null and b/src/dataset/water_lily/51365174229_1d5215c76b_c.jpg differ diff --git a/src/dataset/water_lily/51365764747_58482bbe17_c.jpg b/src/dataset/water_lily/51365764747_58482bbe17_c.jpg new file mode 100644 index 00000000..d5bbc248 Binary files /dev/null and b/src/dataset/water_lily/51365764747_58482bbe17_c.jpg differ diff --git a/src/dataset/water_lily/51365832197_ac7d32234f_c.jpg b/src/dataset/water_lily/51365832197_ac7d32234f_c.jpg new file mode 100644 index 00000000..be7af96d Binary files /dev/null and b/src/dataset/water_lily/51365832197_ac7d32234f_c.jpg differ diff --git a/src/dataset/water_lily/51370129549_5ab2db2a2a_c.jpg b/src/dataset/water_lily/51370129549_5ab2db2a2a_c.jpg new file mode 100644 index 00000000..2384bbc0 Binary files /dev/null and b/src/dataset/water_lily/51370129549_5ab2db2a2a_c.jpg differ diff --git a/src/dataset/water_lily/51371099557_1d8abc2d77_c.jpg b/src/dataset/water_lily/51371099557_1d8abc2d77_c.jpg new file mode 100644 index 00000000..b1cd668a Binary files /dev/null and b/src/dataset/water_lily/51371099557_1d8abc2d77_c.jpg differ diff --git a/src/dataset/water_lily/51371668286_529144328c_c.jpg b/src/dataset/water_lily/51371668286_529144328c_c.jpg new file mode 100644 index 00000000..fb2cf08e Binary files /dev/null and b/src/dataset/water_lily/51371668286_529144328c_c.jpg differ diff --git a/src/dataset/water_lily/51374778672_83486f06a0_c.jpg b/src/dataset/water_lily/51374778672_83486f06a0_c.jpg new file mode 100644 index 00000000..b05ee814 Binary files /dev/null and b/src/dataset/water_lily/51374778672_83486f06a0_c.jpg differ diff --git a/src/dataset/water_lily/51377323846_ed18d452f0_c.jpg b/src/dataset/water_lily/51377323846_ed18d452f0_c.jpg new file mode 100644 index 00000000..afbf5868 Binary files /dev/null and b/src/dataset/water_lily/51377323846_ed18d452f0_c.jpg differ diff --git a/src/dataset/water_lily/51379165388_b1668ae441_c.jpg b/src/dataset/water_lily/51379165388_b1668ae441_c.jpg new file mode 100644 index 00000000..6ac6c1c0 Binary files /dev/null and b/src/dataset/water_lily/51379165388_b1668ae441_c.jpg differ diff --git a/src/dataset/water_lily/51379442524_e0d3042ae9_c.jpg b/src/dataset/water_lily/51379442524_e0d3042ae9_c.jpg new file mode 100644 index 00000000..9e4da17e Binary files /dev/null and b/src/dataset/water_lily/51379442524_e0d3042ae9_c.jpg differ diff --git a/src/dataset/water_lily/51379810061_8b215c0705_c.jpg b/src/dataset/water_lily/51379810061_8b215c0705_c.jpg new file mode 100644 index 00000000..3308fa1e Binary files /dev/null and b/src/dataset/water_lily/51379810061_8b215c0705_c.jpg differ diff --git a/src/dataset/water_lily/51379947265_645de57830_c.jpg b/src/dataset/water_lily/51379947265_645de57830_c.jpg new file mode 100644 index 00000000..875d23eb Binary files /dev/null and b/src/dataset/water_lily/51379947265_645de57830_c.jpg differ diff --git a/src/dataset/water_lily/51380821905_d978c346a1_c.jpg b/src/dataset/water_lily/51380821905_d978c346a1_c.jpg new file mode 100644 index 00000000..5555f01e Binary files /dev/null and b/src/dataset/water_lily/51380821905_d978c346a1_c.jpg differ diff --git a/src/dataset/water_lily/51381201119_81359bbfdf_c.jpg b/src/dataset/water_lily/51381201119_81359bbfdf_c.jpg new file mode 100644 index 00000000..dd6edf87 Binary files /dev/null and b/src/dataset/water_lily/51381201119_81359bbfdf_c.jpg differ diff --git a/src/dataset/water_lily/51387024309_bfc056f183_c.jpg b/src/dataset/water_lily/51387024309_bfc056f183_c.jpg new file mode 100644 index 00000000..195770d5 Binary files /dev/null and b/src/dataset/water_lily/51387024309_bfc056f183_c.jpg differ diff --git a/src/dataset/water_lily/51388844529_548129d1c6_c.jpg b/src/dataset/water_lily/51388844529_548129d1c6_c.jpg new file mode 100644 index 00000000..c256ab82 Binary files /dev/null and b/src/dataset/water_lily/51388844529_548129d1c6_c.jpg differ diff --git a/src/dataset/water_lily/51396455464_300548319f_c.jpg b/src/dataset/water_lily/51396455464_300548319f_c.jpg new file mode 100644 index 00000000..f6792853 Binary files /dev/null and b/src/dataset/water_lily/51396455464_300548319f_c.jpg differ diff --git a/src/dataset/water_lily/51405998877_e952aef2be_c.jpg b/src/dataset/water_lily/51405998877_e952aef2be_c.jpg new file mode 100644 index 00000000..2ab6c3a4 Binary files /dev/null and b/src/dataset/water_lily/51405998877_e952aef2be_c.jpg differ diff --git a/src/dataset/water_lily/51408224039_de365a290f_c.jpg b/src/dataset/water_lily/51408224039_de365a290f_c.jpg new file mode 100644 index 00000000..8bfb7ebd Binary files /dev/null and b/src/dataset/water_lily/51408224039_de365a290f_c.jpg differ diff --git a/src/dataset/water_lily/51409041400_d67e25f67d_c.jpg b/src/dataset/water_lily/51409041400_d67e25f67d_c.jpg new file mode 100644 index 00000000..c058841d Binary files /dev/null and b/src/dataset/water_lily/51409041400_d67e25f67d_c.jpg differ diff --git a/src/dataset/water_lily/51410719620_6e65248f0d_c.jpg b/src/dataset/water_lily/51410719620_6e65248f0d_c.jpg new file mode 100644 index 00000000..927d807b Binary files /dev/null and b/src/dataset/water_lily/51410719620_6e65248f0d_c.jpg differ diff --git a/src/dataset/water_lily/51412669820_d5d283d7c4_c.jpg b/src/dataset/water_lily/51412669820_d5d283d7c4_c.jpg new file mode 100644 index 00000000..64f44d18 Binary files /dev/null and b/src/dataset/water_lily/51412669820_d5d283d7c4_c.jpg differ diff --git a/src/dataset/water_lily/51413711921_a5d292694b_c.jpg b/src/dataset/water_lily/51413711921_a5d292694b_c.jpg new file mode 100644 index 00000000..aac2c1fb Binary files /dev/null and b/src/dataset/water_lily/51413711921_a5d292694b_c.jpg differ diff --git a/src/dataset/water_lily/51421095941_97ee362659_c.jpg b/src/dataset/water_lily/51421095941_97ee362659_c.jpg new file mode 100644 index 00000000..7e6012cd Binary files /dev/null and b/src/dataset/water_lily/51421095941_97ee362659_c.jpg differ diff --git a/src/dataset/water_lily/51424225855_f1d9e88059_c.jpg b/src/dataset/water_lily/51424225855_f1d9e88059_c.jpg new file mode 100644 index 00000000..c09f4629 Binary files /dev/null and b/src/dataset/water_lily/51424225855_f1d9e88059_c.jpg differ diff --git a/src/dataset/water_lily/51428774495_c4cc1fc586_c.jpg b/src/dataset/water_lily/51428774495_c4cc1fc586_c.jpg new file mode 100644 index 00000000..b933cda1 Binary files /dev/null and b/src/dataset/water_lily/51428774495_c4cc1fc586_c.jpg differ diff --git a/src/dataset/water_lily/51429631483_2dc1d790ff_c.jpg b/src/dataset/water_lily/51429631483_2dc1d790ff_c.jpg new file mode 100644 index 00000000..69d8a45e Binary files /dev/null and b/src/dataset/water_lily/51429631483_2dc1d790ff_c.jpg differ diff --git a/src/dataset/water_lily/51431276553_750efe9fef_c.jpg b/src/dataset/water_lily/51431276553_750efe9fef_c.jpg new file mode 100644 index 00000000..b38ab634 Binary files /dev/null and b/src/dataset/water_lily/51431276553_750efe9fef_c.jpg differ diff --git a/src/dataset/water_lily/51434362144_67b4f7f806_c.jpg b/src/dataset/water_lily/51434362144_67b4f7f806_c.jpg new file mode 100644 index 00000000..a2ed5af8 Binary files /dev/null and b/src/dataset/water_lily/51434362144_67b4f7f806_c.jpg differ diff --git a/src/dataset/water_lily/51434956866_bebcd56217_c.jpg b/src/dataset/water_lily/51434956866_bebcd56217_c.jpg new file mode 100644 index 00000000..26e286c1 Binary files /dev/null and b/src/dataset/water_lily/51434956866_bebcd56217_c.jpg differ diff --git a/src/dataset/water_lily/51435666694_8c056d95ed_c.jpg b/src/dataset/water_lily/51435666694_8c056d95ed_c.jpg new file mode 100644 index 00000000..634daae3 Binary files /dev/null and b/src/dataset/water_lily/51435666694_8c056d95ed_c.jpg differ diff --git a/src/dataset/water_lily/51435754562_06c36789f7_c.jpg b/src/dataset/water_lily/51435754562_06c36789f7_c.jpg new file mode 100644 index 00000000..736aa5de Binary files /dev/null and b/src/dataset/water_lily/51435754562_06c36789f7_c.jpg differ diff --git a/src/dataset/water_lily/51439243753_23008f1b98_c.jpg b/src/dataset/water_lily/51439243753_23008f1b98_c.jpg new file mode 100644 index 00000000..fac4216d Binary files /dev/null and b/src/dataset/water_lily/51439243753_23008f1b98_c.jpg differ diff --git a/src/dataset/water_lily/51448848562_ea99c03302_c.jpg b/src/dataset/water_lily/51448848562_ea99c03302_c.jpg new file mode 100644 index 00000000..32e0bad8 Binary files /dev/null and b/src/dataset/water_lily/51448848562_ea99c03302_c.jpg differ diff --git a/src/dataset/water_lily/51449298068_7cbb99af92_c.jpg b/src/dataset/water_lily/51449298068_7cbb99af92_c.jpg new file mode 100644 index 00000000..2119b199 Binary files /dev/null and b/src/dataset/water_lily/51449298068_7cbb99af92_c.jpg differ diff --git a/src/dataset/water_lily/51457493246_e15a091500_c.jpg b/src/dataset/water_lily/51457493246_e15a091500_c.jpg new file mode 100644 index 00000000..1b0bdbc2 Binary files /dev/null and b/src/dataset/water_lily/51457493246_e15a091500_c.jpg differ diff --git a/src/dataset/water_lily/51459184957_0c97faced8_c.jpg b/src/dataset/water_lily/51459184957_0c97faced8_c.jpg new file mode 100644 index 00000000..68e0113e Binary files /dev/null and b/src/dataset/water_lily/51459184957_0c97faced8_c.jpg differ diff --git a/src/dataset/water_lily/51463686534_a4fbeb01a1_c.jpg b/src/dataset/water_lily/51463686534_a4fbeb01a1_c.jpg new file mode 100644 index 00000000..3ac02c06 Binary files /dev/null and b/src/dataset/water_lily/51463686534_a4fbeb01a1_c.jpg differ diff --git a/src/dataset/water_lily/51469013142_f452d1178b_c.jpg b/src/dataset/water_lily/51469013142_f452d1178b_c.jpg new file mode 100644 index 00000000..45086a42 Binary files /dev/null and b/src/dataset/water_lily/51469013142_f452d1178b_c.jpg differ diff --git a/src/dataset/water_lily/51478609713_47418a5ac9_c.jpg b/src/dataset/water_lily/51478609713_47418a5ac9_c.jpg new file mode 100644 index 00000000..04c6b91e Binary files /dev/null and b/src/dataset/water_lily/51478609713_47418a5ac9_c.jpg differ diff --git a/src/dataset/water_lily/51496401166_d98785d1bc_c.jpg b/src/dataset/water_lily/51496401166_d98785d1bc_c.jpg new file mode 100644 index 00000000..1fd1477c Binary files /dev/null and b/src/dataset/water_lily/51496401166_d98785d1bc_c.jpg differ diff --git a/src/dataset/water_lily/51501295789_27da9c8764_c.jpg b/src/dataset/water_lily/51501295789_27da9c8764_c.jpg new file mode 100644 index 00000000..7e6163d7 Binary files /dev/null and b/src/dataset/water_lily/51501295789_27da9c8764_c.jpg differ diff --git a/src/dataset/water_lily/51516498666_725bd94ba2_c.jpg b/src/dataset/water_lily/51516498666_725bd94ba2_c.jpg new file mode 100644 index 00000000..ff37f85e Binary files /dev/null and b/src/dataset/water_lily/51516498666_725bd94ba2_c.jpg differ diff --git a/src/dataset/water_lily/51520015302_8f12260654_c.jpg b/src/dataset/water_lily/51520015302_8f12260654_c.jpg new file mode 100644 index 00000000..67440745 Binary files /dev/null and b/src/dataset/water_lily/51520015302_8f12260654_c.jpg differ diff --git a/src/dataset/water_lily/51521536744_8f2814c796_c.jpg b/src/dataset/water_lily/51521536744_8f2814c796_c.jpg new file mode 100644 index 00000000..79c89825 Binary files /dev/null and b/src/dataset/water_lily/51521536744_8f2814c796_c.jpg differ diff --git a/src/dataset/water_lily/51523204828_669e99fb02_c.jpg b/src/dataset/water_lily/51523204828_669e99fb02_c.jpg new file mode 100644 index 00000000..cf5ebbf8 Binary files /dev/null and b/src/dataset/water_lily/51523204828_669e99fb02_c.jpg differ diff --git a/src/dataset/water_lily/51538429351_f6794619e5_c.jpg b/src/dataset/water_lily/51538429351_f6794619e5_c.jpg new file mode 100644 index 00000000..94c73fb4 Binary files /dev/null and b/src/dataset/water_lily/51538429351_f6794619e5_c.jpg differ diff --git a/src/dataset/water_lily/51542759838_6e72279194_c.jpg b/src/dataset/water_lily/51542759838_6e72279194_c.jpg new file mode 100644 index 00000000..e0e39dc7 Binary files /dev/null and b/src/dataset/water_lily/51542759838_6e72279194_c.jpg differ diff --git a/src/dataset/water_lily/51547675934_51d87a4e85_c.jpg b/src/dataset/water_lily/51547675934_51d87a4e85_c.jpg new file mode 100644 index 00000000..a33a283b Binary files /dev/null and b/src/dataset/water_lily/51547675934_51d87a4e85_c.jpg differ diff --git a/src/dataset/water_lily/51573179810_1267d81aa0_c.jpg b/src/dataset/water_lily/51573179810_1267d81aa0_c.jpg new file mode 100644 index 00000000..febefe9f Binary files /dev/null and b/src/dataset/water_lily/51573179810_1267d81aa0_c.jpg differ diff --git a/src/dataset/water_lily/51574587967_4988dea832_c.jpg b/src/dataset/water_lily/51574587967_4988dea832_c.jpg new file mode 100644 index 00000000..05f3c477 Binary files /dev/null and b/src/dataset/water_lily/51574587967_4988dea832_c.jpg differ diff --git a/src/dataset/water_lily/51582898543_cfacf0beaf_c.jpg b/src/dataset/water_lily/51582898543_cfacf0beaf_c.jpg new file mode 100644 index 00000000..7ebd2427 Binary files /dev/null and b/src/dataset/water_lily/51582898543_cfacf0beaf_c.jpg differ diff --git a/src/dataset/water_lily/51592739495_43dd761d33_c.jpg b/src/dataset/water_lily/51592739495_43dd761d33_c.jpg new file mode 100644 index 00000000..8069659a Binary files /dev/null and b/src/dataset/water_lily/51592739495_43dd761d33_c.jpg differ diff --git a/src/dataset/water_lily/51619663771_0f8aa1f352_c.jpg b/src/dataset/water_lily/51619663771_0f8aa1f352_c.jpg new file mode 100644 index 00000000..55344578 Binary files /dev/null and b/src/dataset/water_lily/51619663771_0f8aa1f352_c.jpg differ diff --git a/src/dataset/water_lily/51623012437_92d41e96d6_c.jpg b/src/dataset/water_lily/51623012437_92d41e96d6_c.jpg new file mode 100644 index 00000000..f736072f Binary files /dev/null and b/src/dataset/water_lily/51623012437_92d41e96d6_c.jpg differ diff --git a/src/dataset/water_lily/51630698541_60a569c132_c.jpg b/src/dataset/water_lily/51630698541_60a569c132_c.jpg new file mode 100644 index 00000000..2c9f437a Binary files /dev/null and b/src/dataset/water_lily/51630698541_60a569c132_c.jpg differ diff --git a/src/dataset/water_lily/51632918229_cc24a357e8_c.jpg b/src/dataset/water_lily/51632918229_cc24a357e8_c.jpg new file mode 100644 index 00000000..8950b338 Binary files /dev/null and b/src/dataset/water_lily/51632918229_cc24a357e8_c.jpg differ diff --git a/src/dataset/water_lily/51667211280_c60018c215_c.jpg b/src/dataset/water_lily/51667211280_c60018c215_c.jpg new file mode 100644 index 00000000..df860b02 Binary files /dev/null and b/src/dataset/water_lily/51667211280_c60018c215_c.jpg differ diff --git a/src/dataset/water_lily/51683079461_1fd1df840e_c.jpg b/src/dataset/water_lily/51683079461_1fd1df840e_c.jpg new file mode 100644 index 00000000..61f4374a Binary files /dev/null and b/src/dataset/water_lily/51683079461_1fd1df840e_c.jpg differ diff --git a/src/dataset/water_lily/51683495731_39cf1aa0fb_c.jpg b/src/dataset/water_lily/51683495731_39cf1aa0fb_c.jpg new file mode 100644 index 00000000..aa2c9e4a Binary files /dev/null and b/src/dataset/water_lily/51683495731_39cf1aa0fb_c.jpg differ diff --git a/src/dataset/water_lily/51684324172_9e4d163c59_c.jpg b/src/dataset/water_lily/51684324172_9e4d163c59_c.jpg new file mode 100644 index 00000000..9afd874b Binary files /dev/null and b/src/dataset/water_lily/51684324172_9e4d163c59_c.jpg differ diff --git a/src/dataset/water_lily/51687361057_82463f5ea1_c.jpg b/src/dataset/water_lily/51687361057_82463f5ea1_c.jpg new file mode 100644 index 00000000..68943b9a Binary files /dev/null and b/src/dataset/water_lily/51687361057_82463f5ea1_c.jpg differ diff --git a/src/dataset/water_lily/51689222440_94f55c2de8_c.jpg b/src/dataset/water_lily/51689222440_94f55c2de8_c.jpg new file mode 100644 index 00000000..534a3a71 Binary files /dev/null and b/src/dataset/water_lily/51689222440_94f55c2de8_c.jpg differ diff --git a/src/dataset/water_lily/51708597930_147f55e253_c.jpg b/src/dataset/water_lily/51708597930_147f55e253_c.jpg new file mode 100644 index 00000000..75d06a00 Binary files /dev/null and b/src/dataset/water_lily/51708597930_147f55e253_c.jpg differ diff --git a/src/dataset/water_lily/51708960576_775123535c_c.jpg b/src/dataset/water_lily/51708960576_775123535c_c.jpg new file mode 100644 index 00000000..12ee7a59 Binary files /dev/null and b/src/dataset/water_lily/51708960576_775123535c_c.jpg differ diff --git a/src/dataset/water_lily/51709527205_44d0a95da8_c.jpg b/src/dataset/water_lily/51709527205_44d0a95da8_c.jpg new file mode 100644 index 00000000..7a5f2a04 Binary files /dev/null and b/src/dataset/water_lily/51709527205_44d0a95da8_c.jpg differ diff --git a/src/dataset/water_lily/51709529185_a0941fd4de_c.jpg b/src/dataset/water_lily/51709529185_a0941fd4de_c.jpg new file mode 100644 index 00000000..0dba7387 Binary files /dev/null and b/src/dataset/water_lily/51709529185_a0941fd4de_c.jpg differ diff --git a/src/dataset/water_lily/51710450324_8c330da717_c.jpg b/src/dataset/water_lily/51710450324_8c330da717_c.jpg new file mode 100644 index 00000000..870a1151 Binary files /dev/null and b/src/dataset/water_lily/51710450324_8c330da717_c.jpg differ diff --git a/src/dataset/water_lily/51713152428_ba10a2f68d_c.jpg b/src/dataset/water_lily/51713152428_ba10a2f68d_c.jpg new file mode 100644 index 00000000..7fbc1032 Binary files /dev/null and b/src/dataset/water_lily/51713152428_ba10a2f68d_c.jpg differ diff --git a/src/dataset/water_lily/51722468386_a825011852_c.jpg b/src/dataset/water_lily/51722468386_a825011852_c.jpg new file mode 100644 index 00000000..fc39631d Binary files /dev/null and b/src/dataset/water_lily/51722468386_a825011852_c.jpg differ diff --git a/src/dataset/water_lily/51722712467_86d20190d6_c.jpg b/src/dataset/water_lily/51722712467_86d20190d6_c.jpg new file mode 100644 index 00000000..098ce245 Binary files /dev/null and b/src/dataset/water_lily/51722712467_86d20190d6_c.jpg differ diff --git a/src/dataset/water_lily/51727511661_170bd83f60_c.jpg b/src/dataset/water_lily/51727511661_170bd83f60_c.jpg new file mode 100644 index 00000000..64a2e871 Binary files /dev/null and b/src/dataset/water_lily/51727511661_170bd83f60_c.jpg differ diff --git a/src/dataset/water_lily/51731364734_a2f41b5757_c.jpg b/src/dataset/water_lily/51731364734_a2f41b5757_c.jpg new file mode 100644 index 00000000..629e9fd3 Binary files /dev/null and b/src/dataset/water_lily/51731364734_a2f41b5757_c.jpg differ diff --git a/src/dataset/water_lily/51739199361_5b3b454f77_c.jpg b/src/dataset/water_lily/51739199361_5b3b454f77_c.jpg new file mode 100644 index 00000000..75a4de6e Binary files /dev/null and b/src/dataset/water_lily/51739199361_5b3b454f77_c.jpg differ diff --git a/src/dataset/water_lily/51755458121_a2f15d0ae3_c.jpg b/src/dataset/water_lily/51755458121_a2f15d0ae3_c.jpg new file mode 100644 index 00000000..1a264aba Binary files /dev/null and b/src/dataset/water_lily/51755458121_a2f15d0ae3_c.jpg differ diff --git a/src/dataset/water_lily/51780510474_e003eef243_c.jpg b/src/dataset/water_lily/51780510474_e003eef243_c.jpg new file mode 100644 index 00000000..4a2c3bce Binary files /dev/null and b/src/dataset/water_lily/51780510474_e003eef243_c.jpg differ diff --git a/src/dataset/water_lily/51794711594_db88cfbcc8_c.jpg b/src/dataset/water_lily/51794711594_db88cfbcc8_c.jpg new file mode 100644 index 00000000..15a0d4df Binary files /dev/null and b/src/dataset/water_lily/51794711594_db88cfbcc8_c.jpg differ diff --git a/src/dataset/water_lily/51798377340_e6e7e09aae_c.jpg b/src/dataset/water_lily/51798377340_e6e7e09aae_c.jpg new file mode 100644 index 00000000..efe6ab61 Binary files /dev/null and b/src/dataset/water_lily/51798377340_e6e7e09aae_c.jpg differ diff --git a/src/dataset/water_lily/51808184225_d2d809cef7_c.jpg b/src/dataset/water_lily/51808184225_d2d809cef7_c.jpg new file mode 100644 index 00000000..71d4f563 Binary files /dev/null and b/src/dataset/water_lily/51808184225_d2d809cef7_c.jpg differ diff --git a/src/dataset/water_lily/51814262218_91a9a42791_c.jpg b/src/dataset/water_lily/51814262218_91a9a42791_c.jpg new file mode 100644 index 00000000..9b3e75bf Binary files /dev/null and b/src/dataset/water_lily/51814262218_91a9a42791_c.jpg differ diff --git a/src/dataset/water_lily/51815044095_20c2939848_c.jpg b/src/dataset/water_lily/51815044095_20c2939848_c.jpg new file mode 100644 index 00000000..2a7489b3 Binary files /dev/null and b/src/dataset/water_lily/51815044095_20c2939848_c.jpg differ diff --git a/src/dataset/water_lily/51827246793_248c3f09ab_c.jpg b/src/dataset/water_lily/51827246793_248c3f09ab_c.jpg new file mode 100644 index 00000000..6817bbe5 Binary files /dev/null and b/src/dataset/water_lily/51827246793_248c3f09ab_c.jpg differ diff --git a/src/dataset/water_lily/51829169976_a096d6cd81_c.jpg b/src/dataset/water_lily/51829169976_a096d6cd81_c.jpg new file mode 100644 index 00000000..676d7b6c Binary files /dev/null and b/src/dataset/water_lily/51829169976_a096d6cd81_c.jpg differ diff --git a/src/dataset/water_lily/51835876477_9356b7f8cf_c.jpg b/src/dataset/water_lily/51835876477_9356b7f8cf_c.jpg new file mode 100644 index 00000000..c7b0df8a Binary files /dev/null and b/src/dataset/water_lily/51835876477_9356b7f8cf_c.jpg differ diff --git a/src/dataset/water_lily/51848125224_c00a803eeb_c.jpg b/src/dataset/water_lily/51848125224_c00a803eeb_c.jpg new file mode 100644 index 00000000..001e790f Binary files /dev/null and b/src/dataset/water_lily/51848125224_c00a803eeb_c.jpg differ diff --git a/src/dataset/water_lily/51853253797_6840d8d8ea_c.jpg b/src/dataset/water_lily/51853253797_6840d8d8ea_c.jpg new file mode 100644 index 00000000..622aa72f Binary files /dev/null and b/src/dataset/water_lily/51853253797_6840d8d8ea_c.jpg differ diff --git a/src/dataset/water_lily/51893474622_674fdccf0f_c.jpg b/src/dataset/water_lily/51893474622_674fdccf0f_c.jpg new file mode 100644 index 00000000..9a2f323f Binary files /dev/null and b/src/dataset/water_lily/51893474622_674fdccf0f_c.jpg differ diff --git a/src/dataset/water_lily/51902148983_06412aeec4_c.jpg b/src/dataset/water_lily/51902148983_06412aeec4_c.jpg new file mode 100644 index 00000000..94653171 Binary files /dev/null and b/src/dataset/water_lily/51902148983_06412aeec4_c.jpg differ diff --git a/src/dataset/water_lily/51912509667_7a3da09f01_c.jpg b/src/dataset/water_lily/51912509667_7a3da09f01_c.jpg new file mode 100644 index 00000000..3c3f5bbb Binary files /dev/null and b/src/dataset/water_lily/51912509667_7a3da09f01_c.jpg differ diff --git a/src/dataset/water_lily/51912593077_4c2c8b393c_c.jpg b/src/dataset/water_lily/51912593077_4c2c8b393c_c.jpg new file mode 100644 index 00000000..9750c74b Binary files /dev/null and b/src/dataset/water_lily/51912593077_4c2c8b393c_c.jpg differ diff --git a/src/dataset/water_lily/51928859573_bde1b52758_c.jpg b/src/dataset/water_lily/51928859573_bde1b52758_c.jpg new file mode 100644 index 00000000..4d67f861 Binary files /dev/null and b/src/dataset/water_lily/51928859573_bde1b52758_c.jpg differ diff --git a/src/dataset/water_lily/51933237122_98fd2ae202_c.jpg b/src/dataset/water_lily/51933237122_98fd2ae202_c.jpg new file mode 100644 index 00000000..964c28cf Binary files /dev/null and b/src/dataset/water_lily/51933237122_98fd2ae202_c.jpg differ diff --git a/src/dataset/water_lily/51941819136_c8dddb7a55_c.jpg b/src/dataset/water_lily/51941819136_c8dddb7a55_c.jpg new file mode 100644 index 00000000..5b427521 Binary files /dev/null and b/src/dataset/water_lily/51941819136_c8dddb7a55_c.jpg differ diff --git a/src/dataset/water_lily/51946954274_589aaa58aa_c.jpg b/src/dataset/water_lily/51946954274_589aaa58aa_c.jpg new file mode 100644 index 00000000..8d7b08af Binary files /dev/null and b/src/dataset/water_lily/51946954274_589aaa58aa_c.jpg differ diff --git a/src/dataset/water_lily/51951819577_58f4d78414_c.jpg b/src/dataset/water_lily/51951819577_58f4d78414_c.jpg new file mode 100644 index 00000000..268de4ae Binary files /dev/null and b/src/dataset/water_lily/51951819577_58f4d78414_c.jpg differ diff --git a/src/dataset/water_lily/51968193492_3e10083bb4_c.jpg b/src/dataset/water_lily/51968193492_3e10083bb4_c.jpg new file mode 100644 index 00000000..f86f2df9 Binary files /dev/null and b/src/dataset/water_lily/51968193492_3e10083bb4_c.jpg differ diff --git a/src/dataset/water_lily/51985172091_04d44306f7_c.jpg b/src/dataset/water_lily/51985172091_04d44306f7_c.jpg new file mode 100644 index 00000000..fc5ec1ba Binary files /dev/null and b/src/dataset/water_lily/51985172091_04d44306f7_c.jpg differ diff --git a/src/dataset/water_lily/51987020945_0b85520bbf_c.jpg b/src/dataset/water_lily/51987020945_0b85520bbf_c.jpg new file mode 100644 index 00000000..0e4c264b Binary files /dev/null and b/src/dataset/water_lily/51987020945_0b85520bbf_c.jpg differ diff --git a/src/dataset/water_lily/51988389858_7a7c0b0cd6_c.jpg b/src/dataset/water_lily/51988389858_7a7c0b0cd6_c.jpg new file mode 100644 index 00000000..2754b618 Binary files /dev/null and b/src/dataset/water_lily/51988389858_7a7c0b0cd6_c.jpg differ diff --git a/src/dataset/water_lily/51999221990_59e1cf4400_c.jpg b/src/dataset/water_lily/51999221990_59e1cf4400_c.jpg new file mode 100644 index 00000000..75aed663 Binary files /dev/null and b/src/dataset/water_lily/51999221990_59e1cf4400_c.jpg differ diff --git a/src/dataset/water_lily/52008845825_0224b72de4_c.jpg b/src/dataset/water_lily/52008845825_0224b72de4_c.jpg new file mode 100644 index 00000000..d4f093b0 Binary files /dev/null and b/src/dataset/water_lily/52008845825_0224b72de4_c.jpg differ diff --git a/src/dataset/water_lily/5205141414_082ab48a1d_c.jpg b/src/dataset/water_lily/5205141414_082ab48a1d_c.jpg new file mode 100644 index 00000000..30817d0c Binary files /dev/null and b/src/dataset/water_lily/5205141414_082ab48a1d_c.jpg differ diff --git a/src/dataset/water_lily/5844816709_c23ff5db1c_c.jpg b/src/dataset/water_lily/5844816709_c23ff5db1c_c.jpg new file mode 100644 index 00000000..91c7eea9 Binary files /dev/null and b/src/dataset/water_lily/5844816709_c23ff5db1c_c.jpg differ diff --git a/src/dataset/water_lily/5858201081_3cf523ba79_c.jpg b/src/dataset/water_lily/5858201081_3cf523ba79_c.jpg new file mode 100644 index 00000000..9192b8be Binary files /dev/null and b/src/dataset/water_lily/5858201081_3cf523ba79_c.jpg differ diff --git a/src/dataset/water_lily/5858201309_2716d1cf52_c.jpg b/src/dataset/water_lily/5858201309_2716d1cf52_c.jpg new file mode 100644 index 00000000..e7026b1f Binary files /dev/null and b/src/dataset/water_lily/5858201309_2716d1cf52_c.jpg differ diff --git a/src/dataset/water_lily/5858202825_80c693cc49_c.jpg b/src/dataset/water_lily/5858202825_80c693cc49_c.jpg new file mode 100644 index 00000000..8e7d1a41 Binary files /dev/null and b/src/dataset/water_lily/5858202825_80c693cc49_c.jpg differ diff --git a/src/dataset/water_lily/5858752720_a2985f8651_c.jpg b/src/dataset/water_lily/5858752720_a2985f8651_c.jpg new file mode 100644 index 00000000..a978eef9 Binary files /dev/null and b/src/dataset/water_lily/5858752720_a2985f8651_c.jpg differ diff --git a/src/dataset/water_lily/5858752904_74718668a5_c.jpg b/src/dataset/water_lily/5858752904_74718668a5_c.jpg new file mode 100644 index 00000000..fd842608 Binary files /dev/null and b/src/dataset/water_lily/5858752904_74718668a5_c.jpg differ diff --git a/src/dataset/water_lily/5858753094_7454ff896a_c.jpg b/src/dataset/water_lily/5858753094_7454ff896a_c.jpg new file mode 100644 index 00000000..c1809dee Binary files /dev/null and b/src/dataset/water_lily/5858753094_7454ff896a_c.jpg differ diff --git a/src/dataset/water_lily/5858753824_ea77830404_c.jpg b/src/dataset/water_lily/5858753824_ea77830404_c.jpg new file mode 100644 index 00000000..85eca44c Binary files /dev/null and b/src/dataset/water_lily/5858753824_ea77830404_c.jpg differ diff --git a/src/dataset/water_lily/5869072921_a2924fef4f_c.jpg b/src/dataset/water_lily/5869072921_a2924fef4f_c.jpg new file mode 100644 index 00000000..345baf35 Binary files /dev/null and b/src/dataset/water_lily/5869072921_a2924fef4f_c.jpg differ diff --git a/src/dataset/water_lily/5872663460_7759e60865_c.jpg b/src/dataset/water_lily/5872663460_7759e60865_c.jpg new file mode 100644 index 00000000..3baee837 Binary files /dev/null and b/src/dataset/water_lily/5872663460_7759e60865_c.jpg differ diff --git a/src/dataset/water_lily/5880507518_2ae939bb6f_c.jpg b/src/dataset/water_lily/5880507518_2ae939bb6f_c.jpg new file mode 100644 index 00000000..5fd9d4b2 Binary files /dev/null and b/src/dataset/water_lily/5880507518_2ae939bb6f_c.jpg differ diff --git a/src/dataset/water_lily/5898746697_16b139f98e_c.jpg b/src/dataset/water_lily/5898746697_16b139f98e_c.jpg new file mode 100644 index 00000000..44a1c712 Binary files /dev/null and b/src/dataset/water_lily/5898746697_16b139f98e_c.jpg differ diff --git a/src/dataset/water_lily/5950882374_3455930758_c.jpg b/src/dataset/water_lily/5950882374_3455930758_c.jpg new file mode 100644 index 00000000..707cce1a Binary files /dev/null and b/src/dataset/water_lily/5950882374_3455930758_c.jpg differ diff --git a/src/dataset/water_lily/5960208645_634082aede_c.jpg b/src/dataset/water_lily/5960208645_634082aede_c.jpg new file mode 100644 index 00000000..dc652743 Binary files /dev/null and b/src/dataset/water_lily/5960208645_634082aede_c.jpg differ diff --git a/src/dataset/water_lily/5965292734_f46e16a54e_c.jpg b/src/dataset/water_lily/5965292734_f46e16a54e_c.jpg new file mode 100644 index 00000000..e1e6e560 Binary files /dev/null and b/src/dataset/water_lily/5965292734_f46e16a54e_c.jpg differ diff --git a/src/dataset/water_lily/6067741295_73788dee17_c.jpg b/src/dataset/water_lily/6067741295_73788dee17_c.jpg new file mode 100644 index 00000000..4e0734fe Binary files /dev/null and b/src/dataset/water_lily/6067741295_73788dee17_c.jpg differ diff --git a/src/dataset/water_lily/6125361115_84958ff26c_c.jpg b/src/dataset/water_lily/6125361115_84958ff26c_c.jpg new file mode 100644 index 00000000..84e38605 Binary files /dev/null and b/src/dataset/water_lily/6125361115_84958ff26c_c.jpg differ diff --git a/src/dataset/water_lily/6172094227_ae6857c8c7_c.jpg b/src/dataset/water_lily/6172094227_ae6857c8c7_c.jpg new file mode 100644 index 00000000..4452a4fd Binary files /dev/null and b/src/dataset/water_lily/6172094227_ae6857c8c7_c.jpg differ diff --git a/src/dataset/water_lily/671423848_797b90a05a_c.jpg b/src/dataset/water_lily/671423848_797b90a05a_c.jpg new file mode 100644 index 00000000..36e39cd4 Binary files /dev/null and b/src/dataset/water_lily/671423848_797b90a05a_c.jpg differ diff --git a/src/dataset/water_lily/711809526_a486de50f9_c.jpg b/src/dataset/water_lily/711809526_a486de50f9_c.jpg new file mode 100644 index 00000000..a59d9cd8 Binary files /dev/null and b/src/dataset/water_lily/711809526_a486de50f9_c.jpg differ diff --git a/src/dataset/water_lily/7302349700_9d9a67a1e3_c.jpg b/src/dataset/water_lily/7302349700_9d9a67a1e3_c.jpg new file mode 100644 index 00000000..0f0670e2 Binary files /dev/null and b/src/dataset/water_lily/7302349700_9d9a67a1e3_c.jpg differ diff --git a/src/dataset/water_lily/7416031518_965cfd67db_c.jpg b/src/dataset/water_lily/7416031518_965cfd67db_c.jpg new file mode 100644 index 00000000..270fedf3 Binary files /dev/null and b/src/dataset/water_lily/7416031518_965cfd67db_c.jpg differ diff --git a/src/dataset/water_lily/7427095226_06d560a28d_c.jpg b/src/dataset/water_lily/7427095226_06d560a28d_c.jpg new file mode 100644 index 00000000..91bb1f50 Binary files /dev/null and b/src/dataset/water_lily/7427095226_06d560a28d_c.jpg differ diff --git a/src/dataset/water_lily/7658709464_402183a1f0_c.jpg b/src/dataset/water_lily/7658709464_402183a1f0_c.jpg new file mode 100644 index 00000000..56abef60 Binary files /dev/null and b/src/dataset/water_lily/7658709464_402183a1f0_c.jpg differ diff --git a/src/dataset/water_lily/7724670406_6ef9d3a246_c.jpg b/src/dataset/water_lily/7724670406_6ef9d3a246_c.jpg new file mode 100644 index 00000000..d56bfd98 Binary files /dev/null and b/src/dataset/water_lily/7724670406_6ef9d3a246_c.jpg differ diff --git a/src/dataset/water_lily/7829682760_a592bc7689_c.jpg b/src/dataset/water_lily/7829682760_a592bc7689_c.jpg new file mode 100644 index 00000000..8bdb645d Binary files /dev/null and b/src/dataset/water_lily/7829682760_a592bc7689_c.jpg differ diff --git a/src/dataset/water_lily/8036423018_095e1e2ec6_c.jpg b/src/dataset/water_lily/8036423018_095e1e2ec6_c.jpg new file mode 100644 index 00000000..15ef528e Binary files /dev/null and b/src/dataset/water_lily/8036423018_095e1e2ec6_c.jpg differ diff --git a/src/dataset/water_lily/8046741940_f506ca9a9c_c.jpg b/src/dataset/water_lily/8046741940_f506ca9a9c_c.jpg new file mode 100644 index 00000000..84f02cc1 Binary files /dev/null and b/src/dataset/water_lily/8046741940_f506ca9a9c_c.jpg differ diff --git a/src/dataset/water_lily/8212317172_9257510e9e_c.jpg b/src/dataset/water_lily/8212317172_9257510e9e_c.jpg new file mode 100644 index 00000000..1585952f Binary files /dev/null and b/src/dataset/water_lily/8212317172_9257510e9e_c.jpg differ diff --git a/src/dataset/water_lily/8474299747_7bd1abc65a_c.jpg b/src/dataset/water_lily/8474299747_7bd1abc65a_c.jpg new file mode 100644 index 00000000..15e07136 Binary files /dev/null and b/src/dataset/water_lily/8474299747_7bd1abc65a_c.jpg differ diff --git a/src/dataset/water_lily/8565303213_09c029af43_c.jpg b/src/dataset/water_lily/8565303213_09c029af43_c.jpg new file mode 100644 index 00000000..42d24063 Binary files /dev/null and b/src/dataset/water_lily/8565303213_09c029af43_c.jpg differ diff --git a/src/dataset/water_lily/8655745244_62a38da602_c.jpg b/src/dataset/water_lily/8655745244_62a38da602_c.jpg new file mode 100644 index 00000000..e756cbfa Binary files /dev/null and b/src/dataset/water_lily/8655745244_62a38da602_c.jpg differ diff --git a/src/dataset/water_lily/8663368518_90d6069bec_c.jpg b/src/dataset/water_lily/8663368518_90d6069bec_c.jpg new file mode 100644 index 00000000..e1886a5f Binary files /dev/null and b/src/dataset/water_lily/8663368518_90d6069bec_c.jpg differ diff --git a/src/dataset/water_lily/8738038191_6ec4b02102_c.jpg b/src/dataset/water_lily/8738038191_6ec4b02102_c.jpg new file mode 100644 index 00000000..41a443b9 Binary files /dev/null and b/src/dataset/water_lily/8738038191_6ec4b02102_c.jpg differ diff --git a/src/dataset/water_lily/9026391751_d0ee58e1ef_c.jpg b/src/dataset/water_lily/9026391751_d0ee58e1ef_c.jpg new file mode 100644 index 00000000..6b5f686c Binary files /dev/null and b/src/dataset/water_lily/9026391751_d0ee58e1ef_c.jpg differ diff --git a/src/dataset/water_lily/9054606897_8f9b43f8de_c.jpg b/src/dataset/water_lily/9054606897_8f9b43f8de_c.jpg new file mode 100644 index 00000000..6e9faa40 Binary files /dev/null and b/src/dataset/water_lily/9054606897_8f9b43f8de_c.jpg differ diff --git a/src/dataset/water_lily/9192827211_c469c38e1c_c.jpg b/src/dataset/water_lily/9192827211_c469c38e1c_c.jpg new file mode 100644 index 00000000..8654005a Binary files /dev/null and b/src/dataset/water_lily/9192827211_c469c38e1c_c.jpg differ diff --git a/src/dataset/water_lily/9234219732_a207140f13_c.jpg b/src/dataset/water_lily/9234219732_a207140f13_c.jpg new file mode 100644 index 00000000..c478a381 Binary files /dev/null and b/src/dataset/water_lily/9234219732_a207140f13_c.jpg differ diff --git a/src/dataset/water_lily/9237185451_c0189b8ae2_c.jpg b/src/dataset/water_lily/9237185451_c0189b8ae2_c.jpg new file mode 100644 index 00000000..67e47001 Binary files /dev/null and b/src/dataset/water_lily/9237185451_c0189b8ae2_c.jpg differ diff --git a/src/dataset/water_lily/9272115899_6a6ec05b56_c.jpg b/src/dataset/water_lily/9272115899_6a6ec05b56_c.jpg new file mode 100644 index 00000000..31e07228 Binary files /dev/null and b/src/dataset/water_lily/9272115899_6a6ec05b56_c.jpg differ diff --git a/src/dataset/water_lily/9304752495_5fdc35cda2_c.jpg b/src/dataset/water_lily/9304752495_5fdc35cda2_c.jpg new file mode 100644 index 00000000..cebfe7b9 Binary files /dev/null and b/src/dataset/water_lily/9304752495_5fdc35cda2_c.jpg differ diff --git a/src/dataset/water_lily/9307395870_88e2c9d602_c.jpg b/src/dataset/water_lily/9307395870_88e2c9d602_c.jpg new file mode 100644 index 00000000..2421ce9c Binary files /dev/null and b/src/dataset/water_lily/9307395870_88e2c9d602_c.jpg differ diff --git a/src/dataset/water_lily/9381365165_1e4c66a1a9_c.jpg b/src/dataset/water_lily/9381365165_1e4c66a1a9_c.jpg new file mode 100644 index 00000000..fd25d9cb Binary files /dev/null and b/src/dataset/water_lily/9381365165_1e4c66a1a9_c.jpg differ diff --git a/src/dataset/water_lily/9388505036_f567902ea1_c.jpg b/src/dataset/water_lily/9388505036_f567902ea1_c.jpg new file mode 100644 index 00000000..c7bf472f Binary files /dev/null and b/src/dataset/water_lily/9388505036_f567902ea1_c.jpg differ diff --git a/src/dataset/water_lily/9486809877_b11f0b7046_c.jpg b/src/dataset/water_lily/9486809877_b11f0b7046_c.jpg new file mode 100644 index 00000000..eb1c7665 Binary files /dev/null and b/src/dataset/water_lily/9486809877_b11f0b7046_c.jpg differ diff --git a/src/dataset/water_lily/9567107261_1cf89d8b9a_c.jpg b/src/dataset/water_lily/9567107261_1cf89d8b9a_c.jpg new file mode 100644 index 00000000..c0e8a8e8 Binary files /dev/null and b/src/dataset/water_lily/9567107261_1cf89d8b9a_c.jpg differ diff --git a/src/dataset/water_lily/b18fea82a4.jpg b/src/dataset/water_lily/b18fea82a4.jpg new file mode 100644 index 00000000..1f05ad9c Binary files /dev/null and b/src/dataset/water_lily/b18fea82a4.jpg differ diff --git a/src/dataset/water_lily/b218d03360.jpg b/src/dataset/water_lily/b218d03360.jpg new file mode 100644 index 00000000..dc57e75a Binary files /dev/null and b/src/dataset/water_lily/b218d03360.jpg differ diff --git a/src/dataset/water_lily/b33d806ec5.jpg b/src/dataset/water_lily/b33d806ec5.jpg new file mode 100644 index 00000000..1b24a9a6 Binary files /dev/null and b/src/dataset/water_lily/b33d806ec5.jpg differ diff --git a/src/dataset/water_lily/b377742878.jpg b/src/dataset/water_lily/b377742878.jpg new file mode 100644 index 00000000..dcd235ce Binary files /dev/null and b/src/dataset/water_lily/b377742878.jpg differ diff --git a/src/dataset/water_lily/b3b0324fc6.jpg b/src/dataset/water_lily/b3b0324fc6.jpg new file mode 100644 index 00000000..5942234c Binary files /dev/null and b/src/dataset/water_lily/b3b0324fc6.jpg differ diff --git a/src/dataset/water_lily/b406f24541.jpg b/src/dataset/water_lily/b406f24541.jpg new file mode 100644 index 00000000..3c327cab Binary files /dev/null and b/src/dataset/water_lily/b406f24541.jpg differ diff --git a/src/dataset/water_lily/b52cad1d69.jpg b/src/dataset/water_lily/b52cad1d69.jpg new file mode 100644 index 00000000..c183dc48 Binary files /dev/null and b/src/dataset/water_lily/b52cad1d69.jpg differ diff --git a/src/dataset/water_lily/b6fd684eeb.jpg b/src/dataset/water_lily/b6fd684eeb.jpg new file mode 100644 index 00000000..a7f2ae3a Binary files /dev/null and b/src/dataset/water_lily/b6fd684eeb.jpg differ diff --git a/src/dataset/water_lily/b809e15c24.jpg b/src/dataset/water_lily/b809e15c24.jpg new file mode 100644 index 00000000..730baf61 Binary files /dev/null and b/src/dataset/water_lily/b809e15c24.jpg differ diff --git a/src/dataset/water_lily/b8813ee71e.jpg b/src/dataset/water_lily/b8813ee71e.jpg new file mode 100644 index 00000000..62e945fe Binary files /dev/null and b/src/dataset/water_lily/b8813ee71e.jpg differ diff --git a/src/dataset/water_lily/b88f0cdfa5.jpg b/src/dataset/water_lily/b88f0cdfa5.jpg new file mode 100644 index 00000000..bb72054d Binary files /dev/null and b/src/dataset/water_lily/b88f0cdfa5.jpg differ diff --git a/src/dataset/water_lily/b976625c65.jpg b/src/dataset/water_lily/b976625c65.jpg new file mode 100644 index 00000000..e5d11116 Binary files /dev/null and b/src/dataset/water_lily/b976625c65.jpg differ diff --git a/src/dataset/water_lily/b9a8c08eb4.jpg b/src/dataset/water_lily/b9a8c08eb4.jpg new file mode 100644 index 00000000..152305bc Binary files /dev/null and b/src/dataset/water_lily/b9a8c08eb4.jpg differ diff --git a/src/dataset/water_lily/bb50844c63.jpg b/src/dataset/water_lily/bb50844c63.jpg new file mode 100644 index 00000000..9a7c37e2 Binary files /dev/null and b/src/dataset/water_lily/bb50844c63.jpg differ diff --git a/src/dataset/water_lily/bb53b05e2f.jpg b/src/dataset/water_lily/bb53b05e2f.jpg new file mode 100644 index 00000000..8562f63b Binary files /dev/null and b/src/dataset/water_lily/bb53b05e2f.jpg differ diff --git a/src/dataset/water_lily/bc86755e7f.jpg b/src/dataset/water_lily/bc86755e7f.jpg new file mode 100644 index 00000000..73527d57 Binary files /dev/null and b/src/dataset/water_lily/bc86755e7f.jpg differ diff --git a/src/dataset/water_lily/bd274c8587.jpg b/src/dataset/water_lily/bd274c8587.jpg new file mode 100644 index 00000000..bc7e780e Binary files /dev/null and b/src/dataset/water_lily/bd274c8587.jpg differ diff --git a/src/dataset/water_lily/be917ac17f.jpg b/src/dataset/water_lily/be917ac17f.jpg new file mode 100644 index 00000000..123f19b9 Binary files /dev/null and b/src/dataset/water_lily/be917ac17f.jpg differ diff --git a/src/dataset/water_lily/bf47616121.jpg b/src/dataset/water_lily/bf47616121.jpg new file mode 100644 index 00000000..bb4b2eb6 Binary files /dev/null and b/src/dataset/water_lily/bf47616121.jpg differ diff --git a/src/dataset/water_lily/bf73ef0654.jpg b/src/dataset/water_lily/bf73ef0654.jpg new file mode 100644 index 00000000..e323ef74 Binary files /dev/null and b/src/dataset/water_lily/bf73ef0654.jpg differ diff --git a/src/dataset/water_lily/c05abc9f15.jpg b/src/dataset/water_lily/c05abc9f15.jpg new file mode 100644 index 00000000..2e771180 Binary files /dev/null and b/src/dataset/water_lily/c05abc9f15.jpg differ diff --git a/src/dataset/water_lily/c07086615d.jpg b/src/dataset/water_lily/c07086615d.jpg new file mode 100644 index 00000000..1439418a Binary files /dev/null and b/src/dataset/water_lily/c07086615d.jpg differ diff --git a/src/dataset/water_lily/c206c14594.jpg b/src/dataset/water_lily/c206c14594.jpg new file mode 100644 index 00000000..4d3cf0d4 Binary files /dev/null and b/src/dataset/water_lily/c206c14594.jpg differ diff --git a/src/dataset/water_lily/c27be59c79.jpg b/src/dataset/water_lily/c27be59c79.jpg new file mode 100644 index 00000000..7182010a Binary files /dev/null and b/src/dataset/water_lily/c27be59c79.jpg differ diff --git a/src/dataset/water_lily/c287f08a5a.jpg b/src/dataset/water_lily/c287f08a5a.jpg new file mode 100644 index 00000000..511bbb58 Binary files /dev/null and b/src/dataset/water_lily/c287f08a5a.jpg differ diff --git a/src/dataset/water_lily/c2d708e510.jpg b/src/dataset/water_lily/c2d708e510.jpg new file mode 100644 index 00000000..0b6e321b Binary files /dev/null and b/src/dataset/water_lily/c2d708e510.jpg differ diff --git a/src/dataset/water_lily/c3833ea880.jpg b/src/dataset/water_lily/c3833ea880.jpg new file mode 100644 index 00000000..148cc35e Binary files /dev/null and b/src/dataset/water_lily/c3833ea880.jpg differ diff --git a/src/dataset/water_lily/c39be41802.jpg b/src/dataset/water_lily/c39be41802.jpg new file mode 100644 index 00000000..6cf97e8c Binary files /dev/null and b/src/dataset/water_lily/c39be41802.jpg differ diff --git a/src/dataset/water_lily/c3f1e23b7b.jpg b/src/dataset/water_lily/c3f1e23b7b.jpg new file mode 100644 index 00000000..5dc3e57b Binary files /dev/null and b/src/dataset/water_lily/c3f1e23b7b.jpg differ diff --git a/src/dataset/water_lily/c48c2da2a4.jpg b/src/dataset/water_lily/c48c2da2a4.jpg new file mode 100644 index 00000000..78d3fb21 Binary files /dev/null and b/src/dataset/water_lily/c48c2da2a4.jpg differ diff --git a/src/dataset/water_lily/c4fe1ca700.jpg b/src/dataset/water_lily/c4fe1ca700.jpg new file mode 100644 index 00000000..723b02c0 Binary files /dev/null and b/src/dataset/water_lily/c4fe1ca700.jpg differ diff --git a/src/dataset/water_lily/c550783cb6.jpg b/src/dataset/water_lily/c550783cb6.jpg new file mode 100644 index 00000000..c3cf9372 Binary files /dev/null and b/src/dataset/water_lily/c550783cb6.jpg differ diff --git a/src/dataset/water_lily/c557b98552.jpg b/src/dataset/water_lily/c557b98552.jpg new file mode 100644 index 00000000..457a240b Binary files /dev/null and b/src/dataset/water_lily/c557b98552.jpg differ diff --git a/src/dataset/water_lily/c603051ee5.jpg b/src/dataset/water_lily/c603051ee5.jpg new file mode 100644 index 00000000..820cd596 Binary files /dev/null and b/src/dataset/water_lily/c603051ee5.jpg differ diff --git a/src/dataset/water_lily/c6c2e9da27.jpg b/src/dataset/water_lily/c6c2e9da27.jpg new file mode 100644 index 00000000..7358b401 Binary files /dev/null and b/src/dataset/water_lily/c6c2e9da27.jpg differ diff --git a/src/dataset/water_lily/c6e8853640.jpg b/src/dataset/water_lily/c6e8853640.jpg new file mode 100644 index 00000000..e9f76445 Binary files /dev/null and b/src/dataset/water_lily/c6e8853640.jpg differ diff --git a/src/dataset/water_lily/c6ee78d69f.jpg b/src/dataset/water_lily/c6ee78d69f.jpg new file mode 100644 index 00000000..3cc2808f Binary files /dev/null and b/src/dataset/water_lily/c6ee78d69f.jpg differ diff --git a/src/dataset/water_lily/c71b5a4d52.jpg b/src/dataset/water_lily/c71b5a4d52.jpg new file mode 100644 index 00000000..239788cf Binary files /dev/null and b/src/dataset/water_lily/c71b5a4d52.jpg differ diff --git a/src/dataset/water_lily/c8c095ea34.jpg b/src/dataset/water_lily/c8c095ea34.jpg new file mode 100644 index 00000000..a7895fca Binary files /dev/null and b/src/dataset/water_lily/c8c095ea34.jpg differ diff --git a/src/dataset/water_lily/c976d97be7.jpg b/src/dataset/water_lily/c976d97be7.jpg new file mode 100644 index 00000000..1f378c6a Binary files /dev/null and b/src/dataset/water_lily/c976d97be7.jpg differ diff --git a/src/dataset/water_lily/cb23abed61.jpg b/src/dataset/water_lily/cb23abed61.jpg new file mode 100644 index 00000000..79cb4c47 Binary files /dev/null and b/src/dataset/water_lily/cb23abed61.jpg differ diff --git a/src/dataset/water_lily/cbae6ff0f0.jpg b/src/dataset/water_lily/cbae6ff0f0.jpg new file mode 100644 index 00000000..b419eacf Binary files /dev/null and b/src/dataset/water_lily/cbae6ff0f0.jpg differ diff --git a/src/dataset/water_lily/cc7e1dafc0.jpg b/src/dataset/water_lily/cc7e1dafc0.jpg new file mode 100644 index 00000000..a91795bf Binary files /dev/null and b/src/dataset/water_lily/cc7e1dafc0.jpg differ diff --git a/src/dataset/water_lily/ccc3ca3a3d.jpg b/src/dataset/water_lily/ccc3ca3a3d.jpg new file mode 100644 index 00000000..26f1a123 Binary files /dev/null and b/src/dataset/water_lily/ccc3ca3a3d.jpg differ diff --git a/src/dataset/water_lily/ccf9c96229.jpg b/src/dataset/water_lily/ccf9c96229.jpg new file mode 100644 index 00000000..2dc3d71e Binary files /dev/null and b/src/dataset/water_lily/ccf9c96229.jpg differ diff --git a/src/dataset/water_lily/cd2e907ca2.jpg b/src/dataset/water_lily/cd2e907ca2.jpg new file mode 100644 index 00000000..24a2c537 Binary files /dev/null and b/src/dataset/water_lily/cd2e907ca2.jpg differ diff --git a/src/dataset/water_lily/cdcb15e9d4.jpg b/src/dataset/water_lily/cdcb15e9d4.jpg new file mode 100644 index 00000000..bdee683d Binary files /dev/null and b/src/dataset/water_lily/cdcb15e9d4.jpg differ diff --git a/src/dataset/water_lily/ce545f5882.jpg b/src/dataset/water_lily/ce545f5882.jpg new file mode 100644 index 00000000..edffec3f Binary files /dev/null and b/src/dataset/water_lily/ce545f5882.jpg differ diff --git a/src/dataset/water_lily/d2272be6da.jpg b/src/dataset/water_lily/d2272be6da.jpg new file mode 100644 index 00000000..7c80a37d Binary files /dev/null and b/src/dataset/water_lily/d2272be6da.jpg differ diff --git a/src/dataset/water_lily/d25dde342c.jpg b/src/dataset/water_lily/d25dde342c.jpg new file mode 100644 index 00000000..191cf6b0 Binary files /dev/null and b/src/dataset/water_lily/d25dde342c.jpg differ diff --git a/src/dataset/water_lily/d2f4b5ac46.jpg b/src/dataset/water_lily/d2f4b5ac46.jpg new file mode 100644 index 00000000..2e8bfaee Binary files /dev/null and b/src/dataset/water_lily/d2f4b5ac46.jpg differ diff --git a/src/dataset/water_lily/d33d00001b.jpg b/src/dataset/water_lily/d33d00001b.jpg new file mode 100644 index 00000000..e4704467 Binary files /dev/null and b/src/dataset/water_lily/d33d00001b.jpg differ diff --git a/src/dataset/water_lily/d389e79fcf.jpg b/src/dataset/water_lily/d389e79fcf.jpg new file mode 100644 index 00000000..5670bdd7 Binary files /dev/null and b/src/dataset/water_lily/d389e79fcf.jpg differ diff --git a/src/dataset/water_lily/d3f07c84e6.jpg b/src/dataset/water_lily/d3f07c84e6.jpg new file mode 100644 index 00000000..c66f0498 Binary files /dev/null and b/src/dataset/water_lily/d3f07c84e6.jpg differ diff --git a/src/dataset/water_lily/d474636e99.jpg b/src/dataset/water_lily/d474636e99.jpg new file mode 100644 index 00000000..80f993d0 Binary files /dev/null and b/src/dataset/water_lily/d474636e99.jpg differ diff --git a/src/dataset/water_lily/d534282b32.jpg b/src/dataset/water_lily/d534282b32.jpg new file mode 100644 index 00000000..159a9563 Binary files /dev/null and b/src/dataset/water_lily/d534282b32.jpg differ diff --git a/src/dataset/water_lily/d6ad9fc060.jpg b/src/dataset/water_lily/d6ad9fc060.jpg new file mode 100644 index 00000000..7cdfb30e Binary files /dev/null and b/src/dataset/water_lily/d6ad9fc060.jpg differ diff --git a/src/dataset/water_lily/d7143baff9.jpg b/src/dataset/water_lily/d7143baff9.jpg new file mode 100644 index 00000000..af526c8e Binary files /dev/null and b/src/dataset/water_lily/d7143baff9.jpg differ diff --git a/src/dataset/water_lily/d78e26382c.jpg b/src/dataset/water_lily/d78e26382c.jpg new file mode 100644 index 00000000..78f92a01 Binary files /dev/null and b/src/dataset/water_lily/d78e26382c.jpg differ diff --git a/src/dataset/water_lily/d9392d8314.jpg b/src/dataset/water_lily/d9392d8314.jpg new file mode 100644 index 00000000..811f7526 Binary files /dev/null and b/src/dataset/water_lily/d9392d8314.jpg differ diff --git a/src/dataset/water_lily/db94294a3e.jpg b/src/dataset/water_lily/db94294a3e.jpg new file mode 100644 index 00000000..bcf67058 Binary files /dev/null and b/src/dataset/water_lily/db94294a3e.jpg differ diff --git a/src/dataset/water_lily/dbdae9d531.jpg b/src/dataset/water_lily/dbdae9d531.jpg new file mode 100644 index 00000000..566349a5 Binary files /dev/null and b/src/dataset/water_lily/dbdae9d531.jpg differ diff --git a/src/dataset/water_lily/dcacc44d3f.jpg b/src/dataset/water_lily/dcacc44d3f.jpg new file mode 100644 index 00000000..814c911d Binary files /dev/null and b/src/dataset/water_lily/dcacc44d3f.jpg differ diff --git a/src/dataset/water_lily/de78b8289c.jpg b/src/dataset/water_lily/de78b8289c.jpg new file mode 100644 index 00000000..a23435ec Binary files /dev/null and b/src/dataset/water_lily/de78b8289c.jpg differ diff --git a/src/dataset/water_lily/dea3d50d51.jpg b/src/dataset/water_lily/dea3d50d51.jpg new file mode 100644 index 00000000..f3f31143 Binary files /dev/null and b/src/dataset/water_lily/dea3d50d51.jpg differ diff --git a/src/dataset/water_lily/decd56f90b.jpg b/src/dataset/water_lily/decd56f90b.jpg new file mode 100644 index 00000000..7b4414ca Binary files /dev/null and b/src/dataset/water_lily/decd56f90b.jpg differ diff --git a/src/dataset/water_lily/dece5c23ae.jpg b/src/dataset/water_lily/dece5c23ae.jpg new file mode 100644 index 00000000..ada4834c Binary files /dev/null and b/src/dataset/water_lily/dece5c23ae.jpg differ diff --git a/src/dataset/water_lily/dfe33b2495.jpg b/src/dataset/water_lily/dfe33b2495.jpg new file mode 100644 index 00000000..4d784804 Binary files /dev/null and b/src/dataset/water_lily/dfe33b2495.jpg differ diff --git a/src/dataset/water_lily/e0d3a26266.jpg b/src/dataset/water_lily/e0d3a26266.jpg new file mode 100644 index 00000000..7cf63134 Binary files /dev/null and b/src/dataset/water_lily/e0d3a26266.jpg differ diff --git a/src/dataset/water_lily/e114466895.jpg b/src/dataset/water_lily/e114466895.jpg new file mode 100644 index 00000000..ec2d2e8c Binary files /dev/null and b/src/dataset/water_lily/e114466895.jpg differ diff --git a/src/dataset/water_lily/e17b85a7ab.jpg b/src/dataset/water_lily/e17b85a7ab.jpg new file mode 100644 index 00000000..fd451bce Binary files /dev/null and b/src/dataset/water_lily/e17b85a7ab.jpg differ diff --git a/src/dataset/water_lily/e1c66f8a68.jpg b/src/dataset/water_lily/e1c66f8a68.jpg new file mode 100644 index 00000000..bae05bdc Binary files /dev/null and b/src/dataset/water_lily/e1c66f8a68.jpg differ diff --git a/src/dataset/water_lily/e223eeb3f6.jpg b/src/dataset/water_lily/e223eeb3f6.jpg new file mode 100644 index 00000000..052aff36 Binary files /dev/null and b/src/dataset/water_lily/e223eeb3f6.jpg differ diff --git a/src/dataset/water_lily/e2956d7670.jpg b/src/dataset/water_lily/e2956d7670.jpg new file mode 100644 index 00000000..7bf875b9 Binary files /dev/null and b/src/dataset/water_lily/e2956d7670.jpg differ diff --git a/src/dataset/water_lily/e35251ddae.jpg b/src/dataset/water_lily/e35251ddae.jpg new file mode 100644 index 00000000..85700778 Binary files /dev/null and b/src/dataset/water_lily/e35251ddae.jpg differ diff --git a/src/dataset/water_lily/e54fe30150.jpg b/src/dataset/water_lily/e54fe30150.jpg new file mode 100644 index 00000000..a5c39cee Binary files /dev/null and b/src/dataset/water_lily/e54fe30150.jpg differ diff --git a/src/dataset/water_lily/e6ca4dc831.jpg b/src/dataset/water_lily/e6ca4dc831.jpg new file mode 100644 index 00000000..e8a19b64 Binary files /dev/null and b/src/dataset/water_lily/e6ca4dc831.jpg differ diff --git a/src/dataset/water_lily/e7130eacc7.jpg b/src/dataset/water_lily/e7130eacc7.jpg new file mode 100644 index 00000000..7147ff5e Binary files /dev/null and b/src/dataset/water_lily/e7130eacc7.jpg differ diff --git a/src/dataset/water_lily/e76abf6e28.jpg b/src/dataset/water_lily/e76abf6e28.jpg new file mode 100644 index 00000000..68b4b6a6 Binary files /dev/null and b/src/dataset/water_lily/e76abf6e28.jpg differ diff --git a/src/dataset/water_lily/e7f524a4bb.jpg b/src/dataset/water_lily/e7f524a4bb.jpg new file mode 100644 index 00000000..4f1a9b30 Binary files /dev/null and b/src/dataset/water_lily/e7f524a4bb.jpg differ diff --git a/src/dataset/water_lily/e9b224848f.jpg b/src/dataset/water_lily/e9b224848f.jpg new file mode 100644 index 00000000..1f9c9a36 Binary files /dev/null and b/src/dataset/water_lily/e9b224848f.jpg differ diff --git a/src/dataset/water_lily/ea1250b6b9.jpg b/src/dataset/water_lily/ea1250b6b9.jpg new file mode 100644 index 00000000..5ddbe1ae Binary files /dev/null and b/src/dataset/water_lily/ea1250b6b9.jpg differ diff --git a/src/dataset/water_lily/eba2673ae5.jpg b/src/dataset/water_lily/eba2673ae5.jpg new file mode 100644 index 00000000..28b93f9a Binary files /dev/null and b/src/dataset/water_lily/eba2673ae5.jpg differ diff --git a/src/dataset/water_lily/ebf12218b3.jpg b/src/dataset/water_lily/ebf12218b3.jpg new file mode 100644 index 00000000..a230df58 Binary files /dev/null and b/src/dataset/water_lily/ebf12218b3.jpg differ diff --git a/src/dataset/water_lily/ecd58e0cbb.jpg b/src/dataset/water_lily/ecd58e0cbb.jpg new file mode 100644 index 00000000..227bd025 Binary files /dev/null and b/src/dataset/water_lily/ecd58e0cbb.jpg differ diff --git a/src/dataset/water_lily/ed12eae804.jpg b/src/dataset/water_lily/ed12eae804.jpg new file mode 100644 index 00000000..a8164912 Binary files /dev/null and b/src/dataset/water_lily/ed12eae804.jpg differ diff --git a/src/dataset/water_lily/ee600bdc05.jpg b/src/dataset/water_lily/ee600bdc05.jpg new file mode 100644 index 00000000..73b5ad90 Binary files /dev/null and b/src/dataset/water_lily/ee600bdc05.jpg differ diff --git a/src/dataset/water_lily/eefe193534.jpg b/src/dataset/water_lily/eefe193534.jpg new file mode 100644 index 00000000..37661060 Binary files /dev/null and b/src/dataset/water_lily/eefe193534.jpg differ diff --git a/src/dataset/water_lily/efbd037b89.jpg b/src/dataset/water_lily/efbd037b89.jpg new file mode 100644 index 00000000..792da9be Binary files /dev/null and b/src/dataset/water_lily/efbd037b89.jpg differ diff --git a/src/dataset/water_lily/f6c881ced1.jpg b/src/dataset/water_lily/f6c881ced1.jpg new file mode 100644 index 00000000..15ebcdd6 Binary files /dev/null and b/src/dataset/water_lily/f6c881ced1.jpg differ diff --git a/src/dataset/water_lily/f7bc179b7c.jpg b/src/dataset/water_lily/f7bc179b7c.jpg new file mode 100644 index 00000000..fccc1c1b Binary files /dev/null and b/src/dataset/water_lily/f7bc179b7c.jpg differ diff --git a/src/dataset/water_lily/f8abae9f31.jpg b/src/dataset/water_lily/f8abae9f31.jpg new file mode 100644 index 00000000..faa80aa2 Binary files /dev/null and b/src/dataset/water_lily/f8abae9f31.jpg differ diff --git a/src/dataset/water_lily/f9e956baaf.jpg b/src/dataset/water_lily/f9e956baaf.jpg new file mode 100644 index 00000000..d1802fe8 Binary files /dev/null and b/src/dataset/water_lily/f9e956baaf.jpg differ diff --git a/src/input.png b/src/input.png new file mode 100644 index 00000000..2d55483e Binary files /dev/null and b/src/input.png differ diff --git a/src/main.py b/src/main.py index 8e2283f7..f3a1a8d9 100644 --- a/src/main.py +++ b/src/main.py @@ -42,7 +42,7 @@ tiles_types = { SHORT: pygame.image.load('spritesNtiles/shortGrass64.png'), TALL: pygame.image.load('spritesNtiles/tallGrass64.png'), TREE: pygame.image.load('spritesNtiles/dirtTree64.png'), - FLOWER: pygame.image.load('spritesNtiles/flower64.png') + FLOWER: pygame.image.load('spritesNtiles/input.png') } diff --git a/src/spritesNtiles/input.png b/src/spritesNtiles/input.png new file mode 100644 index 00000000..05561803 Binary files /dev/null and b/src/spritesNtiles/input.png differ