From c7c309cb89dd7bfe4d68c59d032d2edfa315c7f7 Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 30 Aug 2023 13:28:31 +0800 Subject: [PATCH 001/134] backend add outpainting --- lama_cleaner/model/base.py | 101 ++++++++++++-- lama_cleaner/model/g_diffuser_bot.py | 181 +++++++++++++++++++++++++ lama_cleaner/model/utils.py | 10 +- lama_cleaner/schema.py | 5 + lama_cleaner/tests/test_outpainting.py | 70 ++++++++++ 5 files changed, 354 insertions(+), 13 deletions(-) create mode 100644 lama_cleaner/model/g_diffuser_bot.py create mode 100644 lama_cleaner/tests/test_outpainting.py diff --git a/lama_cleaner/model/base.py b/lama_cleaner/model/base.py index 08c27b1..c452690 100644 --- a/lama_cleaner/model/base.py +++ b/lama_cleaner/model/base.py @@ -12,6 +12,7 @@ from lama_cleaner.helper import ( pad_img_to_modulo, switch_mps_device, ) +from lama_cleaner.model.g_diffuser_bot import expand_image, np_img_grey_to_rgb from lama_cleaner.schema import Config, HDStrategy @@ -266,15 +267,93 @@ class DiffusionInpaintModel(InpaintModel): """ # boxes = boxes_from_mask(mask) if config.use_croper: - crop_img, crop_mask, (l, t, r, b) = self._apply_cropper(image, mask, config) - crop_image = self._scaled_pad_forward(crop_img, crop_mask, config) - inpaint_result = image[:, :, ::-1] - inpaint_result[t:b, l:r, :] = crop_image + if config.croper_is_outpainting: + inpaint_result = self._do_outpainting(image, config) + else: + crop_img, crop_mask, (l, t, r, b) = self._apply_cropper( + image, mask, config + ) + crop_image = self._scaled_pad_forward(crop_img, crop_mask, config) + inpaint_result = image[:, :, ::-1] + inpaint_result[t:b, l:r, :] = crop_image else: inpaint_result = self._scaled_pad_forward(image, mask, config) return inpaint_result + def _do_outpainting(self, image, config: Config): + # cropper 和 image 在同一个坐标系下,croper_x/y 可能为负数 + # 从 image 中 crop 出 outpainting 区域 + image_h, image_w = image.shape[:2] + cropper_l = config.croper_x + cropper_t = config.croper_y + cropper_r = config.croper_x + config.croper_width + cropper_b = config.croper_y + config.croper_height + image_l = 0 + image_t = 0 + image_r = image_w + image_b = image_h + + # 类似求 IOU + l = max(cropper_l, image_l) + t = max(cropper_t, image_t) + r = min(cropper_r, image_r) + b = min(cropper_b, image_b) + + assert ( + 0 <= l < r and 0 <= t < b + ), f"cropper and image not overlap, {l},{t},{r},{b}" + + cropped_image = image[t:b, l:r, :] + padding_l = max(0, image_l - cropper_l) + padding_t = max(0, image_t - cropper_t) + padding_r = max(0, cropper_r - image_r) + padding_b = max(0, cropper_b - image_b) + + zero_padding_count = [padding_l, padding_t, padding_r, padding_b].count(0) + + if zero_padding_count not in [0, 3]: + logger.warning( + f"padding count({zero_padding_count}) not 0 or 3, may result in bad edge outpainting" + ) + + expanded_image, mask_image = expand_image( + cropped_image, + left=padding_l, + top=padding_t, + right=padding_r, + bottom=padding_b, + softness=config.sd_outpainting_softness, + space=config.sd_outpainting_space, + ) + + # 最终扩大了的 image, BGR + expanded_cropped_result_image = self._scaled_pad_forward( + expanded_image, mask_image, config + ) + + # RGB -> BGR + outpainting_image = cv2.copyMakeBorder( + image, + left=padding_l, + top=padding_t, + right=padding_r, + bottom=padding_b, + borderType=cv2.BORDER_CONSTANT, + value=0, + )[:, :, ::-1] + + # 把 cropped_result_image 贴到 outpainting_image 上,这一步不需要 blend + paste_t = 0 if config.croper_y < 0 else config.croper_y + paste_l = 0 if config.croper_x < 0 else config.croper_x + + outpainting_image[ + paste_t : paste_t + expanded_cropped_result_image.shape[0], + paste_l : paste_l + expanded_cropped_result_image.shape[1], + :, + ] = expanded_cropped_result_image + return outpainting_image + def _scaled_pad_forward(self, image, mask, config: Config): longer_side_length = int(config.sd_scale * max(image.shape[:2])) origin_size = image.shape[:2] @@ -291,8 +370,14 @@ class DiffusionInpaintModel(InpaintModel): (origin_size[1], origin_size[0]), interpolation=cv2.INTER_CUBIC, ) - original_pixel_indices = mask < 127 - inpaint_result[original_pixel_indices] = image[:, :, ::-1][ - original_pixel_indices - ] + + # blend result, copy from g_diffuser_bot + # mask_rgb = 1.0 - np_img_grey_to_rgb(mask / 255.0) + # inpaint_result = np.clip( + # inpaint_result * (1.0 - mask_rgb) + image * mask_rgb, 0.0, 255.0 + # ) + # original_pixel_indices = mask < 127 + # inpaint_result[original_pixel_indices] = image[:, :, ::-1][ + # original_pixel_indices + # ] return inpaint_result diff --git a/lama_cleaner/model/g_diffuser_bot.py b/lama_cleaner/model/g_diffuser_bot.py new file mode 100644 index 0000000..450d618 --- /dev/null +++ b/lama_cleaner/model/g_diffuser_bot.py @@ -0,0 +1,181 @@ +# code copy from: https://github.com/parlance-zz/g-diffuser-bot +import cv2 +import numpy as np + + +def np_img_grey_to_rgb(data): + if data.ndim == 3: + return data + return np.expand_dims(data, 2) * np.ones((1, 1, 3)) + + +def convolve(data1, data2): # fast convolution with fft + if data1.ndim != data2.ndim: # promote to rgb if mismatch + if data1.ndim < 3: + data1 = np_img_grey_to_rgb(data1) + if data2.ndim < 3: + data2 = np_img_grey_to_rgb(data2) + return ifft2(fft2(data1) * fft2(data2)) + + +def fft2(data): + if data.ndim > 2: # multiple channels + out_fft = np.zeros( + (data.shape[0], data.shape[1], data.shape[2]), dtype=np.complex128 + ) + for c in range(data.shape[2]): + c_data = data[:, :, c] + out_fft[:, :, c] = np.fft.fft2(np.fft.fftshift(c_data), norm="ortho") + out_fft[:, :, c] = np.fft.ifftshift(out_fft[:, :, c]) + else: # single channel + out_fft = np.zeros((data.shape[0], data.shape[1]), dtype=np.complex128) + out_fft[:, :] = np.fft.fft2(np.fft.fftshift(data), norm="ortho") + out_fft[:, :] = np.fft.ifftshift(out_fft[:, :]) + + return out_fft + + +def ifft2(data): + if data.ndim > 2: # multiple channels + out_ifft = np.zeros( + (data.shape[0], data.shape[1], data.shape[2]), dtype=np.complex128 + ) + for c in range(data.shape[2]): + c_data = data[:, :, c] + out_ifft[:, :, c] = np.fft.ifft2(np.fft.fftshift(c_data), norm="ortho") + out_ifft[:, :, c] = np.fft.ifftshift(out_ifft[:, :, c]) + else: # single channel + out_ifft = np.zeros((data.shape[0], data.shape[1]), dtype=np.complex128) + out_ifft[:, :] = np.fft.ifft2(np.fft.fftshift(data), norm="ortho") + out_ifft[:, :] = np.fft.ifftshift(out_ifft[:, :]) + + return out_ifft + + +def get_gradient_kernel(width, height, std=3.14, mode="linear"): + window_scale_x = float( + width / min(width, height) + ) # for non-square aspect ratios we still want a circular kernel + window_scale_y = float(height / min(width, height)) + if mode == "gaussian": + x = (np.arange(width) / width * 2.0 - 1.0) * window_scale_x + kx = np.exp(-x * x * std) + if window_scale_x != window_scale_y: + y = (np.arange(height) / height * 2.0 - 1.0) * window_scale_y + ky = np.exp(-y * y * std) + else: + y = x + ky = kx + return np.outer(kx, ky) + elif mode == "linear": + x = (np.arange(width) / width * 2.0 - 1.0) * window_scale_x + if window_scale_x != window_scale_y: + y = (np.arange(height) / height * 2.0 - 1.0) * window_scale_y + else: + y = x + return np.clip(1.0 - np.sqrt(np.add.outer(x * x, y * y)) * std / 3.14, 0.0, 1.0) + else: + raise Exception("Error: Unknown mode in get_gradient_kernel: {0}".format(mode)) + + +def image_blur(data, std=3.14, mode="linear"): + width = data.shape[0] + height = data.shape[1] + kernel = get_gradient_kernel(width, height, std, mode=mode) + return np.real(convolve(data, kernel / np.sqrt(np.sum(kernel * kernel)))) + + +def soften_mask(np_rgba_image, softness, space): + if softness == 0: + return np_rgba_image + softness = min(softness, 1.0) + space = np.clip(space, 0.0, 1.0) + original_max_opacity = np.max(np_rgba_image[:, :, 3]) + out_mask = np_rgba_image[:, :, 3] <= 0.0 + blurred_mask = image_blur(np_rgba_image[:, :, 3], 3.5 / softness, mode="linear") + blurred_mask = np.maximum(blurred_mask - np.max(blurred_mask[out_mask]), 0.0) + np_rgba_image[ + :, :, 3 + ] *= blurred_mask # preserve partial opacity in original input mask + np_rgba_image[:, :, 3] /= np.max(np_rgba_image[:, :, 3]) # renormalize + np_rgba_image[:, :, 3] = np.clip( + np_rgba_image[:, :, 3] - space, 0.0, 1.0 + ) # make space + np_rgba_image[:, :, 3] /= np.max(np_rgba_image[:, :, 3]) # and renormalize again + np_rgba_image[:, :, 3] *= original_max_opacity # restore original max opacity + return np_rgba_image + + +def expand_image( + cv2_img, top: int, right: int, bottom: int, left: int, softness: float, space: float +): + origin_h, origin_w = cv2_img.shape[:2] + new_width = cv2_img.shape[1] + left + right + new_height = cv2_img.shape[0] + top + bottom + new_img = np.zeros((new_height, new_width, 4), np.uint8) # expanded image is rgba + + print( + "Expanding input image from {0}x{1} to {2}x{3}".format( + cv2_img.shape[1], cv2_img.shape[0], new_width, new_height + ) + ) + if cv2_img.shape[2] == 3: # rgb input image + new_img[ + top : top + cv2_img.shape[0], left : left + cv2_img.shape[1], 0:3 + ] = cv2_img + new_img[ + top : top + cv2_img.shape[0], left : left + cv2_img.shape[1], 3 + ] = 255 # fully opaque + elif cv2_img.shape[2] == 4: # rgba input image + new_img[top : top + cv2_img.shape[0], left : left + cv2_img.shape[1]] = cv2_img + else: + raise Exception( + "Unsupported image format: {0} channels".format(cv2_img.shape[2]) + ) + + if softness > 0.0: + new_img = soften_mask(new_img / 255.0, softness / 100.0, space / 100.0) + new_img = (np.clip(new_img, 0.0, 1.0) * 255.0).astype(np.uint8) + + mask_image = 255.0 - new_img[:, :, 3] # extract mask from alpha channel and invert + rgb_init_image = ( + 0.0 + new_img[:, :, 0:3] + ) # strip mask from init_img leaving only rgb channels + + hard_mask = np.zeros_like(cv2_img[:, :, 0]) + if top != 0: + hard_mask[0 : origin_h // 2, :] = 255 + if bottom != 0: + hard_mask[origin_h // 2 :, :] = 255 + if left != 0: + hard_mask[:, 0 : origin_w // 2] = 255 + if right != 0: + hard_mask[:, origin_w // 2 :] = 255 + hard_mask = cv2.copyMakeBorder( + hard_mask, top, bottom, left, right, cv2.BORDER_CONSTANT, value=255 + ) + mask_image = np.where(hard_mask > 0, mask_image, 0) + return rgb_init_image.astype(np.uint8), mask_image.astype(np.uint8) + + +if __name__ == "__main__": + from pathlib import Path + + current_dir = Path(__file__).parent.absolute().resolve() + image_path = current_dir.parent / "tests" / "bunny.jpeg" + init_image = cv2.imread(str(image_path)) + init_image, mask_image = expand_image( + init_image, + 200, + 200, + 0, + 0, + 60, + 50, + ) + print(mask_image.dtype, mask_image.min(), mask_image.max()) + print(init_image.dtype, init_image.min(), init_image.max()) + mask_image = mask_image.astype(np.uint8) + init_image = init_image.astype(np.uint8) + cv2.imwrite("expanded_image.png", init_image) + cv2.imwrite("expanded_mask.png", mask_image) diff --git a/lama_cleaner/model/utils.py b/lama_cleaner/model/utils.py index 998db43..e1e9927 100644 --- a/lama_cleaner/model/utils.py +++ b/lama_cleaner/model/utils.py @@ -27,7 +27,7 @@ def make_beta_schedule( if schedule == "linear": betas = ( torch.linspace( - linear_start ** 0.5, linear_end ** 0.5, n_timestep, dtype=torch.float64 + linear_start**0.5, linear_end**0.5, n_timestep, dtype=torch.float64 ) ** 2 ) @@ -772,7 +772,7 @@ def conv2d_resample( f=f, up=up, padding=[px0, px1, py0, py1], - gain=up ** 2, + gain=up**2, flip_filter=flip_filter, ) return x @@ -814,7 +814,7 @@ def conv2d_resample( x=x, f=f, padding=[px0 + pxt, px1 + pxt, py0 + pyt, py1 + pyt], - gain=up ** 2, + gain=up**2, flip_filter=flip_filter, ) if down > 1: @@ -834,7 +834,7 @@ def conv2d_resample( f=(f if up > 1 else None), up=up, padding=[px0, px1, py0, py1], - gain=up ** 2, + gain=up**2, flip_filter=flip_filter, ) x = _conv2d_wrapper(x=x, w=w, groups=groups, flip_weight=flip_weight) @@ -870,7 +870,7 @@ class Conv2dLayer(torch.nn.Module): self.register_buffer("resample_filter", setup_filter(resample_filter)) self.conv_clamp = conv_clamp self.padding = kernel_size // 2 - self.weight_gain = 1 / np.sqrt(in_channels * (kernel_size ** 2)) + self.weight_gain = 1 / np.sqrt(in_channels * (kernel_size**2)) self.act_gain = activation_funcs[activation].def_gain memory_format = ( diff --git a/lama_cleaner/schema.py b/lama_cleaner/schema.py index 9eba2f5..b710cdc 100644 --- a/lama_cleaner/schema.py +++ b/lama_cleaner/schema.py @@ -55,6 +55,7 @@ class Config(BaseModel): # Crop image to this size before doing sd inpainting # The value is always on the original image scale use_croper: bool = False + croper_is_outpainting: bool = False croper_x: int = None croper_y: int = None croper_height: int = None @@ -78,6 +79,10 @@ class Config(BaseModel): sd_seed: int = 42 sd_match_histograms: bool = False + # out-painting + sd_outpainting_softness: float = 30.0 + sd_outpainting_space: float = 50.0 + # Configs for opencv inpainting # opencv document https://docs.opencv.org/4.6.0/d7/d8b/group__photo__inpaint.html#gga8002a65f5a3328fbf15df81b842d3c3ca05e763003a805e6c11c673a9f4ba7d07 cv2_flag: str = "INPAINT_NS" diff --git a/lama_cleaner/tests/test_outpainting.py b/lama_cleaner/tests/test_outpainting.py new file mode 100644 index 0000000..ec59399 --- /dev/null +++ b/lama_cleaner/tests/test_outpainting.py @@ -0,0 +1,70 @@ +import os + +os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" +from pathlib import Path + +import pytest +import torch + +from lama_cleaner.model_manager import ModelManager +from lama_cleaner.schema import HDStrategy, SDSampler +from lama_cleaner.tests.test_model import get_config, assert_equal + +current_dir = Path(__file__).parent.absolute().resolve() +save_dir = current_dir / "result" +save_dir.mkdir(exist_ok=True, parents=True) +device = "cuda" if torch.cuda.is_available() else "cpu" +device = torch.device(device) + + +@pytest.mark.parametrize("sd_device", ["mps"]) +@pytest.mark.parametrize( + "rect", + [ + [0, -100, 512, 512 - 128 + 100], + [0, 128, 512, 512 - 128 + 100], + [128, 0, 512 - 128 + 100, 512], + [-100, 0, 512 - 128 + 100, 512], + [0, 0, 512, 512 + 200], + [0, 0, 512 + 200, 512], + [-100, -100, 512 + 200, 512 + 200], + ], +) +def test_sdxl_outpainting(sd_device, rect): + def callback(i, t, latents): + pass + + if sd_device == "cuda" and not torch.cuda.is_available(): + return + + sd_steps = 50 if sd_device == "cuda" else 1 + model = ModelManager( + name="sd1.5", + device=torch.device(sd_device), + hf_access_token="", + sd_run_local=True, + disable_nsfw=True, + sd_cpu_textencoder=False, + callback=callback, + ) + cfg = get_config( + HDStrategy.ORIGINAL, + prompt="a dog sitting on a bench in the park", + sd_steps=30, + use_croper=True, + croper_is_outpainting=True, + croper_x=rect[0], + croper_y=rect[1], + croper_width=rect[2], + croper_height=rect[3], + sd_guidance_scale=14, + sd_sampler=SDSampler.dpm_plus_plus, + ) + + assert_equal( + model, + cfg, + f"sd15_outpainting_dpm++_{'_'.join(map(str, rect))}.png", + img_p=current_dir / "overture-creations-5sI6fQgYIuo.png", + mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png", + ) From 7ba8fdbe7660eef9666774609f587a5079c6101e Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 30 Aug 2023 13:28:41 +0800 Subject: [PATCH 002/134] update diffusers to 0.20.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1023d78..8d35bf3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,7 @@ pydantic rich loguru yacs -diffusers==0.16.1 +diffusers==0.20.1 transformers==4.27.4 gradio piexif==1.1.3 From 94211a498510d442ac87509380cb517f6177194e Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 30 Aug 2023 21:30:11 +0800 Subject: [PATCH 003/134] kandinsky --- .../components/Settings/ModelSettingBlock.tsx | 6 ++ lama_cleaner/app/src/store/Atoms.tsx | 11 ++- lama_cleaner/const.py | 1 + lama_cleaner/model/controlnet.py | 4 +- lama_cleaner/model/instruct_pix2pix.py | 2 +- lama_cleaner/model/kandinsky.py | 91 ++++++++++++++++++ lama_cleaner/model/sd.py | 2 +- lama_cleaner/model_manager.py | 2 + lama_cleaner/tests/.gitignore | 3 +- lama_cleaner/tests/cat.png | Bin 0 -> 492745 bytes lama_cleaner/tests/test_outpainting.py | 60 ++++++++++-- 11 files changed, 170 insertions(+), 12 deletions(-) create mode 100644 lama_cleaner/model/kandinsky.py create mode 100644 lama_cleaner/tests/cat.png diff --git a/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx b/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx index 4778361..15c7463 100644 --- a/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx +++ b/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx @@ -270,6 +270,12 @@ function ModelSettingBlock() { 'https://arxiv.org/abs/2211.09800', 'https://github.com/timothybrooks/instruct-pix2pix' ) + case AIModel.KANDINSKY21: + return renderModelDesc( + 'Kandinsky 2.1', + 'https://huggingface.co/kandinsky-community/kandinsky-2-1-inpaint', + 'https://huggingface.co/kandinsky-community/kandinsky-2-1-inpaint' + ) default: return <> } diff --git a/lama_cleaner/app/src/store/Atoms.tsx b/lama_cleaner/app/src/store/Atoms.tsx index 4ca0d9e..26f7ba1 100644 --- a/lama_cleaner/app/src/store/Atoms.tsx +++ b/lama_cleaner/app/src/store/Atoms.tsx @@ -17,6 +17,7 @@ export enum AIModel { Mange = 'manga', PAINT_BY_EXAMPLE = 'paint_by_example', PIX2PIX = 'instruct_pix2pix', + KANDINSKY21 = 'kandinsky2.1', } export enum ControlNetMethod { @@ -566,6 +567,13 @@ const defaultHDSettings: ModelsHDSettings = { hdStrategyCropMargin: 128, enabled: true, }, + [AIModel.KANDINSKY21]: { + hdStrategy: HDStrategy.ORIGINAL, + hdStrategyResizeLimit: 768, + hdStrategyCropTrigerSize: 512, + hdStrategyCropMargin: 128, + enabled: false, + }, } export enum SDSampler { @@ -719,7 +727,8 @@ export const isSDState = selector({ settings.model === AIModel.SD15 || settings.model === AIModel.SD2 || settings.model === AIModel.ANYTHING4 || - settings.model === AIModel.REALISTIC_VISION_1_4 + settings.model === AIModel.REALISTIC_VISION_1_4 || + settings.model === AIModel.KANDINSKY21 ) }, }) diff --git a/lama_cleaner/const.py b/lama_cleaner/const.py index a54c847..a576b5d 100644 --- a/lama_cleaner/const.py +++ b/lama_cleaner/const.py @@ -29,6 +29,7 @@ AVAILABLE_MODELS = [ "sd2", "paint_by_example", "instruct_pix2pix", + "kandinsky2.1" ] SD15_MODELS = ["sd1.5", "anything4", "realisticVision1.4"] diff --git a/lama_cleaner/model/controlnet.py b/lama_cleaner/model/controlnet.py index 6d6347e..9cc3380 100644 --- a/lama_cleaner/model/controlnet.py +++ b/lama_cleaner/model/controlnet.py @@ -218,7 +218,7 @@ class ControlNet(DiffusionInpaintModel): controlnet_conditioning_scale=config.controlnet_conditioning_scale, negative_prompt=config.negative_prompt, generator=torch.manual_seed(config.sd_seed), - output_type="np.array", + output_type="np", callback=self.callback, ).images[0] else: @@ -262,7 +262,7 @@ class ControlNet(DiffusionInpaintModel): mask_image=mask_image, num_inference_steps=config.sd_steps, guidance_scale=config.sd_guidance_scale, - output_type="np.array", + output_type="np", callback=self.callback, height=img_h, width=img_w, diff --git a/lama_cleaner/model/instruct_pix2pix.py b/lama_cleaner/model/instruct_pix2pix.py index 20e24f3..4d176da 100644 --- a/lama_cleaner/model/instruct_pix2pix.py +++ b/lama_cleaner/model/instruct_pix2pix.py @@ -59,7 +59,7 @@ class InstructPix2Pix(DiffusionInpaintModel): num_inference_steps=config.p2p_steps, image_guidance_scale=config.p2p_image_guidance_scale, guidance_scale=config.p2p_guidance_scale, - output_type="np.array", + output_type="np", generator=torch.manual_seed(config.sd_seed) ).images[0] diff --git a/lama_cleaner/model/kandinsky.py b/lama_cleaner/model/kandinsky.py new file mode 100644 index 0000000..cf583bd --- /dev/null +++ b/lama_cleaner/model/kandinsky.py @@ -0,0 +1,91 @@ +import PIL.Image +import cv2 +import numpy as np +import torch + +from lama_cleaner.model.base import DiffusionInpaintModel +from lama_cleaner.model.utils import get_scheduler +from lama_cleaner.schema import Config + + +class Kandinsky(DiffusionInpaintModel): + pad_mod = 64 + min_size = 512 + + def init_model(self, device: torch.device, **kwargs): + from diffusers import AutoPipelineForInpainting + + fp16 = not kwargs.get("no_half", False) + use_gpu = device == torch.device("cuda") and torch.cuda.is_available() + torch_dtype = torch.float16 if use_gpu and fp16 else torch.float32 + + model_kwargs = { + "local_files_only": kwargs.get("local_files_only", kwargs["sd_run_local"]), + "torch_dtype": torch_dtype, + } + + # self.pipe_prior = KandinskyPriorPipeline.from_pretrained( + # self.prior_name, **model_kwargs + # ).to("cpu") + # + # self.model = KandinskyInpaintPipeline.from_pretrained( + # self.model_name, **model_kwargs + # ).to(device) + self.model = AutoPipelineForInpainting.from_pretrained( + self.model_name, **model_kwargs + ).to(device) + + self.callback = kwargs.pop("callback", None) + + def forward(self, image, mask, config: Config): + """Input image and output image have same size + image: [H, W, C] RGB + mask: [H, W, 1] 255 means area to repaint + return: BGR IMAGE + """ + scheduler_config = self.model.scheduler.config + scheduler = get_scheduler(config.sd_sampler, scheduler_config) + self.model.scheduler = scheduler + + generator = torch.manual_seed(config.sd_seed) + if config.sd_mask_blur != 0: + k = 2 * config.sd_mask_blur + 1 + mask = cv2.GaussianBlur(mask, (k, k), 0)[:, :, np.newaxis] + mask = mask.astype(np.float32) / 255 + img_h, img_w = image.shape[:2] + + output = self.model( + prompt=config.prompt, + negative_prompt=config.negative_prompt, + image=PIL.Image.fromarray(image), + mask_image=mask[:, :, 0], + height=img_h, + width=img_w, + num_inference_steps=config.sd_steps, + guidance_scale=config.sd_guidance_scale, + output_type="np", + callback=self.callback, + ).images[0] + + output = (output * 255).round().astype("uint8") + output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR) + return output + + def forward_post_process(self, result, image, mask, config): + if config.sd_match_histograms: + result = self._match_histograms(result, image[:, :, ::-1], mask) + + if config.sd_mask_blur != 0: + k = 2 * config.sd_mask_blur + 1 + mask = cv2.GaussianBlur(mask, (k, k), 0) + return result, image, mask + + @staticmethod + def is_downloaded() -> bool: + # model will be downloaded when app start, and can't switch in frontend settings + return True + + +class Kandinsky22(Kandinsky): + name = "kandinsky2.2" + model_name = "kandinsky-community/kandinsky-2-2-decoder-inpaint" diff --git a/lama_cleaner/model/sd.py b/lama_cleaner/model/sd.py index 945c506..0fb565d 100644 --- a/lama_cleaner/model/sd.py +++ b/lama_cleaner/model/sd.py @@ -147,7 +147,7 @@ class SD(DiffusionInpaintModel): mask_image=PIL.Image.fromarray(mask[:, :, -1], mode="L"), num_inference_steps=config.sd_steps, guidance_scale=config.sd_guidance_scale, - output_type="np.array", + output_type="np", callback=self.callback, height=img_h, width=img_w, diff --git a/lama_cleaner/model_manager.py b/lama_cleaner/model_manager.py index 3f29dd3..4dca9e8 100644 --- a/lama_cleaner/model_manager.py +++ b/lama_cleaner/model_manager.py @@ -7,6 +7,7 @@ from lama_cleaner.const import SD15_MODELS from lama_cleaner.helper import switch_mps_device from lama_cleaner.model.controlnet import ControlNet from lama_cleaner.model.fcf import FcF +from lama_cleaner.model.kandinsky import Kandinsky22 from lama_cleaner.model.lama import LaMa from lama_cleaner.model.ldm import LDM from lama_cleaner.model.manga import Manga @@ -33,6 +34,7 @@ models = { "sd2": SD2, "paint_by_example": PaintByExample, "instruct_pix2pix": InstructPix2Pix, + Kandinsky22.name: Kandinsky22, } diff --git a/lama_cleaner/tests/.gitignore b/lama_cleaner/tests/.gitignore index 82fd705..89b7717 100644 --- a/lama_cleaner/tests/.gitignore +++ b/lama_cleaner/tests/.gitignore @@ -1 +1,2 @@ -*_result.png \ No newline at end of file +*_result.png +result/ \ No newline at end of file diff --git a/lama_cleaner/tests/cat.png b/lama_cleaner/tests/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..dee9eb687441b8dfdb620e6d80a25bc2a4ca6b6c GIT binary patch literal 492745 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�H_9B9>(&>#x{1joQ3N`9lsKX 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

@$W1R(S{04iv?uiF8stfG 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

l+3^W+NT3x2 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�{{}%ij*>JM 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 Date: Sat, 7 Oct 2023 12:48:29 +0800 Subject: [PATCH 004/134] add MobileSAM vit_t --- lama_cleaner/const.py | 7 +- lama_cleaner/plugins/interactive_seg.py | 4 + .../plugins/segment_anything/build_sam.py | 63 +- .../segment_anything/modeling/tiny_vit_sam.py | 822 ++++++++++++++++++ 4 files changed, 892 insertions(+), 4 deletions(-) create mode 100644 lama_cleaner/plugins/segment_anything/modeling/tiny_vit_sam.py diff --git a/lama_cleaner/const.py b/lama_cleaner/const.py index a576b5d..738f283 100644 --- a/lama_cleaner/const.py +++ b/lama_cleaner/const.py @@ -12,6 +12,7 @@ MPS_SUPPORT_MODELS = [ "sd2", "paint_by_example", "controlnet", + "kandinsky2.2", ] DEFAULT_MODEL = "lama" @@ -29,7 +30,7 @@ AVAILABLE_MODELS = [ "sd2", "paint_by_example", "instruct_pix2pix", - "kandinsky2.1" + "kandinsky2.2", ] SD15_MODELS = ["sd1.5", "anything4", "realisticVision1.4"] @@ -61,7 +62,7 @@ SD_CONTROLNET_CHOICES = [ "control_v11p_sd15_canny", "control_v11p_sd15_openpose", "control_v11p_sd15_inpaint", - "control_v11f1p_sd15_depth" + "control_v11f1p_sd15_depth", ] SD_LOCAL_MODEL_HELP = """ @@ -115,7 +116,7 @@ RealESRGANModelNameList = [e.value for e in RealESRGANModelName] INTERACTIVE_SEG_HELP = "Enable interactive segmentation using Segment Anything." INTERACTIVE_SEG_MODEL_HELP = "Model size: vit_b < vit_l < vit_h. Bigger model size means better segmentation but slower speed." -AVAILABLE_INTERACTIVE_SEG_MODELS = ["vit_b", "vit_l", "vit_h"] +AVAILABLE_INTERACTIVE_SEG_MODELS = ["vit_b", "vit_l", "vit_h", "vit_t"] AVAILABLE_INTERACTIVE_SEG_DEVICES = ["cuda", "cpu", "mps"] REMOVE_BG_HELP = "Enable remove background. Always run on CPU" ANIMESEG_HELP = "Enable anime segmentation. Always run on CPU" diff --git a/lama_cleaner/plugins/interactive_seg.py b/lama_cleaner/plugins/interactive_seg.py index 9cb5371..36cd8d2 100644 --- a/lama_cleaner/plugins/interactive_seg.py +++ b/lama_cleaner/plugins/interactive_seg.py @@ -22,6 +22,10 @@ SEGMENT_ANYTHING_MODELS = { "url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth", "md5": "4b8939a88964f0f4ff5f5b2642c598a6", }, + "vit_t": { + "url": "https://github.com/Sanster/models/releases/download/MobileSAM/mobile_sam.pt", + "md5": "f3c0d8cda613564d499310dab6c812cd", + }, } diff --git a/lama_cleaner/plugins/segment_anything/build_sam.py b/lama_cleaner/plugins/segment_anything/build_sam.py index 07abfca..396daf3 100644 --- a/lama_cleaner/plugins/segment_anything/build_sam.py +++ b/lama_cleaner/plugins/segment_anything/build_sam.py @@ -8,7 +8,15 @@ import torch from functools import partial -from .modeling import ImageEncoderViT, MaskDecoder, PromptEncoder, Sam, TwoWayTransformer +from lama_cleaner.plugins.segment_anything.modeling.tiny_vit_sam import TinyViT + +from .modeling import ( + ImageEncoderViT, + MaskDecoder, + PromptEncoder, + Sam, + TwoWayTransformer, +) def build_sam_vit_h(checkpoint=None): @@ -44,11 +52,64 @@ def build_sam_vit_b(checkpoint=None): ) +def build_sam_vit_t(checkpoint=None): + prompt_embed_dim = 256 + image_size = 1024 + vit_patch_size = 16 + image_embedding_size = image_size // vit_patch_size + mobile_sam = Sam( + image_encoder=TinyViT( + img_size=1024, + in_chans=3, + num_classes=1000, + embed_dims=[64, 128, 160, 320], + depths=[2, 2, 6, 2], + num_heads=[2, 4, 5, 10], + window_sizes=[7, 7, 14, 7], + mlp_ratio=4.0, + drop_rate=0.0, + drop_path_rate=0.0, + use_checkpoint=False, + mbconv_expand_ratio=4.0, + local_conv_size=3, + layer_lr_decay=0.8, + ), + prompt_encoder=PromptEncoder( + embed_dim=prompt_embed_dim, + image_embedding_size=(image_embedding_size, image_embedding_size), + input_image_size=(image_size, image_size), + mask_in_chans=16, + ), + mask_decoder=MaskDecoder( + num_multimask_outputs=3, + transformer=TwoWayTransformer( + depth=2, + embedding_dim=prompt_embed_dim, + mlp_dim=2048, + num_heads=8, + ), + transformer_dim=prompt_embed_dim, + iou_head_depth=3, + iou_head_hidden_dim=256, + ), + pixel_mean=[123.675, 116.28, 103.53], + pixel_std=[58.395, 57.12, 57.375], + ) + + mobile_sam.eval() + if checkpoint is not None: + with open(checkpoint, "rb") as f: + state_dict = torch.load(f) + mobile_sam.load_state_dict(state_dict) + return mobile_sam + + sam_model_registry = { "default": build_sam, "vit_h": build_sam, "vit_l": build_sam_vit_l, "vit_b": build_sam_vit_b, + "vit_t": build_sam_vit_t, } diff --git a/lama_cleaner/plugins/segment_anything/modeling/tiny_vit_sam.py b/lama_cleaner/plugins/segment_anything/modeling/tiny_vit_sam.py new file mode 100644 index 0000000..a5127c7 --- /dev/null +++ b/lama_cleaner/plugins/segment_anything/modeling/tiny_vit_sam.py @@ -0,0 +1,822 @@ +# -------------------------------------------------------- +# TinyViT Model Architecture +# Copyright (c) 2022 Microsoft +# Adapted from LeViT and Swin Transformer +# LeViT: (https://github.com/facebookresearch/levit) +# Swin: (https://github.com/microsoft/swin-transformer) +# Build the TinyViT Model +# -------------------------------------------------------- + +import collections +import itertools +import math +import warnings +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as checkpoint +from typing import Tuple + + +def _ntuple(n): + def parse(x): + if isinstance(x, collections.abc.Iterable) and not isinstance(x, str): + return x + return tuple(itertools.repeat(x, n)) + + return parse + + +to_2tuple = _ntuple(2) + + +def _trunc_normal_(tensor, mean, std, a, b): + # Cut & paste from PyTorch official master until it's in a few official releases - RW + # Method based on https://people.sc.fsu.edu/~jburkardt/presentations/truncated_normal.pdf + def norm_cdf(x): + # Computes standard normal cumulative distribution function + return (1.0 + math.erf(x / math.sqrt(2.0))) / 2.0 + + if (mean < a - 2 * std) or (mean > b + 2 * std): + warnings.warn( + "mean is more than 2 std from [a, b] in nn.init.trunc_normal_. " + "The distribution of values may be incorrect.", + stacklevel=2, + ) + + # Values are generated by using a truncated uniform distribution and + # then using the inverse CDF for the normal distribution. + # Get upper and lower cdf values + l = norm_cdf((a - mean) / std) + u = norm_cdf((b - mean) / std) + + # Uniformly fill tensor with values from [l, u], then translate to + # [2l-1, 2u-1]. + tensor.uniform_(2 * l - 1, 2 * u - 1) + + # Use inverse cdf transform for normal distribution to get truncated + # standard normal + tensor.erfinv_() + + # Transform to proper mean, std + tensor.mul_(std * math.sqrt(2.0)) + tensor.add_(mean) + + # Clamp to ensure it's in the proper range + tensor.clamp_(min=a, max=b) + return tensor + + +def trunc_normal_(tensor, mean=0.0, std=1.0, a=-2.0, b=2.0): + # type: (Tensor, float, float, float, float) -> Tensor + r"""Fills the input Tensor with values drawn from a truncated + normal distribution. The values are effectively drawn from the + normal distribution :math:`\mathcal{N}(\text{mean}, \text{std}^2)` + with values outside :math:`[a, b]` redrawn until they are within + the bounds. The method used for generating the random values works + best when :math:`a \leq \text{mean} \leq b`. + + NOTE: this impl is similar to the PyTorch trunc_normal_, the bounds [a, b] are + applied while sampling the normal with mean/std applied, therefore a, b args + should be adjusted to match the range of mean, std args. + + Args: + tensor: an n-dimensional `torch.Tensor` + mean: the mean of the normal distribution + std: the standard deviation of the normal distribution + a: the minimum cutoff value + b: the maximum cutoff value + Examples: + >>> w = torch.empty(3, 5) + >>> nn.init.trunc_normal_(w) + """ + with torch.no_grad(): + return _trunc_normal_(tensor, mean, std, a, b) + + +def drop_path( + x, drop_prob: float = 0.0, training: bool = False, scale_by_keep: bool = True +): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + + This is the same as the DropConnect impl I created for EfficientNet, etc networks, however, + the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper... + See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for + changing the layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use + 'survival rate' as the argument. + + """ + if drop_prob == 0.0 or not training: + return x + keep_prob = 1 - drop_prob + shape = (x.shape[0],) + (1,) * ( + x.ndim - 1 + ) # work with diff dim tensors, not just 2D ConvNets + random_tensor = x.new_empty(shape).bernoulli_(keep_prob) + if keep_prob > 0.0 and scale_by_keep: + random_tensor.div_(keep_prob) + return x * random_tensor + + +class TimmDropPath(nn.Module): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).""" + + def __init__(self, drop_prob: float = 0.0, scale_by_keep: bool = True): + super(TimmDropPath, self).__init__() + self.drop_prob = drop_prob + self.scale_by_keep = scale_by_keep + + def forward(self, x): + return drop_path(x, self.drop_prob, self.training, self.scale_by_keep) + + def extra_repr(self): + return f"drop_prob={round(self.drop_prob,3):0.3f}" + + +class Conv2d_BN(torch.nn.Sequential): + def __init__( + self, a, b, ks=1, stride=1, pad=0, dilation=1, groups=1, bn_weight_init=1 + ): + super().__init__() + self.add_module( + "c", torch.nn.Conv2d(a, b, ks, stride, pad, dilation, groups, bias=False) + ) + bn = torch.nn.BatchNorm2d(b) + torch.nn.init.constant_(bn.weight, bn_weight_init) + torch.nn.init.constant_(bn.bias, 0) + self.add_module("bn", bn) + + @torch.no_grad() + def fuse(self): + c, bn = self._modules.values() + w = bn.weight / (bn.running_var + bn.eps) ** 0.5 + w = c.weight * w[:, None, None, None] + b = bn.bias - bn.running_mean * bn.weight / (bn.running_var + bn.eps) ** 0.5 + m = torch.nn.Conv2d( + w.size(1) * self.c.groups, + w.size(0), + w.shape[2:], + stride=self.c.stride, + padding=self.c.padding, + dilation=self.c.dilation, + groups=self.c.groups, + ) + m.weight.data.copy_(w) + m.bias.data.copy_(b) + return m + + +class DropPath(TimmDropPath): + def __init__(self, drop_prob=None): + super().__init__(drop_prob=drop_prob) + self.drop_prob = drop_prob + + def __repr__(self): + msg = super().__repr__() + msg += f"(drop_prob={self.drop_prob})" + return msg + + +class PatchEmbed(nn.Module): + def __init__(self, in_chans, embed_dim, resolution, activation): + super().__init__() + img_size: Tuple[int, int] = to_2tuple(resolution) + self.patches_resolution = (img_size[0] // 4, img_size[1] // 4) + self.num_patches = self.patches_resolution[0] * self.patches_resolution[1] + self.in_chans = in_chans + self.embed_dim = embed_dim + n = embed_dim + self.seq = nn.Sequential( + Conv2d_BN(in_chans, n // 2, 3, 2, 1), + activation(), + Conv2d_BN(n // 2, n, 3, 2, 1), + ) + + def forward(self, x): + return self.seq(x) + + +class MBConv(nn.Module): + def __init__(self, in_chans, out_chans, expand_ratio, activation, drop_path): + super().__init__() + self.in_chans = in_chans + self.hidden_chans = int(in_chans * expand_ratio) + self.out_chans = out_chans + + self.conv1 = Conv2d_BN(in_chans, self.hidden_chans, ks=1) + self.act1 = activation() + + self.conv2 = Conv2d_BN( + self.hidden_chans, + self.hidden_chans, + ks=3, + stride=1, + pad=1, + groups=self.hidden_chans, + ) + self.act2 = activation() + + self.conv3 = Conv2d_BN(self.hidden_chans, out_chans, ks=1, bn_weight_init=0.0) + self.act3 = activation() + + self.drop_path = DropPath(drop_path) if drop_path > 0.0 else nn.Identity() + + def forward(self, x): + shortcut = x + + x = self.conv1(x) + x = self.act1(x) + + x = self.conv2(x) + x = self.act2(x) + + x = self.conv3(x) + + x = self.drop_path(x) + + x += shortcut + x = self.act3(x) + + return x + + +class PatchMerging(nn.Module): + def __init__(self, input_resolution, dim, out_dim, activation): + super().__init__() + + self.input_resolution = input_resolution + self.dim = dim + self.out_dim = out_dim + self.act = activation() + self.conv1 = Conv2d_BN(dim, out_dim, 1, 1, 0) + stride_c = 2 + if out_dim == 320 or out_dim == 448 or out_dim == 576: + stride_c = 1 + self.conv2 = Conv2d_BN(out_dim, out_dim, 3, stride_c, 1, groups=out_dim) + self.conv3 = Conv2d_BN(out_dim, out_dim, 1, 1, 0) + + def forward(self, x): + if x.ndim == 3: + H, W = self.input_resolution + B = len(x) + # (B, C, H, W) + x = x.view(B, H, W, -1).permute(0, 3, 1, 2) + + x = self.conv1(x) + x = self.act(x) + + x = self.conv2(x) + x = self.act(x) + x = self.conv3(x) + x = x.flatten(2).transpose(1, 2) + return x + + +class ConvLayer(nn.Module): + def __init__( + self, + dim, + input_resolution, + depth, + activation, + drop_path=0.0, + downsample=None, + use_checkpoint=False, + out_dim=None, + conv_expand_ratio=4.0, + ): + super().__init__() + self.dim = dim + self.input_resolution = input_resolution + self.depth = depth + self.use_checkpoint = use_checkpoint + + # build blocks + self.blocks = nn.ModuleList( + [ + MBConv( + dim, + dim, + conv_expand_ratio, + activation, + drop_path[i] if isinstance(drop_path, list) else drop_path, + ) + for i in range(depth) + ] + ) + + # patch merging layer + if downsample is not None: + self.downsample = downsample( + input_resolution, dim=dim, out_dim=out_dim, activation=activation + ) + else: + self.downsample = None + + def forward(self, x): + for blk in self.blocks: + if self.use_checkpoint: + x = checkpoint.checkpoint(blk, x) + else: + x = blk(x) + if self.downsample is not None: + x = self.downsample(x) + return x + + +class Mlp(nn.Module): + def __init__( + self, + in_features, + hidden_features=None, + out_features=None, + act_layer=nn.GELU, + drop=0.0, + ): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.norm = nn.LayerNorm(in_features) + self.fc1 = nn.Linear(in_features, hidden_features) + self.fc2 = nn.Linear(hidden_features, out_features) + self.act = act_layer() + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.norm(x) + + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(torch.nn.Module): + def __init__( + self, + dim, + key_dim, + num_heads=8, + attn_ratio=4, + resolution=(14, 14), + ): + super().__init__() + # (h, w) + assert isinstance(resolution, tuple) and len(resolution) == 2 + self.num_heads = num_heads + self.scale = key_dim**-0.5 + self.key_dim = key_dim + self.nh_kd = nh_kd = key_dim * num_heads + self.d = int(attn_ratio * key_dim) + self.dh = int(attn_ratio * key_dim) * num_heads + self.attn_ratio = attn_ratio + h = self.dh + nh_kd * 2 + + self.norm = nn.LayerNorm(dim) + self.qkv = nn.Linear(dim, h) + self.proj = nn.Linear(self.dh, dim) + + points = list(itertools.product(range(resolution[0]), range(resolution[1]))) + N = len(points) + attention_offsets = {} + idxs = [] + for p1 in points: + for p2 in points: + offset = (abs(p1[0] - p2[0]), abs(p1[1] - p2[1])) + if offset not in attention_offsets: + attention_offsets[offset] = len(attention_offsets) + idxs.append(attention_offsets[offset]) + self.attention_biases = torch.nn.Parameter( + torch.zeros(num_heads, len(attention_offsets)) + ) + self.register_buffer( + "attention_bias_idxs", torch.LongTensor(idxs).view(N, N), persistent=False + ) + + @torch.no_grad() + def train(self, mode=True): + super().train(mode) + if mode and hasattr(self, "ab"): + del self.ab + else: + self.register_buffer( + "ab", + self.attention_biases[:, self.attention_bias_idxs], + persistent=False, + ) + + def forward(self, x): # x (B,N,C) + B, N, _ = x.shape + + # Normalization + x = self.norm(x) + + qkv = self.qkv(x) + # (B, N, num_heads, d) + q, k, v = qkv.view(B, N, self.num_heads, -1).split( + [self.key_dim, self.key_dim, self.d], dim=3 + ) + # (B, num_heads, N, d) + q = q.permute(0, 2, 1, 3) + k = k.permute(0, 2, 1, 3) + v = v.permute(0, 2, 1, 3) + + attn = (q @ k.transpose(-2, -1)) * self.scale + ( + self.attention_biases[:, self.attention_bias_idxs] + if self.training + else self.ab + ) + attn = attn.softmax(dim=-1) + x = (attn @ v).transpose(1, 2).reshape(B, N, self.dh) + x = self.proj(x) + return x + + +class TinyViTBlock(nn.Module): + r"""TinyViT Block. + + Args: + dim (int): Number of input channels. + input_resolution (tuple[int, int]): Input resolution. + num_heads (int): Number of attention heads. + window_size (int): Window size. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + drop (float, optional): Dropout rate. Default: 0.0 + drop_path (float, optional): Stochastic depth rate. Default: 0.0 + local_conv_size (int): the kernel size of the convolution between + Attention and MLP. Default: 3 + activation: the activation function. Default: nn.GELU + """ + + def __init__( + self, + dim, + input_resolution, + num_heads, + window_size=7, + mlp_ratio=4.0, + drop=0.0, + drop_path=0.0, + local_conv_size=3, + activation=nn.GELU, + ): + super().__init__() + self.dim = dim + self.input_resolution = input_resolution + self.num_heads = num_heads + assert window_size > 0, "window_size must be greater than 0" + self.window_size = window_size + self.mlp_ratio = mlp_ratio + + self.drop_path = DropPath(drop_path) if drop_path > 0.0 else nn.Identity() + + assert dim % num_heads == 0, "dim must be divisible by num_heads" + head_dim = dim // num_heads + + window_resolution = (window_size, window_size) + self.attn = Attention( + dim, head_dim, num_heads, attn_ratio=1, resolution=window_resolution + ) + + mlp_hidden_dim = int(dim * mlp_ratio) + mlp_activation = activation + self.mlp = Mlp( + in_features=dim, + hidden_features=mlp_hidden_dim, + act_layer=mlp_activation, + drop=drop, + ) + + pad = local_conv_size // 2 + self.local_conv = Conv2d_BN( + dim, dim, ks=local_conv_size, stride=1, pad=pad, groups=dim + ) + + def forward(self, x): + H, W = self.input_resolution + B, L, C = x.shape + assert L == H * W, "input feature has wrong size" + res_x = x + if H == self.window_size and W == self.window_size: + x = self.attn(x) + else: + x = x.view(B, H, W, C) + pad_b = (self.window_size - H % self.window_size) % self.window_size + pad_r = (self.window_size - W % self.window_size) % self.window_size + padding = pad_b > 0 or pad_r > 0 + + if padding: + x = F.pad(x, (0, 0, 0, pad_r, 0, pad_b)) + + pH, pW = H + pad_b, W + pad_r + nH = pH // self.window_size + nW = pW // self.window_size + # window partition + x = ( + x.view(B, nH, self.window_size, nW, self.window_size, C) + .transpose(2, 3) + .reshape(B * nH * nW, self.window_size * self.window_size, C) + ) + x = self.attn(x) + # window reverse + x = ( + x.view(B, nH, nW, self.window_size, self.window_size, C) + .transpose(2, 3) + .reshape(B, pH, pW, C) + ) + + if padding: + x = x[:, :H, :W].contiguous() + + x = x.view(B, L, C) + + x = res_x + self.drop_path(x) + + x = x.transpose(1, 2).reshape(B, C, H, W) + x = self.local_conv(x) + x = x.view(B, C, L).transpose(1, 2) + + x = x + self.drop_path(self.mlp(x)) + return x + + def extra_repr(self) -> str: + return ( + f"dim={self.dim}, input_resolution={self.input_resolution}, num_heads={self.num_heads}, " + f"window_size={self.window_size}, mlp_ratio={self.mlp_ratio}" + ) + + +class BasicLayer(nn.Module): + """A basic TinyViT layer for one stage. + + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resolution. + depth (int): Number of blocks. + num_heads (int): Number of attention heads. + window_size (int): Local window size. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + drop (float, optional): Dropout rate. Default: 0.0 + drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0 + downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None + use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False. + local_conv_size: the kernel size of the depthwise convolution between attention and MLP. Default: 3 + activation: the activation function. Default: nn.GELU + out_dim: the output dimension of the layer. Default: dim + """ + + def __init__( + self, + dim, + input_resolution, + depth, + num_heads, + window_size, + mlp_ratio=4.0, + drop=0.0, + drop_path=0.0, + downsample=None, + use_checkpoint=False, + local_conv_size=3, + activation=nn.GELU, + out_dim=None, + ): + super().__init__() + self.dim = dim + self.input_resolution = input_resolution + self.depth = depth + self.use_checkpoint = use_checkpoint + + # build blocks + self.blocks = nn.ModuleList( + [ + TinyViTBlock( + dim=dim, + input_resolution=input_resolution, + num_heads=num_heads, + window_size=window_size, + mlp_ratio=mlp_ratio, + drop=drop, + drop_path=drop_path[i] + if isinstance(drop_path, list) + else drop_path, + local_conv_size=local_conv_size, + activation=activation, + ) + for i in range(depth) + ] + ) + + # patch merging layer + if downsample is not None: + self.downsample = downsample( + input_resolution, dim=dim, out_dim=out_dim, activation=activation + ) + else: + self.downsample = None + + def forward(self, x): + for blk in self.blocks: + if self.use_checkpoint: + x = checkpoint.checkpoint(blk, x) + else: + x = blk(x) + if self.downsample is not None: + x = self.downsample(x) + return x + + def extra_repr(self) -> str: + return f"dim={self.dim}, input_resolution={self.input_resolution}, depth={self.depth}" + + +class LayerNorm2d(nn.Module): + def __init__(self, num_channels: int, eps: float = 1e-6) -> None: + super().__init__() + self.weight = nn.Parameter(torch.ones(num_channels)) + self.bias = nn.Parameter(torch.zeros(num_channels)) + self.eps = eps + + def forward(self, x: torch.Tensor) -> torch.Tensor: + u = x.mean(1, keepdim=True) + s = (x - u).pow(2).mean(1, keepdim=True) + x = (x - u) / torch.sqrt(s + self.eps) + x = self.weight[:, None, None] * x + self.bias[:, None, None] + return x + + +class TinyViT(nn.Module): + def __init__( + self, + img_size=224, + in_chans=3, + num_classes=1000, + embed_dims=[96, 192, 384, 768], + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_sizes=[7, 7, 14, 7], + mlp_ratio=4.0, + drop_rate=0.0, + drop_path_rate=0.1, + use_checkpoint=False, + mbconv_expand_ratio=4.0, + local_conv_size=3, + layer_lr_decay=1.0, + ): + super().__init__() + self.img_size = img_size + self.num_classes = num_classes + self.depths = depths + self.num_layers = len(depths) + self.mlp_ratio = mlp_ratio + + activation = nn.GELU + + self.patch_embed = PatchEmbed( + in_chans=in_chans, + embed_dim=embed_dims[0], + resolution=img_size, + activation=activation, + ) + + patches_resolution = self.patch_embed.patches_resolution + self.patches_resolution = patches_resolution + + # stochastic depth + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, sum(depths)) + ] # stochastic depth decay rule + + # build layers + self.layers = nn.ModuleList() + for i_layer in range(self.num_layers): + kwargs = dict( + dim=embed_dims[i_layer], + input_resolution=( + patches_resolution[0] + // (2 ** (i_layer - 1 if i_layer == 3 else i_layer)), + patches_resolution[1] + // (2 ** (i_layer - 1 if i_layer == 3 else i_layer)), + ), + # input_resolution=(patches_resolution[0] // (2 ** i_layer), + # patches_resolution[1] // (2 ** i_layer)), + depth=depths[i_layer], + drop_path=dpr[sum(depths[:i_layer]) : sum(depths[: i_layer + 1])], + downsample=PatchMerging if (i_layer < self.num_layers - 1) else None, + use_checkpoint=use_checkpoint, + out_dim=embed_dims[min(i_layer + 1, len(embed_dims) - 1)], + activation=activation, + ) + if i_layer == 0: + layer = ConvLayer( + conv_expand_ratio=mbconv_expand_ratio, + **kwargs, + ) + else: + layer = BasicLayer( + num_heads=num_heads[i_layer], + window_size=window_sizes[i_layer], + mlp_ratio=self.mlp_ratio, + drop=drop_rate, + local_conv_size=local_conv_size, + **kwargs, + ) + self.layers.append(layer) + + # Classifier head + self.norm_head = nn.LayerNorm(embed_dims[-1]) + self.head = ( + nn.Linear(embed_dims[-1], num_classes) + if num_classes > 0 + else torch.nn.Identity() + ) + + # init weights + self.apply(self._init_weights) + self.set_layer_lr_decay(layer_lr_decay) + self.neck = nn.Sequential( + nn.Conv2d( + embed_dims[-1], + 256, + kernel_size=1, + bias=False, + ), + LayerNorm2d(256), + nn.Conv2d( + 256, + 256, + kernel_size=3, + padding=1, + bias=False, + ), + LayerNorm2d(256), + ) + + def set_layer_lr_decay(self, layer_lr_decay): + decay_rate = layer_lr_decay + + # layers -> blocks (depth) + depth = sum(self.depths) + lr_scales = [decay_rate ** (depth - i - 1) for i in range(depth)] + # print("LR SCALES:", lr_scales) + + def _set_lr_scale(m, scale): + for p in m.parameters(): + p.lr_scale = scale + + self.patch_embed.apply(lambda x: _set_lr_scale(x, lr_scales[0])) + i = 0 + for layer in self.layers: + for block in layer.blocks: + block.apply(lambda x: _set_lr_scale(x, lr_scales[i])) + i += 1 + if layer.downsample is not None: + layer.downsample.apply(lambda x: _set_lr_scale(x, lr_scales[i - 1])) + assert i == depth + for m in [self.norm_head, self.head]: + m.apply(lambda x: _set_lr_scale(x, lr_scales[-1])) + + for k, p in self.named_parameters(): + p.param_name = k + + def _check_lr_scale(m): + for p in m.parameters(): + assert hasattr(p, "lr_scale"), p.param_name + + self.apply(_check_lr_scale) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=0.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + @torch.jit.ignore + def no_weight_decay_keywords(self): + return {"attention_biases"} + + def forward_features(self, x): + # x: (N, C, H, W) + x = self.patch_embed(x) + + x = self.layers[0](x) + start_i = 1 + + for i in range(start_i, len(self.layers)): + layer = self.layers[i] + x = layer(x) + B, _, C = x.size() + x = x.view(B, 64, 64, C) + x = x.permute(0, 3, 1, 2) + x = self.neck(x) + return x + + def forward(self, x): + x = self.forward_features(x) + # x = self.norm_head(x) + # x = self.head(x) + return x From d061b07029ebd7778307a3d59e93f53b893f15c2 Mon Sep 17 00:00:00 2001 From: Qing Date: Tue, 14 Nov 2023 14:02:10 +0800 Subject: [PATCH 005/134] update --- lama_cleaner/model/kandinsky.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lama_cleaner/model/kandinsky.py b/lama_cleaner/model/kandinsky.py index cf583bd..ea9d9c9 100644 --- a/lama_cleaner/model/kandinsky.py +++ b/lama_cleaner/model/kandinsky.py @@ -24,13 +24,6 @@ class Kandinsky(DiffusionInpaintModel): "torch_dtype": torch_dtype, } - # self.pipe_prior = KandinskyPriorPipeline.from_pretrained( - # self.prior_name, **model_kwargs - # ).to("cpu") - # - # self.model = KandinskyInpaintPipeline.from_pretrained( - # self.model_name, **model_kwargs - # ).to(device) self.model = AutoPipelineForInpainting.from_pretrained( self.model_name, **model_kwargs ).to(device) @@ -54,6 +47,7 @@ class Kandinsky(DiffusionInpaintModel): mask = mask.astype(np.float32) / 255 img_h, img_w = image.shape[:2] + # kandinsky 没有 strength output = self.model( prompt=config.prompt, negative_prompt=config.negative_prompt, @@ -65,6 +59,7 @@ class Kandinsky(DiffusionInpaintModel): guidance_scale=config.sd_guidance_scale, output_type="np", callback=self.callback, + generator=generator, ).images[0] output = (output * 255).round().astype("uint8") From 53b9f3e92fd7444c1425e80ccd78273f4e3c4dec Mon Sep 17 00:00:00 2001 From: Qing Date: Tue, 14 Nov 2023 14:02:15 +0800 Subject: [PATCH 006/134] sd add strength --- lama_cleaner/model/sd.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lama_cleaner/model/sd.py b/lama_cleaner/model/sd.py index 0fb565d..b29626c 100644 --- a/lama_cleaner/model/sd.py +++ b/lama_cleaner/model/sd.py @@ -146,6 +146,7 @@ class SD(DiffusionInpaintModel): negative_prompt=config.negative_prompt, mask_image=PIL.Image.fromarray(mask[:, :, -1], mode="L"), num_inference_steps=config.sd_steps, + strength=config.sd_strength, guidance_scale=config.sd_guidance_scale, output_type="np", callback=self.callback, From 78c8d8dbdbf06d0b109f9db9a4f7a9739fab9130 Mon Sep 17 00:00:00 2001 From: Qing Date: Tue, 14 Nov 2023 14:04:06 +0800 Subject: [PATCH 007/134] update --- .../pipeline/pipeline_stable_diffusion_controlnet_inpaint.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py b/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py index f5883b8..b1d3b87 100644 --- a/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py +++ b/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py @@ -11,14 +11,17 @@ # 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. +from typing import Union, List, Optional, Callable, Dict, Any # Copy from https://github.com/mikonvergence/ControlNetInpaint/blob/main/src/pipeline_stable_diffusion_controlnet_inpaint.py import torch import PIL.Image import numpy as np +from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_controlnet import * +from diffusers.utils import replace_example_docstring EXAMPLE_DOC_STRING = """ Examples: From 8fbc8059e1d4a1d25db59d3139719ee850be966d Mon Sep 17 00:00:00 2001 From: Qing Date: Tue, 14 Nov 2023 14:19:56 +0800 Subject: [PATCH 008/134] add sdxl --- lama_cleaner/const.py | 2 + lama_cleaner/model/g_diffuser_bot.py | 13 +-- lama_cleaner/model/sdxl.py | 111 +++++++++++++++++++++++++ lama_cleaner/model_manager.py | 2 + lama_cleaner/schema.py | 12 ++- lama_cleaner/tests/test_outpainting.py | 10 ++- lama_cleaner/tests/test_sdxl.py | 110 ++++++++++++++++++++++++ 7 files changed, 246 insertions(+), 14 deletions(-) create mode 100644 lama_cleaner/model/sdxl.py create mode 100644 lama_cleaner/tests/test_sdxl.py diff --git a/lama_cleaner/const.py b/lama_cleaner/const.py index 738f283..809dc99 100644 --- a/lama_cleaner/const.py +++ b/lama_cleaner/const.py @@ -13,6 +13,7 @@ MPS_SUPPORT_MODELS = [ "paint_by_example", "controlnet", "kandinsky2.2", + "sdxl", ] DEFAULT_MODEL = "lama" @@ -23,6 +24,7 @@ AVAILABLE_MODELS = [ "mat", "fcf", "sd1.5", + "sdxl", "anything4", "realisticVision1.4", "cv2", diff --git a/lama_cleaner/model/g_diffuser_bot.py b/lama_cleaner/model/g_diffuser_bot.py index 450d618..bf7ce2a 100644 --- a/lama_cleaner/model/g_diffuser_bot.py +++ b/lama_cleaner/model/g_diffuser_bot.py @@ -151,6 +151,7 @@ def expand_image( hard_mask[:, 0 : origin_w // 2] = 255 if right != 0: hard_mask[:, origin_w // 2 :] = 255 + hard_mask = cv2.copyMakeBorder( hard_mask, top, bottom, left, right, cv2.BORDER_CONSTANT, value=255 ) @@ -166,12 +167,12 @@ if __name__ == "__main__": init_image = cv2.imread(str(image_path)) init_image, mask_image = expand_image( init_image, - 200, - 200, - 0, - 0, - 60, - 50, + top=100, + right=100, + bottom=100, + left=100, + softness=20, + space=20, ) print(mask_image.dtype, mask_image.min(), mask_image.max()) print(init_image.dtype, init_image.min(), init_image.max()) diff --git a/lama_cleaner/model/sdxl.py b/lama_cleaner/model/sdxl.py new file mode 100644 index 0000000..d55c591 --- /dev/null +++ b/lama_cleaner/model/sdxl.py @@ -0,0 +1,111 @@ +import PIL.Image +import cv2 +import numpy as np +import torch +from loguru import logger + +from lama_cleaner.model.base import DiffusionInpaintModel +from lama_cleaner.model.utils import torch_gc, get_scheduler +from lama_cleaner.schema import Config + + +class SDXL(DiffusionInpaintModel): + name = "sdxl" + pad_mod = 8 + min_size = 512 + + def init_model(self, device: torch.device, **kwargs): + from diffusers.pipelines import AutoPipelineForInpainting + + fp16 = not kwargs.get("no_half", False) + + model_kwargs = { + "local_files_only": kwargs.get("local_files_only", kwargs["sd_run_local"]) + } + if kwargs["disable_nsfw"] or kwargs.get("cpu_offload", False): + logger.info("Disable Stable Diffusion Model NSFW checker") + model_kwargs.update( + dict( + safety_checker=None, + feature_extractor=None, + requires_safety_checker=False, + ) + ) + + use_gpu = device == torch.device("cuda") and torch.cuda.is_available() + torch_dtype = torch.float16 if use_gpu and fp16 else torch.float32 + + self.model = AutoPipelineForInpainting.from_pretrained( + "diffusers/stable-diffusion-xl-1.0-inpainting-0.1", + revision="main", + torch_dtype=torch_dtype, + use_auth_token=kwargs["hf_access_token"], + **model_kwargs, + ) + + # https://huggingface.co/docs/diffusers/v0.7.0/en/api/pipelines/stable_diffusion#diffusers.StableDiffusionInpaintPipeline.enable_attention_slicing + self.model.enable_attention_slicing() + # https://huggingface.co/docs/diffusers/v0.7.0/en/optimization/fp16#memory-efficient-attention + if kwargs.get("enable_xformers", False): + self.model.enable_xformers_memory_efficient_attention() + + if kwargs.get("cpu_offload", False) and use_gpu: + logger.info("Enable sequential cpu offload") + self.model.enable_sequential_cpu_offload(gpu_id=0) + else: + self.model = self.model.to(device) + if kwargs["sd_cpu_textencoder"]: + logger.warning("Stable Diffusion XL not support run TextEncoder on CPU") + + self.callback = kwargs.pop("callback", None) + + def forward(self, image, mask, config: Config): + """Input image and output image have same size + image: [H, W, C] RGB + mask: [H, W, 1] 255 means area to repaint + return: BGR IMAGE + """ + + scheduler_config = self.model.scheduler.config + scheduler = get_scheduler(config.sd_sampler, scheduler_config) + self.model.scheduler = scheduler + + if config.sd_mask_blur != 0: + k = 2 * config.sd_mask_blur + 1 + mask = cv2.GaussianBlur(mask, (k, k), 0)[:, :, np.newaxis] + + img_h, img_w = image.shape[:2] + + output = self.model( + image=PIL.Image.fromarray(image), + prompt=config.prompt, + negative_prompt=config.negative_prompt, + mask_image=PIL.Image.fromarray(mask[:, :, -1], mode="L"), + num_inference_steps=config.sd_steps, + strength=0.999 if config.sd_strength == 1.0 else config.sd_strength, + guidance_scale=config.sd_guidance_scale, + output_type="np", + callback=self.callback, + height=img_h, + width=img_w, + generator=torch.manual_seed(config.sd_seed), + callback_steps=1 + ).images[0] + + output = (output * 255).round().astype("uint8") + output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR) + return output + + def forward_post_process(self, result, image, mask, config): + if config.sd_match_histograms: + result = self._match_histograms(result, image[:, :, ::-1], mask) + + if config.sd_mask_blur != 0: + k = 2 * config.sd_mask_blur + 1 + mask = cv2.GaussianBlur(mask, (k, k), 0) + return result, image, mask + + @staticmethod + def is_downloaded() -> bool: + # model will be downloaded when app start, and can't switch in frontend settings + return True diff --git a/lama_cleaner/model_manager.py b/lama_cleaner/model_manager.py index 4dca9e8..7d5ed46 100644 --- a/lama_cleaner/model_manager.py +++ b/lama_cleaner/model_manager.py @@ -15,6 +15,7 @@ from lama_cleaner.model.mat import MAT from lama_cleaner.model.paint_by_example import PaintByExample from lama_cleaner.model.instruct_pix2pix import InstructPix2Pix from lama_cleaner.model.sd import SD15, SD2, Anything4, RealisticVision14 +from lama_cleaner.model.sdxl import SDXL from lama_cleaner.model.utils import torch_gc from lama_cleaner.model.zits import ZITS from lama_cleaner.model.opencv2 import OpenCV2 @@ -35,6 +36,7 @@ models = { "paint_by_example": PaintByExample, "instruct_pix2pix": InstructPix2Pix, Kandinsky22.name: Kandinsky22, + SDXL.name: SDXL, } diff --git a/lama_cleaner/schema.py b/lama_cleaner/schema.py index b710cdc..1893e5a 100644 --- a/lama_cleaner/schema.py +++ b/lama_cleaner/schema.py @@ -66,8 +66,12 @@ class Config(BaseModel): sd_scale: float = 1.0 # Blur the edge of mask area. The higher the number the smoother blend with the original image sd_mask_blur: int = 0 - # Ignore this value, it's useless for inpainting - sd_strength: float = 0.75 + # Indicates extent to transform the reference `image`. Must be between 0 and 1. `image` is used as a + # starting point and more noise is added the higher the `strength`. The number of denoising steps depends + # on the amount of noise initially added. When `strength` is 1, added noise is maximum and the denoising + # process runs for the full number of iterations specified in `num_inference_steps`. A value of 1 + # essentially ignores `image`. + sd_strength: float = 1.0 # The number of denoising steps. More denoising steps usually lead to a # higher quality image at the expense of slower inference. sd_steps: int = 50 @@ -80,8 +84,8 @@ class Config(BaseModel): sd_match_histograms: bool = False # out-painting - sd_outpainting_softness: float = 30.0 - sd_outpainting_space: float = 50.0 + sd_outpainting_softness: float = 20.0 + sd_outpainting_space: float = 20.0 # Configs for opencv inpainting # opencv document https://docs.opencv.org/4.6.0/d7/d8b/group__photo__inpaint.html#gga8002a65f5a3328fbf15df81b842d3c3ca05e763003a805e6c11c673a9f4ba7d07 diff --git a/lama_cleaner/tests/test_outpainting.py b/lama_cleaner/tests/test_outpainting.py index e306b30..3b3dbba 100644 --- a/lama_cleaner/tests/test_outpainting.py +++ b/lama_cleaner/tests/test_outpainting.py @@ -57,7 +57,7 @@ def test_outpainting(name, sd_device, rect): croper_y=rect[1], croper_width=rect[2], croper_height=rect[3], - sd_guidance_scale=4, + sd_guidance_scale=8.0, sd_sampler=SDSampler.dpm_plus_plus, ) @@ -75,7 +75,7 @@ def test_outpainting(name, sd_device, rect): @pytest.mark.parametrize( "rect", [ - [-100, -100, 768, 768], + [-128, -128, 768, 768], ], ) def test_kandinsky_outpainting(name, sd_device, rect): @@ -86,7 +86,7 @@ def test_kandinsky_outpainting(name, sd_device, rect): return model = ModelManager( - name=name, + name="sd1.5", device=torch.device(sd_device), hf_access_token="", sd_run_local=True, @@ -105,7 +105,7 @@ def test_kandinsky_outpainting(name, sd_device, rect): croper_y=rect[1], croper_width=rect[2], croper_height=rect[3], - sd_guidance_scale=4, + sd_guidance_scale=7, sd_sampler=SDSampler.dpm_plus_plus, ) @@ -115,4 +115,6 @@ def test_kandinsky_outpainting(name, sd_device, rect): f"{name.replace('.', '_')}_outpainting_dpm++_{'_'.join(map(str, rect))}.png", img_p=current_dir / "cat.png", mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png", + fx=1, + fy=1, ) diff --git a/lama_cleaner/tests/test_sdxl.py b/lama_cleaner/tests/test_sdxl.py new file mode 100644 index 0000000..68230a2 --- /dev/null +++ b/lama_cleaner/tests/test_sdxl.py @@ -0,0 +1,110 @@ +import os + +os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" +from pathlib import Path + +import pytest +import torch + +from lama_cleaner.model_manager import ModelManager +from lama_cleaner.schema import HDStrategy, SDSampler +from lama_cleaner.tests.test_model import get_config, assert_equal + +current_dir = Path(__file__).parent.absolute().resolve() +save_dir = current_dir / "result" +save_dir.mkdir(exist_ok=True, parents=True) + + +@pytest.mark.parametrize("sd_device", ["mps"]) +@pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) +@pytest.mark.parametrize("sampler", [SDSampler.ddim]) +@pytest.mark.parametrize("cpu_textencoder", [False]) +@pytest.mark.parametrize("disable_nsfw", [True]) +def test_sdxl(sd_device, strategy, sampler, cpu_textencoder, disable_nsfw): + def callback(i, t, latents): + pass + + if sd_device == "cuda" and not torch.cuda.is_available(): + return + + sd_steps = 20 + model = ModelManager( + name="sdxl", + device=torch.device(sd_device), + hf_access_token="", + sd_run_local=False, + disable_nsfw=disable_nsfw, + sd_cpu_textencoder=cpu_textencoder, + callback=callback, + ) + cfg = get_config( + strategy, + prompt="a fox sitting on a bench", + sd_steps=sd_steps, + sd_strength=0.99, + sd_guidance_scale=7.0, + ) + cfg.sd_sampler = sampler + + name = f"device_{sd_device}_{sampler}_cpu_textencoder_{cpu_textencoder}_disnsfw_{disable_nsfw}" + + assert_equal( + model, + cfg, + f"sdxl_{name}.png", + img_p=current_dir / "overture-creations-5sI6fQgYIuo.png", + mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png", + fx=2, + fy=2, + ) + + +@pytest.mark.parametrize("sd_device", ["mps"]) +@pytest.mark.parametrize( + "rect", + [ + [-128, -128, 1024, 1024], + ], +) +def test_sdxl_outpainting(sd_device, rect): + def callback(i, t, latents): + pass + + if sd_device == "cuda" and not torch.cuda.is_available(): + return + + model = ModelManager( + name="sdxl", + device=torch.device(sd_device), + hf_access_token="", + sd_run_local=True, + disable_nsfw=True, + sd_cpu_textencoder=False, + callback=callback, + ) + + cfg = get_config( + HDStrategy.ORIGINAL, + prompt="a dog sitting on a bench in the park", + negative_prompt="lowres, text, error, cropped, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, out of frame, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck, username, watermark, signature", + sd_steps=20, + use_croper=True, + croper_is_outpainting=True, + croper_x=rect[0], + croper_y=rect[1], + croper_width=rect[2], + croper_height=rect[3], + sd_strength=1.0, + sd_guidance_scale=8.0, + sd_sampler=SDSampler.ddim, + ) + + assert_equal( + model, + cfg, + f"sdxl_outpainting_dog_ddim_{'_'.join(map(str, rect))}.png", + img_p=current_dir / "overture-creations-5sI6fQgYIuo.png", + mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png", + fx=1.5, + fy=1.5, + ) From 2c9a53da8e18d7ec3e4b5ae87089f8c8da5a4ccf Mon Sep 17 00:00:00 2001 From: Qing Date: Tue, 14 Nov 2023 15:24:30 +0800 Subject: [PATCH 009/134] sdxl do not has nsfw --- lama_cleaner/model/sdxl.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lama_cleaner/model/sdxl.py b/lama_cleaner/model/sdxl.py index d55c591..05fd9cf 100644 --- a/lama_cleaner/model/sdxl.py +++ b/lama_cleaner/model/sdxl.py @@ -22,15 +22,6 @@ class SDXL(DiffusionInpaintModel): model_kwargs = { "local_files_only": kwargs.get("local_files_only", kwargs["sd_run_local"]) } - if kwargs["disable_nsfw"] or kwargs.get("cpu_offload", False): - logger.info("Disable Stable Diffusion Model NSFW checker") - model_kwargs.update( - dict( - safety_checker=None, - feature_extractor=None, - requires_safety_checker=False, - ) - ) use_gpu = device == torch.device("cuda") and torch.cuda.is_available() torch_dtype = torch.float16 if use_gpu and fp16 else torch.float32 From bb98c91c8cd940a8fae6e357f9e736deb73275d6 Mon Sep 17 00:00:00 2001 From: Qing Date: Tue, 14 Nov 2023 22:04:16 +0800 Subject: [PATCH 010/134] backend add freeu --- lama_cleaner/const.py | 2 ++ lama_cleaner/model_manager.py | 19 ++++++++++++++++++- lama_cleaner/schema.py | 11 +++++++++++ requirements.txt | 4 ++-- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lama_cleaner/const.py b/lama_cleaner/const.py index 809dc99..233f291 100644 --- a/lama_cleaner/const.py +++ b/lama_cleaner/const.py @@ -33,8 +33,10 @@ AVAILABLE_MODELS = [ "paint_by_example", "instruct_pix2pix", "kandinsky2.2", + "sdxl" ] SD15_MODELS = ["sd1.5", "anything4", "realisticVision1.4"] +MODELS_SUPPORT_FREEU = SD15_MODELS + ['sd2', "sdxl"] AVAILABLE_DEVICES = ["cuda", "cpu", "mps"] DEFAULT_DEVICE = "cuda" diff --git a/lama_cleaner/model_manager.py b/lama_cleaner/model_manager.py index 7d5ed46..7b5278d 100644 --- a/lama_cleaner/model_manager.py +++ b/lama_cleaner/model_manager.py @@ -3,7 +3,7 @@ import gc from loguru import logger -from lama_cleaner.const import SD15_MODELS +from lama_cleaner.const import SD15_MODELS, MODELS_SUPPORT_FREEU from lama_cleaner.helper import switch_mps_device from lama_cleaner.model.controlnet import ControlNet from lama_cleaner.model.fcf import FcF @@ -65,6 +65,7 @@ class ModelManager: def __call__(self, image, mask, config: Config): self.switch_controlnet_method(control_method=config.controlnet_method) + self.enable_disable_freeu(config) return self.model(image, mask, config) def switch(self, new_name: str, **kwargs): @@ -120,3 +121,19 @@ class ModelManager: self.name, switch_mps_device(self.name, self.device), **self.kwargs ) logger.info(f"Switch ControlNet method from {old_method} to {control_method}") + + def enable_disable_freeu(self, config: Config): + if str(self.model.device) == "mps": + return + + if self.name in MODELS_SUPPORT_FREEU: + if config.sd_freeu: + freeu_config = config.sd_freeu_config + self.model.model.enable_freeu( + s1=freeu_config.s1, + s2=freeu_config.s2, + b1=freeu_config.b1, + b2=freeu_config.b2, + ) + else: + self.model.model.disable_freeu() diff --git a/lama_cleaner/schema.py b/lama_cleaner/schema.py index 1893e5a..5c8651a 100644 --- a/lama_cleaner/schema.py +++ b/lama_cleaner/schema.py @@ -31,6 +31,13 @@ class SDSampler(str, Enum): uni_pc = "uni_pc" +class FREEUConfig(BaseModel): + s1: float = 1.0 + s2: float = 1.0 + b1: float = 1.0 + b2: float = 1.0 + + class Config(BaseModel): class Config: arbitrary_types_allowed = True @@ -87,6 +94,10 @@ class Config(BaseModel): sd_outpainting_softness: float = 20.0 sd_outpainting_space: float = 20.0 + # freeu + sd_freeu: bool = False + sd_freeu_config: FREEUConfig = FREEUConfig() + # Configs for opencv inpainting # opencv document https://docs.opencv.org/4.6.0/d7/d8b/group__photo__inpaint.html#gga8002a65f5a3328fbf15df81b842d3c3ca05e763003a805e6c11c673a9f4ba7d07 cv2_flag: str = "INPAINT_NS" diff --git a/requirements.txt b/requirements.txt index 8d35bf3..016a179 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,8 +9,8 @@ pydantic rich loguru yacs -diffusers==0.20.1 -transformers==4.27.4 +diffusers==0.23.0 +transformers==4.34.1 gradio piexif==1.1.3 safetensors From 58b931fdb2bbe34b0b51596b33f4a1eefa7e3011 Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 15 Nov 2023 08:50:35 +0800 Subject: [PATCH 011/134] add lcm lora --- lama_cleaner/const.py | 1 + lama_cleaner/model/base.py | 11 ++++++++++- lama_cleaner/model/sd.py | 8 +++----- lama_cleaner/model/sdxl.py | 8 +++----- lama_cleaner/model_manager.py | 12 +++++++++++- lama_cleaner/schema.py | 5 +++++ 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/lama_cleaner/const.py b/lama_cleaner/const.py index 233f291..30937e6 100644 --- a/lama_cleaner/const.py +++ b/lama_cleaner/const.py @@ -37,6 +37,7 @@ AVAILABLE_MODELS = [ ] SD15_MODELS = ["sd1.5", "anything4", "realisticVision1.4"] MODELS_SUPPORT_FREEU = SD15_MODELS + ['sd2', "sdxl"] +MODELS_SUPPORT_LCM_LORA = SD15_MODELS + ["sdxl"] AVAILABLE_DEVICES = ["cuda", "cpu", "mps"] DEFAULT_DEVICE = "cuda" diff --git a/lama_cleaner/model/base.py b/lama_cleaner/model/base.py index c452690..d74f4e9 100644 --- a/lama_cleaner/model/base.py +++ b/lama_cleaner/model/base.py @@ -13,7 +13,8 @@ from lama_cleaner.helper import ( switch_mps_device, ) from lama_cleaner.model.g_diffuser_bot import expand_image, np_img_grey_to_rgb -from lama_cleaner.schema import Config, HDStrategy +from lama_cleaner.model.utils import get_scheduler +from lama_cleaner.schema import Config, HDStrategy, SDSampler class InpaintModel: @@ -381,3 +382,11 @@ class DiffusionInpaintModel(InpaintModel): # original_pixel_indices # ] return inpaint_result + + def set_scheduler(self, config: Config): + scheduler_config = self.model.scheduler.config + sd_sampler = config.sd_sampler + if config.sd_lcm_lora: + sd_sampler = SDSampler.lcm + scheduler = get_scheduler(sd_sampler, scheduler_config) + self.model.scheduler = scheduler diff --git a/lama_cleaner/model/sd.py b/lama_cleaner/model/sd.py index b29626c..9aa1b54 100644 --- a/lama_cleaner/model/sd.py +++ b/lama_cleaner/model/sd.py @@ -8,7 +8,7 @@ from loguru import logger from lama_cleaner.model.base import DiffusionInpaintModel from lama_cleaner.model.utils import torch_gc, get_scheduler -from lama_cleaner.schema import Config +from lama_cleaner.schema import Config, SDSampler class CPUTextEncoderWrapper: @@ -67,6 +67,7 @@ def load_from_local_model(local_model_path, torch_dtype, disable_nsfw=True): class SD(DiffusionInpaintModel): pad_mod = 8 min_size = 512 + lcm_lora_id = "latent-consistency/lcm-lora-sdv1-5" def init_model(self, device: torch.device, **kwargs): from diffusers.pipelines.stable_diffusion import StableDiffusionInpaintPipeline @@ -129,10 +130,7 @@ class SD(DiffusionInpaintModel): mask: [H, W, 1] 255 means area to repaint return: BGR IMAGE """ - - scheduler_config = self.model.scheduler.config - scheduler = get_scheduler(config.sd_sampler, scheduler_config) - self.model.scheduler = scheduler + self.set_scheduler(config) if config.sd_mask_blur != 0: k = 2 * config.sd_mask_blur + 1 diff --git a/lama_cleaner/model/sdxl.py b/lama_cleaner/model/sdxl.py index 05fd9cf..197ab77 100644 --- a/lama_cleaner/model/sdxl.py +++ b/lama_cleaner/model/sdxl.py @@ -13,6 +13,7 @@ class SDXL(DiffusionInpaintModel): name = "sdxl" pad_mod = 8 min_size = 512 + lcm_lora_id = "latent-consistency/lcm-lora-sdxl" def init_model(self, device: torch.device, **kwargs): from diffusers.pipelines import AutoPipelineForInpainting @@ -56,10 +57,7 @@ class SDXL(DiffusionInpaintModel): mask: [H, W, 1] 255 means area to repaint return: BGR IMAGE """ - - scheduler_config = self.model.scheduler.config - scheduler = get_scheduler(config.sd_sampler, scheduler_config) - self.model.scheduler = scheduler + self.set_scheduler(config) if config.sd_mask_blur != 0: k = 2 * config.sd_mask_blur + 1 @@ -80,7 +78,7 @@ class SDXL(DiffusionInpaintModel): height=img_h, width=img_w, generator=torch.manual_seed(config.sd_seed), - callback_steps=1 + callback_steps=1, ).images[0] output = (output * 255).round().astype("uint8") diff --git a/lama_cleaner/model_manager.py b/lama_cleaner/model_manager.py index 7b5278d..43d9ced 100644 --- a/lama_cleaner/model_manager.py +++ b/lama_cleaner/model_manager.py @@ -3,7 +3,7 @@ import gc from loguru import logger -from lama_cleaner.const import SD15_MODELS, MODELS_SUPPORT_FREEU +from lama_cleaner.const import SD15_MODELS, MODELS_SUPPORT_FREEU, MODELS_SUPPORT_LCM_LORA from lama_cleaner.helper import switch_mps_device from lama_cleaner.model.controlnet import ControlNet from lama_cleaner.model.fcf import FcF @@ -66,6 +66,7 @@ class ModelManager: def __call__(self, image, mask, config: Config): self.switch_controlnet_method(control_method=config.controlnet_method) self.enable_disable_freeu(config) + self.enable_disable_lcm_lora(config) return self.model(image, mask, config) def switch(self, new_name: str, **kwargs): @@ -137,3 +138,12 @@ class ModelManager: ) else: self.model.model.disable_freeu() + + def enable_disable_lcm_lora(self, config: Config): + if self.name in MODELS_SUPPORT_LCM_LORA: + if config.sd_lcm_lora: + if not self.model.model.pipe.get_list_adapters(): + self.model.model.load_lora_weights(self.model.lcm_lora_id) + else: + self.model.model.disable_lora() + diff --git a/lama_cleaner/schema.py b/lama_cleaner/schema.py index 5c8651a..d384a08 100644 --- a/lama_cleaner/schema.py +++ b/lama_cleaner/schema.py @@ -30,6 +30,8 @@ class SDSampler(str, Enum): dpm_plus_plus = "dpm++" uni_pc = "uni_pc" + lcm = "lcm" + class FREEUConfig(BaseModel): s1: float = 1.0 @@ -98,6 +100,9 @@ class Config(BaseModel): sd_freeu: bool = False sd_freeu_config: FREEUConfig = FREEUConfig() + # lcm-lora + sd_lcm_lora: bool = False + # Configs for opencv inpainting # opencv document https://docs.opencv.org/4.6.0/d7/d8b/group__photo__inpaint.html#gga8002a65f5a3328fbf15df81b842d3c3ca05e763003a805e6c11c673a9f4ba7d07 cv2_flag: str = "INPAINT_NS" From f13bfb90852bc51637d6ccfbb697ae299cd77bae Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 15 Nov 2023 08:58:52 +0800 Subject: [PATCH 012/134] clean code --- lama_cleaner/model/base.py | 9 +++++++++ lama_cleaner/model/kandinsky.py | 9 --------- lama_cleaner/model/sd.py | 9 --------- lama_cleaner/model/sdxl.py | 8 -------- 4 files changed, 9 insertions(+), 26 deletions(-) diff --git a/lama_cleaner/model/base.py b/lama_cleaner/model/base.py index d74f4e9..b61ba8f 100644 --- a/lama_cleaner/model/base.py +++ b/lama_cleaner/model/base.py @@ -390,3 +390,12 @@ class DiffusionInpaintModel(InpaintModel): sd_sampler = SDSampler.lcm scheduler = get_scheduler(sd_sampler, scheduler_config) self.model.scheduler = scheduler + + def forward_post_process(self, result, image, mask, config): + if config.sd_match_histograms: + result = self._match_histograms(result, image[:, :, ::-1], mask) + + if config.sd_mask_blur != 0: + k = 2 * config.sd_mask_blur + 1 + mask = cv2.GaussianBlur(mask, (k, k), 0) + return result, image, mask diff --git a/lama_cleaner/model/kandinsky.py b/lama_cleaner/model/kandinsky.py index ea9d9c9..769e805 100644 --- a/lama_cleaner/model/kandinsky.py +++ b/lama_cleaner/model/kandinsky.py @@ -66,15 +66,6 @@ class Kandinsky(DiffusionInpaintModel): output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR) return output - def forward_post_process(self, result, image, mask, config): - if config.sd_match_histograms: - result = self._match_histograms(result, image[:, :, ::-1], mask) - - if config.sd_mask_blur != 0: - k = 2 * config.sd_mask_blur + 1 - mask = cv2.GaussianBlur(mask, (k, k), 0) - return result, image, mask - @staticmethod def is_downloaded() -> bool: # model will be downloaded when app start, and can't switch in frontend settings diff --git a/lama_cleaner/model/sd.py b/lama_cleaner/model/sd.py index 9aa1b54..d56139a 100644 --- a/lama_cleaner/model/sd.py +++ b/lama_cleaner/model/sd.py @@ -157,15 +157,6 @@ class SD(DiffusionInpaintModel): output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR) return output - def forward_post_process(self, result, image, mask, config): - if config.sd_match_histograms: - result = self._match_histograms(result, image[:, :, ::-1], mask) - - if config.sd_mask_blur != 0: - k = 2 * config.sd_mask_blur + 1 - mask = cv2.GaussianBlur(mask, (k, k), 0) - return result, image, mask - @staticmethod def is_downloaded() -> bool: # model will be downloaded when app start, and can't switch in frontend settings diff --git a/lama_cleaner/model/sdxl.py b/lama_cleaner/model/sdxl.py index 197ab77..7615795 100644 --- a/lama_cleaner/model/sdxl.py +++ b/lama_cleaner/model/sdxl.py @@ -85,14 +85,6 @@ class SDXL(DiffusionInpaintModel): output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR) return output - def forward_post_process(self, result, image, mask, config): - if config.sd_match_histograms: - result = self._match_histograms(result, image[:, :, ::-1], mask) - - if config.sd_mask_blur != 0: - k = 2 * config.sd_mask_blur + 1 - mask = cv2.GaussianBlur(mask, (k, k), 0) - return result, image, mask @staticmethod def is_downloaded() -> bool: From 3e7a553273aeef27c7246126712348e283f7eafb Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 15 Nov 2023 09:10:13 +0800 Subject: [PATCH 013/134] add sd_prevent_unmasked_area --- lama_cleaner/model/base.py | 5 +++-- lama_cleaner/model/sd.py | 1 + lama_cleaner/schema.py | 3 +++ lama_cleaner/tests/test_sd_model.py | 12 ++++++++---- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lama_cleaner/model/base.py b/lama_cleaner/model/base.py index b61ba8f..726a2be 100644 --- a/lama_cleaner/model/base.py +++ b/lama_cleaner/model/base.py @@ -67,8 +67,9 @@ class InpaintModel: result, image, mask = self.forward_post_process(result, image, mask, config) - mask = mask[:, :, np.newaxis] - result = result * (mask / 255) + image[:, :, ::-1] * (1 - (mask / 255)) + if config.sd_prevent_unmasked_area: + mask = mask[:, :, np.newaxis] + result = result * (mask / 255) + image[:, :, ::-1] * (1 - (mask / 255)) return result def forward_post_process(self, result, image, mask, config): diff --git a/lama_cleaner/model/sd.py b/lama_cleaner/model/sd.py index d56139a..f19b96c 100644 --- a/lama_cleaner/model/sd.py +++ b/lama_cleaner/model/sd.py @@ -151,6 +151,7 @@ class SD(DiffusionInpaintModel): height=img_h, width=img_w, generator=torch.manual_seed(config.sd_seed), + callback_steps=1, ).images[0] output = (output * 255).round().astype("uint8") diff --git a/lama_cleaner/schema.py b/lama_cleaner/schema.py index d384a08..8b7e172 100644 --- a/lama_cleaner/schema.py +++ b/lama_cleaner/schema.py @@ -103,6 +103,9 @@ class Config(BaseModel): # lcm-lora sd_lcm_lora: bool = False + # preserving the unmasked area at the expense of some more unnatural transitions between the masked and unmasked areas. + sd_prevent_unmasked_area: bool = True + # Configs for opencv inpainting # opencv document https://docs.opencv.org/4.6.0/d7/d8b/group__photo__inpaint.html#gga8002a65f5a3328fbf15df81b842d3c3ca05e763003a805e6c11c673a9f4ba7d07 cv2_flag: str = "INPAINT_NS" diff --git a/lama_cleaner/tests/test_sd_model.py b/lama_cleaner/tests/test_sd_model.py index 9b80886..50135a0 100644 --- a/lama_cleaner/tests/test_sd_model.py +++ b/lama_cleaner/tests/test_sd_model.py @@ -95,17 +95,20 @@ def test_runway_sd_1_5(sd_device, strategy, sampler, cpu_textencoder, disable_ns ) -@pytest.mark.parametrize("sd_device", ["cuda"]) +@pytest.mark.parametrize("sd_device", ["mps"]) @pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) @pytest.mark.parametrize("sampler", [SDSampler.ddim]) -def test_runway_sd_1_5_negative_prompt(sd_device, strategy, sampler): +@pytest.mark.parametrize("sd_prevent_unmasked_area", [False, True]) +def test_runway_sd_1_5_negative_prompt( + sd_device, strategy, sampler, sd_prevent_unmasked_area +): def callback(i, t, latents): pass if sd_device == "cuda" and not torch.cuda.is_available(): return - sd_steps = 50 if sd_device == "cuda" else 1 + sd_steps = 50 if sd_device == "cuda" else 20 model = ModelManager( name="sd1.5", device=torch.device(sd_device), @@ -122,6 +125,7 @@ def test_runway_sd_1_5_negative_prompt(sd_device, strategy, sampler): negative_prompt="orange, yellow, small", sd_sampler=sampler, sd_match_histograms=True, + sd_prevent_unmasked_area=sd_prevent_unmasked_area, ) name = f"{sampler}_negative_prompt" @@ -129,7 +133,7 @@ def test_runway_sd_1_5_negative_prompt(sd_device, strategy, sampler): assert_equal( model, cfg, - f"runway_sd_{strategy.capitalize()}_{name}.png", + f"runway_sd_{strategy.capitalize()}_{name}_prevent_unmasked_area_{sd_prevent_unmasked_area}.png", img_p=current_dir / "overture-creations-5sI6fQgYIuo.png", mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png", fx=1, From 1571018cfd5ad6cd2a2d9821618660bdd6610048 Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 15 Nov 2023 16:52:44 +0800 Subject: [PATCH 014/134] update --- lama_cleaner/model/kandinsky.py | 1 + .../pipeline/pipeline_stable_diffusion_controlnet_inpaint.py | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lama_cleaner/model/kandinsky.py b/lama_cleaner/model/kandinsky.py index 769e805..7a89d9a 100644 --- a/lama_cleaner/model/kandinsky.py +++ b/lama_cleaner/model/kandinsky.py @@ -60,6 +60,7 @@ class Kandinsky(DiffusionInpaintModel): output_type="np", callback=self.callback, generator=generator, + callback_steps=1, ).images[0] output = (output * 255).round().astype("uint8") diff --git a/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py b/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py index b1d3b87..3dfd840 100644 --- a/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py +++ b/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py @@ -17,10 +17,8 @@ from typing import Union, List, Optional, Callable, Dict, Any import torch import PIL.Image -import numpy as np -from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput -from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_controlnet import * +from diffusers.pipelines.controlnet.pipeline_controlnet import * from diffusers.utils import replace_example_docstring EXAMPLE_DOC_STRING = """ From b8a030f83a4b5cf1f070ddd457209b29db7fedb3 Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 15 Nov 2023 17:18:32 +0800 Subject: [PATCH 015/134] fix outpainting image padding --- lama_cleaner/model/g_diffuser_bot.py | 59 +++++++++++----------------- 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/lama_cleaner/model/g_diffuser_bot.py b/lama_cleaner/model/g_diffuser_bot.py index bf7ce2a..a4147af 100644 --- a/lama_cleaner/model/g_diffuser_bot.py +++ b/lama_cleaner/model/g_diffuser_bot.py @@ -85,59 +85,44 @@ def image_blur(data, std=3.14, mode="linear"): return np.real(convolve(data, kernel / np.sqrt(np.sum(kernel * kernel)))) -def soften_mask(np_rgba_image, softness, space): +def soften_mask(mask_img, softness, space): if softness == 0: - return np_rgba_image + return mask_img softness = min(softness, 1.0) space = np.clip(space, 0.0, 1.0) - original_max_opacity = np.max(np_rgba_image[:, :, 3]) - out_mask = np_rgba_image[:, :, 3] <= 0.0 - blurred_mask = image_blur(np_rgba_image[:, :, 3], 3.5 / softness, mode="linear") + original_max_opacity = np.max(mask_img) + out_mask = mask_img <= 0.0 + blurred_mask = image_blur(mask_img, 3.5 / softness, mode="linear") blurred_mask = np.maximum(blurred_mask - np.max(blurred_mask[out_mask]), 0.0) - np_rgba_image[ - :, :, 3 - ] *= blurred_mask # preserve partial opacity in original input mask - np_rgba_image[:, :, 3] /= np.max(np_rgba_image[:, :, 3]) # renormalize - np_rgba_image[:, :, 3] = np.clip( - np_rgba_image[:, :, 3] - space, 0.0, 1.0 - ) # make space - np_rgba_image[:, :, 3] /= np.max(np_rgba_image[:, :, 3]) # and renormalize again - np_rgba_image[:, :, 3] *= original_max_opacity # restore original max opacity - return np_rgba_image + mask_img *= blurred_mask # preserve partial opacity in original input mask + mask_img /= np.max(mask_img) # renormalize + mask_img = np.clip(mask_img - space, 0.0, 1.0) # make space + mask_img /= np.max(mask_img) # and renormalize again + mask_img *= original_max_opacity # restore original max opacity + return mask_img def expand_image( cv2_img, top: int, right: int, bottom: int, left: int, softness: float, space: float ): + assert cv2_img.shape[2] == 3 origin_h, origin_w = cv2_img.shape[:2] new_width = cv2_img.shape[1] + left + right new_height = cv2_img.shape[0] + top + bottom - new_img = np.zeros((new_height, new_width, 4), np.uint8) # expanded image is rgba - print( - "Expanding input image from {0}x{1} to {2}x{3}".format( - cv2_img.shape[1], cv2_img.shape[0], new_width, new_height - ) + # TODO: which is better? + # new_img = np.random.randint(0, 255, (new_height, new_width, 3), np.uint8) + new_img = cv2.copyMakeBorder( + cv2_img, top, bottom, left, right, cv2.BORDER_REPLICATE ) - if cv2_img.shape[2] == 3: # rgb input image - new_img[ - top : top + cv2_img.shape[0], left : left + cv2_img.shape[1], 0:3 - ] = cv2_img - new_img[ - top : top + cv2_img.shape[0], left : left + cv2_img.shape[1], 3 - ] = 255 # fully opaque - elif cv2_img.shape[2] == 4: # rgba input image - new_img[top : top + cv2_img.shape[0], left : left + cv2_img.shape[1]] = cv2_img - else: - raise Exception( - "Unsupported image format: {0} channels".format(cv2_img.shape[2]) - ) + mask_img = np.zeros((new_height, new_width), np.uint8) + mask_img[top : top + cv2_img.shape[0], left : left + cv2_img.shape[1]] = 255 if softness > 0.0: - new_img = soften_mask(new_img / 255.0, softness / 100.0, space / 100.0) - new_img = (np.clip(new_img, 0.0, 1.0) * 255.0).astype(np.uint8) + mask_img = soften_mask(mask_img / 255.0, softness / 100.0, space / 100.0) + mask_img = (np.clip(mask_img, 0.0, 1.0) * 255.0).astype(np.uint8) - mask_image = 255.0 - new_img[:, :, 3] # extract mask from alpha channel and invert + mask_image = 255.0 - mask_img # extract mask from alpha channel and invert rgb_init_image = ( 0.0 + new_img[:, :, 0:3] ) # strip mask from init_img leaving only rgb channels @@ -153,7 +138,7 @@ def expand_image( hard_mask[:, origin_w // 2 :] = 255 hard_mask = cv2.copyMakeBorder( - hard_mask, top, bottom, left, right, cv2.BORDER_CONSTANT, value=255 + hard_mask, top, bottom, left, right, cv2.BORDER_DEFAULT, value=255 ) mask_image = np.where(hard_mask > 0, mask_image, 0) return rgb_init_image.astype(np.uint8), mask_image.astype(np.uint8) From 8f942e27c45600142d344e99094783057d7e1ca1 Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 15 Nov 2023 17:20:44 +0800 Subject: [PATCH 016/134] add test --- lama_cleaner/tests/test_sd_model.py | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lama_cleaner/tests/test_sd_model.py b/lama_cleaner/tests/test_sd_model.py index 50135a0..3acba71 100644 --- a/lama_cleaner/tests/test_sd_model.py +++ b/lama_cleaner/tests/test_sd_model.py @@ -177,6 +177,36 @@ def test_runway_sd_1_5_sd_scale( ) +@pytest.mark.parametrize("sd_device", ["mps"]) +@pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) +@pytest.mark.parametrize("sampler", [SDSampler.k_euler_a]) +def test_runway_sd_sd_strength(sd_device, strategy, sampler): + if sd_device == "cuda" and not torch.cuda.is_available(): + return + + sd_steps = 50 if sd_device == "cuda" else 20 + model = ModelManager( + name="sd1.5", + device=torch.device(sd_device), + hf_access_token="", + sd_run_local=True, + disable_nsfw=True, + sd_cpu_textencoder=False, + ) + cfg = get_config( + strategy, prompt="a fox sitting on a bench", sd_steps=sd_steps, sd_strength=0.8 + ) + cfg.sd_sampler = sampler + + assert_equal( + model, + cfg, + f"runway_sd_strength_0.8.png", + img_p=current_dir / "overture-creations-5sI6fQgYIuo.png", + mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png", + ) + + @pytest.mark.parametrize("sd_device", ["cuda"]) @pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) @pytest.mark.parametrize("sampler", [SDSampler.k_euler_a]) From 0cfec489b756ca76f65e71ff6c27b9e19427050b Mon Sep 17 00:00:00 2001 From: Qing Date: Thu, 16 Nov 2023 11:08:34 +0800 Subject: [PATCH 017/134] update --- lama_cleaner/const.py | 12 +++++-- lama_cleaner/model/controlnet.py | 3 +- ...ine_stable_diffusion_controlnet_inpaint.py | 35 ++++++++++++++----- lama_cleaner/model/sd.py | 7 ++-- lama_cleaner/server.py | 10 +++++- lama_cleaner/tests/test_instruct_pix2pix.py | 6 ++-- lama_cleaner/tests/test_sd_model.py | 18 +++++----- 7 files changed, 63 insertions(+), 28 deletions(-) diff --git a/lama_cleaner/const.py b/lama_cleaner/const.py index 30937e6..d6125b7 100644 --- a/lama_cleaner/const.py +++ b/lama_cleaner/const.py @@ -33,10 +33,10 @@ AVAILABLE_MODELS = [ "paint_by_example", "instruct_pix2pix", "kandinsky2.2", - "sdxl" + "sdxl", ] SD15_MODELS = ["sd1.5", "anything4", "realisticVision1.4"] -MODELS_SUPPORT_FREEU = SD15_MODELS + ['sd2', "sdxl"] +MODELS_SUPPORT_FREEU = SD15_MODELS + ["sd2", "sdxl"] MODELS_SUPPORT_LCM_LORA = SD15_MODELS + ["sdxl"] AVAILABLE_DEVICES = ["cuda", "cpu", "mps"] @@ -110,6 +110,14 @@ QUALITY_HELP = """ Quality of image encoding, 0-100. Default is 95, higher quality will generate larger file size. """ +FREEU_DEFAULT_CONFIGS = { + "sd2": dict(s1=0.9, s2=0.2, b1=1.1, b2=1.2), + "sdxl": dict(s1=0.6, s2=0.4, b1=1.1, b2=1.2), + "sd1.5": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), + "anything4": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), + "realisticVision1.4": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), +} + class RealESRGANModelName(str, Enum): realesr_general_x4v3 = "realesr-general-x4v3" diff --git a/lama_cleaner/model/controlnet.py b/lama_cleaner/model/controlnet.py index 9cc3380..9becdcf 100644 --- a/lama_cleaner/model/controlnet.py +++ b/lama_cleaner/model/controlnet.py @@ -12,8 +12,9 @@ from lama_cleaner.model.utils import torch_gc, get_scheduler from lama_cleaner.schema import Config -class CPUTextEncoderWrapper: +class CPUTextEncoderWrapper(torch.nn.Module): def __init__(self, text_encoder, torch_dtype): + super().__init__() self.config = text_encoder.config self.text_encoder = text_encoder.to(torch.device("cpu"), non_blocking=True) self.text_encoder = self.text_encoder.to(torch.float32, non_blocking=True) diff --git a/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py b/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py index 3dfd840..01d73d0 100644 --- a/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py +++ b/lama_cleaner/model/pipeline/pipeline_stable_diffusion_controlnet_inpaint.py @@ -285,6 +285,28 @@ class StableDiffusionControlNetInpaintPipeline(StableDiffusionControlNetPipeline masked_image_latents = masked_image_latents.to(device=device, dtype=dtype) return mask, masked_image_latents + def _default_height_width(self, height, width, image): + if isinstance(image, list): + image = image[0] + + if height is None: + if isinstance(image, PIL.Image.Image): + height = image.height + elif isinstance(image, torch.Tensor): + height = image.shape[3] + + height = (height // 8) * 8 # round down to nearest multiple of 8 + + if width is None: + if isinstance(image, PIL.Image.Image): + width = image.width + elif isinstance(image, torch.Tensor): + width = image.shape[2] + + width = (width // 8) * 8 # round down to nearest multiple of 8 + + return height, width + @torch.no_grad() @replace_example_docstring(EXAMPLE_DOC_STRING) def __call__( @@ -402,14 +424,11 @@ class StableDiffusionControlNetInpaintPipeline(StableDiffusionControlNetPipeline # 1. Check inputs. Raise error if not correct self.check_inputs( - prompt, - control_image, - height, - width, - callback_steps, - negative_prompt, - prompt_embeds, - negative_prompt_embeds, + prompt=prompt, + image=control_image, + callback_steps=callback_steps, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, ) # 2. Define call parameters diff --git a/lama_cleaner/model/sd.py b/lama_cleaner/model/sd.py index f19b96c..69153c6 100644 --- a/lama_cleaner/model/sd.py +++ b/lama_cleaner/model/sd.py @@ -7,12 +7,13 @@ import torch from loguru import logger from lama_cleaner.model.base import DiffusionInpaintModel -from lama_cleaner.model.utils import torch_gc, get_scheduler -from lama_cleaner.schema import Config, SDSampler +from lama_cleaner.model.utils import torch_gc +from lama_cleaner.schema import Config -class CPUTextEncoderWrapper: +class CPUTextEncoderWrapper(torch.nn.Module): def __init__(self, text_encoder, torch_dtype): + super().__init__() self.config = text_encoder.config self.text_encoder = text_encoder.to(torch.device("cpu"), non_blocking=True) self.text_encoder = self.text_encoder.to(torch.float32, non_blocking=True) diff --git a/lama_cleaner/server.py b/lama_cleaner/server.py index 755dc62..cb762bf 100644 --- a/lama_cleaner/server.py +++ b/lama_cleaner/server.py @@ -18,7 +18,12 @@ import torch from PIL import Image from loguru import logger -from lama_cleaner.const import SD15_MODELS +from lama_cleaner.const import ( + SD15_MODELS, + FREEU_DEFAULT_CONFIGS, + MODELS_SUPPORT_FREEU, + MODELS_SUPPORT_LCM_LORA, +) from lama_cleaner.file_manager import FileManager from lama_cleaner.model.utils import torch_gc from lama_cleaner.model_manager import ModelManager @@ -421,6 +426,9 @@ def get_server_config(): "isEnableAutoSaving": is_enable_auto_saving, "enableFileManager": is_enable_file_manager, "plugins": list(plugins.keys()), + "freeSupportedModels": MODELS_SUPPORT_FREEU, + "freeuDefaultConfigs": FREEU_DEFAULT_CONFIGS, + "lcmLoraSupportedModels": MODELS_SUPPORT_LCM_LORA, }, 200 diff --git a/lama_cleaner/tests/test_instruct_pix2pix.py b/lama_cleaner/tests/test_instruct_pix2pix.py index 9778160..8813644 100644 --- a/lama_cleaner/tests/test_instruct_pix2pix.py +++ b/lama_cleaner/tests/test_instruct_pix2pix.py @@ -10,13 +10,13 @@ from lama_cleaner.schema import HDStrategy current_dir = Path(__file__).parent.absolute().resolve() save_dir = current_dir / 'result' save_dir.mkdir(exist_ok=True, parents=True) -device = 'cuda' if torch.cuda.is_available() else 'cpu' +device = 'cuda' if torch.cuda.is_available() else 'mps' @pytest.mark.parametrize("disable_nsfw", [True, False]) @pytest.mark.parametrize("cpu_offload", [False, True]) def test_instruct_pix2pix(disable_nsfw, cpu_offload): - sd_steps = 50 if device == 'cuda' else 1 + sd_steps = 50 if device == 'cuda' else 20 model = ModelManager(name="instruct_pix2pix", device=torch.device(device), hf_access_token="", @@ -41,7 +41,7 @@ def test_instruct_pix2pix(disable_nsfw, cpu_offload): @pytest.mark.parametrize("disable_nsfw", [False]) @pytest.mark.parametrize("cpu_offload", [False]) def test_instruct_pix2pix_snow(disable_nsfw, cpu_offload): - sd_steps = 50 if device == 'cuda' else 1 + sd_steps = 50 if device == 'cuda' else 20 model = ModelManager(name="instruct_pix2pix", device=torch.device(device), hf_access_token="", diff --git a/lama_cleaner/tests/test_sd_model.py b/lama_cleaner/tests/test_sd_model.py index 3acba71..c445459 100644 --- a/lama_cleaner/tests/test_sd_model.py +++ b/lama_cleaner/tests/test_sd_model.py @@ -13,11 +13,9 @@ from lama_cleaner.tests.test_model import get_config, assert_equal current_dir = Path(__file__).parent.absolute().resolve() save_dir = current_dir / "result" save_dir.mkdir(exist_ok=True, parents=True) -device = "cuda" if torch.cuda.is_available() else "cpu" -device = torch.device(device) -@pytest.mark.parametrize("sd_device", ["cuda"]) +@pytest.mark.parametrize("sd_device", ["cuda", "mps"]) @pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) @pytest.mark.parametrize("sampler", [SDSampler.ddim]) @pytest.mark.parametrize("cpu_textencoder", [True, False]) @@ -56,7 +54,7 @@ def test_runway_sd_1_5_ddim( ) -@pytest.mark.parametrize("sd_device", ["cuda"]) +@pytest.mark.parametrize("sd_device", ["cuda", "mps"]) @pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) @pytest.mark.parametrize( "sampler", [SDSampler.pndm, SDSampler.k_lms, SDSampler.k_euler, SDSampler.k_euler_a] @@ -95,7 +93,7 @@ def test_runway_sd_1_5(sd_device, strategy, sampler, cpu_textencoder, disable_ns ) -@pytest.mark.parametrize("sd_device", ["mps"]) +@pytest.mark.parametrize("sd_device", ["cuda", "mps"]) @pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) @pytest.mark.parametrize("sampler", [SDSampler.ddim]) @pytest.mark.parametrize("sd_prevent_unmasked_area", [False, True]) @@ -140,7 +138,7 @@ def test_runway_sd_1_5_negative_prompt( ) -@pytest.mark.parametrize("sd_device", ["cuda"]) +@pytest.mark.parametrize("sd_device", ["cuda", "mps"]) @pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) @pytest.mark.parametrize("sampler", [SDSampler.k_euler_a]) @pytest.mark.parametrize("cpu_textencoder", [False]) @@ -151,7 +149,7 @@ def test_runway_sd_1_5_sd_scale( if sd_device == "cuda" and not torch.cuda.is_available(): return - sd_steps = 50 if sd_device == "cuda" else 1 + sd_steps = 50 if sd_device == "cuda" else 20 model = ModelManager( name="sd1.5", device=torch.device(sd_device), @@ -177,7 +175,7 @@ def test_runway_sd_1_5_sd_scale( ) -@pytest.mark.parametrize("sd_device", ["mps"]) +@pytest.mark.parametrize("sd_device", ["cuda", "mps"]) @pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) @pytest.mark.parametrize("sampler", [SDSampler.k_euler_a]) def test_runway_sd_sd_strength(sd_device, strategy, sampler): @@ -214,7 +212,7 @@ def test_runway_sd_1_5_cpu_offload(sd_device, strategy, sampler): if sd_device == "cuda" and not torch.cuda.is_available(): return - sd_steps = 50 if sd_device == "cuda" else 1 + sd_steps = 50 if sd_device == "cuda" else 20 model = ModelManager( name="sd1.5", device=torch.device(sd_device), @@ -246,7 +244,7 @@ def test_local_file_path(sd_device, sampler): if sd_device == "cuda" and not torch.cuda.is_available(): return - sd_steps = 1 if sd_device == "cpu" else 50 + sd_steps = 1 if sd_device == "cpu" else 30 model = ModelManager( name="sd1.5", device=torch.device(sd_device), From bfd33ef37f29c201d40255f22a2f4dc5c4375aa4 Mon Sep 17 00:00:00 2001 From: Qing Date: Thu, 16 Nov 2023 12:45:05 +0800 Subject: [PATCH 018/134] instruct_pix2pix support freeu --- lama_cleaner/const.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/lama_cleaner/const.py b/lama_cleaner/const.py index d6125b7..1b749a8 100644 --- a/lama_cleaner/const.py +++ b/lama_cleaner/const.py @@ -36,9 +36,19 @@ AVAILABLE_MODELS = [ "sdxl", ] SD15_MODELS = ["sd1.5", "anything4", "realisticVision1.4"] -MODELS_SUPPORT_FREEU = SD15_MODELS + ["sd2", "sdxl"] +MODELS_SUPPORT_FREEU = SD15_MODELS + ["sd2", "sdxl", "instruct_pix2pix"] MODELS_SUPPORT_LCM_LORA = SD15_MODELS + ["sdxl"] +FREEU_DEFAULT_CONFIGS = { + "sd2": dict(s1=0.9, s2=0.2, b1=1.1, b2=1.2), + "sdxl": dict(s1=0.6, s2=0.4, b1=1.1, b2=1.2), + "sd1.5": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), + "anything4": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), + "realisticVision1.4": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), + "instruct_pix2pix": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), +} + + AVAILABLE_DEVICES = ["cuda", "cpu", "mps"] DEFAULT_DEVICE = "cuda" @@ -110,14 +120,6 @@ QUALITY_HELP = """ Quality of image encoding, 0-100. Default is 95, higher quality will generate larger file size. """ -FREEU_DEFAULT_CONFIGS = { - "sd2": dict(s1=0.9, s2=0.2, b1=1.1, b2=1.2), - "sdxl": dict(s1=0.6, s2=0.4, b1=1.1, b2=1.2), - "sd1.5": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), - "anything4": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), - "realisticVision1.4": dict(s1=0.9, s2=0.2, b1=1.2, b2=1.4), -} - class RealESRGANModelName(str, Enum): realesr_general_x4v3 = "realesr-general-x4v3" From 20e660aa4a74507988111a33ed86f912357193ec Mon Sep 17 00:00:00 2001 From: Qing Date: Thu, 16 Nov 2023 14:09:08 +0800 Subject: [PATCH 019/134] use from_single_file --- lama_cleaner/model/sd.py | 36 ++--------------------------- lama_cleaner/tests/test_sd_model.py | 13 ++++++++--- 2 files changed, 12 insertions(+), 37 deletions(-) diff --git a/lama_cleaner/model/sd.py b/lama_cleaner/model/sd.py index 69153c6..f466625 100644 --- a/lama_cleaner/model/sd.py +++ b/lama_cleaner/model/sd.py @@ -34,37 +34,6 @@ class CPUTextEncoderWrapper(torch.nn.Module): return self.torch_dtype -def load_from_local_model(local_model_path, torch_dtype, disable_nsfw=True): - from diffusers.pipelines.stable_diffusion.convert_from_ckpt import ( - download_from_original_stable_diffusion_ckpt, - ) - from diffusers.pipelines.stable_diffusion import StableDiffusionInpaintPipeline - - logger.info(f"Converting {local_model_path} to diffusers pipeline") - - pipe = download_from_original_stable_diffusion_ckpt( - local_model_path, - num_in_channels=9, - from_safetensors=local_model_path.endswith("safetensors"), - device="cpu", - ) - - inpaint_pipe = StableDiffusionInpaintPipeline( - vae=pipe.vae, - text_encoder=pipe.text_encoder, - tokenizer=pipe.tokenizer, - unet=pipe.unet, - scheduler=pipe.scheduler, - safety_checker=None if disable_nsfw else pipe.safety_checker, - feature_extractor=None if disable_nsfw else pipe.safety_checker, - requires_safety_checker=not disable_nsfw, - ) - - del pipe - gc.collect() - return inpaint_pipe.to(torch_dtype=torch_dtype) - - class SD(DiffusionInpaintModel): pad_mod = 8 min_size = 512 @@ -92,9 +61,8 @@ class SD(DiffusionInpaintModel): torch_dtype = torch.float16 if use_gpu and fp16 else torch.float32 if kwargs.get("sd_local_model_path", None): - self.model = load_from_local_model( - kwargs["sd_local_model_path"], - torch_dtype=torch_dtype, + self.model = StableDiffusionInpaintPipeline.from_single_file( + kwargs["sd_local_model_path"], torch_dtype=torch_dtype, **model_kwargs ) else: self.model = StableDiffusionInpaintPipeline.from_pretrained( diff --git a/lama_cleaner/tests/test_sd_model.py b/lama_cleaner/tests/test_sd_model.py index c445459..971b7d5 100644 --- a/lama_cleaner/tests/test_sd_model.py +++ b/lama_cleaner/tests/test_sd_model.py @@ -240,7 +240,14 @@ def test_runway_sd_1_5_cpu_offload(sd_device, strategy, sampler): @pytest.mark.parametrize("sd_device", ["cuda", "mps"]) @pytest.mark.parametrize("sampler", [SDSampler.uni_pc]) -def test_local_file_path(sd_device, sampler): +@pytest.mark.parametrize( + "local_model_path", + [ + "/Users/cwq/data/models/sd-v1-5-inpainting.ckpt", + "/Users/cwq/data/models/sd-v1-5-inpainting.safetensors", + ], +) +def test_local_file_path(sd_device, sampler, local_model_path): if sd_device == "cuda" and not torch.cuda.is_available(): return @@ -253,7 +260,7 @@ def test_local_file_path(sd_device, sampler): disable_nsfw=True, sd_cpu_textencoder=False, cpu_offload=True, - sd_local_model_path="/Users/cwq/data/models/sd-v1-5-inpainting.ckpt", + sd_local_model_path=local_model_path, ) cfg = get_config( HDStrategy.ORIGINAL, @@ -262,7 +269,7 @@ def test_local_file_path(sd_device, sampler): ) cfg.sd_sampler = sampler - name = f"device_{sd_device}_{sampler}" + name = f"device_{sd_device}_{sampler}_{Path(local_model_path).stem}" assert_equal( model, From 1d145d1cd64acb76dc461d6568d1f234846e3fbd Mon Sep 17 00:00:00 2001 From: Qing Date: Thu, 16 Nov 2023 21:12:06 +0800 Subject: [PATCH 020/134] add download command --- lama_cleaner/__init__.py | 2 + lama_cleaner/diffusers_utils.py | 28 ++++++++++++++ lama_cleaner/download.py | 24 ++++++++++++ lama_cleaner/model/base.py | 4 ++ lama_cleaner/model/fcf.py | 7 +++- lama_cleaner/model/instruct_pix2pix.py | 36 ++++++++++------- lama_cleaner/model/kandinsky.py | 8 ++++ lama_cleaner/model/lama.py | 5 +++ lama_cleaner/model/ldm.py | 6 +++ lama_cleaner/model/manga.py | 7 +++- lama_cleaner/model/mat.py | 53 +++++++++++++++----------- lama_cleaner/model/paint_by_example.py | 39 ++++++++++--------- lama_cleaner/model/sd.py | 6 +++ lama_cleaner/model/sdxl.py | 10 ++++- lama_cleaner/model/zits.py | 42 ++++++++++++++++---- lama_cleaner/parse_args.py | 21 +++++++++- lama_cleaner/web_config.py | 2 +- 17 files changed, 233 insertions(+), 67 deletions(-) create mode 100644 lama_cleaner/diffusers_utils.py create mode 100644 lama_cleaner/download.py diff --git a/lama_cleaner/__init__.py b/lama_cleaner/__init__.py index a1ce1a1..db72076 100644 --- a/lama_cleaner/__init__.py +++ b/lama_cleaner/__init__.py @@ -11,6 +11,8 @@ from lama_cleaner.parse_args import parse_args def entry_point(): args = parse_args() + if args is None: + return # To make os.environ["XDG_CACHE_HOME"] = args.model_cache_dir works for diffusers # https://github.com/huggingface/diffusers/blob/be99201a567c1ccd841dc16fb24e88f7f239c187/src/diffusers/utils/constants.py#L18 from lama_cleaner.server import main diff --git a/lama_cleaner/diffusers_utils.py b/lama_cleaner/diffusers_utils.py new file mode 100644 index 0000000..d53fa7f --- /dev/null +++ b/lama_cleaner/diffusers_utils.py @@ -0,0 +1,28 @@ +import json +from pathlib import Path +from typing import Dict, List + + +def folder_name_to_show_name(name: str) -> str: + return name.replace("models--", "").replace("--", "/") + + +def _scan_models(cache_dir, class_name: str) -> List[str]: + cache_dir = Path(cache_dir) + res = [] + for it in cache_dir.glob("**/*/model_index.json"): + with open(it, "r", encoding="utf-8") as f: + data = json.load(f) + if data["_class_name"] == class_name: + name = folder_name_to_show_name(it.parent.parent.parent.name) + if name not in res: + res.append(name) + return res + + +def scan_models(cache_dir) -> List[str]: + return _scan_models(cache_dir, "StableDiffusionPipeline") + + +def scan_inpainting_models(cache_dir) -> List[str]: + return _scan_models(cache_dir, "StableDiffusionInpaintPipeline") diff --git a/lama_cleaner/download.py b/lama_cleaner/download.py new file mode 100644 index 0000000..f0f7cb2 --- /dev/null +++ b/lama_cleaner/download.py @@ -0,0 +1,24 @@ +import os + +from loguru import logger +from pathlib import Path + + +def cli_download_model(model: str, model_dir: str): + if os.path.isfile(model_dir): + raise ValueError(f"invalid --model-dir: {model_dir} is a file") + + if not os.path.exists(model_dir): + logger.info(f"Create model cache directory: {model_dir}") + Path(model_dir).mkdir(exist_ok=True, parents=True) + + os.environ["XDG_CACHE_HOME"] = model_dir + + from lama_cleaner.model_manager import models + + if model in models: + logger.info(f"Downloading {model}...") + models[model].download() + logger.info(f"Done.") + else: + logger.info(f"Downloading model from Huggingface: {model}") diff --git a/lama_cleaner/model/base.py b/lama_cleaner/model/base.py index 726a2be..81cdf0c 100644 --- a/lama_cleaner/model/base.py +++ b/lama_cleaner/model/base.py @@ -51,6 +51,10 @@ class InpaintModel: """ ... + @staticmethod + def download(): + ... + def _pad_forward(self, image, mask, config: Config): origin_height, origin_width = image.shape[:2] pad_image = pad_img_to_modulo( diff --git a/lama_cleaner/model/fcf.py b/lama_cleaner/model/fcf.py index 07292c6..a64885a 100644 --- a/lama_cleaner/model/fcf.py +++ b/lama_cleaner/model/fcf.py @@ -14,6 +14,7 @@ from lama_cleaner.helper import ( norm_img, boxes_from_mask, resize_max_size, + download_model, ) from lama_cleaner.model.base import InpaintModel from torch import conv2d, nn @@ -870,7 +871,6 @@ class SpectralTransform(nn.Module): ) def forward(self, x): - x = self.downsample(x) x = self.conv1(x) output = self.fu(x) @@ -1437,7 +1437,6 @@ class SynthesisNetwork(torch.nn.Module): setattr(self, f"b{res}", block) def forward(self, x_global, mask, feats, ws, fname=None, **block_kwargs): - img = None x, img = self.foreword(x_global, ws, feats, img) @@ -1656,6 +1655,10 @@ class FcF(InpaintModel): self.model = load_model(G, FCF_MODEL_URL, device, FCF_MODEL_MD5) self.label = torch.zeros([1, self.model.c_dim], device=device) + @staticmethod + def download(): + download_model(FCF_MODEL_URL, FCF_MODEL_MD5) + @staticmethod def is_downloaded() -> bool: return os.path.exists(get_cache_path_by_url(FCF_MODEL_URL)) diff --git a/lama_cleaner/model/instruct_pix2pix.py b/lama_cleaner/model/instruct_pix2pix.py index 4d176da..27476b7 100644 --- a/lama_cleaner/model/instruct_pix2pix.py +++ b/lama_cleaner/model/instruct_pix2pix.py @@ -4,7 +4,6 @@ import torch from loguru import logger from lama_cleaner.model.base import DiffusionInpaintModel -from lama_cleaner.model.utils import set_seed from lama_cleaner.schema import Config @@ -15,18 +14,21 @@ class InstructPix2Pix(DiffusionInpaintModel): def init_model(self, device: torch.device, **kwargs): from diffusers import StableDiffusionInstructPix2PixPipeline - fp16 = not kwargs.get('no_half', False) - model_kwargs = {"local_files_only": kwargs.get('local_files_only', False)} - if kwargs['disable_nsfw'] or kwargs.get('cpu_offload', False): + fp16 = not kwargs.get("no_half", False) + + model_kwargs = {"local_files_only": kwargs.get("local_files_only", False)} + if kwargs["disable_nsfw"] or kwargs.get("cpu_offload", False): logger.info("Disable Stable Diffusion Model NSFW checker") - model_kwargs.update(dict( - safety_checker=None, - feature_extractor=None, - requires_safety_checker=False - )) + model_kwargs.update( + dict( + safety_checker=None, + feature_extractor=None, + requires_safety_checker=False, + ) + ) - use_gpu = device == torch.device('cuda') and torch.cuda.is_available() + use_gpu = device == torch.device("cuda") and torch.cuda.is_available() torch_dtype = torch.float16 if use_gpu and fp16 else torch.float32 self.model = StableDiffusionInstructPix2PixPipeline.from_pretrained( "timbrooks/instruct-pix2pix", @@ -36,15 +38,23 @@ class InstructPix2Pix(DiffusionInpaintModel): ) self.model.enable_attention_slicing() - if kwargs.get('enable_xformers', False): + if kwargs.get("enable_xformers", False): self.model.enable_xformers_memory_efficient_attention() - if kwargs.get('cpu_offload', False) and use_gpu: + if kwargs.get("cpu_offload", False) and use_gpu: logger.info("Enable sequential cpu offload") self.model.enable_sequential_cpu_offload(gpu_id=0) else: self.model = self.model.to(device) + @staticmethod + def download(): + from diffusers import StableDiffusionInstructPix2PixPipeline + + StableDiffusionInstructPix2PixPipeline.from_pretrained( + "timbrooks/instruct-pix2pix", revision="fp16" + ) + def forward(self, image, mask, config: Config): """Input image and output image have same size image: [H, W, C] RGB @@ -60,7 +70,7 @@ class InstructPix2Pix(DiffusionInpaintModel): image_guidance_scale=config.p2p_image_guidance_scale, guidance_scale=config.p2p_guidance_scale, output_type="np", - generator=torch.manual_seed(config.sd_seed) + generator=torch.manual_seed(config.sd_seed), ).images[0] output = (output * 255).round().astype("uint8") diff --git a/lama_cleaner/model/kandinsky.py b/lama_cleaner/model/kandinsky.py index 7a89d9a..12d8209 100644 --- a/lama_cleaner/model/kandinsky.py +++ b/lama_cleaner/model/kandinsky.py @@ -76,3 +76,11 @@ class Kandinsky(DiffusionInpaintModel): class Kandinsky22(Kandinsky): name = "kandinsky2.2" model_name = "kandinsky-community/kandinsky-2-2-decoder-inpaint" + + @staticmethod + def download(): + from diffusers import AutoPipelineForInpainting + + AutoPipelineForInpainting.from_pretrained( + "kandinsky-community/kandinsky-2-2-decoder-inpaint" + ) diff --git a/lama_cleaner/model/lama.py b/lama_cleaner/model/lama.py index bdcdf0d..ebbb6c9 100644 --- a/lama_cleaner/model/lama.py +++ b/lama_cleaner/model/lama.py @@ -8,6 +8,7 @@ from lama_cleaner.helper import ( norm_img, get_cache_path_by_url, load_jit_model, + download_model, ) from lama_cleaner.model.base import InpaintModel from lama_cleaner.schema import Config @@ -23,6 +24,10 @@ class LaMa(InpaintModel): name = "lama" pad_mod = 8 + @staticmethod + def download(): + download_model(LAMA_MODEL_URL, LAMA_MODEL_MD5) + def init_model(self, device, **kwargs): self.model = load_jit_model(LAMA_MODEL_URL, device, LAMA_MODEL_MD5).eval() diff --git a/lama_cleaner/model/ldm.py b/lama_cleaner/model/ldm.py index a5b6d12..29956ad 100644 --- a/lama_cleaner/model/ldm.py +++ b/lama_cleaner/model/ldm.py @@ -260,6 +260,12 @@ class LDM(InpaintModel): self.model = LatentDiffusion(self.diffusion_model, device) + @staticmethod + def download(): + download_model(LDM_DIFFUSION_MODEL_URL, LDM_DIFFUSION_MODEL_MD5) + download_model(LDM_DECODE_MODEL_URL, LDM_DECODE_MODEL_MD5) + download_model(LDM_ENCODE_MODEL_URL, LDM_ENCODE_MODEL_MD5) + @staticmethod def is_downloaded() -> bool: model_paths = [ diff --git a/lama_cleaner/model/manga.py b/lama_cleaner/model/manga.py index f6e27e5..d61f408 100644 --- a/lama_cleaner/model/manga.py +++ b/lama_cleaner/model/manga.py @@ -7,7 +7,7 @@ import torch import time from loguru import logger -from lama_cleaner.helper import get_cache_path_by_url, load_jit_model +from lama_cleaner.helper import get_cache_path_by_url, load_jit_model, download_model from lama_cleaner.model.base import InpaintModel from lama_cleaner.schema import Config @@ -42,6 +42,11 @@ class Manga(InpaintModel): ) self.seed = 42 + @staticmethod + def download(): + download_model(MANGA_INPAINTOR_MODEL_URL, MANGA_INPAINTOR_MODEL_MD5) + download_model(MANGA_LINE_MODEL_URL, MANGA_LINE_MODEL_MD5) + @staticmethod def is_downloaded() -> bool: model_paths = [ diff --git a/lama_cleaner/model/mat.py b/lama_cleaner/model/mat.py index 3e09bf4..2fbe11c 100644 --- a/lama_cleaner/model/mat.py +++ b/lama_cleaner/model/mat.py @@ -8,7 +8,12 @@ import torch.nn as nn import torch.nn.functional as F import torch.utils.checkpoint as checkpoint -from lama_cleaner.helper import load_model, get_cache_path_by_url, norm_img +from lama_cleaner.helper import ( + load_model, + get_cache_path_by_url, + norm_img, + download_model, +) from lama_cleaner.model.base import InpaintModel from lama_cleaner.model.utils import ( setup_filter, @@ -52,7 +57,7 @@ class ModulatedConv2d(nn.Module): ) self.out_channels = out_channels self.kernel_size = kernel_size - self.weight_gain = 1 / np.sqrt(in_channels * (kernel_size ** 2)) + self.weight_gain = 1 / np.sqrt(in_channels * (kernel_size**2)) self.padding = self.kernel_size // 2 self.up = up self.down = down @@ -213,7 +218,7 @@ class DecBlockFirst(nn.Module): super().__init__() self.fc = FullyConnectedLayer( in_features=in_channels * 2, - out_features=in_channels * 4 ** 2, + out_features=in_channels * 4**2, activation=activation, ) self.conv = StyleConv( @@ -312,7 +317,7 @@ class DecBlock(nn.Module): in_channels=in_channels, out_channels=out_channels, style_dim=style_dim, - resolution=2 ** res, + resolution=2**res, kernel_size=3, up=2, use_noise=use_noise, @@ -323,7 +328,7 @@ class DecBlock(nn.Module): in_channels=out_channels, out_channels=out_channels, style_dim=style_dim, - resolution=2 ** res, + resolution=2**res, kernel_size=3, use_noise=use_noise, activation=activation, @@ -507,7 +512,7 @@ class Discriminator(torch.nn.Module): self.img_channels = img_channels resolution_log2 = int(np.log2(img_resolution)) - assert img_resolution == 2 ** resolution_log2 and img_resolution >= 4 + assert img_resolution == 2**resolution_log2 and img_resolution >= 4 self.resolution_log2 = resolution_log2 def nf(stage): @@ -543,7 +548,7 @@ class Discriminator(torch.nn.Module): ) self.Dis = nn.Sequential(*Dis) - self.fc0 = FullyConnectedLayer(nf(2) * 4 ** 2, nf(2), activation=activation) + self.fc0 = FullyConnectedLayer(nf(2) * 4**2, nf(2), activation=activation) self.fc1 = FullyConnectedLayer(nf(2), 1 if cmap_dim == 0 else cmap_dim) def forward(self, images_in, masks_in, c): @@ -562,7 +567,7 @@ class Discriminator(torch.nn.Module): def nf(stage, channel_base=32768, channel_decay=1.0, channel_max=512): NF = {512: 64, 256: 128, 128: 256, 64: 512, 32: 512, 16: 512, 8: 512, 4: 512} - return NF[2 ** stage] + return NF[2**stage] class Mlp(nn.Module): @@ -659,7 +664,7 @@ class Conv2dLayerPartial(nn.Module): ) self.weight_maskUpdater = torch.ones(1, 1, kernel_size, kernel_size) - self.slide_winsize = kernel_size ** 2 + self.slide_winsize = kernel_size**2 self.stride = down self.padding = kernel_size // 2 if kernel_size % 2 == 1 else 0 @@ -715,7 +720,7 @@ class WindowAttention(nn.Module): self.window_size = window_size # Wh, Ww self.num_heads = num_heads head_dim = dim // num_heads - self.scale = qk_scale or head_dim ** -0.5 + self.scale = qk_scale or head_dim**-0.5 self.q = FullyConnectedLayer(in_features=dim, out_features=dim) self.k = FullyConnectedLayer(in_features=dim, out_features=dim) @@ -1211,7 +1216,7 @@ class Encoder(nn.Module): self.resolution = [] for idx, i in enumerate(range(res_log2, 3, -1)): # from input size to 16x16 - res = 2 ** i + res = 2**i self.resolution.append(res) if i == res_log2: block = EncFromRGB(img_channels * 2 + 1, nf(i), activation) @@ -1296,7 +1301,7 @@ class DecBlockFirstV2(nn.Module): in_channels=in_channels, out_channels=out_channels, style_dim=style_dim, - resolution=2 ** res, + resolution=2**res, kernel_size=3, use_noise=use_noise, activation=activation, @@ -1341,7 +1346,7 @@ class DecBlock(nn.Module): in_channels=in_channels, out_channels=out_channels, style_dim=style_dim, - resolution=2 ** res, + resolution=2**res, kernel_size=3, up=2, use_noise=use_noise, @@ -1352,7 +1357,7 @@ class DecBlock(nn.Module): in_channels=out_channels, out_channels=out_channels, style_dim=style_dim, - resolution=2 ** res, + resolution=2**res, kernel_size=3, use_noise=use_noise, activation=activation, @@ -1389,7 +1394,7 @@ class Decoder(nn.Module): for res in range(5, res_log2 + 1): setattr( self, - "Dec_%dx%d" % (2 ** res, 2 ** res), + "Dec_%dx%d" % (2**res, 2**res), DecBlock( res, nf(res - 1), @@ -1406,7 +1411,7 @@ class Decoder(nn.Module): def forward(self, x, ws, gs, E_features, noise_mode="random"): x, img = self.Dec_16x16(x, ws, gs, E_features, noise_mode=noise_mode) for res in range(5, self.res_log2 + 1): - block = getattr(self, "Dec_%dx%d" % (2 ** res, 2 ** res)) + block = getattr(self, "Dec_%dx%d" % (2**res, 2**res)) x, img = block(x, img, ws, gs, E_features, noise_mode=noise_mode) return img @@ -1431,7 +1436,7 @@ class DecStyleBlock(nn.Module): in_channels=in_channels, out_channels=out_channels, style_dim=style_dim, - resolution=2 ** res, + resolution=2**res, kernel_size=3, up=2, use_noise=use_noise, @@ -1442,7 +1447,7 @@ class DecStyleBlock(nn.Module): in_channels=out_channels, out_channels=out_channels, style_dim=style_dim, - resolution=2 ** res, + resolution=2**res, kernel_size=3, use_noise=use_noise, activation=activation, @@ -1640,7 +1645,7 @@ class SynthesisNet(nn.Module): ): super().__init__() resolution_log2 = int(np.log2(img_resolution)) - assert img_resolution == 2 ** resolution_log2 and img_resolution >= 4 + assert img_resolution == 2**resolution_log2 and img_resolution >= 4 self.num_layers = resolution_log2 * 2 - 3 * 2 self.img_resolution = img_resolution @@ -1781,7 +1786,7 @@ class Discriminator(torch.nn.Module): self.img_channels = img_channels resolution_log2 = int(np.log2(img_resolution)) - assert img_resolution == 2 ** resolution_log2 and img_resolution >= 4 + assert img_resolution == 2**resolution_log2 and img_resolution >= 4 self.resolution_log2 = resolution_log2 if cmap_dim == None: @@ -1812,7 +1817,7 @@ class Discriminator(torch.nn.Module): ) self.Dis = nn.Sequential(*Dis) - self.fc0 = FullyConnectedLayer(nf(2) * 4 ** 2, nf(2), activation=activation) + self.fc0 = FullyConnectedLayer(nf(2) * 4**2, nf(2), activation=activation) self.fc1 = FullyConnectedLayer(nf(2), 1 if cmap_dim == 0 else cmap_dim) # for 64x64 @@ -1837,7 +1842,7 @@ class Discriminator(torch.nn.Module): self.Dis_stg1 = nn.Sequential(*Dis_stg1) self.fc0_stg1 = FullyConnectedLayer( - nf(2) // 2 * 4 ** 2, nf(2) // 2, activation=activation + nf(2) // 2 * 4**2, nf(2) // 2, activation=activation ) self.fc1_stg1 = FullyConnectedLayer( nf(2) // 2, 1 if cmap_dim == 0 else cmap_dim @@ -1898,6 +1903,10 @@ class MAT(InpaintModel): self.label = torch.zeros([1, self.model.c_dim], device=device).to(self.torch_dtype) # fmt: on + @staticmethod + def download(): + download_model(MAT_MODEL_URL, MAT_MODEL_MD5) + @staticmethod def is_downloaded() -> bool: return os.path.exists(get_cache_path_by_url(MAT_MODEL_URL)) diff --git a/lama_cleaner/model/paint_by_example.py b/lama_cleaner/model/paint_by_example.py index 4b5ae74..a9606a4 100644 --- a/lama_cleaner/model/paint_by_example.py +++ b/lama_cleaner/model/paint_by_example.py @@ -2,11 +2,9 @@ import PIL import PIL.Image import cv2 import torch -from diffusers import DiffusionPipeline from loguru import logger from lama_cleaner.model.base import DiffusionInpaintModel -from lama_cleaner.model.utils import set_seed from lama_cleaner.schema import Config @@ -16,35 +14,40 @@ class PaintByExample(DiffusionInpaintModel): min_size = 512 def init_model(self, device: torch.device, **kwargs): - fp16 = not kwargs.get('no_half', False) - use_gpu = device == torch.device('cuda') and torch.cuda.is_available() - torch_dtype = torch.float16 if use_gpu and fp16 else torch.float32 - model_kwargs = {"local_files_only": kwargs.get('local_files_only', False)} + from diffusers import DiffusionPipeline - if kwargs['disable_nsfw'] or kwargs.get('cpu_offload', False): + fp16 = not kwargs.get("no_half", False) + use_gpu = device == torch.device("cuda") and torch.cuda.is_available() + torch_dtype = torch.float16 if use_gpu and fp16 else torch.float32 + model_kwargs = {"local_files_only": kwargs.get("local_files_only", False)} + + if kwargs["disable_nsfw"] or kwargs.get("cpu_offload", False): logger.info("Disable Paint By Example Model NSFW checker") - model_kwargs.update(dict( - safety_checker=None, - requires_safety_checker=False - )) + model_kwargs.update( + dict(safety_checker=None, requires_safety_checker=False) + ) self.model = DiffusionPipeline.from_pretrained( - "Fantasy-Studio/Paint-by-Example", - torch_dtype=torch_dtype, - **model_kwargs + "Fantasy-Studio/Paint-by-Example", torch_dtype=torch_dtype, **model_kwargs ) self.model.enable_attention_slicing() - if kwargs.get('enable_xformers', False): + if kwargs.get("enable_xformers", False): self.model.enable_xformers_memory_efficient_attention() # TODO: gpu_id - if kwargs.get('cpu_offload', False) and use_gpu: + if kwargs.get("cpu_offload", False) and use_gpu: self.model.image_encoder = self.model.image_encoder.to(device) self.model.enable_sequential_cpu_offload(gpu_id=0) else: self.model = self.model.to(device) + @staticmethod + def download(): + from diffusers import DiffusionPipeline + + DiffusionPipeline.from_pretrained("Fantasy-Studio/Paint-by-Example") + def forward(self, image, mask, config: Config): """Input image and output image have same size image: [H, W, C] RGB @@ -56,8 +59,8 @@ class PaintByExample(DiffusionInpaintModel): mask_image=PIL.Image.fromarray(mask[:, :, -1], mode="L"), example_image=config.paint_by_example_example_image, num_inference_steps=config.paint_by_example_steps, - output_type='np.array', - generator=torch.manual_seed(config.paint_by_example_seed) + output_type="np.array", + generator=torch.manual_seed(config.paint_by_example_seed), ).images[0] output = (output * 255).round().astype("uint8") diff --git a/lama_cleaner/model/sd.py b/lama_cleaner/model/sd.py index f466625..0c0b190 100644 --- a/lama_cleaner/model/sd.py +++ b/lama_cleaner/model/sd.py @@ -132,6 +132,12 @@ class SD(DiffusionInpaintModel): # model will be downloaded when app start, and can't switch in frontend settings return True + @classmethod + def download(cls): + from diffusers import StableDiffusionInpaintPipeline + + StableDiffusionInpaintPipeline.from_pretrained(cls.model_id_or_path) + class SD15(SD): name = "sd1.5" diff --git a/lama_cleaner/model/sdxl.py b/lama_cleaner/model/sdxl.py index 7615795..f64bfa8 100644 --- a/lama_cleaner/model/sdxl.py +++ b/lama_cleaner/model/sdxl.py @@ -5,7 +5,6 @@ import torch from loguru import logger from lama_cleaner.model.base import DiffusionInpaintModel -from lama_cleaner.model.utils import torch_gc, get_scheduler from lama_cleaner.schema import Config @@ -51,6 +50,14 @@ class SDXL(DiffusionInpaintModel): self.callback = kwargs.pop("callback", None) + @staticmethod + def download(): + from diffusers import AutoPipelineForInpainting + + AutoPipelineForInpainting.from_pretrained( + "diffusers/stable-diffusion-xl-1.0-inpainting-0.1" + ) + def forward(self, image, mask, config: Config): """Input image and output image have same size image: [H, W, C] RGB @@ -85,7 +92,6 @@ class SDXL(DiffusionInpaintModel): output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR) return output - @staticmethod def is_downloaded() -> bool: # model will be downloaded when app start, and can't switch in frontend settings diff --git a/lama_cleaner/model/zits.py b/lama_cleaner/model/zits.py index 664ca15..748623e 100644 --- a/lama_cleaner/model/zits.py +++ b/lama_cleaner/model/zits.py @@ -5,7 +5,7 @@ import cv2 import torch import torch.nn.functional as F -from lama_cleaner.helper import get_cache_path_by_url, load_jit_model +from lama_cleaner.helper import get_cache_path_by_url, load_jit_model, download_model from lama_cleaner.schema import Config import numpy as np @@ -171,14 +171,19 @@ def load_image(img, mask, device, sigma256=3.0): try: import skimage + gray_256 = skimage.color.rgb2gray(img_256) edge_256 = skimage.feature.canny(gray_256, sigma=3.0, mask=None).astype(float) # cv2.imwrite("skimage_gray.jpg", (gray_256*255).astype(np.uint8)) # cv2.imwrite("skimage_edge.jpg", (edge_256*255).astype(np.uint8)) except: gray_256 = cv2.cvtColor(img_256, cv2.COLOR_RGB2GRAY) - gray_256_blured = cv2.GaussianBlur(gray_256, ksize=(7, 7), sigmaX=sigma256, sigmaY=sigma256) - edge_256 = cv2.Canny(gray_256_blured, threshold1=int(255*0.1), threshold2=int(255*0.2)) + gray_256_blured = cv2.GaussianBlur( + gray_256, ksize=(7, 7), sigmaX=sigma256, sigmaY=sigma256 + ) + edge_256 = cv2.Canny( + gray_256_blured, threshold1=int(255 * 0.1), threshold2=int(255 * 0.2) + ) # cv2.imwrite("opencv_edge.jpg", edge_256) @@ -233,12 +238,27 @@ class ZITS(InpaintModel): self.sample_edge_line_iterations = 1 def init_model(self, device, **kwargs): - self.wireframe = load_jit_model(ZITS_WIRE_FRAME_MODEL_URL, device, ZITS_WIRE_FRAME_MODEL_MD5) - self.edge_line = load_jit_model(ZITS_EDGE_LINE_MODEL_URL, device, ZITS_EDGE_LINE_MODEL_MD5) + self.wireframe = load_jit_model( + ZITS_WIRE_FRAME_MODEL_URL, device, ZITS_WIRE_FRAME_MODEL_MD5 + ) + self.edge_line = load_jit_model( + ZITS_EDGE_LINE_MODEL_URL, device, ZITS_EDGE_LINE_MODEL_MD5 + ) self.structure_upsample = load_jit_model( ZITS_STRUCTURE_UPSAMPLE_MODEL_URL, device, ZITS_STRUCTURE_UPSAMPLE_MODEL_MD5 ) - self.inpaint = load_jit_model(ZITS_INPAINT_MODEL_URL, device, ZITS_INPAINT_MODEL_MD5) + self.inpaint = load_jit_model( + ZITS_INPAINT_MODEL_URL, device, ZITS_INPAINT_MODEL_MD5 + ) + + @staticmethod + def download(): + download_model(ZITS_WIRE_FRAME_MODEL_URL, ZITS_WIRE_FRAME_MODEL_MD5) + download_model(ZITS_EDGE_LINE_MODEL_URL, ZITS_EDGE_LINE_MODEL_MD5) + download_model( + ZITS_STRUCTURE_UPSAMPLE_MODEL_URL, ZITS_STRUCTURE_UPSAMPLE_MODEL_MD5 + ) + download_model(ZITS_INPAINT_MODEL_URL, ZITS_INPAINT_MODEL_MD5) @staticmethod def is_downloaded() -> bool: @@ -385,12 +405,20 @@ class ZITS(InpaintModel): if score > mask_th: try: import skimage + rr, cc, value = skimage.draw.line_aa( *to_int(line[0:2]), *to_int(line[2:4]) ) lmap[rr, cc] = np.maximum(lmap[rr, cc], value) except: - cv2.line(lmap, to_int(line[0:2][::-1]), to_int(line[2:4][::-1]), (1, 1, 1), 1, cv2.LINE_AA) + cv2.line( + lmap, + to_int(line[0:2][::-1]), + to_int(line[2:4][::-1]), + (1, 1, 1), + 1, + cv2.LINE_AA, + ) lmap = np.clip(lmap * 255, 0, 255).astype(np.uint8) lines_tensor.append(to_tensor(lmap).unsqueeze(0)) diff --git a/lama_cleaner/parse_args.py b/lama_cleaner/parse_args.py index e27d8ea..f672fb7 100644 --- a/lama_cleaner/parse_args.py +++ b/lama_cleaner/parse_args.py @@ -6,13 +6,29 @@ from pathlib import Path from loguru import logger from lama_cleaner.const import * +from lama_cleaner.download import cli_download_model from lama_cleaner.runtime import dump_environment_info +DOWNLOAD_SUBCOMMAND = "download" + + +def download_parse_args(parser): + subparsers = parser.add_subparsers(dest="subcommand") + subparser = subparsers.add_parser(DOWNLOAD_SUBCOMMAND, help="Download models") + subparser.add_argument( + "--model", help="Erase model name(lama/mat...) or model id on huggingface" + ) + subparser.add_argument( + "--model-dir", type=str, default=DEFAULT_MODEL_DIR, help=MODEL_DIR_HELP + ) + def parse_args(): parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter ) + download_parse_args(parser) + parser.add_argument("--host", default="127.0.0.1") parser.add_argument("--port", default=8080, type=int) @@ -166,9 +182,12 @@ def parse_args(): ) args = parser.parse_args() - # collect system info to help debug dump_environment_info() + if args.subcommand == DOWNLOAD_SUBCOMMAND: + cli_download_model(args.model, args.model_dir) + return + if args.install_plugins_package: from lama_cleaner.installer import install_plugins_package diff --git a/lama_cleaner/web_config.py b/lama_cleaner/web_config.py index 61efdcc..25d53c5 100644 --- a/lama_cleaner/web_config.py +++ b/lama_cleaner/web_config.py @@ -185,7 +185,7 @@ def main(config_file: str): ) sd_controlnet_method = gr.Radio( SD_CONTROLNET_CHOICES, - lable="ControlNet method", + label="ControlNet method", value=init_config.sd_controlnet_method, ) no_half = gr.Checkbox(init_config.no_half, label=f"{NO_HALF_HELP}") From ef1179a8587096a2c9c8faf8c41024ed5fb6e6b1 Mon Sep 17 00:00:00 2001 From: Qing Date: Thu, 16 Nov 2023 21:45:55 +0800 Subject: [PATCH 021/134] add get_diffusers_models --- lama_cleaner/diffusers_utils.py | 29 +++++++++++++++++++++-------- lama_cleaner/server.py | 9 +++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/lama_cleaner/diffusers_utils.py b/lama_cleaner/diffusers_utils.py index d53fa7f..d67c80c 100644 --- a/lama_cleaner/diffusers_utils.py +++ b/lama_cleaner/diffusers_utils.py @@ -7,22 +7,35 @@ def folder_name_to_show_name(name: str) -> str: return name.replace("models--", "").replace("--", "/") -def _scan_models(cache_dir, class_name: str) -> List[str]: +def _scan_models(cache_dir, class_name: List[str]) -> List[str]: cache_dir = Path(cache_dir) res = [] for it in cache_dir.glob("**/*/model_index.json"): with open(it, "r", encoding="utf-8") as f: data = json.load(f) - if data["_class_name"] == class_name: + if data["_class_name"] in class_name: name = folder_name_to_show_name(it.parent.parent.parent.name) if name not in res: res.append(name) return res -def scan_models(cache_dir) -> List[str]: - return _scan_models(cache_dir, "StableDiffusionPipeline") - - -def scan_inpainting_models(cache_dir) -> List[str]: - return _scan_models(cache_dir, "StableDiffusionInpaintPipeline") +def scan_models(cache_dir) -> Dict[str, List[str]]: + return { + "sd": _scan_models(cache_dir, ["StableDiffusionPipeline"]), + "sd_inpaint": _scan_models( + cache_dir, + [ + "StableDiffusionInpaintPipeline", + "StableDiffusionXLInpaintPipeline", + "KandinskyV22InpaintPipeline", + ], + ), + "other": _scan_models( + cache_dir, + [ + "StableDiffusionInstructPix2PixPipeline", + "PaintByExamplePipeline", + ], + ), + } diff --git a/lama_cleaner/server.py b/lama_cleaner/server.py index cb762bf..3088e7f 100644 --- a/lama_cleaner/server.py +++ b/lama_cleaner/server.py @@ -2,6 +2,8 @@ import os import hashlib +from lama_cleaner.diffusers_utils import scan_models + os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" import imghdr @@ -432,6 +434,13 @@ def get_server_config(): }, 200 +@app.route("/sd_models", methods=["GET"]) +def get_diffusers_models(): + from diffusers.utils import DIFFUSERS_CACHE + + return scan_models(DIFFUSERS_CACHE) + + @app.route("/model") def current_model(): return model.name, 200 From 53aea791c58d6595a86a7d804185d676357d080e Mon Sep 17 00:00:00 2001 From: Qing Date: Fri, 17 Nov 2023 08:56:33 +0800 Subject: [PATCH 022/134] wip --- lama_cleaner/app/package.json | 1 - lama_cleaner/app/pnpm-lock.yaml | 840 +++++++++--------- .../app/src/components/Extender/Extender.scss | 166 ++++ .../app/src/components/Extender/Extender.tsx | 408 +++++++++ .../components/Settings/ModelSettingBlock.tsx | 174 ++-- .../src/components/Settings/SettingsModal.tsx | 4 +- .../src/components/SidePanel/SidePanel.scss | 2 +- .../src/components/SidePanel/SidePanel.tsx | 135 ++- lama_cleaner/app/src/store/Atoms.tsx | 73 +- 9 files changed, 1219 insertions(+), 584 deletions(-) create mode 100644 lama_cleaner/app/src/components/Extender/Extender.scss create mode 100644 lama_cleaner/app/src/components/Extender/Extender.tsx diff --git a/lama_cleaner/app/package.json b/lama_cleaner/app/package.json index 91703b8..26568af 100644 --- a/lama_cleaner/app/package.json +++ b/lama_cleaner/app/package.json @@ -84,7 +84,6 @@ "socket.io-client": "^4.5.4", "source-map-loader": "^3.0.0", "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", "terser-webpack-plugin": "^5.2.5", "typescript": "4.x", "webpack": "^5.64.4", diff --git a/lama_cleaner/app/pnpm-lock.yaml b/lama_cleaner/app/pnpm-lock.yaml index 7647f94..0156ac0 100644 --- a/lama_cleaner/app/pnpm-lock.yaml +++ b/lama_cleaner/app/pnpm-lock.yaml @@ -15,7 +15,7 @@ dependencies: version: registry.npmmirror.com/@radix-ui/colors@0.1.8 '@radix-ui/react-dialog': specifier: 0.1.8-rc.25 - version: registry.npmmirror.com/@radix-ui/react-dialog@0.1.8-rc.25(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + version: 0.1.8-rc.25(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) '@radix-ui/react-dropdown-menu': specifier: ^2.0.4 version: 2.0.4(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) @@ -33,7 +33,7 @@ dependencies: version: registry.npmmirror.com/@radix-ui/react-scroll-area@1.0.2(react-dom@17.0.2)(react@17.0.2) '@radix-ui/react-select': specifier: 0.1.2-rc.27 - version: registry.npmmirror.com/@radix-ui/react-select@0.1.2-rc.27(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + version: 0.1.2-rc.27(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) '@radix-ui/react-switch': specifier: ^0.1.5 version: registry.npmmirror.com/@radix-ui/react-switch@0.1.5(react@17.0.2) @@ -57,7 +57,7 @@ dependencies: version: registry.npmmirror.com/@testing-library/react@12.1.5(react-dom@17.0.2)(react@17.0.2) '@testing-library/user-event': specifier: ^13.5.0 - version: registry.npmmirror.com/@testing-library/user-event@13.5.0(@testing-library/dom@8.20.0) + version: registry.npmmirror.com/@testing-library/user-event@13.5.0(@testing-library/dom@9.3.3) '@types/flexsearch': specifier: ^0.7.3 version: registry.npmmirror.com/@types/flexsearch@0.7.3 @@ -120,7 +120,7 @@ dependencies: version: registry.npmmirror.com/eslint@8.32.0 eslint-config-react-app: specifier: ^7.0.1 - version: registry.npmmirror.com/eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.18.6)(@babel/plugin-transform-react-jsx@7.20.13)(eslint@8.32.0)(jest@27.5.1)(typescript@4.9.4) + version: registry.npmmirror.com/eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.32.0)(jest@27.5.1)(typescript@4.9.4) eslint-webpack-plugin: specifier: ^3.1.1 version: registry.npmmirror.com/eslint-webpack-plugin@3.2.0(eslint@8.32.0)(webpack@5.75.0) @@ -241,9 +241,6 @@ dependencies: style-loader: specifier: ^3.3.1 version: registry.npmmirror.com/style-loader@3.3.1(webpack@5.75.0) - tailwindcss: - specifier: ^3.0.2 - version: registry.npmmirror.com/tailwindcss@3.2.4(postcss@8.4.21) terser-webpack-plugin: specifier: ^5.2.5 version: registry.npmmirror.com/terser-webpack-plugin@5.3.6(webpack@5.75.0) @@ -266,7 +263,7 @@ dependencies: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^5.1.0 - version: registry.npmmirror.com/@typescript-eslint/eslint-plugin@5.49.0(@typescript-eslint/parser@5.49.0)(eslint@8.32.0)(typescript@4.9.4) + version: registry.npmmirror.com/@typescript-eslint/eslint-plugin@5.49.0(@typescript-eslint/parser@5.62.0)(eslint@8.32.0)(typescript@4.9.4) eslint-config-airbnb: specifier: ^18.2.1 version: registry.npmmirror.com/eslint-config-airbnb@18.2.1(eslint-plugin-import@2.27.5)(eslint-plugin-jsx-a11y@6.7.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.32.1)(eslint@8.32.0) @@ -275,7 +272,7 @@ devDependencies: version: registry.npmmirror.com/eslint-config-prettier@8.6.0(eslint@8.32.0) eslint-plugin-import: specifier: ^2.25.2 - version: registry.npmmirror.com/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.49.0)(eslint@8.32.0) + version: registry.npmmirror.com/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.62.0)(eslint@8.32.0) eslint-plugin-jsx-a11y: specifier: ^6.4.1 version: registry.npmmirror.com/eslint-plugin-jsx-a11y@6.7.1(eslint@8.32.0) @@ -297,83 +294,84 @@ devDependencies: packages: - /@babel/code-frame@7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.18.6 + '@babel/highlight': 7.22.20 + chalk: 2.4.2 dev: false - /@babel/helper-annotate-as-pure@7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.23.3 dev: false - /@babel/helper-module-imports@7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.23.3 dev: false - /@babel/helper-plugin-utils@7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} dev: false - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} dev: false - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: false - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 dev: false - /@babel/plugin-syntax-flow@7.18.6(@babel/core@7.20.12): - resolution: {integrity: sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==} + /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.20.12): + resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': registry.npmmirror.com/@babel/core@7.20.12 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.20.12): - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.20.12): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': registry.npmmirror.com/@babel/core@7.20.12 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-transform-react-jsx@7.20.13(@babel/core@7.20.12): - resolution: {integrity: sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==} + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.20.12): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': registry.npmmirror.com/@babel/core@7.20.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.20.12) - '@babel/types': 7.20.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.20.12) + '@babel/types': 7.23.3 dev: false /@babel/runtime@7.20.13: @@ -383,12 +381,19 @@ packages: regenerator-runtime: 0.13.11 dev: false - /@babel/types@7.20.7: - resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 + regenerator-runtime: 0.14.0 + dev: false + + /@babel/types@7.23.3: + resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: false @@ -422,10 +427,12 @@ packages: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 + dev: true /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} + dev: true /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} @@ -433,6 +440,7 @@ packages: dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + dev: true /@radix-ui/primitive@1.0.0: resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} @@ -494,6 +502,33 @@ packages: react: registry.npmmirror.com/react@17.0.2 dev: false + /@radix-ui/react-dialog@0.1.8-rc.25(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-THdTgtqCWmOs06zQOod8lNgH+eoBFlqJKwLOC6TVIgj76lNahEotPOz8K5Dio/IyJ7U2NAVZtGgV6ZQkdjtKFQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': registry.npmmirror.com/@babel/runtime@7.20.13 + '@radix-ui/primitive': registry.npmmirror.com/@radix-ui/primitive@0.1.0 + '@radix-ui/react-compose-refs': registry.npmmirror.com/@radix-ui/react-compose-refs@0.1.1-rc.18(react@17.0.2) + '@radix-ui/react-context': registry.npmmirror.com/@radix-ui/react-context@0.1.2-rc.18(react@17.0.2) + '@radix-ui/react-dismissable-layer': registry.npmmirror.com/@radix-ui/react-dismissable-layer@0.1.6-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-focus-guards': registry.npmmirror.com/@radix-ui/react-focus-guards@0.1.1-rc.18(react@17.0.2) + '@radix-ui/react-focus-scope': registry.npmmirror.com/@radix-ui/react-focus-scope@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-id': registry.npmmirror.com/@radix-ui/react-id@0.1.6-rc.18(react@17.0.2) + '@radix-ui/react-portal': registry.npmmirror.com/@radix-ui/react-portal@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-presence': registry.npmmirror.com/@radix-ui/react-presence@0.1.3-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-primitive': registry.npmmirror.com/@radix-ui/react-primitive@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-slot': registry.npmmirror.com/@radix-ui/react-slot@0.1.3-rc.18(react@17.0.2) + '@radix-ui/react-use-controllable-state': registry.npmmirror.com/@radix-ui/react-use-controllable-state@0.1.1-rc.18(react@17.0.2) + aria-hidden: registry.npmmirror.com/aria-hidden@1.2.2(@types/react@17.0.53)(react@17.0.2) + react: registry.npmmirror.com/react@17.0.2 + react-dom: registry.npmmirror.com/react-dom@17.0.2(react@17.0.2) + react-remove-scroll: registry.npmmirror.com/react-remove-scroll@2.5.5(@types/react@17.0.53)(react@17.0.2) + transitivePeerDependencies: + - '@types/react' + dev: false + /@radix-ui/react-direction@1.0.0(react@17.0.2): resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==} peerDependencies: @@ -718,6 +753,38 @@ packages: react-dom: registry.npmmirror.com/react-dom@17.0.2(react@17.0.2) dev: false + /@radix-ui/react-select@0.1.2-rc.27(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-bU7edMZ57HSjD/QjFNUXqR1BNbKJiNa/Ue/i4pNSZzu1uoz93s7T1fNZcfUtz1TyJSCfSqw7M9qnteVgM67frg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': registry.npmmirror.com/@babel/runtime@7.20.13 + '@radix-ui/number': registry.npmmirror.com/@radix-ui/number@0.1.0 + '@radix-ui/primitive': registry.npmmirror.com/@radix-ui/primitive@0.1.0 + '@radix-ui/react-collection': registry.npmmirror.com/@radix-ui/react-collection@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-compose-refs': registry.npmmirror.com/@radix-ui/react-compose-refs@0.1.1-rc.18(react@17.0.2) + '@radix-ui/react-context': registry.npmmirror.com/@radix-ui/react-context@0.1.2-rc.18(react@17.0.2) + '@radix-ui/react-direction': registry.npmmirror.com/@radix-ui/react-direction@0.1.0-rc.21(react@17.0.2) + '@radix-ui/react-dismissable-layer': registry.npmmirror.com/@radix-ui/react-dismissable-layer@0.1.6-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-focus-scope': registry.npmmirror.com/@radix-ui/react-focus-scope@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-id': registry.npmmirror.com/@radix-ui/react-id@0.1.6-rc.18(react@17.0.2) + '@radix-ui/react-label': registry.npmmirror.com/@radix-ui/react-label@0.1.6-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-portal': registry.npmmirror.com/@radix-ui/react-portal@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-primitive': registry.npmmirror.com/@radix-ui/react-primitive@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-use-callback-ref': registry.npmmirror.com/@radix-ui/react-use-callback-ref@0.1.1-rc.18(react@17.0.2) + '@radix-ui/react-use-controllable-state': registry.npmmirror.com/@radix-ui/react-use-controllable-state@0.1.1-rc.18(react@17.0.2) + '@radix-ui/react-use-layout-effect': registry.npmmirror.com/@radix-ui/react-use-layout-effect@0.1.1-rc.18(react@17.0.2) + '@radix-ui/react-use-previous': registry.npmmirror.com/@radix-ui/react-use-previous@0.1.2-rc.18(react@17.0.2) + '@radix-ui/react-visually-hidden': registry.npmmirror.com/@radix-ui/react-visually-hidden@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) + aria-hidden: registry.npmmirror.com/aria-hidden@1.2.2(@types/react@17.0.53)(react@17.0.2) + react: registry.npmmirror.com/react@17.0.2 + react-dom: registry.npmmirror.com/react-dom@17.0.2(react@17.0.2) + react-remove-scroll: registry.npmmirror.com/react-remove-scroll@2.5.5(@types/react@17.0.53)(react@17.0.2) + transitivePeerDependencies: + - '@types/react' + dev: false + /@radix-ui/react-slot@0.1.2(react@17.0.2): resolution: {integrity: sha512-ADkqfL+agEzEguU3yS26jfB50hRrwf7U4VTwAOZEmi/g+ITcBWe12yM46ueS/UCIMI9Py+gFUaAdxgxafFvY2Q==} peerDependencies: @@ -802,26 +869,26 @@ packages: '@babel/runtime': 7.20.13 dev: false - /@testing-library/dom@8.20.0: - resolution: {integrity: sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==} - engines: {node: '>=12'} + /@testing-library/dom@9.3.3: + resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} + engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.18.6 - '@babel/runtime': 7.20.13 - '@types/aria-query': 5.0.1 + '@babel/code-frame': 7.22.13 + '@babel/runtime': 7.23.2 + '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 dom-accessibility-api: 0.5.16 - lz-string: 1.4.4 + lz-string: 1.5.0 pretty-format: 27.5.1 dev: false - /@types/aria-query@5.0.1: - resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} dev: false - /@typescript-eslint/parser@5.49.0(eslint@8.32.0)(typescript@4.9.4): - resolution: {integrity: sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg==} + /@typescript-eslint/parser@5.62.0(eslint@8.32.0)(typescript@4.9.4): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -830,28 +897,31 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.49.0 - '@typescript-eslint/types': 5.49.0 - '@typescript-eslint/typescript-estree': 5.49.0(typescript@4.9.4) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.4) debug: 4.3.4 eslint: registry.npmmirror.com/eslint@8.32.0 typescript: registry.npmmirror.com/typescript@4.9.4 transitivePeerDependencies: - supports-color + dev: true - /@typescript-eslint/scope-manager@5.49.0: - resolution: {integrity: sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==} + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.49.0 - '@typescript-eslint/visitor-keys': 5.49.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true - /@typescript-eslint/types@5.49.0: - resolution: {integrity: sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==} + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - /@typescript-eslint/typescript-estree@5.49.0(typescript@4.9.4): - resolution: {integrity: sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==} + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.4): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -859,8 +929,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.49.0 - '@typescript-eslint/visitor-keys': 5.49.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -869,13 +939,15 @@ packages: typescript: registry.npmmirror.com/typescript@4.9.4 transitivePeerDependencies: - supports-color + dev: true - /@typescript-eslint/visitor-keys@5.49.0: - resolution: {integrity: sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==} + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.49.0 - eslint-visitor-keys: 3.3.0 + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -919,12 +991,20 @@ packages: /aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: - deep-equal: 2.2.0 + deep-equal: 2.2.3 + dev: false + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 dev: false /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + dev: true /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} @@ -936,12 +1016,14 @@ packages: engines: {node: '>=8'} dependencies: fill-range: 7.0.1 + dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 dev: false /chalk@2.4.2: @@ -992,15 +1074,18 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: true - /deep-equal@2.2.0: - resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} + /deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 is-arguments: 1.1.1 - is-array-buffer: 3.0.1 + is-array-buffer: 3.0.2 is-date-object: 1.0.5 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 @@ -1008,18 +1093,28 @@ packages: object-is: 1.1.5 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 + regexp.prototype.flags: 1.5.1 side-channel: 1.0.4 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.9 + which-typed-array: 1.1.13 dev: false - /define-properties@1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} dependencies: - has-property-descriptors: 1.0.0 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 dev: false @@ -1032,6 +1127,7 @@ packages: engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: true /dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -1040,8 +1136,8 @@ packages: /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 is-arguments: 1.1.1 is-map: 2.0.2 @@ -1056,12 +1152,13 @@ packages: engines: {node: '>=0.8.0'} dev: false - /eslint-visitor-keys@3.3.0: - resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1069,17 +1166,20 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 + dev: true /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 + dev: true /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 + dev: true /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -1087,27 +1187,28 @@ packages: is-callable: 1.2.7 dev: false - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: false /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: false - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: - function-bind: 1.1.1 - has: 1.0.3 + function-bind: 1.1.2 + has-proto: 1.0.1 has-symbols: 1.0.3 + hasown: 2.0.0 dev: false /get-nonce@1.0.1: @@ -1120,6 +1221,7 @@ packages: engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 + dev: true /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -1127,15 +1229,16 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 + fast-glob: 3.3.2 + ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 + dev: true /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 dev: false /graceful-fs@4.2.10: @@ -1158,10 +1261,15 @@ packages: engines: {node: '>=8'} dev: false - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 + dev: false + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} dev: false /has-symbols@1.0.3: @@ -1176,27 +1284,28 @@ packages: has-symbols: 1.0.3 dev: false - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 dev: false - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} + dev: true /inter-ui@3.19.3: resolution: {integrity: sha512-5FG9fjuYOXocIfjzcCBhICL5cpvwEetseL3FU6tP3d6Bn7g8wODhB+I9RNGRTizCT7CUG4GOK54OPxqq3msQgg==} dev: false - /internal-slot@1.0.4: - resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 + get-intrinsic: 1.2.2 + hasown: 2.0.0 side-channel: 1.0.4 dev: false @@ -1210,16 +1319,16 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: false - /is-array-buffer@3.0.1: - resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-typed-array: 1.1.10 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 dev: false /is-bigint@1.0.4: @@ -1232,7 +1341,7 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: false @@ -1251,12 +1360,14 @@ packages: /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + dev: true /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 + dev: true /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -1272,12 +1383,13 @@ packages: /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + dev: true /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: false @@ -1288,7 +1400,7 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: false /is-string@1.0.7: @@ -1305,15 +1417,11 @@ packages: has-symbols: 1.0.3 dev: false - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 + which-typed-array: 1.1.13 dev: false /is-weakmap@2.0.1: @@ -1323,8 +1431,8 @@ packages: /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: false /isarray@2.0.5: @@ -1347,15 +1455,17 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: true - /lz-string@1.4.4: - resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true dev: false /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + dev: true /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} @@ -1363,20 +1473,22 @@ packages: dependencies: braces: 3.0.2 picomatch: 2.3.1 + dev: true /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: false /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 + call-bind: 1.0.5 + define-properties: 1.2.1 dev: false /object-keys@1.1.1: @@ -1388,8 +1500,8 @@ packages: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 + call-bind: 1.0.5 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 dev: false @@ -1397,10 +1509,12 @@ packages: /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + dev: true /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} @@ -1413,6 +1527,7 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -1474,23 +1589,29 @@ packages: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: false - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: false + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - functions-have-names: 1.2.3 + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 dev: false /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 + dev: true /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} @@ -1498,18 +1619,39 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: true + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + dev: false /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 dev: false /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -1522,7 +1664,7 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} dependencies: - internal-slot: 1.0.4 + internal-slot: 1.0.6 dev: false /supports-color@5.5.0: @@ -1549,9 +1691,11 @@ packages: engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 + dev: true /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} @@ -1565,6 +1709,7 @@ packages: dependencies: tslib: 1.14.1 typescript: registry.npmmirror.com/typescript@4.9.4 + dev: true /use-callback-ref@1.3.0(@types/react@17.0.53)(react@17.0.2): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} @@ -1629,20 +1774,20 @@ packages: is-weakset: 2.0.2 dev: false - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 dev: false /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true registry.npmmirror.com/@adobe/css-tools@4.0.2: resolution: {integrity: sha512-Fx6tYjk2wKUgLi8uMANZr8GNZx05u44ArIJldn9VxLvolzlJVgHbTUCbwhMd6bcYky178+WUSxPHO3DAtGLWpw==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.0.2.tgz} @@ -4256,36 +4401,6 @@ packages: react: registry.npmmirror.com/react@17.0.2 dev: false - registry.npmmirror.com/@radix-ui/react-dialog@0.1.8-rc.25(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-THdTgtqCWmOs06zQOod8lNgH+eoBFlqJKwLOC6TVIgj76lNahEotPOz8K5Dio/IyJ7U2NAVZtGgV6ZQkdjtKFQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-0.1.8-rc.25.tgz} - id: registry.npmmirror.com/@radix-ui/react-dialog/0.1.8-rc.25 - name: '@radix-ui/react-dialog' - version: 0.1.8-rc.25 - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': registry.npmmirror.com/@babel/runtime@7.20.13 - '@radix-ui/primitive': registry.npmmirror.com/@radix-ui/primitive@0.1.0 - '@radix-ui/react-compose-refs': registry.npmmirror.com/@radix-ui/react-compose-refs@0.1.1-rc.18(react@17.0.2) - '@radix-ui/react-context': registry.npmmirror.com/@radix-ui/react-context@0.1.2-rc.18(react@17.0.2) - '@radix-ui/react-dismissable-layer': registry.npmmirror.com/@radix-ui/react-dismissable-layer@0.1.6-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-focus-guards': registry.npmmirror.com/@radix-ui/react-focus-guards@0.1.1-rc.18(react@17.0.2) - '@radix-ui/react-focus-scope': registry.npmmirror.com/@radix-ui/react-focus-scope@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-id': registry.npmmirror.com/@radix-ui/react-id@0.1.6-rc.18(react@17.0.2) - '@radix-ui/react-portal': registry.npmmirror.com/@radix-ui/react-portal@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-presence': registry.npmmirror.com/@radix-ui/react-presence@0.1.3-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-primitive': registry.npmmirror.com/@radix-ui/react-primitive@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-slot': registry.npmmirror.com/@radix-ui/react-slot@0.1.3-rc.18(react@17.0.2) - '@radix-ui/react-use-controllable-state': registry.npmmirror.com/@radix-ui/react-use-controllable-state@0.1.1-rc.18(react@17.0.2) - aria-hidden: registry.npmmirror.com/aria-hidden@1.2.2(@types/react@17.0.53)(react@17.0.2) - react: registry.npmmirror.com/react@17.0.2 - react-dom: registry.npmmirror.com/react-dom@17.0.2(react@17.0.2) - react-remove-scroll: registry.npmmirror.com/react-remove-scroll@2.5.5(@types/react@17.0.53)(react@17.0.2) - transitivePeerDependencies: - - '@types/react' - dev: false - registry.npmmirror.com/@radix-ui/react-direction@0.1.0-rc.21(react@17.0.2): resolution: {integrity: sha512-c2mlHIXhgkLT7RiXdaqHhLC0b3XtWKimG5FUFGxUSr3+IKADg7CioTAVwOqz2Pa+AKO8tYJG/2aE583mmE9OMg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-0.1.0-rc.21.tgz} id: registry.npmmirror.com/@radix-ui/react-direction/0.1.0-rc.21 @@ -4768,41 +4883,6 @@ packages: react-dom: registry.npmmirror.com/react-dom@17.0.2(react@17.0.2) dev: false - registry.npmmirror.com/@radix-ui/react-select@0.1.2-rc.27(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-bU7edMZ57HSjD/QjFNUXqR1BNbKJiNa/Ue/i4pNSZzu1uoz93s7T1fNZcfUtz1TyJSCfSqw7M9qnteVgM67frg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-select/-/react-select-0.1.2-rc.27.tgz} - id: registry.npmmirror.com/@radix-ui/react-select/0.1.2-rc.27 - name: '@radix-ui/react-select' - version: 0.1.2-rc.27 - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': registry.npmmirror.com/@babel/runtime@7.20.13 - '@radix-ui/number': registry.npmmirror.com/@radix-ui/number@0.1.0 - '@radix-ui/primitive': registry.npmmirror.com/@radix-ui/primitive@0.1.0 - '@radix-ui/react-collection': registry.npmmirror.com/@radix-ui/react-collection@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-compose-refs': registry.npmmirror.com/@radix-ui/react-compose-refs@0.1.1-rc.18(react@17.0.2) - '@radix-ui/react-context': registry.npmmirror.com/@radix-ui/react-context@0.1.2-rc.18(react@17.0.2) - '@radix-ui/react-direction': registry.npmmirror.com/@radix-ui/react-direction@0.1.0-rc.21(react@17.0.2) - '@radix-ui/react-dismissable-layer': registry.npmmirror.com/@radix-ui/react-dismissable-layer@0.1.6-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-focus-scope': registry.npmmirror.com/@radix-ui/react-focus-scope@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-id': registry.npmmirror.com/@radix-ui/react-id@0.1.6-rc.18(react@17.0.2) - '@radix-ui/react-label': registry.npmmirror.com/@radix-ui/react-label@0.1.6-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-portal': registry.npmmirror.com/@radix-ui/react-portal@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-primitive': registry.npmmirror.com/@radix-ui/react-primitive@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) - '@radix-ui/react-use-callback-ref': registry.npmmirror.com/@radix-ui/react-use-callback-ref@0.1.1-rc.18(react@17.0.2) - '@radix-ui/react-use-controllable-state': registry.npmmirror.com/@radix-ui/react-use-controllable-state@0.1.1-rc.18(react@17.0.2) - '@radix-ui/react-use-layout-effect': registry.npmmirror.com/@radix-ui/react-use-layout-effect@0.1.1-rc.18(react@17.0.2) - '@radix-ui/react-use-previous': registry.npmmirror.com/@radix-ui/react-use-previous@0.1.2-rc.18(react@17.0.2) - '@radix-ui/react-visually-hidden': registry.npmmirror.com/@radix-ui/react-visually-hidden@0.1.5-rc.18(react-dom@17.0.2)(react@17.0.2) - aria-hidden: registry.npmmirror.com/aria-hidden@1.2.2(@types/react@17.0.53)(react@17.0.2) - react: registry.npmmirror.com/react@17.0.2 - react-dom: registry.npmmirror.com/react-dom@17.0.2(react@17.0.2) - react-remove-scroll: registry.npmmirror.com/react-remove-scroll@2.5.5(@types/react@17.0.53)(react@17.0.2) - transitivePeerDependencies: - - '@types/react' - dev: false - registry.npmmirror.com/@radix-ui/react-slot@0.1.2(react@17.0.2): resolution: {integrity: sha512-ADkqfL+agEzEguU3yS26jfB50hRrwf7U4VTwAOZEmi/g+ITcBWe12yM46ueS/UCIMI9Py+gFUaAdxgxafFvY2Q==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-0.1.2.tgz} id: registry.npmmirror.com/@radix-ui/react-slot/0.1.2 @@ -5530,7 +5610,7 @@ packages: react-dom: registry.npmmirror.com/react-dom@17.0.2(react@17.0.2) dev: false - registry.npmmirror.com/@testing-library/user-event@13.5.0(@testing-library/dom@8.20.0): + registry.npmmirror.com/@testing-library/user-event@13.5.0(@testing-library/dom@9.3.3): resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@testing-library/user-event/-/user-event-13.5.0.tgz} id: registry.npmmirror.com/@testing-library/user-event/13.5.0 name: '@testing-library/user-event' @@ -5540,7 +5620,7 @@ packages: '@testing-library/dom': '>=7.21.4' dependencies: '@babel/runtime': registry.npmmirror.com/@babel/runtime@7.20.13 - '@testing-library/dom': 8.20.0 + '@testing-library/dom': 9.3.3 dev: false registry.npmmirror.com/@tootallnate/once@1.1.2: @@ -5952,7 +6032,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.49.0(eslint@8.32.0)(typescript@4.9.4) + '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser@5.49.0(eslint@8.32.0)(typescript@4.9.4) '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@5.49.0 '@typescript-eslint/type-utils': registry.npmmirror.com/@typescript-eslint/type-utils@5.49.0(eslint@8.32.0)(typescript@4.9.4) '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils@5.49.0(eslint@8.32.0)(typescript@4.9.4) @@ -5966,6 +6046,37 @@ packages: typescript: registry.npmmirror.com/typescript@4.9.4 transitivePeerDependencies: - supports-color + dev: false + + registry.npmmirror.com/@typescript-eslint/eslint-plugin@5.49.0(@typescript-eslint/parser@5.62.0)(eslint@8.32.0)(typescript@4.9.4): + resolution: {integrity: sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz} + id: registry.npmmirror.com/@typescript-eslint/eslint-plugin/5.49.0 + name: '@typescript-eslint/eslint-plugin' + version: 5.49.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.32.0)(typescript@4.9.4) + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@5.49.0 + '@typescript-eslint/type-utils': registry.npmmirror.com/@typescript-eslint/type-utils@5.49.0(eslint@8.32.0)(typescript@4.9.4) + '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils@5.49.0(eslint@8.32.0)(typescript@4.9.4) + debug: registry.npmmirror.com/debug@4.3.4 + eslint: registry.npmmirror.com/eslint@8.32.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + natural-compare-lite: registry.npmmirror.com/natural-compare-lite@1.4.0 + regexpp: registry.npmmirror.com/regexpp@3.2.0 + semver: registry.npmmirror.com/semver@7.3.8 + tsutils: registry.npmmirror.com/tsutils@3.21.0(typescript@4.9.4) + typescript: registry.npmmirror.com/typescript@4.9.4 + transitivePeerDependencies: + - supports-color + dev: true registry.npmmirror.com/@typescript-eslint/experimental-utils@5.49.0(eslint@8.32.0)(typescript@4.9.4): resolution: {integrity: sha512-veLpCJLYn44Fru7mSvi2doxQMzMCOFSDYdMUQhAzaH1vFYq2RVNpecZ8d18Wh6UMv07yahXkiv/aShWE48iE9Q==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.49.0.tgz} @@ -6297,16 +6408,6 @@ packages: dependencies: acorn: registry.npmmirror.com/acorn@8.8.2 - registry.npmmirror.com/acorn-node@1.8.2: - resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/acorn-node/-/acorn-node-1.8.2.tgz} - name: acorn-node - version: 1.8.2 - dependencies: - acorn: registry.npmmirror.com/acorn@7.4.1 - acorn-walk: registry.npmmirror.com/acorn-walk@7.2.0 - xtend: registry.npmmirror.com/xtend@4.0.2 - dev: false - registry.npmmirror.com/acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz} name: acorn-walk @@ -6478,12 +6579,6 @@ packages: normalize-path: registry.npmmirror.com/normalize-path@3.0.0 picomatch: registry.npmmirror.com/picomatch@2.3.1 - registry.npmmirror.com/arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz} - name: arg - version: 5.0.2 - dev: false - registry.npmmirror.com/argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz} name: argparse @@ -7050,13 +7145,6 @@ packages: tslib: registry.npmmirror.com/tslib@2.4.1 dev: false - registry.npmmirror.com/camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz} - name: camelcase-css - version: 2.0.1 - engines: {node: '>= 6'} - dev: false - registry.npmmirror.com/camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz} name: camelcase @@ -7159,7 +7247,7 @@ packages: normalize-path: registry.npmmirror.com/normalize-path@3.0.0 readdirp: registry.npmmirror.com/readdirp@3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 registry.npmmirror.com/chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz} @@ -7916,12 +8004,6 @@ packages: has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.0 object-keys: registry.npmmirror.com/object-keys@1.1.1 - registry.npmmirror.com/defined@1.0.1: - resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/defined/-/defined-1.0.1.tgz} - name: defined - version: 1.0.1 - dev: false - registry.npmmirror.com/delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz} name: delayed-stream @@ -7982,24 +8064,6 @@ packages: - supports-color dev: false - registry.npmmirror.com/detective@5.2.1: - resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/detective/-/detective-5.2.1.tgz} - name: detective - version: 5.2.1 - engines: {node: '>=0.8.0'} - hasBin: true - dependencies: - acorn-node: registry.npmmirror.com/acorn-node@1.8.2 - defined: registry.npmmirror.com/defined@1.0.1 - minimist: registry.npmmirror.com/minimist@1.2.7 - dev: false - - registry.npmmirror.com/didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz} - name: didyoumean - version: 1.2.2 - dev: false - registry.npmmirror.com/diff-sequences@27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/diff-sequences/-/diff-sequences-27.5.1.tgz} name: diff-sequences @@ -8015,12 +8079,6 @@ packages: dependencies: path-type: registry.npmmirror.com/path-type@4.0.0 - registry.npmmirror.com/dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz} - name: dlv - version: 1.1.3 - dev: false - registry.npmmirror.com/dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz} name: dns-equal @@ -8432,7 +8490,7 @@ packages: dependencies: confusing-browser-globals: registry.npmmirror.com/confusing-browser-globals@1.0.11 eslint: registry.npmmirror.com/eslint@8.32.0 - eslint-plugin-import: registry.npmmirror.com/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.49.0)(eslint@8.32.0) + eslint-plugin-import: registry.npmmirror.com/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.62.0)(eslint@8.32.0) object.assign: registry.npmmirror.com/object.assign@4.1.4 object.entries: registry.npmmirror.com/object.entries@1.1.6 dev: true @@ -8452,7 +8510,7 @@ packages: dependencies: eslint: registry.npmmirror.com/eslint@8.32.0 eslint-config-airbnb-base: registry.npmmirror.com/eslint-config-airbnb-base@14.2.1(eslint-plugin-import@2.27.5)(eslint@8.32.0) - eslint-plugin-import: registry.npmmirror.com/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.49.0)(eslint@8.32.0) + eslint-plugin-import: registry.npmmirror.com/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.62.0)(eslint@8.32.0) eslint-plugin-jsx-a11y: registry.npmmirror.com/eslint-plugin-jsx-a11y@6.7.1(eslint@8.32.0) eslint-plugin-react: registry.npmmirror.com/eslint-plugin-react@7.32.1(eslint@8.32.0) eslint-plugin-react-hooks: registry.npmmirror.com/eslint-plugin-react-hooks@4.6.0(eslint@8.32.0) @@ -8472,7 +8530,7 @@ packages: eslint: registry.npmmirror.com/eslint@8.32.0 dev: true - registry.npmmirror.com/eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.18.6)(@babel/plugin-transform-react-jsx@7.20.13)(eslint@8.32.0)(jest@27.5.1)(typescript@4.9.4): + registry.npmmirror.com/eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.32.0)(jest@27.5.1)(typescript@4.9.4): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz} id: registry.npmmirror.com/eslint-config-react-app/7.0.1 name: eslint-config-react-app @@ -8493,7 +8551,7 @@ packages: babel-preset-react-app: registry.npmmirror.com/babel-preset-react-app@10.0.1 confusing-browser-globals: registry.npmmirror.com/confusing-browser-globals@1.0.11 eslint: registry.npmmirror.com/eslint@8.32.0 - eslint-plugin-flowtype: registry.npmmirror.com/eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.18.6)(@babel/plugin-transform-react-jsx@7.20.13)(eslint@8.32.0) + eslint-plugin-flowtype: registry.npmmirror.com/eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.32.0) eslint-plugin-import: registry.npmmirror.com/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.49.0)(eslint@8.32.0) eslint-plugin-jest: registry.npmmirror.com/eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.49.0)(eslint@8.32.0)(jest@27.5.1)(typescript@4.9.4) eslint-plugin-jsx-a11y: registry.npmmirror.com/eslint-plugin-jsx-a11y@6.7.1(eslint@8.32.0) @@ -8545,14 +8603,47 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.49.0(eslint@8.32.0)(typescript@4.9.4) + '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser@5.49.0(eslint@8.32.0)(typescript@4.9.4) debug: registry.npmmirror.com/debug@3.2.7 eslint: registry.npmmirror.com/eslint@8.32.0 eslint-import-resolver-node: registry.npmmirror.com/eslint-import-resolver-node@0.3.7 transitivePeerDependencies: - supports-color + dev: false - registry.npmmirror.com/eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.18.6)(@babel/plugin-transform-react-jsx@7.20.13)(eslint@8.32.0): + registry.npmmirror.com/eslint-module-utils@2.7.4(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint@8.32.0): + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz} + id: registry.npmmirror.com/eslint-module-utils/2.7.4 + name: eslint-module-utils + version: 2.7.4 + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.32.0)(typescript@4.9.4) + debug: registry.npmmirror.com/debug@3.2.7 + eslint: registry.npmmirror.com/eslint@8.32.0 + eslint-import-resolver-node: registry.npmmirror.com/eslint-import-resolver-node@0.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.32.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz} id: registry.npmmirror.com/eslint-plugin-flowtype/8.0.3 name: eslint-plugin-flowtype @@ -8563,8 +8654,8 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: - '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.20.12) - '@babel/plugin-transform-react-jsx': 7.20.13(@babel/core@7.20.12) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.20.12) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.20.12) eslint: registry.npmmirror.com/eslint@8.32.0 lodash: registry.npmmirror.com/lodash@4.17.21 string-natural-compare: registry.npmmirror.com/string-natural-compare@3.0.1 @@ -8583,7 +8674,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.49.0(eslint@8.32.0)(typescript@4.9.4) + '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser@5.49.0(eslint@8.32.0)(typescript@4.9.4) array-includes: registry.npmmirror.com/array-includes@3.1.6 array.prototype.flat: registry.npmmirror.com/array.prototype.flat@1.3.1 array.prototype.flatmap: registry.npmmirror.com/array.prototype.flatmap@1.3.1 @@ -8604,6 +8695,43 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false + + registry.npmmirror.com/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.62.0)(eslint@8.32.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz} + id: registry.npmmirror.com/eslint-plugin-import/2.27.5 + name: eslint-plugin-import + version: 2.27.5 + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.32.0)(typescript@4.9.4) + array-includes: registry.npmmirror.com/array-includes@3.1.6 + array.prototype.flat: registry.npmmirror.com/array.prototype.flat@1.3.1 + array.prototype.flatmap: registry.npmmirror.com/array.prototype.flatmap@1.3.1 + debug: registry.npmmirror.com/debug@3.2.7 + doctrine: registry.npmmirror.com/doctrine@2.1.0 + eslint: registry.npmmirror.com/eslint@8.32.0 + eslint-import-resolver-node: registry.npmmirror.com/eslint-import-resolver-node@0.3.7 + eslint-module-utils: registry.npmmirror.com/eslint-module-utils@2.7.4(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint@8.32.0) + has: registry.npmmirror.com/has@1.0.3 + is-core-module: registry.npmmirror.com/is-core-module@2.11.0 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + object.values: registry.npmmirror.com/object.values@1.1.6 + resolve: registry.npmmirror.com/resolve@1.22.1 + semver: registry.npmmirror.com/semver@6.3.0 + tsconfig-paths: registry.npmmirror.com/tsconfig-paths@3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true registry.npmmirror.com/eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.49.0)(eslint@8.32.0)(jest@27.5.1)(typescript@4.9.4): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz} @@ -10517,7 +10645,7 @@ packages: micromatch: registry.npmmirror.com/micromatch@4.0.5 walker: registry.npmmirror.com/walker@1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false registry.npmmirror.com/jest-jasmine2@27.5.1: @@ -11701,13 +11829,6 @@ packages: version: 4.1.1 engines: {node: '>=0.10.0'} - registry.npmmirror.com/object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz} - name: object-hash - version: 3.0.0 - engines: {node: '>= 6'} - dev: false - registry.npmmirror.com/object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz} name: object-inspect @@ -12076,13 +12197,6 @@ packages: hasBin: true dev: false - registry.npmmirror.com/pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz} - name: pify - version: 2.3.0 - engines: {node: '>=0.10.0'} - dev: false - registry.npmmirror.com/pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz} name: pify @@ -12437,21 +12551,6 @@ packages: postcss-value-parser: registry.npmmirror.com/postcss-value-parser@4.2.0 dev: false - registry.npmmirror.com/postcss-import@14.1.0(postcss@8.4.21): - resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/postcss-import/-/postcss-import-14.1.0.tgz} - id: registry.npmmirror.com/postcss-import/14.1.0 - name: postcss-import - version: 14.1.0 - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: registry.npmmirror.com/postcss@8.4.21 - postcss-value-parser: registry.npmmirror.com/postcss-value-parser@4.2.0 - read-cache: registry.npmmirror.com/read-cache@1.0.0 - resolve: registry.npmmirror.com/resolve@1.22.1 - dev: false - registry.npmmirror.com/postcss-initial@4.0.1(postcss@8.4.21): resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/postcss-initial/-/postcss-initial-4.0.1.tgz} id: registry.npmmirror.com/postcss-initial/4.0.1 @@ -12463,19 +12562,6 @@ packages: postcss: registry.npmmirror.com/postcss@8.4.21 dev: false - registry.npmmirror.com/postcss-js@4.0.0(postcss@8.4.21): - resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.0.tgz} - id: registry.npmmirror.com/postcss-js/4.0.0 - name: postcss-js - version: 4.0.0 - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.3.3 - dependencies: - camelcase-css: registry.npmmirror.com/camelcase-css@2.0.1 - postcss: registry.npmmirror.com/postcss@8.4.21 - dev: false - registry.npmmirror.com/postcss-lab-function@4.2.1(postcss@8.4.21): resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz} id: registry.npmmirror.com/postcss-lab-function/4.2.1 @@ -12490,26 +12576,6 @@ packages: postcss-value-parser: registry.npmmirror.com/postcss-value-parser@4.2.0 dev: false - registry.npmmirror.com/postcss-load-config@3.1.4(postcss@8.4.21): - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz} - id: registry.npmmirror.com/postcss-load-config/3.1.4 - name: postcss-load-config - version: 3.1.4 - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: registry.npmmirror.com/lilconfig@2.0.6 - postcss: registry.npmmirror.com/postcss@8.4.21 - yaml: registry.npmmirror.com/yaml@1.10.2 - dev: false - registry.npmmirror.com/postcss-loader@6.2.1(postcss@8.4.21)(webpack@5.75.0): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/postcss-loader/-/postcss-loader-6.2.1.tgz} id: registry.npmmirror.com/postcss-loader/6.2.1 @@ -12690,19 +12756,6 @@ packages: postcss: registry.npmmirror.com/postcss@8.4.21 dev: false - registry.npmmirror.com/postcss-nested@6.0.0(postcss@8.4.21): - resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.0.0.tgz} - id: registry.npmmirror.com/postcss-nested/6.0.0 - name: postcss-nested - version: 6.0.0 - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: registry.npmmirror.com/postcss@8.4.21 - postcss-selector-parser: registry.npmmirror.com/postcss-selector-parser@6.0.11 - dev: false - registry.npmmirror.com/postcss-nesting@10.2.0(postcss@8.4.21): resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz} id: registry.npmmirror.com/postcss-nesting/10.2.0 @@ -13255,13 +13308,6 @@ packages: name: queue-microtask version: 1.2.3 - registry.npmmirror.com/quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz} - name: quick-lru - version: 5.1.1 - engines: {node: '>=10'} - dev: false - registry.npmmirror.com/raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz} name: raf @@ -13563,14 +13609,6 @@ packages: object-assign: registry.npmmirror.com/object-assign@4.1.1 dev: false - registry.npmmirror.com/read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz} - name: read-cache - version: 1.0.0 - dependencies: - pify: registry.npmmirror.com/pify@2.3.0 - dev: false - registry.npmmirror.com/read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz} name: read-pkg @@ -13892,7 +13930,7 @@ packages: engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false registry.npmmirror.com/rtl-css-js@1.16.1: @@ -14793,43 +14831,6 @@ packages: version: 3.2.4 dev: false - registry.npmmirror.com/tailwindcss@3.2.4(postcss@8.4.21): - resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.2.4.tgz} - id: registry.npmmirror.com/tailwindcss/3.2.4 - name: tailwindcss - version: 3.2.4 - engines: {node: '>=12.13.0'} - hasBin: true - peerDependencies: - postcss: ^8.0.9 - dependencies: - arg: registry.npmmirror.com/arg@5.0.2 - chokidar: registry.npmmirror.com/chokidar@3.5.3 - color-name: registry.npmmirror.com/color-name@1.1.4 - detective: registry.npmmirror.com/detective@5.2.1 - didyoumean: registry.npmmirror.com/didyoumean@1.2.2 - dlv: registry.npmmirror.com/dlv@1.1.3 - fast-glob: registry.npmmirror.com/fast-glob@3.2.12 - glob-parent: registry.npmmirror.com/glob-parent@6.0.2 - is-glob: registry.npmmirror.com/is-glob@4.0.3 - lilconfig: registry.npmmirror.com/lilconfig@2.0.6 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - normalize-path: registry.npmmirror.com/normalize-path@3.0.0 - object-hash: registry.npmmirror.com/object-hash@3.0.0 - picocolors: registry.npmmirror.com/picocolors@1.0.0 - postcss: registry.npmmirror.com/postcss@8.4.21 - postcss-import: registry.npmmirror.com/postcss-import@14.1.0(postcss@8.4.21) - postcss-js: registry.npmmirror.com/postcss-js@4.0.0(postcss@8.4.21) - postcss-load-config: registry.npmmirror.com/postcss-load-config@3.1.4(postcss@8.4.21) - postcss-nested: registry.npmmirror.com/postcss-nested@6.0.0(postcss@8.4.21) - postcss-selector-parser: registry.npmmirror.com/postcss-selector-parser@6.0.11 - postcss-value-parser: registry.npmmirror.com/postcss-value-parser@4.2.0 - quick-lru: registry.npmmirror.com/quick-lru@5.1.1 - resolve: registry.npmmirror.com/resolve@1.22.1 - transitivePeerDependencies: - - ts-node - dev: false - registry.npmmirror.com/tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz} name: tapable @@ -15984,13 +15985,6 @@ packages: engines: {node: '>=0.4.0'} dev: false - registry.npmmirror.com/xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz} - name: xtend - version: 4.0.2 - engines: {node: '>=0.4'} - dev: false - registry.npmmirror.com/y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz} name: y18n diff --git a/lama_cleaner/app/src/components/Extender/Extender.scss b/lama_cleaner/app/src/components/Extender/Extender.scss new file mode 100644 index 0000000..a31c723 --- /dev/null +++ b/lama_cleaner/app/src/components/Extender/Extender.scss @@ -0,0 +1,166 @@ +@use 'sass:math'; + +$drag-handle-shortside: 12px; +$drag-handle-longside: 40px; +$drag-bar-size: 12px; + +$half-handle-shortside: math.div($drag-handle-shortside, 2); +$half-handle-longside: math.div($drag-handle-longside, 2); +$half-drag-bar-size: math.div($drag-bar-size, 2); + +.extender-border { + outline-color: var(--yellow-accent); + outline-style: dashed; +} + +.info-bar { + position: absolute; + pointer-events: auto; + font-size: 1rem; + padding: 0.2rem 0.8rem; + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + color: var(--text-color); + background-color: var(--page-bg); + border-radius: 9999px; + + border: var(--editor-toolkit-panel-border); + box-shadow: 0 0 0 1px #0000001a, 0 3px 16px #00000014, 0 2px 6px 1px #00000017; + + &:hover { + cursor: move; + } +} + +.extender-wrapper { + position: absolute; + height: 100%; + width: 100%; + z-index: 2; + pointer-events: none; +} + +.extender { + position: relative; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 2; + pointer-events: none; + + // display: flex; + // flex-direction: column; + // align-items: center; + + box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.5); +} + +.drag-bar { + position: absolute; + pointer-events: auto; + // display: none; + + &.ord-top { + top: 0; + left: 0; + width: 100%; + height: $drag-bar-size; + margin-top: -$half-drag-bar-size; + cursor: ns-resize; + } + &.ord-right { + right: 0; + top: 0; + width: $drag-bar-size; + height: 100%; + margin-right: -$half-drag-bar-size; + cursor: ew-resize; + } + &.ord-bottom { + bottom: 0; + left: 0; + width: 100%; + height: $drag-bar-size; + margin-bottom: -$half-drag-bar-size; + cursor: ns-resize; + } + &.ord-left { + top: 0; + left: 0; + width: $drag-bar-size; + height: 100%; + margin-left: -$half-drag-bar-size; + cursor: ew-resize; + } +} + +.drag-handle { + width: $drag-handle-shortside; + height: $drag-handle-shortside; + z-index: 4; + position: absolute; + display: block; + content: ''; + border: 2px solid var(--yellow-accent); + background-color: var(--yellow-accent-light); + pointer-events: auto; + + &:hover { + background-color: var(--yellow-accent); + } + + &.ord-topleft { + cursor: nw-resize; + top: (-$half-handle-shortside)-1px; + left: (-$half-handle-shortside)-1px; + } + + &.ord-topright { + cursor: ne-resize; + top: -($half-handle-shortside)-1px; + right: -($half-handle-shortside)-1px; + } + + &.ord-bottomright { + cursor: se-resize; + bottom: -($half-handle-shortside)-1px; + right: -($half-handle-shortside)-1px; + } + + &.ord-bottomleft { + cursor: sw-resize; + bottom: -($half-handle-shortside)-1px; + left: -($half-handle-shortside)-1px; + } + + &.ord-top, + &.ord-bottom { + left: calc(50% - $half-handle-shortside); + cursor: ns-resize; + } + + &.ord-top { + top: (-$half-handle-shortside)-1px; + } + + &.ord-bottom { + bottom: -($half-handle-shortside)-1px; + } + + &.ord-left, + &.ord-right { + top: calc(50% - $half-handle-shortside); + cursor: ew-resize; + } + + &.ord-left { + left: (-$half-handle-shortside)-1px; + } + + &.ord-right { + right: -($half-handle-shortside)-1px; + } +} diff --git a/lama_cleaner/app/src/components/Extender/Extender.tsx b/lama_cleaner/app/src/components/Extender/Extender.tsx new file mode 100644 index 0000000..d5ee4c6 --- /dev/null +++ b/lama_cleaner/app/src/components/Extender/Extender.tsx @@ -0,0 +1,408 @@ +import React, { useEffect, useState } from 'react' +import { useRecoilState, useRecoilValue } from 'recoil' +import { + extenderX, + extenderY, + extenderHeight, + extenderWidth, + isInpaintingState, +} from '../../store/Atoms' + +const DOC_MOVE_OPTS = { capture: true, passive: false } + +const DRAG_HANDLE_BORDER = 2 +const DRAG_HANDLE_SHORT = 12 +const DRAG_HANDLE_LONG = 40 + +interface EVData { + initX: number + initY: number + initHeight: number + initWidth: number + startResizeX: number + startResizeY: number + ord: string // top/right/bottom/left +} + +interface Props { + maxHeight: number + maxWidth: number + scale: number + minHeight: number + minWidth: number + show: boolean +} + +const clamp = ( + newPos: number, + newLength: number, + oldPos: number, + oldLength: number, + minLength: number, + maxLength: number +) => { + if (newPos !== oldPos && newLength === oldLength) { + if (newPos < 0) { + return [0, oldLength] + } + if (newPos + newLength > maxLength) { + return [maxLength - oldLength, oldLength] + } + } else { + if (newLength < minLength) { + if (newPos === oldPos) { + return [newPos, minLength] + } + return [newPos + newLength - minLength, minLength] + } + if (newPos < 0) { + return [0, newPos + newLength] + } + if (newPos + newLength > maxLength) { + return [newPos, maxLength - newPos] + } + } + + return [newPos, newLength] +} + +const Extender = (props: Props) => { + const { minHeight, minWidth, maxHeight, maxWidth, scale, show } = props + const [x, setX] = useRecoilState(extenderX) + const [y, setY] = useRecoilState(extenderY) + const [height, setHeight] = useRecoilState(extenderHeight) + const [width, setWidth] = useRecoilState(extenderWidth) + const isInpainting = useRecoilValue(isInpaintingState) + + const [isResizing, setIsResizing] = useState(false) + const [isMoving, setIsMoving] = useState(false) + + useEffect(() => { + setX(Math.round((maxWidth - 512) / 2)) + setY(Math.round((maxHeight - 512) / 2)) + }, [maxHeight, maxWidth]) + + const [evData, setEVData] = useState({ + initX: 0, + initY: 0, + initHeight: 0, + initWidth: 0, + startResizeX: 0, + startResizeY: 0, + ord: 'top', + }) + + const onDragFocus = () => { + console.log('focus') + } + + const clampLeftRight = (newX: number, newWidth: number) => { + return clamp(newX, newWidth, x, width, minWidth, maxWidth) + } + + const clampTopBottom = (newY: number, newHeight: number) => { + return clamp(newY, newHeight, y, height, minHeight, maxHeight) + } + + const onPointerMove = (e: PointerEvent) => { + if (isInpainting) { + return + } + const curX = e.clientX + const curY = e.clientY + + const offsetY = Math.round((curY - evData.startResizeY) / scale) + const offsetX = Math.round((curX - evData.startResizeX) / scale) + + const moveTop = () => { + const newHeight = evData.initHeight - offsetY + const newY = evData.initY + offsetY + const [clampedY, clampedHeight] = clampTopBottom(newY, newHeight) + setHeight(clampedHeight) + setY(clampedY) + } + + const moveBottom = () => { + const newHeight = evData.initHeight + offsetY + const [clampedY, clampedHeight] = clampTopBottom(evData.initY, newHeight) + setHeight(clampedHeight) + setY(clampedY) + } + + const moveLeft = () => { + const newWidth = evData.initWidth - offsetX + const newX = evData.initX + offsetX + const [clampedX, clampedWidth] = clampLeftRight(newX, newWidth) + setWidth(clampedWidth) + setX(clampedX) + } + + const moveRight = () => { + const newWidth = evData.initWidth + offsetX + const [clampedX, clampedWidth] = clampLeftRight(evData.initX, newWidth) + setWidth(clampedWidth) + setX(clampedX) + } + + if (isResizing) { + switch (evData.ord) { + case 'topleft': { + moveTop() + moveLeft() + break + } + case 'topright': { + moveTop() + moveRight() + break + } + case 'bottomleft': { + moveBottom() + moveLeft() + break + } + case 'bottomright': { + moveBottom() + moveRight() + break + } + case 'top': { + moveTop() + break + } + case 'right': { + moveRight() + break + } + case 'bottom': { + moveBottom() + break + } + case 'left': { + moveLeft() + break + } + + default: + break + } + } + + if (isMoving) { + const newX = evData.initX + offsetX + const newY = evData.initY + offsetY + const [clampedX, clampedWidth] = clampLeftRight(newX, evData.initWidth) + const [clampedY, clampedHeight] = clampTopBottom(newY, evData.initHeight) + setWidth(clampedWidth) + setHeight(clampedHeight) + setX(clampedX) + setY(clampedY) + } + } + + const onPointerDone = (e: PointerEvent) => { + if (isResizing) { + setIsResizing(false) + } + + if (isMoving) { + setIsMoving(false) + } + } + + useEffect(() => { + if (isResizing || isMoving) { + document.addEventListener('pointermove', onPointerMove, DOC_MOVE_OPTS) + document.addEventListener('pointerup', onPointerDone, DOC_MOVE_OPTS) + document.addEventListener('pointercancel', onPointerDone, DOC_MOVE_OPTS) + return () => { + document.removeEventListener( + 'pointermove', + onPointerMove, + DOC_MOVE_OPTS + ) + document.removeEventListener('pointerup', onPointerDone, DOC_MOVE_OPTS) + document.removeEventListener( + 'pointercancel', + onPointerDone, + DOC_MOVE_OPTS + ) + } + } + }, [isResizing, isMoving, width, height, evData]) + + const onCropPointerDown = (e: React.PointerEvent) => { + const { ord } = (e.target as HTMLElement).dataset + if (ord) { + setIsResizing(true) + setEVData({ + initX: x, + initY: y, + initHeight: height, + initWidth: width, + startResizeX: e.clientX, + startResizeY: e.clientY, + ord, + }) + } + } + + const createCropSelection = () => { + return ( +
+
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ ) + } + + const onInfoBarPointerDown = (e: React.PointerEvent) => { + setIsMoving(true) + setEVData({ + initX: x, + initY: y, + initHeight: height, + initWidth: width, + startResizeX: e.clientX, + startResizeY: e.clientY, + ord: '', + }) + } + + const createInfoBar = () => { + return ( +
+
+ {width} x {height} +
+
+ ) + } + + const createBorder = () => { + return ( +
+ ) + } + + return ( +
+
+ {createBorder()} + {createInfoBar()} + {createCropSelection()} +
+
+ ) +} + +export default Extender diff --git a/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx b/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx index 15c7463..2c08948 100644 --- a/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx +++ b/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx @@ -1,5 +1,6 @@ -import React, { ReactNode, useEffect, useState } from 'react' +import React, { ReactNode, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' +import * as Tabs from '@radix-ui/react-tabs' import { AIModel, CV2Flag, @@ -9,13 +10,21 @@ import { import Selector from '../shared/Selector' import { Switch, SwitchThumb } from '../shared/Switch' import Tooltip from '../shared/Tooltip' -import { LDMSampler } from './HDSettingBlock' +import HDSettingBlock, { LDMSampler } from './HDSettingBlock' import NumberInputSetting from './NumberInputSetting' import SettingBlock from './SettingBlock' +import Flex from '../shared/Layout' +import ManualRunInpaintingSettingBlock from './ManualRunInpaintingSettingBlock' + +const ERASE_TAB = 'erase_tab' +const INPAINTING_DIFFUSION_TAB = 'inpainting_diffusion_tab' +const DIFFUSION_TAB = 'diffusion_tab' +const OTHER_TAB = 'other_tab' function ModelSettingBlock() { const [setting, setSettingState] = useRecoilState(settingState) const isDisableModelSwitch = useRecoilValue(isDisableModelSwitchState) + const [tab, setTab] = useState(ERASE_TAB) const onModelChange = (value: AIModel) => { setSettingState(old => { @@ -190,112 +199,63 @@ function ModelSettingBlock() { } } - const renderPaperCodeBadge = (): ReactNode => { - switch (setting.model) { - case AIModel.LAMA: - return renderModelDesc( - 'Resolution-robust Large Mask Inpainting with Fourier Convolutions', - 'https://arxiv.org/abs/2109.07161', - 'https://github.com/saic-mdal/lama' - ) - case AIModel.LDM: - return renderModelDesc( - 'High-Resolution Image Synthesis with Latent Diffusion Models', - 'https://arxiv.org/abs/2112.10752', - 'https://github.com/CompVis/latent-diffusion' - ) - case AIModel.ZITS: - return renderModelDesc( - 'Incremental Transformer Structure Enhanced Image Inpainting with Masking Positional Encoding', - 'https://arxiv.org/abs/2203.00867', - 'https://github.com/DQiaole/ZITS_inpainting' - ) - case AIModel.MAT: - return renderModelDesc( - 'Mask-Aware Transformer for Large Hole Image Inpainting', - 'https://arxiv.org/abs/2203.15270', - 'https://github.com/fenglinglwb/MAT' - ) - case AIModel.FCF: - return renderModelDesc( - 'Keys to Better Image Inpainting: Structure and Texture Go Hand in Hand', - 'https://arxiv.org/abs/2208.03382', - 'https://github.com/SHI-Labs/FcF-Inpainting' - ) - case AIModel.SD15: - return renderModelDesc( - 'Stable Diffusion 1.5', - 'https://ommer-lab.com/research/latent-diffusion-models/', - 'https://github.com/CompVis/stable-diffusion' - ) - case AIModel.ANYTHING4: - return renderModelDesc( - 'andite/anything-v4.0', - 'https://huggingface.co/andite/anything-v4.0', - 'https://huggingface.co/andite/anything-v4.0' - ) - case AIModel.REALISTIC_VISION_1_4: - return renderModelDesc( - 'SG161222/Realistic_Vision_V1.4', - 'https://huggingface.co/SG161222/Realistic_Vision_V1.4', - 'https://huggingface.co/SG161222/Realistic_Vision_V1.4' - ) - case AIModel.SD2: - return renderModelDesc( - 'Stable Diffusion 2', - 'https://ommer-lab.com/research/latent-diffusion-models/', - 'https://github.com/Stability-AI/stablediffusion' - ) - case AIModel.Mange: - return renderModelDesc( - 'Manga Inpainting', - 'https://www.cse.cuhk.edu.hk/~ttwong/papers/mangainpaint/mangainpaint.html', - 'https://github.com/msxie92/MangaInpainting' - ) - case AIModel.CV2: - return renderModelDesc( - 'OpenCV Image Inpainting', - 'https://docs.opencv.org/4.6.0/df/d3d/tutorial_py_inpainting.html', - 'https://docs.opencv.org/4.6.0/df/d3d/tutorial_py_inpainting.html' - ) - case AIModel.PAINT_BY_EXAMPLE: - return renderModelDesc( - 'Paint by Example', - 'https://arxiv.org/abs/2211.13227', - 'https://github.com/Fantasy-Studio/Paint-by-Example' - ) - case AIModel.PIX2PIX: - return renderModelDesc( - 'InstructPix2Pix', - 'https://arxiv.org/abs/2211.09800', - 'https://github.com/timothybrooks/instruct-pix2pix' - ) - case AIModel.KANDINSKY21: - return renderModelDesc( - 'Kandinsky 2.1', - 'https://huggingface.co/kandinsky-community/kandinsky-2-1-inpaint', - 'https://huggingface.co/kandinsky-community/kandinsky-2-1-inpaint' - ) - default: - return <> - } - } - return ( - onModelChange(val as AIModel)} - disabled={isDisableModelSwitch} - /> - } - optionDesc={renderOptionDesc()} - /> + // onModelChange(val as AIModel)} + // disabled={isDisableModelSwitch} + // /> + // } + // optionDesc={renderOptionDesc()} + // /> + + +
Current Model
+
{setting.model}
+
+ setTab(val)} + > + + + Erase + + + Inpainting Diffusion + + + Diffusion + + + Other + + + + + + + 123 + 123 + 123 + +
) } diff --git a/lama_cleaner/app/src/components/Settings/SettingsModal.tsx b/lama_cleaner/app/src/components/Settings/SettingsModal.tsx index aaaf683..1cef5bb 100644 --- a/lama_cleaner/app/src/components/Settings/SettingsModal.tsx +++ b/lama_cleaner/app/src/components/Settings/SettingsModal.tsx @@ -28,7 +28,6 @@ interface SettingModalProps { export default function SettingModal(props: SettingModalProps) { const { onClose } = props const [setting, setSettingState] = useRecoilState(settingState) - const isSD = useRecoilValue(isSDState) const isDiffusionModels = useRecoilValue(isDiffusionModelsState) const handleOnClose = () => { @@ -57,9 +56,8 @@ export default function SettingModal(props: SettingModalProps) { show={setting.show} > - {isDiffusionModels ? <> : } + - {isDiffusionModels ? <> : } ) } diff --git a/lama_cleaner/app/src/components/SidePanel/SidePanel.scss b/lama_cleaner/app/src/components/SidePanel/SidePanel.scss index 0175932..f427d52 100644 --- a/lama_cleaner/app/src/components/SidePanel/SidePanel.scss +++ b/lama_cleaner/app/src/components/SidePanel/SidePanel.scss @@ -85,7 +85,7 @@ } .resize-title-tile { - width: 86px; + width: 60px; font-size: 0.5rem; color: var(--text-color-gray); } diff --git a/lama_cleaner/app/src/components/SidePanel/SidePanel.tsx b/lama_cleaner/app/src/components/SidePanel/SidePanel.tsx index 668260f..ff1b644 100644 --- a/lama_cleaner/app/src/components/SidePanel/SidePanel.tsx +++ b/lama_cleaner/app/src/components/SidePanel/SidePanel.tsx @@ -1,6 +1,7 @@ -import React, { FormEvent } from 'react' +import React, { FormEvent, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import * as PopoverPrimitive from '@radix-ui/react-popover' +import * as Tabs from '@radix-ui/react-tabs' import { useToggle } from 'react-use' import { ControlNetMethod, @@ -10,6 +11,8 @@ import { propmtState, SDSampler, settingState, + SIDE_PANEL_TAB, + SIDE_PANEL_TAB_TYPE, } from '../../store/Atoms' import NumberInputSetting from '../Settings/NumberInputSetting' import SettingBlock from '../Settings/SettingBlock' @@ -23,6 +26,7 @@ const INPUT_WIDTH = 30 const SidePanel = () => { const [open, toggleOpen] = useToggle(true) + const [tab, setTab] = useState(SIDE_PANEL_TAB.inpainting) const [setting, setSettingState] = useRecoilState(settingState) const [negativePrompt, setNegativePrompt] = useRecoilState(negativePropmtState) @@ -95,27 +99,58 @@ const SidePanel = () => { > Config + - {isControlNet && renderConterNetSetting()} - - { - setSettingState(old => { - return { ...old, showCroper: value } - }) - }} + setTab(val as SIDE_PANEL_TAB_TYPE)} + > + + - - - } - /> + In Painting + + + Out Painting + + + - + {isControlNet && tab === SIDE_PANEL_TAB.inpainting ? ( + renderConterNetSetting() + ) : ( + <> + )} + + {tab === SIDE_PANEL_TAB.inpainting ? ( + { + setSettingState(old => { + return { ...old, showCroper: value } + }) + }} + > + + + } + /> + ) : ( + <> + )} + + {tab === SIDE_PANEL_TAB.inpainting ? : <>} {/* { }} /> - { - const val = value.length === 0 ? 0 : parseInt(value, 10) - setSettingState(old => { - return { ...old, sdMaskBlur: val } - }) - }} - /> + {tab === SIDE_PANEL_TAB.inpainting ? ( + { + const val = value.length === 0 ? 0 : parseInt(value, 10) + setSettingState(old => { + return { ...old, sdMaskBlur: val } + }) + }} + /> + ) : ( + <> + )} - { - setSettingState(old => { - return { ...old, sdMatchHistograms: value } - }) - }} - > - - - } - /> + {tab === SIDE_PANEL_TAB.outpainting ? ( + { + setSettingState(old => { + return { ...old, sdMatchHistograms: value } + }) + }} + > + + + } + /> + ) : ( + <> + )} (o: Array): { [K in T]: K } { + return o.reduce((res, key) => { + res[key] = key + return res + }, Object.create(null)) +} + export enum AIModel { LAMA = 'lama', LDM = 'ldm', @@ -17,7 +24,7 @@ export enum AIModel { Mange = 'manga', PAINT_BY_EXAMPLE = 'paint_by_example', PIX2PIX = 'instruct_pix2pix', - KANDINSKY21 = 'kandinsky2.1', + KANDINSKY22 = 'kandinsky2.2', } export enum ControlNetMethod { @@ -351,6 +358,20 @@ export const croperState = atom({ }, }) +export const SIDE_PANEL_TAB = strEnum(['inpainting', 'outpainting']) +export type SIDE_PANEL_TAB_TYPE = keyof typeof SIDE_PANEL_TAB + +export interface SidePanelState { + tab: SIDE_PANEL_TAB_TYPE +} + +export const sidePanelTabState = atom({ + key: 'sidePanelTabState', + default: { + tab: SIDE_PANEL_TAB.inpainting, + }, +}) + export const croperX = selector({ key: 'croperX', get: ({ get }) => get(croperState).x, @@ -387,6 +408,52 @@ export const croperWidth = selector({ }, }) +export const extenderState = atom({ + key: 'extenderState', + default: { + x: 0, + y: 0, + width: 512, + height: 512, + }, +}) + +export const extenderX = selector({ + key: 'extenderX', + get: ({ get }) => get(extenderState).x, + set: ({ get, set }, newValue: any) => { + const rect = get(extenderState) + set(extenderState, { ...rect, x: newValue }) + }, +}) + +export const extenderY = selector({ + key: 'extenderY', + get: ({ get }) => get(extenderState).y, + set: ({ get, set }, newValue: any) => { + const rect = get(extenderState) + set(extenderState, { ...rect, y: newValue }) + }, +}) + +export const extenderHeight = selector({ + key: 'extenderHeight', + get: ({ get }) => get(extenderState).height, + set: ({ get, set }, newValue: any) => { + const rect = get(extenderState) + set(extenderState, { ...rect, height: newValue }) + }, +}) + +export const extenderWidth = selector({ + key: 'extenderWidth', + get: ({ get }) => get(extenderState).width, + set: ({ get, set }, newValue: any) => { + const rect = get(extenderState) + set(extenderState, { ...rect, width: newValue }) + }, +}) + interface ToastAtomState { open: boolean desc: string @@ -567,7 +634,7 @@ const defaultHDSettings: ModelsHDSettings = { hdStrategyCropMargin: 128, enabled: true, }, - [AIModel.KANDINSKY21]: { + [AIModel.KANDINSKY22]: { hdStrategy: HDStrategy.ORIGINAL, hdStrategyResizeLimit: 768, hdStrategyCropTrigerSize: 512, @@ -728,7 +795,7 @@ export const isSDState = selector({ settings.model === AIModel.SD2 || settings.model === AIModel.ANYTHING4 || settings.model === AIModel.REALISTIC_VISION_1_4 || - settings.model === AIModel.KANDINSKY21 + settings.model === AIModel.KANDINSKY22 ) }, }) From a5c241ac02dcf429be7195000d7e4e9d0816bfbb Mon Sep 17 00:00:00 2001 From: Qing Date: Mon, 20 Nov 2023 13:05:28 +0800 Subject: [PATCH 023/134] add migan --- lama_cleaner/model/mi_gan.py | 109 +++++++++++++++++++++++++++++++ lama_cleaner/model_manager.py | 9 ++- lama_cleaner/tests/test_model.py | 20 +++++- 3 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 lama_cleaner/model/mi_gan.py diff --git a/lama_cleaner/model/mi_gan.py b/lama_cleaner/model/mi_gan.py new file mode 100644 index 0000000..1b2ba1d --- /dev/null +++ b/lama_cleaner/model/mi_gan.py @@ -0,0 +1,109 @@ +import os + +import cv2 +import torch + +from lama_cleaner.const import Config +from lama_cleaner.helper import ( + load_jit_model, + download_model, + get_cache_path_by_url, + boxes_from_mask, + resize_max_size, + norm_img, +) +from lama_cleaner.model.base import InpaintModel + +MIGAN_MODEL_URL = os.environ.get( + "MIGAN_MODEL_URL", + "/Users/cwq/code/github/MI-GAN/exported_models/migan_places512/models/migan_traced.pt", +) +MIGAN_MODEL_MD5 = os.environ.get("MIGAN_MODEL_MD5", "76eb3b1a71c400ee3290524f7a11b89c") + + +class MIGAN(InpaintModel): + name = "migan" + min_size = 512 + pad_mod = 512 + pad_to_square = True + + def init_model(self, device, **kwargs): + self.model = load_jit_model(MIGAN_MODEL_URL, device, MIGAN_MODEL_MD5).eval() + + @staticmethod + def download(): + download_model(MIGAN_MODEL_URL, MIGAN_MODEL_MD5) + + @staticmethod + def is_downloaded() -> bool: + return os.path.exists(get_cache_path_by_url(MIGAN_MODEL_URL)) + + @torch.no_grad() + def __call__(self, image, mask, config: Config): + """ + images: [H, W, C] RGB, not normalized + masks: [H, W] + return: BGR IMAGE + """ + if image.shape[0] == 512 and image.shape[1] == 512: + return self._pad_forward(image, mask, config) + + boxes = boxes_from_mask(mask) + crop_result = [] + config.hd_strategy_crop_margin = 128 + for box in boxes: + crop_image, crop_mask, crop_box = self._crop_box(image, mask, box, config) + origin_size = crop_image.shape[:2] + resize_image = resize_max_size(crop_image, size_limit=512) + resize_mask = resize_max_size(crop_mask, size_limit=512) + inpaint_result = self._pad_forward(resize_image, resize_mask, config) + + # only paste masked area result + inpaint_result = cv2.resize( + inpaint_result, + (origin_size[1], origin_size[0]), + interpolation=cv2.INTER_CUBIC, + ) + + original_pixel_indices = crop_mask < 127 + inpaint_result[original_pixel_indices] = crop_image[:, :, ::-1][ + original_pixel_indices + ] + + crop_result.append((inpaint_result, crop_box)) + + inpaint_result = image[:, :, ::-1] + for crop_image, crop_box in crop_result: + x1, y1, x2, y2 = crop_box + inpaint_result[y1:y2, x1:x2, :] = crop_image + + return inpaint_result + + def forward(self, image, mask, config: Config): + """Input images and output images have same size + images: [H, W, C] RGB + masks: [H, W] mask area == 255 + return: BGR IMAGE + """ + + image = norm_img(image) # [0, 1] + image = image * 2 - 1 # [0, 1] -> [-1, 1] + mask = (mask > 120) * 255 + mask = norm_img(mask) + + image = torch.from_numpy(image).unsqueeze(0).to(self.device) + mask = torch.from_numpy(mask).unsqueeze(0).to(self.device) + + erased_img = image * (1 - mask) + input_image = torch.cat([0.5 - mask, erased_img], dim=1) + + output = self.model(input_image) + output = ( + (output.permute(0, 2, 3, 1) * 127.5 + 127.5) + .round() + .clamp(0, 255) + .to(torch.uint8) + ) + output = output[0].cpu().numpy() + cur_res = cv2.cvtColor(output, cv2.COLOR_RGB2BGR) + return cur_res diff --git a/lama_cleaner/model_manager.py b/lama_cleaner/model_manager.py index 43d9ced..8461c95 100644 --- a/lama_cleaner/model_manager.py +++ b/lama_cleaner/model_manager.py @@ -3,7 +3,11 @@ import gc from loguru import logger -from lama_cleaner.const import SD15_MODELS, MODELS_SUPPORT_FREEU, MODELS_SUPPORT_LCM_LORA +from lama_cleaner.const import ( + SD15_MODELS, + MODELS_SUPPORT_FREEU, + MODELS_SUPPORT_LCM_LORA, +) from lama_cleaner.helper import switch_mps_device from lama_cleaner.model.controlnet import ControlNet from lama_cleaner.model.fcf import FcF @@ -12,6 +16,7 @@ from lama_cleaner.model.lama import LaMa from lama_cleaner.model.ldm import LDM from lama_cleaner.model.manga import Manga from lama_cleaner.model.mat import MAT +from lama_cleaner.model.mi_gan import MIGAN from lama_cleaner.model.paint_by_example import PaintByExample from lama_cleaner.model.instruct_pix2pix import InstructPix2Pix from lama_cleaner.model.sd import SD15, SD2, Anything4, RealisticVision14 @@ -37,6 +42,7 @@ models = { "instruct_pix2pix": InstructPix2Pix, Kandinsky22.name: Kandinsky22, SDXL.name: SDXL, + MIGAN.name: MIGAN, } @@ -146,4 +152,3 @@ class ModelManager: self.model.model.load_lora_weights(self.model.lcm_lora_id) else: self.model.model.disable_lora() - diff --git a/lama_cleaner/tests/test_model.py b/lama_cleaner/tests/test_model.py index be253b5..f6931ce 100644 --- a/lama_cleaner/tests/test_model.py +++ b/lama_cleaner/tests/test_model.py @@ -170,7 +170,7 @@ def test_cv2(strategy, cv2_flag, cv2_radius): assert_equal( model, cfg, - f"sd_{strategy.capitalize()}_{cv2_flag}_{cv2_radius}.png", + f"cv2_{strategy.capitalize()}_{cv2_flag}_{cv2_radius}.png", img_p=current_dir / "overture-creations-5sI6fQgYIuo.png", mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png", ) @@ -188,7 +188,23 @@ def test_manga(strategy): assert_equal( model, cfg, - f"sd_{strategy.capitalize()}.png", + f"manga_{strategy.capitalize()}.png", + img_p=current_dir / "overture-creations-5sI6fQgYIuo.png", + mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png", + ) + + +@pytest.mark.parametrize("strategy", [HDStrategy.ORIGINAL]) +def test_mi_gan(strategy): + model = ModelManager( + name="migan", + device=torch.device(device), + ) + cfg = get_config(strategy) + assert_equal( + model, + cfg, + f"migan_{strategy.capitalize()}.png", img_p=current_dir / "overture-creations-5sI6fQgYIuo.png", mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png", ) From 04c5dfece888c55e09eab77d297f3dfc6eb8e0fd Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 22 Nov 2023 08:53:20 +0800 Subject: [PATCH 024/134] new web init --- web_app/.eslintrc.cjs | 18 + web_app/.gitignore | 24 + web_app/README.md | 30 + web_app/components.json | 16 + web_app/index.html | 13 + web_app/package-lock.json | 5775 +++++++++++++++++++++ web_app/package.json | 65 + web_app/postcss.config.js | 6 + web_app/src/App.tsx | 173 + web_app/src/components/Editor.tsx | 1704 ++++++ web_app/src/components/FileManager.tsx | 321 ++ web_app/src/components/FileSelect.tsx | 71 + web_app/src/components/Header.tsx | 173 + web_app/src/components/PromptInput.tsx | 66 + web_app/src/components/Shortcuts.tsx | 97 + web_app/src/components/Workspace.tsx | 114 + web_app/src/components/theme-provider.tsx | 73 + web_app/src/components/ui/accordion.tsx | 55 + web_app/src/components/ui/button.tsx | 123 + web_app/src/components/ui/dialog.tsx | 120 + web_app/src/components/ui/input.tsx | 25 + web_app/src/components/ui/label.tsx | 24 + web_app/src/components/ui/popover.tsx | 29 + web_app/src/components/ui/scroll-area.tsx | 46 + web_app/src/components/ui/select.tsx | 162 + web_app/src/components/ui/slider.tsx | 26 + web_app/src/components/ui/switch.tsx | 27 + web_app/src/components/ui/tabs.tsx | 53 + web_app/src/components/ui/textarea.tsx | 24 + web_app/src/components/ui/toast.tsx | 127 + web_app/src/components/ui/toaster.tsx | 33 + web_app/src/components/ui/toggle.tsx | 43 + web_app/src/components/ui/tooltip.tsx | 28 + web_app/src/components/ui/use-toast.ts | 192 + web_app/src/globals.css | 100 + web_app/src/hooks/useAsyncMemo.tsx | 33 + web_app/src/hooks/useHotkey.tsx | 22 + web_app/src/hooks/useImage.tsx | 24 + web_app/src/hooks/useInputImage.tsx | 34 + web_app/src/hooks/useResolution.tsx | 31 + web_app/src/lib/api.ts | 270 + web_app/src/lib/event.ts | 22 + web_app/src/lib/store.ts | 902 ++++ web_app/src/lib/types.ts | 9 + web_app/src/lib/utils.ts | 133 + web_app/src/main.tsx | 16 + web_app/src/vite-env.d.ts | 1 + web_app/tailwind.config.js | 76 + web_app/tsconfig.json | 32 + web_app/tsconfig.node.json | 10 + web_app/vite.config.ts | 12 + 51 files changed, 11603 insertions(+) create mode 100644 web_app/.eslintrc.cjs create mode 100644 web_app/.gitignore create mode 100644 web_app/README.md create mode 100644 web_app/components.json create mode 100644 web_app/index.html create mode 100644 web_app/package-lock.json create mode 100644 web_app/package.json create mode 100644 web_app/postcss.config.js create mode 100644 web_app/src/App.tsx create mode 100644 web_app/src/components/Editor.tsx create mode 100644 web_app/src/components/FileManager.tsx create mode 100644 web_app/src/components/FileSelect.tsx create mode 100644 web_app/src/components/Header.tsx create mode 100644 web_app/src/components/PromptInput.tsx create mode 100644 web_app/src/components/Shortcuts.tsx create mode 100644 web_app/src/components/Workspace.tsx create mode 100644 web_app/src/components/theme-provider.tsx create mode 100644 web_app/src/components/ui/accordion.tsx create mode 100644 web_app/src/components/ui/button.tsx create mode 100644 web_app/src/components/ui/dialog.tsx create mode 100644 web_app/src/components/ui/input.tsx create mode 100644 web_app/src/components/ui/label.tsx create mode 100644 web_app/src/components/ui/popover.tsx create mode 100644 web_app/src/components/ui/scroll-area.tsx create mode 100644 web_app/src/components/ui/select.tsx create mode 100644 web_app/src/components/ui/slider.tsx create mode 100644 web_app/src/components/ui/switch.tsx create mode 100644 web_app/src/components/ui/tabs.tsx create mode 100644 web_app/src/components/ui/textarea.tsx create mode 100644 web_app/src/components/ui/toast.tsx create mode 100644 web_app/src/components/ui/toaster.tsx create mode 100644 web_app/src/components/ui/toggle.tsx create mode 100644 web_app/src/components/ui/tooltip.tsx create mode 100644 web_app/src/components/ui/use-toast.ts create mode 100644 web_app/src/globals.css create mode 100644 web_app/src/hooks/useAsyncMemo.tsx create mode 100644 web_app/src/hooks/useHotkey.tsx create mode 100644 web_app/src/hooks/useImage.tsx create mode 100644 web_app/src/hooks/useInputImage.tsx create mode 100644 web_app/src/hooks/useResolution.tsx create mode 100644 web_app/src/lib/api.ts create mode 100644 web_app/src/lib/event.ts create mode 100644 web_app/src/lib/store.ts create mode 100644 web_app/src/lib/types.ts create mode 100644 web_app/src/lib/utils.ts create mode 100644 web_app/src/main.tsx create mode 100644 web_app/src/vite-env.d.ts create mode 100644 web_app/tailwind.config.js create mode 100644 web_app/tsconfig.json create mode 100644 web_app/tsconfig.node.json create mode 100644 web_app/vite.config.ts diff --git a/web_app/.eslintrc.cjs b/web_app/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/web_app/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/web_app/.gitignore b/web_app/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/web_app/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/web_app/README.md b/web_app/README.md new file mode 100644 index 0000000..0d6babe --- /dev/null +++ b/web_app/README.md @@ -0,0 +1,30 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/web_app/components.json b/web_app/components.json new file mode 100644 index 0000000..0cc3425 --- /dev/null +++ b/web_app/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "app/globals.css", + "baseColor": "gray", + "cssVariables": true + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/web_app/index.html b/web_app/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/web_app/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/web_app/package-lock.json b/web_app/package-lock.json new file mode 100644 index 0000000..90627ca --- /dev/null +++ b/web_app/package-lock.json @@ -0,0 +1,5775 @@ +{ + "name": "web_app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web_app", + "version": "0.0.0", + "dependencies": { + "@heroicons/react": "^2.0.18", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-scroll-area": "^1.0.5", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slider": "^1.1.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@radix-ui/react-toggle": "^1.0.3", + "@radix-ui/react-tooltip": "^1.0.7", + "@uidotdev/usehooks": "^2.4.1", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "flexsearch": "^0.7.21", + "lodash": "^4.17.21", + "lucide-react": "^0.292.0", + "mitt": "^3.0.1", + "next-themes": "^0.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hotkeys-hook": "^4.4.1", + "react-photo-album": "^2.3.0", + "react-use": "^17.4.0", + "react-zoom-pan-pinch": "^3.3.0", + "recoil": "^0.7.7", + "tailwind-merge": "^2.0.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@types/flexsearch": "^0.7.3", + "@types/lodash": "^4.14.201", + "@types/node": "^20.9.2", + "@types/react": "^18.2.37", + "@types/react-dom": "^18.2.15", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "@vitejs/plugin-react": "^4.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.16", + "eslint": "^8.53.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.4", + "postcss": "^8.4.31", + "tailwindcss": "^3.3.5", + "typescript": "^5.2.2", + "vite": "^5.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.6.tgz", + "integrity": "sha512-muPzBqXJKCbMYoNbb1JpZh/ynl0xS6/+pLjrofcR3Nad82SbsCogYzUE6Aq9QT3cLP0jR/IVK/NHC9b90mSHtg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.6.tgz", + "integrity": "sha512-KQ/hbe9SJvIJ4sR+2PcZ41IBV+LPJyYp6V1K1P1xcMRup9iYsBoQn4MzE3mhMLOld27Au2eDcLlIREeKGUXpHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.6.tgz", + "integrity": "sha512-VVJVZQ7p5BBOKoNxd0Ly3xUM78Y4DyOoFKdkdAe2m11jbh0LEU4bPles4e/72EMl4tapko8o915UalN/5zhspg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.6.tgz", + "integrity": "sha512-91LoRp/uZAKx6ESNspL3I46ypwzdqyDLXZH7x2QYCLgtnaU08+AXEbabY2yExIz03/am0DivsTtbdxzGejfXpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.6.tgz", + "integrity": "sha512-QCGHw770ubjBU1J3ZkFJh671MFajGTYMZumPs9E/rqU52md6lIil97BR0CbPq6U+vTh3xnTNDHKRdR8ggHnmxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.6.tgz", + "integrity": "sha512-J53d0jGsDcLzWk9d9SPmlyF+wzVxjXpOH7jVW5ae7PvrDst4kiAz6sX+E8btz0GB6oH12zC+aHRD945jdjF2Vg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.6.tgz", + "integrity": "sha512-hn9qvkjHSIB5Z9JgCCjED6YYVGCNpqB7dEGavBdG6EjBD8S/UcNUIlGcB35NCkMETkdYwfZSvD9VoDJX6VeUVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.6.tgz", + "integrity": "sha512-G8IR5zFgpXad/Zp7gr7ZyTKyqZuThU6z1JjmRyN1vSF8j0bOlGzUwFSMTbctLAdd7QHpeyu0cRiuKrqK1ZTwvQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.6.tgz", + "integrity": "sha512-HQCOrk9XlH3KngASLaBfHpcoYEGUt829A9MyxaI8RMkfRA8SakG6YQEITAuwmtzFdEu5GU4eyhKcpv27dFaOBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.6.tgz", + "integrity": "sha512-22eOR08zL/OXkmEhxOfshfOGo8P69k8oKHkwkDrUlcB12S/sw/+COM4PhAPT0cAYW/gpqY2uXp3TpjQVJitz7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.6.tgz", + "integrity": "sha512-82RvaYAh/SUJyjWA8jDpyZCHQjmEggL//sC7F3VKYcBMumQjUL3C5WDl/tJpEiKtt7XrWmgjaLkrk205zfvwTA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.6.tgz", + "integrity": "sha512-8tvnwyYJpR618vboIv2l8tK2SuK/RqUIGMfMENkeDGo3hsEIrpGldMGYFcWxWeEILe5Fi72zoXLmhZ7PR23oQA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.6.tgz", + "integrity": "sha512-Qt+D7xiPajxVNk5tQiEJwhmarNnLPdjXAoA5uWMpbfStZB0+YU6a3CtbWYSy+sgAsnyx4IGZjWsTzBzrvg/fMA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.6.tgz", + "integrity": "sha512-lxRdk0iJ9CWYDH1Wpnnnc640ajF4RmQ+w6oHFZmAIYu577meE9Ka/DCtpOrwr9McMY11ocbp4jirgGgCi7Ls/g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.6.tgz", + "integrity": "sha512-MopyYV39vnfuykHanRWHGRcRC3AwU7b0QY4TI8ISLfAGfK+tMkXyFuyT1epw/lM0pflQlS53JoD22yN83DHZgA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.6.tgz", + "integrity": "sha512-UWcieaBzsN8WYbzFF5Jq7QULETPcQvlX7KL4xWGIB54OknXJjBO37sPqk7N82WU13JGWvmDzFBi1weVBajPovg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.6.tgz", + "integrity": "sha512-EpWiLX0fzvZn1wxtLxZrEW+oQED9Pwpnh+w4Ffv8ZLuMhUoqR9q9rL4+qHW8F4Mg5oQEKxAoT0G+8JYNqCiR6g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.6.tgz", + "integrity": "sha512-fFqTVEktM1PGs2sLKH4M5mhAVEzGpeZJuasAMRnvDZNCV0Cjvm1Hu35moL2vC0DOrAQjNTvj4zWrol/lwQ8Deg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.6.tgz", + "integrity": "sha512-M+XIAnBpaNvaVAhbe3uBXtgWyWynSdlww/JNZws0FlMPSBy+EpatPXNIlKAdtbFVII9OpX91ZfMb17TU3JKTBA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.6.tgz", + "integrity": "sha512-2DchFXn7vp/B6Tc2eKdTsLzE0ygqKkNUhUBCNtMx2Llk4POIVMUq5rUYjdcedFlGLeRe1uLCpVvCmE+G8XYybA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.6.tgz", + "integrity": "sha512-PBo/HPDQllyWdjwAVX+Gl2hH0dfBydL97BAH/grHKC8fubqp02aL4S63otZ25q3sBdINtOBbz1qTZQfXbP4VBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.6.tgz", + "integrity": "sha512-OE7yIdbDif2kKfrGa+V0vx/B3FJv2L4KnIiLlvtibPyO9UkgO3rzYE0HhpREo2vmJ1Ixq1zwm9/0er+3VOSZJA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "node_modules/@heroicons/react": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz", + "integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==", + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.3.tgz", + "integrity": "sha512-7xRqh9nMvP5xrW4/+L0jgRRX+HoNRGnfJpD+5Wq6/13j3dsdzxO3BCXn7D3hMqsDb+vjZnJq+vI7+EtgrYZTeA==", + "peer": true + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.3.tgz", + "integrity": "sha512-64JbSvi3nbbcEtyitNn2LEDS/hcleAFpHdykpcnrstITFlzFgB/bW0ER5/SJJwUPj+ZPY+z3e+1jAfcczRLVGw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.3.tgz", + "integrity": "sha512-RkTf+KbAD0SgYdVn1XzqE/+sIxYGB7NLMZRn9I4Z24afrhUpVJx6L8hsRnIwxz3ERE2NFURNliPjJ2QNfnWicQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.3.tgz", + "integrity": "sha512-3tBWGgz7M9RKLO6sPWC6c4pAw4geujSwQ7q7Si4d6bo0l6cLs4tmO+lnSwFp1Tm3lxwfMk0SgkJT7EdwYSJvcg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.3.tgz", + "integrity": "sha512-v0v8Kb8j8T23jvVUWZeA2D8+izWspeyeDGNaT2/mTHWp7+37fiNfL8bmBWiOmeumXkacM/AB0XOUQvEbncSnHA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.3.tgz", + "integrity": "sha512-VM1aE1tJKLBwMGtyBR21yy+STfl0MapMQnNrXkxeyLs0GFv/kZqXS5Jw/TQ3TSUnbv0QPDf/X8sDXuMtSgG6eg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.3.tgz", + "integrity": "sha512-64EnmKy18MYFL5CzLaSuUn561hbO1Gk16jM/KHznYP3iCIfF9e3yULtHaMy0D8zbHfxset9LTOv6cuYKJgcOxg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.3.tgz", + "integrity": "sha512-WRDp8QrmsL1bbGtsh5GqQ/KWulmrnMBgbnb+59qNTW1kVi1nG/2ndZLkcbs2GX7NpFLlToLRMWSQXmPzQm4tog==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.3.tgz", + "integrity": "sha512-EKffQeqCrj+t6qFFhIFTRoqb2QwX1mU7iTOvMyLbYw3QtqTw9sMwjykyiMlZlrfm2a4fA84+/aeW+PMg1MjuTg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.3.tgz", + "integrity": "sha512-ERhKPSJ1vQrPiwrs15Pjz/rvDHZmkmvbf/BjPN/UCOI++ODftT0GtasDPi0j+y6PPJi5HsXw+dpRaXUaw4vjuQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", + "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz", + "integrity": "sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collapsible": "1.0.3", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", + "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", + "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-icons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", + "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x" + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz", + "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", + "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", + "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", + "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz", + "integrity": "sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.0.0.tgz", + "integrity": "sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.1.2.tgz", + "integrity": "sha512-NKs15MJylfzVsCagVSWKhGGLNR1W9qWs+HtgbmjjVUB3B9+lb3PYoXxVju3kOrpf0VKyVCtZp+iTwVoqpa1Chw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-use-size": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.0.3.tgz", + "integrity": "sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-use-size": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", + "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.5.tgz", + "integrity": "sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", + "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz", + "integrity": "sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", + "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", + "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", + "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", + "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", + "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.0.tgz", + "integrity": "sha512-OINaBGY+Wc++U0rdr7BLuFClxcoWaVW3vQYqmQq6B3bqQ/2olkaoz+K8+af/Mmka/C2yN5j+L9scBkv4BtKsDA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.5.0.tgz", + "integrity": "sha512-UdMf1pOQc4ZmUA/NTmKhgJTBimbSKnhPS2zJqucqFyBRFPnPDtwA8MzrGNTjDeQbIAWfpJVAlxejw+/lQyBK/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.5.0.tgz", + "integrity": "sha512-L0/CA5p/idVKI+c9PcAPGorH6CwXn6+J0Ys7Gg1axCbTPgI8MeMlhA6fLM9fK+ssFhqogMHFC8HDvZuetOii7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.5.0.tgz", + "integrity": "sha512-QZCbVqU26mNlLn8zi/XDDquNmvcr4ON5FYAHQQsyhrHx8q+sQi/6xduoznYXwk/KmKIXG5dLfR0CvY+NAWpFYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.5.0.tgz", + "integrity": "sha512-VpSQ+xm93AeV33QbYslgf44wc5eJGYfYitlQzAi3OObu9iwrGXEnmu5S3ilkqE3Pr/FkgOiJKV/2p0ewf4Hrtg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.5.0.tgz", + "integrity": "sha512-OrEyIfpxSsMal44JpEVx9AEcGpdBQG1ZuWISAanaQTSMeStBW+oHWwOkoqR54bw3x8heP8gBOyoJiGg+fLY8qQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.5.0.tgz", + "integrity": "sha512-1H7wBbQuE6igQdxMSTjtFfD+DGAudcYWhp106z/9zBA8OQhsJRnemO4XGavdzHpGhRtRxbgmUGdO3YQgrWf2RA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.5.0.tgz", + "integrity": "sha512-FVyFI13tXw5aE65sZdBpNjPVIi4Q5mARnL/39UIkxvSgRAIqCo5sCpCELk0JtXHGee2owZz5aNLbWNfBHzr71Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.5.0.tgz", + "integrity": "sha512-eBPYl2sLpH/o8qbSz6vPwWlDyThnQjJfcDOGFbNjmjb44XKC1F5dQfakOsADRVrXCNzM6ZsSIPDG5dc6HHLNFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.5.0.tgz", + "integrity": "sha512-xaOHIfLOZypoQ5U2I6rEaugS4IYtTgP030xzvrBf5js7p9WI9wik07iHmsKaej8Z83ZDxN5GyypfoyKV5O5TJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.5.0.tgz", + "integrity": "sha512-Al6quztQUrHwcOoU2TuFblUQ5L+/AmPBXFR6dUvyo4nRj2yQRK0WIUaGMF/uwKulvRcXkpHe3k9A8Vf93VDktA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.5.0.tgz", + "integrity": "sha512-8kdW+brNhI/NzJ4fxDufuJUjepzINqJKLGHuxyAtpPG9bMbn8P5mtaCcbOm0EzLJ+atg+kF9dwg8jpclkVqx5w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.96.tgz", + "integrity": "sha512-zwE3TLgoZwJfQygdv2SdCK9mRLYluwDOM53I+dT6Z5ZvrgVENmY3txvWDvduzkV+/8IuvrRbVezMpxcojadRdQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.1", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.96", + "@swc/core-darwin-x64": "1.3.96", + "@swc/core-linux-arm-gnueabihf": "1.3.96", + "@swc/core-linux-arm64-gnu": "1.3.96", + "@swc/core-linux-arm64-musl": "1.3.96", + "@swc/core-linux-x64-gnu": "1.3.96", + "@swc/core-linux-x64-musl": "1.3.96", + "@swc/core-win32-arm64-msvc": "1.3.96", + "@swc/core-win32-ia32-msvc": "1.3.96", + "@swc/core-win32-x64-msvc": "1.3.96" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.96.tgz", + "integrity": "sha512-8hzgXYVd85hfPh6mJ9yrG26rhgzCmcLO0h1TIl8U31hwmTbfZLzRitFQ/kqMJNbIBCwmNH1RU2QcJnL3d7f69A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.96.tgz", + "integrity": "sha512-mFp9GFfuPg+43vlAdQZl0WZpZSE8sEzqL7sr/7Reul5McUHP0BaLsEzwjvD035ESfkY8GBZdLpMinblIbFNljQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.96.tgz", + "integrity": "sha512-8UEKkYJP4c8YzYIY/LlbSo8z5Obj4hqcv/fUTHiEePiGsOddgGf7AWjh56u7IoN/0uEmEro59nc1ChFXqXSGyg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.96.tgz", + "integrity": "sha512-c/IiJ0s1y3Ymm2BTpyC/xr6gOvoqAVETrivVXHq68xgNms95luSpbYQ28rqaZC8bQC8M5zdXpSc0T8DJu8RJGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.96.tgz", + "integrity": "sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.96.tgz", + "integrity": "sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.96.tgz", + "integrity": "sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.96.tgz", + "integrity": "sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.96.tgz", + "integrity": "sha512-Far2hVFiwr+7VPCM2GxSmbh3ikTpM3pDombE+d69hkedvYHYZxtTF+2LTKl/sXtpbUnsoq7yV/32c9R/xaaWfw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.96.tgz", + "integrity": "sha512-4VbSAniIu0ikLf5mBX81FsljnfqjoVGleEkCQv4+zRlyZtO3FHoDPkeLVoy6WRlj7tyrRcfUJ4mDdPkbfTO14g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", + "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", + "dev": true + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/flexsearch": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@types/flexsearch/-/flexsearch-0.7.6.tgz", + "integrity": "sha512-H5IXcRn96/gaDmo+rDl2aJuIJsob8dgOXDqf8K0t8rWZd1AFNaaspmRsElESiU+EWE33qfbFPgI0OC/B1g9FCA==", + "dev": true + }, + "node_modules/@types/js-cookie": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", + "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.201", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", + "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", + "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.2.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", + "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.15.tgz", + "integrity": "sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==", + "devOptional": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz", + "integrity": "sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==", + "devOptional": true + }, + "node_modules/@types/semver": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", + "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/type-utils": "6.11.0", + "@typescript-eslint/utils": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", + "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", + "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", + "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/utils": "6.11.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", + "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", + "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", + "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", + "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@uidotdev/usehooks": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@uidotdev/usehooks/-/usehooks-2.4.1.tgz", + "integrity": "sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.0.tgz", + "integrity": "sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.4", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.5.0.tgz", + "integrity": "sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.96" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/@xobotyi/scrollbar-width": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==" + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "peer": true, + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001563", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", + "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "peer": true + }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.588", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.588.tgz", + "integrity": "sha512-soytjxwbgcCu7nh5Pf4S2/4wa6UIu+A3p03U2yVr53qGxi1/VTR3ENI+p50v+UxqqZAfl48j3z55ud7VHIOr9w==", + "dev": true + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/esbuild": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.6.tgz", + "integrity": "sha512-Xl7dntjA2OEIvpr9j0DVxxnog2fyTGnyVoQXAMQI6eR3mf9zCQds7VIKUDCotDgE/p4ncTgeRqgX8t5d6oP4Gw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.6", + "@esbuild/android-arm64": "0.19.6", + "@esbuild/android-x64": "0.19.6", + "@esbuild/darwin-arm64": "0.19.6", + "@esbuild/darwin-x64": "0.19.6", + "@esbuild/freebsd-arm64": "0.19.6", + "@esbuild/freebsd-x64": "0.19.6", + "@esbuild/linux-arm": "0.19.6", + "@esbuild/linux-arm64": "0.19.6", + "@esbuild/linux-ia32": "0.19.6", + "@esbuild/linux-loong64": "0.19.6", + "@esbuild/linux-mips64el": "0.19.6", + "@esbuild/linux-ppc64": "0.19.6", + "@esbuild/linux-riscv64": "0.19.6", + "@esbuild/linux-s390x": "0.19.6", + "@esbuild/linux-x64": "0.19.6", + "@esbuild/netbsd-x64": "0.19.6", + "@esbuild/openbsd-x64": "0.19.6", + "@esbuild/sunos-x64": "0.19.6", + "@esbuild/win32-arm64": "0.19.6", + "@esbuild/win32-ia32": "0.19.6", + "@esbuild/win32-x64": "0.19.6" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.4.tgz", + "integrity": "sha512-eD83+65e8YPVg6603Om2iCIwcQJf/y7++MWm4tACtEswFLYMwxwVWAfwN+e19f5Ad/FOyyNg9Dfi5lXhH3Y3rA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-loops": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz", + "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==" + }, + "node_modules/fast-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "node_modules/fastest-stable-stringify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/flexsearch": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.31.tgz", + "integrity": "sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==" + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true + }, + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "peer": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/hamt_plus": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", + "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inline-style-prefixer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.0.tgz", + "integrity": "sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==", + "dependencies": { + "css-in-js-utils": "^3.1.0", + "fast-loops": "^1.1.3" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lucide-react": { + "version": "0.292.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.292.0.tgz", + "integrity": "sha512-rRgUkpEHWpa5VCT66YscInCQmQuPCB1RFRzkkxMxg4b+jaL0V12E3riWWR2Sh5OIiUhCwGW/ZExuEO4Az32E6Q==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nano-css": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.4.0.tgz", + "integrity": "sha512-QIbVsMMMsC+RQKJPxFDM70kf31A/JxNLE0D9tX9nwq4tcigY/vpvOJKphcQo55/RbriTnFSgrGnFhb8Y/6hs5g==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "css-tree": "^1.1.2", + "csstype": "^3.1.2", + "fastest-stable-stringify": "^2.0.2", + "inline-style-prefixer": "^7.0.0", + "rtl-css-js": "^1.16.1", + "stacktrace-js": "^2.0.2", + "stylis": "^4.3.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/next": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/next/-/next-14.0.3.tgz", + "integrity": "sha512-AbYdRNfImBr3XGtvnwOxq8ekVCwbFTv/UJoLwmaX89nk9i051AEY4/HAWzU0YpaTDw8IofUpmuIlvzWF13jxIw==", + "peer": true, + "dependencies": { + "@next/env": "14.0.3", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.31", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.0.3", + "@next/swc-darwin-x64": "14.0.3", + "@next/swc-linux-arm64-gnu": "14.0.3", + "@next/swc-linux-arm64-musl": "14.0.3", + "@next/swc-linux-x64-gnu": "14.0.3", + "@next/swc-linux-x64-musl": "14.0.3", + "@next/swc-win32-arm64-msvc": "14.0.3", + "@next/swc-win32-ia32-msvc": "14.0.3", + "@next/swc-win32-x64-msvc": "14.0.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", + "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", + "peerDependencies": { + "next": "*", + "react": "*", + "react-dom": "*" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-hotkeys-hook": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.4.1.tgz", + "integrity": "sha512-sClBMBioFEgFGYLTWWRKvhxcCx1DRznd+wkFHwQZspnRBkHTgruKIHptlK/U/2DPX8BhHoRGzpMVWUXMmdZlmw==", + "peerDependencies": { + "react": ">=16.8.1", + "react-dom": ">=16.8.1" + } + }, + "node_modules/react-photo-album": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-photo-album/-/react-photo-album-2.3.0.tgz", + "integrity": "sha512-CU+UMK4ZQHIoPZ672TSst9loKE5bxy6w0+bf7bY4XOw1g1C7+VdDWCW+wD8wPpbg2ve38QBTS73HVe6xYLAQ3w==", + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "peerDependencies": { + "react": "*", + "tslib": "*" + } + }, + "node_modules/react-use": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.0.tgz", + "integrity": "sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==", + "dependencies": { + "@types/js-cookie": "^2.2.6", + "@xobotyi/scrollbar-width": "^1.9.5", + "copy-to-clipboard": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.3.1", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.1.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^3.0.1", + "ts-easing": "^0.2.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-zoom-pan-pinch": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.3.0.tgz", + "integrity": "sha512-vy1h8aenDzXye+HRqANZaSA8IPHoqOiuDPFBkswoyPUH8uMfsmbeH6gFI4r4BhEJa0xIlcA+FbvhidRWKGUrOg==", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recoil": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz", + "integrity": "sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ==", + "dependencies": { + "hamt_plus": "1.0.2" + }, + "peerDependencies": { + "react": ">=16.13.1" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.5.0.tgz", + "integrity": "sha512-41xsWhzxqjMDASCxH5ibw1mXk+3c4TNI2UjKbLxe6iEzrSQnqOzmmK8/3mufCPbzHNJ2e04Fc1ddI35hHy+8zg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.5.0", + "@rollup/rollup-android-arm64": "4.5.0", + "@rollup/rollup-darwin-arm64": "4.5.0", + "@rollup/rollup-darwin-x64": "4.5.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.5.0", + "@rollup/rollup-linux-arm64-gnu": "4.5.0", + "@rollup/rollup-linux-arm64-musl": "4.5.0", + "@rollup/rollup-linux-x64-gnu": "4.5.0", + "@rollup/rollup-linux-x64-musl": "4.5.0", + "@rollup/rollup-win32-arm64-msvc": "4.5.0", + "@rollup/rollup-win32-ia32-msvc": "4.5.0", + "@rollup/rollup-win32-x64-msvc": "4.5.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "engines": { + "node": ">=6.9" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "peer": true, + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.0.0.tgz", + "integrity": "sha512-WO8qghn9yhsldLSg80au+3/gY9E4hFxIvQ3qOmlpXnqpDKoMruKfi/56BbbMg6fHTQJ9QD3cc79PoWqlaQE4rw==", + "dependencies": { + "@babel/runtime": "^7.23.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttle-debounce": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", + "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vite": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.0.tgz", + "integrity": "sha512-ESJVM59mdyGpsiNAeHQOR/0fqNoOyWPYesFto8FFZugfmhdHx8Fzd8sF3Q/xkVhZsyOxHfdM7ieiVAorI9RjFw==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.31", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/web_app/package.json b/web_app/package.json new file mode 100644 index 0000000..9ef38e3 --- /dev/null +++ b/web_app/package.json @@ -0,0 +1,65 @@ +{ + "name": "web_app", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@heroicons/react": "^2.0.18", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-scroll-area": "^1.0.5", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slider": "^1.1.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@radix-ui/react-toggle": "^1.0.3", + "@radix-ui/react-tooltip": "^1.0.7", + "@uidotdev/usehooks": "^2.4.1", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "flexsearch": "^0.7.21", + "lodash": "^4.17.21", + "lucide-react": "^0.292.0", + "mitt": "^3.0.1", + "next-themes": "^0.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hotkeys-hook": "^4.4.1", + "react-photo-album": "^2.3.0", + "react-use": "^17.4.0", + "react-zoom-pan-pinch": "^3.3.0", + "recoil": "^0.7.7", + "tailwind-merge": "^2.0.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@types/flexsearch": "^0.7.3", + "@types/lodash": "^4.14.201", + "@types/node": "^20.9.2", + "@types/react": "^18.2.37", + "@types/react-dom": "^18.2.15", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "@vitejs/plugin-react": "^4.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.16", + "eslint": "^8.53.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.4", + "postcss": "^8.4.31", + "tailwindcss": "^3.3.5", + "typescript": "^5.2.2", + "vite": "^5.0.0" + } +} diff --git a/web_app/postcss.config.js b/web_app/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/web_app/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/web_app/src/App.tsx b/web_app/src/App.tsx new file mode 100644 index 0000000..f845013 --- /dev/null +++ b/web_app/src/App.tsx @@ -0,0 +1,173 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from "react" +import { nanoid } from "nanoid" +import { useRecoilState, useSetRecoilState } from "recoil" +import { fileState, serverConfigState } from "@/lib/store" +import useInputImage from "@/hooks/useInputImage" +import { keepGUIAlive } from "@/lib/utils" +import { getServerConfig, isDesktop } from "@/lib/api" +import Header from "@/components/Header" +import Workspace from "@/components/Workspace" +import FileSelect from "@/components/FileSelect" +import { Toaster } from "./components/ui/toaster" + +const SUPPORTED_FILE_TYPE = [ + "image/jpeg", + "image/png", + "image/webp", + "image/bmp", + "image/tiff", +] +function Home() { + const [file, setFile] = useRecoilState(fileState) + const userInputImage = useInputImage() + const setServerConfigState = useSetRecoilState(serverConfigState) + + // Set Input Image + useEffect(() => { + setFile(userInputImage) + }, [userInputImage, setFile]) + + // Keeping GUI Window Open + useEffect(() => { + const fetchData = async () => { + const isRunDesktop = await isDesktop().then((res) => res.text()) + if (isRunDesktop === "True") { + keepGUIAlive() + } + } + fetchData() + }, []) + + useEffect(() => { + const fetchServerConfig = async () => { + const serverConfig = await getServerConfig().then((res) => res.json()) + console.log(serverConfig) + setServerConfigState(serverConfig) + } + fetchServerConfig() + }, []) + + const workspaceId = useMemo(() => { + return nanoid() + }, [file]) + + const [isDragging, setIsDragging] = useState(false) + const dragCounter = useRef(0) + + const handleDrag = useCallback((event: any) => { + event.preventDefault() + event.stopPropagation() + }, []) + + const handleDragIn = useCallback((event: any) => { + event.preventDefault() + event.stopPropagation() + dragCounter.current += 1 + if (event.dataTransfer.items && event.dataTransfer.items.length > 0) { + setIsDragging(true) + } + }, []) + + const handleDragOut = useCallback((event: any) => { + event.preventDefault() + event.stopPropagation() + dragCounter.current -= 1 + if (dragCounter.current > 0) return + setIsDragging(false) + }, []) + + const handleDrop = useCallback((event: any) => { + event.preventDefault() + event.stopPropagation() + setIsDragging(false) + if (event.dataTransfer.files && event.dataTransfer.files.length > 0) { + if (event.dataTransfer.files.length > 1) { + // setToastState({ + // open: true, + // desc: "Please drag and drop only one file", + // state: "error", + // duration: 3000, + // }) + } else { + const dragFile = event.dataTransfer.files[0] + const fileType = dragFile.type + if (SUPPORTED_FILE_TYPE.includes(fileType)) { + setFile(dragFile) + } else { + // setToastState({ + // open: true, + // desc: "Please drag and drop an image file", + // state: "error", + // duration: 3000, + // }) + } + } + event.dataTransfer.clearData() + } + }, []) + + const onPaste = useCallback((event: any) => { + // TODO: when sd side panel open, ctrl+v not work + // https://htmldom.dev/paste-an-image-from-the-clipboard/ + if (!event.clipboardData) { + return + } + const clipboardItems = event.clipboardData.items + const items: DataTransferItem[] = [].slice + .call(clipboardItems) + .filter((item: DataTransferItem) => { + // Filter the image items only + return item.type.indexOf("image") !== -1 + }) + + if (items.length === 0) { + return + } + + event.preventDefault() + event.stopPropagation() + + // TODO: add confirm dialog + + const item = items[0] + // Get the blob of image + const blob = item.getAsFile() + if (blob) { + setFile(blob) + } + }, []) + + useEffect(() => { + window.addEventListener("dragenter", handleDragIn) + window.addEventListener("dragleave", handleDragOut) + window.addEventListener("dragover", handleDrag) + window.addEventListener("drop", handleDrop) + window.addEventListener("paste", onPaste) + return function cleanUp() { + window.removeEventListener("dragenter", handleDragIn) + window.removeEventListener("dragleave", handleDragOut) + window.removeEventListener("dragover", handleDrag) + window.removeEventListener("drop", handleDrop) + window.removeEventListener("paste", onPaste) + } + }) + + return ( +
+ +
+ + {!file ? ( + { + setFile(f) + }} + /> + ) : ( + <> + )} +
+ ) +} + +export default Home diff --git a/web_app/src/components/Editor.tsx b/web_app/src/components/Editor.tsx new file mode 100644 index 0000000..2de8d1a --- /dev/null +++ b/web_app/src/components/Editor.tsx @@ -0,0 +1,1704 @@ +import React, { + SyntheticEvent, + useCallback, + useEffect, + useRef, + useState, +} from "react" +import { + CursorArrowRaysIcon, + ArrowsPointingOutIcon, + ArrowDownTrayIcon, +} from "@heroicons/react/24/outline" +import { + ReactZoomPanPinchRef, + TransformComponent, + TransformWrapper, +} from "react-zoom-pan-pinch" +import { useRecoilState, useRecoilValue, useSetRecoilState } from "recoil" +import { useWindowSize } from "react-use" +// import { useWindowSize, useKey, useKeyPressEvent } from "@uidotdev/usehooks" +import inpaint, { downloadToOutput, runPlugin } from "@/lib/api" +import { Button, IconButton } from "@/components/ui/button" +import { + askWritePermission, + copyCanvasImage, + downloadImage, + isMidClick, + isRightClick, + loadImage, + srcToFile, +} from "@/lib/utils" +import { Eraser, Eye, Redo, Undo } from "lucide-react" +import { + appState, + brushSizeState, + croperState, + enableFileManagerState, + fileState, + imageHeightState, + imageWidthState, + interactiveSegClicksState, + isDiffusionModelsState, + isEnableAutoSavingState, + isInpaintingState, + isInteractiveSegRunningState, + isInteractiveSegState, + isPix2PixState, + isPluginRunningState, + isProcessingState, + negativePropmtState, + propmtState, + runManuallyState, + seedState, + settingState, + toastState, +} from "@/lib/store" +// import Croper from "../Croper/Croper" +import emitter, { + EVENT_PROMPT, + EVENT_CUSTOM_MASK, + EVENT_PAINT_BY_EXAMPLE, + RERUN_LAST_MASK, + DREAM_BUTTON_MOUSE_ENTER, + DREAM_BUTTON_MOUSE_LEAVE, +} from "@/lib/event" +import { useImage } from "@/hooks/useImage" +import { Slider } from "./ui/slider" +// import FileSelect from "../FileSelect/FileSelect" +// import InteractiveSeg from "../InteractiveSeg/InteractiveSeg" +// import InteractiveSegConfirmActions from "../InteractiveSeg/ConfirmActions" +// import InteractiveSegReplaceModal from "../InteractiveSeg/ReplaceModal" +import { PluginName } from "@/lib/types" +import { useHotkeys } from "react-hotkeys-hook" +// import MakeGIF from "./MakeGIF" + +const TOOLBAR_SIZE = 200 +const MIN_BRUSH_SIZE = 10 +const MAX_BRUSH_SIZE = 200 +const BRUSH_COLOR = "#ffcc00bb" + +interface Line { + size?: number + pts: { x: number; y: number }[] +} + +type LineGroup = Array + +function drawLines( + ctx: CanvasRenderingContext2D, + lines: LineGroup, + color = BRUSH_COLOR +) { + ctx.strokeStyle = color + ctx.lineCap = "round" + ctx.lineJoin = "round" + + lines.forEach((line) => { + if (!line?.pts.length || !line.size) { + return + } + ctx.lineWidth = line.size + ctx.beginPath() + ctx.moveTo(line.pts[0].x, line.pts[0].y) + line.pts.forEach((pt) => ctx.lineTo(pt.x, pt.y)) + ctx.stroke() + }) +} + +function mouseXY(ev: SyntheticEvent) { + const mouseEvent = ev.nativeEvent as MouseEvent + return { x: mouseEvent.offsetX, y: mouseEvent.offsetY } +} + +export default function Editor() { + const [file, setFile] = useRecoilState(fileState) + const promptVal = useRecoilValue(propmtState) + const negativePromptVal = useRecoilValue(negativePropmtState) + const settings = useRecoilValue(settingState) + const [seedVal, setSeed] = useRecoilState(seedState) + const croperRect = useRecoilValue(croperState) + const setToastState = useSetRecoilState(toastState) + const [isInpainting, setIsInpainting] = useRecoilState(isInpaintingState) + const setIsPluginRunning = useSetRecoilState(isPluginRunningState) + const isProcessing = useRecoilValue(isProcessingState) + const runMannually = useRecoilValue(runManuallyState) + const isDiffusionModels = useRecoilValue(isDiffusionModelsState) + const isPix2Pix = useRecoilValue(isPix2PixState) + const [isInteractiveSeg, setIsInteractiveSeg] = useRecoilState( + isInteractiveSegState + ) + const setIsInteractiveSegRunning = useSetRecoilState( + isInteractiveSegRunningState + ) + + const [showInteractiveSegModal, setShowInteractiveSegModal] = useState(false) + const [interactiveSegMask, setInteractiveSegMask] = useState< + HTMLImageElement | null | undefined + >(null) + // only used while interactive segmentation is on + const [tmpInteractiveSegMask, setTmpInteractiveSegMask] = useState< + HTMLImageElement | null | undefined + >(null) + const [prevInteractiveSegMask, setPrevInteractiveSegMask] = useState< + HTMLImageElement | null | undefined + >(null) + + // 仅用于在 dream button hover 时显示提示 + const [dreamButtonHoverSegMask, setDreamButtonHoverSegMask] = useState< + HTMLImageElement | null | undefined + >(null) + const [dreamButtonHoverLineGroup, setDreamButtonHoverLineGroup] = + useState([]) + + const [clicks, setClicks] = useRecoilState(interactiveSegClicksState) + + const [brushSize, setBrushSize] = useRecoilState(brushSizeState) + + const [original, isOriginalLoaded] = useImage(file) + const [renders, setRenders] = useState([]) + const [context, setContext] = useState() + const [maskCanvas] = useState(() => { + return document.createElement("canvas") + }) + const [lineGroups, setLineGroups] = useState([]) + const [lastLineGroup, setLastLineGroup] = useState([]) + const [curLineGroup, setCurLineGroup] = useState([]) + const [{ x, y }, setCoords] = useState({ x: -1, y: -1 }) + const [showBrush, setShowBrush] = useState(false) + const [showRefBrush, setShowRefBrush] = useState(false) + const [isPanning, setIsPanning] = useState(false) + const [isChangingBrushSizeByMouse, setIsChangingBrushSizeByMouse] = + useState(false) + const [changeBrushSizeByMouseInit, setChangeBrushSizeByMouseInit] = useState({ + x: -1, + y: -1, + brushSize: 20, + }) + + const [showOriginal, setShowOriginal] = useState(false) + const [scale, setScale] = useState(1) + const [panned, setPanned] = useState(false) + const [minScale, setMinScale] = useState(1.0) + const windowSize = useWindowSize() + const windowCenterX = windowSize.width / 2 + const windowCenterY = windowSize.height / 2 + const viewportRef = useRef(null) + // Indicates that the image has been loaded and is centered on first load + const [initialCentered, setInitialCentered] = useState(false) + + const [isDraging, setIsDraging] = useState(false) + const [isMultiStrokeKeyPressed, setIsMultiStrokeKeyPressed] = useState(false) + + const [sliderPos, setSliderPos] = useState(0) + + // redo 相关 + const [redoRenders, setRedoRenders] = useState([]) + const [redoCurLines, setRedoCurLines] = useState([]) + const [redoLineGroups, setRedoLineGroups] = useState([]) + const enableFileManager = useRecoilValue(enableFileManagerState) + const isEnableAutoSaving = useRecoilValue(isEnableAutoSavingState) + + const [imageWidth, setImageWidth] = useRecoilState(imageWidthState) + const [imageHeight, setImageHeight] = useRecoilState(imageHeightState) + const app = useRecoilValue(appState) + + const draw = useCallback( + (render: HTMLImageElement, lineGroup: LineGroup) => { + if (!context) { + return + } + console.log( + `[draw] render size: ${render.width}x${render.height} image size: ${imageWidth}x${imageHeight} canvas size: ${context.canvas.width}x${context.canvas.height}` + ) + + context.clearRect(0, 0, context.canvas.width, context.canvas.height) + context.drawImage(render, 0, 0, imageWidth, imageHeight) + if (isInteractiveSeg && tmpInteractiveSegMask) { + context.drawImage(tmpInteractiveSegMask, 0, 0, imageWidth, imageHeight) + } + if (!isInteractiveSeg && interactiveSegMask) { + context.drawImage(interactiveSegMask, 0, 0, imageWidth, imageHeight) + } + if (dreamButtonHoverSegMask) { + context.drawImage( + dreamButtonHoverSegMask, + 0, + 0, + imageWidth, + imageHeight + ) + } + drawLines(context, lineGroup) + drawLines(context, dreamButtonHoverLineGroup) + }, + [ + context, + isInteractiveSeg, + tmpInteractiveSegMask, + dreamButtonHoverSegMask, + interactiveSegMask, + imageHeight, + imageWidth, + dreamButtonHoverLineGroup, + ] + ) + + const drawLinesOnMask = useCallback( + (_lineGroups: LineGroup[], maskImage?: HTMLImageElement | null) => { + if (!context?.canvas.width || !context?.canvas.height) { + throw new Error("canvas has invalid size") + } + maskCanvas.width = context?.canvas.width + maskCanvas.height = context?.canvas.height + const ctx = maskCanvas.getContext("2d") + if (!ctx) { + throw new Error("could not retrieve mask canvas") + } + + if (maskImage !== undefined && maskImage !== null) { + // TODO: check whether draw yellow mask works on backend + ctx.drawImage(maskImage, 0, 0, imageWidth, imageHeight) + } + + _lineGroups.forEach((lineGroup) => { + drawLines(ctx, lineGroup, "white") + }) + + if ( + (maskImage === undefined || maskImage === null) && + _lineGroups.length === 1 && + _lineGroups[0].length === 0 && + isPix2Pix + ) { + // For InstructPix2Pix without mask + drawLines( + ctx, + [ + { + size: 9999999999, + pts: [ + { x: 0, y: 0 }, + { x: imageWidth, y: 0 }, + { x: imageWidth, y: imageHeight }, + { x: 0, y: imageHeight }, + ], + }, + ], + "white" + ) + } + }, + [context, maskCanvas, isPix2Pix, imageWidth, imageHeight] + ) + + const hadDrawSomething = useCallback(() => { + if (isPix2Pix) { + return true + } + return curLineGroup.length !== 0 + }, [curLineGroup, isPix2Pix]) + + const drawOnCurrentRender = useCallback( + (lineGroup: LineGroup) => { + console.log("[drawOnCurrentRender] draw on current render") + if (renders.length === 0) { + draw(original, lineGroup) + } else { + draw(renders[renders.length - 1], lineGroup) + } + }, + [original, renders, draw] + ) + + const runInpainting = useCallback( + async ( + useLastLineGroup?: boolean, + customMask?: File, + maskImage?: HTMLImageElement | null, + paintByExampleImage?: File + ) => { + // customMask: mask uploaded by user + // maskImage: mask from interactive segmentation + if (file === undefined) { + return + } + const useCustomMask = customMask !== undefined && customMask !== null + const useMaskImage = maskImage !== undefined && maskImage !== null + // useLastLineGroup 的影响 + // 1. 使用上一次的 mask + // 2. 结果替换当前 render + console.log("runInpainting") + console.log({ + useCustomMask, + useMaskImage, + }) + + let maskLineGroup: LineGroup = [] + if (useLastLineGroup === true) { + if (lastLineGroup.length === 0) { + return + } + maskLineGroup = lastLineGroup + } else if (!useCustomMask) { + if (!hadDrawSomething() && !useMaskImage) { + return + } + + setLastLineGroup(curLineGroup) + maskLineGroup = curLineGroup + } + + const newLineGroups = [...lineGroups, maskLineGroup] + + setCurLineGroup([]) + setIsDraging(false) + setIsInpainting(true) + if (settings.graduallyInpainting) { + drawLinesOnMask([maskLineGroup], maskImage) + } else { + drawLinesOnMask(newLineGroups) + } + + let targetFile = file + if (settings.graduallyInpainting === true) { + if (useLastLineGroup === true) { + // renders.length == 1 还是用原来的 + if (renders.length > 1) { + const lastRender = renders[renders.length - 2] + targetFile = await srcToFile( + lastRender.currentSrc, + file.name, + file.type + ) + } + } else if (renders.length > 0) { + console.info("gradually inpainting on last result") + + const lastRender = renders[renders.length - 1] + targetFile = await srcToFile( + lastRender.currentSrc, + file.name, + file.type + ) + } + } + + try { + console.log("before run inpaint") + const res = await inpaint( + targetFile, + settings, + croperRect, + promptVal, + negativePromptVal, + seedVal, + useCustomMask ? undefined : maskCanvas.toDataURL(), + useCustomMask ? customMask : undefined, + paintByExampleImage + ) + if (!res) { + throw new Error("Something went wrong on server side.") + } + const { blob, seed } = res + if (seed) { + setSeed(parseInt(seed, 10)) + } + const newRender = new Image() + await loadImage(newRender, blob) + + if (useLastLineGroup === true) { + const prevRenders = renders.slice(0, -1) + const newRenders = [...prevRenders, newRender] + setRenders(newRenders) + } else { + const newRenders = [...renders, newRender] + setRenders(newRenders) + } + + draw(newRender, []) + // Only append new LineGroup after inpainting success + setLineGroups(newLineGroups) + + // clear redo stack + resetRedoState() + } catch (e: any) { + setToastState({ + open: true, + desc: e.message ? e.message : e.toString(), + state: "error", + duration: 4000, + }) + drawOnCurrentRender([]) + } + setIsInpainting(false) + setPrevInteractiveSegMask(maskImage) + setTmpInteractiveSegMask(null) + setInteractiveSegMask(null) + }, + [ + lineGroups, + curLineGroup, + maskCanvas, + settings.graduallyInpainting, + settings, + croperRect, + promptVal, + negativePromptVal, + drawOnCurrentRender, + hadDrawSomething, + drawLinesOnMask, + seedVal, + ] + ) + + useEffect(() => { + emitter.on(EVENT_PROMPT, () => { + if (hadDrawSomething() || interactiveSegMask) { + runInpainting(false, undefined, interactiveSegMask) + } else if (lastLineGroup.length !== 0) { + // 使用上一次手绘的 mask 生成 + runInpainting(true, undefined, prevInteractiveSegMask) + } else if (prevInteractiveSegMask) { + // 使用上一次 IS 的 mask 生成 + runInpainting(false, undefined, prevInteractiveSegMask) + } else if (isPix2Pix) { + runInpainting(false, undefined, null) + } else { + setToastState({ + open: true, + desc: "Please draw mask on picture", + state: "error", + duration: 1500, + }) + } + emitter.emit(DREAM_BUTTON_MOUSE_LEAVE) + }) + + return () => { + emitter.off(EVENT_PROMPT) + } + }, [ + hadDrawSomething, + runInpainting, + promptVal, + interactiveSegMask, + prevInteractiveSegMask, + ]) + + useEffect(() => { + emitter.on(DREAM_BUTTON_MOUSE_ENTER, () => { + // 当前 canvas 上没有手绘 mask 或者 interactiveSegMask 时,显示上一次的 mask + if (!hadDrawSomething() && !interactiveSegMask) { + if (prevInteractiveSegMask) { + setDreamButtonHoverSegMask(prevInteractiveSegMask) + } + let lineGroup2Show: LineGroup = [] + if (redoLineGroups.length !== 0) { + lineGroup2Show = redoLineGroups[redoLineGroups.length - 1] + } else if (lineGroups.length !== 0) { + lineGroup2Show = lineGroups[lineGroups.length - 1] + } + console.log( + `[DREAM_BUTTON_MOUSE_ENTER], prevInteractiveSegMask: ${prevInteractiveSegMask} lineGroup2Show: ${lineGroup2Show.length}` + ) + if (lineGroup2Show) { + setDreamButtonHoverLineGroup(lineGroup2Show) + } + } + }) + return () => { + emitter.off(DREAM_BUTTON_MOUSE_ENTER) + } + }, [ + hadDrawSomething, + interactiveSegMask, + prevInteractiveSegMask, + drawOnCurrentRender, + lineGroups, + redoLineGroups, + ]) + + useEffect(() => { + emitter.on(DREAM_BUTTON_MOUSE_LEAVE, () => { + // 当前 canvas 上没有手绘 mask 或者 interactiveSegMask 时,显示上一次的 mask + if (!hadDrawSomething() && !interactiveSegMask) { + setDreamButtonHoverSegMask(null) + setDreamButtonHoverLineGroup([]) + drawOnCurrentRender([]) + } + }) + return () => { + emitter.off(DREAM_BUTTON_MOUSE_LEAVE) + } + }, [hadDrawSomething, interactiveSegMask, drawOnCurrentRender]) + + useEffect(() => { + emitter.on(EVENT_CUSTOM_MASK, (data: any) => { + // TODO: not work with paint by example + runInpainting(false, data.mask) + }) + + return () => { + emitter.off(EVENT_CUSTOM_MASK) + } + }, [runInpainting]) + + useEffect(() => { + emitter.on(EVENT_PAINT_BY_EXAMPLE, (data: any) => { + if (hadDrawSomething() || interactiveSegMask) { + runInpainting(false, undefined, interactiveSegMask, data.image) + } else if (lastLineGroup.length !== 0) { + // 使用上一次手绘的 mask 生成 + runInpainting(true, undefined, prevInteractiveSegMask, data.image) + } else if (prevInteractiveSegMask) { + // 使用上一次 IS 的 mask 生成 + runInpainting(false, undefined, prevInteractiveSegMask, data.image) + } else { + setToastState({ + open: true, + desc: "Please draw mask on picture", + state: "error", + duration: 1500, + }) + } + }) + + return () => { + emitter.off(EVENT_PAINT_BY_EXAMPLE) + } + }, [runInpainting]) + + useEffect(() => { + emitter.on(RERUN_LAST_MASK, () => { + if (lastLineGroup.length !== 0) { + // 使用上一次手绘的 mask 生成 + runInpainting(true, undefined, prevInteractiveSegMask) + } else if (prevInteractiveSegMask) { + // 使用上一次 IS 的 mask 生成 + runInpainting(false, undefined, prevInteractiveSegMask) + } else { + setToastState({ + open: true, + desc: "No mask to reuse", + state: "error", + duration: 1500, + }) + } + }) + return () => { + emitter.off(RERUN_LAST_MASK) + } + }, [runInpainting]) + + const getCurrentRender = useCallback(async () => { + let targetFile = file + if (renders.length > 0) { + const lastRender = renders[renders.length - 1] + targetFile = await srcToFile(lastRender.currentSrc, file.name, file.type) + } + return targetFile + }, [file, renders]) + + useEffect(() => { + emitter.on(PluginName.InteractiveSeg, () => { + setIsInteractiveSeg(true) + if (interactiveSegMask !== null) { + setShowInteractiveSegModal(true) + } + }) + return () => { + emitter.off(PluginName.InteractiveSeg) + } + }) + + const runRenderablePlugin = useCallback( + async (name: string, data?: any) => { + if (isProcessing) { + return + } + try { + // TODO 要不要加 undoCurrentLine?? + const start = new Date() + setIsPluginRunning(true) + const targetFile = await getCurrentRender() + const res = await runPlugin(name, targetFile, data?.upscale) + if (!res) { + throw new Error("Something went wrong on server side.") + } + const { blob } = res + const newRender = new Image() + await loadImage(newRender, blob) + setImageHeight(newRender.height) + setImageWidth(newRender.width) + const newRenders = [...renders, newRender] + setRenders(newRenders) + const newLineGroups = [...lineGroups, []] + setLineGroups(newLineGroups) + + const end = new Date() + const time = end.getTime() - start.getTime() + + setToastState({ + open: true, + desc: `Run ${name} successfully in ${time / 1000}s`, + state: "success", + duration: 3000, + }) + + const rW = windowSize.width / newRender.width + const rH = (windowSize.height - TOOLBAR_SIZE) / newRender.height + let s = 1.0 + if (rW < 1 || rH < 1) { + s = Math.min(rW, rH) + } + setMinScale(s) + setScale(s) + viewportRef.current?.centerView(s, 1) + } catch (e: any) { + setToastState({ + open: true, + desc: e.message ? e.message : e.toString(), + state: "error", + duration: 3000, + }) + } finally { + setIsPluginRunning(false) + } + }, + [ + renders, + setRenders, + getCurrentRender, + setIsPluginRunning, + isProcessing, + setImageHeight, + setImageWidth, + lineGroups, + viewportRef, + windowSize, + setLineGroups, + ] + ) + + useEffect(() => { + emitter.on(PluginName.RemoveBG, () => { + runRenderablePlugin(PluginName.RemoveBG) + }) + return () => { + emitter.off(PluginName.RemoveBG) + } + }, [runRenderablePlugin]) + + useEffect(() => { + emitter.on(PluginName.AnimeSeg, () => { + runRenderablePlugin(PluginName.AnimeSeg) + }) + return () => { + emitter.off(PluginName.AnimeSeg) + } + }, [runRenderablePlugin]) + + useEffect(() => { + emitter.on(PluginName.GFPGAN, () => { + runRenderablePlugin(PluginName.GFPGAN) + }) + return () => { + emitter.off(PluginName.GFPGAN) + } + }, [runRenderablePlugin]) + + useEffect(() => { + emitter.on(PluginName.RestoreFormer, () => { + runRenderablePlugin(PluginName.RestoreFormer) + }) + return () => { + emitter.off(PluginName.RestoreFormer) + } + }, [runRenderablePlugin]) + + useEffect(() => { + emitter.on(PluginName.RealESRGAN, (data: any) => { + runRenderablePlugin(PluginName.RealESRGAN, data) + }) + return () => { + emitter.off(PluginName.RealESRGAN) + } + }, [runRenderablePlugin]) + + const hadRunInpainting = () => { + return renders.length !== 0 + } + + const getCurrentWidthHeight = useCallback(() => { + let width = 512 + let height = 512 + if (!isOriginalLoaded) { + return [width, height] + } + if (renders.length === 0) { + width = original.naturalWidth + height = original.naturalHeight + } else if (renders.length !== 0) { + width = renders[renders.length - 1].width + height = renders[renders.length - 1].height + } + + return [width, height] + }, [original, isOriginalLoaded, renders]) + + // Draw once the original image is loaded + useEffect(() => { + if (!isOriginalLoaded) { + return + } + + const [width, height] = getCurrentWidthHeight() + setImageWidth(width) + setImageHeight(height) + + const rW = windowSize.width / width + const rH = (windowSize.height - TOOLBAR_SIZE) / height + + let s = 1.0 + if (rW < 1 || rH < 1) { + s = Math.min(rW, rH) + } + setMinScale(s) + setScale(s) + + console.log( + `[on file load] image size: ${width}x${height}, canvas size: ${context?.canvas.width}x${context?.canvas.height} scale: ${s}, initialCentered: ${initialCentered}` + ) + + if (context?.canvas) { + context.canvas.width = width + context.canvas.height = height + console.log("[on file load] set canvas size && drawOnCurrentRender") + drawOnCurrentRender([]) + } + + if (!initialCentered) { + // 防止每次擦除以后图片 zoom 还原 + viewportRef.current?.centerView(s, 1) + console.log("[on file load] centerView") + setInitialCentered(true) + } + }, [ + // context?.canvas, + viewportRef, + original, + isOriginalLoaded, + windowSize, + initialCentered, + drawOnCurrentRender, + getCurrentWidthHeight, + ]) + + useEffect(() => { + console.log("[useEffect] centerView") + // render 改变尺寸以后,undo/redo 重新 center + viewportRef?.current?.centerView(minScale, 1) + }, [context?.canvas.height, context?.canvas.width, viewportRef, minScale]) + + // Zoom reset + const resetZoom = useCallback(() => { + if (!minScale || !windowSize) { + return + } + const viewport = viewportRef.current + if (!viewport) { + return + } + const offsetX = (windowSize.width - imageWidth * minScale) / 2 + const offsetY = (windowSize.height - imageHeight * minScale) / 2 + viewport.setTransform(offsetX, offsetY, minScale, 200, "easeOutQuad") + if (viewport.state) { + viewport.state.scale = minScale + } + + setScale(minScale) + setPanned(false) + }, [ + viewportRef, + windowSize, + imageHeight, + imageWidth, + windowSize.height, + minScale, + ]) + + const resetRedoState = () => { + setRedoCurLines([]) + setRedoLineGroups([]) + setRedoRenders([]) + } + + useEffect(() => { + window.addEventListener("resize", () => { + resetZoom() + }) + return () => { + window.removeEventListener("resize", () => { + resetZoom() + }) + } + }, [windowSize, resetZoom]) + + useEffect(() => { + window.addEventListener("blur", () => { + setIsChangingBrushSizeByMouse(false) + }) + return () => { + window.removeEventListener("blur", () => { + setIsChangingBrushSizeByMouse(false) + }) + } + }, []) + + const onInteractiveCancel = useCallback(() => { + setIsInteractiveSeg(false) + setIsInteractiveSegRunning(false) + setClicks([]) + setTmpInteractiveSegMask(null) + }, []) + + const handleEscPressed = () => { + if (isProcessing) { + return + } + + if (isInteractiveSeg) { + onInteractiveCancel() + return + } + + if (isDraging || isMultiStrokeKeyPressed) { + setIsDraging(false) + setCurLineGroup([]) + drawOnCurrentRender([]) + } else { + resetZoom() + } + } + + useHotkeys("Escape", handleEscPressed, [ + isDraging, + isInpainting, + isMultiStrokeKeyPressed, + isInteractiveSeg, + onInteractiveCancel, + resetZoom, + drawOnCurrentRender, + ]) + + const onMouseMove = (ev: SyntheticEvent) => { + const mouseEvent = ev.nativeEvent as MouseEvent + setCoords({ x: mouseEvent.pageX, y: mouseEvent.pageY }) + } + + const onMouseDrag = (ev: SyntheticEvent) => { + if (isChangingBrushSizeByMouse) { + const initX = changeBrushSizeByMouseInit.x + // move right: increase brush size + const newSize = changeBrushSizeByMouseInit.brushSize + (x - initX) + if (newSize <= MAX_BRUSH_SIZE && newSize >= MIN_BRUSH_SIZE) { + setBrushSize(newSize) + } + return + } + if (isInteractiveSeg) { + return + } + if (isPanning) { + return + } + if (!isDraging) { + return + } + if (curLineGroup.length === 0) { + return + } + const lineGroup = [...curLineGroup] + lineGroup[lineGroup.length - 1].pts.push(mouseXY(ev)) + setCurLineGroup(lineGroup) + drawOnCurrentRender(lineGroup) + } + + const runInteractiveSeg = async (newClicks: number[][]) => { + if (!file) { + return + } + + setIsInteractiveSegRunning(true) + const targetFile = await getCurrentRender() + const prevMask = null + try { + const res = await runPlugin( + PluginName.InteractiveSeg, + targetFile, + undefined, + prevMask, + newClicks + ) + if (!res) { + throw new Error("Something went wrong on server side.") + } + const { blob } = res + const img = new Image() + img.onload = () => { + setTmpInteractiveSegMask(img) + } + img.src = blob + } catch (e: any) { + setToastState({ + open: true, + desc: e.message ? e.message : e.toString(), + state: "error", + duration: 4000, + }) + } + setIsInteractiveSegRunning(false) + } + + const onPointerUp = (ev: SyntheticEvent) => { + if (isMidClick(ev)) { + setIsPanning(false) + } + if (isInteractiveSeg) { + return + } + + if (isPanning) { + return + } + if (!original.src) { + return + } + const canvas = context?.canvas + if (!canvas) { + return + } + if (isInpainting) { + return + } + if (!isDraging) { + return + } + + if (isMultiStrokeKeyPressed) { + setIsDraging(false) + return + } + + if (runMannually) { + setIsDraging(false) + } else { + runInpainting() + } + } + + const isOutsideCroper = (clickPnt: { x: number; y: number }) => { + if (clickPnt.x < croperRect.x) { + return true + } + if (clickPnt.y < croperRect.y) { + return true + } + if (clickPnt.x > croperRect.x + croperRect.width) { + return true + } + if (clickPnt.y > croperRect.y + croperRect.height) { + return true + } + return false + } + + const onCanvasMouseUp = (ev: SyntheticEvent) => { + if (isInteractiveSeg) { + const xy = mouseXY(ev) + const isX = xy.x + const isY = xy.y + const newClicks: number[][] = [...clicks] + if (isRightClick(ev)) { + newClicks.push([isX, isY, 0, newClicks.length]) + } else { + newClicks.push([isX, isY, 1, newClicks.length]) + } + // runInteractiveSeg(newClicks) + setClicks(newClicks) + } + } + + const onMouseDown = (ev: SyntheticEvent) => { + if (isProcessing) { + return + } + if (isInteractiveSeg) { + return + } + if (isChangingBrushSizeByMouse) { + return + } + if (isPanning) { + return + } + if (!original.src) { + return + } + const canvas = context?.canvas + if (!canvas) { + return + } + + if (isRightClick(ev)) { + return + } + + if (isMidClick(ev)) { + setIsPanning(true) + return + } + + if ( + isDiffusionModels && + settings.showCroper && + isOutsideCroper(mouseXY(ev)) + ) { + return + } + + setIsDraging(true) + + let lineGroup: LineGroup = [] + if (isMultiStrokeKeyPressed || runMannually) { + lineGroup = [...curLineGroup] + } + lineGroup.push({ size: brushSize, pts: [mouseXY(ev)] }) + setCurLineGroup(lineGroup) + drawOnCurrentRender(lineGroup) + } + + const undoStroke = useCallback(() => { + if (curLineGroup.length === 0) { + return + } + setLastLineGroup([]) + + const lastLine = curLineGroup.pop()! + const newRedoCurLines = [...redoCurLines, lastLine] + setRedoCurLines(newRedoCurLines) + + const newLineGroup = [...curLineGroup] + setCurLineGroup(newLineGroup) + drawOnCurrentRender(newLineGroup) + }, [curLineGroup, redoCurLines, drawOnCurrentRender]) + + const undoRender = useCallback(() => { + if (!renders.length) { + return + } + + // save line Group + const latestLineGroup = lineGroups.pop()! + setRedoLineGroups([...redoLineGroups, latestLineGroup]) + // If render is undo, clear strokes + setRedoCurLines([]) + + setLineGroups([...lineGroups]) + setCurLineGroup([]) + setIsDraging(false) + + // save render + const lastRender = renders.pop()! + setRedoRenders([...redoRenders, lastRender]) + + const newRenders = [...renders] + setRenders(newRenders) + // if (newRenders.length === 0) { + // draw(original, []) + // } else { + // draw(newRenders[newRenders.length - 1], []) + // } + }, [ + draw, + renders, + redoRenders, + redoLineGroups, + lineGroups, + original, + context, + ]) + + const undo = () => { + // TODO: prevent default event + console.log("undo") + if (runMannually && curLineGroup.length !== 0) { + undoStroke() + } else { + undoRender() + } + } + + useHotkeys("meta+z,ctrl+z", undo, undefined, [ + undoStroke, + undoRender, + runMannually, + curLineGroup, + context?.canvas, + renders, + ]) + + const disableUndo = () => { + if (isProcessing) { + return true + } + if (renders.length > 0) { + return false + } + + if (runMannually) { + if (curLineGroup.length === 0) { + return true + } + } else if (renders.length === 0) { + return true + } + + return false + } + + const redoStroke = useCallback(() => { + if (redoCurLines.length === 0) { + return + } + const line = redoCurLines.pop()! + setRedoCurLines([...redoCurLines]) + + const newLineGroup = [...curLineGroup, line] + setCurLineGroup(newLineGroup) + drawOnCurrentRender(newLineGroup) + }, [curLineGroup, redoCurLines, drawOnCurrentRender]) + + const redoRender = useCallback(() => { + if (redoRenders.length === 0) { + return + } + const lineGroup = redoLineGroups.pop()! + setRedoLineGroups([...redoLineGroups]) + + setLineGroups([...lineGroups, lineGroup]) + setCurLineGroup([]) + setIsDraging(false) + + const render = redoRenders.pop()! + const newRenders = [...renders, render] + setRenders(newRenders) + // draw(newRenders[newRenders.length - 1], []) + }, [draw, renders, redoRenders, redoLineGroups, lineGroups, original]) + + const redo = () => { + if (runMannually && redoCurLines.length !== 0) { + redoStroke() + } else { + redoRender() + } + } + + // Handle Cmd+shift+Z + const redoPredicate = (event: KeyboardEvent) => { + const isCmdZ = + (event.metaKey || event.ctrlKey) && + event.shiftKey && + event.key.toLowerCase() === "z" + // Handle tab switch + if (event.key === "Tab") { + event.preventDefault() + } + if (isCmdZ) { + event.preventDefault() + return true + } + return false + } + + // useKey(redoPredicate, redo, undefined, [ + // redoStroke, + // redoRender, + // runMannually, + // redoCurLines, + // ]) + + const disableRedo = () => { + if (isProcessing) { + return true + } + if (redoRenders.length > 0) { + return false + } + + if (runMannually) { + if (redoCurLines.length === 0) { + return true + } + } else if (redoRenders.length === 0) { + return true + } + + return false + } + + // useKeyPressEvent( + // "Tab", + // (ev) => { + // ev?.preventDefault() + // ev?.stopPropagation() + // if (hadRunInpainting()) { + // setShowOriginal(() => { + // window.setTimeout(() => { + // setSliderPos(100) + // }, 10) + // return true + // }) + // } + // }, + // (ev) => { + // ev?.preventDefault() + // ev?.stopPropagation() + // if (hadRunInpainting()) { + // setSliderPos(0) + // window.setTimeout(() => { + // setShowOriginal(false) + // }, 350) + // } + // } + // ) + + function download() { + if (file === undefined) { + return + } + if ((enableFileManager || isEnableAutoSaving) && renders.length > 0) { + try { + downloadToOutput(renders[renders.length - 1], file.name, file.type) + setToastState({ + open: true, + desc: `Save image success`, + state: "success", + duration: 2000, + }) + } catch (e: any) { + setToastState({ + open: true, + desc: e.message ? e.message : e.toString(), + state: "error", + duration: 2000, + }) + } + return + } + + // TODO: download to output directory + const name = file.name.replace(/(\.[\w\d_-]+)$/i, "_cleanup$1") + const curRender = renders[renders.length - 1] + downloadImage(curRender.currentSrc, name) + if (settings.downloadMask) { + let maskFileName = file.name.replace(/(\.[\w\d_-]+)$/i, "_mask$1") + maskFileName = maskFileName.replace(/\.[^/.]+$/, ".jpg") + + drawLinesOnMask(lineGroups) + // Create a link + const aDownloadLink = document.createElement("a") + // Add the name of the file to the link + aDownloadLink.download = maskFileName + // Attach the data to the link + aDownloadLink.href = maskCanvas.toDataURL("image/jpeg") + // Get the code to click the download link + aDownloadLink.click() + } + } + + const toggleShowBrush = (newState: boolean) => { + if (newState !== showBrush && !isPanning) { + setShowBrush(newState) + } + } + + const getCursor = useCallback(() => { + if (isPanning) { + return "grab" + } + if (showBrush) { + return "none" + } + return undefined + }, [showBrush, isPanning]) + + // Standard Hotkeys for Brush Size + // useHotKey("[", () => { + // setBrushSize((currentBrushSize: number) => { + // if (currentBrushSize > 10) { + // return currentBrushSize - 10 + // } + // if (currentBrushSize <= 10 && currentBrushSize > 0) { + // return currentBrushSize - 5 + // } + // return currentBrushSize + // }) + // }) + + // useHotKey("]", () => { + // setBrushSize((currentBrushSize: number) => { + // return currentBrushSize + 10 + // }) + // }) + + // // Manual Inpainting Hotkey + // useHotKey( + // "shift+r", + // () => { + // if (runMannually && hadDrawSomething()) { + // runInpainting() + // } + // }, + // {}, + // [runMannually, runInpainting, hadDrawSomething] + // ) + + // useHotKey( + // "ctrl+c, cmd+c", + // async () => { + // const hasPermission = await askWritePermission() + // if (hasPermission && renders.length > 0) { + // if (context?.canvas) { + // await copyCanvasImage(context?.canvas) + // setToastState({ + // open: true, + // desc: "Copy inpainting result to clipboard", + // state: "success", + // duration: 3000, + // }) + // } + // } + // }, + // {}, + // [renders, context] + // ) + + // Toggle clean/zoom tool on spacebar. + // useKeyPressEvent( + // " ", + // (ev) => { + // if (!app.disableShortCuts) { + // ev?.preventDefault() + // ev?.stopPropagation() + // setShowBrush(false) + // setIsPanning(true) + // } + // }, + // (ev) => { + // if (!app.disableShortCuts) { + // ev?.preventDefault() + // ev?.stopPropagation() + // setShowBrush(true) + // setIsPanning(false) + // } + // } + // ) + + // useKeyPressEvent( + // "Alt", + // (ev) => { + // ev?.preventDefault() + // ev?.stopPropagation() + // setIsChangingBrushSizeByMouse(true) + // setChangeBrushSizeByMouseInit({ x, y, brushSize }) + // }, + // (ev) => { + // ev?.preventDefault() + // ev?.stopPropagation() + // setIsChangingBrushSizeByMouse(false) + // } + // ) + + const getCurScale = (): number => { + let s = minScale + if (viewportRef.current?.state?.scale !== undefined) { + s = viewportRef.current?.state.scale + } + return s! + } + + const getBrushStyle = (_x: number, _y: number) => { + const curScale = getCurScale() + return { + width: `${brushSize * curScale}px`, + height: `${brushSize * curScale}px`, + left: `${_x}px`, + top: `${_y}px`, + transform: "translate(-50%, -50%)", + } + } + + const handleSliderChange = (value: number) => { + setBrushSize(value) + + if (!showRefBrush) { + setShowRefBrush(true) + window.setTimeout(() => { + setShowRefBrush(false) + }, 10000) + } + } + + const renderInteractiveSegCursor = () => { + return ( +
+ +
+ ) + } + + const renderCanvas = () => { + return ( + { + if (!panned) { + setPanned(true) + } + }} + onZoom={(ref) => { + setScale(ref.state.scale) + }} + > + +
+ { + e.preventDefault() + }} + onMouseOver={() => { + toggleShowBrush(true) + setShowRefBrush(false) + }} + onFocus={() => toggleShowBrush(true)} + onMouseLeave={() => toggleShowBrush(false)} + onMouseDown={onMouseDown} + onMouseUp={onCanvasMouseUp} + onMouseMove={onMouseDrag} + ref={(r) => { + if (r && !context) { + const ctx = r.getContext("2d") + if (ctx) { + setContext(ctx) + } + } + }} + /> +
+ {showOriginal && ( + <> +
+ original + + )} +
+
+ + {/* */} + + {/* {isInteractiveSeg ? : <>} */} + + + ) + } + + const onInteractiveAccept = () => { + setInteractiveSegMask(tmpInteractiveSegMask) + setTmpInteractiveSegMask(null) + + if (!runMannually && tmpInteractiveSegMask) { + runInpainting(false, undefined, tmpInteractiveSegMask) + } + } + + return ( +