From a3cb5da130280d380cbb7bf4492f8cf50ebd060b Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Thu, 13 Jun 2024 13:10:03 -0400 Subject: [PATCH 01/24] Improve RAM<->VRAM memory copy performance in LoRA patching and elsewhere (#6490) * allow model patcher to optimize away the unpatching step when feasible * remove lazy_offloading functionality * allow model patcher to optimize away the unpatching step when feasible * remove lazy_offloading functionality * do not save original weights if there is a CPU copy of state dict * Update invokeai/backend/model_manager/load/load_base.py Co-authored-by: Ryan Dick * documentation fixes requested during penultimate review * add non-blocking=True parameters to several torch.nn.Module.to() calls, for slight performance increases * fix ruff errors * prevent crash on non-cuda-enabled systems --------- Co-authored-by: Lincoln Stein Co-authored-by: Kent Keirsey <31807370+hipsterusername@users.noreply.github.com> Co-authored-by: Ryan Dick --- invokeai/backend/ip_adapter/ip_adapter.py | 11 ++-- invokeai/backend/lora.py | 51 +++++++++++-------- .../load/model_cache/model_cache_default.py | 4 +- invokeai/backend/model_patcher.py | 16 +++--- invokeai/backend/onnx/onnx_runtime.py | 10 ++++ invokeai/backend/raw_model.py | 18 ++++++- invokeai/backend/textual_inversion.py | 12 +++++ 7 files changed, 84 insertions(+), 38 deletions(-) diff --git a/invokeai/backend/ip_adapter/ip_adapter.py b/invokeai/backend/ip_adapter/ip_adapter.py index f3be042146..c33cb3f4ab 100644 --- a/invokeai/backend/ip_adapter/ip_adapter.py +++ b/invokeai/backend/ip_adapter/ip_adapter.py @@ -125,13 +125,16 @@ class IPAdapter(RawModel): self.device, dtype=self.dtype ) - def to(self, device: torch.device, dtype: Optional[torch.dtype] = None): - self.device = device + def to( + self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, non_blocking: bool = False + ): + if device is not None: + self.device = device if dtype is not None: self.dtype = dtype - self._image_proj_model.to(device=self.device, dtype=self.dtype) - self.attn_weights.to(device=self.device, dtype=self.dtype) + self._image_proj_model.to(device=self.device, dtype=self.dtype, non_blocking=non_blocking) + self.attn_weights.to(device=self.device, dtype=self.dtype, non_blocking=non_blocking) def calc_size(self): # workaround for circular import diff --git a/invokeai/backend/lora.py b/invokeai/backend/lora.py index 0b7128034a..f7c3863a6a 100644 --- a/invokeai/backend/lora.py +++ b/invokeai/backend/lora.py @@ -61,9 +61,10 @@ class LoRALayerBase: self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, ) -> None: if self.bias is not None: - self.bias = self.bias.to(device=device, dtype=dtype) + self.bias = self.bias.to(device=device, dtype=dtype, non_blocking=non_blocking) # TODO: find and debug lora/locon with bias @@ -109,14 +110,15 @@ class LoRALayer(LoRALayerBase): self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, ) -> None: - super().to(device=device, dtype=dtype) + super().to(device=device, dtype=dtype, non_blocking=non_blocking) - self.up = self.up.to(device=device, dtype=dtype) - self.down = self.down.to(device=device, dtype=dtype) + self.up = self.up.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.down = self.down.to(device=device, dtype=dtype, non_blocking=non_blocking) if self.mid is not None: - self.mid = self.mid.to(device=device, dtype=dtype) + self.mid = self.mid.to(device=device, dtype=dtype, non_blocking=non_blocking) class LoHALayer(LoRALayerBase): @@ -169,18 +171,19 @@ class LoHALayer(LoRALayerBase): self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, ) -> None: super().to(device=device, dtype=dtype) - self.w1_a = self.w1_a.to(device=device, dtype=dtype) - self.w1_b = self.w1_b.to(device=device, dtype=dtype) + self.w1_a = self.w1_a.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.w1_b = self.w1_b.to(device=device, dtype=dtype, non_blocking=non_blocking) if self.t1 is not None: - self.t1 = self.t1.to(device=device, dtype=dtype) + self.t1 = self.t1.to(device=device, dtype=dtype, non_blocking=non_blocking) - self.w2_a = self.w2_a.to(device=device, dtype=dtype) - self.w2_b = self.w2_b.to(device=device, dtype=dtype) + self.w2_a = self.w2_a.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.w2_b = self.w2_b.to(device=device, dtype=dtype, non_blocking=non_blocking) if self.t2 is not None: - self.t2 = self.t2.to(device=device, dtype=dtype) + self.t2 = self.t2.to(device=device, dtype=dtype, non_blocking=non_blocking) class LoKRLayer(LoRALayerBase): @@ -265,6 +268,7 @@ class LoKRLayer(LoRALayerBase): self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, ) -> None: super().to(device=device, dtype=dtype) @@ -273,19 +277,19 @@ class LoKRLayer(LoRALayerBase): else: assert self.w1_a is not None assert self.w1_b is not None - self.w1_a = self.w1_a.to(device=device, dtype=dtype) - self.w1_b = self.w1_b.to(device=device, dtype=dtype) + self.w1_a = self.w1_a.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.w1_b = self.w1_b.to(device=device, dtype=dtype, non_blocking=non_blocking) if self.w2 is not None: - self.w2 = self.w2.to(device=device, dtype=dtype) + self.w2 = self.w2.to(device=device, dtype=dtype, non_blocking=non_blocking) else: assert self.w2_a is not None assert self.w2_b is not None - self.w2_a = self.w2_a.to(device=device, dtype=dtype) - self.w2_b = self.w2_b.to(device=device, dtype=dtype) + self.w2_a = self.w2_a.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.w2_b = self.w2_b.to(device=device, dtype=dtype, non_blocking=non_blocking) if self.t2 is not None: - self.t2 = self.t2.to(device=device, dtype=dtype) + self.t2 = self.t2.to(device=device, dtype=dtype, non_blocking=non_blocking) class FullLayer(LoRALayerBase): @@ -319,10 +323,11 @@ class FullLayer(LoRALayerBase): self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, ) -> None: super().to(device=device, dtype=dtype) - self.weight = self.weight.to(device=device, dtype=dtype) + self.weight = self.weight.to(device=device, dtype=dtype, non_blocking=non_blocking) class IA3Layer(LoRALayerBase): @@ -358,11 +363,12 @@ class IA3Layer(LoRALayerBase): self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, ): super().to(device=device, dtype=dtype) - self.weight = self.weight.to(device=device, dtype=dtype) - self.on_input = self.on_input.to(device=device, dtype=dtype) + self.weight = self.weight.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.on_input = self.on_input.to(device=device, dtype=dtype, non_blocking=non_blocking) AnyLoRALayer = Union[LoRALayer, LoHALayer, LoKRLayer, FullLayer, IA3Layer] @@ -388,10 +394,11 @@ class LoRAModelRaw(RawModel): # (torch.nn.Module): self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, ) -> None: # TODO: try revert if exception? for _key, layer in self.layers.items(): - layer.to(device=device, dtype=dtype) + layer.to(device=device, dtype=dtype, non_blocking=non_blocking) def calc_size(self) -> int: model_size = 0 @@ -514,7 +521,7 @@ class LoRAModelRaw(RawModel): # (torch.nn.Module): # lower memory consumption by removing already parsed layer values state_dict[layer_key].clear() - layer.to(device=device, dtype=dtype) + layer.to(device=device, dtype=dtype, non_blocking=True) model.layers[layer_key] = layer return model diff --git a/invokeai/backend/model_manager/load/model_cache/model_cache_default.py b/invokeai/backend/model_manager/load/model_cache/model_cache_default.py index 335a15a5c8..d48e45426e 100644 --- a/invokeai/backend/model_manager/load/model_cache/model_cache_default.py +++ b/invokeai/backend/model_manager/load/model_cache/model_cache_default.py @@ -285,9 +285,9 @@ class ModelCache(ModelCacheBase[AnyModel]): else: new_dict: Dict[str, torch.Tensor] = {} for k, v in cache_entry.state_dict.items(): - new_dict[k] = v.to(torch.device(target_device), copy=True) + new_dict[k] = v.to(torch.device(target_device), copy=True, non_blocking=True) cache_entry.model.load_state_dict(new_dict, assign=True) - cache_entry.model.to(target_device) + cache_entry.model.to(target_device, non_blocking=True) cache_entry.device = target_device except Exception as e: # blow away cache entry self._delete_cache_entry(cache_entry) diff --git a/invokeai/backend/model_patcher.py b/invokeai/backend/model_patcher.py index c407cd8472..fdc79539ae 100644 --- a/invokeai/backend/model_patcher.py +++ b/invokeai/backend/model_patcher.py @@ -67,7 +67,7 @@ class ModelPatcher: unet: UNet2DConditionModel, loras: Iterator[Tuple[LoRAModelRaw, float]], model_state_dict: Optional[Dict[str, torch.Tensor]] = None, - ) -> None: + ) -> Generator[None, None, None]: with cls.apply_lora( unet, loras=loras, @@ -83,7 +83,7 @@ class ModelPatcher: text_encoder: CLIPTextModel, loras: Iterator[Tuple[LoRAModelRaw, float]], model_state_dict: Optional[Dict[str, torch.Tensor]] = None, - ) -> None: + ) -> Generator[None, None, None]: with cls.apply_lora(text_encoder, loras=loras, prefix="lora_te_", model_state_dict=model_state_dict): yield @@ -95,7 +95,7 @@ class ModelPatcher: loras: Iterator[Tuple[LoRAModelRaw, float]], prefix: str, model_state_dict: Optional[Dict[str, torch.Tensor]] = None, - ) -> Generator[Any, None, None]: + ) -> Generator[None, None, None]: """ Apply one or more LoRAs to a model. @@ -139,12 +139,12 @@ class ModelPatcher: # We intentionally move to the target device first, then cast. Experimentally, this was found to # be significantly faster for 16-bit CPU tensors being moved to a CUDA device than doing the # same thing in a single call to '.to(...)'. - layer.to(device=device) - layer.to(dtype=torch.float32) + layer.to(device=device, non_blocking=True) + layer.to(dtype=torch.float32, non_blocking=True) # TODO(ryand): Using torch.autocast(...) over explicit casting may offer a speed benefit on CUDA # devices here. Experimentally, it was found to be very slow on CPU. More investigation needed. layer_weight = layer.get_weight(module.weight) * (lora_weight * layer_scale) - layer.to(device=torch.device("cpu")) + layer.to(device=torch.device("cpu"), non_blocking=True) assert isinstance(layer_weight, torch.Tensor) # mypy thinks layer_weight is a float|Any ??! if module.weight.shape != layer_weight.shape: @@ -153,7 +153,7 @@ class ModelPatcher: layer_weight = layer_weight.reshape(module.weight.shape) assert isinstance(layer_weight, torch.Tensor) # mypy thinks layer_weight is a float|Any ??! - module.weight += layer_weight.to(dtype=dtype) + module.weight += layer_weight.to(dtype=dtype, non_blocking=True) yield # wait for context manager exit @@ -161,7 +161,7 @@ class ModelPatcher: assert hasattr(model, "get_submodule") # mypy not picking up fact that torch.nn.Module has get_submodule() with torch.no_grad(): for module_key, weight in original_weights.items(): - model.get_submodule(module_key).weight.copy_(weight) + model.get_submodule(module_key).weight.copy_(weight, non_blocking=True) @classmethod @contextmanager diff --git a/invokeai/backend/onnx/onnx_runtime.py b/invokeai/backend/onnx/onnx_runtime.py index 8916865dd5..9fcd4d093f 100644 --- a/invokeai/backend/onnx/onnx_runtime.py +++ b/invokeai/backend/onnx/onnx_runtime.py @@ -6,6 +6,7 @@ from typing import Any, List, Optional, Tuple, Union import numpy as np import onnx +import torch from onnx import numpy_helper from onnxruntime import InferenceSession, SessionOptions, get_available_providers @@ -188,6 +189,15 @@ class IAIOnnxRuntimeModel(RawModel): # return self.io_binding.copy_outputs_to_cpu() return self.session.run(None, inputs) + # compatability with RawModel ABC + def to( + self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, + ) -> None: + pass + # compatability with diffusers load code @classmethod def from_pretrained( diff --git a/invokeai/backend/raw_model.py b/invokeai/backend/raw_model.py index d0dc50c456..7bca6945d9 100644 --- a/invokeai/backend/raw_model.py +++ b/invokeai/backend/raw_model.py @@ -10,6 +10,20 @@ The term 'raw' was introduced to describe a wrapper around a torch.nn.Module that adds additional methods and attributes. """ +from abc import ABC, abstractmethod +from typing import Optional -class RawModel: - """Base class for 'Raw' model wrappers.""" +import torch + + +class RawModel(ABC): + """Abstract base class for 'Raw' model wrappers.""" + + @abstractmethod + def to( + self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, + ) -> None: + pass diff --git a/invokeai/backend/textual_inversion.py b/invokeai/backend/textual_inversion.py index 98104f769e..0408176edb 100644 --- a/invokeai/backend/textual_inversion.py +++ b/invokeai/backend/textual_inversion.py @@ -65,6 +65,18 @@ class TextualInversionModelRaw(RawModel): return result + def to( + self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, + non_blocking: bool = False, + ) -> None: + if not torch.cuda.is_available(): + return + for emb in [self.embedding, self.embedding_2]: + if emb is not None: + emb.to(device=device, dtype=dtype, non_blocking=non_blocking) + class TextualInversionManager(BaseTextualInversionManager): """TextualInversionManager implements the BaseTextualInversionManager ABC from the compel library.""" From 785bb1d9e446987b64a41491a1517e207793655c Mon Sep 17 00:00:00 2001 From: Ryan Dick Date: Thu, 6 Jun 2024 09:16:45 -0400 Subject: [PATCH 02/24] Fix all comparisons against the DEFAULT_PRECISION constant. DEFAULT_PRECISION is a torch.dtype. Previously, it was compared to a str in a number of places where it would always resolve to False. This is a bugfix that results in a change to the default behavior. In practice, this will not change the behavior for many users, because it only causes a change in behavior if a users has configured float32 as their default precision. --- invokeai/app/invocations/constants.py | 3 +++ invokeai/app/invocations/create_denoise_mask.py | 4 ++-- invokeai/app/invocations/create_gradient_mask.py | 4 ++-- invokeai/app/invocations/denoise_latents.py | 2 -- invokeai/app/invocations/image_to_latents.py | 4 ++-- invokeai/app/invocations/latents_to_image.py | 4 ++-- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/invokeai/app/invocations/constants.py b/invokeai/app/invocations/constants.py index cebe0eb30f..e01589be81 100644 --- a/invokeai/app/invocations/constants.py +++ b/invokeai/app/invocations/constants.py @@ -1,6 +1,7 @@ from typing import Literal from invokeai.backend.stable_diffusion.schedulers import SCHEDULER_MAP +from invokeai.backend.util.devices import TorchDevice LATENT_SCALE_FACTOR = 8 """ @@ -15,3 +16,5 @@ SCHEDULER_NAME_VALUES = Literal[tuple(SCHEDULER_MAP.keys())] IMAGE_MODES = Literal["L", "RGB", "RGBA", "CMYK", "YCbCr", "LAB", "HSV", "I", "F"] """A literal type for PIL image modes supported by Invoke""" + +DEFAULT_PRECISION = TorchDevice.choose_torch_dtype() diff --git a/invokeai/app/invocations/create_denoise_mask.py b/invokeai/app/invocations/create_denoise_mask.py index d128e0efec..2d66c20dbd 100644 --- a/invokeai/app/invocations/create_denoise_mask.py +++ b/invokeai/app/invocations/create_denoise_mask.py @@ -6,7 +6,7 @@ from PIL import Image from torchvision.transforms.functional import resize as tv_resize from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation -from invokeai.app.invocations.denoise_latents import DEFAULT_PRECISION +from invokeai.app.invocations.constants import DEFAULT_PRECISION from invokeai.app.invocations.fields import FieldDescriptions, ImageField, Input, InputField from invokeai.app.invocations.image_to_latents import ImageToLatentsInvocation from invokeai.app.invocations.model import VAEField @@ -30,7 +30,7 @@ class CreateDenoiseMaskInvocation(BaseInvocation): mask: ImageField = InputField(description="The mask to use when pasting", ui_order=2) tiled: bool = InputField(default=False, description=FieldDescriptions.tiled, ui_order=3) fp32: bool = InputField( - default=DEFAULT_PRECISION == "float32", + default=DEFAULT_PRECISION == torch.float32, description=FieldDescriptions.fp32, ui_order=4, ) diff --git a/invokeai/app/invocations/create_gradient_mask.py b/invokeai/app/invocations/create_gradient_mask.py index 2d2b13fdcc..089313463b 100644 --- a/invokeai/app/invocations/create_gradient_mask.py +++ b/invokeai/app/invocations/create_gradient_mask.py @@ -7,7 +7,7 @@ from PIL import Image, ImageFilter from torchvision.transforms.functional import resize as tv_resize from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output -from invokeai.app.invocations.denoise_latents import DEFAULT_PRECISION +from invokeai.app.invocations.constants import DEFAULT_PRECISION from invokeai.app.invocations.fields import ( DenoiseMaskField, FieldDescriptions, @@ -74,7 +74,7 @@ class CreateGradientMaskInvocation(BaseInvocation): ) tiled: bool = InputField(default=False, description=FieldDescriptions.tiled, ui_order=8) fp32: bool = InputField( - default=DEFAULT_PRECISION == "float32", + default=DEFAULT_PRECISION == torch.float32, description=FieldDescriptions.fp32, ui_order=9, ) diff --git a/invokeai/app/invocations/denoise_latents.py b/invokeai/app/invocations/denoise_latents.py index 3851caa647..7260fcb168 100644 --- a/invokeai/app/invocations/denoise_latents.py +++ b/invokeai/app/invocations/denoise_latents.py @@ -59,8 +59,6 @@ from .baseinvocation import BaseInvocation, invocation from .controlnet_image_processors import ControlField from .model import ModelIdentifierField, UNetField -DEFAULT_PRECISION = TorchDevice.choose_torch_dtype() - def get_scheduler( context: InvocationContext, diff --git a/invokeai/app/invocations/image_to_latents.py b/invokeai/app/invocations/image_to_latents.py index bf2eb414e1..06de530154 100644 --- a/invokeai/app/invocations/image_to_latents.py +++ b/invokeai/app/invocations/image_to_latents.py @@ -12,7 +12,7 @@ from diffusers.models.autoencoders.autoencoder_kl import AutoencoderKL from diffusers.models.autoencoders.autoencoder_tiny import AutoencoderTiny from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation -from invokeai.app.invocations.denoise_latents import DEFAULT_PRECISION +from invokeai.app.invocations.constants import DEFAULT_PRECISION from invokeai.app.invocations.fields import ( FieldDescriptions, ImageField, @@ -44,7 +44,7 @@ class ImageToLatentsInvocation(BaseInvocation): input=Input.Connection, ) tiled: bool = InputField(default=False, description=FieldDescriptions.tiled) - fp32: bool = InputField(default=DEFAULT_PRECISION == "float32", description=FieldDescriptions.fp32) + fp32: bool = InputField(default=DEFAULT_PRECISION == torch.float32, description=FieldDescriptions.fp32) @staticmethod def vae_encode(vae_info: LoadedModel, upcast: bool, tiled: bool, image_tensor: torch.Tensor) -> torch.Tensor: diff --git a/invokeai/app/invocations/latents_to_image.py b/invokeai/app/invocations/latents_to_image.py index 648ee7ac68..202e8bfa1b 100644 --- a/invokeai/app/invocations/latents_to_image.py +++ b/invokeai/app/invocations/latents_to_image.py @@ -11,7 +11,7 @@ from diffusers.models.autoencoders.autoencoder_tiny import AutoencoderTiny from diffusers.models.unets.unet_2d_condition import UNet2DConditionModel from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation -from invokeai.app.invocations.denoise_latents import DEFAULT_PRECISION +from invokeai.app.invocations.constants import DEFAULT_PRECISION from invokeai.app.invocations.fields import ( FieldDescriptions, Input, @@ -46,7 +46,7 @@ class LatentsToImageInvocation(BaseInvocation, WithMetadata, WithBoard): input=Input.Connection, ) tiled: bool = InputField(default=False, description=FieldDescriptions.tiled) - fp32: bool = InputField(default=DEFAULT_PRECISION == "float32", description=FieldDescriptions.fp32) + fp32: bool = InputField(default=DEFAULT_PRECISION == torch.float32, description=FieldDescriptions.fp32) @torch.no_grad() def invoke(self, context: InvocationContext) -> ImageOutput: From aae318425d52af7a573f3fb4c0a6a00576ce2db2 Mon Sep 17 00:00:00 2001 From: chainchompa Date: Fri, 14 Jun 2024 17:08:39 -0400 Subject: [PATCH 03/24] added route for installing huggingface model from model marketplace --- invokeai/app/api/routers/model_manager.py | 76 ++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/invokeai/app/api/routers/model_manager.py b/invokeai/app/api/routers/model_manager.py index b1221f7a34..01590b21be 100644 --- a/invokeai/app/api/routers/model_manager.py +++ b/invokeai/app/api/routers/model_manager.py @@ -9,7 +9,7 @@ from copy import deepcopy from typing import Any, Dict, List, Optional, Type from fastapi import Body, Path, Query, Response, UploadFile -from fastapi.responses import FileResponse +from fastapi.responses import FileResponse, HTMLResponse from fastapi.routing import APIRouter from PIL import Image from pydantic import AnyHttpUrl, BaseModel, ConfigDict, Field @@ -501,6 +501,80 @@ async def install_model( raise HTTPException(status_code=409, detail=str(e)) return result +@model_manager_router.get( + "/install/huggingface", + operation_id="install_hugging_face_model", + responses={ + 201: {"description": "The model is being installed"}, + 400: {"description": "Bad request"}, + 409: {"description": "There is already a model corresponding to this path or repo_id"}, + }, + status_code=201, + response_class=HTMLResponse +) +async def install_hugging_face_model( + source: str = Query(description="Hugging Face repo_id to install"), +) -> HTMLResponse: + """Install a Hugging Face model using a string identifier.""" + + def generate_html(message: str) -> str: + return f""" + + + + + +
+

{message}

+
+ + + """ + + try: + metadata = HuggingFaceMetadataFetch().from_id(source) + assert isinstance(metadata, ModelMetadataWithFiles) + message = "Your Hugging Face model is installing now. You can close this tab and check the Model Manager for installation progress." + except UnknownMetadataException: + message = "No HuggingFace repository found with that repo id." + return HTMLResponse(content=generate_html(message), status_code=400) + + logger = ApiDependencies.invoker.services.logger + + try: + installer = ApiDependencies.invoker.services.model_manager.install + + if metadata.is_diffusers: + installer.heuristic_import( + source=source, + inplace=False, + ) + elif metadata.ckpt_urls is not None and len(metadata.ckpt_urls) == 1: + installer.heuristic_import( + source=str(metadata.ckpt_urls[0]), + inplace=False, + ) + else: + message = "This HuggingFace repo has multiple models. Please use the Model Manager to install this." + except Exception as e: + logger.error(str(e)) + message = "There was an error with installing this model. Please use the Model Manager to install this." + + return HTMLResponse(content=generate_html(message), status_code=201) + @model_manager_router.get( "/install", From 328f160e88b403b193f3a0708ffce4f878084ec5 Mon Sep 17 00:00:00 2001 From: chainchompa Date: Fri, 14 Jun 2024 17:09:07 -0400 Subject: [PATCH 04/24] refetch model installs when a new model install starts --- .../listeners/socketio/socketModelInstall.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts index 7fafb8302c..adfa7edd06 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts @@ -6,9 +6,17 @@ import { socketModelInstallComplete, socketModelInstallDownloadProgress, socketModelInstallError, + socketModelInstallStarted, } from 'services/events/actions'; export const addModelInstallEventListener = (startAppListening: AppStartListening) => { + startAppListening({ + actionCreator: socketModelInstallStarted, + effect: async (action, { dispatch }) => { + dispatch(api.util.invalidateTags([{ type: 'ModelInstalls' }])); + }, + }); + startAppListening({ actionCreator: socketModelInstallDownloadProgress, effect: async (action, { dispatch }) => { From 40299725304e3fa3271b2d6d746512b7c448e1cd Mon Sep 17 00:00:00 2001 From: chainchompa Date: Fri, 14 Jun 2024 17:15:55 -0400 Subject: [PATCH 05/24] formatting --- invokeai/app/api/routers/model_manager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/invokeai/app/api/routers/model_manager.py b/invokeai/app/api/routers/model_manager.py index 01590b21be..f2fb0932e5 100644 --- a/invokeai/app/api/routers/model_manager.py +++ b/invokeai/app/api/routers/model_manager.py @@ -501,6 +501,7 @@ async def install_model( raise HTTPException(status_code=409, detail=str(e)) return result + @model_manager_router.get( "/install/huggingface", operation_id="install_hugging_face_model", @@ -510,7 +511,7 @@ async def install_model( 409: {"description": "There is already a model corresponding to this path or repo_id"}, }, status_code=201, - response_class=HTMLResponse + response_class=HTMLResponse, ) async def install_hugging_face_model( source: str = Query(description="Hugging Face repo_id to install"), From 1bc98abc7626690b4f850b80a72dd4d4573190dc Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:33:46 +1000 Subject: [PATCH 06/24] docs(ui): explain model install events --- .../listeners/socketio/socketModelInstall.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts index adfa7edd06..113d2cbd66 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts @@ -9,6 +9,21 @@ import { socketModelInstallStarted, } from 'services/events/actions'; +/** + * A model install has two main stages - downloading and installing. All these events are namespaced under `model_install_` + * which is a bit misleading. For example, a `model_install_started` event is actually fired _after_ the model has fully + * downloaded and is being "physically" installed. + * + * Here's the expected flow: + * - Model manager does some prep + * - `model_install_download_progress` fired when the download starts and continually until the download is complete + * - `model_install_download_complete` fired when the download is complete + * - `model_install_started` fired when the "physical" installation starts + * - `model_install_complete` fired when the installation is complete + * - `model_install_cancelled` fired if the installation is cancelled + * - `model_install_error` fired if the installation has an error + */ + export const addModelInstallEventListener = (startAppListening: AppStartListening) => { startAppListening({ actionCreator: socketModelInstallStarted, From fb694b3e179733400676c8cc7bcbb1c7ae7ba60e Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:50:25 +1000 Subject: [PATCH 07/24] feat(app): add `model_install_download_started` event Previously, we used `model_install_download_progress` for both download starting and progressing. When handling this event, we don't know which actual thing it represents. Add `model_install_download_started` event to explicitly represent a model download started event. --- invokeai/app/services/events/events_base.py | 5 +++ invokeai/app/services/events/events_common.py | 36 +++++++++++++++++++ .../model_install/model_install_default.py | 9 ++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/invokeai/app/services/events/events_base.py b/invokeai/app/services/events/events_base.py index cf49cc0626..bb578c23e8 100644 --- a/invokeai/app/services/events/events_base.py +++ b/invokeai/app/services/events/events_base.py @@ -22,6 +22,7 @@ from invokeai.app.services.events.events_common import ( ModelInstallCompleteEvent, ModelInstallDownloadProgressEvent, ModelInstallDownloadsCompleteEvent, + ModelInstallDownloadStartedEvent, ModelInstallErrorEvent, ModelInstallStartedEvent, ModelLoadCompleteEvent, @@ -144,6 +145,10 @@ class EventServiceBase: # region Model install + def emit_model_install_download_started(self, job: "ModelInstallJob") -> None: + """Emitted at intervals while the install job is started (remote models only).""" + self.dispatch(ModelInstallDownloadStartedEvent.build(job)) + def emit_model_install_download_progress(self, job: "ModelInstallJob") -> None: """Emitted at intervals while the install job is in progress (remote models only).""" self.dispatch(ModelInstallDownloadProgressEvent.build(job)) diff --git a/invokeai/app/services/events/events_common.py b/invokeai/app/services/events/events_common.py index 0adcaa2ab1..c6a867fb08 100644 --- a/invokeai/app/services/events/events_common.py +++ b/invokeai/app/services/events/events_common.py @@ -417,6 +417,42 @@ class ModelLoadCompleteEvent(ModelEventBase): return cls(config=config, submodel_type=submodel_type) +@payload_schema.register +class ModelInstallDownloadStartedEvent(ModelEventBase): + """Event model for model_install_download_started""" + + __event_name__ = "model_install_download_started" + + id: int = Field(description="The ID of the install job") + source: str = Field(description="Source of the model; local path, repo_id or url") + local_path: str = Field(description="Where model is downloading to") + bytes: int = Field(description="Number of bytes downloaded so far") + total_bytes: int = Field(description="Total size of download, including all files") + parts: list[dict[str, int | str]] = Field( + description="Progress of downloading URLs that comprise the model, if any" + ) + + @classmethod + def build(cls, job: "ModelInstallJob") -> "ModelInstallDownloadStartedEvent": + parts: list[dict[str, str | int]] = [ + { + "url": str(x.source), + "local_path": str(x.download_path), + "bytes": x.bytes, + "total_bytes": x.total_bytes, + } + for x in job.download_parts + ] + return cls( + id=job.id, + source=str(job.source), + local_path=job.local_path.as_posix(), + parts=parts, + bytes=job.bytes, + total_bytes=job.total_bytes, + ) + + @payload_schema.register class ModelInstallDownloadProgressEvent(ModelEventBase): """Event model for model_install_download_progress""" diff --git a/invokeai/app/services/model_install/model_install_default.py b/invokeai/app/services/model_install/model_install_default.py index 0a2e2d798a..dd1b44d899 100644 --- a/invokeai/app/services/model_install/model_install_default.py +++ b/invokeai/app/services/model_install/model_install_default.py @@ -822,7 +822,7 @@ class ModelInstallService(ModelInstallServiceBase): install_job.download_parts = download_job.download_parts install_job.bytes = sum(x.bytes for x in download_job.download_parts) install_job.total_bytes = download_job.total_bytes - self._signal_job_downloading(install_job) + self._signal_job_download_started(install_job) def _download_progress_callback(self, download_job: MultiFileDownloadJob) -> None: with self._lock: @@ -874,6 +874,13 @@ class ModelInstallService(ModelInstallServiceBase): if self._event_bus: self._event_bus.emit_model_install_started(job) + def _signal_job_download_started(self, job: ModelInstallJob) -> None: + if self._event_bus: + assert job._multifile_job is not None + assert job.bytes is not None + assert job.total_bytes is not None + self._event_bus.emit_model_install_download_started(job) + def _signal_job_downloading(self, job: ModelInstallJob) -> None: if self._event_bus: assert job._multifile_job is not None From c11478a94ac53e9f61ff57ff69e75fb45d6504f2 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:51:18 +1000 Subject: [PATCH 08/24] chore(ui): typegen --- .../frontend/web/src/services/api/schema.ts | 435 +++++++++++------- 1 file changed, 260 insertions(+), 175 deletions(-) diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index 5482b57c0b..fe2732d06b 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -123,6 +123,13 @@ export type paths = { */ delete: operations["prune_model_install_jobs"]; }; + "/api/v2/models/install/huggingface": { + /** + * Install Hugging Face Model + * @description Install a Hugging Face model using a string identifier. + */ + get: operations["install_hugging_face_model"]; + }; "/api/v2/models/install/{id}": { /** * Get Model Install Job @@ -3788,23 +3795,6 @@ export type components = { * @description Class to monitor and control a model download request. */ DownloadJob: { - /** - * Source - * Format: uri - * @description Where to download from. Specific types specified in child classes. - */ - source: string; - /** - * Dest - * Format: path - * @description Destination of downloaded model on local disk; a directory or file path - */ - dest: string; - /** - * Access Token - * @description authorization token for protected resources - */ - access_token?: string | null; /** * Id * @description Numeric ID of this job @@ -3812,36 +3802,21 @@ export type components = { */ id?: number; /** - * Priority - * @description Queue priority; lower values are higher priority - * @default 10 + * Dest + * Format: path + * @description Initial destination of downloaded model on local disk; a directory or file path */ - priority?: number; + dest: string; + /** + * Download Path + * @description Final location of downloaded file or directory + */ + download_path?: string | null; /** * @description Status of the download * @default waiting */ status?: components["schemas"]["DownloadJobStatus"]; - /** - * Download Path - * @description Final location of downloaded file - */ - download_path?: string | null; - /** - * Job Started - * @description Timestamp for when the download job started - */ - job_started?: string | null; - /** - * Job Ended - * @description Timestamp for when the download job ende1d (completed or errored) - */ - job_ended?: string | null; - /** - * Content Type - * @description Content type of downloaded file - */ - content_type?: string | null; /** * Bytes * @description Bytes downloaded so far @@ -3864,6 +3839,38 @@ export type components = { * @description Traceback of the exception that caused an error */ error?: string | null; + /** + * Source + * Format: uri + * @description Where to download from. Specific types specified in child classes. + */ + source: string; + /** + * Access Token + * @description authorization token for protected resources + */ + access_token?: string | null; + /** + * Priority + * @description Queue priority; lower values are higher priority + * @default 10 + */ + priority?: number; + /** + * Job Started + * @description Timestamp for when the download job started + */ + job_started?: string | null; + /** + * Job Ended + * @description Timestamp for when the download job ende1d (completed or errored) + */ + job_ended?: string | null; + /** + * Content Type + * @description Content type of downloaded file + */ + content_type?: string | null; }; /** * DownloadJobStatus @@ -7276,144 +7283,144 @@ export type components = { project_id: string | null; }; InvocationOutputMap: { - pidi_image_processor: components["schemas"]["ImageOutput"]; - image_mask_to_tensor: components["schemas"]["MaskOutput"]; - vae_loader: components["schemas"]["VAEOutput"]; - collect: components["schemas"]["CollectInvocationOutput"]; - string_join_three: components["schemas"]["StringOutput"]; - content_shuffle_image_processor: components["schemas"]["ImageOutput"]; - random_range: components["schemas"]["IntegerCollectionOutput"]; - ip_adapter: components["schemas"]["IPAdapterOutput"]; - step_param_easing: components["schemas"]["FloatCollectionOutput"]; - core_metadata: components["schemas"]["MetadataOutput"]; - main_model_loader: components["schemas"]["ModelLoaderOutput"]; - leres_image_processor: components["schemas"]["ImageOutput"]; - calculate_image_tiles_even_split: components["schemas"]["CalculateImageTilesOutput"]; - color_correct: components["schemas"]["ImageOutput"]; - calculate_image_tiles: components["schemas"]["CalculateImageTilesOutput"]; - float_range: components["schemas"]["FloatCollectionOutput"]; - infill_cv2: components["schemas"]["ImageOutput"]; - img_channel_multiply: components["schemas"]["ImageOutput"]; - img_pad_crop: components["schemas"]["ImageOutput"]; - sdxl_refiner_compel_prompt: components["schemas"]["ConditioningOutput"]; - face_mask_detection: components["schemas"]["FaceMaskOutput"]; - infill_lama: components["schemas"]["ImageOutput"]; - mask_combine: components["schemas"]["ImageOutput"]; - sdxl_compel_prompt: components["schemas"]["ConditioningOutput"]; - segment_anything_processor: components["schemas"]["ImageOutput"]; - merge_metadata: components["schemas"]["MetadataOutput"]; - img_ilerp: components["schemas"]["ImageOutput"]; - heuristic_resize: components["schemas"]["ImageOutput"]; - cv_inpaint: components["schemas"]["ImageOutput"]; - div: components["schemas"]["IntegerOutput"]; - pair_tile_image: components["schemas"]["PairTileImageOutput"]; - float_math: components["schemas"]["FloatOutput"]; - img_channel_offset: components["schemas"]["ImageOutput"]; - canvas_paste_back: components["schemas"]["ImageOutput"]; - canny_image_processor: components["schemas"]["ImageOutput"]; - integer_collection: components["schemas"]["IntegerCollectionOutput"]; - freeu: components["schemas"]["UNetOutput"]; - lresize: components["schemas"]["LatentsOutput"]; - range_of_size: components["schemas"]["IntegerCollectionOutput"]; - depth_anything_image_processor: components["schemas"]["ImageOutput"]; - float_to_int: components["schemas"]["IntegerOutput"]; - rand_int: components["schemas"]["IntegerOutput"]; - lineart_anime_image_processor: components["schemas"]["ImageOutput"]; - string_split: components["schemas"]["String2Output"]; - img_nsfw: components["schemas"]["ImageOutput"]; - string: components["schemas"]["StringOutput"]; - mask_edge: components["schemas"]["ImageOutput"]; - i2l: components["schemas"]["LatentsOutput"]; - face_identifier: components["schemas"]["ImageOutput"]; - compel: components["schemas"]["ConditioningOutput"]; - esrgan: components["schemas"]["ImageOutput"]; - seamless: components["schemas"]["SeamlessModeOutput"]; - mask_from_id: components["schemas"]["ImageOutput"]; - invert_tensor_mask: components["schemas"]["MaskOutput"]; - rectangle_mask: components["schemas"]["MaskOutput"]; - conditioning: components["schemas"]["ConditioningOutput"]; - t2i_adapter: components["schemas"]["T2IAdapterOutput"]; - string_collection: components["schemas"]["StringCollectionOutput"]; - show_image: components["schemas"]["ImageOutput"]; - dw_openpose_image_processor: components["schemas"]["ImageOutput"]; - string_split_neg: components["schemas"]["StringPosNegOutput"]; - conditioning_collection: components["schemas"]["ConditioningCollectionOutput"]; - infill_patchmatch: components["schemas"]["ImageOutput"]; - img_conv: components["schemas"]["ImageOutput"]; - unsharp_mask: components["schemas"]["ImageOutput"]; - metadata_item: components["schemas"]["MetadataItemOutput"]; - image: components["schemas"]["ImageOutput"]; - image_collection: components["schemas"]["ImageCollectionOutput"]; - tile_to_properties: components["schemas"]["TileToPropertiesOutput"]; - lblend: components["schemas"]["LatentsOutput"]; - float: components["schemas"]["FloatOutput"]; - boolean_collection: components["schemas"]["BooleanCollectionOutput"]; - color: components["schemas"]["ColorOutput"]; midas_depth_image_processor: components["schemas"]["ImageOutput"]; - zoe_depth_image_processor: components["schemas"]["ImageOutput"]; - infill_rgba: components["schemas"]["ImageOutput"]; - mlsd_image_processor: components["schemas"]["ImageOutput"]; + lscale: components["schemas"]["LatentsOutput"]; + string_split: components["schemas"]["String2Output"]; + mask_edge: components["schemas"]["ImageOutput"]; + content_shuffle_image_processor: components["schemas"]["ImageOutput"]; + color_correct: components["schemas"]["ImageOutput"]; + save_image: components["schemas"]["ImageOutput"]; + show_image: components["schemas"]["ImageOutput"]; + segment_anything_processor: components["schemas"]["ImageOutput"]; + latents: components["schemas"]["LatentsOutput"]; + lineart_image_processor: components["schemas"]["ImageOutput"]; + hed_image_processor: components["schemas"]["ImageOutput"]; + infill_lama: components["schemas"]["ImageOutput"]; + infill_patchmatch: components["schemas"]["ImageOutput"]; + float_collection: components["schemas"]["FloatCollectionOutput"]; + denoise_latents: components["schemas"]["LatentsOutput"]; + metadata: components["schemas"]["MetadataOutput"]; + compel: components["schemas"]["ConditioningOutput"]; + img_blur: components["schemas"]["ImageOutput"]; + img_crop: components["schemas"]["ImageOutput"]; + sdxl_lora_collection_loader: components["schemas"]["SDXLLoRALoaderOutput"]; + img_ilerp: components["schemas"]["ImageOutput"]; + img_paste: components["schemas"]["ImageOutput"]; + core_metadata: components["schemas"]["MetadataOutput"]; + lora_collection_loader: components["schemas"]["LoRALoaderOutput"]; + lora_selector: components["schemas"]["LoRASelectorOutput"]; + create_denoise_mask: components["schemas"]["DenoiseMaskOutput"]; + rectangle_mask: components["schemas"]["MaskOutput"]; + noise: components["schemas"]["NoiseOutput"]; + float_to_int: components["schemas"]["IntegerOutput"]; + esrgan: components["schemas"]["ImageOutput"]; merge_tiles_to_image: components["schemas"]["ImageOutput"]; prompt_from_file: components["schemas"]["StringCollectionOutput"]; - boolean: components["schemas"]["BooleanOutput"]; - create_gradient_mask: components["schemas"]["GradientMaskOutput"]; - rand_float: components["schemas"]["FloatOutput"]; - img_mul: components["schemas"]["ImageOutput"]; - controlnet: components["schemas"]["ControlOutput"]; - latents_collection: components["schemas"]["LatentsCollectionOutput"]; - img_lerp: components["schemas"]["ImageOutput"]; - noise: components["schemas"]["NoiseOutput"]; - iterate: components["schemas"]["IterateInvocationOutput"]; - lineart_image_processor: components["schemas"]["ImageOutput"]; - tomask: components["schemas"]["ImageOutput"]; - integer: components["schemas"]["IntegerOutput"]; - create_denoise_mask: components["schemas"]["DenoiseMaskOutput"]; - clip_skip: components["schemas"]["CLIPSkipInvocationOutput"]; - denoise_latents: components["schemas"]["LatentsOutput"]; - string_join: components["schemas"]["StringOutput"]; - scheduler: components["schemas"]["SchedulerOutput"]; - model_identifier: components["schemas"]["ModelIdentifierOutput"]; - normalbae_image_processor: components["schemas"]["ImageOutput"]; - face_off: components["schemas"]["FaceOffOutput"]; - hed_image_processor: components["schemas"]["ImageOutput"]; - img_paste: components["schemas"]["ImageOutput"]; - img_chan: components["schemas"]["ImageOutput"]; - img_watermark: components["schemas"]["ImageOutput"]; - l2i: components["schemas"]["ImageOutput"]; - string_replace: components["schemas"]["StringOutput"]; - color_map_image_processor: components["schemas"]["ImageOutput"]; - tile_image_processor: components["schemas"]["ImageOutput"]; - crop_latents: components["schemas"]["LatentsOutput"]; - sdxl_lora_collection_loader: components["schemas"]["SDXLLoRALoaderOutput"]; - add: components["schemas"]["IntegerOutput"]; - sub: components["schemas"]["IntegerOutput"]; - img_scale: components["schemas"]["ImageOutput"]; - range: components["schemas"]["IntegerCollectionOutput"]; - dynamic_prompt: components["schemas"]["StringCollectionOutput"]; - img_crop: components["schemas"]["ImageOutput"]; - infill_tile: components["schemas"]["ImageOutput"]; - img_resize: components["schemas"]["ImageOutput"]; - mediapipe_face_processor: components["schemas"]["ImageOutput"]; - sdxl_model_loader: components["schemas"]["SDXLModelLoaderOutput"]; - lora_selector: components["schemas"]["LoRASelectorOutput"]; - img_hue_adjust: components["schemas"]["ImageOutput"]; - latents: components["schemas"]["LatentsOutput"]; - lora_collection_loader: components["schemas"]["LoRALoaderOutput"]; - img_blur: components["schemas"]["ImageOutput"]; - ideal_size: components["schemas"]["IdealSizeOutput"]; - float_collection: components["schemas"]["FloatCollectionOutput"]; - blank_image: components["schemas"]["ImageOutput"]; - integer_math: components["schemas"]["IntegerOutput"]; - lora_loader: components["schemas"]["LoRALoaderOutput"]; - metadata: components["schemas"]["MetadataOutput"]; + infill_rgba: components["schemas"]["ImageOutput"]; sdxl_lora_loader: components["schemas"]["SDXLLoRALoaderOutput"]; - round_float: components["schemas"]["FloatOutput"]; - sdxl_refiner_model_loader: components["schemas"]["SDXLRefinerModelLoaderOutput"]; - mul: components["schemas"]["IntegerOutput"]; - alpha_mask_to_tensor: components["schemas"]["MaskOutput"]; - lscale: components["schemas"]["LatentsOutput"]; - save_image: components["schemas"]["ImageOutput"]; + lora_loader: components["schemas"]["LoRALoaderOutput"]; + iterate: components["schemas"]["IterateInvocationOutput"]; + t2i_adapter: components["schemas"]["T2IAdapterOutput"]; + color_map_image_processor: components["schemas"]["ImageOutput"]; + blank_image: components["schemas"]["ImageOutput"]; + normalbae_image_processor: components["schemas"]["ImageOutput"]; + canvas_paste_back: components["schemas"]["ImageOutput"]; + string_split_neg: components["schemas"]["StringPosNegOutput"]; + img_channel_offset: components["schemas"]["ImageOutput"]; + face_mask_detection: components["schemas"]["FaceMaskOutput"]; + cv_inpaint: components["schemas"]["ImageOutput"]; + clip_skip: components["schemas"]["CLIPSkipInvocationOutput"]; + invert_tensor_mask: components["schemas"]["MaskOutput"]; + tomask: components["schemas"]["ImageOutput"]; + main_model_loader: components["schemas"]["ModelLoaderOutput"]; + img_watermark: components["schemas"]["ImageOutput"]; + img_pad_crop: components["schemas"]["ImageOutput"]; + random_range: components["schemas"]["IntegerCollectionOutput"]; + mlsd_image_processor: components["schemas"]["ImageOutput"]; + merge_metadata: components["schemas"]["MetadataOutput"]; + string_join: components["schemas"]["StringOutput"]; + vae_loader: components["schemas"]["VAEOutput"]; + calculate_image_tiles_even_split: components["schemas"]["CalculateImageTilesOutput"]; calculate_image_tiles_min_overlap: components["schemas"]["CalculateImageTilesOutput"]; + mask_from_id: components["schemas"]["ImageOutput"]; + zoe_depth_image_processor: components["schemas"]["ImageOutput"]; + img_resize: components["schemas"]["ImageOutput"]; + string_replace: components["schemas"]["StringOutput"]; + face_identifier: components["schemas"]["ImageOutput"]; + canny_image_processor: components["schemas"]["ImageOutput"]; + collect: components["schemas"]["CollectInvocationOutput"]; + infill_tile: components["schemas"]["ImageOutput"]; + integer_collection: components["schemas"]["IntegerCollectionOutput"]; + img_lerp: components["schemas"]["ImageOutput"]; + step_param_easing: components["schemas"]["FloatCollectionOutput"]; + lresize: components["schemas"]["LatentsOutput"]; + img_mul: components["schemas"]["ImageOutput"]; + create_gradient_mask: components["schemas"]["GradientMaskOutput"]; + img_scale: components["schemas"]["ImageOutput"]; + rand_float: components["schemas"]["FloatOutput"]; + tile_to_properties: components["schemas"]["TileToPropertiesOutput"]; + calculate_image_tiles: components["schemas"]["CalculateImageTilesOutput"]; + range_of_size: components["schemas"]["IntegerCollectionOutput"]; + sdxl_refiner_model_loader: components["schemas"]["SDXLRefinerModelLoaderOutput"]; + heuristic_resize: components["schemas"]["ImageOutput"]; + controlnet: components["schemas"]["ControlOutput"]; + string: components["schemas"]["StringOutput"]; + tile_image_processor: components["schemas"]["ImageOutput"]; + metadata_item: components["schemas"]["MetadataItemOutput"]; + freeu: components["schemas"]["UNetOutput"]; + round_float: components["schemas"]["FloatOutput"]; + conditioning: components["schemas"]["ConditioningOutput"]; + ideal_size: components["schemas"]["IdealSizeOutput"]; + float: components["schemas"]["FloatOutput"]; + conditioning_collection: components["schemas"]["ConditioningCollectionOutput"]; + alpha_mask_to_tensor: components["schemas"]["MaskOutput"]; + integer_math: components["schemas"]["IntegerOutput"]; + string_collection: components["schemas"]["StringCollectionOutput"]; + img_conv: components["schemas"]["ImageOutput"]; + img_channel_multiply: components["schemas"]["ImageOutput"]; + lblend: components["schemas"]["LatentsOutput"]; + color: components["schemas"]["ColorOutput"]; + image: components["schemas"]["ImageOutput"]; + sdxl_model_loader: components["schemas"]["SDXLModelLoaderOutput"]; + image_collection: components["schemas"]["ImageCollectionOutput"]; + model_identifier: components["schemas"]["ModelIdentifierOutput"]; + l2i: components["schemas"]["ImageOutput"]; + seamless: components["schemas"]["SeamlessModeOutput"]; + boolean_collection: components["schemas"]["BooleanCollectionOutput"]; + string_join_three: components["schemas"]["StringOutput"]; + ip_adapter: components["schemas"]["IPAdapterOutput"]; + add: components["schemas"]["IntegerOutput"]; + crop_latents: components["schemas"]["LatentsOutput"]; + float_range: components["schemas"]["FloatCollectionOutput"]; + mul: components["schemas"]["IntegerOutput"]; + dw_openpose_image_processor: components["schemas"]["ImageOutput"]; + boolean: components["schemas"]["BooleanOutput"]; + dynamic_prompt: components["schemas"]["StringCollectionOutput"]; + mediapipe_face_processor: components["schemas"]["ImageOutput"]; + i2l: components["schemas"]["LatentsOutput"]; + latents_collection: components["schemas"]["LatentsCollectionOutput"]; + integer: components["schemas"]["IntegerOutput"]; + img_chan: components["schemas"]["ImageOutput"]; + pair_tile_image: components["schemas"]["PairTileImageOutput"]; + unsharp_mask: components["schemas"]["ImageOutput"]; + img_hue_adjust: components["schemas"]["ImageOutput"]; + lineart_anime_image_processor: components["schemas"]["ImageOutput"]; + face_off: components["schemas"]["FaceOffOutput"]; + mask_combine: components["schemas"]["ImageOutput"]; + leres_image_processor: components["schemas"]["ImageOutput"]; + image_mask_to_tensor: components["schemas"]["MaskOutput"]; + sdxl_refiner_compel_prompt: components["schemas"]["ConditioningOutput"]; + scheduler: components["schemas"]["SchedulerOutput"]; + sub: components["schemas"]["IntegerOutput"]; + pidi_image_processor: components["schemas"]["ImageOutput"]; + infill_cv2: components["schemas"]["ImageOutput"]; + div: components["schemas"]["IntegerOutput"]; + img_nsfw: components["schemas"]["ImageOutput"]; + depth_anything_image_processor: components["schemas"]["ImageOutput"]; + sdxl_compel_prompt: components["schemas"]["ConditioningOutput"]; + range: components["schemas"]["IntegerCollectionOutput"]; + rand_int: components["schemas"]["IntegerOutput"]; + float_math: components["schemas"]["FloatOutput"]; }; /** * InvocationStartedEvent @@ -9443,6 +9450,49 @@ export type components = { [key: string]: number | string; })[]; }; + /** + * ModelInstallDownloadStartedEvent + * @description Event model for model_install_download_started + */ + ModelInstallDownloadStartedEvent: { + /** + * Timestamp + * @description The timestamp of the event + */ + timestamp: number; + /** + * Id + * @description The ID of the install job + */ + id: number; + /** + * Source + * @description Source of the model; local path, repo_id or url + */ + source: string; + /** + * Local Path + * @description Where model is downloading to + */ + local_path: string; + /** + * Bytes + * @description Number of bytes downloaded so far + */ + bytes: number; + /** + * Total Bytes + * @description Total size of download, including all files + */ + total_bytes: number; + /** + * Parts + * @description Progress of downloading URLs that comprise the model, if any + */ + parts: ({ + [key: string]: number | string; + })[]; + }; /** * ModelInstallDownloadsCompleteEvent * @description Emitted once when an install job becomes active. @@ -10671,8 +10721,9 @@ export type components = { /** * Size * @description The size of this file, in bytes + * @default 0 */ - size: number; + size?: number | null; /** * Sha256 * @description SHA256 hash of this model (not always available) @@ -14050,6 +14101,40 @@ export type operations = { }; }; }; + /** + * Install Hugging Face Model + * @description Install a Hugging Face model using a string identifier. + */ + install_hugging_face_model: { + parameters: { + query: { + /** @description Hugging Face repo_id to install */ + source: string; + }; + }; + responses: { + /** @description The model is being installed */ + 201: { + content: { + "text/html": string; + }; + }; + /** @description Bad request */ + 400: { + content: never; + }; + /** @description There is already a model corresponding to this path or repo_id */ + 409: { + content: never; + }; + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; /** * Get Model Install Job * @description Return model install job corresponding to the given source. See the documentation for 'List Model Install Jobs' From 56771de8565d2ff6d435fc6f234c0ee5254ca433 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:52:46 +1000 Subject: [PATCH 09/24] feat(ui): add redux actions for `model_install_download_started` event --- invokeai/frontend/web/src/services/events/actions.ts | 4 ++++ invokeai/frontend/web/src/services/events/types.ts | 2 ++ 2 files changed, 6 insertions(+) diff --git a/invokeai/frontend/web/src/services/events/actions.ts b/invokeai/frontend/web/src/services/events/actions.ts index 257819b4c8..a97bdcbf8b 100644 --- a/invokeai/frontend/web/src/services/events/actions.ts +++ b/invokeai/frontend/web/src/services/events/actions.ts @@ -16,6 +16,7 @@ import type { ModelInstallCompleteEvent, ModelInstallDownloadProgressEvent, ModelInstallDownloadsCompleteEvent, + ModelInstallDownloadStartedEvent, ModelInstallErrorEvent, ModelInstallStartedEvent, ModelLoadCompleteEvent, @@ -45,6 +46,9 @@ export const socketModelInstallStarted = createSocketAction( 'ModelInstallDownloadProgressEvent' ); +export const socketModelInstallDownloadStarted = createSocketAction( + 'ModelInstallDownloadStartedEvent' +); export const socketModelInstallDownloadsComplete = createSocketAction( 'ModelInstallDownloadsCompleteEvent' ); diff --git a/invokeai/frontend/web/src/services/events/types.ts b/invokeai/frontend/web/src/services/events/types.ts index a84049cc28..2d3725394d 100644 --- a/invokeai/frontend/web/src/services/events/types.ts +++ b/invokeai/frontend/web/src/services/events/types.ts @@ -9,6 +9,7 @@ export type InvocationCompleteEvent = S['InvocationCompleteEvent']; export type InvocationErrorEvent = S['InvocationErrorEvent']; export type ProgressImage = InvocationDenoiseProgressEvent['progress_image']; +export type ModelInstallDownloadStartedEvent = S['ModelInstallDownloadStartedEvent']; export type ModelInstallDownloadProgressEvent = S['ModelInstallDownloadProgressEvent']; export type ModelInstallDownloadsCompleteEvent = S['ModelInstallDownloadsCompleteEvent']; export type ModelInstallCompleteEvent = S['ModelInstallCompleteEvent']; @@ -49,6 +50,7 @@ export type ServerToClientEvents = { download_error: (payload: DownloadErrorEvent) => void; model_load_started: (payload: ModelLoadStartedEvent) => void; model_install_started: (payload: ModelInstallStartedEvent) => void; + model_install_download_started: (payload: ModelInstallDownloadStartedEvent) => void; model_install_download_progress: (payload: ModelInstallDownloadProgressEvent) => void; model_install_downloads_complete: (payload: ModelInstallDownloadsCompleteEvent) => void; model_install_complete: (payload: ModelInstallCompleteEvent) => void; From f002bca2fa057aa9dcb997fc3520a3b31a12578a Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 17 Jun 2024 10:07:10 +1000 Subject: [PATCH 10/24] feat(ui): handle new `model_install_download_started` event When a model install is initiated from outside the client, we now trigger the model manager tab's model install list to update. - Handle new `model_install_download_started` event - Handle `model_install_download_complete` event (this event is not new but was never handled) - Update optimistic updates/cache invalidation logic to efficiently update the model install list --- .../listeners/socketio/socketModelInstall.ts | 184 +++++++++++++----- 1 file changed, 136 insertions(+), 48 deletions(-) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts index 113d2cbd66..22ad87fbe9 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelInstall.ts @@ -5,6 +5,8 @@ import { socketModelInstallCancelled, socketModelInstallComplete, socketModelInstallDownloadProgress, + socketModelInstallDownloadsComplete, + socketModelInstallDownloadStarted, socketModelInstallError, socketModelInstallStarted, } from 'services/events/actions'; @@ -14,9 +16,12 @@ import { * which is a bit misleading. For example, a `model_install_started` event is actually fired _after_ the model has fully * downloaded and is being "physically" installed. * + * Note: the download events are only fired for remote model installs, not local. + * * Here's the expected flow: - * - Model manager does some prep - * - `model_install_download_progress` fired when the download starts and continually until the download is complete + * - API receives install request, model manager preps the install + * - `model_install_download_started` fired when the download starts + * - `model_install_download_progress` fired continually until the download is complete * - `model_install_download_complete` fired when the download is complete * - `model_install_started` fired when the "physical" installation starts * - `model_install_complete` fired when the installation is complete @@ -24,47 +29,98 @@ import { * - `model_install_error` fired if the installation has an error */ +const selectModelInstalls = modelsApi.endpoints.listModelInstalls.select(); + export const addModelInstallEventListener = (startAppListening: AppStartListening) => { + startAppListening({ + actionCreator: socketModelInstallDownloadStarted, + effect: async (action, { dispatch, getState }) => { + const { id } = action.payload.data; + const { data } = selectModelInstalls(getState()); + + if (!data || !data.find((m) => m.id === id)) { + dispatch(api.util.invalidateTags([{ type: 'ModelInstalls' }])); + } else { + dispatch( + modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { + const modelImport = draft.find((m) => m.id === id); + if (modelImport) { + modelImport.status = 'downloading'; + } + return draft; + }) + ); + } + }, + }); + startAppListening({ actionCreator: socketModelInstallStarted, - effect: async (action, { dispatch }) => { - dispatch(api.util.invalidateTags([{ type: 'ModelInstalls' }])); + effect: async (action, { dispatch, getState }) => { + const { id } = action.payload.data; + const { data } = selectModelInstalls(getState()); + + if (!data || !data.find((m) => m.id === id)) { + dispatch(api.util.invalidateTags([{ type: 'ModelInstalls' }])); + } else { + dispatch( + modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { + const modelImport = draft.find((m) => m.id === id); + if (modelImport) { + modelImport.status = 'running'; + } + return draft; + }) + ); + } }, }); startAppListening({ actionCreator: socketModelInstallDownloadProgress, - effect: async (action, { dispatch }) => { + effect: async (action, { dispatch, getState }) => { const { bytes, total_bytes, id } = action.payload.data; + const { data } = selectModelInstalls(getState()); - dispatch( - modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { - const modelImport = draft.find((m) => m.id === id); - if (modelImport) { - modelImport.bytes = bytes; - modelImport.total_bytes = total_bytes; - modelImport.status = 'downloading'; - } - return draft; - }) - ); + if (!data || !data.find((m) => m.id === id)) { + dispatch(api.util.invalidateTags([{ type: 'ModelInstalls' }])); + } else { + dispatch( + modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { + const modelImport = draft.find((m) => m.id === id); + if (modelImport) { + modelImport.bytes = bytes; + modelImport.total_bytes = total_bytes; + modelImport.status = 'downloading'; + } + return draft; + }) + ); + } }, }); startAppListening({ actionCreator: socketModelInstallComplete, - effect: (action, { dispatch }) => { + effect: (action, { dispatch, getState }) => { const { id } = action.payload.data; - dispatch( - modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { - const modelImport = draft.find((m) => m.id === id); - if (modelImport) { - modelImport.status = 'completed'; - } - return draft; - }) - ); + const { data } = selectModelInstalls(getState()); + + if (!data || !data.find((m) => m.id === id)) { + dispatch(api.util.invalidateTags([{ type: 'ModelInstalls' }])); + } else { + dispatch( + modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { + const modelImport = draft.find((m) => m.id === id); + if (modelImport) { + modelImport.status = 'completed'; + } + return draft; + }) + ); + } + dispatch(api.util.invalidateTags([{ type: 'ModelConfig', id: LIST_TAG }])); dispatch(api.util.invalidateTags([{ type: 'ModelScanFolderResults', id: LIST_TAG }])); }, @@ -72,37 +128,69 @@ export const addModelInstallEventListener = (startAppListening: AppStartListenin startAppListening({ actionCreator: socketModelInstallError, - effect: (action, { dispatch }) => { + effect: (action, { dispatch, getState }) => { const { id, error, error_type } = action.payload.data; + const { data } = selectModelInstalls(getState()); - dispatch( - modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { - const modelImport = draft.find((m) => m.id === id); - if (modelImport) { - modelImport.status = 'error'; - modelImport.error_reason = error_type; - modelImport.error = error; - } - return draft; - }) - ); + if (!data || !data.find((m) => m.id === id)) { + dispatch(api.util.invalidateTags([{ type: 'ModelInstalls' }])); + } else { + dispatch( + modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { + const modelImport = draft.find((m) => m.id === id); + if (modelImport) { + modelImport.status = 'error'; + modelImport.error_reason = error_type; + modelImport.error = error; + } + return draft; + }) + ); + } }, }); startAppListening({ actionCreator: socketModelInstallCancelled, - effect: (action, { dispatch }) => { + effect: (action, { dispatch, getState }) => { const { id } = action.payload.data; + const { data } = selectModelInstalls(getState()); - dispatch( - modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { - const modelImport = draft.find((m) => m.id === id); - if (modelImport) { - modelImport.status = 'cancelled'; - } - return draft; - }) - ); + if (!data || !data.find((m) => m.id === id)) { + dispatch(api.util.invalidateTags([{ type: 'ModelInstalls' }])); + } else { + dispatch( + modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { + const modelImport = draft.find((m) => m.id === id); + if (modelImport) { + modelImport.status = 'cancelled'; + } + return draft; + }) + ); + } + }, + }); + + startAppListening({ + actionCreator: socketModelInstallDownloadsComplete, + effect: (action, { dispatch, getState }) => { + const { id } = action.payload.data; + const { data } = selectModelInstalls(getState()); + + if (!data || !data.find((m) => m.id === id)) { + dispatch(api.util.invalidateTags([{ type: 'ModelInstalls' }])); + } else { + dispatch( + modelsApi.util.updateQueryData('listModelInstalls', undefined, (draft) => { + const modelImport = draft.find((m) => m.id === id); + if (modelImport) { + modelImport.status = 'downloads_done'; + } + return draft; + }) + ); + } }, }); }; From cd70937b7f3a44669f6c011376bbb44fb8201045 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 17 Jun 2024 10:51:08 +1000 Subject: [PATCH 11/24] feat(api): improved model install confirmation page styling & messaging --- invokeai/app/api/routers/model_manager.py | 118 ++++++++++++++++------ 1 file changed, 85 insertions(+), 33 deletions(-) diff --git a/invokeai/app/api/routers/model_manager.py b/invokeai/app/api/routers/model_manager.py index f2fb0932e5..99f00423c6 100644 --- a/invokeai/app/api/routers/model_manager.py +++ b/invokeai/app/api/routers/model_manager.py @@ -514,50 +514,93 @@ async def install_model( response_class=HTMLResponse, ) async def install_hugging_face_model( - source: str = Query(description="Hugging Face repo_id to install"), + source: str = Query(description="HuggingFace repo_id to install"), ) -> HTMLResponse: """Install a Hugging Face model using a string identifier.""" - def generate_html(message: str) -> str: + def generate_html(title: str, heading: str, repo_id: str, is_error: bool, message: str | None = "") -> str: + if message: + message = f"

{message}

" + title_class = "error" if is_error else "success" return f""" - - - - - -
-

{message}

-
- - + + + + {title} + + + + +
+
+

{heading}

+ {message} +

Repo ID: {repo_id}

+
+
+ + + """ try: metadata = HuggingFaceMetadataFetch().from_id(source) assert isinstance(metadata, ModelMetadataWithFiles) - message = "Your Hugging Face model is installing now. You can close this tab and check the Model Manager for installation progress." except UnknownMetadataException: - message = "No HuggingFace repository found with that repo id." - return HTMLResponse(content=generate_html(message), status_code=400) + title = "Unable to Install Model" + heading = "No HuggingFace repository found with that repo ID." + message = "Ensure the repo ID is correct and try again." + return HTMLResponse(content=generate_html(title, heading, source, True, message), status_code=400) logger = ApiDependencies.invoker.services.logger try: installer = ApiDependencies.invoker.services.model_manager.install - if metadata.is_diffusers: installer.heuristic_import( source=source, @@ -569,12 +612,21 @@ async def install_hugging_face_model( inplace=False, ) else: - message = "This HuggingFace repo has multiple models. Please use the Model Manager to install this." + title = "Unable to Install Model" + heading = "This HuggingFace repo has multiple models." + message = "Please use the Model Manager to install this model." + return HTMLResponse(content=generate_html(title, heading, source, True, message), status_code=200) + + title = "Model Install Started" + heading = "Your HuggingFace model is installing now." + message = "You can close this tab and check the Model Manager for installation progress." + return HTMLResponse(content=generate_html(title, heading, source, False, message), status_code=201) except Exception as e: logger.error(str(e)) - message = "There was an error with installing this model. Please use the Model Manager to install this." - - return HTMLResponse(content=generate_html(message), status_code=201) + title = "Unable to Install Model" + heading = "There was an problem installing this model." + message = 'Please use the Model Manager directly to install this model. If the issue persists, ask for help on discord.' + return HTMLResponse(content=generate_html(title, heading, source, True, message), status_code=500) @model_manager_router.get( From e26125b734be2bcfb3188c1a0e29ccd3b6f474ba Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 17 Jun 2024 10:57:11 +1000 Subject: [PATCH 12/24] tests: fix test_model_install.py --- tests/app/services/model_install/test_model_install.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/app/services/model_install/test_model_install.py b/tests/app/services/model_install/test_model_install.py index 9602a79a27..0c212cca76 100644 --- a/tests/app/services/model_install/test_model_install.py +++ b/tests/app/services/model_install/test_model_install.py @@ -17,6 +17,7 @@ from invokeai.app.services.events.events_common import ( ModelInstallCompleteEvent, ModelInstallDownloadProgressEvent, ModelInstallDownloadsCompleteEvent, + ModelInstallDownloadStartedEvent, ModelInstallStartedEvent, ) from invokeai.app.services.model_install import ( @@ -252,7 +253,7 @@ def test_simple_download(mm2_installer: ModelInstallServiceBase, mm2_app_config: assert (mm2_app_config.models_path / model_record.path).exists() assert len(bus.events) == 5 - assert isinstance(bus.events[0], ModelInstallDownloadProgressEvent) # download starts + assert isinstance(bus.events[0], ModelInstallDownloadStartedEvent) # download starts assert isinstance(bus.events[1], ModelInstallDownloadProgressEvent) # download progresses assert isinstance(bus.events[2], ModelInstallDownloadsCompleteEvent) # download completed assert isinstance(bus.events[3], ModelInstallStartedEvent) # install started From 41a6bb45f3018040089338c1e98a6024a9229cf0 Mon Sep 17 00:00:00 2001 From: Brandon Rising Date: Thu, 13 Jun 2024 16:34:27 -0400 Subject: [PATCH 13/24] Initial functionality --- invokeai/backend/model_hash/hash_validator.py | 16 ++++++++++++++++ invokeai/backend/model_manager/config.py | 3 +++ 2 files changed, 19 insertions(+) create mode 100644 invokeai/backend/model_hash/hash_validator.py diff --git a/invokeai/backend/model_hash/hash_validator.py b/invokeai/backend/model_hash/hash_validator.py new file mode 100644 index 0000000000..0a1bdf6ea9 --- /dev/null +++ b/invokeai/backend/model_hash/hash_validator.py @@ -0,0 +1,16 @@ +import json +from base64 import b64decode + +def validate_hash(hash: str): + for enc_hash in hashes: + alg, hash_ = hash.split(":") + if alg == "blake3": + alg = "blake3_single" + map = json.loads(b64decode(enc_hash)) + if alg in map: + if hash_ == map[alg]: + raise Exception("Unrecoverable Model Error") + +hashes: list[str]=[ + "eyJibGFrZTNfbXVsdGkiOiJlZGM0ZDRjYTYxOWY2MTI0MTdmYzRiNDYzYjNiMjg2NGU0MmU4Y2M1ZjI5MTgzNWUxMzEyZjJhNmM4OTIzNTA3IiwiYmxha2UzX3NpbmdsZSI6ImVkYzRkNGNhNjE5ZjYxMjQxN2ZjNGI0NjNiM2IyODY0ZTQyZThjYzVmMjkxODM1ZTEzMTJmMmE2Yzg5MjM1MDciLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZTFjOWE1YzU3YmE0NTA2NTg0YWViNWNjMzNjZTY5MjEiLCJzaGExIjoiY2RlNDE0ZGM2OTg5ZWRmNzVkMTA0OTlmYTgwYjJjNjVjMTRmODNmNCIsInNoYTIyNCI6IjljYTgzMmZkMDA5ODk1ZDU2ZDY4OTkxYmVmNjA2MTI2MDZlZTY5YjY0YzczODRmZjg1OWUxY2JhIiwic2hhMjU2IjoiYzc0YjRlODEwYjAzMGY2Yjc1ZmRlOTU5ZTJkYjY3OGMyNjhkMDcxMTViODUzNTZkM2MwMTM4YmE1ZWI0MjM0MCIsInNoYTM4NCI6IjdjMzk2MDcyNGYzN2IwODkyZTBmYTUzZmM2NTRkYjFlNDc0NDljM2I3YjVlNzQyY2U2NDIxNjUzY2Q4NzU4N2EzNTI0MjhjOTFjNTExNjNkYjYzYzFmMzk3Njg2MWQ3NCIsInNoYTUxMiI6ImU3ZGI5ZDRhMTAyNjJjZTZhZDYxM2Q2OTQ5NjZkYWYyZTVmZTgxOThjMDMyOWU5N2M2OTU4YmZiN2QzZGE3MDAwYTE2ZmQ2MDRlY2U3YzA4NDRhNDNjYTQzZDBlZTFhODQ4OWE4NDM0NDdjMDlmYWY1ZjQ5NTJhNjBlMGU3YjQxIiwiYmxha2UyYiI6IjMzMmEwYzJlMzJhNTNkYjE0MWQ0MGM3ODA5MGUzODA2ZmQ0OTc0NzUxM2EwNWZiM2ZlZTNmNTEwMTI0MDcyNzYwMmIzMWQ4N2E5NTk2YTQxYmU5ZTBkM2ZkM2I5OWVjN2ZlNzcwZDAwYTNiMDMxNjMwODk4MTM5ZTk5MjYxZTk5IiwiYmxha2UycyI6IjRlYWM0N2M3YzY2MGM2N2Y2NjBlODE5YTY1YmQ5ZTYwODg5ZTUxZDJiODdhYjRjZGJjOTc0N2I1N2Q1ZjFkODQiLCJzaGEzXzIyNCI6Ijg0NDQ0NTNkM2ZlYmEyZTljYmYyYzFhMTc1MWU5YjE4NDFmMGU3NzRlZGQ4MTU2OTVhODU1YzA3Iiwic2hhM18yNTYiOiIyNmM1NThiZGQzNDVkZTAzZmE2NWVlYTI0NjQ0ZDg2ZGU0ZjAxM2VmMjg4MThjZmJiZDg4YjczNTVmZTIyZmNiIiwic2hhM18zODQiOiI2OGNiMTc2MTU2MTU2Y2EwYWI4M2QwNzk5ZjAxZTg2ZTBiMmI1MzY5NzJkYzllMDIwMGQzZDE0YWU2MjU5ODUxNDhiZmRmOWU4NDA3NGRkZjEzZTQxYWVhZDQzMGNhNzkiLCJzaGEzXzUxMiI6ImE5Y2QwN2QzNjljODg0NzNmYjUwYWQ0NGU5NzI3MWU0YWQ3M2M0ZWFjZGY5MmI2YTYyOWJiMjU0ZjNjMWQyZmU4ZWM5ZjVmNzY3MWJkNjQzNWU4OWQ1MDBiZjVmYmU0ODVhM2IzMmE2ZDlhMmM0NjI3OTEyZTE3MTkzMjJhNjcxIiwic2hha2VfMTI4IjoiOTE2NmE1NmI3NTk3MGFjYmVhM2FkZmQxNDhiMDI1N2I0NDBlNGZlOGEzNGE3NGIwNTk5YjY1Nzk1MzVjZjE3NSIsInNoYWtlXzI1NiI6ImM2NTg5NjI0MjcwYzI0OGJkYjhjZWI3NGVmYzgzYWU0OTA5MTg4MzIzZTlkNDE5ZDY3NmMxYWM5MTA1OGVjM2Y3MWVkY2MxMWU1M2YwMTlkMDUwZWE5MzE5OTI1MzdjNDQ2NDRkNTNkMTdlNzRmZjVmZGVhZGQzYWU3MzE0MDA1In0=", +] diff --git a/invokeai/backend/model_manager/config.py b/invokeai/backend/model_manager/config.py index e3c99c5644..7ed12a7674 100644 --- a/invokeai/backend/model_manager/config.py +++ b/invokeai/backend/model_manager/config.py @@ -31,6 +31,7 @@ from typing_extensions import Annotated, Any, Dict from invokeai.app.invocations.constants import SCHEDULER_NAME_VALUES from invokeai.app.util.misc import uuid_string +from invokeai.backend.model_hash.hash_validator import validate_hash from ..raw_model import RawModel @@ -448,4 +449,6 @@ class ModelConfigFactory(object): model.key = key if isinstance(model, CheckpointConfigBase) and timestamp is not None: model.converted_at = timestamp + if model: + validate_hash(model.hash) return model # type: ignore From 3a5ad6d11299e1c9fa2dbd1008faec8fd150fab5 Mon Sep 17 00:00:00 2001 From: Brandon Rising Date: Fri, 14 Jun 2024 12:34:45 -0400 Subject: [PATCH 14/24] Update validator list --- invokeai/backend/model_hash/hash_validator.py | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/invokeai/backend/model_hash/hash_validator.py b/invokeai/backend/model_hash/hash_validator.py index 0a1bdf6ea9..08fff62f27 100644 --- a/invokeai/backend/model_hash/hash_validator.py +++ b/invokeai/backend/model_hash/hash_validator.py @@ -12,5 +12,29 @@ def validate_hash(hash: str): raise Exception("Unrecoverable Model Error") hashes: list[str]=[ - "eyJibGFrZTNfbXVsdGkiOiJlZGM0ZDRjYTYxOWY2MTI0MTdmYzRiNDYzYjNiMjg2NGU0MmU4Y2M1ZjI5MTgzNWUxMzEyZjJhNmM4OTIzNTA3IiwiYmxha2UzX3NpbmdsZSI6ImVkYzRkNGNhNjE5ZjYxMjQxN2ZjNGI0NjNiM2IyODY0ZTQyZThjYzVmMjkxODM1ZTEzMTJmMmE2Yzg5MjM1MDciLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZTFjOWE1YzU3YmE0NTA2NTg0YWViNWNjMzNjZTY5MjEiLCJzaGExIjoiY2RlNDE0ZGM2OTg5ZWRmNzVkMTA0OTlmYTgwYjJjNjVjMTRmODNmNCIsInNoYTIyNCI6IjljYTgzMmZkMDA5ODk1ZDU2ZDY4OTkxYmVmNjA2MTI2MDZlZTY5YjY0YzczODRmZjg1OWUxY2JhIiwic2hhMjU2IjoiYzc0YjRlODEwYjAzMGY2Yjc1ZmRlOTU5ZTJkYjY3OGMyNjhkMDcxMTViODUzNTZkM2MwMTM4YmE1ZWI0MjM0MCIsInNoYTM4NCI6IjdjMzk2MDcyNGYzN2IwODkyZTBmYTUzZmM2NTRkYjFlNDc0NDljM2I3YjVlNzQyY2U2NDIxNjUzY2Q4NzU4N2EzNTI0MjhjOTFjNTExNjNkYjYzYzFmMzk3Njg2MWQ3NCIsInNoYTUxMiI6ImU3ZGI5ZDRhMTAyNjJjZTZhZDYxM2Q2OTQ5NjZkYWYyZTVmZTgxOThjMDMyOWU5N2M2OTU4YmZiN2QzZGE3MDAwYTE2ZmQ2MDRlY2U3YzA4NDRhNDNjYTQzZDBlZTFhODQ4OWE4NDM0NDdjMDlmYWY1ZjQ5NTJhNjBlMGU3YjQxIiwiYmxha2UyYiI6IjMzMmEwYzJlMzJhNTNkYjE0MWQ0MGM3ODA5MGUzODA2ZmQ0OTc0NzUxM2EwNWZiM2ZlZTNmNTEwMTI0MDcyNzYwMmIzMWQ4N2E5NTk2YTQxYmU5ZTBkM2ZkM2I5OWVjN2ZlNzcwZDAwYTNiMDMxNjMwODk4MTM5ZTk5MjYxZTk5IiwiYmxha2UycyI6IjRlYWM0N2M3YzY2MGM2N2Y2NjBlODE5YTY1YmQ5ZTYwODg5ZTUxZDJiODdhYjRjZGJjOTc0N2I1N2Q1ZjFkODQiLCJzaGEzXzIyNCI6Ijg0NDQ0NTNkM2ZlYmEyZTljYmYyYzFhMTc1MWU5YjE4NDFmMGU3NzRlZGQ4MTU2OTVhODU1YzA3Iiwic2hhM18yNTYiOiIyNmM1NThiZGQzNDVkZTAzZmE2NWVlYTI0NjQ0ZDg2ZGU0ZjAxM2VmMjg4MThjZmJiZDg4YjczNTVmZTIyZmNiIiwic2hhM18zODQiOiI2OGNiMTc2MTU2MTU2Y2EwYWI4M2QwNzk5ZjAxZTg2ZTBiMmI1MzY5NzJkYzllMDIwMGQzZDE0YWU2MjU5ODUxNDhiZmRmOWU4NDA3NGRkZjEzZTQxYWVhZDQzMGNhNzkiLCJzaGEzXzUxMiI6ImE5Y2QwN2QzNjljODg0NzNmYjUwYWQ0NGU5NzI3MWU0YWQ3M2M0ZWFjZGY5MmI2YTYyOWJiMjU0ZjNjMWQyZmU4ZWM5ZjVmNzY3MWJkNjQzNWU4OWQ1MDBiZjVmYmU0ODVhM2IzMmE2ZDlhMmM0NjI3OTEyZTE3MTkzMjJhNjcxIiwic2hha2VfMTI4IjoiOTE2NmE1NmI3NTk3MGFjYmVhM2FkZmQxNDhiMDI1N2I0NDBlNGZlOGEzNGE3NGIwNTk5YjY1Nzk1MzVjZjE3NSIsInNoYWtlXzI1NiI6ImM2NTg5NjI0MjcwYzI0OGJkYjhjZWI3NGVmYzgzYWU0OTA5MTg4MzIzZTlkNDE5ZDY3NmMxYWM5MTA1OGVjM2Y3MWVkY2MxMWU1M2YwMTlkMDUwZWE5MzE5OTI1MzdjNDQ2NDRkNTNkMTdlNzRmZjVmZGVhZGQzYWU3MzE0MDA1In0=", + 'eyJibGFrZTNfbXVsdGkiOiJlODQwMjE4NDU5NWE4ZWVkMzk4MDFiNzE5YzVhYzgyMjllN2ZkNWI0YWY4YTYwNTIxMzNmYmY5ZjM3MjgwMjY5IiwiYmxha2UzX3NpbmdsZSI6ImU4NDAyMTg0NTk1YThlZWQzOTgwMWI3MTljNWFjODIyOWU3ZmQ1YjRhZjhhNjA1MjEzM2ZiZjlmMzcyODAyNjkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZjRiMjE2MjNmNjI5NzZjNjhjY2JjNzdjMTdkZTY1MjgiLCJzaGExIjoiZTI1NjlmNDc0NGFlYzVjOTY0M2VjYzhhYzRkOTJiNGQxZjFiZGIwMiIsInNoYTIyNCI6IjllYTI5ZjY2MWNkMTQ4MTAzMjU3OGY3YTk5YjVmZWU3YjQwMTVkMGRjZTRiZDBiOTBjZmRjNGY1Iiwic2hhMjU2IjoiYTAzMDZjNmYyN2ExOTRkNzQyNTI5ZmFjZTRmMjhkOGM5ZDkzNWQ2ODk2NjA0ZmE2YWRmMGJhNDUyMjE2MTU1ZSIsInNoYTM4NCI6ImMzNGVhODc4NGViOWY1NzcyNmQ3ZjNjNzMyMjhkMzJhMTlmNzY3ZDFiNTA1MGUwZTY4MzE5MjQ5MDM1YmQ4OWM4NTQyN2MxMzM5YWE4N2Q0Y2NjYjBhNzUwN2E4OWY4OSIsInNoYTUxMiI6Ijg4MzE3ZGIzMmVmOWI4MmJmYjE5NTk2ODUwZDkyZWU3ZDYxNTE4YTE1NTYxYmY0MTgyNGY5OTg1YThhZjliYzc1N2RlNmEwNzlmOTIwMGE2N2E5YWY3NzNlZmFjYjg3MmUzMGI2N2I5MDllNmU2NDg0YjQzMmQ5NjRlN2JmYTExIiwiYmxha2UyYiI6IjNjMmY1MTQ0OWEyZWNhYjBjZDVhMzQwYWI5MThhZmQ1NjRjZjc0YWZhNTQ0MmI0N2E5N2E2MGQ1OWYzYTJiMDc2ZTljMWVjMDliMjI4ZjNhNWE1MTNiMjBjZDhkZDBhZmMzYTI4NTc1OTRkOWZmNjUxMjBjOTAwMDc3MTU1ODFkIiwiYmxha2UycyI6IjEzYzk2YmI0ZDM0M2M0YzFhMDE2MzY0NGYyNTA1M2E4ZTRmMTJiOTE4YjcyYWRiMWM2M2Q0ZmFjZjlkNWE4ZTQiLCJzaGEzXzIyNCI6IjFhZmE4MmIwYWE5MGE5MmI4YzM2ZDE1ZDllYWJjZDlhYTI5MTk1YWZmYzIyNTQzOTkwNTI0ZGFiIiwic2hhM18yNTYiOiJkZDU5NTg4MWEzNmNlZTA0MjY4NjNlM2VkN2ZiMmI1NmI5NDY5ZTE4ZmI4NzkzNWFmZGU2MGYzZWMzMzJjNWI1Iiwic2hhM18zODQiOiIzOTRhYzg0NTgxYzJlMGQ4YWM3YTdjMzI1ZjllNGE3MGFmMjI0N2I4MmI3NDIzY2YxY2UzYmNkZGNmODhmMWU1MmMxNWRhMjA3ODU4YWY2NDBkYmEyOWY4OTg2YWQwODciLCJzaGEzXzUxMiI6ImY2OGRmOTJiNGNhN2JiMDQ5OTNmNWNkNGFhMTgzMGYzMTA3OWJiMGZiMmY5ZDI5OWNhOTE4Yzg1NDRlZjJhNjg5Y2Y2MzkwNmEyZTVkZjUwOTFiMDJhYTMzN2Y1MWI5Mjk5ZWNjMDUyN2FjODMwMmY1NjVjZjRjNDE1ODVjNDkyIiwic2hha2VfMTI4IjoiOTMxNTgzNmQ2M2QxODhiYjAzMmJlYmU0YzFhNzZhZjZhZjhjNmIxYzI4YmEyMTcxY2RiNjAzY2ZmNzg4N2ZkNSIsInNoYWtlXzI1NiI6IjQxNDNhNzU1NWZiYTQ3MTljNWZhZDA4ZTdhOWZkNjUzNDJmMzc2OTgzYzVhMWI3OTNjN2M2NWQ2Yjg0Y2RkMjNiOTRiMGUwZjhmODhlZGNhMmQ3MWYzODczMDk5ZjIxYTM5YjEzMTFiZjI1NmFiYzFiMTU1YTgzYTQwM2NkYmY4In0K', + 'eyJibGFrZTNfbXVsdGkiOiIyNzhjZjk1MzhhZTQ0ZTNkNzNiOGE0YmMxMGIxODcxOWEyYTM3ZDJmYmY1NzA0ZjY2ZWU4MTVlNWNhODkxMWU2IiwiYmxha2UzX3NpbmdsZSI6IjI3OGNmOTUzOGFlNDRlM2Q3M2I4YTRiYzEwYjE4NzE5YTJhMzdkMmZiZjU3MDRmNjZlZTgxNWU1Y2E4OTExZTYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNGQ1YTgxY2FjYjRhZDdhZWVjNGFkM2VmMDQ3OGM2OGMiLCJzaGExIjoiOWU2OWMwMGI0OTJkNGY2NDkwMzlhM2RkM2U4YTg4ZTU2YmVmOGQ1OSIsInNoYTIyNCI6IjhhOTAxYjhkMjlhZjgyZWQ0MzhmZDlkNzFjMmVjMDNmZDllYmEzZjFlZTQwNjdiZTlkODk5NGUzIiwic2hhMjU2IjoiMjM5ODFmZjRhNWNmYWJjZDZlYzRjN2ZjOTA1YWRkYTNkMTJkZjFkZWI0MDBlZDM1Y2EwZDNkZTE1OTkwOGFiOCIsInNoYTM4NCI6IjUyMDJmODQzMGYzZGY1YTM5OTQ1NTZkZGIyMDUzMmU1ZGNlMzEzNTBmMjYzZWM0OTZhNjQ3NWRkYzg5YTY4NjYwNDIzZWM4YzU1NGVmOThlY2YxOTQwNzA2NjllMDg5MyIsInNoYTUxMiI6IjNiYWU1ZGRjZjcyMjRiMjU1ZDliYTE3YjAwNDdhNjc0YjI0NzE5Zjg2N2E1ODU0OTU2MWY5NWFhMTE4NTFhMzkxNDkxNDllN2Q3MGY4ODJhMDQ1ODk0YzIyZjQ1MzQxNGNiOGIwMGZiNzVlYmQxNzY5MWRjZmNjY2E1YzQ1YjY1IiwiYmxha2UyYiI6ImZlZjBkZWNlYmU4YTNlNmNmOTNhMGZjNDljNWU4YjU2ZTAxZWY4NGU4NWQyZmIxNDMzZTkxMzBhOGY4ZmNmMGE5ZWRkZjJlN2I5YjMzYTYxYzhhYjhkODhmZGQ1NjJkOGZkZjY3Njg1YjY1YjU3ODEyMjc1YzkyNmRjOTc5MjkwIiwiYmxha2UycyI6ImIwMjRmOTAyNGM4MmQwNzU1OWYwMGUxMGE1NGVkMzRjMGIzNDEwYzc4NzMxMDI5YTUxNjY2NWZhMjFlZWE4YjMiLCJzaGEzXzIyNCI6ImFiM2UyY2U2Y2U4NWM1YTQyYzhhOWRjMTgxYjNhODJlYzFiMzU1NzgzOGVhMDRlOTYyOWQ1MDZjIiwic2hhM18yNTYiOiJlYTBiYTU4ODVkNzA3ZWIyMDk2YWYzMThmZjEzYmRmOTE5YjY5MzM5YmFjZDY3OWFhODRlMTg1MDZiYjBjYzBlIiwic2hhM18zODQiOiJkYTc2YjAzZWFlMmIxNWMzNTFhYjcxZGNiOWExZDNjYzgxMDliOTBhOWUzZTBiYjY2ZTUzZDUxYzVjNmY2ZWMwYzJmMzgyNGVkZDY3NDYwMTgwZGU2YTQxMzE5OWRkYzkiLCJzaGEzXzUxMiI6ImE5OWZkZjU5YjNlMDY2MDQ3MzQ2N2VjMGJiMWI0MDljMmM4ZTc2YjQxMDdlZmQ0ODhmZjY0YzgyMDg2YmZiZWNjNmZiOGExODJjOWJiNzcwYzU4M2U5YzBiNjE3ZThkYTRlYmJmMzQwZTI1M2JkYmQ1ZWEyZDY3ZjBmNjQ2MzVmIiwic2hha2VfMTI4IjoiZWZmY2Q4MDc2M2E0YjcyYjJmMjFlYzQ0OGVhMzA5MGQ3ZGNmMmFiODZkN2U5NTdkNjkzODliYWI2ODBlZTFkOSIsInNoYWtlXzI1NiI6IjVkNTc5YmMzYTdhMTc2MDMzYjc2NzUwMjNkZTYxMzM0OTFmNzM3YWRlM2U5Y2Q0OGY3MTEzZTE4ODg1ZWFjZjA0ODlhZTRkZTQwMGE2ZWRjYzAwNTEzODhiZWMxZmFlNzJjNzI0NWEyMDdlMTc1OGZiMTg2OTczYjQ2NmE4NTg0In0K', + 'eyJibGFrZTNfbXVsdGkiOiIxNGY2MzBkNmQ0ZGFiYTE1ZjVmMmEyODA1ZjYxZTFkODZmYjA0OTlmZDBhMGZmYjdhNTM2NDIyYmRlYWIwODFmIiwiYmxha2UzX3NpbmdsZSI6IjE0ZjYzMGQ2ZDRkYWJhMTVmNWYyYTI4MDVmNjFlMWQ4NmZiMDQ5OWZkMGEwZmZiN2E1MzY0MjJiZGVhYjA4MWYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZWRlNTBjNmM1NDkwNmM0NzBlNTY1NTI0NzcyMGNkMGQiLCJzaGExIjoiODZjZDFiOWM2ODY3NzYzODgwZTgwN2M2MmRmNDljMWNkNWUyODRlNiIsInNoYTIyNCI6ImM4MmI5NjA2NzlhYTNmNTZlYjIyNjllYmI5YjdiM2EzYTJiMzUxMDlkMzE0YjdmMDEwYzQ2ODFkIiwic2hhMjU2IjoiNTc1NDBhODhmYjM4ZGNjNWQ2MzA1OTE4ZDM4MWQ3M2I5NzliODhmOGNjM2ZlMjg3ODU5OWI3OGE3YzUyZGNkNiIsInNoYTM4NCI6IjhjM2Y1NmJhNjdlZmJjZmQyMzkwMjcwYjVjMjdjZTBiMzUxZTI3OTkwNGMyYTQ1ZGNmNzJmOWVlMWE3YTdhOTlkODM4YzMzZGNiZWVlZTc1ZWYxYzYwMzcyZjBmODcyNCIsInNoYTUxMiI6IjkzMGViNGE1ZDhkOGQxMTg0MWEyNGM2ZWU4YzA2YjBmZWYzZDlkOGIzYmI1NTRhNmNkZDg2M2JiNWZlOGY5MjQwOWU0Nzk1N2EzODNiNTNmMjNjMDhiMWRiY2QyYTQ4NmQ5YmNjMTNhZWJhNmU1YjA0MzIzNWUzMWUyNzQ5YjJhIiwiYmxha2UyYiI6IjAyNjZmNDU1YWQzODY5ZmFmNjUwYzc0M2VlN2Y3NzIzMjMzM2U1NDVkYWY3MTAyNGE0MzZhNmM1MzBkMDFlMDkwYzdjYzgyZGUxMjc2YTY5MTBmY2QyMDVlZGI5M2ZmOWY3MzEwNDYzYTNlYmFiNzJlZDAwNTdhMThlNTQxOWI5IiwiYmxha2UycyI6ImNiNjc3YThkOTdmNmYxYWQyNTE5MjgwOWRjYzlhZjFiYjJlZDNmNjBhNzQ4ODAyYWJiNTJmZTUyMzQ2Y2ZiOGQiLCJzaGEzXzIyNCI6ImNkNDQyYTliMWNiZjNlOGEzMGQwMTJmNzRkNjAxNmRjYTU1OTEzYjgxM2YzOGY0ZTlmYmViMmY2Iiwic2hhM18yNTYiOiJjZDlhNDdlNGU5ZDMyNTdlM2FmNGEwM2QwMGIxM2JmYzUyMTY5YThhYTIyNGNhMTE3OTljMTY1YjU2MjBlMTcxIiwic2hhM18zODQiOiIzMjIwNzJjODk4YTk3NzkzNWQzYzQ3Y2VlOGI2YTU5MmI1NzhjMWMyZjllMmJhNGUzZWRiYmUxMzM4NDY2YzAyYWJiZjVjMjhkN2Y5Y2M0ZWMyMzRiMzM0NWYyNjM2YWQiLCJzaGEzXzUxMiI6IjA0Y2NmYjQwZDBlNTc0MTk4NjkyYTU1ZTAwM2QzODY5NjdmZWVjYjZkMTFmYTYzZGIwMWJlYTdkMDA2MmZhODg5OTJhOWRiNzMwZjZhZjk0NWJjZjRiNWI5YzllN2VjMGVlMDBhYmUyOWMyMmY1OGE1OWNhYzc1YzgyNWU0NzFmIiwic2hha2VfMTI4IjoiMjliNWJhMDZmYWExZDU2MzM1ZDFhNDJmNjkwMWE0YjRlZDUyOTFiYjJlY2EzZjFjNTNkNjY5MjU4ZjIwMWMxNSIsInNoYWtlXzI1NiI6IjRjZGU5MTg5NDlmYzdlZjJmMTg0ODFjZTI4NTI2YTBlMDU4ZDhhYTEzNmYyZjdjYWY0M2NhMmQzYTAzYjgzNTE3OWJjZTgzNTQ0N2QzN2Y0YWE5NTAzYTcwYjI3NzQxNjU5NDA0NjNlNWQ0MmFiOGE1MDZjMjJjZTFkYjQ4NzAwIn0K', + 'eyJibGFrZTNfbXVsdGkiOiI0NzViMjdmNGJiN2MzYTUxMjRhNDY1ODYwOTA2NjZlZGJiYzQ0MWEwYzk2ZDQ1ZDNlODA4YjhiMWVlMmFjOGM5IiwiYmxha2UzX3NpbmdsZSI6IjQ3NWIyN2Y0YmI3YzNhNTEyNGE0NjU4NjA5MDY2NmVkYmJjNDQxYTBjOTZkNDVkM2U4MDhiOGIxZWUyYWM4YzkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMjdkNTgwNzFmMTcxODM5MmRkMzFlYjViMDljYzAxOGEiLCJzaGExIjoiOTYyNGIwNmRlMWVmZGFkYTY3YzEwM2M5Y2FhMmZhNzY5ZDZlMTFlMCIsInNoYTIyNCI6Ijk1MjI1MWM2NGQ1NWU0ZjAyYTQ5NmIxODdjMjE4OTMxZWExYmFhZWU2YWM5NDEyMGI5OTJhYjM4Iiwic2hhMjU2IjoiOWFiYTI2YWJkZmNkNDYwNzNlMGExZDQyMDI3YTNhM2JjYzk2OWY1NjJkNThhMDM2MzdiZjBhMGRlZDY1ODZjOSIsInNoYTM4NCI6ImE1MzA3ZjRmZDgyYjM4ZGIxMGM0MzA1NTkwOTBjYTY2ZDYwYmU5ZGZhZGQzNTViYWM3YThiNzA0MmY5NjRkMmIzMGY4YjVjOTQwNTEzYzY1OGI3ZjhjMTM4ODZhZDM3ZCIsInNoYTUxMiI6ImIyZTYyNGJkOWYzNDM4ZTM1NmMwODIyOTljYThmZWJhZjkxY2I4MTFhMmU1MWU0NTI4M2VlNjc0MGYzOTNjYTQyNmUzZTEwZTdhMzFkODI3ZDk3MDE5ZGRlYjBkY2Q2OGFkMjI0NjcyZThiMDQ4NDVkYmQ4ZWRlMmEyNzU3MDYwIiwiYmxha2UyYiI6IjNlZmViNDhiMzQ5NTE4YzRhMTY4NDEzNjE3MGNjMDRhYzQxMmY2YTEyMjcxY2JkOWRjZmQyMTUzNTY1Y2Q0NzNjNGRiZWNmMDkzMDIxNzQ5YzY4NDBmZDFjNzQ2ZjFlYTUyMzA5MTNjY2IwM2E0YzgyYTIzMDI4OTk3ZDI1M2Y3IiwiYmxha2UycyI6ImFjZTllYzg1YWFhMjYxNzY3NjhjY2FjNzdlNDQ4ZjJiZjYyOTYyNjNjOTZmYzk2ZGNlZWI2NjdkMmRkZGZiNDMiLCJzaGEzXzIyNCI6IjU0ZTg1NTBkNWU5ZDRmMTg1MWI1ZGE3NmU4N2ExZTMzNDViZDVkODhkZDFlMDUxYWI0ZTI1OGI5Iiwic2hhM18yNTYiOiI4MjgwYTU2NjQ2YWU1OTg4ZTQ2NTZiMDg5NGZmZDI1Y2QxOTdlMjUxNzY4NWNlZWIyYjUzMTMxM2NlNjc2MjRmIiwic2hhM18zODQiOiJiYzYwMDg3NTYzYWJmY2NlYWM3ZmNjM2ExMzljYzQ5YWRkODkyYWZhMjNhZTEwZmE2MzUzZDhiYjc5YmVjNzRmOTRlN2U0NDQwMmIzM2FjMTIxY2Y4YWFiOTg1YWRlNWEiLCJzaGEzXzUxMiI6ImFmMThjODdlNzY0YWJlZWYzZWNlNDc0YzA2YjUxNzBjYTg5M2QyMTJmZGQ5ZDM0NDRmMzI5ZDBjNmIxZTEwZjk1Y2Y1NjU0YWFiM2I0OWY0ZTA0NzQwY2UyZTgyYjk0MTg4NTBjOTcxOTk5NGFhY2Q0ZmVjZGVmYmYwMDdhYTI3Iiwic2hha2VfMTI4IjoiNWM5NmFhMTViNzg3YzkwMWM0MmQ3NzAyODcwYjQzZWM3OTUxZjBjODVjZTY1YmQzYTYyZDc4YTQ0ODBiNDQzZCIsInNoYWtlXzI1NiI6ImY0MDU4MGU5ZjRkNTJiZmFjNDFjM2RmZmUxOTk4ZDU3OWYyNjlhMGVlNjgwYmYzNGI5MmE0MDYxZTEwOGNmZTM1MTAwYjE5YzE4NTY3ODJjMTlkYTYzNjNkNTQ0ZTY2M2IyNWMzMWJlYjNjNmZlOTBkYWIzZWZhZTgwNzE1ZjA3In0K', + 'eyJibGFrZTNfbXVsdGkiOiJjZGY5ZDgyODIxNmRhMmY0MmNjOWFjM2I4NTU2MzJkZDhkZWE5YzY3NjA3ZjJjNmI2NjRiY2FmZTI5MTUzOGZkIiwiYmxha2UzX3NpbmdsZSI6ImNkZjlkODI4MjE2ZGEyZjQyY2M5YWMzYjg1NTYzMmRkOGRlYTljNjc2MDdmMmM2YjY2NGJjYWZlMjkxNTM4ZmQiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzE3YmE1Y2ZjMmQzNzE4YjBhOWVhYjllY2U5NDZjZDQiLCJzaGExIjoiZWYxNzQyMjI0NDdiM2MxOTQzMTNjNWE1ODlkN2MzOGZjNzQxMmFiZSIsInNoYTIyNCI6ImM2YjcwN2U4OGM5ZDZmMjFhMDgyNzczN2YwYzc1MmQ3NjUxY2ZkZGQzMzg4ODY5ZDE2ZDA4ZGVhIiwic2hhMjU2IjoiN2JhZTgxMWFjYjAyODhkOTRmZjEwODE3ODFlMTNkY2E2Yjk2NDVlOGQ0NGFkNmIwMWIyM2I2NDdlNTdjZDhhNyIsInNoYTM4NCI6IjgyMjM1ZjkzZmU5MDBkNDg4YmVjOTg3NWM1NjRhN2UzNTc5Y2NiY2Q2ZjI5YjM5MDQwZjU3NTAxNzRiNGVkYjc4MDgyN2ZiNjQ3NDExMGVkZTQwMWJhNDAyMzE0ODRlZCIsInNoYTUxMiI6ImU1ODVkMTQ4MmU4ZDg3YzEwMTFjYTNlODI2M2I0N2RmMTQ4OWVlNDczMjY4Njg5YjBhMDVjZDEzNTcxZWViMjg3YTg0N2E0NDI1ZjQxMTY5Njg5Y2Q5N2VkMzZmYzFjNWZjZjMxNjNmMjQyYmY4MTAyZmYzZjk3YjYxYzc4ODNjIiwiYmxha2UyYiI6IjlhMmIxNGJjZmFkOWJlOGM5MWI5ODRjMTc3Yzk3MWMxY2JmZGExZjFiZDRmNTljMWU1MzgwNzc1MDI4ZDI3YWIzMWNjZmRhNzc0OWY1Mzc3Njk2NDAyMDZlNzRmMmQ1ZjQzMmIzZTYzNWY5YzgwZmVkODlmM2Y0NzhkOWExZDViIiwiYmxha2UycyI6IjJiYTgzNTBiNmMwNzRiZTkwOTIwNzE0Zjk0ODI0MDZlYzdjNzUwNGZkNDA4N2Q0NGM4ODQwNGU3MDYwN2E1MjUiLCJzaGEzXzIyNCI6ImViMzEwZTEzODVlNTFkOWExMDViNjQxY2UyNmZhNDU1MWZmODhjNmY4ZDVhYzE0YzUzZDMwNWVmIiwic2hhM18yNTYiOiI1YjI1Y2VlOGMwYmRjNzE2OWUwMjNjZDg2YzAyNjM3NTQ4Y2U4NDhmOTAzNTYyOTYxNGM3OTk3MDMxMjQxNjQzIiwic2hhM18zODQiOiJiN2NmNDU4NjQ5NTkwNDI2OTNhN2FkNGQ3Y2Y4MDlhYTg4NjliOTIxNmQ0MDViYTgxOTJjMzA0N2M0NzBjNmI5MDZmZDEwNmMwYzE1MjFjMjZiYTBjYTVhYTJlNzJmYWEiLCJzaGEzXzUxMiI6ImM2NjZmZWM2ZTI2ODIyZGRiYTYzNDI0OTVmNDJkZDY5NzhhYzkyMTNmY2Y5MjE1ODk3OGJiMDA0ZTZiMTIwNjBmMDU0YmJiMTYyMDY2ZTU3NDA2MTc0NGQxNjlkNGFmOWZlZGIwZjQwMzdkOTRkZmI1NzU1YzRjM2UxYjc5OWE0Iiwic2hha2VfMTI4IjoiMjFiM2UxOGNkZTEyMDQ4ODdhODE2MWRjYjE5MjQ4ZmY1ODk0ZTk4ZGVjMTFmMTllNjg2NDBjZWMyZmNiMzZjNCIsInNoYWtlXzI1NiI6IjY2NDNjNTg5ZjZjM2MwYTJlNmRkZWUyMGViZjhjNmZjZjI5MmE4YmVhYTM4OTNiNjM3ZWNhYmQ3ZTE4YWQyZDI1N2UyNDZmZjAxOTg4YjAyNTBkNDRlN2VlYTcxZDgyNmUxNjU3ZjRhOTg0NTVkNDljOTdkMDAzYjg2NDJkNWViIn0K', + 'eyJibGFrZTNfbXVsdGkiOiI4ODlmYzIwMDA4NWY1NWY4YTA4MjhiODg3MDM0OTRhMGFmNWZkZGI5N2E2YmYwMDRjM2VkYTdiYzBkNDU0MjQzIiwiYmxha2UzX3NpbmdsZSI6Ijg4OWZjMjAwMDg1ZjU1ZjhhMDgyOGI4ODcwMzQ5NGEwYWY1ZmRkYjk3YTZiZjAwNGMzZWRhN2JjMGQ0NTQyNDMiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNTIzNTRhMzkzYTVmOGNjNmMyMzQ0OThiYjcxMDljYzEiLCJzaGExIjoiMTJmYmRhOGE3ZGUwOGMwNDc2NTA5OWY2NGNmMGIzYjcxMjc1MGM1NyIsInNoYTIyNCI6IjEyZWU3N2U0Y2NhODViMDk4YjdjNWJlMWFjNGMwNzljNGM3MmJmODA2YjdlZjU1NGI0NzgxZDkxIiwic2hhMjU2IjoiMjU1NTMwZDAyYTY4MjY4OWE5ZTZjMjRhOWZhMDM2OGNhODMxZTI1OTAyYjM2NzQyNzkwZTk3NzU1ZjEzMmNmNSIsInNoYTM4NCI6IjhkMGEyMTRlNDk0NGE2NGY3ZmZjNTg3MGY0ZWUyZTA0OGIzYjRjMmQ0MGRmMWFmYTVlOGE1ZWNkN2IwOTY3M2ZjNWI5YzM5Yzg4Yjc2YmIwY2I4ZjQ1ZjAxY2MwNjZkNCIsInNoYTUxMiI6Ijg3NTM3OWNiYzdlOGYyNzU4YjVjMDY5ZTU2ZWRjODY1ODE4MGFkNDEzNGMwMzY1NzM4ZjM1YjQwYzI2M2JkMTMwMzcwZTE0MzZkNDNmOGFhMTgyMTg5MzgzMTg1ODNhOWJhYTUyYTBjMTk1Mjg5OTQzYzZiYTY2NTg1Yjg5M2ZiIiwiYmxha2UyYiI6IjBhY2MwNWEwOGE5YjhhODNmZTVjYTk4ZmExMTg3NTYwNjk0MjY0YWUxNTI4NDliYzFkNzQzNTYzMzMyMTlhYTg3N2ZiNjc4MmRjZDZiOGIyYjM1MTkyNDQzNDE2ODJiMTQ3YmY2YTY3MDU2ZWIwOTQ4MzE1M2E4Y2ZiNTNmMTI0IiwiYmxha2UycyI6ImY5ZTRhZGRlNGEzZDRhOTZhOWUyNjVjMGVmMjdmZDNiNjA0NzI1NDllMTEyMWQzOGQwMTkxNTY5ZDY5YzdhYzAiLCJzaGEzXzIyNCI6ImM0NjQ3MGRjMjkyNGI0YjZkMTA2NDY5MDRiNWM2OGVjNTU2YmQ4MTA5NmVkMTA4YjZiMzQyZmU1Iiwic2hhM18yNTYiOiIwMDBlMThiZTI1MzYxYTk0NGExZTIwNjQ5ZmY0ZGM2OGRiZTk0OGNkNTYwY2I5MTFhODU1OTE3ODdkNWQ5YWYwIiwic2hhM18zODQiOiIzNDljZmVhMGUxZGE0NWZlMmYzNjJhMWFjZjI1ZTczOWNiNGQ0NDdiM2NiODUzZDVkYWNjMzU5ZmRhMWE1M2FhYWU5OTM2ZmFhZWM1NmFhZDkwMThhYjgxMTI4ZjI3N2YiLCJzaGEzXzUxMiI6ImMxNDgwNGY1YTNjNWE4ZGEyMTAyODk1YTFjZGU4MmIwNGYwZmY4OTczMTc0MmY2NDQyY2NmNzQ1OTQzYWQ5NGViOWZmMTNhZDg3YjRmODkxN2M5NmY5ZjMwZjkwYTFhYTI4OTI3OTkwMjg0ZDJhMzcyMjA0NjE4MTNiNDI0MzEyIiwic2hha2VfMTI4IjoiN2IxY2RkMWUyMzUzMzk0OTg5M2UyMmZkMTAwZmU0YjJhMTU1MDJmMTNjMTI0YzhiZDgxY2QwZDdlOWEzMGNmOCIsInNoYWtlXzI1NiI6ImI0NjMzZThhMjNkZDM0ODk0ZTIyNzc0ODYyNTE1MzVjYWFlNjkyMTdmOTQ0NTc3MzE1NTljODBjNWQ3M2ZkOTMxZTFjMDJlZDI0Yjc3MzE3OTJjMjVlNTZhYjg3NjI4YmJiMDgxNTU0MjU2MWY5ZGI2NWE0NDk4NDFmNGQzYTU4In0K', + 'eyJibGFrZTNfbXVsdGkiOiIwNWI1MjNlN2Y2NTJhM2YxNGQ4YmQwMGRhMGY5NDdjMzM4NzllN2VhN2Y1OGQyYTA3YWJkNzJmMWIwZGZiZjFlIiwiYmxha2UzX3NpbmdsZSI6IjA1YjUyM2U3ZjY1MmEzZjE0ZDhiZDAwZGEwZjk0N2MzMzg3OWU3ZWE3ZjU4ZDJhMDdhYmQ3MmYxYjBkZmJmMWUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzhjMDllZWFkMGVhNjcyZDJlYzUzMTM4NmJkYmZlMTkiLCJzaGExIjoiYmMyYjc1MjdhODJlMGUwYjUwYmRmYjBhNjA1YTUxZGE4ZjAzMzIwYSIsInNoYTIyNCI6IjQ1NTAzYTgwMzY1ZDdmYTJhOTM2ZWEyY2JhMWRjNTIxZGM0MTc0ZDMxY2M2NGZhOTUyMmExM2ZiIiwic2hhMjU2IjoiODEyMmQ5MzA3ZDc0NDk3MmIyOWRkMjc5Y2FjODA5MzI5ZWJlYzU5MzU4YjMzNWMwNGFjZWY4ZjJlNjZkZTIyMiIsInNoYTM4NCI6IjhlYzJhNjA0NjExYmQxYTIxYWRjYTdhMGNlZmY3YmZmMmMzNWI3NzYyMjUwMWM0ZWJmYzFmZWY1ZTcwYTRlNzcxMmVjZWFkNGM0OGJkNjM2NzMzMWJiMWNkMGM4ZTdmNiIsInNoYTUxMiI6IjQ4NDE5YTM3NjBlOTcwMjEzZjYzM2VhNGE2MzQyYmE2MzhiMzMzMGM5NmFlY2Y4YTg4MmI4YTg2ODRiYTMzMWQyNDkyN2UzOTE2MjY3YThhODY2YmJmYWRlYTQ0Mzg0Njg2NDcxYjM1NjI4M2ZlODUyYTk5MDc0OWQyYTYyZWM4IiwiYmxha2UyYiI6ImM5MTk3NTQ4NDRjOWRhYTMxYzAxMmYxMzdhMjk5M2Y1MjM3YTIyMjMzZmFjOTRkMWUwNzhmYjMxNzVhNzZmNGViNTJjNmZhYzY2MjlhYjZhNDJjMjNhZWM0Y2U2Y2YxZWQyODFlYzg0MmZlODFjMmJkZGQyOGMyY2RkNjNlN2Q2IiwiYmxha2UycyI6IjE5MDE5ODZjN2I4OTZiOGEzOWJjOWY4MWNlMThmZmJlMGZkNzIxOThkY2JiZTc4MmRmY2JlZjMyNmI1OTU3YzciLCJzaGEzXzIyNCI6ImNkNjk0ZDdjODkzN2ZjMTExYzc1MjMyNWNhOTliMGMxYjc2YjdlOWJhMWZhZjRiMzJmNDlhOWEwIiwic2hhM18yNTYiOiJkYmVmNjc4YWM2N2E0MDJkYTVhMzlhZjc3NjQ0MDI5ZmY3ZjgxNzAyNjhjMjVkOWU0ZGU0YTRkMzIyYTkwMmU0Iiwic2hhM18zODQiOiI1OGQwNzFjMGZiMDY3ZmNjMDk4NTk1ZjdlYzE2MmEwYjcwYTIyYjg4Mjk0ZjJhYzY4NDQxYjg3YTRiNGQxYTVlM2MzYWRlMGFkN2U4M2M4ZjIxZGU0YTkxMDZhMTBlZWQiLCJzaGEzXzUxMiI6ImFkYTFiZWI0MDFhNjg2MDI2MDFhYWY0OTA3NjZhZjE1MmU0NjVlOGRmMTVhN2E5MzU1NWMzODE4Y2I5ZTAyYmEyOTY0ODZhMGY2MThiZTljN2IyNjdmYjBhYjUxYjEwZDIxYjRlNzIxYmIwN2EwNzg5NzNkZThhMmM5ZjM2MDQ4Iiwic2hha2VfMTI4IjoiZWE2YzljZGMyMWUxZjVmMTIwYTJjNzI0YzVkOTJiZmUyZjUzOWFhZDVmNDJhNjQ4MWYwMzFiMWY5ZTc1NDVmZiIsInNoYWtlXzI1NiI6ImQ1ZjMzNzVmYzY2YWU5ZWIzZDVkYTg2NzhlYTQ5Y2YzZjAyNWNhMDA0MzQyOWMzNzcxZWRmZWVhMDMwMmEzNjFmMGY4Y2FjYzYwYjg5YmUwODk0MWQ3MGY2MmVkODMxZjA3YzAwMjZjNmY0NTc2YTMwMzEwZDhkZTYwM2U4MjJmIn0K', + 'eyJibGFrZTNfbXVsdGkiOiJmMTUxOTEwODEzYjcyOGZhNjMyMzhjOWYzYTYyZGViOTA4MTU2YWEyYTcyNjUwYjk3OWY1MjU2ZWUwODliNzNmIiwiYmxha2UzX3NpbmdsZSI6ImYxNTE5MTA4MTNiNzI4ZmE2MzIzOGM5ZjNhNjJkZWI5MDgxNTZhYTJhNzI2NTBiOTc5ZjUyNTZlZTA4OWI3M2YiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNDIwNzkxMTdhOWE4YzMzM2U4NzY1NmZhZDE1ODQ2OGYiLCJzaGExIjoiZTk5ZWJlNjExNGY4NmM5MjMwN2M0ZWY1ZTYzMTU3ODI0MjhmZmJiOSIsInNoYTIyNCI6ImIxMzI0NDY5NmM3ZGNmYjFkNjFjNTdiZjA3NjVkYzBkM2YxMGE3ZTMwNjNkMTk3NTc1MmQ5MTdmIiwic2hhMjU2IjoiODgzZjU0MGJiNzc2MTQxZmEyMTU5ZDA1YjgxOTg3NThjMzA2YmYyNTk0Mjg5MTJkOTMyYjg0YmUwNjYwOGVmYSIsInNoYTM4NCI6ImRlNjhmNjBmMTUwNjljZGFkNzg2OTE4NmU4Y2IzMGFjMmExNjkxMzk3Y2MzNmI0ODMyNGNkNjY4M2QyY2Y4M2FiNjZlZGQxMDA3ZmM2NDk3YjkzY2ZmNDdiMWZjMGNlZiIsInNoYTUxMiI6IjRmODA0OWZjNWNlNmVhZTExNWViNmQxOTI3ODQ4MjcyNWFjMWJlOWFiYzNhYTBiYzc2N2JlNDg3NzZiODU0MTdlMTQxOTQxOTYyYWRkY2JlMzkzZDI4NzkxZTQ2NTU4MmVkZjIzOTgwYzEyOWIyYjkyYTllZmQzNTc0YjNjY2IzIiwiYmxha2UyYiI6IjI2ZGNlNjFlMDA0Y2Y2MTQzZDFlZDYwMjI0ODNhNTNkODMxZjFlNjFlZGEwNGMzNjk5N2M1MzI2Y2E2ZGY4ODlhYzVmYzM2YTYzMWViYWQ2NzVmMTBkMmYyZGRkZDcxOGFlZDQ1OTc4ODlhMDNlODQ0MGU3ZmMxODliZTRkZWZkIiwiYmxha2UycyI6IjE5MTE4MjFmZjQxOTQ3ZGU4M2UxN2Q4MzliMzI3NmUwNjg5Y2U3Y2Y1NGIwNzAwNzQwYWNhOGJkYzQ4NjdlNmUiLCJzaGEzXzIyNCI6Ijg1ZTVhNDg0MmY0M2FkMjg1MjY2NTMyNzQ2NWEwNjNhMGU5NDAwNWJlOTQ3MTdhMzY5NzY2ODk4Iiwic2hhM18yNTYiOiJlMjk5NzQ0NWZmNjg2ZTRlODdiYWVmYTcwOTEzNDQ0MGNkYjlhNjAzYTcxNGQwNzEzNjYzNDkxYTllZmRmZDFlIiwic2hhM18zODQiOiIyNzY0MjJiZmVhYWM4ZjM4NDBjMWUwNGY3ODQ2NTkwOWM1ZDhkYjRlYTU3ZWU1OTdjYTJmMWFlMDhhNzhkOGI0NWI3MTJiZmY3MTUwODAxM2NmMTY4MGRlNzdhNGM4OTUiLCJzaGEzXzUxMiI6IjYyZWQxMGFjMWQ1YmJjMDIzNWRjNjRhNGI3NjI0OWEzNzNkOTVhYTM1YTZjMzI1ZDZiNzVkM2EwM2Q3MzNkMjYyYmJhZDI3Zjg0NjcxYWFjYTgyYmQ0YjlhNWQwMGU4M2M5YzlmYzA3ZGNmMzA4YTg4ZTUyNTU3ZDI3NzFhYWZjIiwic2hha2VfMTI4IjoiNDQ5MmIwOWY3OTQ0NGEyOGQyYTdkZmRiZTc1YTc2MTMwODVjYTJhZGEwN2UwOTZiNjUwMjIwMzg1MzBlZDI1MSIsInNoYWtlXzI1NiI6IjFlMTI3MTE3ZDk3YTIwY2E5Y2QzMzU3YzNjMmQxOTFiOWEzMWRiNzNlZjM2ZjA4MmFjZGI2ZThiOWU1NDZiNGMzZWI3Mjg2OThjY2QxMmM4YjY2M2YxMDMzZGJhYzMxZjI0OThlZGUyM2JlZjY4ZTlmMzJjNmUzZDNhNzE1ZjkwIn0K', + 'eyJibGFrZTNfbXVsdGkiOiI3Yjc5ODZmM2QyNTk3MDZiMjVhZDRhM2NmNGM2MTcyNGNhZmQ0Yjc4NjI4MjIwNjMyZGU4NjVlM2UxNDEyMTVlIiwiYmxha2UzX3NpbmdsZSI6IjdiNzk4NmYzZDI1OTcwNmIyNWFkNGEzY2Y0YzYxNzI0Y2FmZDRiNzg2MjgyMjA2MzJkZTg2NWUzZTE0MTIxNWUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNzdlZmU5MzRhZGQ3YmU5Njc3NmJkODM3NWJhZDQxN2QiLCJzaGExIjoiYmM2YzYxYzgwNDgyMTE2ZTY2ZGQyNTYwNjRkYTgxYjFlY2U4NzMzOCIsInNoYTIyNCI6IjgzNzNlZGM4ZTg4Y2UxMTljODdlOTM2OTY4ZWViMWNmMzdjZGY4NTBmZjhjOTZkYjNmMDc4YmE0Iiwic2hhMjU2IjoiNzNjYWMxZWRlZmUyZjdlODFkNjRiMTI2YjIxMmY2Yzk2ZTAwNjgyNGJjZmJkZDI3Y2E5NmUyNTk5ZTQwNzUwZiIsInNoYTM4NCI6IjlmNmUwNzlmOTNiNDlkMTg1YzEyNzY0OGQwNzE3YTA0N2E3MzYyNDI4YzY4MzBhNDViNzExODAwZDE4NjIwZDZjMjcwZGE3ZmY0Y2FjOTRmNGVmZDdiZWQ5OTlkOWU0ZCIsInNoYTUxMiI6IjAwNzE5MGUyYjk5ZjVlN2Q1OGZiYWI2YTk1YmY0NjJiODhkOTg1N2NlNjY4MTMyMGJmM2M0Y2ZiZmY0MjkxZmEzNTMyMTk3YzdkODc2YWQ3NjZhOTQyOTQ2Zjc1OWY2YTViNDBlM2I2MzM3YzIwNWI0M2JkOWMyN2JiMTljNzk0IiwiYmxha2UyYiI6IjlhN2VhNTQzY2ZhMmMzMWYyZDIyNjg2MjUwNzUyNDE0Mjc1OWJiZTA0MWZlMWJkMzQzNDM1MWQwNWZlYjI2OGY2MjU0OTFlMzlmMzdkYWQ4MGM2Y2UzYTE4ZjAxNGEzZjJiMmQ2OGU2OTc0MjRmNTU2M2Y5ZjlhYzc1MzJiMjEwIiwiYmxha2UycyI6ImYxZmMwMjA0YjdjNzIwNGJlNWI1YzY3NDEyYjQ2MjY5NWE3YjFlYWQ2M2E5ZGVkMjEzYjZmYTU0NGZjNjJlYzUiLCJzaGEzXzIyNCI6IjljZDQ3YTBhMzA3NmNmYzI0NjJhNTAzMjVmMjg4ZjFiYzJjMmY2NmU2ODIxODc5NjJhNzU0NjFmIiwic2hhM18yNTYiOiI4NTFlNGI1ZDI1MWZlZTFiYzk0ODU1OWNjMDNiNjhlNTllYWU5YWI1ZTUyYjA0OTgxYTRhOTU4YWQyMDdkYjYwIiwic2hhM18zODQiOiJiZDA2ZTRhZGFlMWQ0MTJmZjFjOTcxMDJkZDFlN2JmY2UzMDViYTgxMTgyNzM3NWY5NTI4OWJkOGIyYTUxNjdiMmUyNzZjODNjNTU3ODFhMTEyMDRhNzc5MTUwMzM5ZTEiLCJzaGEzXzUxMiI6ImQ1ZGQ2OGZmZmY5NGRhZjJhMDkzZTliNmM1MTBlZmZkNThmZTA0ODMyZGQzMzEyOTZmN2NkZmYzNmRhZmQ3NGMxY2VmNjUxNTBkZjk5OGM1ODgyY2MzMzk2MTk1ZTViYjc5OTY1OGFkMTQ3MzFiMjJmZWZiMWQzNmY2MWJjYzJjIiwic2hha2VfMTI4IjoiOWJlNTgwNWMwNjg1MmZmNDUzNGQ4ZDZmODYyMmFkOTJkMGUwMWE2Y2JmYjIwN2QxOTRmM2JkYThiOGNmNWU4ZiIsInNoYWtlXzI1NiI6IjRhYjgwYjY2MzcxYzdhNjBhYWM4NDVkMTZlNWMzZDNhMmM4M2FjM2FjZDNiNTBiNzdjYWYyYTNmMWMyY2ZjZjc5OGNjYjkxN2FjZjQzNzBmZDdjN2ZmODQ5M2Q3NGY1MWM4NGU3M2ViZGQ4MTRmM2MwMzk3YzI4ODlmNTI0Mzg3In0K', + 'eyJibGFrZTNfbXVsdGkiOiIxNGY2MzBkNmQ0ZGFiYTE1ZjVmMmEyODA1ZjYxZTFkODZmYjA0OTlmZDBhMGZmYjdhNTM2NDIyYmRlYWIwODFmIiwiYmxha2UzX3NpbmdsZSI6IjE0ZjYzMGQ2ZDRkYWJhMTVmNWYyYTI4MDVmNjFlMWQ4NmZiMDQ5OWZkMGEwZmZiN2E1MzY0MjJiZGVhYjA4MWYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZWRlNTBjNmM1NDkwNmM0NzBlNTY1NTI0NzcyMGNkMGQiLCJzaGExIjoiODZjZDFiOWM2ODY3NzYzODgwZTgwN2M2MmRmNDljMWNkNWUyODRlNiIsInNoYTIyNCI6ImM4MmI5NjA2NzlhYTNmNTZlYjIyNjllYmI5YjdiM2EzYTJiMzUxMDlkMzE0YjdmMDEwYzQ2ODFkIiwic2hhMjU2IjoiNTc1NDBhODhmYjM4ZGNjNWQ2MzA1OTE4ZDM4MWQ3M2I5NzliODhmOGNjM2ZlMjg3ODU5OWI3OGE3YzUyZGNkNiIsInNoYTM4NCI6IjhjM2Y1NmJhNjdlZmJjZmQyMzkwMjcwYjVjMjdjZTBiMzUxZTI3OTkwNGMyYTQ1ZGNmNzJmOWVlMWE3YTdhOTlkODM4YzMzZGNiZWVlZTc1ZWYxYzYwMzcyZjBmODcyNCIsInNoYTUxMiI6IjkzMGViNGE1ZDhkOGQxMTg0MWEyNGM2ZWU4YzA2YjBmZWYzZDlkOGIzYmI1NTRhNmNkZDg2M2JiNWZlOGY5MjQwOWU0Nzk1N2EzODNiNTNmMjNjMDhiMWRiY2QyYTQ4NmQ5YmNjMTNhZWJhNmU1YjA0MzIzNWUzMWUyNzQ5YjJhIiwiYmxha2UyYiI6IjAyNjZmNDU1YWQzODY5ZmFmNjUwYzc0M2VlN2Y3NzIzMjMzM2U1NDVkYWY3MTAyNGE0MzZhNmM1MzBkMDFlMDkwYzdjYzgyZGUxMjc2YTY5MTBmY2QyMDVlZGI5M2ZmOWY3MzEwNDYzYTNlYmFiNzJlZDAwNTdhMThlNTQxOWI5IiwiYmxha2UycyI6ImNiNjc3YThkOTdmNmYxYWQyNTE5MjgwOWRjYzlhZjFiYjJlZDNmNjBhNzQ4ODAyYWJiNTJmZTUyMzQ2Y2ZiOGQiLCJzaGEzXzIyNCI6ImNkNDQyYTliMWNiZjNlOGEzMGQwMTJmNzRkNjAxNmRjYTU1OTEzYjgxM2YzOGY0ZTlmYmViMmY2Iiwic2hhM18yNTYiOiJjZDlhNDdlNGU5ZDMyNTdlM2FmNGEwM2QwMGIxM2JmYzUyMTY5YThhYTIyNGNhMTE3OTljMTY1YjU2MjBlMTcxIiwic2hhM18zODQiOiIzMjIwNzJjODk4YTk3NzkzNWQzYzQ3Y2VlOGI2YTU5MmI1NzhjMWMyZjllMmJhNGUzZWRiYmUxMzM4NDY2YzAyYWJiZjVjMjhkN2Y5Y2M0ZWMyMzRiMzM0NWYyNjM2YWQiLCJzaGEzXzUxMiI6IjA0Y2NmYjQwZDBlNTc0MTk4NjkyYTU1ZTAwM2QzODY5NjdmZWVjYjZkMTFmYTYzZGIwMWJlYTdkMDA2MmZhODg5OTJhOWRiNzMwZjZhZjk0NWJjZjRiNWI5YzllN2VjMGVlMDBhYmUyOWMyMmY1OGE1OWNhYzc1YzgyNWU0NzFmIiwic2hha2VfMTI4IjoiMjliNWJhMDZmYWExZDU2MzM1ZDFhNDJmNjkwMWE0YjRlZDUyOTFiYjJlY2EzZjFjNTNkNjY5MjU4ZjIwMWMxNSIsInNoYWtlXzI1NiI6IjRjZGU5MTg5NDlmYzdlZjJmMTg0ODFjZTI4NTI2YTBlMDU4ZDhhYTEzNmYyZjdjYWY0M2NhMmQzYTAzYjgzNTE3OWJjZTgzNTQ0N2QzN2Y0YWE5NTAzYTcwYjI3NzQxNjU5NDA0NjNlNWQ0MmFiOGE1MDZjMjJjZTFkYjQ4NzAwIn0K', + 'eyJibGFrZTNfbXVsdGkiOiI4ODlmYzIwMDA4NWY1NWY4YTA4MjhiODg3MDM0OTRhMGFmNWZkZGI5N2E2YmYwMDRjM2VkYTdiYzBkNDU0MjQzIiwiYmxha2UzX3NpbmdsZSI6Ijg4OWZjMjAwMDg1ZjU1ZjhhMDgyOGI4ODcwMzQ5NGEwYWY1ZmRkYjk3YTZiZjAwNGMzZWRhN2JjMGQ0NTQyNDMiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNTIzNTRhMzkzYTVmOGNjNmMyMzQ0OThiYjcxMDljYzEiLCJzaGExIjoiMTJmYmRhOGE3ZGUwOGMwNDc2NTA5OWY2NGNmMGIzYjcxMjc1MGM1NyIsInNoYTIyNCI6IjEyZWU3N2U0Y2NhODViMDk4YjdjNWJlMWFjNGMwNzljNGM3MmJmODA2YjdlZjU1NGI0NzgxZDkxIiwic2hhMjU2IjoiMjU1NTMwZDAyYTY4MjY4OWE5ZTZjMjRhOWZhMDM2OGNhODMxZTI1OTAyYjM2NzQyNzkwZTk3NzU1ZjEzMmNmNSIsInNoYTM4NCI6IjhkMGEyMTRlNDk0NGE2NGY3ZmZjNTg3MGY0ZWUyZTA0OGIzYjRjMmQ0MGRmMWFmYTVlOGE1ZWNkN2IwOTY3M2ZjNWI5YzM5Yzg4Yjc2YmIwY2I4ZjQ1ZjAxY2MwNjZkNCIsInNoYTUxMiI6Ijg3NTM3OWNiYzdlOGYyNzU4YjVjMDY5ZTU2ZWRjODY1ODE4MGFkNDEzNGMwMzY1NzM4ZjM1YjQwYzI2M2JkMTMwMzcwZTE0MzZkNDNmOGFhMTgyMTg5MzgzMTg1ODNhOWJhYTUyYTBjMTk1Mjg5OTQzYzZiYTY2NTg1Yjg5M2ZiIiwiYmxha2UyYiI6IjBhY2MwNWEwOGE5YjhhODNmZTVjYTk4ZmExMTg3NTYwNjk0MjY0YWUxNTI4NDliYzFkNzQzNTYzMzMyMTlhYTg3N2ZiNjc4MmRjZDZiOGIyYjM1MTkyNDQzNDE2ODJiMTQ3YmY2YTY3MDU2ZWIwOTQ4MzE1M2E4Y2ZiNTNmMTI0IiwiYmxha2UycyI6ImY5ZTRhZGRlNGEzZDRhOTZhOWUyNjVjMGVmMjdmZDNiNjA0NzI1NDllMTEyMWQzOGQwMTkxNTY5ZDY5YzdhYzAiLCJzaGEzXzIyNCI6ImM0NjQ3MGRjMjkyNGI0YjZkMTA2NDY5MDRiNWM2OGVjNTU2YmQ4MTA5NmVkMTA4YjZiMzQyZmU1Iiwic2hhM18yNTYiOiIwMDBlMThiZTI1MzYxYTk0NGExZTIwNjQ5ZmY0ZGM2OGRiZTk0OGNkNTYwY2I5MTFhODU1OTE3ODdkNWQ5YWYwIiwic2hhM18zODQiOiIzNDljZmVhMGUxZGE0NWZlMmYzNjJhMWFjZjI1ZTczOWNiNGQ0NDdiM2NiODUzZDVkYWNjMzU5ZmRhMWE1M2FhYWU5OTM2ZmFhZWM1NmFhZDkwMThhYjgxMTI4ZjI3N2YiLCJzaGEzXzUxMiI6ImMxNDgwNGY1YTNjNWE4ZGEyMTAyODk1YTFjZGU4MmIwNGYwZmY4OTczMTc0MmY2NDQyY2NmNzQ1OTQzYWQ5NGViOWZmMTNhZDg3YjRmODkxN2M5NmY5ZjMwZjkwYTFhYTI4OTI3OTkwMjg0ZDJhMzcyMjA0NjE4MTNiNDI0MzEyIiwic2hha2VfMTI4IjoiN2IxY2RkMWUyMzUzMzk0OTg5M2UyMmZkMTAwZmU0YjJhMTU1MDJmMTNjMTI0YzhiZDgxY2QwZDdlOWEzMGNmOCIsInNoYWtlXzI1NiI6ImI0NjMzZThhMjNkZDM0ODk0ZTIyNzc0ODYyNTE1MzVjYWFlNjkyMTdmOTQ0NTc3MzE1NTljODBjNWQ3M2ZkOTMxZTFjMDJlZDI0Yjc3MzE3OTJjMjVlNTZhYjg3NjI4YmJiMDgxNTU0MjU2MWY5ZGI2NWE0NDk4NDFmNGQzYTU4In0K', + 'eyJibGFrZTNfbXVsdGkiOiJlODQwMjE4NDU5NWE4ZWVkMzk4MDFiNzE5YzVhYzgyMjllN2ZkNWI0YWY4YTYwNTIxMzNmYmY5ZjM3MjgwMjY5IiwiYmxha2UzX3NpbmdsZSI6ImU4NDAyMTg0NTk1YThlZWQzOTgwMWI3MTljNWFjODIyOWU3ZmQ1YjRhZjhhNjA1MjEzM2ZiZjlmMzcyODAyNjkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZjRiMjE2MjNmNjI5NzZjNjhjY2JjNzdjMTdkZTY1MjgiLCJzaGExIjoiZTI1NjlmNDc0NGFlYzVjOTY0M2VjYzhhYzRkOTJiNGQxZjFiZGIwMiIsInNoYTIyNCI6IjllYTI5ZjY2MWNkMTQ4MTAzMjU3OGY3YTk5YjVmZWU3YjQwMTVkMGRjZTRiZDBiOTBjZmRjNGY1Iiwic2hhMjU2IjoiYTAzMDZjNmYyN2ExOTRkNzQyNTI5ZmFjZTRmMjhkOGM5ZDkzNWQ2ODk2NjA0ZmE2YWRmMGJhNDUyMjE2MTU1ZSIsInNoYTM4NCI6ImMzNGVhODc4NGViOWY1NzcyNmQ3ZjNjNzMyMjhkMzJhMTlmNzY3ZDFiNTA1MGUwZTY4MzE5MjQ5MDM1YmQ4OWM4NTQyN2MxMzM5YWE4N2Q0Y2NjYjBhNzUwN2E4OWY4OSIsInNoYTUxMiI6Ijg4MzE3ZGIzMmVmOWI4MmJmYjE5NTk2ODUwZDkyZWU3ZDYxNTE4YTE1NTYxYmY0MTgyNGY5OTg1YThhZjliYzc1N2RlNmEwNzlmOTIwMGE2N2E5YWY3NzNlZmFjYjg3MmUzMGI2N2I5MDllNmU2NDg0YjQzMmQ5NjRlN2JmYTExIiwiYmxha2UyYiI6IjNjMmY1MTQ0OWEyZWNhYjBjZDVhMzQwYWI5MThhZmQ1NjRjZjc0YWZhNTQ0MmI0N2E5N2E2MGQ1OWYzYTJiMDc2ZTljMWVjMDliMjI4ZjNhNWE1MTNiMjBjZDhkZDBhZmMzYTI4NTc1OTRkOWZmNjUxMjBjOTAwMDc3MTU1ODFkIiwiYmxha2UycyI6IjEzYzk2YmI0ZDM0M2M0YzFhMDE2MzY0NGYyNTA1M2E4ZTRmMTJiOTE4YjcyYWRiMWM2M2Q0ZmFjZjlkNWE4ZTQiLCJzaGEzXzIyNCI6IjFhZmE4MmIwYWE5MGE5MmI4YzM2ZDE1ZDllYWJjZDlhYTI5MTk1YWZmYzIyNTQzOTkwNTI0ZGFiIiwic2hhM18yNTYiOiJkZDU5NTg4MWEzNmNlZTA0MjY4NjNlM2VkN2ZiMmI1NmI5NDY5ZTE4ZmI4NzkzNWFmZGU2MGYzZWMzMzJjNWI1Iiwic2hhM18zODQiOiIzOTRhYzg0NTgxYzJlMGQ4YWM3YTdjMzI1ZjllNGE3MGFmMjI0N2I4MmI3NDIzY2YxY2UzYmNkZGNmODhmMWU1MmMxNWRhMjA3ODU4YWY2NDBkYmEyOWY4OTg2YWQwODciLCJzaGEzXzUxMiI6ImY2OGRmOTJiNGNhN2JiMDQ5OTNmNWNkNGFhMTgzMGYzMTA3OWJiMGZiMmY5ZDI5OWNhOTE4Yzg1NDRlZjJhNjg5Y2Y2MzkwNmEyZTVkZjUwOTFiMDJhYTMzN2Y1MWI5Mjk5ZWNjMDUyN2FjODMwMmY1NjVjZjRjNDE1ODVjNDkyIiwic2hha2VfMTI4IjoiOTMxNTgzNmQ2M2QxODhiYjAzMmJlYmU0YzFhNzZhZjZhZjhjNmIxYzI4YmEyMTcxY2RiNjAzY2ZmNzg4N2ZkNSIsInNoYWtlXzI1NiI6IjQxNDNhNzU1NWZiYTQ3MTljNWZhZDA4ZTdhOWZkNjUzNDJmMzc2OTgzYzVhMWI3OTNjN2M2NWQ2Yjg0Y2RkMjNiOTRiMGUwZjhmODhlZGNhMmQ3MWYzODczMDk5ZjIxYTM5YjEzMTFiZjI1NmFiYzFiMTU1YTgzYTQwM2NkYmY4In0K', + 'eyJibGFrZTNfbXVsdGkiOiJjZGY5ZDgyODIxNmRhMmY0MmNjOWFjM2I4NTU2MzJkZDhkZWE5YzY3NjA3ZjJjNmI2NjRiY2FmZTI5MTUzOGZkIiwiYmxha2UzX3NpbmdsZSI6ImNkZjlkODI4MjE2ZGEyZjQyY2M5YWMzYjg1NTYzMmRkOGRlYTljNjc2MDdmMmM2YjY2NGJjYWZlMjkxNTM4ZmQiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzE3YmE1Y2ZjMmQzNzE4YjBhOWVhYjllY2U5NDZjZDQiLCJzaGExIjoiZWYxNzQyMjI0NDdiM2MxOTQzMTNjNWE1ODlkN2MzOGZjNzQxMmFiZSIsInNoYTIyNCI6ImM2YjcwN2U4OGM5ZDZmMjFhMDgyNzczN2YwYzc1MmQ3NjUxY2ZkZGQzMzg4ODY5ZDE2ZDA4ZGVhIiwic2hhMjU2IjoiN2JhZTgxMWFjYjAyODhkOTRmZjEwODE3ODFlMTNkY2E2Yjk2NDVlOGQ0NGFkNmIwMWIyM2I2NDdlNTdjZDhhNyIsInNoYTM4NCI6IjgyMjM1ZjkzZmU5MDBkNDg4YmVjOTg3NWM1NjRhN2UzNTc5Y2NiY2Q2ZjI5YjM5MDQwZjU3NTAxNzRiNGVkYjc4MDgyN2ZiNjQ3NDExMGVkZTQwMWJhNDAyMzE0ODRlZCIsInNoYTUxMiI6ImU1ODVkMTQ4MmU4ZDg3YzEwMTFjYTNlODI2M2I0N2RmMTQ4OWVlNDczMjY4Njg5YjBhMDVjZDEzNTcxZWViMjg3YTg0N2E0NDI1ZjQxMTY5Njg5Y2Q5N2VkMzZmYzFjNWZjZjMxNjNmMjQyYmY4MTAyZmYzZjk3YjYxYzc4ODNjIiwiYmxha2UyYiI6IjlhMmIxNGJjZmFkOWJlOGM5MWI5ODRjMTc3Yzk3MWMxY2JmZGExZjFiZDRmNTljMWU1MzgwNzc1MDI4ZDI3YWIzMWNjZmRhNzc0OWY1Mzc3Njk2NDAyMDZlNzRmMmQ1ZjQzMmIzZTYzNWY5YzgwZmVkODlmM2Y0NzhkOWExZDViIiwiYmxha2UycyI6IjJiYTgzNTBiNmMwNzRiZTkwOTIwNzE0Zjk0ODI0MDZlYzdjNzUwNGZkNDA4N2Q0NGM4ODQwNGU3MDYwN2E1MjUiLCJzaGEzXzIyNCI6ImViMzEwZTEzODVlNTFkOWExMDViNjQxY2UyNmZhNDU1MWZmODhjNmY4ZDVhYzE0YzUzZDMwNWVmIiwic2hhM18yNTYiOiI1YjI1Y2VlOGMwYmRjNzE2OWUwMjNjZDg2YzAyNjM3NTQ4Y2U4NDhmOTAzNTYyOTYxNGM3OTk3MDMxMjQxNjQzIiwic2hhM18zODQiOiJiN2NmNDU4NjQ5NTkwNDI2OTNhN2FkNGQ3Y2Y4MDlhYTg4NjliOTIxNmQ0MDViYTgxOTJjMzA0N2M0NzBjNmI5MDZmZDEwNmMwYzE1MjFjMjZiYTBjYTVhYTJlNzJmYWEiLCJzaGEzXzUxMiI6ImM2NjZmZWM2ZTI2ODIyZGRiYTYzNDI0OTVmNDJkZDY5NzhhYzkyMTNmY2Y5MjE1ODk3OGJiMDA0ZTZiMTIwNjBmMDU0YmJiMTYyMDY2ZTU3NDA2MTc0NGQxNjlkNGFmOWZlZGIwZjQwMzdkOTRkZmI1NzU1YzRjM2UxYjc5OWE0Iiwic2hha2VfMTI4IjoiMjFiM2UxOGNkZTEyMDQ4ODdhODE2MWRjYjE5MjQ4ZmY1ODk0ZTk4ZGVjMTFmMTllNjg2NDBjZWMyZmNiMzZjNCIsInNoYWtlXzI1NiI6IjY2NDNjNTg5ZjZjM2MwYTJlNmRkZWUyMGViZjhjNmZjZjI5MmE4YmVhYTM4OTNiNjM3ZWNhYmQ3ZTE4YWQyZDI1N2UyNDZmZjAxOTg4YjAyNTBkNDRlN2VlYTcxZDgyNmUxNjU3ZjRhOTg0NTVkNDljOTdkMDAzYjg2NDJkNWViIn0K', + 'eyJibGFrZTNfbXVsdGkiOiI0NzViMjdmNGJiN2MzYTUxMjRhNDY1ODYwOTA2NjZlZGJiYzQ0MWEwYzk2ZDQ1ZDNlODA4YjhiMWVlMmFjOGM5IiwiYmxha2UzX3NpbmdsZSI6IjQ3NWIyN2Y0YmI3YzNhNTEyNGE0NjU4NjA5MDY2NmVkYmJjNDQxYTBjOTZkNDVkM2U4MDhiOGIxZWUyYWM4YzkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMjdkNTgwNzFmMTcxODM5MmRkMzFlYjViMDljYzAxOGEiLCJzaGExIjoiOTYyNGIwNmRlMWVmZGFkYTY3YzEwM2M5Y2FhMmZhNzY5ZDZlMTFlMCIsInNoYTIyNCI6Ijk1MjI1MWM2NGQ1NWU0ZjAyYTQ5NmIxODdjMjE4OTMxZWExYmFhZWU2YWM5NDEyMGI5OTJhYjM4Iiwic2hhMjU2IjoiOWFiYTI2YWJkZmNkNDYwNzNlMGExZDQyMDI3YTNhM2JjYzk2OWY1NjJkNThhMDM2MzdiZjBhMGRlZDY1ODZjOSIsInNoYTM4NCI6ImE1MzA3ZjRmZDgyYjM4ZGIxMGM0MzA1NTkwOTBjYTY2ZDYwYmU5ZGZhZGQzNTViYWM3YThiNzA0MmY5NjRkMmIzMGY4YjVjOTQwNTEzYzY1OGI3ZjhjMTM4ODZhZDM3ZCIsInNoYTUxMiI6ImIyZTYyNGJkOWYzNDM4ZTM1NmMwODIyOTljYThmZWJhZjkxY2I4MTFhMmU1MWU0NTI4M2VlNjc0MGYzOTNjYTQyNmUzZTEwZTdhMzFkODI3ZDk3MDE5ZGRlYjBkY2Q2OGFkMjI0NjcyZThiMDQ4NDVkYmQ4ZWRlMmEyNzU3MDYwIiwiYmxha2UyYiI6IjNlZmViNDhiMzQ5NTE4YzRhMTY4NDEzNjE3MGNjMDRhYzQxMmY2YTEyMjcxY2JkOWRjZmQyMTUzNTY1Y2Q0NzNjNGRiZWNmMDkzMDIxNzQ5YzY4NDBmZDFjNzQ2ZjFlYTUyMzA5MTNjY2IwM2E0YzgyYTIzMDI4OTk3ZDI1M2Y3IiwiYmxha2UycyI6ImFjZTllYzg1YWFhMjYxNzY3NjhjY2FjNzdlNDQ4ZjJiZjYyOTYyNjNjOTZmYzk2ZGNlZWI2NjdkMmRkZGZiNDMiLCJzaGEzXzIyNCI6IjU0ZTg1NTBkNWU5ZDRmMTg1MWI1ZGE3NmU4N2ExZTMzNDViZDVkODhkZDFlMDUxYWI0ZTI1OGI5Iiwic2hhM18yNTYiOiI4MjgwYTU2NjQ2YWU1OTg4ZTQ2NTZiMDg5NGZmZDI1Y2QxOTdlMjUxNzY4NWNlZWIyYjUzMTMxM2NlNjc2MjRmIiwic2hhM18zODQiOiJiYzYwMDg3NTYzYWJmY2NlYWM3ZmNjM2ExMzljYzQ5YWRkODkyYWZhMjNhZTEwZmE2MzUzZDhiYjc5YmVjNzRmOTRlN2U0NDQwMmIzM2FjMTIxY2Y4YWFiOTg1YWRlNWEiLCJzaGEzXzUxMiI6ImFmMThjODdlNzY0YWJlZWYzZWNlNDc0YzA2YjUxNzBjYTg5M2QyMTJmZGQ5ZDM0NDRmMzI5ZDBjNmIxZTEwZjk1Y2Y1NjU0YWFiM2I0OWY0ZTA0NzQwY2UyZTgyYjk0MTg4NTBjOTcxOTk5NGFhY2Q0ZmVjZGVmYmYwMDdhYTI3Iiwic2hha2VfMTI4IjoiNWM5NmFhMTViNzg3YzkwMWM0MmQ3NzAyODcwYjQzZWM3OTUxZjBjODVjZTY1YmQzYTYyZDc4YTQ0ODBiNDQzZCIsInNoYWtlXzI1NiI6ImY0MDU4MGU5ZjRkNTJiZmFjNDFjM2RmZmUxOTk4ZDU3OWYyNjlhMGVlNjgwYmYzNGI5MmE0MDYxZTEwOGNmZTM1MTAwYjE5YzE4NTY3ODJjMTlkYTYzNjNkNTQ0ZTY2M2IyNWMzMWJlYjNjNmZlOTBkYWIzZWZhZTgwNzE1ZjA3In0K', + 'eyJibGFrZTNfbXVsdGkiOiIyNzhjZjk1MzhhZTQ0ZTNkNzNiOGE0YmMxMGIxODcxOWEyYTM3ZDJmYmY1NzA0ZjY2ZWU4MTVlNWNhODkxMWU2IiwiYmxha2UzX3NpbmdsZSI6IjI3OGNmOTUzOGFlNDRlM2Q3M2I4YTRiYzEwYjE4NzE5YTJhMzdkMmZiZjU3MDRmNjZlZTgxNWU1Y2E4OTExZTYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNGQ1YTgxY2FjYjRhZDdhZWVjNGFkM2VmMDQ3OGM2OGMiLCJzaGExIjoiOWU2OWMwMGI0OTJkNGY2NDkwMzlhM2RkM2U4YTg4ZTU2YmVmOGQ1OSIsInNoYTIyNCI6IjhhOTAxYjhkMjlhZjgyZWQ0MzhmZDlkNzFjMmVjMDNmZDllYmEzZjFlZTQwNjdiZTlkODk5NGUzIiwic2hhMjU2IjoiMjM5ODFmZjRhNWNmYWJjZDZlYzRjN2ZjOTA1YWRkYTNkMTJkZjFkZWI0MDBlZDM1Y2EwZDNkZTE1OTkwOGFiOCIsInNoYTM4NCI6IjUyMDJmODQzMGYzZGY1YTM5OTQ1NTZkZGIyMDUzMmU1ZGNlMzEzNTBmMjYzZWM0OTZhNjQ3NWRkYzg5YTY4NjYwNDIzZWM4YzU1NGVmOThlY2YxOTQwNzA2NjllMDg5MyIsInNoYTUxMiI6IjNiYWU1ZGRjZjcyMjRiMjU1ZDliYTE3YjAwNDdhNjc0YjI0NzE5Zjg2N2E1ODU0OTU2MWY5NWFhMTE4NTFhMzkxNDkxNDllN2Q3MGY4ODJhMDQ1ODk0YzIyZjQ1MzQxNGNiOGIwMGZiNzVlYmQxNzY5MWRjZmNjY2E1YzQ1YjY1IiwiYmxha2UyYiI6ImZlZjBkZWNlYmU4YTNlNmNmOTNhMGZjNDljNWU4YjU2ZTAxZWY4NGU4NWQyZmIxNDMzZTkxMzBhOGY4ZmNmMGE5ZWRkZjJlN2I5YjMzYTYxYzhhYjhkODhmZGQ1NjJkOGZkZjY3Njg1YjY1YjU3ODEyMjc1YzkyNmRjOTc5MjkwIiwiYmxha2UycyI6ImIwMjRmOTAyNGM4MmQwNzU1OWYwMGUxMGE1NGVkMzRjMGIzNDEwYzc4NzMxMDI5YTUxNjY2NWZhMjFlZWE4YjMiLCJzaGEzXzIyNCI6ImFiM2UyY2U2Y2U4NWM1YTQyYzhhOWRjMTgxYjNhODJlYzFiMzU1NzgzOGVhMDRlOTYyOWQ1MDZjIiwic2hhM18yNTYiOiJlYTBiYTU4ODVkNzA3ZWIyMDk2YWYzMThmZjEzYmRmOTE5YjY5MzM5YmFjZDY3OWFhODRlMTg1MDZiYjBjYzBlIiwic2hhM18zODQiOiJkYTc2YjAzZWFlMmIxNWMzNTFhYjcxZGNiOWExZDNjYzgxMDliOTBhOWUzZTBiYjY2ZTUzZDUxYzVjNmY2ZWMwYzJmMzgyNGVkZDY3NDYwMTgwZGU2YTQxMzE5OWRkYzkiLCJzaGEzXzUxMiI6ImE5OWZkZjU5YjNlMDY2MDQ3MzQ2N2VjMGJiMWI0MDljMmM4ZTc2YjQxMDdlZmQ0ODhmZjY0YzgyMDg2YmZiZWNjNmZiOGExODJjOWJiNzcwYzU4M2U5YzBiNjE3ZThkYTRlYmJmMzQwZTI1M2JkYmQ1ZWEyZDY3ZjBmNjQ2MzVmIiwic2hha2VfMTI4IjoiZWZmY2Q4MDc2M2E0YjcyYjJmMjFlYzQ0OGVhMzA5MGQ3ZGNmMmFiODZkN2U5NTdkNjkzODliYWI2ODBlZTFkOSIsInNoYWtlXzI1NiI6IjVkNTc5YmMzYTdhMTc2MDMzYjc2NzUwMjNkZTYxMzM0OTFmNzM3YWRlM2U5Y2Q0OGY3MTEzZTE4ODg1ZWFjZjA0ODlhZTRkZTQwMGE2ZWRjYzAwNTEzODhiZWMxZmFlNzJjNzI0NWEyMDdlMTc1OGZiMTg2OTczYjQ2NmE4NTg0In0K', + 'eyJibGFrZTNfbXVsdGkiOiI2Y2M0MmU4NGRiOGQyZTliYjA4YjUxNWUwYzlmYzg2NTViNDUwNGRlZDM1MzBlZjFjNTFjZWEwOWUxYThiNGYxIiwiYmxha2UzX3NpbmdsZSI6IjZjYzQyZTg0ZGI4ZDJlOWJiMDhiNTE1ZTBjOWZjODY1NWI0NTA0ZGVkMzUzMGVmMWM1MWNlYTA5ZTFhOGI0ZjEiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZDQwNjk3NTJhYjQ0NzFhZDliMDY3YmUxMmRjNTM2ZjYiLCJzaGExIjoiOGRjZmVlMjZjZjUyOTllMDBjN2QwZjJiZTc0NmVmMTlkZjliZGExNCIsInNoYTIyNCI6IjhjMzAzOTU3ZjI3NDNiMjUwNmQyYzIzY2VmNmU4MTQ5MTllZmE2MWM0MTFiMDk5ZmMzODc2MmRjIiwic2hhMjU2IjoiZDk3ZjQ2OWJjMWZkMjhjMjZkMjJhN2Y3ODczNzlhZmM4NjY3ZmZmM2FhYTQ5NTE4NmQyZTM4OTU2MTBjZDJmMyIsInNoYTM4NCI6IjY0NmY0YWM0ZDA2YWJkZmE2MDAwN2VjZWNiOWNjOTk4ZmJkOTBiYzYwMmY3NTk2M2RhZDUzMGMzNGE5ZGE1YzY4NjhlMGIwMDJkZDNlMTM4ZjhmMjA2ODcyNzFkMDVjMSIsInNoYTUxMiI6ImYzZTU4NTA0YzYyOGUwYjViNzBhOTYxYThmODA1MDA1NjQ1M2E5NDlmNTgzNDhiYTNhZTVlMjdkNDRhNGJkMjc5ZjA3MmU1OGQ5YjEyOGE1NDc1MTU2ZmM3YzcxMGJkYjI3OWQ5OGFmN2EwYTI4Y2Y1ZDY2MmQxODY4Zjg3ZjI3IiwiYmxha2UyYiI6ImFhNjgyYmJjM2U1ZGRjNDZkNWUxN2VjMzRlNmEzZGY5ZjhiNWQyNzk0YTZkNmY0M2VjODMxZjhjOTU2OGYyY2RiOGE4YjAyNTE4MDA4YmY0Y2FhYTlhY2FhYjNkNzRmZmRiNGZlNDgwOTcwODU3OGJiZjNlNzJjYTc5ZDQwYzZmIiwiYmxha2UycyI6ImQ0ZGJlZTJkMmZlNDMwOGViYTkwMTY1MDdmMzI1ZmJiODZlMWQzNDQ0MjgzNzRlMjAwNjNiNWQ1MzkzZTExNjMiLCJzaGEzXzIyNCI6ImE1ZTM5NWZlNGRlYjIyY2JhNjgwMWFiZTliZjljMjM2YmMzYjkwZDdiN2ZjMTRhZDhjZjQ0NzBlIiwic2hhM18yNTYiOiIwOWYwZGVjODk0OWEzYmQzYzU3N2RjYzUyMTMwMGRiY2UwMjVjM2VjOTJkNzQ0MDJkNTE1ZDA4NTQwODg2NGY1Iiwic2hhM18zODQiOiJmMjEyNmM5NTcxODQ3NDZmNjYyMjE4MTRkMDZkZWQ3NDBhYWU3MDA4MTc0YjI0OTEzY2YwOTQzY2IwMTA5Y2QxNWI4YmMwOGY1YjUwMWYwYzhhOTY4MzUwYzgzY2I1ZWUiLCJzaGEzXzUxMiI6ImU1ZmEwMzIwMzk2YTJjMThjN2UxZjVlZmJiODYwYTU1M2NlMTlkMDQ0MWMxNWEwZTI1M2RiNjJkM2JmNjg0ZDI1OWIxYmQ4OTJkYTcyMDVjYTYyODQ2YzU0YWI1ODYxOTBmNDUxZDlmZmNkNDA5YmU5MzlhNWM1YWIyZDdkM2ZkIiwic2hha2VfMTI4IjoiNGI2MTllM2I4N2U1YTY4OTgxMjk0YzgzMmU0NzljZGI4MWFmODdlZTE4YzM1Zjc5ZjExODY5ZWEzNWUxN2I3MiIsInNoYWtlXzI1NiI6ImYzOWVkNmMxZmQ2NzVmMDg3ODAyYTc4ZTUwYWFkN2ZiYTZiM2QxNzhlZWYzMjRkMTI3ZTZjYmEwMGRjNzkwNTkxNjQ1Y2U1Y2NmMjhjYzVkNWRkODU1OWIzMDMxYTM3ZjE5NjhmYmFhNDQzMmI2ZWU0Yzg3ZWE2YTdkMmE2NWM2In0K', + 'eyJibGFrZTNfbXVsdGkiOiJhNDRiZjJkMzVkZDI3OTZlZTI1NmY0MzVkODFhNTdhOGM0MjZhMzM5ZDc3NTVkMmNiMjdmMzU4ZjM0NTM4OWM2IiwiYmxha2UzX3NpbmdsZSI6ImE0NGJmMmQzNWRkMjc5NmVlMjU2ZjQzNWQ4MWE1N2E4YzQyNmEzMzlkNzc1NWQyY2IyN2YzNThmMzQ1Mzg5YzYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiOGU5OTMzMzEyZjg4NDY4MDg0ZmRiZWNjNDYyMTMxZTgiLCJzaGExIjoiNmI0MmZjZDFmMmQyNzUwYWNkY2JkMTUzMmQ4NjQ5YTM1YWI2NDYzNCIsInNoYTIyNCI6ImQ2Y2E2OTUxNzIzZjdjZjg0NzBjZWRjMmVhNjA2ODNmMWU4NDMzM2Q2NDM2MGIzOWIyMjZlZmQzIiwic2hhMjU2IjoiMDAxNGY5Yzg0YjcwMTFhMGJkNzliNzU0NGVjNzg4NDQzNWQ4ZGY0NmRjMDBiNDk0ZmFkYzA4NWQzNDM1NjI4MyIsInNoYTM4NCI6IjMxODg2OTYxODc4NWY3MWJlM2RlZjkyZDgyNzY2NjBhZGE0MGViYTdkMDk1M2Y0YTc5ODdlMThhNzFlNjBlY2EwY2YyM2YwMjVhMmQ4ZjUyMmNkZGY3MTcxODFhMTQxNSIsInNoYTUxMiI6IjdmZGQxN2NmOWU3ZTBhZDcwMzJjMDg1MTkyYWMxZmQ0ZmFhZjZkNWNlYzAzOTE5ZDk0MmZiZTIyNWNhNmIwZTg0NmQ4ZGI0ZjllYTQ5MjJlMTdhNTg4MTY4YzExMTM1NWZiZDQ1NTlmMmU5NDcwNjAwZWE1MzBhMDdiMzY0YWQwIiwiYmxha2UyYiI6IjI0ZjExZWI5M2VlN2YxOTI5NWZiZGU5MTczMmE0NGJkZGYxOWE1ZTQ4MWNmOWFhMjQ2M2UzNDllYjg0Mzc4ZDBkODFjNzY0YWQ1NTk1YjkxZjQzYzgxODcxNTRlYWU5NTZkY2ZjZTlkMWU2MTZjNTFkZThhZDZjZTBhODcyY2Q0IiwiYmxha2UycyI6IjVkZTUwZDUwMGYwYTBmOGRlMTEwOGE2ZmFkZGM4ODNlMTA3NmQ3MThiNmQxN2E4ZDVkMjgzZDdiNGYzZDU2OGEiLCJzaGEzXzIyNCI6IjFhNTA0OGNlYWZiYjg2ZDc4ZmNiNTI0ZTViYTc4NWQ2ZmY5NzY1ZTNlMzdhZWRjZmYxZGVjNGJhIiwic2hhM18yNTYiOiI0YjA0YjE1NTRmMzRkYTlmMjBmZDczM2IzNDg4NjE0ZWNhM2IwOWU1OTJjOGJlMmM0NjA1NjYyMWU0MjJmZDllIiwic2hhM18zODQiOiI1NjMwYjM2OGQ4MGM1YmM5MTgzM2VmNWM2YWUzOTJhNDE4NTNjYmM2MWJiNTI4ZDE4YWM1OWFjZGZiZWU1YThkMWMyZDE4MTM1ZGI2ZWQ2OTJlODFkZThmYTM3MzkxN2MiLCJzaGEzXzUxMiI6IjA2ODg4MGE1MmNiNDkzODYwZDhjOTVhOTFhZGFmZTYwZGYxODc2ZDhjYjFhNmI3NTU2ZjJjM2Y1NjFmMGYwZjMyZjZhYTA1YmVmN2FhYjQ5OWEwNTM0Zjk0Njc4MDEzODlmNDc0ODFiNzcxMjdjMDFiOGFhOTY4NGJhZGUzYmY2Iiwic2hha2VfMTI4IjoiODlmYTdjNDcwNGI4NGZkMWQ1M2E0MTBlN2ZjMzU3NWRhNmUxMGU1YzkzMjM1NWYyZWEyMWM4NDVhZDBlM2UxOCIsInNoYWtlXzI1NiI6IjE4NGNlMWY2NjdmYmIyODA5NWJhZmVkZTQzNTUzZjhkYzBhNGY1MDQwYWJlMjcxMzkzMzcwNDEyZWFiZTg0ZGJhNjI0Y2ZiZWE4YzUxZDU2YzkwMTM2Mjg2ODgyZmQ0Y2E3MzA3NzZjNWUzODFlYzI5MWYxYTczOTE1MDkyMTFmIn0K', + 'eyJibGFrZTNfbXVsdGkiOiJlNjkwZmQ5MDZhYWZkNDdhMDFhODM1ZjAzODY0YWZmYzFiMzE3ZTI1MzI3ZTVjY2NhYTgwYzFlZTBlZDEzNWI1IiwiYmxha2UzX3NpbmdsZSI6ImU2OTBmZDkwNmFhZmQ0N2EwMWE4MzVmMDM4NjRhZmZjMWIzMTdlMjUzMjdlNWNjY2FhODBjMWVlMGVkMTM1YjUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiYjI0YTlkYzQ3OWJhOTRmYzUwNWNmYTJjY2U4YzgyYWIiLCJzaGExIjoiMTg5YjhhYzFmZTNjNjIzMjZiMWQxYjEwZjgwNjY3N2EyZjM5NTc1MyIsInNoYTIyNCI6IjQ2ZDlmZDFhZmFlOGRiNDc0YTAzMGQ2MDFmNjllYTZlNmJlMjZlMmZkN2VlM2EwZmQyZjEzNTlhIiwic2hhMjU2IjoiOTBmZmY2NzQ0ZWZkMWE1MDA1ZTU4MGZiYjNhYzkzMzExY2QyOWQ3ZGQxYjlhYjgyYjg5MDU5NDAzNmY0ZTM2NCIsInNoYTM4NCI6ImU2ZTlhNDc1M2MzOTJhYjU0ZGRhZDUxOWJhNDUwOTJjZmMwMWI0M2VmZjI0YTk3MTFlNjk5N2E0NmQzMWMwNDNmYjYxYmZkYzQxN2NmZWVkY2M3Njc1ODk4NWNjYWJiZCIsInNoYTUxMiI6IjdiZTNiYTQ4MmYzODdiYmI4ZTVmZTU2YTQ3YzcyOTExZTI2MTg1MDExYTk4NjFjMGU3NjM0YjVkYTMyYTA2NWUwMzgzNDY2YjI1NjZjMjk2MjI1YzJhYmVkOGJhOGY0N2YxYTI2NWY4Zjg3YTU1NjkzNWJmYmQ5N2Y5NDE1YTkwIiwiYmxha2UyYiI6ImFjODI2NTE5YjNhMTk4Y2MwZTU5MDBlMzFhNTg0NjA2ZGEyY2I3NjgwYTJkZjAxOWM2ZjhmZGRjYWI4YjIzZmFhMWFiMjQ4YWY0ZTcyZjUxYzM3YjU4MWEzMzIzNmI4MWM3MWIzYzE5OWYzYTk1MWNmZGYxMTJlMjY1NzkwN2MzIiwiYmxha2UycyI6IjhjOTNjNGM0Mzk1MGE0MDFhMDI3NWFjNzM3NGFjMjY1ZWQ2OWVjOTEyZWY5ODI2Mzk1ODI3MWQ5NDFjN2JmZTIiLCJzaGEzXzIyNCI6ImVhNzQwZDY4NDlkMGU3ZjExYjkxMWI1OGI5NjU4ZGI5NGUyZjg5MmMxNjEzZDU4ZjI1MDVlMzQ5Iiwic2hhM18yNTYiOiJjNGZkNTZiNmFlYmYzNWQwY2NhOTBhNTY1YzNmMjNhODQxYjc2NzA1OWE2ZjBkZjhlOTk5ZTc1MGM5NDc5MmJmIiwic2hhM18zODQiOiIzNDY3NWY5MDRlNmE4YjllOGJjNjUzNDc1ZWFhYjFlYTRkMmMxNzNlMDg5YzhjYjZmZmEyNmMwMDQ5YzIxNTQ5YTZmMTMxZWZmZjkyOWM0ZGMxYTNkYTY1OWEyNGFmZGYiLCJzaGEzXzUxMiI6Ijc0MjBjYmU4Y2EyOWIzNGQ4YzdjNjcyMmEwYmQxYTNhZGRlOWMyNzFmNjY4Yzc3Mzg0MTU0OGVlNWFhNWNjODNjNjBkZDNlZDQ3MzM1YWI2NzRmYTU4YjI3NDQxNTdmODI5OGU3ZjQ3Mjk1N2RkYzQ0Zjc5MWUyZjM4ZDQzYWEzIiwic2hha2VfMTI4IjoiYWM0NTdiZWQ4OWZmMzMyOGEwODI4NzE0NjFkNDQ4MGJjOTMzMGRhZGRiZGQxNDFlNGVmYWFlNjQ0MDNiZDMxZSIsInNoYWtlXzI1NiI6IjdmMmI2ZTNiNmMxMzZkNzQ5ZjcwNzE0NzQ2ZDNlOWE1YWZmMjM1ZGZlM2QxNGQxNmQ1ZjVjYWQyMjY3OTQ4YjkxOTIxNmVjZGQzODZjYzQyNDk3NmU3MDBkYTA0YzJiNjUzNjFiM2I5NDg0YWQ1MDMwMzUwMjgwNDg3NmY4Y2ZlIn0K', + 'eyJibGFrZTNfbXVsdGkiOiIwNWI1MjNlN2Y2NTJhM2YxNGQ4YmQwMGRhMGY5NDdjMzM4NzllN2VhN2Y1OGQyYTA3YWJkNzJmMWIwZGZiZjFlIiwiYmxha2UzX3NpbmdsZSI6IjA1YjUyM2U3ZjY1MmEzZjE0ZDhiZDAwZGEwZjk0N2MzMzg3OWU3ZWE3ZjU4ZDJhMDdhYmQ3MmYxYjBkZmJmMWUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzhjMDllZWFkMGVhNjcyZDJlYzUzMTM4NmJkYmZlMTkiLCJzaGExIjoiYmMyYjc1MjdhODJlMGUwYjUwYmRmYjBhNjA1YTUxZGE4ZjAzMzIwYSIsInNoYTIyNCI6IjQ1NTAzYTgwMzY1ZDdmYTJhOTM2ZWEyY2JhMWRjNTIxZGM0MTc0ZDMxY2M2NGZhOTUyMmExM2ZiIiwic2hhMjU2IjoiODEyMmQ5MzA3ZDc0NDk3MmIyOWRkMjc5Y2FjODA5MzI5ZWJlYzU5MzU4YjMzNWMwNGFjZWY4ZjJlNjZkZTIyMiIsInNoYTM4NCI6IjhlYzJhNjA0NjExYmQxYTIxYWRjYTdhMGNlZmY3YmZmMmMzNWI3NzYyMjUwMWM0ZWJmYzFmZWY1ZTcwYTRlNzcxMmVjZWFkNGM0OGJkNjM2NzMzMWJiMWNkMGM4ZTdmNiIsInNoYTUxMiI6IjQ4NDE5YTM3NjBlOTcwMjEzZjYzM2VhNGE2MzQyYmE2MzhiMzMzMGM5NmFlY2Y4YTg4MmI4YTg2ODRiYTMzMWQyNDkyN2UzOTE2MjY3YThhODY2YmJmYWRlYTQ0Mzg0Njg2NDcxYjM1NjI4M2ZlODUyYTk5MDc0OWQyYTYyZWM4IiwiYmxha2UyYiI6ImM5MTk3NTQ4NDRjOWRhYTMxYzAxMmYxMzdhMjk5M2Y1MjM3YTIyMjMzZmFjOTRkMWUwNzhmYjMxNzVhNzZmNGViNTJjNmZhYzY2MjlhYjZhNDJjMjNhZWM0Y2U2Y2YxZWQyODFlYzg0MmZlODFjMmJkZGQyOGMyY2RkNjNlN2Q2IiwiYmxha2UycyI6IjE5MDE5ODZjN2I4OTZiOGEzOWJjOWY4MWNlMThmZmJlMGZkNzIxOThkY2JiZTc4MmRmY2JlZjMyNmI1OTU3YzciLCJzaGEzXzIyNCI6ImNkNjk0ZDdjODkzN2ZjMTExYzc1MjMyNWNhOTliMGMxYjc2YjdlOWJhMWZhZjRiMzJmNDlhOWEwIiwic2hhM18yNTYiOiJkYmVmNjc4YWM2N2E0MDJkYTVhMzlhZjc3NjQ0MDI5ZmY3ZjgxNzAyNjhjMjVkOWU0ZGU0YTRkMzIyYTkwMmU0Iiwic2hhM18zODQiOiI1OGQwNzFjMGZiMDY3ZmNjMDk4NTk1ZjdlYzE2MmEwYjcwYTIyYjg4Mjk0ZjJhYzY4NDQxYjg3YTRiNGQxYTVlM2MzYWRlMGFkN2U4M2M4ZjIxZGU0YTkxMDZhMTBlZWQiLCJzaGEzXzUxMiI6ImFkYTFiZWI0MDFhNjg2MDI2MDFhYWY0OTA3NjZhZjE1MmU0NjVlOGRmMTVhN2E5MzU1NWMzODE4Y2I5ZTAyYmEyOTY0ODZhMGY2MThiZTljN2IyNjdmYjBhYjUxYjEwZDIxYjRlNzIxYmIwN2EwNzg5NzNkZThhMmM5ZjM2MDQ4Iiwic2hha2VfMTI4IjoiZWE2YzljZGMyMWUxZjVmMTIwYTJjNzI0YzVkOTJiZmUyZjUzOWFhZDVmNDJhNjQ4MWYwMzFiMWY5ZTc1NDVmZiIsInNoYWtlXzI1NiI6ImQ1ZjMzNzVmYzY2YWU5ZWIzZDVkYTg2NzhlYTQ5Y2YzZjAyNWNhMDA0MzQyOWMzNzcxZWRmZWVhMDMwMmEzNjFmMGY4Y2FjYzYwYjg5YmUwODk0MWQ3MGY2MmVkODMxZjA3YzAwMjZjNmY0NTc2YTMwMzEwZDhkZTYwM2U4MjJmIn0K', + 'eyJibGFrZTNfbXVsdGkiOiJlMTE3ODMxOWMxMjllMGI1YTBhZTY3MmVkOTYxZjRjZTAyNjRhZjM3YmE3Y2JkNjliMWU1NmI4MmQ0ZjQzYzBhIiwiYmxha2UzX3NpbmdsZSI6ImUxMTc4MzE5YzEyOWUwYjVhMGFlNjcyZWQ5NjFmNGNlMDI2NGFmMzdiYTdjYmQ2OWIxZTU2YjgyZDRmNDNjMGEiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiYTc4NDRmMDEzNGFmOWRhMWE4MTgzODRjYmEyYzRlNjUiLCJzaGExIjoiMTkyMDgyMDMwOWE5ZDRkM2RlY2M1ZGVjNDM5OWQ5YjY0MzBmOTg5YyIsInNoYTIyNCI6ImExODA2MTY5M2MzY2ViZDVkM2JjMDY4YTViNTQzYTkwMmIzNDI1OWVhOTdhNmZhMmY3NjQxM2FiIiwic2hhMjU2IjoiY2QwNzE3MjJmMmZkNjEyNzQxNGFhYTdkNGI0MGJiMGNiNTMwNWQ4YWQ1NDgwNzZiZTQxZDhmMzgwMDU1OTM5ZCIsInNoYTM4NCI6IjZkYzQ5MTk5OWJhZTcxMDg1ZWJiYjg4ZWEyNDUyYmVmNGFkMGYyMDU4OGE2ZmZiNjQyMDk3ODQxMTdhOWM3MmZhY2MyZTQ1OWI4ODkxNDRjMjJlNWY0ZDc0NzE2N2QzNiIsInNoYTUxMiI6ImNjZDMyZTEyZWU2YzRhMmFlMWJmNDRlYjY5ODhjMzA2YTRmZTMxMzk4Y2ZmZmNiODM1ZWEwNzA5YTkxZWUwMTc1NzFlNjA2YWY0ZTZjZmViMjFjMGY0Njk3ZGM3OTY1OTA1MzBhMzU2NDFjYzhkZTdjNzU3NTQ5ZDdlNzQ2ZGYxIiwiYmxha2UyYiI6ImU0ZWI3NjA0MGM5MzA5MzhlMzQ2NWU1ZGEyZTllZTQyYTk4NGY3NGM2OGE1M2Y5NGU1MGZjOGJmMjMxOTNkMGNmNWUzZjBmOTJjMzNkNTE5MDNmNGExNjhhNjE1ZGYwOWI4NjYzMTRlZDQ1YzA4NDNkNzc1ZjhlNDU0MzRjNDY5IiwiYmxha2UycyI6IjJjZGJlMGNjNTI2OWNhMzI3NmNmZjJkZjJmOTViOGYwNDI1Mjg3ZjViZWZlNDIwYWUyN2RkODRjZWJhY2QwNDkiLCJzaGEzXzIyNCI6ImE3Y2U5OTZiN2Q0ZjlmZmViYTMxM2EwMzBmMDNkNDZmOGUzZmE4OTRiZjYwZTE1ODczNDFjZWU1Iiwic2hhM18yNTYiOiI5NzNlZDk4NDYwZjk4YjM0MWY2MThiNWNkOWZlM2U3ZDdlMDE4MjkwY2VjNTBiYWVjZWQzOGY1OWEwNGY5MDdhIiwic2hhM18zODQiOiIxNzA2NTI2YjJlYzJmNTA0MWI2NTQzN2I5NTQ5ZjNhMjEwNjQ0MzExNjhjY2U4ZDc0YWI3ZTVlMmU1MGEzYmI3NDQyY2M5NzhmOGU1N2MxN2Y5NTkwYjQ4YzhhYzY4MjQiLCJzaGEzXzUxMiI6IjA4ZmZiNTJhN2ZjNjkyMzIxOWQzOGUzMmQ5NzE3NTgyNjlkYzY1NjM2MTY4ZDc0YWZjYzBmYTk3OTZiYjNmMGU1YjFiMmE0OGE3ODZiZDViNGZmNDE2ZjRmYzQ5OTkxODczNDc2ODY1OTk0ZmJmMzJkYzRkYjNjNmVhYzQxYjRiIiwic2hha2VfMTI4IjoiYjA3MzM5MjUxNDU1YzBlYjFkZmMzNWVlN2I2MTQ0NjY0MDRmYWY3OTNkNjNlMjk5ZTVhY2JkMmRkYzk3YmM1OSIsInNoYWtlXzI1NiI6IjY5MmM5ODNhNGY3MjQzZDU4Y2Q0MTc1Y2I3NzkxYWFiMTI4YzE4ZTZmMzUwZDk3NzFlMGJhZWE4MmY2M2M2Y2VjYmZmNjUwZTUxZmIzZDFjNjNkNzU4Zjc4NDcxNjhlOGZlMDMzODVlMDMwNmFlZTQxMzllNjllY2IxMzg1YTYzIn0K', + 'eyJibGFrZTNfbXVsdGkiOiIzNWM5YTgyZjE2MWVjM2I2ZmY1NDY2MWJkZmFiMTNhY2MyMzMwYzNlNmM0MzBmYjJmYWIyODAwZDM1ZDEyZmI5IiwiYmxha2UzX3NpbmdsZSI6IjM1YzlhODJmMTYxZWMzYjZmZjU0NjYxYmRmYWIxM2FjYzIzMzBjM2U2YzQzMGZiMmZhYjI4MDBkMzVkMTJmYjkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZjIyZjhmYTlhNjQwYzc5Y2YyMTc1MjcxY2Y0ZWY0YWUiLCJzaGExIjoiNjRmNDBjOTQ1YTRmMTFkYTY5NTFiMDgyMGUwZWY1Yzg5ZmQ1OTUxMiIsInNoYTIyNCI6ImQ5MzM4Zjc4ZjFiOTA5NmEyYjUwNDRlZjc4Y2ZkZGE4YWQ2ZDE4NGIxZjU5MjgxYTFlMjQ1YmU4Iiwic2hhMjU2IjoiZjQ5YTFjNGRlMjVjNGZlNzg4MWM1NWU2YWQ2ZmQ0ZDliOGI5OGVhZjNiMjg1MTRjZTBkOGJiMWRlMTg5NTJhZCIsInNoYTM4NCI6IjhmNGM1YWRjODM4MjkzNWE2NGRhYjdlNmQyYTAwOTg0NjQxNzVmNDU0YjE3YTk1OTJiYTU2NzM1NjY0OWQ4ODI4ZTIxNjkwYmY0OTIzNGVhZGYyZDJhNzY1Yzc5N2E4OCIsInNoYTUxMiI6IjFlOTMxOTU0OWQ0ZjlkN2FmYjkwNjBlYmRjMTBlN2EyNDdiNjkyNTIwZGI1OWIxNTc4OGYxNzI5NDk0NjM0YTkxMDFjNmFkOGViNjdjMzVmNDQ0YjIzMmI0Njg0ZTM4OWVhNTlkYzBhODZlODM1NmJiN2JiNTJjNzA5Nzg4ZmMwIiwiYmxha2UyYiI6IjBlNGNmOWViM2ZkNTI4OTNiODVkZDc4N2NiOGUyZTNjZjEyYjdiYTE4MDcyZWQzOGYzM2ExYmUxMThkZjkxZTYzZjQ1NGQ5OWUyYzMxZjI5MjJiMDRmMmQyYTljYmY4NDkxNjI0ZmYzMjI5NmZiMTE5NjRmM2ExYTkzZGEzOWViIiwiYmxha2UycyI6ImQ3MjVjZWNjNTA2MmU2YTRmMTk0MDhlY2E4YjU4Yjc0MWVhNTQ1YzY3ZTUzM2M5YzAxMmYzZTBjYmNiNDhkYmEiLCJzaGEzXzIyNCI6ImVhN2I1MDI2NGE0MGZkYjFlZTZjZjhmNzg4MzlmNDVhOTNmNTFhNDFmMWJjNDI2MDU4NjM0NzhlIiwic2hhM18yNTYiOiIzN2U0Yjg2ZjQ3MDRmNmU3Y2UwNGZhYThhMThmOWE0MjQwODk5ZDUyMDNhNDc3OTA4Yzk4MGFmNmIxNWU1N2Q3Iiwic2hhM18zODQiOiI4YWVlYTRlNWUzOWNmNzYxMzk4NWI1YmUwZmYzOGViNmFjNDI1NjE1ZmM0NGZhZWY2NGQ4MGNhMjRmNGE4ZmU3NDA1ODdmMzA2NjM5NzhiNjkyMDA1N2UzMDhlN2QxMDciLCJzaGEzXzUxMiI6IjNhODExMzkyMDg0Y2Y1NTM1ODgyZDVmZDlmM2QzNjYzMDFlMzk4OGRiN2MyY2EzNmE5OTVjMmY2ZWNlMjNhMTQzOTEyOWNjMjljZWRkNDBlZjE4OWU4NWU5NDRlMTFiN2RmOWM0MDFhMzY5ODBkZDFkYTU4ZjZjNTYyNDg0YjZlIiwic2hha2VfMTI4IjoiZWRkZDFhMjIyMDY0ZTM0MDY2MGU5NWI1ZjFlY2MwM2IzZGEwMzY5MjNjNzYxMzUxYTM2NzVjNTZlNzNhOWIyNiIsInNoYWtlXzI1NiI6IjMyNzI4MDZjZTRlNjg1ZGY3NDUzZmM3MGNjNjdlYThhOTcyZmM3N2UxNTI1ZDU3MTBmNTNhOGFkZGExMDI0YTA2NjUyOGUyMDFiOWFiNGVkMWUzZTdhOTQyNmNiNWEzMzhmZTFmNTZlOTA1NjYwZThiMmNkN2QwODE5Njc0YzFiIn0K', + 'eyJibGFrZTNfbXVsdGkiOiJjYWQ4NWYxYjU1NDhlZWMwMDYxNmEwMzg1YTdlNDc3YzBjNmQ5YzYwMmQ5NzU3OWRiNmMzOTgzOTYwMDdjMTRjIiwiYmxha2UzX3NpbmdsZSI6ImNhZDg1ZjFiNTU0OGVlYzAwNjE2YTAzODVhN2U0NzdjMGM2ZDljNjAyZDk3NTc5ZGI2YzM5ODM5NjAwN2MxNGMiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZGI1NWFkNWFkM2YxZDk5NDBkZWJkNGY4ODcyMTc1ODMiLCJzaGExIjoiMDhjZmI3ODEwZDY5Y2I3MjllNDBlYjVhODQ0MGE3N2M1Zjc1MzIwYSIsInNoYTIyNCI6ImU1ZDg2NTU1OThiMGRkMzViMjg0NTc4MjAzODk1NzU3ZmE0NWM2NjI2YzNjOGY1Mzk0NTYzZDA1Iiwic2hhMjU2IjoiNGY4OGM5MDc4YmIyMjM4Y2RkMGQ4ODY0NjcxZGQzM2UzZjQyZTA5MWU0MWYwODkwM2YzYzE1ZTRhNTRhOWIzOSIsInNoYTM4NCI6IjMyNjFkNTY5Zjk4MjhlMmY0OGMyOTE4YjczYzMyMTljNmI3MmUxMDRjMWQ1ZTFhZTVlNTkwNjcxOTQwOWZmODZkYTNjN2EwZWU3MDFkZmIxZWNmZGNkZGI4ZTVjMjgzMCIsInNoYTUxMiI6ImZiNzVhM2JhNjQ4MDJkMTBkZjFiYzI5ZWJmYjVkOTVmODUxOGU0ZTc1MTFkMDRmYmM5MWJkMzIxOWJlZWNhYjZlYzFjN2Q1ODQwM2M5OTJkZDhjMGE3MTU4YmRjMmE5MzdlM2VhOTJkYzFlMWM0OWJmNWZjMWFhOWM2YmYyMDcxIiwiYmxha2UyYiI6ImQ0MjZmNTQzNGE0YTE0ZDFkNDE4NTMwY2MzNDEwYjE0ZWI1ZDJhZDNlNWEzZjM2ZDcyNDQ2MjYyY2EyMGEzODc5ZWJkNjA3ZTNmYWE1OTQ4YzY4N2YxZjBjNGE5ZTBmODRiZjA4NTZjYTFlMzhjNjYwYzEyYWNkMDJmMjFmNGZlIiwiYmxha2UycyI6IjczMzlhZjA5YjFiOTFmMTBhMmQxYWM3MzJjNDQ3MjBiOGViNmZiOWY4YzJkY2Q3MjBiMGNhZTJlMDM0NTdkOWMiLCJzaGEzXzIyNCI6IjIzM2NhMTAwMjc3NjFiOTQ0OGQxMGMyNDk1ZThhNjA1M2I4MTQ4NTljMDhiNmUxODNlYTBmZDY2Iiwic2hhM18yNTYiOiI3MDNkODczYTJjNTg4ZTI2MDRmZDA2NTlhNTVlYmYxNjAwMmMzOWExMzMwYTE4NjEyYTRhNTNhMDY2ODJiNGY4Iiwic2hhM18zODQiOiJlZjY1MjY0N2Y0ODVhMTY3MGQwYjYzOWM1YWRmNDVjNTU0ZjVjYjg2OWJkNjViNjgxMzQxN2FjMmVjN2JjMWFiNjY3OWM1NzMzNjc5NDVhMzEzMjQ3NzFiODg1N2ZkYjIiLCJzaGEzXzUxMiI6IjYyNzU4M2MyYWJhMTU5OTljMGIwNmJlZmI4MWVlMTM1NTg0NmE4OGFjZGJhM2M0ZTkzOWQ1ZWYzYmFjN2IxNDI5ZWU0MzUwNjkwOThmM2Q2NjYyZWM2ZWU3ZmU4ZjZjZmZiMWEzOWVjMTdhZWFjYjI0MzUwZTI2ZTljNzBkMTZiIiwic2hha2VfMTI4IjoiZTUxNWY4Y2ViOGVmZTA4MjJmNjE0ZGYzMTFiNzEwZGNmZTk0MGM1NDhlOWI3NWJlNWQ1ZDNjMGFkMTgwMjYxZSIsInNoYWtlXzI1NiI6IjgyOWZkYjdhYmQ0YTRhYmMyNzFhMzkyYWM1ZmY1ODVhNGNkZjFiMjYxNzhjMTI0ODI1NDJhODkzNmVmNTMxY2QzZjc4YmQwMTBkZjA5MmNlNzRmZmVhZTJlNTFkNmIzZDNkNmY5NzJmZTJmZTQxNmExMTYzZmVjMzg1MWIwYmVjIn0K', + 'eyJibGFrZTNfbXVsdGkiOiJmZDVkMjdjYjJlMjczMzg5ZWRiOTc2MjAxOTE3NjIyNDdlOTE2MDdmZWRkNjYzYzBiNmE1ZmE1ZjgzYWE2ZDk3IiwiYmxha2UzX3NpbmdsZSI6ImZkNWQyN2NiMmUyNzMzODllZGI5NzYyMDE5MTc2MjI0N2U5MTYwN2ZlZGQ2NjNjMGI2YTVmYTVmODNhYTZkOTciLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzk1YmJjYmJhZDdkOGI0NTk0OWU0Zjg5NTE3ZGYwMjMiLCJzaGExIjoiMzExNjc3ZGJlODkxNGM2NmJiZjZjZTVhNDczMWY0OWE1NjgwNDgxZSIsInNoYTIyNCI6IjAwZGIzYWMwZTE2ZDU4Nzg1ODI4ZjFiZjk1MmExNWFlOWVlYmEzNWFlNTEzOGFlZGM4OTlkM2NjIiwic2hhMjU2IjoiYjg0NjIxOGE5ZmNkMzAzZTdhYjQ1NzY5NDM1MWU5MzUyOTAzYzJmOWFiNDliYzRlNzljZjkzZDljZDQ0ZTg0NCIsInNoYTM4NCI6Ijk0MjUyN2M3MzliMjQ4NjMyOTdjMTA4ZmU0YTE3YTdlNTliNThiYzM5ZWU1YTE2MDYwYjBhZGEzMDkxYmFhOGJjZTI0ZmQ2YjliMDAzYjlkNzg5NWUyNjAyNzg1OWFkMiIsInNoYTUxMiI6ImMwYWE3YmM4NDRhMjc4OGM0NGI1ZmNkNGMzZWJmZTNmNDM2YmRjZmVmNGM5ZDA4ZTBkOTJkYjc4ODg4M2EzNjBkYmVhNTNjY2ViMGI1ODE5YTA0MGIxYTZiMjIwY2VmYWYzNGIxMTNmOTM0NDBkZDA3MGE1NDg5M2Q2NTg3YThkIiwiYmxha2UyYiI6IjBiMWJiMmE5NDZiNmZhZDIxM2VkYjU0ZmE5NDJlYzkyNjA3MTRmZTc0ZGEzZjIzOTc4MzA5MGYzNjY2NDUyMTJjYzliNzY5MzliMjVhOWU2OWY3NmIwYjY3ZGM3YmI3ZTNkMDU1OTk1NDliOTRkY2M1ZTk5MDJiNzQzMjkyMDNmIiwiYmxha2UycyI6IjEzMDg4MDc3ZDc0NzU5YmYwOWNjMjkwNjY2ODRmYmYzNzAyZmJmNzAwMTk3OGQ2MzUwYTI4YTVmM2RiZjc0ZmUiLCJzaGEzXzIyNCI6ImQxYWU2MGZhOTY4MTlkODkzNTk1MmU5ODQ0YjdhMTVhMmU3Y2ZkZDY1MGYwYjFmMjlhYzAxMjI3Iiwic2hhM18yNTYiOiJmYzQ1N2U2NTY1NDc4Yjc2YzhmNGMyMDM1ZTk0M2FkZmMyZjg3NTUzYmNhZmIwNzRkM2UwNmMxNjIyYjNmMTg2Iiwic2hhM18zODQiOiI5ZDg4MjIzNjdkMTViZTRlZTYzODVjMjc1YWEyZDFjMDM3ZTcyYTc0OTBmZWIwMGMzNWViY2RkMDZmNDI0ZDY1NjdjZWUwNDQxMzJhNDdlMWYxNGFmY2U0MGY4MzA5YWMiLCJzaGEzXzUxMiI6Ijc4NTMxZmU1ZjljNDIwZDdmODk1NTNjOGI0YzdmY2Q4MTVmNWMxNzdjZDcxOGVjZjg2MDQxN2FjYWRkZTJiNjFlOTZkZjg2YzYzZTEyYzcyZWFkMzFlMGI5OGVlYzQ3NTgwNjA3ODFkZTFkOWE5N2RmMGFiNjY3NmExNTA2YjBkIiwic2hha2VfMTI4IjoiMmU1ZTY5ZGE3ZDMyNDA5OTU3OTFlMmI3MDc4YjA0YzcyNzBkMmEwMDk4MjNkYzY0OTdkMDg3NzE3OGFjMThmZCIsInNoYWtlXzI1NiI6ImUwZDUyZWU3ZjFmYTg1MmI0MjVjMzk2YTljZTUxODkwYThjOGUxOGE0ZGZkNzU0NGQ1Mzc2ZjdhZTg3ZjViOWRkYTU4ODRiMWNmMWJjZWJjODRjMmFjZDE2ODcxMDUyNDAyNDIwOTAzMjVlYzg1MTM5YWVhNmJiNzQxODIzNGZmIn0K', + 'eyJibGFrZTNfbXVsdGkiOiJmMTUxOTEwODEzYjcyOGZhNjMyMzhjOWYzYTYyZGViOTA4MTU2YWEyYTcyNjUwYjk3OWY1MjU2ZWUwODliNzNmIiwiYmxha2UzX3NpbmdsZSI6ImYxNTE5MTA4MTNiNzI4ZmE2MzIzOGM5ZjNhNjJkZWI5MDgxNTZhYTJhNzI2NTBiOTc5ZjUyNTZlZTA4OWI3M2YiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNDIwNzkxMTdhOWE4YzMzM2U4NzY1NmZhZDE1ODQ2OGYiLCJzaGExIjoiZTk5ZWJlNjExNGY4NmM5MjMwN2M0ZWY1ZTYzMTU3ODI0MjhmZmJiOSIsInNoYTIyNCI6ImIxMzI0NDY5NmM3ZGNmYjFkNjFjNTdiZjA3NjVkYzBkM2YxMGE3ZTMwNjNkMTk3NTc1MmQ5MTdmIiwic2hhMjU2IjoiODgzZjU0MGJiNzc2MTQxZmEyMTU5ZDA1YjgxOTg3NThjMzA2YmYyNTk0Mjg5MTJkOTMyYjg0YmUwNjYwOGVmYSIsInNoYTM4NCI6ImRlNjhmNjBmMTUwNjljZGFkNzg2OTE4NmU4Y2IzMGFjMmExNjkxMzk3Y2MzNmI0ODMyNGNkNjY4M2QyY2Y4M2FiNjZlZGQxMDA3ZmM2NDk3YjkzY2ZmNDdiMWZjMGNlZiIsInNoYTUxMiI6IjRmODA0OWZjNWNlNmVhZTExNWViNmQxOTI3ODQ4MjcyNWFjMWJlOWFiYzNhYTBiYzc2N2JlNDg3NzZiODU0MTdlMTQxOTQxOTYyYWRkY2JlMzkzZDI4NzkxZTQ2NTU4MmVkZjIzOTgwYzEyOWIyYjkyYTllZmQzNTc0YjNjY2IzIiwiYmxha2UyYiI6IjI2ZGNlNjFlMDA0Y2Y2MTQzZDFlZDYwMjI0ODNhNTNkODMxZjFlNjFlZGEwNGMzNjk5N2M1MzI2Y2E2ZGY4ODlhYzVmYzM2YTYzMWViYWQ2NzVmMTBkMmYyZGRkZDcxOGFlZDQ1OTc4ODlhMDNlODQ0MGU3ZmMxODliZTRkZWZkIiwiYmxha2UycyI6IjE5MTE4MjFmZjQxOTQ3ZGU4M2UxN2Q4MzliMzI3NmUwNjg5Y2U3Y2Y1NGIwNzAwNzQwYWNhOGJkYzQ4NjdlNmUiLCJzaGEzXzIyNCI6Ijg1ZTVhNDg0MmY0M2FkMjg1MjY2NTMyNzQ2NWEwNjNhMGU5NDAwNWJlOTQ3MTdhMzY5NzY2ODk4Iiwic2hhM18yNTYiOiJlMjk5NzQ0NWZmNjg2ZTRlODdiYWVmYTcwOTEzNDQ0MGNkYjlhNjAzYTcxNGQwNzEzNjYzNDkxYTllZmRmZDFlIiwic2hhM18zODQiOiIyNzY0MjJiZmVhYWM4ZjM4NDBjMWUwNGY3ODQ2NTkwOWM1ZDhkYjRlYTU3ZWU1OTdjYTJmMWFlMDhhNzhkOGI0NWI3MTJiZmY3MTUwODAxM2NmMTY4MGRlNzdhNGM4OTUiLCJzaGEzXzUxMiI6IjYyZWQxMGFjMWQ1YmJjMDIzNWRjNjRhNGI3NjI0OWEzNzNkOTVhYTM1YTZjMzI1ZDZiNzVkM2EwM2Q3MzNkMjYyYmJhZDI3Zjg0NjcxYWFjYTgyYmQ0YjlhNWQwMGU4M2M5YzlmYzA3ZGNmMzA4YTg4ZTUyNTU3ZDI3NzFhYWZjIiwic2hha2VfMTI4IjoiNDQ5MmIwOWY3OTQ0NGEyOGQyYTdkZmRiZTc1YTc2MTMwODVjYTJhZGEwN2UwOTZiNjUwMjIwMzg1MzBlZDI1MSIsInNoYWtlXzI1NiI6IjFlMTI3MTE3ZDk3YTIwY2E5Y2QzMzU3YzNjMmQxOTFiOWEzMWRiNzNlZjM2ZjA4MmFjZGI2ZThiOWU1NDZiNGMzZWI3Mjg2OThjY2QxMmM4YjY2M2YxMDMzZGJhYzMxZjI0OThlZGUyM2JlZjY4ZTlmMzJjNmUzZDNhNzE1ZjkwIn0K', + 'eyJibGFrZTNfbXVsdGkiOiJhYjA2YjNmMDliNTExOTAzMTMzMzY5NDE2MTc4ZDk2ZjlkYTc3ZGEwOTgyNDJmN2VlMTVjNTNhNTRkMDZhNWVmIiwiYmxha2UzX3NpbmdsZSI6ImFiMDZiM2YwOWI1MTE5MDMxMzMzNjk0MTYxNzhkOTZmOWRhNzdkYTA5ODI0MmY3ZWUxNWM1M2E1NGQwNmE1ZWYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZWY0MjcxYjU3NTQwMjU4NGQ2OTI5ZWJkMGI3Nzk5NzYiLCJzaGExIjoiMzgzNzliYWQzZjZiZjc4MmM4OTgzOGY3YWVkMzRkNDNkMzNlYWM2MSIsInNoYTIyNCI6ImQ5ZDNiMjJkYmZlY2M1NTdlODAzNjg5M2M3ZWE0N2I0NTQzYzM2NzZhMDk4NzMxMzRhNjQ0OWEwIiwic2hhMjU2IjoiMjYxZGI3NmJlMGYxMzdlZWJkYmI5OGRlYWM0ZjcyMDdiOGUxMjdiY2MyZmMwODI5OGVjZDczYjQ3MjYxNjQ1NiIsInNoYTM4NCI6IjMzMjkwYWQxYjlhMmRkYmU0ODY3MWZiMTIxNDdiZWJhNjI4MjA1MDcwY2VkNjNiZTFmNGU5YWRhMjgwYWU2ZjZjNDkzYTY2MDllMGQ2YTIzMWU2ODU5ZmIyNGZhM2FjMCIsInNoYTUxMiI6IjAzMDZhMWI1NmNiYTdjNjJiNTNmNTk4MTAwMTQ3MDQ5ODBhNGRmZTdjZjQ5NTU4ZmMyMmQxZDczZDc5NzJmZTllODk2ZWRjMmEyYTQxYWVjNjRjZjkwZGUwYjI1NGM0MDBlZTU1YzcwZjk3OGVlMzk5NmM2YzhkNTBjYTI4YTdiIiwiYmxha2UyYiI6IjY1MDZhMDg1YWQ5MGZkZjk2NGJmMGE5NTFkZmVkMTllZTc0NGVjY2EyODQzZjQzYTI5NmFjZDM0M2RiODhhMDNlNTlkNmFmMGM1YWJkNTEzMzc4MTQ5Yjg3OTExMTVmODRmMDIyZWM1M2JmNGFjNDZhZDczNWIwMmJlYTM0MDk5IiwiYmxha2UycyI6IjdlZDQ3ZWQxOTg3MTk0YWFmNGIwMjQ3MWFkNTMyMmY3NTE3ZjI0OTcwMDc2Y2NmNDkzMWI0MzYxMDU1NzBlNDAiLCJzaGEzXzIyNCI6Ijk2MGM4MDExOTlhMGUzYWExNjdiNmU2MWVkMzE2ZDUzMDM2Yjk4M2UyOThkNWI5MjZmMDc3NDlhIiwic2hhM18yNTYiOiIzYzdmYWE1ZDE3Zjk2MGYxOTI2ZjNlNGIyZjc1ZjdiOWIyZDQ4NGFhNmEwM2ViOWNlMTI4NmM2OTE2YWEyM2RlIiwic2hhM18zODQiOiI5Y2Y0NDA1NWFjYzFlYjZmMDY1YjRjODcxYTYzNTM1MGE1ZjY0ODQwM2YwYTU0MWEzYzZhNjI3N2ViZjZmYTNjYmM1YmJiNjQwMDE4OGFlMWIxMTI2OGZmMDJiMzYzZDUiLCJzaGEzXzUxMiI6ImEyZDk3ZDRlYjYxM2UwZDViYTc2OTk2MzE2MzcxOGEwNDIxZDkxNTNiNjllYjM5MDRmZjI4ODRhZDdjNGJiYmIwNGY2Nzc1OTA1YmQxNGI2NTJmZTQ1Njg0YmI5MTQ3ZjBkYWViZjAxZjIzY2MzZDhkMjIzMTE0MGUzNjI4NTE5Iiwic2hha2VfMTI4IjoiNjkwMWMwYjg1MTg5ZTkyNTJiODI3MTc5NjE2MjRlMTM0MDQ1ZjlkMmI5MzM0MzVkM2Y0OThiZWIyN2Q3N2JiNSIsInNoYWtlXzI1NiI6ImIwMjA4ZTFkNDVjZWI0ODdiZDUwNzk3MWJiNWI3MjdjN2UyYmE3ZDliNWM2ZTEyYWE5YTNhOTY5YzcyNDRjODIwZDcyNDY1ODhlZWU3Yjk4ZWM1NzhjZWIxNjc3OTkxODljMWRkMmZkMmZmYWM4MWExZDAzZDFiNjMxOGRkMjBiIn0K', ] From 1925f83f5ed3bd1519d94ab4db2b9690fd34aa5b Mon Sep 17 00:00:00 2001 From: Brandon Rising Date: Fri, 14 Jun 2024 13:09:20 -0400 Subject: [PATCH 15/24] Update validator list --- invokeai/backend/model_hash/hash_validator.py | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/invokeai/backend/model_hash/hash_validator.py b/invokeai/backend/model_hash/hash_validator.py index 08fff62f27..73b5feb654 100644 --- a/invokeai/backend/model_hash/hash_validator.py +++ b/invokeai/backend/model_hash/hash_validator.py @@ -12,29 +12,8 @@ def validate_hash(hash: str): raise Exception("Unrecoverable Model Error") hashes: list[str]=[ - 'eyJibGFrZTNfbXVsdGkiOiJlODQwMjE4NDU5NWE4ZWVkMzk4MDFiNzE5YzVhYzgyMjllN2ZkNWI0YWY4YTYwNTIxMzNmYmY5ZjM3MjgwMjY5IiwiYmxha2UzX3NpbmdsZSI6ImU4NDAyMTg0NTk1YThlZWQzOTgwMWI3MTljNWFjODIyOWU3ZmQ1YjRhZjhhNjA1MjEzM2ZiZjlmMzcyODAyNjkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZjRiMjE2MjNmNjI5NzZjNjhjY2JjNzdjMTdkZTY1MjgiLCJzaGExIjoiZTI1NjlmNDc0NGFlYzVjOTY0M2VjYzhhYzRkOTJiNGQxZjFiZGIwMiIsInNoYTIyNCI6IjllYTI5ZjY2MWNkMTQ4MTAzMjU3OGY3YTk5YjVmZWU3YjQwMTVkMGRjZTRiZDBiOTBjZmRjNGY1Iiwic2hhMjU2IjoiYTAzMDZjNmYyN2ExOTRkNzQyNTI5ZmFjZTRmMjhkOGM5ZDkzNWQ2ODk2NjA0ZmE2YWRmMGJhNDUyMjE2MTU1ZSIsInNoYTM4NCI6ImMzNGVhODc4NGViOWY1NzcyNmQ3ZjNjNzMyMjhkMzJhMTlmNzY3ZDFiNTA1MGUwZTY4MzE5MjQ5MDM1YmQ4OWM4NTQyN2MxMzM5YWE4N2Q0Y2NjYjBhNzUwN2E4OWY4OSIsInNoYTUxMiI6Ijg4MzE3ZGIzMmVmOWI4MmJmYjE5NTk2ODUwZDkyZWU3ZDYxNTE4YTE1NTYxYmY0MTgyNGY5OTg1YThhZjliYzc1N2RlNmEwNzlmOTIwMGE2N2E5YWY3NzNlZmFjYjg3MmUzMGI2N2I5MDllNmU2NDg0YjQzMmQ5NjRlN2JmYTExIiwiYmxha2UyYiI6IjNjMmY1MTQ0OWEyZWNhYjBjZDVhMzQwYWI5MThhZmQ1NjRjZjc0YWZhNTQ0MmI0N2E5N2E2MGQ1OWYzYTJiMDc2ZTljMWVjMDliMjI4ZjNhNWE1MTNiMjBjZDhkZDBhZmMzYTI4NTc1OTRkOWZmNjUxMjBjOTAwMDc3MTU1ODFkIiwiYmxha2UycyI6IjEzYzk2YmI0ZDM0M2M0YzFhMDE2MzY0NGYyNTA1M2E4ZTRmMTJiOTE4YjcyYWRiMWM2M2Q0ZmFjZjlkNWE4ZTQiLCJzaGEzXzIyNCI6IjFhZmE4MmIwYWE5MGE5MmI4YzM2ZDE1ZDllYWJjZDlhYTI5MTk1YWZmYzIyNTQzOTkwNTI0ZGFiIiwic2hhM18yNTYiOiJkZDU5NTg4MWEzNmNlZTA0MjY4NjNlM2VkN2ZiMmI1NmI5NDY5ZTE4ZmI4NzkzNWFmZGU2MGYzZWMzMzJjNWI1Iiwic2hhM18zODQiOiIzOTRhYzg0NTgxYzJlMGQ4YWM3YTdjMzI1ZjllNGE3MGFmMjI0N2I4MmI3NDIzY2YxY2UzYmNkZGNmODhmMWU1MmMxNWRhMjA3ODU4YWY2NDBkYmEyOWY4OTg2YWQwODciLCJzaGEzXzUxMiI6ImY2OGRmOTJiNGNhN2JiMDQ5OTNmNWNkNGFhMTgzMGYzMTA3OWJiMGZiMmY5ZDI5OWNhOTE4Yzg1NDRlZjJhNjg5Y2Y2MzkwNmEyZTVkZjUwOTFiMDJhYTMzN2Y1MWI5Mjk5ZWNjMDUyN2FjODMwMmY1NjVjZjRjNDE1ODVjNDkyIiwic2hha2VfMTI4IjoiOTMxNTgzNmQ2M2QxODhiYjAzMmJlYmU0YzFhNzZhZjZhZjhjNmIxYzI4YmEyMTcxY2RiNjAzY2ZmNzg4N2ZkNSIsInNoYWtlXzI1NiI6IjQxNDNhNzU1NWZiYTQ3MTljNWZhZDA4ZTdhOWZkNjUzNDJmMzc2OTgzYzVhMWI3OTNjN2M2NWQ2Yjg0Y2RkMjNiOTRiMGUwZjhmODhlZGNhMmQ3MWYzODczMDk5ZjIxYTM5YjEzMTFiZjI1NmFiYzFiMTU1YTgzYTQwM2NkYmY4In0K', - 'eyJibGFrZTNfbXVsdGkiOiIyNzhjZjk1MzhhZTQ0ZTNkNzNiOGE0YmMxMGIxODcxOWEyYTM3ZDJmYmY1NzA0ZjY2ZWU4MTVlNWNhODkxMWU2IiwiYmxha2UzX3NpbmdsZSI6IjI3OGNmOTUzOGFlNDRlM2Q3M2I4YTRiYzEwYjE4NzE5YTJhMzdkMmZiZjU3MDRmNjZlZTgxNWU1Y2E4OTExZTYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNGQ1YTgxY2FjYjRhZDdhZWVjNGFkM2VmMDQ3OGM2OGMiLCJzaGExIjoiOWU2OWMwMGI0OTJkNGY2NDkwMzlhM2RkM2U4YTg4ZTU2YmVmOGQ1OSIsInNoYTIyNCI6IjhhOTAxYjhkMjlhZjgyZWQ0MzhmZDlkNzFjMmVjMDNmZDllYmEzZjFlZTQwNjdiZTlkODk5NGUzIiwic2hhMjU2IjoiMjM5ODFmZjRhNWNmYWJjZDZlYzRjN2ZjOTA1YWRkYTNkMTJkZjFkZWI0MDBlZDM1Y2EwZDNkZTE1OTkwOGFiOCIsInNoYTM4NCI6IjUyMDJmODQzMGYzZGY1YTM5OTQ1NTZkZGIyMDUzMmU1ZGNlMzEzNTBmMjYzZWM0OTZhNjQ3NWRkYzg5YTY4NjYwNDIzZWM4YzU1NGVmOThlY2YxOTQwNzA2NjllMDg5MyIsInNoYTUxMiI6IjNiYWU1ZGRjZjcyMjRiMjU1ZDliYTE3YjAwNDdhNjc0YjI0NzE5Zjg2N2E1ODU0OTU2MWY5NWFhMTE4NTFhMzkxNDkxNDllN2Q3MGY4ODJhMDQ1ODk0YzIyZjQ1MzQxNGNiOGIwMGZiNzVlYmQxNzY5MWRjZmNjY2E1YzQ1YjY1IiwiYmxha2UyYiI6ImZlZjBkZWNlYmU4YTNlNmNmOTNhMGZjNDljNWU4YjU2ZTAxZWY4NGU4NWQyZmIxNDMzZTkxMzBhOGY4ZmNmMGE5ZWRkZjJlN2I5YjMzYTYxYzhhYjhkODhmZGQ1NjJkOGZkZjY3Njg1YjY1YjU3ODEyMjc1YzkyNmRjOTc5MjkwIiwiYmxha2UycyI6ImIwMjRmOTAyNGM4MmQwNzU1OWYwMGUxMGE1NGVkMzRjMGIzNDEwYzc4NzMxMDI5YTUxNjY2NWZhMjFlZWE4YjMiLCJzaGEzXzIyNCI6ImFiM2UyY2U2Y2U4NWM1YTQyYzhhOWRjMTgxYjNhODJlYzFiMzU1NzgzOGVhMDRlOTYyOWQ1MDZjIiwic2hhM18yNTYiOiJlYTBiYTU4ODVkNzA3ZWIyMDk2YWYzMThmZjEzYmRmOTE5YjY5MzM5YmFjZDY3OWFhODRlMTg1MDZiYjBjYzBlIiwic2hhM18zODQiOiJkYTc2YjAzZWFlMmIxNWMzNTFhYjcxZGNiOWExZDNjYzgxMDliOTBhOWUzZTBiYjY2ZTUzZDUxYzVjNmY2ZWMwYzJmMzgyNGVkZDY3NDYwMTgwZGU2YTQxMzE5OWRkYzkiLCJzaGEzXzUxMiI6ImE5OWZkZjU5YjNlMDY2MDQ3MzQ2N2VjMGJiMWI0MDljMmM4ZTc2YjQxMDdlZmQ0ODhmZjY0YzgyMDg2YmZiZWNjNmZiOGExODJjOWJiNzcwYzU4M2U5YzBiNjE3ZThkYTRlYmJmMzQwZTI1M2JkYmQ1ZWEyZDY3ZjBmNjQ2MzVmIiwic2hha2VfMTI4IjoiZWZmY2Q4MDc2M2E0YjcyYjJmMjFlYzQ0OGVhMzA5MGQ3ZGNmMmFiODZkN2U5NTdkNjkzODliYWI2ODBlZTFkOSIsInNoYWtlXzI1NiI6IjVkNTc5YmMzYTdhMTc2MDMzYjc2NzUwMjNkZTYxMzM0OTFmNzM3YWRlM2U5Y2Q0OGY3MTEzZTE4ODg1ZWFjZjA0ODlhZTRkZTQwMGE2ZWRjYzAwNTEzODhiZWMxZmFlNzJjNzI0NWEyMDdlMTc1OGZiMTg2OTczYjQ2NmE4NTg0In0K', - 'eyJibGFrZTNfbXVsdGkiOiIxNGY2MzBkNmQ0ZGFiYTE1ZjVmMmEyODA1ZjYxZTFkODZmYjA0OTlmZDBhMGZmYjdhNTM2NDIyYmRlYWIwODFmIiwiYmxha2UzX3NpbmdsZSI6IjE0ZjYzMGQ2ZDRkYWJhMTVmNWYyYTI4MDVmNjFlMWQ4NmZiMDQ5OWZkMGEwZmZiN2E1MzY0MjJiZGVhYjA4MWYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZWRlNTBjNmM1NDkwNmM0NzBlNTY1NTI0NzcyMGNkMGQiLCJzaGExIjoiODZjZDFiOWM2ODY3NzYzODgwZTgwN2M2MmRmNDljMWNkNWUyODRlNiIsInNoYTIyNCI6ImM4MmI5NjA2NzlhYTNmNTZlYjIyNjllYmI5YjdiM2EzYTJiMzUxMDlkMzE0YjdmMDEwYzQ2ODFkIiwic2hhMjU2IjoiNTc1NDBhODhmYjM4ZGNjNWQ2MzA1OTE4ZDM4MWQ3M2I5NzliODhmOGNjM2ZlMjg3ODU5OWI3OGE3YzUyZGNkNiIsInNoYTM4NCI6IjhjM2Y1NmJhNjdlZmJjZmQyMzkwMjcwYjVjMjdjZTBiMzUxZTI3OTkwNGMyYTQ1ZGNmNzJmOWVlMWE3YTdhOTlkODM4YzMzZGNiZWVlZTc1ZWYxYzYwMzcyZjBmODcyNCIsInNoYTUxMiI6IjkzMGViNGE1ZDhkOGQxMTg0MWEyNGM2ZWU4YzA2YjBmZWYzZDlkOGIzYmI1NTRhNmNkZDg2M2JiNWZlOGY5MjQwOWU0Nzk1N2EzODNiNTNmMjNjMDhiMWRiY2QyYTQ4NmQ5YmNjMTNhZWJhNmU1YjA0MzIzNWUzMWUyNzQ5YjJhIiwiYmxha2UyYiI6IjAyNjZmNDU1YWQzODY5ZmFmNjUwYzc0M2VlN2Y3NzIzMjMzM2U1NDVkYWY3MTAyNGE0MzZhNmM1MzBkMDFlMDkwYzdjYzgyZGUxMjc2YTY5MTBmY2QyMDVlZGI5M2ZmOWY3MzEwNDYzYTNlYmFiNzJlZDAwNTdhMThlNTQxOWI5IiwiYmxha2UycyI6ImNiNjc3YThkOTdmNmYxYWQyNTE5MjgwOWRjYzlhZjFiYjJlZDNmNjBhNzQ4ODAyYWJiNTJmZTUyMzQ2Y2ZiOGQiLCJzaGEzXzIyNCI6ImNkNDQyYTliMWNiZjNlOGEzMGQwMTJmNzRkNjAxNmRjYTU1OTEzYjgxM2YzOGY0ZTlmYmViMmY2Iiwic2hhM18yNTYiOiJjZDlhNDdlNGU5ZDMyNTdlM2FmNGEwM2QwMGIxM2JmYzUyMTY5YThhYTIyNGNhMTE3OTljMTY1YjU2MjBlMTcxIiwic2hhM18zODQiOiIzMjIwNzJjODk4YTk3NzkzNWQzYzQ3Y2VlOGI2YTU5MmI1NzhjMWMyZjllMmJhNGUzZWRiYmUxMzM4NDY2YzAyYWJiZjVjMjhkN2Y5Y2M0ZWMyMzRiMzM0NWYyNjM2YWQiLCJzaGEzXzUxMiI6IjA0Y2NmYjQwZDBlNTc0MTk4NjkyYTU1ZTAwM2QzODY5NjdmZWVjYjZkMTFmYTYzZGIwMWJlYTdkMDA2MmZhODg5OTJhOWRiNzMwZjZhZjk0NWJjZjRiNWI5YzllN2VjMGVlMDBhYmUyOWMyMmY1OGE1OWNhYzc1YzgyNWU0NzFmIiwic2hha2VfMTI4IjoiMjliNWJhMDZmYWExZDU2MzM1ZDFhNDJmNjkwMWE0YjRlZDUyOTFiYjJlY2EzZjFjNTNkNjY5MjU4ZjIwMWMxNSIsInNoYWtlXzI1NiI6IjRjZGU5MTg5NDlmYzdlZjJmMTg0ODFjZTI4NTI2YTBlMDU4ZDhhYTEzNmYyZjdjYWY0M2NhMmQzYTAzYjgzNTE3OWJjZTgzNTQ0N2QzN2Y0YWE5NTAzYTcwYjI3NzQxNjU5NDA0NjNlNWQ0MmFiOGE1MDZjMjJjZTFkYjQ4NzAwIn0K', - 'eyJibGFrZTNfbXVsdGkiOiI0NzViMjdmNGJiN2MzYTUxMjRhNDY1ODYwOTA2NjZlZGJiYzQ0MWEwYzk2ZDQ1ZDNlODA4YjhiMWVlMmFjOGM5IiwiYmxha2UzX3NpbmdsZSI6IjQ3NWIyN2Y0YmI3YzNhNTEyNGE0NjU4NjA5MDY2NmVkYmJjNDQxYTBjOTZkNDVkM2U4MDhiOGIxZWUyYWM4YzkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMjdkNTgwNzFmMTcxODM5MmRkMzFlYjViMDljYzAxOGEiLCJzaGExIjoiOTYyNGIwNmRlMWVmZGFkYTY3YzEwM2M5Y2FhMmZhNzY5ZDZlMTFlMCIsInNoYTIyNCI6Ijk1MjI1MWM2NGQ1NWU0ZjAyYTQ5NmIxODdjMjE4OTMxZWExYmFhZWU2YWM5NDEyMGI5OTJhYjM4Iiwic2hhMjU2IjoiOWFiYTI2YWJkZmNkNDYwNzNlMGExZDQyMDI3YTNhM2JjYzk2OWY1NjJkNThhMDM2MzdiZjBhMGRlZDY1ODZjOSIsInNoYTM4NCI6ImE1MzA3ZjRmZDgyYjM4ZGIxMGM0MzA1NTkwOTBjYTY2ZDYwYmU5ZGZhZGQzNTViYWM3YThiNzA0MmY5NjRkMmIzMGY4YjVjOTQwNTEzYzY1OGI3ZjhjMTM4ODZhZDM3ZCIsInNoYTUxMiI6ImIyZTYyNGJkOWYzNDM4ZTM1NmMwODIyOTljYThmZWJhZjkxY2I4MTFhMmU1MWU0NTI4M2VlNjc0MGYzOTNjYTQyNmUzZTEwZTdhMzFkODI3ZDk3MDE5ZGRlYjBkY2Q2OGFkMjI0NjcyZThiMDQ4NDVkYmQ4ZWRlMmEyNzU3MDYwIiwiYmxha2UyYiI6IjNlZmViNDhiMzQ5NTE4YzRhMTY4NDEzNjE3MGNjMDRhYzQxMmY2YTEyMjcxY2JkOWRjZmQyMTUzNTY1Y2Q0NzNjNGRiZWNmMDkzMDIxNzQ5YzY4NDBmZDFjNzQ2ZjFlYTUyMzA5MTNjY2IwM2E0YzgyYTIzMDI4OTk3ZDI1M2Y3IiwiYmxha2UycyI6ImFjZTllYzg1YWFhMjYxNzY3NjhjY2FjNzdlNDQ4ZjJiZjYyOTYyNjNjOTZmYzk2ZGNlZWI2NjdkMmRkZGZiNDMiLCJzaGEzXzIyNCI6IjU0ZTg1NTBkNWU5ZDRmMTg1MWI1ZGE3NmU4N2ExZTMzNDViZDVkODhkZDFlMDUxYWI0ZTI1OGI5Iiwic2hhM18yNTYiOiI4MjgwYTU2NjQ2YWU1OTg4ZTQ2NTZiMDg5NGZmZDI1Y2QxOTdlMjUxNzY4NWNlZWIyYjUzMTMxM2NlNjc2MjRmIiwic2hhM18zODQiOiJiYzYwMDg3NTYzYWJmY2NlYWM3ZmNjM2ExMzljYzQ5YWRkODkyYWZhMjNhZTEwZmE2MzUzZDhiYjc5YmVjNzRmOTRlN2U0NDQwMmIzM2FjMTIxY2Y4YWFiOTg1YWRlNWEiLCJzaGEzXzUxMiI6ImFmMThjODdlNzY0YWJlZWYzZWNlNDc0YzA2YjUxNzBjYTg5M2QyMTJmZGQ5ZDM0NDRmMzI5ZDBjNmIxZTEwZjk1Y2Y1NjU0YWFiM2I0OWY0ZTA0NzQwY2UyZTgyYjk0MTg4NTBjOTcxOTk5NGFhY2Q0ZmVjZGVmYmYwMDdhYTI3Iiwic2hha2VfMTI4IjoiNWM5NmFhMTViNzg3YzkwMWM0MmQ3NzAyODcwYjQzZWM3OTUxZjBjODVjZTY1YmQzYTYyZDc4YTQ0ODBiNDQzZCIsInNoYWtlXzI1NiI6ImY0MDU4MGU5ZjRkNTJiZmFjNDFjM2RmZmUxOTk4ZDU3OWYyNjlhMGVlNjgwYmYzNGI5MmE0MDYxZTEwOGNmZTM1MTAwYjE5YzE4NTY3ODJjMTlkYTYzNjNkNTQ0ZTY2M2IyNWMzMWJlYjNjNmZlOTBkYWIzZWZhZTgwNzE1ZjA3In0K', - 'eyJibGFrZTNfbXVsdGkiOiJjZGY5ZDgyODIxNmRhMmY0MmNjOWFjM2I4NTU2MzJkZDhkZWE5YzY3NjA3ZjJjNmI2NjRiY2FmZTI5MTUzOGZkIiwiYmxha2UzX3NpbmdsZSI6ImNkZjlkODI4MjE2ZGEyZjQyY2M5YWMzYjg1NTYzMmRkOGRlYTljNjc2MDdmMmM2YjY2NGJjYWZlMjkxNTM4ZmQiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzE3YmE1Y2ZjMmQzNzE4YjBhOWVhYjllY2U5NDZjZDQiLCJzaGExIjoiZWYxNzQyMjI0NDdiM2MxOTQzMTNjNWE1ODlkN2MzOGZjNzQxMmFiZSIsInNoYTIyNCI6ImM2YjcwN2U4OGM5ZDZmMjFhMDgyNzczN2YwYzc1MmQ3NjUxY2ZkZGQzMzg4ODY5ZDE2ZDA4ZGVhIiwic2hhMjU2IjoiN2JhZTgxMWFjYjAyODhkOTRmZjEwODE3ODFlMTNkY2E2Yjk2NDVlOGQ0NGFkNmIwMWIyM2I2NDdlNTdjZDhhNyIsInNoYTM4NCI6IjgyMjM1ZjkzZmU5MDBkNDg4YmVjOTg3NWM1NjRhN2UzNTc5Y2NiY2Q2ZjI5YjM5MDQwZjU3NTAxNzRiNGVkYjc4MDgyN2ZiNjQ3NDExMGVkZTQwMWJhNDAyMzE0ODRlZCIsInNoYTUxMiI6ImU1ODVkMTQ4MmU4ZDg3YzEwMTFjYTNlODI2M2I0N2RmMTQ4OWVlNDczMjY4Njg5YjBhMDVjZDEzNTcxZWViMjg3YTg0N2E0NDI1ZjQxMTY5Njg5Y2Q5N2VkMzZmYzFjNWZjZjMxNjNmMjQyYmY4MTAyZmYzZjk3YjYxYzc4ODNjIiwiYmxha2UyYiI6IjlhMmIxNGJjZmFkOWJlOGM5MWI5ODRjMTc3Yzk3MWMxY2JmZGExZjFiZDRmNTljMWU1MzgwNzc1MDI4ZDI3YWIzMWNjZmRhNzc0OWY1Mzc3Njk2NDAyMDZlNzRmMmQ1ZjQzMmIzZTYzNWY5YzgwZmVkODlmM2Y0NzhkOWExZDViIiwiYmxha2UycyI6IjJiYTgzNTBiNmMwNzRiZTkwOTIwNzE0Zjk0ODI0MDZlYzdjNzUwNGZkNDA4N2Q0NGM4ODQwNGU3MDYwN2E1MjUiLCJzaGEzXzIyNCI6ImViMzEwZTEzODVlNTFkOWExMDViNjQxY2UyNmZhNDU1MWZmODhjNmY4ZDVhYzE0YzUzZDMwNWVmIiwic2hhM18yNTYiOiI1YjI1Y2VlOGMwYmRjNzE2OWUwMjNjZDg2YzAyNjM3NTQ4Y2U4NDhmOTAzNTYyOTYxNGM3OTk3MDMxMjQxNjQzIiwic2hhM18zODQiOiJiN2NmNDU4NjQ5NTkwNDI2OTNhN2FkNGQ3Y2Y4MDlhYTg4NjliOTIxNmQ0MDViYTgxOTJjMzA0N2M0NzBjNmI5MDZmZDEwNmMwYzE1MjFjMjZiYTBjYTVhYTJlNzJmYWEiLCJzaGEzXzUxMiI6ImM2NjZmZWM2ZTI2ODIyZGRiYTYzNDI0OTVmNDJkZDY5NzhhYzkyMTNmY2Y5MjE1ODk3OGJiMDA0ZTZiMTIwNjBmMDU0YmJiMTYyMDY2ZTU3NDA2MTc0NGQxNjlkNGFmOWZlZGIwZjQwMzdkOTRkZmI1NzU1YzRjM2UxYjc5OWE0Iiwic2hha2VfMTI4IjoiMjFiM2UxOGNkZTEyMDQ4ODdhODE2MWRjYjE5MjQ4ZmY1ODk0ZTk4ZGVjMTFmMTllNjg2NDBjZWMyZmNiMzZjNCIsInNoYWtlXzI1NiI6IjY2NDNjNTg5ZjZjM2MwYTJlNmRkZWUyMGViZjhjNmZjZjI5MmE4YmVhYTM4OTNiNjM3ZWNhYmQ3ZTE4YWQyZDI1N2UyNDZmZjAxOTg4YjAyNTBkNDRlN2VlYTcxZDgyNmUxNjU3ZjRhOTg0NTVkNDljOTdkMDAzYjg2NDJkNWViIn0K', - 'eyJibGFrZTNfbXVsdGkiOiI4ODlmYzIwMDA4NWY1NWY4YTA4MjhiODg3MDM0OTRhMGFmNWZkZGI5N2E2YmYwMDRjM2VkYTdiYzBkNDU0MjQzIiwiYmxha2UzX3NpbmdsZSI6Ijg4OWZjMjAwMDg1ZjU1ZjhhMDgyOGI4ODcwMzQ5NGEwYWY1ZmRkYjk3YTZiZjAwNGMzZWRhN2JjMGQ0NTQyNDMiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNTIzNTRhMzkzYTVmOGNjNmMyMzQ0OThiYjcxMDljYzEiLCJzaGExIjoiMTJmYmRhOGE3ZGUwOGMwNDc2NTA5OWY2NGNmMGIzYjcxMjc1MGM1NyIsInNoYTIyNCI6IjEyZWU3N2U0Y2NhODViMDk4YjdjNWJlMWFjNGMwNzljNGM3MmJmODA2YjdlZjU1NGI0NzgxZDkxIiwic2hhMjU2IjoiMjU1NTMwZDAyYTY4MjY4OWE5ZTZjMjRhOWZhMDM2OGNhODMxZTI1OTAyYjM2NzQyNzkwZTk3NzU1ZjEzMmNmNSIsInNoYTM4NCI6IjhkMGEyMTRlNDk0NGE2NGY3ZmZjNTg3MGY0ZWUyZTA0OGIzYjRjMmQ0MGRmMWFmYTVlOGE1ZWNkN2IwOTY3M2ZjNWI5YzM5Yzg4Yjc2YmIwY2I4ZjQ1ZjAxY2MwNjZkNCIsInNoYTUxMiI6Ijg3NTM3OWNiYzdlOGYyNzU4YjVjMDY5ZTU2ZWRjODY1ODE4MGFkNDEzNGMwMzY1NzM4ZjM1YjQwYzI2M2JkMTMwMzcwZTE0MzZkNDNmOGFhMTgyMTg5MzgzMTg1ODNhOWJhYTUyYTBjMTk1Mjg5OTQzYzZiYTY2NTg1Yjg5M2ZiIiwiYmxha2UyYiI6IjBhY2MwNWEwOGE5YjhhODNmZTVjYTk4ZmExMTg3NTYwNjk0MjY0YWUxNTI4NDliYzFkNzQzNTYzMzMyMTlhYTg3N2ZiNjc4MmRjZDZiOGIyYjM1MTkyNDQzNDE2ODJiMTQ3YmY2YTY3MDU2ZWIwOTQ4MzE1M2E4Y2ZiNTNmMTI0IiwiYmxha2UycyI6ImY5ZTRhZGRlNGEzZDRhOTZhOWUyNjVjMGVmMjdmZDNiNjA0NzI1NDllMTEyMWQzOGQwMTkxNTY5ZDY5YzdhYzAiLCJzaGEzXzIyNCI6ImM0NjQ3MGRjMjkyNGI0YjZkMTA2NDY5MDRiNWM2OGVjNTU2YmQ4MTA5NmVkMTA4YjZiMzQyZmU1Iiwic2hhM18yNTYiOiIwMDBlMThiZTI1MzYxYTk0NGExZTIwNjQ5ZmY0ZGM2OGRiZTk0OGNkNTYwY2I5MTFhODU1OTE3ODdkNWQ5YWYwIiwic2hhM18zODQiOiIzNDljZmVhMGUxZGE0NWZlMmYzNjJhMWFjZjI1ZTczOWNiNGQ0NDdiM2NiODUzZDVkYWNjMzU5ZmRhMWE1M2FhYWU5OTM2ZmFhZWM1NmFhZDkwMThhYjgxMTI4ZjI3N2YiLCJzaGEzXzUxMiI6ImMxNDgwNGY1YTNjNWE4ZGEyMTAyODk1YTFjZGU4MmIwNGYwZmY4OTczMTc0MmY2NDQyY2NmNzQ1OTQzYWQ5NGViOWZmMTNhZDg3YjRmODkxN2M5NmY5ZjMwZjkwYTFhYTI4OTI3OTkwMjg0ZDJhMzcyMjA0NjE4MTNiNDI0MzEyIiwic2hha2VfMTI4IjoiN2IxY2RkMWUyMzUzMzk0OTg5M2UyMmZkMTAwZmU0YjJhMTU1MDJmMTNjMTI0YzhiZDgxY2QwZDdlOWEzMGNmOCIsInNoYWtlXzI1NiI6ImI0NjMzZThhMjNkZDM0ODk0ZTIyNzc0ODYyNTE1MzVjYWFlNjkyMTdmOTQ0NTc3MzE1NTljODBjNWQ3M2ZkOTMxZTFjMDJlZDI0Yjc3MzE3OTJjMjVlNTZhYjg3NjI4YmJiMDgxNTU0MjU2MWY5ZGI2NWE0NDk4NDFmNGQzYTU4In0K', - 'eyJibGFrZTNfbXVsdGkiOiIwNWI1MjNlN2Y2NTJhM2YxNGQ4YmQwMGRhMGY5NDdjMzM4NzllN2VhN2Y1OGQyYTA3YWJkNzJmMWIwZGZiZjFlIiwiYmxha2UzX3NpbmdsZSI6IjA1YjUyM2U3ZjY1MmEzZjE0ZDhiZDAwZGEwZjk0N2MzMzg3OWU3ZWE3ZjU4ZDJhMDdhYmQ3MmYxYjBkZmJmMWUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzhjMDllZWFkMGVhNjcyZDJlYzUzMTM4NmJkYmZlMTkiLCJzaGExIjoiYmMyYjc1MjdhODJlMGUwYjUwYmRmYjBhNjA1YTUxZGE4ZjAzMzIwYSIsInNoYTIyNCI6IjQ1NTAzYTgwMzY1ZDdmYTJhOTM2ZWEyY2JhMWRjNTIxZGM0MTc0ZDMxY2M2NGZhOTUyMmExM2ZiIiwic2hhMjU2IjoiODEyMmQ5MzA3ZDc0NDk3MmIyOWRkMjc5Y2FjODA5MzI5ZWJlYzU5MzU4YjMzNWMwNGFjZWY4ZjJlNjZkZTIyMiIsInNoYTM4NCI6IjhlYzJhNjA0NjExYmQxYTIxYWRjYTdhMGNlZmY3YmZmMmMzNWI3NzYyMjUwMWM0ZWJmYzFmZWY1ZTcwYTRlNzcxMmVjZWFkNGM0OGJkNjM2NzMzMWJiMWNkMGM4ZTdmNiIsInNoYTUxMiI6IjQ4NDE5YTM3NjBlOTcwMjEzZjYzM2VhNGE2MzQyYmE2MzhiMzMzMGM5NmFlY2Y4YTg4MmI4YTg2ODRiYTMzMWQyNDkyN2UzOTE2MjY3YThhODY2YmJmYWRlYTQ0Mzg0Njg2NDcxYjM1NjI4M2ZlODUyYTk5MDc0OWQyYTYyZWM4IiwiYmxha2UyYiI6ImM5MTk3NTQ4NDRjOWRhYTMxYzAxMmYxMzdhMjk5M2Y1MjM3YTIyMjMzZmFjOTRkMWUwNzhmYjMxNzVhNzZmNGViNTJjNmZhYzY2MjlhYjZhNDJjMjNhZWM0Y2U2Y2YxZWQyODFlYzg0MmZlODFjMmJkZGQyOGMyY2RkNjNlN2Q2IiwiYmxha2UycyI6IjE5MDE5ODZjN2I4OTZiOGEzOWJjOWY4MWNlMThmZmJlMGZkNzIxOThkY2JiZTc4MmRmY2JlZjMyNmI1OTU3YzciLCJzaGEzXzIyNCI6ImNkNjk0ZDdjODkzN2ZjMTExYzc1MjMyNWNhOTliMGMxYjc2YjdlOWJhMWZhZjRiMzJmNDlhOWEwIiwic2hhM18yNTYiOiJkYmVmNjc4YWM2N2E0MDJkYTVhMzlhZjc3NjQ0MDI5ZmY3ZjgxNzAyNjhjMjVkOWU0ZGU0YTRkMzIyYTkwMmU0Iiwic2hhM18zODQiOiI1OGQwNzFjMGZiMDY3ZmNjMDk4NTk1ZjdlYzE2MmEwYjcwYTIyYjg4Mjk0ZjJhYzY4NDQxYjg3YTRiNGQxYTVlM2MzYWRlMGFkN2U4M2M4ZjIxZGU0YTkxMDZhMTBlZWQiLCJzaGEzXzUxMiI6ImFkYTFiZWI0MDFhNjg2MDI2MDFhYWY0OTA3NjZhZjE1MmU0NjVlOGRmMTVhN2E5MzU1NWMzODE4Y2I5ZTAyYmEyOTY0ODZhMGY2MThiZTljN2IyNjdmYjBhYjUxYjEwZDIxYjRlNzIxYmIwN2EwNzg5NzNkZThhMmM5ZjM2MDQ4Iiwic2hha2VfMTI4IjoiZWE2YzljZGMyMWUxZjVmMTIwYTJjNzI0YzVkOTJiZmUyZjUzOWFhZDVmNDJhNjQ4MWYwMzFiMWY5ZTc1NDVmZiIsInNoYWtlXzI1NiI6ImQ1ZjMzNzVmYzY2YWU5ZWIzZDVkYTg2NzhlYTQ5Y2YzZjAyNWNhMDA0MzQyOWMzNzcxZWRmZWVhMDMwMmEzNjFmMGY4Y2FjYzYwYjg5YmUwODk0MWQ3MGY2MmVkODMxZjA3YzAwMjZjNmY0NTc2YTMwMzEwZDhkZTYwM2U4MjJmIn0K', - 'eyJibGFrZTNfbXVsdGkiOiJmMTUxOTEwODEzYjcyOGZhNjMyMzhjOWYzYTYyZGViOTA4MTU2YWEyYTcyNjUwYjk3OWY1MjU2ZWUwODliNzNmIiwiYmxha2UzX3NpbmdsZSI6ImYxNTE5MTA4MTNiNzI4ZmE2MzIzOGM5ZjNhNjJkZWI5MDgxNTZhYTJhNzI2NTBiOTc5ZjUyNTZlZTA4OWI3M2YiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNDIwNzkxMTdhOWE4YzMzM2U4NzY1NmZhZDE1ODQ2OGYiLCJzaGExIjoiZTk5ZWJlNjExNGY4NmM5MjMwN2M0ZWY1ZTYzMTU3ODI0MjhmZmJiOSIsInNoYTIyNCI6ImIxMzI0NDY5NmM3ZGNmYjFkNjFjNTdiZjA3NjVkYzBkM2YxMGE3ZTMwNjNkMTk3NTc1MmQ5MTdmIiwic2hhMjU2IjoiODgzZjU0MGJiNzc2MTQxZmEyMTU5ZDA1YjgxOTg3NThjMzA2YmYyNTk0Mjg5MTJkOTMyYjg0YmUwNjYwOGVmYSIsInNoYTM4NCI6ImRlNjhmNjBmMTUwNjljZGFkNzg2OTE4NmU4Y2IzMGFjMmExNjkxMzk3Y2MzNmI0ODMyNGNkNjY4M2QyY2Y4M2FiNjZlZGQxMDA3ZmM2NDk3YjkzY2ZmNDdiMWZjMGNlZiIsInNoYTUxMiI6IjRmODA0OWZjNWNlNmVhZTExNWViNmQxOTI3ODQ4MjcyNWFjMWJlOWFiYzNhYTBiYzc2N2JlNDg3NzZiODU0MTdlMTQxOTQxOTYyYWRkY2JlMzkzZDI4NzkxZTQ2NTU4MmVkZjIzOTgwYzEyOWIyYjkyYTllZmQzNTc0YjNjY2IzIiwiYmxha2UyYiI6IjI2ZGNlNjFlMDA0Y2Y2MTQzZDFlZDYwMjI0ODNhNTNkODMxZjFlNjFlZGEwNGMzNjk5N2M1MzI2Y2E2ZGY4ODlhYzVmYzM2YTYzMWViYWQ2NzVmMTBkMmYyZGRkZDcxOGFlZDQ1OTc4ODlhMDNlODQ0MGU3ZmMxODliZTRkZWZkIiwiYmxha2UycyI6IjE5MTE4MjFmZjQxOTQ3ZGU4M2UxN2Q4MzliMzI3NmUwNjg5Y2U3Y2Y1NGIwNzAwNzQwYWNhOGJkYzQ4NjdlNmUiLCJzaGEzXzIyNCI6Ijg1ZTVhNDg0MmY0M2FkMjg1MjY2NTMyNzQ2NWEwNjNhMGU5NDAwNWJlOTQ3MTdhMzY5NzY2ODk4Iiwic2hhM18yNTYiOiJlMjk5NzQ0NWZmNjg2ZTRlODdiYWVmYTcwOTEzNDQ0MGNkYjlhNjAzYTcxNGQwNzEzNjYzNDkxYTllZmRmZDFlIiwic2hhM18zODQiOiIyNzY0MjJiZmVhYWM4ZjM4NDBjMWUwNGY3ODQ2NTkwOWM1ZDhkYjRlYTU3ZWU1OTdjYTJmMWFlMDhhNzhkOGI0NWI3MTJiZmY3MTUwODAxM2NmMTY4MGRlNzdhNGM4OTUiLCJzaGEzXzUxMiI6IjYyZWQxMGFjMWQ1YmJjMDIzNWRjNjRhNGI3NjI0OWEzNzNkOTVhYTM1YTZjMzI1ZDZiNzVkM2EwM2Q3MzNkMjYyYmJhZDI3Zjg0NjcxYWFjYTgyYmQ0YjlhNWQwMGU4M2M5YzlmYzA3ZGNmMzA4YTg4ZTUyNTU3ZDI3NzFhYWZjIiwic2hha2VfMTI4IjoiNDQ5MmIwOWY3OTQ0NGEyOGQyYTdkZmRiZTc1YTc2MTMwODVjYTJhZGEwN2UwOTZiNjUwMjIwMzg1MzBlZDI1MSIsInNoYWtlXzI1NiI6IjFlMTI3MTE3ZDk3YTIwY2E5Y2QzMzU3YzNjMmQxOTFiOWEzMWRiNzNlZjM2ZjA4MmFjZGI2ZThiOWU1NDZiNGMzZWI3Mjg2OThjY2QxMmM4YjY2M2YxMDMzZGJhYzMxZjI0OThlZGUyM2JlZjY4ZTlmMzJjNmUzZDNhNzE1ZjkwIn0K', 'eyJibGFrZTNfbXVsdGkiOiI3Yjc5ODZmM2QyNTk3MDZiMjVhZDRhM2NmNGM2MTcyNGNhZmQ0Yjc4NjI4MjIwNjMyZGU4NjVlM2UxNDEyMTVlIiwiYmxha2UzX3NpbmdsZSI6IjdiNzk4NmYzZDI1OTcwNmIyNWFkNGEzY2Y0YzYxNzI0Y2FmZDRiNzg2MjgyMjA2MzJkZTg2NWUzZTE0MTIxNWUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNzdlZmU5MzRhZGQ3YmU5Njc3NmJkODM3NWJhZDQxN2QiLCJzaGExIjoiYmM2YzYxYzgwNDgyMTE2ZTY2ZGQyNTYwNjRkYTgxYjFlY2U4NzMzOCIsInNoYTIyNCI6IjgzNzNlZGM4ZTg4Y2UxMTljODdlOTM2OTY4ZWViMWNmMzdjZGY4NTBmZjhjOTZkYjNmMDc4YmE0Iiwic2hhMjU2IjoiNzNjYWMxZWRlZmUyZjdlODFkNjRiMTI2YjIxMmY2Yzk2ZTAwNjgyNGJjZmJkZDI3Y2E5NmUyNTk5ZTQwNzUwZiIsInNoYTM4NCI6IjlmNmUwNzlmOTNiNDlkMTg1YzEyNzY0OGQwNzE3YTA0N2E3MzYyNDI4YzY4MzBhNDViNzExODAwZDE4NjIwZDZjMjcwZGE3ZmY0Y2FjOTRmNGVmZDdiZWQ5OTlkOWU0ZCIsInNoYTUxMiI6IjAwNzE5MGUyYjk5ZjVlN2Q1OGZiYWI2YTk1YmY0NjJiODhkOTg1N2NlNjY4MTMyMGJmM2M0Y2ZiZmY0MjkxZmEzNTMyMTk3YzdkODc2YWQ3NjZhOTQyOTQ2Zjc1OWY2YTViNDBlM2I2MzM3YzIwNWI0M2JkOWMyN2JiMTljNzk0IiwiYmxha2UyYiI6IjlhN2VhNTQzY2ZhMmMzMWYyZDIyNjg2MjUwNzUyNDE0Mjc1OWJiZTA0MWZlMWJkMzQzNDM1MWQwNWZlYjI2OGY2MjU0OTFlMzlmMzdkYWQ4MGM2Y2UzYTE4ZjAxNGEzZjJiMmQ2OGU2OTc0MjRmNTU2M2Y5ZjlhYzc1MzJiMjEwIiwiYmxha2UycyI6ImYxZmMwMjA0YjdjNzIwNGJlNWI1YzY3NDEyYjQ2MjY5NWE3YjFlYWQ2M2E5ZGVkMjEzYjZmYTU0NGZjNjJlYzUiLCJzaGEzXzIyNCI6IjljZDQ3YTBhMzA3NmNmYzI0NjJhNTAzMjVmMjg4ZjFiYzJjMmY2NmU2ODIxODc5NjJhNzU0NjFmIiwic2hhM18yNTYiOiI4NTFlNGI1ZDI1MWZlZTFiYzk0ODU1OWNjMDNiNjhlNTllYWU5YWI1ZTUyYjA0OTgxYTRhOTU4YWQyMDdkYjYwIiwic2hhM18zODQiOiJiZDA2ZTRhZGFlMWQ0MTJmZjFjOTcxMDJkZDFlN2JmY2UzMDViYTgxMTgyNzM3NWY5NTI4OWJkOGIyYTUxNjdiMmUyNzZjODNjNTU3ODFhMTEyMDRhNzc5MTUwMzM5ZTEiLCJzaGEzXzUxMiI6ImQ1ZGQ2OGZmZmY5NGRhZjJhMDkzZTliNmM1MTBlZmZkNThmZTA0ODMyZGQzMzEyOTZmN2NkZmYzNmRhZmQ3NGMxY2VmNjUxNTBkZjk5OGM1ODgyY2MzMzk2MTk1ZTViYjc5OTY1OGFkMTQ3MzFiMjJmZWZiMWQzNmY2MWJjYzJjIiwic2hha2VfMTI4IjoiOWJlNTgwNWMwNjg1MmZmNDUzNGQ4ZDZmODYyMmFkOTJkMGUwMWE2Y2JmYjIwN2QxOTRmM2JkYThiOGNmNWU4ZiIsInNoYWtlXzI1NiI6IjRhYjgwYjY2MzcxYzdhNjBhYWM4NDVkMTZlNWMzZDNhMmM4M2FjM2FjZDNiNTBiNzdjYWYyYTNmMWMyY2ZjZjc5OGNjYjkxN2FjZjQzNzBmZDdjN2ZmODQ5M2Q3NGY1MWM4NGU3M2ViZGQ4MTRmM2MwMzk3YzI4ODlmNTI0Mzg3In0K', - 'eyJibGFrZTNfbXVsdGkiOiIxNGY2MzBkNmQ0ZGFiYTE1ZjVmMmEyODA1ZjYxZTFkODZmYjA0OTlmZDBhMGZmYjdhNTM2NDIyYmRlYWIwODFmIiwiYmxha2UzX3NpbmdsZSI6IjE0ZjYzMGQ2ZDRkYWJhMTVmNWYyYTI4MDVmNjFlMWQ4NmZiMDQ5OWZkMGEwZmZiN2E1MzY0MjJiZGVhYjA4MWYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZWRlNTBjNmM1NDkwNmM0NzBlNTY1NTI0NzcyMGNkMGQiLCJzaGExIjoiODZjZDFiOWM2ODY3NzYzODgwZTgwN2M2MmRmNDljMWNkNWUyODRlNiIsInNoYTIyNCI6ImM4MmI5NjA2NzlhYTNmNTZlYjIyNjllYmI5YjdiM2EzYTJiMzUxMDlkMzE0YjdmMDEwYzQ2ODFkIiwic2hhMjU2IjoiNTc1NDBhODhmYjM4ZGNjNWQ2MzA1OTE4ZDM4MWQ3M2I5NzliODhmOGNjM2ZlMjg3ODU5OWI3OGE3YzUyZGNkNiIsInNoYTM4NCI6IjhjM2Y1NmJhNjdlZmJjZmQyMzkwMjcwYjVjMjdjZTBiMzUxZTI3OTkwNGMyYTQ1ZGNmNzJmOWVlMWE3YTdhOTlkODM4YzMzZGNiZWVlZTc1ZWYxYzYwMzcyZjBmODcyNCIsInNoYTUxMiI6IjkzMGViNGE1ZDhkOGQxMTg0MWEyNGM2ZWU4YzA2YjBmZWYzZDlkOGIzYmI1NTRhNmNkZDg2M2JiNWZlOGY5MjQwOWU0Nzk1N2EzODNiNTNmMjNjMDhiMWRiY2QyYTQ4NmQ5YmNjMTNhZWJhNmU1YjA0MzIzNWUzMWUyNzQ5YjJhIiwiYmxha2UyYiI6IjAyNjZmNDU1YWQzODY5ZmFmNjUwYzc0M2VlN2Y3NzIzMjMzM2U1NDVkYWY3MTAyNGE0MzZhNmM1MzBkMDFlMDkwYzdjYzgyZGUxMjc2YTY5MTBmY2QyMDVlZGI5M2ZmOWY3MzEwNDYzYTNlYmFiNzJlZDAwNTdhMThlNTQxOWI5IiwiYmxha2UycyI6ImNiNjc3YThkOTdmNmYxYWQyNTE5MjgwOWRjYzlhZjFiYjJlZDNmNjBhNzQ4ODAyYWJiNTJmZTUyMzQ2Y2ZiOGQiLCJzaGEzXzIyNCI6ImNkNDQyYTliMWNiZjNlOGEzMGQwMTJmNzRkNjAxNmRjYTU1OTEzYjgxM2YzOGY0ZTlmYmViMmY2Iiwic2hhM18yNTYiOiJjZDlhNDdlNGU5ZDMyNTdlM2FmNGEwM2QwMGIxM2JmYzUyMTY5YThhYTIyNGNhMTE3OTljMTY1YjU2MjBlMTcxIiwic2hhM18zODQiOiIzMjIwNzJjODk4YTk3NzkzNWQzYzQ3Y2VlOGI2YTU5MmI1NzhjMWMyZjllMmJhNGUzZWRiYmUxMzM4NDY2YzAyYWJiZjVjMjhkN2Y5Y2M0ZWMyMzRiMzM0NWYyNjM2YWQiLCJzaGEzXzUxMiI6IjA0Y2NmYjQwZDBlNTc0MTk4NjkyYTU1ZTAwM2QzODY5NjdmZWVjYjZkMTFmYTYzZGIwMWJlYTdkMDA2MmZhODg5OTJhOWRiNzMwZjZhZjk0NWJjZjRiNWI5YzllN2VjMGVlMDBhYmUyOWMyMmY1OGE1OWNhYzc1YzgyNWU0NzFmIiwic2hha2VfMTI4IjoiMjliNWJhMDZmYWExZDU2MzM1ZDFhNDJmNjkwMWE0YjRlZDUyOTFiYjJlY2EzZjFjNTNkNjY5MjU4ZjIwMWMxNSIsInNoYWtlXzI1NiI6IjRjZGU5MTg5NDlmYzdlZjJmMTg0ODFjZTI4NTI2YTBlMDU4ZDhhYTEzNmYyZjdjYWY0M2NhMmQzYTAzYjgzNTE3OWJjZTgzNTQ0N2QzN2Y0YWE5NTAzYTcwYjI3NzQxNjU5NDA0NjNlNWQ0MmFiOGE1MDZjMjJjZTFkYjQ4NzAwIn0K', 'eyJibGFrZTNfbXVsdGkiOiI4ODlmYzIwMDA4NWY1NWY4YTA4MjhiODg3MDM0OTRhMGFmNWZkZGI5N2E2YmYwMDRjM2VkYTdiYzBkNDU0MjQzIiwiYmxha2UzX3NpbmdsZSI6Ijg4OWZjMjAwMDg1ZjU1ZjhhMDgyOGI4ODcwMzQ5NGEwYWY1ZmRkYjk3YTZiZjAwNGMzZWRhN2JjMGQ0NTQyNDMiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNTIzNTRhMzkzYTVmOGNjNmMyMzQ0OThiYjcxMDljYzEiLCJzaGExIjoiMTJmYmRhOGE3ZGUwOGMwNDc2NTA5OWY2NGNmMGIzYjcxMjc1MGM1NyIsInNoYTIyNCI6IjEyZWU3N2U0Y2NhODViMDk4YjdjNWJlMWFjNGMwNzljNGM3MmJmODA2YjdlZjU1NGI0NzgxZDkxIiwic2hhMjU2IjoiMjU1NTMwZDAyYTY4MjY4OWE5ZTZjMjRhOWZhMDM2OGNhODMxZTI1OTAyYjM2NzQyNzkwZTk3NzU1ZjEzMmNmNSIsInNoYTM4NCI6IjhkMGEyMTRlNDk0NGE2NGY3ZmZjNTg3MGY0ZWUyZTA0OGIzYjRjMmQ0MGRmMWFmYTVlOGE1ZWNkN2IwOTY3M2ZjNWI5YzM5Yzg4Yjc2YmIwY2I4ZjQ1ZjAxY2MwNjZkNCIsInNoYTUxMiI6Ijg3NTM3OWNiYzdlOGYyNzU4YjVjMDY5ZTU2ZWRjODY1ODE4MGFkNDEzNGMwMzY1NzM4ZjM1YjQwYzI2M2JkMTMwMzcwZTE0MzZkNDNmOGFhMTgyMTg5MzgzMTg1ODNhOWJhYTUyYTBjMTk1Mjg5OTQzYzZiYTY2NTg1Yjg5M2ZiIiwiYmxha2UyYiI6IjBhY2MwNWEwOGE5YjhhODNmZTVjYTk4ZmExMTg3NTYwNjk0MjY0YWUxNTI4NDliYzFkNzQzNTYzMzMyMTlhYTg3N2ZiNjc4MmRjZDZiOGIyYjM1MTkyNDQzNDE2ODJiMTQ3YmY2YTY3MDU2ZWIwOTQ4MzE1M2E4Y2ZiNTNmMTI0IiwiYmxha2UycyI6ImY5ZTRhZGRlNGEzZDRhOTZhOWUyNjVjMGVmMjdmZDNiNjA0NzI1NDllMTEyMWQzOGQwMTkxNTY5ZDY5YzdhYzAiLCJzaGEzXzIyNCI6ImM0NjQ3MGRjMjkyNGI0YjZkMTA2NDY5MDRiNWM2OGVjNTU2YmQ4MTA5NmVkMTA4YjZiMzQyZmU1Iiwic2hhM18yNTYiOiIwMDBlMThiZTI1MzYxYTk0NGExZTIwNjQ5ZmY0ZGM2OGRiZTk0OGNkNTYwY2I5MTFhODU1OTE3ODdkNWQ5YWYwIiwic2hhM18zODQiOiIzNDljZmVhMGUxZGE0NWZlMmYzNjJhMWFjZjI1ZTczOWNiNGQ0NDdiM2NiODUzZDVkYWNjMzU5ZmRhMWE1M2FhYWU5OTM2ZmFhZWM1NmFhZDkwMThhYjgxMTI4ZjI3N2YiLCJzaGEzXzUxMiI6ImMxNDgwNGY1YTNjNWE4ZGEyMTAyODk1YTFjZGU4MmIwNGYwZmY4OTczMTc0MmY2NDQyY2NmNzQ1OTQzYWQ5NGViOWZmMTNhZDg3YjRmODkxN2M5NmY5ZjMwZjkwYTFhYTI4OTI3OTkwMjg0ZDJhMzcyMjA0NjE4MTNiNDI0MzEyIiwic2hha2VfMTI4IjoiN2IxY2RkMWUyMzUzMzk0OTg5M2UyMmZkMTAwZmU0YjJhMTU1MDJmMTNjMTI0YzhiZDgxY2QwZDdlOWEzMGNmOCIsInNoYWtlXzI1NiI6ImI0NjMzZThhMjNkZDM0ODk0ZTIyNzc0ODYyNTE1MzVjYWFlNjkyMTdmOTQ0NTc3MzE1NTljODBjNWQ3M2ZkOTMxZTFjMDJlZDI0Yjc3MzE3OTJjMjVlNTZhYjg3NjI4YmJiMDgxNTU0MjU2MWY5ZGI2NWE0NDk4NDFmNGQzYTU4In0K', - 'eyJibGFrZTNfbXVsdGkiOiJlODQwMjE4NDU5NWE4ZWVkMzk4MDFiNzE5YzVhYzgyMjllN2ZkNWI0YWY4YTYwNTIxMzNmYmY5ZjM3MjgwMjY5IiwiYmxha2UzX3NpbmdsZSI6ImU4NDAyMTg0NTk1YThlZWQzOTgwMWI3MTljNWFjODIyOWU3ZmQ1YjRhZjhhNjA1MjEzM2ZiZjlmMzcyODAyNjkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZjRiMjE2MjNmNjI5NzZjNjhjY2JjNzdjMTdkZTY1MjgiLCJzaGExIjoiZTI1NjlmNDc0NGFlYzVjOTY0M2VjYzhhYzRkOTJiNGQxZjFiZGIwMiIsInNoYTIyNCI6IjllYTI5ZjY2MWNkMTQ4MTAzMjU3OGY3YTk5YjVmZWU3YjQwMTVkMGRjZTRiZDBiOTBjZmRjNGY1Iiwic2hhMjU2IjoiYTAzMDZjNmYyN2ExOTRkNzQyNTI5ZmFjZTRmMjhkOGM5ZDkzNWQ2ODk2NjA0ZmE2YWRmMGJhNDUyMjE2MTU1ZSIsInNoYTM4NCI6ImMzNGVhODc4NGViOWY1NzcyNmQ3ZjNjNzMyMjhkMzJhMTlmNzY3ZDFiNTA1MGUwZTY4MzE5MjQ5MDM1YmQ4OWM4NTQyN2MxMzM5YWE4N2Q0Y2NjYjBhNzUwN2E4OWY4OSIsInNoYTUxMiI6Ijg4MzE3ZGIzMmVmOWI4MmJmYjE5NTk2ODUwZDkyZWU3ZDYxNTE4YTE1NTYxYmY0MTgyNGY5OTg1YThhZjliYzc1N2RlNmEwNzlmOTIwMGE2N2E5YWY3NzNlZmFjYjg3MmUzMGI2N2I5MDllNmU2NDg0YjQzMmQ5NjRlN2JmYTExIiwiYmxha2UyYiI6IjNjMmY1MTQ0OWEyZWNhYjBjZDVhMzQwYWI5MThhZmQ1NjRjZjc0YWZhNTQ0MmI0N2E5N2E2MGQ1OWYzYTJiMDc2ZTljMWVjMDliMjI4ZjNhNWE1MTNiMjBjZDhkZDBhZmMzYTI4NTc1OTRkOWZmNjUxMjBjOTAwMDc3MTU1ODFkIiwiYmxha2UycyI6IjEzYzk2YmI0ZDM0M2M0YzFhMDE2MzY0NGYyNTA1M2E4ZTRmMTJiOTE4YjcyYWRiMWM2M2Q0ZmFjZjlkNWE4ZTQiLCJzaGEzXzIyNCI6IjFhZmE4MmIwYWE5MGE5MmI4YzM2ZDE1ZDllYWJjZDlhYTI5MTk1YWZmYzIyNTQzOTkwNTI0ZGFiIiwic2hhM18yNTYiOiJkZDU5NTg4MWEzNmNlZTA0MjY4NjNlM2VkN2ZiMmI1NmI5NDY5ZTE4ZmI4NzkzNWFmZGU2MGYzZWMzMzJjNWI1Iiwic2hhM18zODQiOiIzOTRhYzg0NTgxYzJlMGQ4YWM3YTdjMzI1ZjllNGE3MGFmMjI0N2I4MmI3NDIzY2YxY2UzYmNkZGNmODhmMWU1MmMxNWRhMjA3ODU4YWY2NDBkYmEyOWY4OTg2YWQwODciLCJzaGEzXzUxMiI6ImY2OGRmOTJiNGNhN2JiMDQ5OTNmNWNkNGFhMTgzMGYzMTA3OWJiMGZiMmY5ZDI5OWNhOTE4Yzg1NDRlZjJhNjg5Y2Y2MzkwNmEyZTVkZjUwOTFiMDJhYTMzN2Y1MWI5Mjk5ZWNjMDUyN2FjODMwMmY1NjVjZjRjNDE1ODVjNDkyIiwic2hha2VfMTI4IjoiOTMxNTgzNmQ2M2QxODhiYjAzMmJlYmU0YzFhNzZhZjZhZjhjNmIxYzI4YmEyMTcxY2RiNjAzY2ZmNzg4N2ZkNSIsInNoYWtlXzI1NiI6IjQxNDNhNzU1NWZiYTQ3MTljNWZhZDA4ZTdhOWZkNjUzNDJmMzc2OTgzYzVhMWI3OTNjN2M2NWQ2Yjg0Y2RkMjNiOTRiMGUwZjhmODhlZGNhMmQ3MWYzODczMDk5ZjIxYTM5YjEzMTFiZjI1NmFiYzFiMTU1YTgzYTQwM2NkYmY4In0K', - 'eyJibGFrZTNfbXVsdGkiOiJjZGY5ZDgyODIxNmRhMmY0MmNjOWFjM2I4NTU2MzJkZDhkZWE5YzY3NjA3ZjJjNmI2NjRiY2FmZTI5MTUzOGZkIiwiYmxha2UzX3NpbmdsZSI6ImNkZjlkODI4MjE2ZGEyZjQyY2M5YWMzYjg1NTYzMmRkOGRlYTljNjc2MDdmMmM2YjY2NGJjYWZlMjkxNTM4ZmQiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzE3YmE1Y2ZjMmQzNzE4YjBhOWVhYjllY2U5NDZjZDQiLCJzaGExIjoiZWYxNzQyMjI0NDdiM2MxOTQzMTNjNWE1ODlkN2MzOGZjNzQxMmFiZSIsInNoYTIyNCI6ImM2YjcwN2U4OGM5ZDZmMjFhMDgyNzczN2YwYzc1MmQ3NjUxY2ZkZGQzMzg4ODY5ZDE2ZDA4ZGVhIiwic2hhMjU2IjoiN2JhZTgxMWFjYjAyODhkOTRmZjEwODE3ODFlMTNkY2E2Yjk2NDVlOGQ0NGFkNmIwMWIyM2I2NDdlNTdjZDhhNyIsInNoYTM4NCI6IjgyMjM1ZjkzZmU5MDBkNDg4YmVjOTg3NWM1NjRhN2UzNTc5Y2NiY2Q2ZjI5YjM5MDQwZjU3NTAxNzRiNGVkYjc4MDgyN2ZiNjQ3NDExMGVkZTQwMWJhNDAyMzE0ODRlZCIsInNoYTUxMiI6ImU1ODVkMTQ4MmU4ZDg3YzEwMTFjYTNlODI2M2I0N2RmMTQ4OWVlNDczMjY4Njg5YjBhMDVjZDEzNTcxZWViMjg3YTg0N2E0NDI1ZjQxMTY5Njg5Y2Q5N2VkMzZmYzFjNWZjZjMxNjNmMjQyYmY4MTAyZmYzZjk3YjYxYzc4ODNjIiwiYmxha2UyYiI6IjlhMmIxNGJjZmFkOWJlOGM5MWI5ODRjMTc3Yzk3MWMxY2JmZGExZjFiZDRmNTljMWU1MzgwNzc1MDI4ZDI3YWIzMWNjZmRhNzc0OWY1Mzc3Njk2NDAyMDZlNzRmMmQ1ZjQzMmIzZTYzNWY5YzgwZmVkODlmM2Y0NzhkOWExZDViIiwiYmxha2UycyI6IjJiYTgzNTBiNmMwNzRiZTkwOTIwNzE0Zjk0ODI0MDZlYzdjNzUwNGZkNDA4N2Q0NGM4ODQwNGU3MDYwN2E1MjUiLCJzaGEzXzIyNCI6ImViMzEwZTEzODVlNTFkOWExMDViNjQxY2UyNmZhNDU1MWZmODhjNmY4ZDVhYzE0YzUzZDMwNWVmIiwic2hhM18yNTYiOiI1YjI1Y2VlOGMwYmRjNzE2OWUwMjNjZDg2YzAyNjM3NTQ4Y2U4NDhmOTAzNTYyOTYxNGM3OTk3MDMxMjQxNjQzIiwic2hhM18zODQiOiJiN2NmNDU4NjQ5NTkwNDI2OTNhN2FkNGQ3Y2Y4MDlhYTg4NjliOTIxNmQ0MDViYTgxOTJjMzA0N2M0NzBjNmI5MDZmZDEwNmMwYzE1MjFjMjZiYTBjYTVhYTJlNzJmYWEiLCJzaGEzXzUxMiI6ImM2NjZmZWM2ZTI2ODIyZGRiYTYzNDI0OTVmNDJkZDY5NzhhYzkyMTNmY2Y5MjE1ODk3OGJiMDA0ZTZiMTIwNjBmMDU0YmJiMTYyMDY2ZTU3NDA2MTc0NGQxNjlkNGFmOWZlZGIwZjQwMzdkOTRkZmI1NzU1YzRjM2UxYjc5OWE0Iiwic2hha2VfMTI4IjoiMjFiM2UxOGNkZTEyMDQ4ODdhODE2MWRjYjE5MjQ4ZmY1ODk0ZTk4ZGVjMTFmMTllNjg2NDBjZWMyZmNiMzZjNCIsInNoYWtlXzI1NiI6IjY2NDNjNTg5ZjZjM2MwYTJlNmRkZWUyMGViZjhjNmZjZjI5MmE4YmVhYTM4OTNiNjM3ZWNhYmQ3ZTE4YWQyZDI1N2UyNDZmZjAxOTg4YjAyNTBkNDRlN2VlYTcxZDgyNmUxNjU3ZjRhOTg0NTVkNDljOTdkMDAzYjg2NDJkNWViIn0K', - 'eyJibGFrZTNfbXVsdGkiOiI0NzViMjdmNGJiN2MzYTUxMjRhNDY1ODYwOTA2NjZlZGJiYzQ0MWEwYzk2ZDQ1ZDNlODA4YjhiMWVlMmFjOGM5IiwiYmxha2UzX3NpbmdsZSI6IjQ3NWIyN2Y0YmI3YzNhNTEyNGE0NjU4NjA5MDY2NmVkYmJjNDQxYTBjOTZkNDVkM2U4MDhiOGIxZWUyYWM4YzkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMjdkNTgwNzFmMTcxODM5MmRkMzFlYjViMDljYzAxOGEiLCJzaGExIjoiOTYyNGIwNmRlMWVmZGFkYTY3YzEwM2M5Y2FhMmZhNzY5ZDZlMTFlMCIsInNoYTIyNCI6Ijk1MjI1MWM2NGQ1NWU0ZjAyYTQ5NmIxODdjMjE4OTMxZWExYmFhZWU2YWM5NDEyMGI5OTJhYjM4Iiwic2hhMjU2IjoiOWFiYTI2YWJkZmNkNDYwNzNlMGExZDQyMDI3YTNhM2JjYzk2OWY1NjJkNThhMDM2MzdiZjBhMGRlZDY1ODZjOSIsInNoYTM4NCI6ImE1MzA3ZjRmZDgyYjM4ZGIxMGM0MzA1NTkwOTBjYTY2ZDYwYmU5ZGZhZGQzNTViYWM3YThiNzA0MmY5NjRkMmIzMGY4YjVjOTQwNTEzYzY1OGI3ZjhjMTM4ODZhZDM3ZCIsInNoYTUxMiI6ImIyZTYyNGJkOWYzNDM4ZTM1NmMwODIyOTljYThmZWJhZjkxY2I4MTFhMmU1MWU0NTI4M2VlNjc0MGYzOTNjYTQyNmUzZTEwZTdhMzFkODI3ZDk3MDE5ZGRlYjBkY2Q2OGFkMjI0NjcyZThiMDQ4NDVkYmQ4ZWRlMmEyNzU3MDYwIiwiYmxha2UyYiI6IjNlZmViNDhiMzQ5NTE4YzRhMTY4NDEzNjE3MGNjMDRhYzQxMmY2YTEyMjcxY2JkOWRjZmQyMTUzNTY1Y2Q0NzNjNGRiZWNmMDkzMDIxNzQ5YzY4NDBmZDFjNzQ2ZjFlYTUyMzA5MTNjY2IwM2E0YzgyYTIzMDI4OTk3ZDI1M2Y3IiwiYmxha2UycyI6ImFjZTllYzg1YWFhMjYxNzY3NjhjY2FjNzdlNDQ4ZjJiZjYyOTYyNjNjOTZmYzk2ZGNlZWI2NjdkMmRkZGZiNDMiLCJzaGEzXzIyNCI6IjU0ZTg1NTBkNWU5ZDRmMTg1MWI1ZGE3NmU4N2ExZTMzNDViZDVkODhkZDFlMDUxYWI0ZTI1OGI5Iiwic2hhM18yNTYiOiI4MjgwYTU2NjQ2YWU1OTg4ZTQ2NTZiMDg5NGZmZDI1Y2QxOTdlMjUxNzY4NWNlZWIyYjUzMTMxM2NlNjc2MjRmIiwic2hhM18zODQiOiJiYzYwMDg3NTYzYWJmY2NlYWM3ZmNjM2ExMzljYzQ5YWRkODkyYWZhMjNhZTEwZmE2MzUzZDhiYjc5YmVjNzRmOTRlN2U0NDQwMmIzM2FjMTIxY2Y4YWFiOTg1YWRlNWEiLCJzaGEzXzUxMiI6ImFmMThjODdlNzY0YWJlZWYzZWNlNDc0YzA2YjUxNzBjYTg5M2QyMTJmZGQ5ZDM0NDRmMzI5ZDBjNmIxZTEwZjk1Y2Y1NjU0YWFiM2I0OWY0ZTA0NzQwY2UyZTgyYjk0MTg4NTBjOTcxOTk5NGFhY2Q0ZmVjZGVmYmYwMDdhYTI3Iiwic2hha2VfMTI4IjoiNWM5NmFhMTViNzg3YzkwMWM0MmQ3NzAyODcwYjQzZWM3OTUxZjBjODVjZTY1YmQzYTYyZDc4YTQ0ODBiNDQzZCIsInNoYWtlXzI1NiI6ImY0MDU4MGU5ZjRkNTJiZmFjNDFjM2RmZmUxOTk4ZDU3OWYyNjlhMGVlNjgwYmYzNGI5MmE0MDYxZTEwOGNmZTM1MTAwYjE5YzE4NTY3ODJjMTlkYTYzNjNkNTQ0ZTY2M2IyNWMzMWJlYjNjNmZlOTBkYWIzZWZhZTgwNzE1ZjA3In0K', - 'eyJibGFrZTNfbXVsdGkiOiIyNzhjZjk1MzhhZTQ0ZTNkNzNiOGE0YmMxMGIxODcxOWEyYTM3ZDJmYmY1NzA0ZjY2ZWU4MTVlNWNhODkxMWU2IiwiYmxha2UzX3NpbmdsZSI6IjI3OGNmOTUzOGFlNDRlM2Q3M2I4YTRiYzEwYjE4NzE5YTJhMzdkMmZiZjU3MDRmNjZlZTgxNWU1Y2E4OTExZTYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNGQ1YTgxY2FjYjRhZDdhZWVjNGFkM2VmMDQ3OGM2OGMiLCJzaGExIjoiOWU2OWMwMGI0OTJkNGY2NDkwMzlhM2RkM2U4YTg4ZTU2YmVmOGQ1OSIsInNoYTIyNCI6IjhhOTAxYjhkMjlhZjgyZWQ0MzhmZDlkNzFjMmVjMDNmZDllYmEzZjFlZTQwNjdiZTlkODk5NGUzIiwic2hhMjU2IjoiMjM5ODFmZjRhNWNmYWJjZDZlYzRjN2ZjOTA1YWRkYTNkMTJkZjFkZWI0MDBlZDM1Y2EwZDNkZTE1OTkwOGFiOCIsInNoYTM4NCI6IjUyMDJmODQzMGYzZGY1YTM5OTQ1NTZkZGIyMDUzMmU1ZGNlMzEzNTBmMjYzZWM0OTZhNjQ3NWRkYzg5YTY4NjYwNDIzZWM4YzU1NGVmOThlY2YxOTQwNzA2NjllMDg5MyIsInNoYTUxMiI6IjNiYWU1ZGRjZjcyMjRiMjU1ZDliYTE3YjAwNDdhNjc0YjI0NzE5Zjg2N2E1ODU0OTU2MWY5NWFhMTE4NTFhMzkxNDkxNDllN2Q3MGY4ODJhMDQ1ODk0YzIyZjQ1MzQxNGNiOGIwMGZiNzVlYmQxNzY5MWRjZmNjY2E1YzQ1YjY1IiwiYmxha2UyYiI6ImZlZjBkZWNlYmU4YTNlNmNmOTNhMGZjNDljNWU4YjU2ZTAxZWY4NGU4NWQyZmIxNDMzZTkxMzBhOGY4ZmNmMGE5ZWRkZjJlN2I5YjMzYTYxYzhhYjhkODhmZGQ1NjJkOGZkZjY3Njg1YjY1YjU3ODEyMjc1YzkyNmRjOTc5MjkwIiwiYmxha2UycyI6ImIwMjRmOTAyNGM4MmQwNzU1OWYwMGUxMGE1NGVkMzRjMGIzNDEwYzc4NzMxMDI5YTUxNjY2NWZhMjFlZWE4YjMiLCJzaGEzXzIyNCI6ImFiM2UyY2U2Y2U4NWM1YTQyYzhhOWRjMTgxYjNhODJlYzFiMzU1NzgzOGVhMDRlOTYyOWQ1MDZjIiwic2hhM18yNTYiOiJlYTBiYTU4ODVkNzA3ZWIyMDk2YWYzMThmZjEzYmRmOTE5YjY5MzM5YmFjZDY3OWFhODRlMTg1MDZiYjBjYzBlIiwic2hhM18zODQiOiJkYTc2YjAzZWFlMmIxNWMzNTFhYjcxZGNiOWExZDNjYzgxMDliOTBhOWUzZTBiYjY2ZTUzZDUxYzVjNmY2ZWMwYzJmMzgyNGVkZDY3NDYwMTgwZGU2YTQxMzE5OWRkYzkiLCJzaGEzXzUxMiI6ImE5OWZkZjU5YjNlMDY2MDQ3MzQ2N2VjMGJiMWI0MDljMmM4ZTc2YjQxMDdlZmQ0ODhmZjY0YzgyMDg2YmZiZWNjNmZiOGExODJjOWJiNzcwYzU4M2U5YzBiNjE3ZThkYTRlYmJmMzQwZTI1M2JkYmQ1ZWEyZDY3ZjBmNjQ2MzVmIiwic2hha2VfMTI4IjoiZWZmY2Q4MDc2M2E0YjcyYjJmMjFlYzQ0OGVhMzA5MGQ3ZGNmMmFiODZkN2U5NTdkNjkzODliYWI2ODBlZTFkOSIsInNoYWtlXzI1NiI6IjVkNTc5YmMzYTdhMTc2MDMzYjc2NzUwMjNkZTYxMzM0OTFmNzM3YWRlM2U5Y2Q0OGY3MTEzZTE4ODg1ZWFjZjA0ODlhZTRkZTQwMGE2ZWRjYzAwNTEzODhiZWMxZmFlNzJjNzI0NWEyMDdlMTc1OGZiMTg2OTczYjQ2NmE4NTg0In0K', 'eyJibGFrZTNfbXVsdGkiOiI2Y2M0MmU4NGRiOGQyZTliYjA4YjUxNWUwYzlmYzg2NTViNDUwNGRlZDM1MzBlZjFjNTFjZWEwOWUxYThiNGYxIiwiYmxha2UzX3NpbmdsZSI6IjZjYzQyZTg0ZGI4ZDJlOWJiMDhiNTE1ZTBjOWZjODY1NWI0NTA0ZGVkMzUzMGVmMWM1MWNlYTA5ZTFhOGI0ZjEiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZDQwNjk3NTJhYjQ0NzFhZDliMDY3YmUxMmRjNTM2ZjYiLCJzaGExIjoiOGRjZmVlMjZjZjUyOTllMDBjN2QwZjJiZTc0NmVmMTlkZjliZGExNCIsInNoYTIyNCI6IjhjMzAzOTU3ZjI3NDNiMjUwNmQyYzIzY2VmNmU4MTQ5MTllZmE2MWM0MTFiMDk5ZmMzODc2MmRjIiwic2hhMjU2IjoiZDk3ZjQ2OWJjMWZkMjhjMjZkMjJhN2Y3ODczNzlhZmM4NjY3ZmZmM2FhYTQ5NTE4NmQyZTM4OTU2MTBjZDJmMyIsInNoYTM4NCI6IjY0NmY0YWM0ZDA2YWJkZmE2MDAwN2VjZWNiOWNjOTk4ZmJkOTBiYzYwMmY3NTk2M2RhZDUzMGMzNGE5ZGE1YzY4NjhlMGIwMDJkZDNlMTM4ZjhmMjA2ODcyNzFkMDVjMSIsInNoYTUxMiI6ImYzZTU4NTA0YzYyOGUwYjViNzBhOTYxYThmODA1MDA1NjQ1M2E5NDlmNTgzNDhiYTNhZTVlMjdkNDRhNGJkMjc5ZjA3MmU1OGQ5YjEyOGE1NDc1MTU2ZmM3YzcxMGJkYjI3OWQ5OGFmN2EwYTI4Y2Y1ZDY2MmQxODY4Zjg3ZjI3IiwiYmxha2UyYiI6ImFhNjgyYmJjM2U1ZGRjNDZkNWUxN2VjMzRlNmEzZGY5ZjhiNWQyNzk0YTZkNmY0M2VjODMxZjhjOTU2OGYyY2RiOGE4YjAyNTE4MDA4YmY0Y2FhYTlhY2FhYjNkNzRmZmRiNGZlNDgwOTcwODU3OGJiZjNlNzJjYTc5ZDQwYzZmIiwiYmxha2UycyI6ImQ0ZGJlZTJkMmZlNDMwOGViYTkwMTY1MDdmMzI1ZmJiODZlMWQzNDQ0MjgzNzRlMjAwNjNiNWQ1MzkzZTExNjMiLCJzaGEzXzIyNCI6ImE1ZTM5NWZlNGRlYjIyY2JhNjgwMWFiZTliZjljMjM2YmMzYjkwZDdiN2ZjMTRhZDhjZjQ0NzBlIiwic2hhM18yNTYiOiIwOWYwZGVjODk0OWEzYmQzYzU3N2RjYzUyMTMwMGRiY2UwMjVjM2VjOTJkNzQ0MDJkNTE1ZDA4NTQwODg2NGY1Iiwic2hhM18zODQiOiJmMjEyNmM5NTcxODQ3NDZmNjYyMjE4MTRkMDZkZWQ3NDBhYWU3MDA4MTc0YjI0OTEzY2YwOTQzY2IwMTA5Y2QxNWI4YmMwOGY1YjUwMWYwYzhhOTY4MzUwYzgzY2I1ZWUiLCJzaGEzXzUxMiI6ImU1ZmEwMzIwMzk2YTJjMThjN2UxZjVlZmJiODYwYTU1M2NlMTlkMDQ0MWMxNWEwZTI1M2RiNjJkM2JmNjg0ZDI1OWIxYmQ4OTJkYTcyMDVjYTYyODQ2YzU0YWI1ODYxOTBmNDUxZDlmZmNkNDA5YmU5MzlhNWM1YWIyZDdkM2ZkIiwic2hha2VfMTI4IjoiNGI2MTllM2I4N2U1YTY4OTgxMjk0YzgzMmU0NzljZGI4MWFmODdlZTE4YzM1Zjc5ZjExODY5ZWEzNWUxN2I3MiIsInNoYWtlXzI1NiI6ImYzOWVkNmMxZmQ2NzVmMDg3ODAyYTc4ZTUwYWFkN2ZiYTZiM2QxNzhlZWYzMjRkMTI3ZTZjYmEwMGRjNzkwNTkxNjQ1Y2U1Y2NmMjhjYzVkNWRkODU1OWIzMDMxYTM3ZjE5NjhmYmFhNDQzMmI2ZWU0Yzg3ZWE2YTdkMmE2NWM2In0K', 'eyJibGFrZTNfbXVsdGkiOiJhNDRiZjJkMzVkZDI3OTZlZTI1NmY0MzVkODFhNTdhOGM0MjZhMzM5ZDc3NTVkMmNiMjdmMzU4ZjM0NTM4OWM2IiwiYmxha2UzX3NpbmdsZSI6ImE0NGJmMmQzNWRkMjc5NmVlMjU2ZjQzNWQ4MWE1N2E4YzQyNmEzMzlkNzc1NWQyY2IyN2YzNThmMzQ1Mzg5YzYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiOGU5OTMzMzEyZjg4NDY4MDg0ZmRiZWNjNDYyMTMxZTgiLCJzaGExIjoiNmI0MmZjZDFmMmQyNzUwYWNkY2JkMTUzMmQ4NjQ5YTM1YWI2NDYzNCIsInNoYTIyNCI6ImQ2Y2E2OTUxNzIzZjdjZjg0NzBjZWRjMmVhNjA2ODNmMWU4NDMzM2Q2NDM2MGIzOWIyMjZlZmQzIiwic2hhMjU2IjoiMDAxNGY5Yzg0YjcwMTFhMGJkNzliNzU0NGVjNzg4NDQzNWQ4ZGY0NmRjMDBiNDk0ZmFkYzA4NWQzNDM1NjI4MyIsInNoYTM4NCI6IjMxODg2OTYxODc4NWY3MWJlM2RlZjkyZDgyNzY2NjBhZGE0MGViYTdkMDk1M2Y0YTc5ODdlMThhNzFlNjBlY2EwY2YyM2YwMjVhMmQ4ZjUyMmNkZGY3MTcxODFhMTQxNSIsInNoYTUxMiI6IjdmZGQxN2NmOWU3ZTBhZDcwMzJjMDg1MTkyYWMxZmQ0ZmFhZjZkNWNlYzAzOTE5ZDk0MmZiZTIyNWNhNmIwZTg0NmQ4ZGI0ZjllYTQ5MjJlMTdhNTg4MTY4YzExMTM1NWZiZDQ1NTlmMmU5NDcwNjAwZWE1MzBhMDdiMzY0YWQwIiwiYmxha2UyYiI6IjI0ZjExZWI5M2VlN2YxOTI5NWZiZGU5MTczMmE0NGJkZGYxOWE1ZTQ4MWNmOWFhMjQ2M2UzNDllYjg0Mzc4ZDBkODFjNzY0YWQ1NTk1YjkxZjQzYzgxODcxNTRlYWU5NTZkY2ZjZTlkMWU2MTZjNTFkZThhZDZjZTBhODcyY2Q0IiwiYmxha2UycyI6IjVkZTUwZDUwMGYwYTBmOGRlMTEwOGE2ZmFkZGM4ODNlMTA3NmQ3MThiNmQxN2E4ZDVkMjgzZDdiNGYzZDU2OGEiLCJzaGEzXzIyNCI6IjFhNTA0OGNlYWZiYjg2ZDc4ZmNiNTI0ZTViYTc4NWQ2ZmY5NzY1ZTNlMzdhZWRjZmYxZGVjNGJhIiwic2hhM18yNTYiOiI0YjA0YjE1NTRmMzRkYTlmMjBmZDczM2IzNDg4NjE0ZWNhM2IwOWU1OTJjOGJlMmM0NjA1NjYyMWU0MjJmZDllIiwic2hhM18zODQiOiI1NjMwYjM2OGQ4MGM1YmM5MTgzM2VmNWM2YWUzOTJhNDE4NTNjYmM2MWJiNTI4ZDE4YWM1OWFjZGZiZWU1YThkMWMyZDE4MTM1ZGI2ZWQ2OTJlODFkZThmYTM3MzkxN2MiLCJzaGEzXzUxMiI6IjA2ODg4MGE1MmNiNDkzODYwZDhjOTVhOTFhZGFmZTYwZGYxODc2ZDhjYjFhNmI3NTU2ZjJjM2Y1NjFmMGYwZjMyZjZhYTA1YmVmN2FhYjQ5OWEwNTM0Zjk0Njc4MDEzODlmNDc0ODFiNzcxMjdjMDFiOGFhOTY4NGJhZGUzYmY2Iiwic2hha2VfMTI4IjoiODlmYTdjNDcwNGI4NGZkMWQ1M2E0MTBlN2ZjMzU3NWRhNmUxMGU1YzkzMjM1NWYyZWEyMWM4NDVhZDBlM2UxOCIsInNoYWtlXzI1NiI6IjE4NGNlMWY2NjdmYmIyODA5NWJhZmVkZTQzNTUzZjhkYzBhNGY1MDQwYWJlMjcxMzkzMzcwNDEyZWFiZTg0ZGJhNjI0Y2ZiZWE4YzUxZDU2YzkwMTM2Mjg2ODgyZmQ0Y2E3MzA3NzZjNWUzODFlYzI5MWYxYTczOTE1MDkyMTFmIn0K', - 'eyJibGFrZTNfbXVsdGkiOiJlNjkwZmQ5MDZhYWZkNDdhMDFhODM1ZjAzODY0YWZmYzFiMzE3ZTI1MzI3ZTVjY2NhYTgwYzFlZTBlZDEzNWI1IiwiYmxha2UzX3NpbmdsZSI6ImU2OTBmZDkwNmFhZmQ0N2EwMWE4MzVmMDM4NjRhZmZjMWIzMTdlMjUzMjdlNWNjY2FhODBjMWVlMGVkMTM1YjUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiYjI0YTlkYzQ3OWJhOTRmYzUwNWNmYTJjY2U4YzgyYWIiLCJzaGExIjoiMTg5YjhhYzFmZTNjNjIzMjZiMWQxYjEwZjgwNjY3N2EyZjM5NTc1MyIsInNoYTIyNCI6IjQ2ZDlmZDFhZmFlOGRiNDc0YTAzMGQ2MDFmNjllYTZlNmJlMjZlMmZkN2VlM2EwZmQyZjEzNTlhIiwic2hhMjU2IjoiOTBmZmY2NzQ0ZWZkMWE1MDA1ZTU4MGZiYjNhYzkzMzExY2QyOWQ3ZGQxYjlhYjgyYjg5MDU5NDAzNmY0ZTM2NCIsInNoYTM4NCI6ImU2ZTlhNDc1M2MzOTJhYjU0ZGRhZDUxOWJhNDUwOTJjZmMwMWI0M2VmZjI0YTk3MTFlNjk5N2E0NmQzMWMwNDNmYjYxYmZkYzQxN2NmZWVkY2M3Njc1ODk4NWNjYWJiZCIsInNoYTUxMiI6IjdiZTNiYTQ4MmYzODdiYmI4ZTVmZTU2YTQ3YzcyOTExZTI2MTg1MDExYTk4NjFjMGU3NjM0YjVkYTMyYTA2NWUwMzgzNDY2YjI1NjZjMjk2MjI1YzJhYmVkOGJhOGY0N2YxYTI2NWY4Zjg3YTU1NjkzNWJmYmQ5N2Y5NDE1YTkwIiwiYmxha2UyYiI6ImFjODI2NTE5YjNhMTk4Y2MwZTU5MDBlMzFhNTg0NjA2ZGEyY2I3NjgwYTJkZjAxOWM2ZjhmZGRjYWI4YjIzZmFhMWFiMjQ4YWY0ZTcyZjUxYzM3YjU4MWEzMzIzNmI4MWM3MWIzYzE5OWYzYTk1MWNmZGYxMTJlMjY1NzkwN2MzIiwiYmxha2UycyI6IjhjOTNjNGM0Mzk1MGE0MDFhMDI3NWFjNzM3NGFjMjY1ZWQ2OWVjOTEyZWY5ODI2Mzk1ODI3MWQ5NDFjN2JmZTIiLCJzaGEzXzIyNCI6ImVhNzQwZDY4NDlkMGU3ZjExYjkxMWI1OGI5NjU4ZGI5NGUyZjg5MmMxNjEzZDU4ZjI1MDVlMzQ5Iiwic2hhM18yNTYiOiJjNGZkNTZiNmFlYmYzNWQwY2NhOTBhNTY1YzNmMjNhODQxYjc2NzA1OWE2ZjBkZjhlOTk5ZTc1MGM5NDc5MmJmIiwic2hhM18zODQiOiIzNDY3NWY5MDRlNmE4YjllOGJjNjUzNDc1ZWFhYjFlYTRkMmMxNzNlMDg5YzhjYjZmZmEyNmMwMDQ5YzIxNTQ5YTZmMTMxZWZmZjkyOWM0ZGMxYTNkYTY1OWEyNGFmZGYiLCJzaGEzXzUxMiI6Ijc0MjBjYmU4Y2EyOWIzNGQ4YzdjNjcyMmEwYmQxYTNhZGRlOWMyNzFmNjY4Yzc3Mzg0MTU0OGVlNWFhNWNjODNjNjBkZDNlZDQ3MzM1YWI2NzRmYTU4YjI3NDQxNTdmODI5OGU3ZjQ3Mjk1N2RkYzQ0Zjc5MWUyZjM4ZDQzYWEzIiwic2hha2VfMTI4IjoiYWM0NTdiZWQ4OWZmMzMyOGEwODI4NzE0NjFkNDQ4MGJjOTMzMGRhZGRiZGQxNDFlNGVmYWFlNjQ0MDNiZDMxZSIsInNoYWtlXzI1NiI6IjdmMmI2ZTNiNmMxMzZkNzQ5ZjcwNzE0NzQ2ZDNlOWE1YWZmMjM1ZGZlM2QxNGQxNmQ1ZjVjYWQyMjY3OTQ4YjkxOTIxNmVjZGQzODZjYzQyNDk3NmU3MDBkYTA0YzJiNjUzNjFiM2I5NDg0YWQ1MDMwMzUwMjgwNDg3NmY4Y2ZlIn0K', - 'eyJibGFrZTNfbXVsdGkiOiIwNWI1MjNlN2Y2NTJhM2YxNGQ4YmQwMGRhMGY5NDdjMzM4NzllN2VhN2Y1OGQyYTA3YWJkNzJmMWIwZGZiZjFlIiwiYmxha2UzX3NpbmdsZSI6IjA1YjUyM2U3ZjY1MmEzZjE0ZDhiZDAwZGEwZjk0N2MzMzg3OWU3ZWE3ZjU4ZDJhMDdhYmQ3MmYxYjBkZmJmMWUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzhjMDllZWFkMGVhNjcyZDJlYzUzMTM4NmJkYmZlMTkiLCJzaGExIjoiYmMyYjc1MjdhODJlMGUwYjUwYmRmYjBhNjA1YTUxZGE4ZjAzMzIwYSIsInNoYTIyNCI6IjQ1NTAzYTgwMzY1ZDdmYTJhOTM2ZWEyY2JhMWRjNTIxZGM0MTc0ZDMxY2M2NGZhOTUyMmExM2ZiIiwic2hhMjU2IjoiODEyMmQ5MzA3ZDc0NDk3MmIyOWRkMjc5Y2FjODA5MzI5ZWJlYzU5MzU4YjMzNWMwNGFjZWY4ZjJlNjZkZTIyMiIsInNoYTM4NCI6IjhlYzJhNjA0NjExYmQxYTIxYWRjYTdhMGNlZmY3YmZmMmMzNWI3NzYyMjUwMWM0ZWJmYzFmZWY1ZTcwYTRlNzcxMmVjZWFkNGM0OGJkNjM2NzMzMWJiMWNkMGM4ZTdmNiIsInNoYTUxMiI6IjQ4NDE5YTM3NjBlOTcwMjEzZjYzM2VhNGE2MzQyYmE2MzhiMzMzMGM5NmFlY2Y4YTg4MmI4YTg2ODRiYTMzMWQyNDkyN2UzOTE2MjY3YThhODY2YmJmYWRlYTQ0Mzg0Njg2NDcxYjM1NjI4M2ZlODUyYTk5MDc0OWQyYTYyZWM4IiwiYmxha2UyYiI6ImM5MTk3NTQ4NDRjOWRhYTMxYzAxMmYxMzdhMjk5M2Y1MjM3YTIyMjMzZmFjOTRkMWUwNzhmYjMxNzVhNzZmNGViNTJjNmZhYzY2MjlhYjZhNDJjMjNhZWM0Y2U2Y2YxZWQyODFlYzg0MmZlODFjMmJkZGQyOGMyY2RkNjNlN2Q2IiwiYmxha2UycyI6IjE5MDE5ODZjN2I4OTZiOGEzOWJjOWY4MWNlMThmZmJlMGZkNzIxOThkY2JiZTc4MmRmY2JlZjMyNmI1OTU3YzciLCJzaGEzXzIyNCI6ImNkNjk0ZDdjODkzN2ZjMTExYzc1MjMyNWNhOTliMGMxYjc2YjdlOWJhMWZhZjRiMzJmNDlhOWEwIiwic2hhM18yNTYiOiJkYmVmNjc4YWM2N2E0MDJkYTVhMzlhZjc3NjQ0MDI5ZmY3ZjgxNzAyNjhjMjVkOWU0ZGU0YTRkMzIyYTkwMmU0Iiwic2hhM18zODQiOiI1OGQwNzFjMGZiMDY3ZmNjMDk4NTk1ZjdlYzE2MmEwYjcwYTIyYjg4Mjk0ZjJhYzY4NDQxYjg3YTRiNGQxYTVlM2MzYWRlMGFkN2U4M2M4ZjIxZGU0YTkxMDZhMTBlZWQiLCJzaGEzXzUxMiI6ImFkYTFiZWI0MDFhNjg2MDI2MDFhYWY0OTA3NjZhZjE1MmU0NjVlOGRmMTVhN2E5MzU1NWMzODE4Y2I5ZTAyYmEyOTY0ODZhMGY2MThiZTljN2IyNjdmYjBhYjUxYjEwZDIxYjRlNzIxYmIwN2EwNzg5NzNkZThhMmM5ZjM2MDQ4Iiwic2hha2VfMTI4IjoiZWE2YzljZGMyMWUxZjVmMTIwYTJjNzI0YzVkOTJiZmUyZjUzOWFhZDVmNDJhNjQ4MWYwMzFiMWY5ZTc1NDVmZiIsInNoYWtlXzI1NiI6ImQ1ZjMzNzVmYzY2YWU5ZWIzZDVkYTg2NzhlYTQ5Y2YzZjAyNWNhMDA0MzQyOWMzNzcxZWRmZWVhMDMwMmEzNjFmMGY4Y2FjYzYwYjg5YmUwODk0MWQ3MGY2MmVkODMxZjA3YzAwMjZjNmY0NTc2YTMwMzEwZDhkZTYwM2U4MjJmIn0K', - 'eyJibGFrZTNfbXVsdGkiOiJlMTE3ODMxOWMxMjllMGI1YTBhZTY3MmVkOTYxZjRjZTAyNjRhZjM3YmE3Y2JkNjliMWU1NmI4MmQ0ZjQzYzBhIiwiYmxha2UzX3NpbmdsZSI6ImUxMTc4MzE5YzEyOWUwYjVhMGFlNjcyZWQ5NjFmNGNlMDI2NGFmMzdiYTdjYmQ2OWIxZTU2YjgyZDRmNDNjMGEiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiYTc4NDRmMDEzNGFmOWRhMWE4MTgzODRjYmEyYzRlNjUiLCJzaGExIjoiMTkyMDgyMDMwOWE5ZDRkM2RlY2M1ZGVjNDM5OWQ5YjY0MzBmOTg5YyIsInNoYTIyNCI6ImExODA2MTY5M2MzY2ViZDVkM2JjMDY4YTViNTQzYTkwMmIzNDI1OWVhOTdhNmZhMmY3NjQxM2FiIiwic2hhMjU2IjoiY2QwNzE3MjJmMmZkNjEyNzQxNGFhYTdkNGI0MGJiMGNiNTMwNWQ4YWQ1NDgwNzZiZTQxZDhmMzgwMDU1OTM5ZCIsInNoYTM4NCI6IjZkYzQ5MTk5OWJhZTcxMDg1ZWJiYjg4ZWEyNDUyYmVmNGFkMGYyMDU4OGE2ZmZiNjQyMDk3ODQxMTdhOWM3MmZhY2MyZTQ1OWI4ODkxNDRjMjJlNWY0ZDc0NzE2N2QzNiIsInNoYTUxMiI6ImNjZDMyZTEyZWU2YzRhMmFlMWJmNDRlYjY5ODhjMzA2YTRmZTMxMzk4Y2ZmZmNiODM1ZWEwNzA5YTkxZWUwMTc1NzFlNjA2YWY0ZTZjZmViMjFjMGY0Njk3ZGM3OTY1OTA1MzBhMzU2NDFjYzhkZTdjNzU3NTQ5ZDdlNzQ2ZGYxIiwiYmxha2UyYiI6ImU0ZWI3NjA0MGM5MzA5MzhlMzQ2NWU1ZGEyZTllZTQyYTk4NGY3NGM2OGE1M2Y5NGU1MGZjOGJmMjMxOTNkMGNmNWUzZjBmOTJjMzNkNTE5MDNmNGExNjhhNjE1ZGYwOWI4NjYzMTRlZDQ1YzA4NDNkNzc1ZjhlNDU0MzRjNDY5IiwiYmxha2UycyI6IjJjZGJlMGNjNTI2OWNhMzI3NmNmZjJkZjJmOTViOGYwNDI1Mjg3ZjViZWZlNDIwYWUyN2RkODRjZWJhY2QwNDkiLCJzaGEzXzIyNCI6ImE3Y2U5OTZiN2Q0ZjlmZmViYTMxM2EwMzBmMDNkNDZmOGUzZmE4OTRiZjYwZTE1ODczNDFjZWU1Iiwic2hhM18yNTYiOiI5NzNlZDk4NDYwZjk4YjM0MWY2MThiNWNkOWZlM2U3ZDdlMDE4MjkwY2VjNTBiYWVjZWQzOGY1OWEwNGY5MDdhIiwic2hhM18zODQiOiIxNzA2NTI2YjJlYzJmNTA0MWI2NTQzN2I5NTQ5ZjNhMjEwNjQ0MzExNjhjY2U4ZDc0YWI3ZTVlMmU1MGEzYmI3NDQyY2M5NzhmOGU1N2MxN2Y5NTkwYjQ4YzhhYzY4MjQiLCJzaGEzXzUxMiI6IjA4ZmZiNTJhN2ZjNjkyMzIxOWQzOGUzMmQ5NzE3NTgyNjlkYzY1NjM2MTY4ZDc0YWZjYzBmYTk3OTZiYjNmMGU1YjFiMmE0OGE3ODZiZDViNGZmNDE2ZjRmYzQ5OTkxODczNDc2ODY1OTk0ZmJmMzJkYzRkYjNjNmVhYzQxYjRiIiwic2hha2VfMTI4IjoiYjA3MzM5MjUxNDU1YzBlYjFkZmMzNWVlN2I2MTQ0NjY0MDRmYWY3OTNkNjNlMjk5ZTVhY2JkMmRkYzk3YmM1OSIsInNoYWtlXzI1NiI6IjY5MmM5ODNhNGY3MjQzZDU4Y2Q0MTc1Y2I3NzkxYWFiMTI4YzE4ZTZmMzUwZDk3NzFlMGJhZWE4MmY2M2M2Y2VjYmZmNjUwZTUxZmIzZDFjNjNkNzU4Zjc4NDcxNjhlOGZlMDMzODVlMDMwNmFlZTQxMzllNjllY2IxMzg1YTYzIn0K', - 'eyJibGFrZTNfbXVsdGkiOiIzNWM5YTgyZjE2MWVjM2I2ZmY1NDY2MWJkZmFiMTNhY2MyMzMwYzNlNmM0MzBmYjJmYWIyODAwZDM1ZDEyZmI5IiwiYmxha2UzX3NpbmdsZSI6IjM1YzlhODJmMTYxZWMzYjZmZjU0NjYxYmRmYWIxM2FjYzIzMzBjM2U2YzQzMGZiMmZhYjI4MDBkMzVkMTJmYjkiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZjIyZjhmYTlhNjQwYzc5Y2YyMTc1MjcxY2Y0ZWY0YWUiLCJzaGExIjoiNjRmNDBjOTQ1YTRmMTFkYTY5NTFiMDgyMGUwZWY1Yzg5ZmQ1OTUxMiIsInNoYTIyNCI6ImQ5MzM4Zjc4ZjFiOTA5NmEyYjUwNDRlZjc4Y2ZkZGE4YWQ2ZDE4NGIxZjU5MjgxYTFlMjQ1YmU4Iiwic2hhMjU2IjoiZjQ5YTFjNGRlMjVjNGZlNzg4MWM1NWU2YWQ2ZmQ0ZDliOGI5OGVhZjNiMjg1MTRjZTBkOGJiMWRlMTg5NTJhZCIsInNoYTM4NCI6IjhmNGM1YWRjODM4MjkzNWE2NGRhYjdlNmQyYTAwOTg0NjQxNzVmNDU0YjE3YTk1OTJiYTU2NzM1NjY0OWQ4ODI4ZTIxNjkwYmY0OTIzNGVhZGYyZDJhNzY1Yzc5N2E4OCIsInNoYTUxMiI6IjFlOTMxOTU0OWQ0ZjlkN2FmYjkwNjBlYmRjMTBlN2EyNDdiNjkyNTIwZGI1OWIxNTc4OGYxNzI5NDk0NjM0YTkxMDFjNmFkOGViNjdjMzVmNDQ0YjIzMmI0Njg0ZTM4OWVhNTlkYzBhODZlODM1NmJiN2JiNTJjNzA5Nzg4ZmMwIiwiYmxha2UyYiI6IjBlNGNmOWViM2ZkNTI4OTNiODVkZDc4N2NiOGUyZTNjZjEyYjdiYTE4MDcyZWQzOGYzM2ExYmUxMThkZjkxZTYzZjQ1NGQ5OWUyYzMxZjI5MjJiMDRmMmQyYTljYmY4NDkxNjI0ZmYzMjI5NmZiMTE5NjRmM2ExYTkzZGEzOWViIiwiYmxha2UycyI6ImQ3MjVjZWNjNTA2MmU2YTRmMTk0MDhlY2E4YjU4Yjc0MWVhNTQ1YzY3ZTUzM2M5YzAxMmYzZTBjYmNiNDhkYmEiLCJzaGEzXzIyNCI6ImVhN2I1MDI2NGE0MGZkYjFlZTZjZjhmNzg4MzlmNDVhOTNmNTFhNDFmMWJjNDI2MDU4NjM0NzhlIiwic2hhM18yNTYiOiIzN2U0Yjg2ZjQ3MDRmNmU3Y2UwNGZhYThhMThmOWE0MjQwODk5ZDUyMDNhNDc3OTA4Yzk4MGFmNmIxNWU1N2Q3Iiwic2hhM18zODQiOiI4YWVlYTRlNWUzOWNmNzYxMzk4NWI1YmUwZmYzOGViNmFjNDI1NjE1ZmM0NGZhZWY2NGQ4MGNhMjRmNGE4ZmU3NDA1ODdmMzA2NjM5NzhiNjkyMDA1N2UzMDhlN2QxMDciLCJzaGEzXzUxMiI6IjNhODExMzkyMDg0Y2Y1NTM1ODgyZDVmZDlmM2QzNjYzMDFlMzk4OGRiN2MyY2EzNmE5OTVjMmY2ZWNlMjNhMTQzOTEyOWNjMjljZWRkNDBlZjE4OWU4NWU5NDRlMTFiN2RmOWM0MDFhMzY5ODBkZDFkYTU4ZjZjNTYyNDg0YjZlIiwic2hha2VfMTI4IjoiZWRkZDFhMjIyMDY0ZTM0MDY2MGU5NWI1ZjFlY2MwM2IzZGEwMzY5MjNjNzYxMzUxYTM2NzVjNTZlNzNhOWIyNiIsInNoYWtlXzI1NiI6IjMyNzI4MDZjZTRlNjg1ZGY3NDUzZmM3MGNjNjdlYThhOTcyZmM3N2UxNTI1ZDU3MTBmNTNhOGFkZGExMDI0YTA2NjUyOGUyMDFiOWFiNGVkMWUzZTdhOTQyNmNiNWEzMzhmZTFmNTZlOTA1NjYwZThiMmNkN2QwODE5Njc0YzFiIn0K', - 'eyJibGFrZTNfbXVsdGkiOiJjYWQ4NWYxYjU1NDhlZWMwMDYxNmEwMzg1YTdlNDc3YzBjNmQ5YzYwMmQ5NzU3OWRiNmMzOTgzOTYwMDdjMTRjIiwiYmxha2UzX3NpbmdsZSI6ImNhZDg1ZjFiNTU0OGVlYzAwNjE2YTAzODVhN2U0NzdjMGM2ZDljNjAyZDk3NTc5ZGI2YzM5ODM5NjAwN2MxNGMiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZGI1NWFkNWFkM2YxZDk5NDBkZWJkNGY4ODcyMTc1ODMiLCJzaGExIjoiMDhjZmI3ODEwZDY5Y2I3MjllNDBlYjVhODQ0MGE3N2M1Zjc1MzIwYSIsInNoYTIyNCI6ImU1ZDg2NTU1OThiMGRkMzViMjg0NTc4MjAzODk1NzU3ZmE0NWM2NjI2YzNjOGY1Mzk0NTYzZDA1Iiwic2hhMjU2IjoiNGY4OGM5MDc4YmIyMjM4Y2RkMGQ4ODY0NjcxZGQzM2UzZjQyZTA5MWU0MWYwODkwM2YzYzE1ZTRhNTRhOWIzOSIsInNoYTM4NCI6IjMyNjFkNTY5Zjk4MjhlMmY0OGMyOTE4YjczYzMyMTljNmI3MmUxMDRjMWQ1ZTFhZTVlNTkwNjcxOTQwOWZmODZkYTNjN2EwZWU3MDFkZmIxZWNmZGNkZGI4ZTVjMjgzMCIsInNoYTUxMiI6ImZiNzVhM2JhNjQ4MDJkMTBkZjFiYzI5ZWJmYjVkOTVmODUxOGU0ZTc1MTFkMDRmYmM5MWJkMzIxOWJlZWNhYjZlYzFjN2Q1ODQwM2M5OTJkZDhjMGE3MTU4YmRjMmE5MzdlM2VhOTJkYzFlMWM0OWJmNWZjMWFhOWM2YmYyMDcxIiwiYmxha2UyYiI6ImQ0MjZmNTQzNGE0YTE0ZDFkNDE4NTMwY2MzNDEwYjE0ZWI1ZDJhZDNlNWEzZjM2ZDcyNDQ2MjYyY2EyMGEzODc5ZWJkNjA3ZTNmYWE1OTQ4YzY4N2YxZjBjNGE5ZTBmODRiZjA4NTZjYTFlMzhjNjYwYzEyYWNkMDJmMjFmNGZlIiwiYmxha2UycyI6IjczMzlhZjA5YjFiOTFmMTBhMmQxYWM3MzJjNDQ3MjBiOGViNmZiOWY4YzJkY2Q3MjBiMGNhZTJlMDM0NTdkOWMiLCJzaGEzXzIyNCI6IjIzM2NhMTAwMjc3NjFiOTQ0OGQxMGMyNDk1ZThhNjA1M2I4MTQ4NTljMDhiNmUxODNlYTBmZDY2Iiwic2hhM18yNTYiOiI3MDNkODczYTJjNTg4ZTI2MDRmZDA2NTlhNTVlYmYxNjAwMmMzOWExMzMwYTE4NjEyYTRhNTNhMDY2ODJiNGY4Iiwic2hhM18zODQiOiJlZjY1MjY0N2Y0ODVhMTY3MGQwYjYzOWM1YWRmNDVjNTU0ZjVjYjg2OWJkNjViNjgxMzQxN2FjMmVjN2JjMWFiNjY3OWM1NzMzNjc5NDVhMzEzMjQ3NzFiODg1N2ZkYjIiLCJzaGEzXzUxMiI6IjYyNzU4M2MyYWJhMTU5OTljMGIwNmJlZmI4MWVlMTM1NTg0NmE4OGFjZGJhM2M0ZTkzOWQ1ZWYzYmFjN2IxNDI5ZWU0MzUwNjkwOThmM2Q2NjYyZWM2ZWU3ZmU4ZjZjZmZiMWEzOWVjMTdhZWFjYjI0MzUwZTI2ZTljNzBkMTZiIiwic2hha2VfMTI4IjoiZTUxNWY4Y2ViOGVmZTA4MjJmNjE0ZGYzMTFiNzEwZGNmZTk0MGM1NDhlOWI3NWJlNWQ1ZDNjMGFkMTgwMjYxZSIsInNoYWtlXzI1NiI6IjgyOWZkYjdhYmQ0YTRhYmMyNzFhMzkyYWM1ZmY1ODVhNGNkZjFiMjYxNzhjMTI0ODI1NDJhODkzNmVmNTMxY2QzZjc4YmQwMTBkZjA5MmNlNzRmZmVhZTJlNTFkNmIzZDNkNmY5NzJmZTJmZTQxNmExMTYzZmVjMzg1MWIwYmVjIn0K', - 'eyJibGFrZTNfbXVsdGkiOiJmZDVkMjdjYjJlMjczMzg5ZWRiOTc2MjAxOTE3NjIyNDdlOTE2MDdmZWRkNjYzYzBiNmE1ZmE1ZjgzYWE2ZDk3IiwiYmxha2UzX3NpbmdsZSI6ImZkNWQyN2NiMmUyNzMzODllZGI5NzYyMDE5MTc2MjI0N2U5MTYwN2ZlZGQ2NjNjMGI2YTVmYTVmODNhYTZkOTciLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiMzk1YmJjYmJhZDdkOGI0NTk0OWU0Zjg5NTE3ZGYwMjMiLCJzaGExIjoiMzExNjc3ZGJlODkxNGM2NmJiZjZjZTVhNDczMWY0OWE1NjgwNDgxZSIsInNoYTIyNCI6IjAwZGIzYWMwZTE2ZDU4Nzg1ODI4ZjFiZjk1MmExNWFlOWVlYmEzNWFlNTEzOGFlZGM4OTlkM2NjIiwic2hhMjU2IjoiYjg0NjIxOGE5ZmNkMzAzZTdhYjQ1NzY5NDM1MWU5MzUyOTAzYzJmOWFiNDliYzRlNzljZjkzZDljZDQ0ZTg0NCIsInNoYTM4NCI6Ijk0MjUyN2M3MzliMjQ4NjMyOTdjMTA4ZmU0YTE3YTdlNTliNThiYzM5ZWU1YTE2MDYwYjBhZGEzMDkxYmFhOGJjZTI0ZmQ2YjliMDAzYjlkNzg5NWUyNjAyNzg1OWFkMiIsInNoYTUxMiI6ImMwYWE3YmM4NDRhMjc4OGM0NGI1ZmNkNGMzZWJmZTNmNDM2YmRjZmVmNGM5ZDA4ZTBkOTJkYjc4ODg4M2EzNjBkYmVhNTNjY2ViMGI1ODE5YTA0MGIxYTZiMjIwY2VmYWYzNGIxMTNmOTM0NDBkZDA3MGE1NDg5M2Q2NTg3YThkIiwiYmxha2UyYiI6IjBiMWJiMmE5NDZiNmZhZDIxM2VkYjU0ZmE5NDJlYzkyNjA3MTRmZTc0ZGEzZjIzOTc4MzA5MGYzNjY2NDUyMTJjYzliNzY5MzliMjVhOWU2OWY3NmIwYjY3ZGM3YmI3ZTNkMDU1OTk1NDliOTRkY2M1ZTk5MDJiNzQzMjkyMDNmIiwiYmxha2UycyI6IjEzMDg4MDc3ZDc0NzU5YmYwOWNjMjkwNjY2ODRmYmYzNzAyZmJmNzAwMTk3OGQ2MzUwYTI4YTVmM2RiZjc0ZmUiLCJzaGEzXzIyNCI6ImQxYWU2MGZhOTY4MTlkODkzNTk1MmU5ODQ0YjdhMTVhMmU3Y2ZkZDY1MGYwYjFmMjlhYzAxMjI3Iiwic2hhM18yNTYiOiJmYzQ1N2U2NTY1NDc4Yjc2YzhmNGMyMDM1ZTk0M2FkZmMyZjg3NTUzYmNhZmIwNzRkM2UwNmMxNjIyYjNmMTg2Iiwic2hhM18zODQiOiI5ZDg4MjIzNjdkMTViZTRlZTYzODVjMjc1YWEyZDFjMDM3ZTcyYTc0OTBmZWIwMGMzNWViY2RkMDZmNDI0ZDY1NjdjZWUwNDQxMzJhNDdlMWYxNGFmY2U0MGY4MzA5YWMiLCJzaGEzXzUxMiI6Ijc4NTMxZmU1ZjljNDIwZDdmODk1NTNjOGI0YzdmY2Q4MTVmNWMxNzdjZDcxOGVjZjg2MDQxN2FjYWRkZTJiNjFlOTZkZjg2YzYzZTEyYzcyZWFkMzFlMGI5OGVlYzQ3NTgwNjA3ODFkZTFkOWE5N2RmMGFiNjY3NmExNTA2YjBkIiwic2hha2VfMTI4IjoiMmU1ZTY5ZGE3ZDMyNDA5OTU3OTFlMmI3MDc4YjA0YzcyNzBkMmEwMDk4MjNkYzY0OTdkMDg3NzE3OGFjMThmZCIsInNoYWtlXzI1NiI6ImUwZDUyZWU3ZjFmYTg1MmI0MjVjMzk2YTljZTUxODkwYThjOGUxOGE0ZGZkNzU0NGQ1Mzc2ZjdhZTg3ZjViOWRkYTU4ODRiMWNmMWJjZWJjODRjMmFjZDE2ODcxMDUyNDAyNDIwOTAzMjVlYzg1MTM5YWVhNmJiNzQxODIzNGZmIn0K', - 'eyJibGFrZTNfbXVsdGkiOiJmMTUxOTEwODEzYjcyOGZhNjMyMzhjOWYzYTYyZGViOTA4MTU2YWEyYTcyNjUwYjk3OWY1MjU2ZWUwODliNzNmIiwiYmxha2UzX3NpbmdsZSI6ImYxNTE5MTA4MTNiNzI4ZmE2MzIzOGM5ZjNhNjJkZWI5MDgxNTZhYTJhNzI2NTBiOTc5ZjUyNTZlZTA4OWI3M2YiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNDIwNzkxMTdhOWE4YzMzM2U4NzY1NmZhZDE1ODQ2OGYiLCJzaGExIjoiZTk5ZWJlNjExNGY4NmM5MjMwN2M0ZWY1ZTYzMTU3ODI0MjhmZmJiOSIsInNoYTIyNCI6ImIxMzI0NDY5NmM3ZGNmYjFkNjFjNTdiZjA3NjVkYzBkM2YxMGE3ZTMwNjNkMTk3NTc1MmQ5MTdmIiwic2hhMjU2IjoiODgzZjU0MGJiNzc2MTQxZmEyMTU5ZDA1YjgxOTg3NThjMzA2YmYyNTk0Mjg5MTJkOTMyYjg0YmUwNjYwOGVmYSIsInNoYTM4NCI6ImRlNjhmNjBmMTUwNjljZGFkNzg2OTE4NmU4Y2IzMGFjMmExNjkxMzk3Y2MzNmI0ODMyNGNkNjY4M2QyY2Y4M2FiNjZlZGQxMDA3ZmM2NDk3YjkzY2ZmNDdiMWZjMGNlZiIsInNoYTUxMiI6IjRmODA0OWZjNWNlNmVhZTExNWViNmQxOTI3ODQ4MjcyNWFjMWJlOWFiYzNhYTBiYzc2N2JlNDg3NzZiODU0MTdlMTQxOTQxOTYyYWRkY2JlMzkzZDI4NzkxZTQ2NTU4MmVkZjIzOTgwYzEyOWIyYjkyYTllZmQzNTc0YjNjY2IzIiwiYmxha2UyYiI6IjI2ZGNlNjFlMDA0Y2Y2MTQzZDFlZDYwMjI0ODNhNTNkODMxZjFlNjFlZGEwNGMzNjk5N2M1MzI2Y2E2ZGY4ODlhYzVmYzM2YTYzMWViYWQ2NzVmMTBkMmYyZGRkZDcxOGFlZDQ1OTc4ODlhMDNlODQ0MGU3ZmMxODliZTRkZWZkIiwiYmxha2UycyI6IjE5MTE4MjFmZjQxOTQ3ZGU4M2UxN2Q4MzliMzI3NmUwNjg5Y2U3Y2Y1NGIwNzAwNzQwYWNhOGJkYzQ4NjdlNmUiLCJzaGEzXzIyNCI6Ijg1ZTVhNDg0MmY0M2FkMjg1MjY2NTMyNzQ2NWEwNjNhMGU5NDAwNWJlOTQ3MTdhMzY5NzY2ODk4Iiwic2hhM18yNTYiOiJlMjk5NzQ0NWZmNjg2ZTRlODdiYWVmYTcwOTEzNDQ0MGNkYjlhNjAzYTcxNGQwNzEzNjYzNDkxYTllZmRmZDFlIiwic2hhM18zODQiOiIyNzY0MjJiZmVhYWM4ZjM4NDBjMWUwNGY3ODQ2NTkwOWM1ZDhkYjRlYTU3ZWU1OTdjYTJmMWFlMDhhNzhkOGI0NWI3MTJiZmY3MTUwODAxM2NmMTY4MGRlNzdhNGM4OTUiLCJzaGEzXzUxMiI6IjYyZWQxMGFjMWQ1YmJjMDIzNWRjNjRhNGI3NjI0OWEzNzNkOTVhYTM1YTZjMzI1ZDZiNzVkM2EwM2Q3MzNkMjYyYmJhZDI3Zjg0NjcxYWFjYTgyYmQ0YjlhNWQwMGU4M2M5YzlmYzA3ZGNmMzA4YTg4ZTUyNTU3ZDI3NzFhYWZjIiwic2hha2VfMTI4IjoiNDQ5MmIwOWY3OTQ0NGEyOGQyYTdkZmRiZTc1YTc2MTMwODVjYTJhZGEwN2UwOTZiNjUwMjIwMzg1MzBlZDI1MSIsInNoYWtlXzI1NiI6IjFlMTI3MTE3ZDk3YTIwY2E5Y2QzMzU3YzNjMmQxOTFiOWEzMWRiNzNlZjM2ZjA4MmFjZGI2ZThiOWU1NDZiNGMzZWI3Mjg2OThjY2QxMmM4YjY2M2YxMDMzZGJhYzMxZjI0OThlZGUyM2JlZjY4ZTlmMzJjNmUzZDNhNzE1ZjkwIn0K', - 'eyJibGFrZTNfbXVsdGkiOiJhYjA2YjNmMDliNTExOTAzMTMzMzY5NDE2MTc4ZDk2ZjlkYTc3ZGEwOTgyNDJmN2VlMTVjNTNhNTRkMDZhNWVmIiwiYmxha2UzX3NpbmdsZSI6ImFiMDZiM2YwOWI1MTE5MDMxMzMzNjk0MTYxNzhkOTZmOWRhNzdkYTA5ODI0MmY3ZWUxNWM1M2E1NGQwNmE1ZWYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZWY0MjcxYjU3NTQwMjU4NGQ2OTI5ZWJkMGI3Nzk5NzYiLCJzaGExIjoiMzgzNzliYWQzZjZiZjc4MmM4OTgzOGY3YWVkMzRkNDNkMzNlYWM2MSIsInNoYTIyNCI6ImQ5ZDNiMjJkYmZlY2M1NTdlODAzNjg5M2M3ZWE0N2I0NTQzYzM2NzZhMDk4NzMxMzRhNjQ0OWEwIiwic2hhMjU2IjoiMjYxZGI3NmJlMGYxMzdlZWJkYmI5OGRlYWM0ZjcyMDdiOGUxMjdiY2MyZmMwODI5OGVjZDczYjQ3MjYxNjQ1NiIsInNoYTM4NCI6IjMzMjkwYWQxYjlhMmRkYmU0ODY3MWZiMTIxNDdiZWJhNjI4MjA1MDcwY2VkNjNiZTFmNGU5YWRhMjgwYWU2ZjZjNDkzYTY2MDllMGQ2YTIzMWU2ODU5ZmIyNGZhM2FjMCIsInNoYTUxMiI6IjAzMDZhMWI1NmNiYTdjNjJiNTNmNTk4MTAwMTQ3MDQ5ODBhNGRmZTdjZjQ5NTU4ZmMyMmQxZDczZDc5NzJmZTllODk2ZWRjMmEyYTQxYWVjNjRjZjkwZGUwYjI1NGM0MDBlZTU1YzcwZjk3OGVlMzk5NmM2YzhkNTBjYTI4YTdiIiwiYmxha2UyYiI6IjY1MDZhMDg1YWQ5MGZkZjk2NGJmMGE5NTFkZmVkMTllZTc0NGVjY2EyODQzZjQzYTI5NmFjZDM0M2RiODhhMDNlNTlkNmFmMGM1YWJkNTEzMzc4MTQ5Yjg3OTExMTVmODRmMDIyZWM1M2JmNGFjNDZhZDczNWIwMmJlYTM0MDk5IiwiYmxha2UycyI6IjdlZDQ3ZWQxOTg3MTk0YWFmNGIwMjQ3MWFkNTMyMmY3NTE3ZjI0OTcwMDc2Y2NmNDkzMWI0MzYxMDU1NzBlNDAiLCJzaGEzXzIyNCI6Ijk2MGM4MDExOTlhMGUzYWExNjdiNmU2MWVkMzE2ZDUzMDM2Yjk4M2UyOThkNWI5MjZmMDc3NDlhIiwic2hhM18yNTYiOiIzYzdmYWE1ZDE3Zjk2MGYxOTI2ZjNlNGIyZjc1ZjdiOWIyZDQ4NGFhNmEwM2ViOWNlMTI4NmM2OTE2YWEyM2RlIiwic2hhM18zODQiOiI5Y2Y0NDA1NWFjYzFlYjZmMDY1YjRjODcxYTYzNTM1MGE1ZjY0ODQwM2YwYTU0MWEzYzZhNjI3N2ViZjZmYTNjYmM1YmJiNjQwMDE4OGFlMWIxMTI2OGZmMDJiMzYzZDUiLCJzaGEzXzUxMiI6ImEyZDk3ZDRlYjYxM2UwZDViYTc2OTk2MzE2MzcxOGEwNDIxZDkxNTNiNjllYjM5MDRmZjI4ODRhZDdjNGJiYmIwNGY2Nzc1OTA1YmQxNGI2NTJmZTQ1Njg0YmI5MTQ3ZjBkYWViZjAxZjIzY2MzZDhkMjIzMTE0MGUzNjI4NTE5Iiwic2hha2VfMTI4IjoiNjkwMWMwYjg1MTg5ZTkyNTJiODI3MTc5NjE2MjRlMTM0MDQ1ZjlkMmI5MzM0MzVkM2Y0OThiZWIyN2Q3N2JiNSIsInNoYWtlXzI1NiI6ImIwMjA4ZTFkNDVjZWI0ODdiZDUwNzk3MWJiNWI3MjdjN2UyYmE3ZDliNWM2ZTEyYWE5YTNhOTY5YzcyNDRjODIwZDcyNDY1ODhlZWU3Yjk4ZWM1NzhjZWIxNjc3OTkxODljMWRkMmZkMmZmYWM4MWExZDAzZDFiNjMxOGRkMjBiIn0K', ] From f14f377ede5da9a22ba9e440469799ff6ce9783c Mon Sep 17 00:00:00 2001 From: Brandon Rising Date: Fri, 14 Jun 2024 13:13:01 -0400 Subject: [PATCH 16/24] Update validator list --- invokeai/backend/model_hash/hash_validator.py | 1 + 1 file changed, 1 insertion(+) diff --git a/invokeai/backend/model_hash/hash_validator.py b/invokeai/backend/model_hash/hash_validator.py index 73b5feb654..b0d54ef7c6 100644 --- a/invokeai/backend/model_hash/hash_validator.py +++ b/invokeai/backend/model_hash/hash_validator.py @@ -16,4 +16,5 @@ hashes: list[str]=[ 'eyJibGFrZTNfbXVsdGkiOiI4ODlmYzIwMDA4NWY1NWY4YTA4MjhiODg3MDM0OTRhMGFmNWZkZGI5N2E2YmYwMDRjM2VkYTdiYzBkNDU0MjQzIiwiYmxha2UzX3NpbmdsZSI6Ijg4OWZjMjAwMDg1ZjU1ZjhhMDgyOGI4ODcwMzQ5NGEwYWY1ZmRkYjk3YTZiZjAwNGMzZWRhN2JjMGQ0NTQyNDMiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNTIzNTRhMzkzYTVmOGNjNmMyMzQ0OThiYjcxMDljYzEiLCJzaGExIjoiMTJmYmRhOGE3ZGUwOGMwNDc2NTA5OWY2NGNmMGIzYjcxMjc1MGM1NyIsInNoYTIyNCI6IjEyZWU3N2U0Y2NhODViMDk4YjdjNWJlMWFjNGMwNzljNGM3MmJmODA2YjdlZjU1NGI0NzgxZDkxIiwic2hhMjU2IjoiMjU1NTMwZDAyYTY4MjY4OWE5ZTZjMjRhOWZhMDM2OGNhODMxZTI1OTAyYjM2NzQyNzkwZTk3NzU1ZjEzMmNmNSIsInNoYTM4NCI6IjhkMGEyMTRlNDk0NGE2NGY3ZmZjNTg3MGY0ZWUyZTA0OGIzYjRjMmQ0MGRmMWFmYTVlOGE1ZWNkN2IwOTY3M2ZjNWI5YzM5Yzg4Yjc2YmIwY2I4ZjQ1ZjAxY2MwNjZkNCIsInNoYTUxMiI6Ijg3NTM3OWNiYzdlOGYyNzU4YjVjMDY5ZTU2ZWRjODY1ODE4MGFkNDEzNGMwMzY1NzM4ZjM1YjQwYzI2M2JkMTMwMzcwZTE0MzZkNDNmOGFhMTgyMTg5MzgzMTg1ODNhOWJhYTUyYTBjMTk1Mjg5OTQzYzZiYTY2NTg1Yjg5M2ZiIiwiYmxha2UyYiI6IjBhY2MwNWEwOGE5YjhhODNmZTVjYTk4ZmExMTg3NTYwNjk0MjY0YWUxNTI4NDliYzFkNzQzNTYzMzMyMTlhYTg3N2ZiNjc4MmRjZDZiOGIyYjM1MTkyNDQzNDE2ODJiMTQ3YmY2YTY3MDU2ZWIwOTQ4MzE1M2E4Y2ZiNTNmMTI0IiwiYmxha2UycyI6ImY5ZTRhZGRlNGEzZDRhOTZhOWUyNjVjMGVmMjdmZDNiNjA0NzI1NDllMTEyMWQzOGQwMTkxNTY5ZDY5YzdhYzAiLCJzaGEzXzIyNCI6ImM0NjQ3MGRjMjkyNGI0YjZkMTA2NDY5MDRiNWM2OGVjNTU2YmQ4MTA5NmVkMTA4YjZiMzQyZmU1Iiwic2hhM18yNTYiOiIwMDBlMThiZTI1MzYxYTk0NGExZTIwNjQ5ZmY0ZGM2OGRiZTk0OGNkNTYwY2I5MTFhODU1OTE3ODdkNWQ5YWYwIiwic2hhM18zODQiOiIzNDljZmVhMGUxZGE0NWZlMmYzNjJhMWFjZjI1ZTczOWNiNGQ0NDdiM2NiODUzZDVkYWNjMzU5ZmRhMWE1M2FhYWU5OTM2ZmFhZWM1NmFhZDkwMThhYjgxMTI4ZjI3N2YiLCJzaGEzXzUxMiI6ImMxNDgwNGY1YTNjNWE4ZGEyMTAyODk1YTFjZGU4MmIwNGYwZmY4OTczMTc0MmY2NDQyY2NmNzQ1OTQzYWQ5NGViOWZmMTNhZDg3YjRmODkxN2M5NmY5ZjMwZjkwYTFhYTI4OTI3OTkwMjg0ZDJhMzcyMjA0NjE4MTNiNDI0MzEyIiwic2hha2VfMTI4IjoiN2IxY2RkMWUyMzUzMzk0OTg5M2UyMmZkMTAwZmU0YjJhMTU1MDJmMTNjMTI0YzhiZDgxY2QwZDdlOWEzMGNmOCIsInNoYWtlXzI1NiI6ImI0NjMzZThhMjNkZDM0ODk0ZTIyNzc0ODYyNTE1MzVjYWFlNjkyMTdmOTQ0NTc3MzE1NTljODBjNWQ3M2ZkOTMxZTFjMDJlZDI0Yjc3MzE3OTJjMjVlNTZhYjg3NjI4YmJiMDgxNTU0MjU2MWY5ZGI2NWE0NDk4NDFmNGQzYTU4In0K', 'eyJibGFrZTNfbXVsdGkiOiI2Y2M0MmU4NGRiOGQyZTliYjA4YjUxNWUwYzlmYzg2NTViNDUwNGRlZDM1MzBlZjFjNTFjZWEwOWUxYThiNGYxIiwiYmxha2UzX3NpbmdsZSI6IjZjYzQyZTg0ZGI4ZDJlOWJiMDhiNTE1ZTBjOWZjODY1NWI0NTA0ZGVkMzUzMGVmMWM1MWNlYTA5ZTFhOGI0ZjEiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZDQwNjk3NTJhYjQ0NzFhZDliMDY3YmUxMmRjNTM2ZjYiLCJzaGExIjoiOGRjZmVlMjZjZjUyOTllMDBjN2QwZjJiZTc0NmVmMTlkZjliZGExNCIsInNoYTIyNCI6IjhjMzAzOTU3ZjI3NDNiMjUwNmQyYzIzY2VmNmU4MTQ5MTllZmE2MWM0MTFiMDk5ZmMzODc2MmRjIiwic2hhMjU2IjoiZDk3ZjQ2OWJjMWZkMjhjMjZkMjJhN2Y3ODczNzlhZmM4NjY3ZmZmM2FhYTQ5NTE4NmQyZTM4OTU2MTBjZDJmMyIsInNoYTM4NCI6IjY0NmY0YWM0ZDA2YWJkZmE2MDAwN2VjZWNiOWNjOTk4ZmJkOTBiYzYwMmY3NTk2M2RhZDUzMGMzNGE5ZGE1YzY4NjhlMGIwMDJkZDNlMTM4ZjhmMjA2ODcyNzFkMDVjMSIsInNoYTUxMiI6ImYzZTU4NTA0YzYyOGUwYjViNzBhOTYxYThmODA1MDA1NjQ1M2E5NDlmNTgzNDhiYTNhZTVlMjdkNDRhNGJkMjc5ZjA3MmU1OGQ5YjEyOGE1NDc1MTU2ZmM3YzcxMGJkYjI3OWQ5OGFmN2EwYTI4Y2Y1ZDY2MmQxODY4Zjg3ZjI3IiwiYmxha2UyYiI6ImFhNjgyYmJjM2U1ZGRjNDZkNWUxN2VjMzRlNmEzZGY5ZjhiNWQyNzk0YTZkNmY0M2VjODMxZjhjOTU2OGYyY2RiOGE4YjAyNTE4MDA4YmY0Y2FhYTlhY2FhYjNkNzRmZmRiNGZlNDgwOTcwODU3OGJiZjNlNzJjYTc5ZDQwYzZmIiwiYmxha2UycyI6ImQ0ZGJlZTJkMmZlNDMwOGViYTkwMTY1MDdmMzI1ZmJiODZlMWQzNDQ0MjgzNzRlMjAwNjNiNWQ1MzkzZTExNjMiLCJzaGEzXzIyNCI6ImE1ZTM5NWZlNGRlYjIyY2JhNjgwMWFiZTliZjljMjM2YmMzYjkwZDdiN2ZjMTRhZDhjZjQ0NzBlIiwic2hhM18yNTYiOiIwOWYwZGVjODk0OWEzYmQzYzU3N2RjYzUyMTMwMGRiY2UwMjVjM2VjOTJkNzQ0MDJkNTE1ZDA4NTQwODg2NGY1Iiwic2hhM18zODQiOiJmMjEyNmM5NTcxODQ3NDZmNjYyMjE4MTRkMDZkZWQ3NDBhYWU3MDA4MTc0YjI0OTEzY2YwOTQzY2IwMTA5Y2QxNWI4YmMwOGY1YjUwMWYwYzhhOTY4MzUwYzgzY2I1ZWUiLCJzaGEzXzUxMiI6ImU1ZmEwMzIwMzk2YTJjMThjN2UxZjVlZmJiODYwYTU1M2NlMTlkMDQ0MWMxNWEwZTI1M2RiNjJkM2JmNjg0ZDI1OWIxYmQ4OTJkYTcyMDVjYTYyODQ2YzU0YWI1ODYxOTBmNDUxZDlmZmNkNDA5YmU5MzlhNWM1YWIyZDdkM2ZkIiwic2hha2VfMTI4IjoiNGI2MTllM2I4N2U1YTY4OTgxMjk0YzgzMmU0NzljZGI4MWFmODdlZTE4YzM1Zjc5ZjExODY5ZWEzNWUxN2I3MiIsInNoYWtlXzI1NiI6ImYzOWVkNmMxZmQ2NzVmMDg3ODAyYTc4ZTUwYWFkN2ZiYTZiM2QxNzhlZWYzMjRkMTI3ZTZjYmEwMGRjNzkwNTkxNjQ1Y2U1Y2NmMjhjYzVkNWRkODU1OWIzMDMxYTM3ZjE5NjhmYmFhNDQzMmI2ZWU0Yzg3ZWE2YTdkMmE2NWM2In0K', 'eyJibGFrZTNfbXVsdGkiOiJhNDRiZjJkMzVkZDI3OTZlZTI1NmY0MzVkODFhNTdhOGM0MjZhMzM5ZDc3NTVkMmNiMjdmMzU4ZjM0NTM4OWM2IiwiYmxha2UzX3NpbmdsZSI6ImE0NGJmMmQzNWRkMjc5NmVlMjU2ZjQzNWQ4MWE1N2E4YzQyNmEzMzlkNzc1NWQyY2IyN2YzNThmMzQ1Mzg5YzYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiOGU5OTMzMzEyZjg4NDY4MDg0ZmRiZWNjNDYyMTMxZTgiLCJzaGExIjoiNmI0MmZjZDFmMmQyNzUwYWNkY2JkMTUzMmQ4NjQ5YTM1YWI2NDYzNCIsInNoYTIyNCI6ImQ2Y2E2OTUxNzIzZjdjZjg0NzBjZWRjMmVhNjA2ODNmMWU4NDMzM2Q2NDM2MGIzOWIyMjZlZmQzIiwic2hhMjU2IjoiMDAxNGY5Yzg0YjcwMTFhMGJkNzliNzU0NGVjNzg4NDQzNWQ4ZGY0NmRjMDBiNDk0ZmFkYzA4NWQzNDM1NjI4MyIsInNoYTM4NCI6IjMxODg2OTYxODc4NWY3MWJlM2RlZjkyZDgyNzY2NjBhZGE0MGViYTdkMDk1M2Y0YTc5ODdlMThhNzFlNjBlY2EwY2YyM2YwMjVhMmQ4ZjUyMmNkZGY3MTcxODFhMTQxNSIsInNoYTUxMiI6IjdmZGQxN2NmOWU3ZTBhZDcwMzJjMDg1MTkyYWMxZmQ0ZmFhZjZkNWNlYzAzOTE5ZDk0MmZiZTIyNWNhNmIwZTg0NmQ4ZGI0ZjllYTQ5MjJlMTdhNTg4MTY4YzExMTM1NWZiZDQ1NTlmMmU5NDcwNjAwZWE1MzBhMDdiMzY0YWQwIiwiYmxha2UyYiI6IjI0ZjExZWI5M2VlN2YxOTI5NWZiZGU5MTczMmE0NGJkZGYxOWE1ZTQ4MWNmOWFhMjQ2M2UzNDllYjg0Mzc4ZDBkODFjNzY0YWQ1NTk1YjkxZjQzYzgxODcxNTRlYWU5NTZkY2ZjZTlkMWU2MTZjNTFkZThhZDZjZTBhODcyY2Q0IiwiYmxha2UycyI6IjVkZTUwZDUwMGYwYTBmOGRlMTEwOGE2ZmFkZGM4ODNlMTA3NmQ3MThiNmQxN2E4ZDVkMjgzZDdiNGYzZDU2OGEiLCJzaGEzXzIyNCI6IjFhNTA0OGNlYWZiYjg2ZDc4ZmNiNTI0ZTViYTc4NWQ2ZmY5NzY1ZTNlMzdhZWRjZmYxZGVjNGJhIiwic2hhM18yNTYiOiI0YjA0YjE1NTRmMzRkYTlmMjBmZDczM2IzNDg4NjE0ZWNhM2IwOWU1OTJjOGJlMmM0NjA1NjYyMWU0MjJmZDllIiwic2hhM18zODQiOiI1NjMwYjM2OGQ4MGM1YmM5MTgzM2VmNWM2YWUzOTJhNDE4NTNjYmM2MWJiNTI4ZDE4YWM1OWFjZGZiZWU1YThkMWMyZDE4MTM1ZGI2ZWQ2OTJlODFkZThmYTM3MzkxN2MiLCJzaGEzXzUxMiI6IjA2ODg4MGE1MmNiNDkzODYwZDhjOTVhOTFhZGFmZTYwZGYxODc2ZDhjYjFhNmI3NTU2ZjJjM2Y1NjFmMGYwZjMyZjZhYTA1YmVmN2FhYjQ5OWEwNTM0Zjk0Njc4MDEzODlmNDc0ODFiNzcxMjdjMDFiOGFhOTY4NGJhZGUzYmY2Iiwic2hha2VfMTI4IjoiODlmYTdjNDcwNGI4NGZkMWQ1M2E0MTBlN2ZjMzU3NWRhNmUxMGU1YzkzMjM1NWYyZWEyMWM4NDVhZDBlM2UxOCIsInNoYWtlXzI1NiI6IjE4NGNlMWY2NjdmYmIyODA5NWJhZmVkZTQzNTUzZjhkYzBhNGY1MDQwYWJlMjcxMzkzMzcwNDEyZWFiZTg0ZGJhNjI0Y2ZiZWE4YzUxZDU2YzkwMTM2Mjg2ODgyZmQ0Y2E3MzA3NzZjNWUzODFlYzI5MWYxYTczOTE1MDkyMTFmIn0K', + 'eyJibGFrZTNfbXVsdGkiOiJhYjA2YjNmMDliNTExOTAzMTMzMzY5NDE2MTc4ZDk2ZjlkYTc3ZGEwOTgyNDJmN2VlMTVjNTNhNTRkMDZhNWVmIiwiYmxha2UzX3NpbmdsZSI6ImFiMDZiM2YwOWI1MTE5MDMxMzMzNjk0MTYxNzhkOTZmOWRhNzdkYTA5ODI0MmY3ZWUxNWM1M2E1NGQwNmE1ZWYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZWY0MjcxYjU3NTQwMjU4NGQ2OTI5ZWJkMGI3Nzk5NzYiLCJzaGExIjoiMzgzNzliYWQzZjZiZjc4MmM4OTgzOGY3YWVkMzRkNDNkMzNlYWM2MSIsInNoYTIyNCI6ImQ5ZDNiMjJkYmZlY2M1NTdlODAzNjg5M2M3ZWE0N2I0NTQzYzM2NzZhMDk4NzMxMzRhNjQ0OWEwIiwic2hhMjU2IjoiMjYxZGI3NmJlMGYxMzdlZWJkYmI5OGRlYWM0ZjcyMDdiOGUxMjdiY2MyZmMwODI5OGVjZDczYjQ3MjYxNjQ1NiIsInNoYTM4NCI6IjMzMjkwYWQxYjlhMmRkYmU0ODY3MWZiMTIxNDdiZWJhNjI4MjA1MDcwY2VkNjNiZTFmNGU5YWRhMjgwYWU2ZjZjNDkzYTY2MDllMGQ2YTIzMWU2ODU5ZmIyNGZhM2FjMCIsInNoYTUxMiI6IjAzMDZhMWI1NmNiYTdjNjJiNTNmNTk4MTAwMTQ3MDQ5ODBhNGRmZTdjZjQ5NTU4ZmMyMmQxZDczZDc5NzJmZTllODk2ZWRjMmEyYTQxYWVjNjRjZjkwZGUwYjI1NGM0MDBlZTU1YzcwZjk3OGVlMzk5NmM2YzhkNTBjYTI4YTdiIiwiYmxha2UyYiI6IjY1MDZhMDg1YWQ5MGZkZjk2NGJmMGE5NTFkZmVkMTllZTc0NGVjY2EyODQzZjQzYTI5NmFjZDM0M2RiODhhMDNlNTlkNmFmMGM1YWJkNTEzMzc4MTQ5Yjg3OTExMTVmODRmMDIyZWM1M2JmNGFjNDZhZDczNWIwMmJlYTM0MDk5IiwiYmxha2UycyI6IjdlZDQ3ZWQxOTg3MTk0YWFmNGIwMjQ3MWFkNTMyMmY3NTE3ZjI0OTcwMDc2Y2NmNDkzMWI0MzYxMDU1NzBlNDAiLCJzaGEzXzIyNCI6Ijk2MGM4MDExOTlhMGUzYWExNjdiNmU2MWVkMzE2ZDUzMDM2Yjk4M2UyOThkNWI5MjZmMDc3NDlhIiwic2hhM18yNTYiOiIzYzdmYWE1ZDE3Zjk2MGYxOTI2ZjNlNGIyZjc1ZjdiOWIyZDQ4NGFhNmEwM2ViOWNlMTI4NmM2OTE2YWEyM2RlIiwic2hhM18zODQiOiI5Y2Y0NDA1NWFjYzFlYjZmMDY1YjRjODcxYTYzNTM1MGE1ZjY0ODQwM2YwYTU0MWEzYzZhNjI3N2ViZjZmYTNjYmM1YmJiNjQwMDE4OGFlMWIxMTI2OGZmMDJiMzYzZDUiLCJzaGEzXzUxMiI6ImEyZDk3ZDRlYjYxM2UwZDViYTc2OTk2MzE2MzcxOGEwNDIxZDkxNTNiNjllYjM5MDRmZjI4ODRhZDdjNGJiYmIwNGY2Nzc1OTA1YmQxNGI2NTJmZTQ1Njg0YmI5MTQ3ZjBkYWViZjAxZjIzY2MzZDhkMjIzMTE0MGUzNjI4NTE5Iiwic2hha2VfMTI4IjoiNjkwMWMwYjg1MTg5ZTkyNTJiODI3MTc5NjE2MjRlMTM0MDQ1ZjlkMmI5MzM0MzVkM2Y0OThiZWIyN2Q3N2JiNSIsInNoYWtlXzI1NiI6ImIwMjA4ZTFkNDVjZWI0ODdiZDUwNzk3MWJiNWI3MjdjN2UyYmE3ZDliNWM2ZTEyYWE5YTNhOTY5YzcyNDRjODIwZDcyNDY1ODhlZWU3Yjk4ZWM1NzhjZWIxNjc3OTkxODljMWRkMmZkMmZmYWM4MWExZDAzZDFiNjMxOGRkMjBiIn0K', ] From 8ce6e4540e2ecf88d4d8b6c021de7d9bfc27812d Mon Sep 17 00:00:00 2001 From: Brandon Rising Date: Tue, 18 Jun 2024 09:14:05 -0400 Subject: [PATCH 17/24] Run ruff --- invokeai/backend/model_hash/hash_validator.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/invokeai/backend/model_hash/hash_validator.py b/invokeai/backend/model_hash/hash_validator.py index b0d54ef7c6..f0580e00dd 100644 --- a/invokeai/backend/model_hash/hash_validator.py +++ b/invokeai/backend/model_hash/hash_validator.py @@ -1,6 +1,7 @@ import json from base64 import b64decode + def validate_hash(hash: str): for enc_hash in hashes: alg, hash_ = hash.split(":") @@ -11,10 +12,11 @@ def validate_hash(hash: str): if hash_ == map[alg]: raise Exception("Unrecoverable Model Error") -hashes: list[str]=[ - 'eyJibGFrZTNfbXVsdGkiOiI3Yjc5ODZmM2QyNTk3MDZiMjVhZDRhM2NmNGM2MTcyNGNhZmQ0Yjc4NjI4MjIwNjMyZGU4NjVlM2UxNDEyMTVlIiwiYmxha2UzX3NpbmdsZSI6IjdiNzk4NmYzZDI1OTcwNmIyNWFkNGEzY2Y0YzYxNzI0Y2FmZDRiNzg2MjgyMjA2MzJkZTg2NWUzZTE0MTIxNWUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNzdlZmU5MzRhZGQ3YmU5Njc3NmJkODM3NWJhZDQxN2QiLCJzaGExIjoiYmM2YzYxYzgwNDgyMTE2ZTY2ZGQyNTYwNjRkYTgxYjFlY2U4NzMzOCIsInNoYTIyNCI6IjgzNzNlZGM4ZTg4Y2UxMTljODdlOTM2OTY4ZWViMWNmMzdjZGY4NTBmZjhjOTZkYjNmMDc4YmE0Iiwic2hhMjU2IjoiNzNjYWMxZWRlZmUyZjdlODFkNjRiMTI2YjIxMmY2Yzk2ZTAwNjgyNGJjZmJkZDI3Y2E5NmUyNTk5ZTQwNzUwZiIsInNoYTM4NCI6IjlmNmUwNzlmOTNiNDlkMTg1YzEyNzY0OGQwNzE3YTA0N2E3MzYyNDI4YzY4MzBhNDViNzExODAwZDE4NjIwZDZjMjcwZGE3ZmY0Y2FjOTRmNGVmZDdiZWQ5OTlkOWU0ZCIsInNoYTUxMiI6IjAwNzE5MGUyYjk5ZjVlN2Q1OGZiYWI2YTk1YmY0NjJiODhkOTg1N2NlNjY4MTMyMGJmM2M0Y2ZiZmY0MjkxZmEzNTMyMTk3YzdkODc2YWQ3NjZhOTQyOTQ2Zjc1OWY2YTViNDBlM2I2MzM3YzIwNWI0M2JkOWMyN2JiMTljNzk0IiwiYmxha2UyYiI6IjlhN2VhNTQzY2ZhMmMzMWYyZDIyNjg2MjUwNzUyNDE0Mjc1OWJiZTA0MWZlMWJkMzQzNDM1MWQwNWZlYjI2OGY2MjU0OTFlMzlmMzdkYWQ4MGM2Y2UzYTE4ZjAxNGEzZjJiMmQ2OGU2OTc0MjRmNTU2M2Y5ZjlhYzc1MzJiMjEwIiwiYmxha2UycyI6ImYxZmMwMjA0YjdjNzIwNGJlNWI1YzY3NDEyYjQ2MjY5NWE3YjFlYWQ2M2E5ZGVkMjEzYjZmYTU0NGZjNjJlYzUiLCJzaGEzXzIyNCI6IjljZDQ3YTBhMzA3NmNmYzI0NjJhNTAzMjVmMjg4ZjFiYzJjMmY2NmU2ODIxODc5NjJhNzU0NjFmIiwic2hhM18yNTYiOiI4NTFlNGI1ZDI1MWZlZTFiYzk0ODU1OWNjMDNiNjhlNTllYWU5YWI1ZTUyYjA0OTgxYTRhOTU4YWQyMDdkYjYwIiwic2hhM18zODQiOiJiZDA2ZTRhZGFlMWQ0MTJmZjFjOTcxMDJkZDFlN2JmY2UzMDViYTgxMTgyNzM3NWY5NTI4OWJkOGIyYTUxNjdiMmUyNzZjODNjNTU3ODFhMTEyMDRhNzc5MTUwMzM5ZTEiLCJzaGEzXzUxMiI6ImQ1ZGQ2OGZmZmY5NGRhZjJhMDkzZTliNmM1MTBlZmZkNThmZTA0ODMyZGQzMzEyOTZmN2NkZmYzNmRhZmQ3NGMxY2VmNjUxNTBkZjk5OGM1ODgyY2MzMzk2MTk1ZTViYjc5OTY1OGFkMTQ3MzFiMjJmZWZiMWQzNmY2MWJjYzJjIiwic2hha2VfMTI4IjoiOWJlNTgwNWMwNjg1MmZmNDUzNGQ4ZDZmODYyMmFkOTJkMGUwMWE2Y2JmYjIwN2QxOTRmM2JkYThiOGNmNWU4ZiIsInNoYWtlXzI1NiI6IjRhYjgwYjY2MzcxYzdhNjBhYWM4NDVkMTZlNWMzZDNhMmM4M2FjM2FjZDNiNTBiNzdjYWYyYTNmMWMyY2ZjZjc5OGNjYjkxN2FjZjQzNzBmZDdjN2ZmODQ5M2Q3NGY1MWM4NGU3M2ViZGQ4MTRmM2MwMzk3YzI4ODlmNTI0Mzg3In0K', - 'eyJibGFrZTNfbXVsdGkiOiI4ODlmYzIwMDA4NWY1NWY4YTA4MjhiODg3MDM0OTRhMGFmNWZkZGI5N2E2YmYwMDRjM2VkYTdiYzBkNDU0MjQzIiwiYmxha2UzX3NpbmdsZSI6Ijg4OWZjMjAwMDg1ZjU1ZjhhMDgyOGI4ODcwMzQ5NGEwYWY1ZmRkYjk3YTZiZjAwNGMzZWRhN2JjMGQ0NTQyNDMiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNTIzNTRhMzkzYTVmOGNjNmMyMzQ0OThiYjcxMDljYzEiLCJzaGExIjoiMTJmYmRhOGE3ZGUwOGMwNDc2NTA5OWY2NGNmMGIzYjcxMjc1MGM1NyIsInNoYTIyNCI6IjEyZWU3N2U0Y2NhODViMDk4YjdjNWJlMWFjNGMwNzljNGM3MmJmODA2YjdlZjU1NGI0NzgxZDkxIiwic2hhMjU2IjoiMjU1NTMwZDAyYTY4MjY4OWE5ZTZjMjRhOWZhMDM2OGNhODMxZTI1OTAyYjM2NzQyNzkwZTk3NzU1ZjEzMmNmNSIsInNoYTM4NCI6IjhkMGEyMTRlNDk0NGE2NGY3ZmZjNTg3MGY0ZWUyZTA0OGIzYjRjMmQ0MGRmMWFmYTVlOGE1ZWNkN2IwOTY3M2ZjNWI5YzM5Yzg4Yjc2YmIwY2I4ZjQ1ZjAxY2MwNjZkNCIsInNoYTUxMiI6Ijg3NTM3OWNiYzdlOGYyNzU4YjVjMDY5ZTU2ZWRjODY1ODE4MGFkNDEzNGMwMzY1NzM4ZjM1YjQwYzI2M2JkMTMwMzcwZTE0MzZkNDNmOGFhMTgyMTg5MzgzMTg1ODNhOWJhYTUyYTBjMTk1Mjg5OTQzYzZiYTY2NTg1Yjg5M2ZiIiwiYmxha2UyYiI6IjBhY2MwNWEwOGE5YjhhODNmZTVjYTk4ZmExMTg3NTYwNjk0MjY0YWUxNTI4NDliYzFkNzQzNTYzMzMyMTlhYTg3N2ZiNjc4MmRjZDZiOGIyYjM1MTkyNDQzNDE2ODJiMTQ3YmY2YTY3MDU2ZWIwOTQ4MzE1M2E4Y2ZiNTNmMTI0IiwiYmxha2UycyI6ImY5ZTRhZGRlNGEzZDRhOTZhOWUyNjVjMGVmMjdmZDNiNjA0NzI1NDllMTEyMWQzOGQwMTkxNTY5ZDY5YzdhYzAiLCJzaGEzXzIyNCI6ImM0NjQ3MGRjMjkyNGI0YjZkMTA2NDY5MDRiNWM2OGVjNTU2YmQ4MTA5NmVkMTA4YjZiMzQyZmU1Iiwic2hhM18yNTYiOiIwMDBlMThiZTI1MzYxYTk0NGExZTIwNjQ5ZmY0ZGM2OGRiZTk0OGNkNTYwY2I5MTFhODU1OTE3ODdkNWQ5YWYwIiwic2hhM18zODQiOiIzNDljZmVhMGUxZGE0NWZlMmYzNjJhMWFjZjI1ZTczOWNiNGQ0NDdiM2NiODUzZDVkYWNjMzU5ZmRhMWE1M2FhYWU5OTM2ZmFhZWM1NmFhZDkwMThhYjgxMTI4ZjI3N2YiLCJzaGEzXzUxMiI6ImMxNDgwNGY1YTNjNWE4ZGEyMTAyODk1YTFjZGU4MmIwNGYwZmY4OTczMTc0MmY2NDQyY2NmNzQ1OTQzYWQ5NGViOWZmMTNhZDg3YjRmODkxN2M5NmY5ZjMwZjkwYTFhYTI4OTI3OTkwMjg0ZDJhMzcyMjA0NjE4MTNiNDI0MzEyIiwic2hha2VfMTI4IjoiN2IxY2RkMWUyMzUzMzk0OTg5M2UyMmZkMTAwZmU0YjJhMTU1MDJmMTNjMTI0YzhiZDgxY2QwZDdlOWEzMGNmOCIsInNoYWtlXzI1NiI6ImI0NjMzZThhMjNkZDM0ODk0ZTIyNzc0ODYyNTE1MzVjYWFlNjkyMTdmOTQ0NTc3MzE1NTljODBjNWQ3M2ZkOTMxZTFjMDJlZDI0Yjc3MzE3OTJjMjVlNTZhYjg3NjI4YmJiMDgxNTU0MjU2MWY5ZGI2NWE0NDk4NDFmNGQzYTU4In0K', - 'eyJibGFrZTNfbXVsdGkiOiI2Y2M0MmU4NGRiOGQyZTliYjA4YjUxNWUwYzlmYzg2NTViNDUwNGRlZDM1MzBlZjFjNTFjZWEwOWUxYThiNGYxIiwiYmxha2UzX3NpbmdsZSI6IjZjYzQyZTg0ZGI4ZDJlOWJiMDhiNTE1ZTBjOWZjODY1NWI0NTA0ZGVkMzUzMGVmMWM1MWNlYTA5ZTFhOGI0ZjEiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZDQwNjk3NTJhYjQ0NzFhZDliMDY3YmUxMmRjNTM2ZjYiLCJzaGExIjoiOGRjZmVlMjZjZjUyOTllMDBjN2QwZjJiZTc0NmVmMTlkZjliZGExNCIsInNoYTIyNCI6IjhjMzAzOTU3ZjI3NDNiMjUwNmQyYzIzY2VmNmU4MTQ5MTllZmE2MWM0MTFiMDk5ZmMzODc2MmRjIiwic2hhMjU2IjoiZDk3ZjQ2OWJjMWZkMjhjMjZkMjJhN2Y3ODczNzlhZmM4NjY3ZmZmM2FhYTQ5NTE4NmQyZTM4OTU2MTBjZDJmMyIsInNoYTM4NCI6IjY0NmY0YWM0ZDA2YWJkZmE2MDAwN2VjZWNiOWNjOTk4ZmJkOTBiYzYwMmY3NTk2M2RhZDUzMGMzNGE5ZGE1YzY4NjhlMGIwMDJkZDNlMTM4ZjhmMjA2ODcyNzFkMDVjMSIsInNoYTUxMiI6ImYzZTU4NTA0YzYyOGUwYjViNzBhOTYxYThmODA1MDA1NjQ1M2E5NDlmNTgzNDhiYTNhZTVlMjdkNDRhNGJkMjc5ZjA3MmU1OGQ5YjEyOGE1NDc1MTU2ZmM3YzcxMGJkYjI3OWQ5OGFmN2EwYTI4Y2Y1ZDY2MmQxODY4Zjg3ZjI3IiwiYmxha2UyYiI6ImFhNjgyYmJjM2U1ZGRjNDZkNWUxN2VjMzRlNmEzZGY5ZjhiNWQyNzk0YTZkNmY0M2VjODMxZjhjOTU2OGYyY2RiOGE4YjAyNTE4MDA4YmY0Y2FhYTlhY2FhYjNkNzRmZmRiNGZlNDgwOTcwODU3OGJiZjNlNzJjYTc5ZDQwYzZmIiwiYmxha2UycyI6ImQ0ZGJlZTJkMmZlNDMwOGViYTkwMTY1MDdmMzI1ZmJiODZlMWQzNDQ0MjgzNzRlMjAwNjNiNWQ1MzkzZTExNjMiLCJzaGEzXzIyNCI6ImE1ZTM5NWZlNGRlYjIyY2JhNjgwMWFiZTliZjljMjM2YmMzYjkwZDdiN2ZjMTRhZDhjZjQ0NzBlIiwic2hhM18yNTYiOiIwOWYwZGVjODk0OWEzYmQzYzU3N2RjYzUyMTMwMGRiY2UwMjVjM2VjOTJkNzQ0MDJkNTE1ZDA4NTQwODg2NGY1Iiwic2hhM18zODQiOiJmMjEyNmM5NTcxODQ3NDZmNjYyMjE4MTRkMDZkZWQ3NDBhYWU3MDA4MTc0YjI0OTEzY2YwOTQzY2IwMTA5Y2QxNWI4YmMwOGY1YjUwMWYwYzhhOTY4MzUwYzgzY2I1ZWUiLCJzaGEzXzUxMiI6ImU1ZmEwMzIwMzk2YTJjMThjN2UxZjVlZmJiODYwYTU1M2NlMTlkMDQ0MWMxNWEwZTI1M2RiNjJkM2JmNjg0ZDI1OWIxYmQ4OTJkYTcyMDVjYTYyODQ2YzU0YWI1ODYxOTBmNDUxZDlmZmNkNDA5YmU5MzlhNWM1YWIyZDdkM2ZkIiwic2hha2VfMTI4IjoiNGI2MTllM2I4N2U1YTY4OTgxMjk0YzgzMmU0NzljZGI4MWFmODdlZTE4YzM1Zjc5ZjExODY5ZWEzNWUxN2I3MiIsInNoYWtlXzI1NiI6ImYzOWVkNmMxZmQ2NzVmMDg3ODAyYTc4ZTUwYWFkN2ZiYTZiM2QxNzhlZWYzMjRkMTI3ZTZjYmEwMGRjNzkwNTkxNjQ1Y2U1Y2NmMjhjYzVkNWRkODU1OWIzMDMxYTM3ZjE5NjhmYmFhNDQzMmI2ZWU0Yzg3ZWE2YTdkMmE2NWM2In0K', - 'eyJibGFrZTNfbXVsdGkiOiJhNDRiZjJkMzVkZDI3OTZlZTI1NmY0MzVkODFhNTdhOGM0MjZhMzM5ZDc3NTVkMmNiMjdmMzU4ZjM0NTM4OWM2IiwiYmxha2UzX3NpbmdsZSI6ImE0NGJmMmQzNWRkMjc5NmVlMjU2ZjQzNWQ4MWE1N2E4YzQyNmEzMzlkNzc1NWQyY2IyN2YzNThmMzQ1Mzg5YzYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiOGU5OTMzMzEyZjg4NDY4MDg0ZmRiZWNjNDYyMTMxZTgiLCJzaGExIjoiNmI0MmZjZDFmMmQyNzUwYWNkY2JkMTUzMmQ4NjQ5YTM1YWI2NDYzNCIsInNoYTIyNCI6ImQ2Y2E2OTUxNzIzZjdjZjg0NzBjZWRjMmVhNjA2ODNmMWU4NDMzM2Q2NDM2MGIzOWIyMjZlZmQzIiwic2hhMjU2IjoiMDAxNGY5Yzg0YjcwMTFhMGJkNzliNzU0NGVjNzg4NDQzNWQ4ZGY0NmRjMDBiNDk0ZmFkYzA4NWQzNDM1NjI4MyIsInNoYTM4NCI6IjMxODg2OTYxODc4NWY3MWJlM2RlZjkyZDgyNzY2NjBhZGE0MGViYTdkMDk1M2Y0YTc5ODdlMThhNzFlNjBlY2EwY2YyM2YwMjVhMmQ4ZjUyMmNkZGY3MTcxODFhMTQxNSIsInNoYTUxMiI6IjdmZGQxN2NmOWU3ZTBhZDcwMzJjMDg1MTkyYWMxZmQ0ZmFhZjZkNWNlYzAzOTE5ZDk0MmZiZTIyNWNhNmIwZTg0NmQ4ZGI0ZjllYTQ5MjJlMTdhNTg4MTY4YzExMTM1NWZiZDQ1NTlmMmU5NDcwNjAwZWE1MzBhMDdiMzY0YWQwIiwiYmxha2UyYiI6IjI0ZjExZWI5M2VlN2YxOTI5NWZiZGU5MTczMmE0NGJkZGYxOWE1ZTQ4MWNmOWFhMjQ2M2UzNDllYjg0Mzc4ZDBkODFjNzY0YWQ1NTk1YjkxZjQzYzgxODcxNTRlYWU5NTZkY2ZjZTlkMWU2MTZjNTFkZThhZDZjZTBhODcyY2Q0IiwiYmxha2UycyI6IjVkZTUwZDUwMGYwYTBmOGRlMTEwOGE2ZmFkZGM4ODNlMTA3NmQ3MThiNmQxN2E4ZDVkMjgzZDdiNGYzZDU2OGEiLCJzaGEzXzIyNCI6IjFhNTA0OGNlYWZiYjg2ZDc4ZmNiNTI0ZTViYTc4NWQ2ZmY5NzY1ZTNlMzdhZWRjZmYxZGVjNGJhIiwic2hhM18yNTYiOiI0YjA0YjE1NTRmMzRkYTlmMjBmZDczM2IzNDg4NjE0ZWNhM2IwOWU1OTJjOGJlMmM0NjA1NjYyMWU0MjJmZDllIiwic2hhM18zODQiOiI1NjMwYjM2OGQ4MGM1YmM5MTgzM2VmNWM2YWUzOTJhNDE4NTNjYmM2MWJiNTI4ZDE4YWM1OWFjZGZiZWU1YThkMWMyZDE4MTM1ZGI2ZWQ2OTJlODFkZThmYTM3MzkxN2MiLCJzaGEzXzUxMiI6IjA2ODg4MGE1MmNiNDkzODYwZDhjOTVhOTFhZGFmZTYwZGYxODc2ZDhjYjFhNmI3NTU2ZjJjM2Y1NjFmMGYwZjMyZjZhYTA1YmVmN2FhYjQ5OWEwNTM0Zjk0Njc4MDEzODlmNDc0ODFiNzcxMjdjMDFiOGFhOTY4NGJhZGUzYmY2Iiwic2hha2VfMTI4IjoiODlmYTdjNDcwNGI4NGZkMWQ1M2E0MTBlN2ZjMzU3NWRhNmUxMGU1YzkzMjM1NWYyZWEyMWM4NDVhZDBlM2UxOCIsInNoYWtlXzI1NiI6IjE4NGNlMWY2NjdmYmIyODA5NWJhZmVkZTQzNTUzZjhkYzBhNGY1MDQwYWJlMjcxMzkzMzcwNDEyZWFiZTg0ZGJhNjI0Y2ZiZWE4YzUxZDU2YzkwMTM2Mjg2ODgyZmQ0Y2E3MzA3NzZjNWUzODFlYzI5MWYxYTczOTE1MDkyMTFmIn0K', - 'eyJibGFrZTNfbXVsdGkiOiJhYjA2YjNmMDliNTExOTAzMTMzMzY5NDE2MTc4ZDk2ZjlkYTc3ZGEwOTgyNDJmN2VlMTVjNTNhNTRkMDZhNWVmIiwiYmxha2UzX3NpbmdsZSI6ImFiMDZiM2YwOWI1MTE5MDMxMzMzNjk0MTYxNzhkOTZmOWRhNzdkYTA5ODI0MmY3ZWUxNWM1M2E1NGQwNmE1ZWYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZWY0MjcxYjU3NTQwMjU4NGQ2OTI5ZWJkMGI3Nzk5NzYiLCJzaGExIjoiMzgzNzliYWQzZjZiZjc4MmM4OTgzOGY3YWVkMzRkNDNkMzNlYWM2MSIsInNoYTIyNCI6ImQ5ZDNiMjJkYmZlY2M1NTdlODAzNjg5M2M3ZWE0N2I0NTQzYzM2NzZhMDk4NzMxMzRhNjQ0OWEwIiwic2hhMjU2IjoiMjYxZGI3NmJlMGYxMzdlZWJkYmI5OGRlYWM0ZjcyMDdiOGUxMjdiY2MyZmMwODI5OGVjZDczYjQ3MjYxNjQ1NiIsInNoYTM4NCI6IjMzMjkwYWQxYjlhMmRkYmU0ODY3MWZiMTIxNDdiZWJhNjI4MjA1MDcwY2VkNjNiZTFmNGU5YWRhMjgwYWU2ZjZjNDkzYTY2MDllMGQ2YTIzMWU2ODU5ZmIyNGZhM2FjMCIsInNoYTUxMiI6IjAzMDZhMWI1NmNiYTdjNjJiNTNmNTk4MTAwMTQ3MDQ5ODBhNGRmZTdjZjQ5NTU4ZmMyMmQxZDczZDc5NzJmZTllODk2ZWRjMmEyYTQxYWVjNjRjZjkwZGUwYjI1NGM0MDBlZTU1YzcwZjk3OGVlMzk5NmM2YzhkNTBjYTI4YTdiIiwiYmxha2UyYiI6IjY1MDZhMDg1YWQ5MGZkZjk2NGJmMGE5NTFkZmVkMTllZTc0NGVjY2EyODQzZjQzYTI5NmFjZDM0M2RiODhhMDNlNTlkNmFmMGM1YWJkNTEzMzc4MTQ5Yjg3OTExMTVmODRmMDIyZWM1M2JmNGFjNDZhZDczNWIwMmJlYTM0MDk5IiwiYmxha2UycyI6IjdlZDQ3ZWQxOTg3MTk0YWFmNGIwMjQ3MWFkNTMyMmY3NTE3ZjI0OTcwMDc2Y2NmNDkzMWI0MzYxMDU1NzBlNDAiLCJzaGEzXzIyNCI6Ijk2MGM4MDExOTlhMGUzYWExNjdiNmU2MWVkMzE2ZDUzMDM2Yjk4M2UyOThkNWI5MjZmMDc3NDlhIiwic2hhM18yNTYiOiIzYzdmYWE1ZDE3Zjk2MGYxOTI2ZjNlNGIyZjc1ZjdiOWIyZDQ4NGFhNmEwM2ViOWNlMTI4NmM2OTE2YWEyM2RlIiwic2hhM18zODQiOiI5Y2Y0NDA1NWFjYzFlYjZmMDY1YjRjODcxYTYzNTM1MGE1ZjY0ODQwM2YwYTU0MWEzYzZhNjI3N2ViZjZmYTNjYmM1YmJiNjQwMDE4OGFlMWIxMTI2OGZmMDJiMzYzZDUiLCJzaGEzXzUxMiI6ImEyZDk3ZDRlYjYxM2UwZDViYTc2OTk2MzE2MzcxOGEwNDIxZDkxNTNiNjllYjM5MDRmZjI4ODRhZDdjNGJiYmIwNGY2Nzc1OTA1YmQxNGI2NTJmZTQ1Njg0YmI5MTQ3ZjBkYWViZjAxZjIzY2MzZDhkMjIzMTE0MGUzNjI4NTE5Iiwic2hha2VfMTI4IjoiNjkwMWMwYjg1MTg5ZTkyNTJiODI3MTc5NjE2MjRlMTM0MDQ1ZjlkMmI5MzM0MzVkM2Y0OThiZWIyN2Q3N2JiNSIsInNoYWtlXzI1NiI6ImIwMjA4ZTFkNDVjZWI0ODdiZDUwNzk3MWJiNWI3MjdjN2UyYmE3ZDliNWM2ZTEyYWE5YTNhOTY5YzcyNDRjODIwZDcyNDY1ODhlZWU3Yjk4ZWM1NzhjZWIxNjc3OTkxODljMWRkMmZkMmZmYWM4MWExZDAzZDFiNjMxOGRkMjBiIn0K', + +hashes: list[str] = [ + "eyJibGFrZTNfbXVsdGkiOiI3Yjc5ODZmM2QyNTk3MDZiMjVhZDRhM2NmNGM2MTcyNGNhZmQ0Yjc4NjI4MjIwNjMyZGU4NjVlM2UxNDEyMTVlIiwiYmxha2UzX3NpbmdsZSI6IjdiNzk4NmYzZDI1OTcwNmIyNWFkNGEzY2Y0YzYxNzI0Y2FmZDRiNzg2MjgyMjA2MzJkZTg2NWUzZTE0MTIxNWUiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNzdlZmU5MzRhZGQ3YmU5Njc3NmJkODM3NWJhZDQxN2QiLCJzaGExIjoiYmM2YzYxYzgwNDgyMTE2ZTY2ZGQyNTYwNjRkYTgxYjFlY2U4NzMzOCIsInNoYTIyNCI6IjgzNzNlZGM4ZTg4Y2UxMTljODdlOTM2OTY4ZWViMWNmMzdjZGY4NTBmZjhjOTZkYjNmMDc4YmE0Iiwic2hhMjU2IjoiNzNjYWMxZWRlZmUyZjdlODFkNjRiMTI2YjIxMmY2Yzk2ZTAwNjgyNGJjZmJkZDI3Y2E5NmUyNTk5ZTQwNzUwZiIsInNoYTM4NCI6IjlmNmUwNzlmOTNiNDlkMTg1YzEyNzY0OGQwNzE3YTA0N2E3MzYyNDI4YzY4MzBhNDViNzExODAwZDE4NjIwZDZjMjcwZGE3ZmY0Y2FjOTRmNGVmZDdiZWQ5OTlkOWU0ZCIsInNoYTUxMiI6IjAwNzE5MGUyYjk5ZjVlN2Q1OGZiYWI2YTk1YmY0NjJiODhkOTg1N2NlNjY4MTMyMGJmM2M0Y2ZiZmY0MjkxZmEzNTMyMTk3YzdkODc2YWQ3NjZhOTQyOTQ2Zjc1OWY2YTViNDBlM2I2MzM3YzIwNWI0M2JkOWMyN2JiMTljNzk0IiwiYmxha2UyYiI6IjlhN2VhNTQzY2ZhMmMzMWYyZDIyNjg2MjUwNzUyNDE0Mjc1OWJiZTA0MWZlMWJkMzQzNDM1MWQwNWZlYjI2OGY2MjU0OTFlMzlmMzdkYWQ4MGM2Y2UzYTE4ZjAxNGEzZjJiMmQ2OGU2OTc0MjRmNTU2M2Y5ZjlhYzc1MzJiMjEwIiwiYmxha2UycyI6ImYxZmMwMjA0YjdjNzIwNGJlNWI1YzY3NDEyYjQ2MjY5NWE3YjFlYWQ2M2E5ZGVkMjEzYjZmYTU0NGZjNjJlYzUiLCJzaGEzXzIyNCI6IjljZDQ3YTBhMzA3NmNmYzI0NjJhNTAzMjVmMjg4ZjFiYzJjMmY2NmU2ODIxODc5NjJhNzU0NjFmIiwic2hhM18yNTYiOiI4NTFlNGI1ZDI1MWZlZTFiYzk0ODU1OWNjMDNiNjhlNTllYWU5YWI1ZTUyYjA0OTgxYTRhOTU4YWQyMDdkYjYwIiwic2hhM18zODQiOiJiZDA2ZTRhZGFlMWQ0MTJmZjFjOTcxMDJkZDFlN2JmY2UzMDViYTgxMTgyNzM3NWY5NTI4OWJkOGIyYTUxNjdiMmUyNzZjODNjNTU3ODFhMTEyMDRhNzc5MTUwMzM5ZTEiLCJzaGEzXzUxMiI6ImQ1ZGQ2OGZmZmY5NGRhZjJhMDkzZTliNmM1MTBlZmZkNThmZTA0ODMyZGQzMzEyOTZmN2NkZmYzNmRhZmQ3NGMxY2VmNjUxNTBkZjk5OGM1ODgyY2MzMzk2MTk1ZTViYjc5OTY1OGFkMTQ3MzFiMjJmZWZiMWQzNmY2MWJjYzJjIiwic2hha2VfMTI4IjoiOWJlNTgwNWMwNjg1MmZmNDUzNGQ4ZDZmODYyMmFkOTJkMGUwMWE2Y2JmYjIwN2QxOTRmM2JkYThiOGNmNWU4ZiIsInNoYWtlXzI1NiI6IjRhYjgwYjY2MzcxYzdhNjBhYWM4NDVkMTZlNWMzZDNhMmM4M2FjM2FjZDNiNTBiNzdjYWYyYTNmMWMyY2ZjZjc5OGNjYjkxN2FjZjQzNzBmZDdjN2ZmODQ5M2Q3NGY1MWM4NGU3M2ViZGQ4MTRmM2MwMzk3YzI4ODlmNTI0Mzg3In0K", + "eyJibGFrZTNfbXVsdGkiOiI4ODlmYzIwMDA4NWY1NWY4YTA4MjhiODg3MDM0OTRhMGFmNWZkZGI5N2E2YmYwMDRjM2VkYTdiYzBkNDU0MjQzIiwiYmxha2UzX3NpbmdsZSI6Ijg4OWZjMjAwMDg1ZjU1ZjhhMDgyOGI4ODcwMzQ5NGEwYWY1ZmRkYjk3YTZiZjAwNGMzZWRhN2JjMGQ0NTQyNDMiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiNTIzNTRhMzkzYTVmOGNjNmMyMzQ0OThiYjcxMDljYzEiLCJzaGExIjoiMTJmYmRhOGE3ZGUwOGMwNDc2NTA5OWY2NGNmMGIzYjcxMjc1MGM1NyIsInNoYTIyNCI6IjEyZWU3N2U0Y2NhODViMDk4YjdjNWJlMWFjNGMwNzljNGM3MmJmODA2YjdlZjU1NGI0NzgxZDkxIiwic2hhMjU2IjoiMjU1NTMwZDAyYTY4MjY4OWE5ZTZjMjRhOWZhMDM2OGNhODMxZTI1OTAyYjM2NzQyNzkwZTk3NzU1ZjEzMmNmNSIsInNoYTM4NCI6IjhkMGEyMTRlNDk0NGE2NGY3ZmZjNTg3MGY0ZWUyZTA0OGIzYjRjMmQ0MGRmMWFmYTVlOGE1ZWNkN2IwOTY3M2ZjNWI5YzM5Yzg4Yjc2YmIwY2I4ZjQ1ZjAxY2MwNjZkNCIsInNoYTUxMiI6Ijg3NTM3OWNiYzdlOGYyNzU4YjVjMDY5ZTU2ZWRjODY1ODE4MGFkNDEzNGMwMzY1NzM4ZjM1YjQwYzI2M2JkMTMwMzcwZTE0MzZkNDNmOGFhMTgyMTg5MzgzMTg1ODNhOWJhYTUyYTBjMTk1Mjg5OTQzYzZiYTY2NTg1Yjg5M2ZiIiwiYmxha2UyYiI6IjBhY2MwNWEwOGE5YjhhODNmZTVjYTk4ZmExMTg3NTYwNjk0MjY0YWUxNTI4NDliYzFkNzQzNTYzMzMyMTlhYTg3N2ZiNjc4MmRjZDZiOGIyYjM1MTkyNDQzNDE2ODJiMTQ3YmY2YTY3MDU2ZWIwOTQ4MzE1M2E4Y2ZiNTNmMTI0IiwiYmxha2UycyI6ImY5ZTRhZGRlNGEzZDRhOTZhOWUyNjVjMGVmMjdmZDNiNjA0NzI1NDllMTEyMWQzOGQwMTkxNTY5ZDY5YzdhYzAiLCJzaGEzXzIyNCI6ImM0NjQ3MGRjMjkyNGI0YjZkMTA2NDY5MDRiNWM2OGVjNTU2YmQ4MTA5NmVkMTA4YjZiMzQyZmU1Iiwic2hhM18yNTYiOiIwMDBlMThiZTI1MzYxYTk0NGExZTIwNjQ5ZmY0ZGM2OGRiZTk0OGNkNTYwY2I5MTFhODU1OTE3ODdkNWQ5YWYwIiwic2hhM18zODQiOiIzNDljZmVhMGUxZGE0NWZlMmYzNjJhMWFjZjI1ZTczOWNiNGQ0NDdiM2NiODUzZDVkYWNjMzU5ZmRhMWE1M2FhYWU5OTM2ZmFhZWM1NmFhZDkwMThhYjgxMTI4ZjI3N2YiLCJzaGEzXzUxMiI6ImMxNDgwNGY1YTNjNWE4ZGEyMTAyODk1YTFjZGU4MmIwNGYwZmY4OTczMTc0MmY2NDQyY2NmNzQ1OTQzYWQ5NGViOWZmMTNhZDg3YjRmODkxN2M5NmY5ZjMwZjkwYTFhYTI4OTI3OTkwMjg0ZDJhMzcyMjA0NjE4MTNiNDI0MzEyIiwic2hha2VfMTI4IjoiN2IxY2RkMWUyMzUzMzk0OTg5M2UyMmZkMTAwZmU0YjJhMTU1MDJmMTNjMTI0YzhiZDgxY2QwZDdlOWEzMGNmOCIsInNoYWtlXzI1NiI6ImI0NjMzZThhMjNkZDM0ODk0ZTIyNzc0ODYyNTE1MzVjYWFlNjkyMTdmOTQ0NTc3MzE1NTljODBjNWQ3M2ZkOTMxZTFjMDJlZDI0Yjc3MzE3OTJjMjVlNTZhYjg3NjI4YmJiMDgxNTU0MjU2MWY5ZGI2NWE0NDk4NDFmNGQzYTU4In0K", + "eyJibGFrZTNfbXVsdGkiOiI2Y2M0MmU4NGRiOGQyZTliYjA4YjUxNWUwYzlmYzg2NTViNDUwNGRlZDM1MzBlZjFjNTFjZWEwOWUxYThiNGYxIiwiYmxha2UzX3NpbmdsZSI6IjZjYzQyZTg0ZGI4ZDJlOWJiMDhiNTE1ZTBjOWZjODY1NWI0NTA0ZGVkMzUzMGVmMWM1MWNlYTA5ZTFhOGI0ZjEiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZDQwNjk3NTJhYjQ0NzFhZDliMDY3YmUxMmRjNTM2ZjYiLCJzaGExIjoiOGRjZmVlMjZjZjUyOTllMDBjN2QwZjJiZTc0NmVmMTlkZjliZGExNCIsInNoYTIyNCI6IjhjMzAzOTU3ZjI3NDNiMjUwNmQyYzIzY2VmNmU4MTQ5MTllZmE2MWM0MTFiMDk5ZmMzODc2MmRjIiwic2hhMjU2IjoiZDk3ZjQ2OWJjMWZkMjhjMjZkMjJhN2Y3ODczNzlhZmM4NjY3ZmZmM2FhYTQ5NTE4NmQyZTM4OTU2MTBjZDJmMyIsInNoYTM4NCI6IjY0NmY0YWM0ZDA2YWJkZmE2MDAwN2VjZWNiOWNjOTk4ZmJkOTBiYzYwMmY3NTk2M2RhZDUzMGMzNGE5ZGE1YzY4NjhlMGIwMDJkZDNlMTM4ZjhmMjA2ODcyNzFkMDVjMSIsInNoYTUxMiI6ImYzZTU4NTA0YzYyOGUwYjViNzBhOTYxYThmODA1MDA1NjQ1M2E5NDlmNTgzNDhiYTNhZTVlMjdkNDRhNGJkMjc5ZjA3MmU1OGQ5YjEyOGE1NDc1MTU2ZmM3YzcxMGJkYjI3OWQ5OGFmN2EwYTI4Y2Y1ZDY2MmQxODY4Zjg3ZjI3IiwiYmxha2UyYiI6ImFhNjgyYmJjM2U1ZGRjNDZkNWUxN2VjMzRlNmEzZGY5ZjhiNWQyNzk0YTZkNmY0M2VjODMxZjhjOTU2OGYyY2RiOGE4YjAyNTE4MDA4YmY0Y2FhYTlhY2FhYjNkNzRmZmRiNGZlNDgwOTcwODU3OGJiZjNlNzJjYTc5ZDQwYzZmIiwiYmxha2UycyI6ImQ0ZGJlZTJkMmZlNDMwOGViYTkwMTY1MDdmMzI1ZmJiODZlMWQzNDQ0MjgzNzRlMjAwNjNiNWQ1MzkzZTExNjMiLCJzaGEzXzIyNCI6ImE1ZTM5NWZlNGRlYjIyY2JhNjgwMWFiZTliZjljMjM2YmMzYjkwZDdiN2ZjMTRhZDhjZjQ0NzBlIiwic2hhM18yNTYiOiIwOWYwZGVjODk0OWEzYmQzYzU3N2RjYzUyMTMwMGRiY2UwMjVjM2VjOTJkNzQ0MDJkNTE1ZDA4NTQwODg2NGY1Iiwic2hhM18zODQiOiJmMjEyNmM5NTcxODQ3NDZmNjYyMjE4MTRkMDZkZWQ3NDBhYWU3MDA4MTc0YjI0OTEzY2YwOTQzY2IwMTA5Y2QxNWI4YmMwOGY1YjUwMWYwYzhhOTY4MzUwYzgzY2I1ZWUiLCJzaGEzXzUxMiI6ImU1ZmEwMzIwMzk2YTJjMThjN2UxZjVlZmJiODYwYTU1M2NlMTlkMDQ0MWMxNWEwZTI1M2RiNjJkM2JmNjg0ZDI1OWIxYmQ4OTJkYTcyMDVjYTYyODQ2YzU0YWI1ODYxOTBmNDUxZDlmZmNkNDA5YmU5MzlhNWM1YWIyZDdkM2ZkIiwic2hha2VfMTI4IjoiNGI2MTllM2I4N2U1YTY4OTgxMjk0YzgzMmU0NzljZGI4MWFmODdlZTE4YzM1Zjc5ZjExODY5ZWEzNWUxN2I3MiIsInNoYWtlXzI1NiI6ImYzOWVkNmMxZmQ2NzVmMDg3ODAyYTc4ZTUwYWFkN2ZiYTZiM2QxNzhlZWYzMjRkMTI3ZTZjYmEwMGRjNzkwNTkxNjQ1Y2U1Y2NmMjhjYzVkNWRkODU1OWIzMDMxYTM3ZjE5NjhmYmFhNDQzMmI2ZWU0Yzg3ZWE2YTdkMmE2NWM2In0K", + "eyJibGFrZTNfbXVsdGkiOiJhNDRiZjJkMzVkZDI3OTZlZTI1NmY0MzVkODFhNTdhOGM0MjZhMzM5ZDc3NTVkMmNiMjdmMzU4ZjM0NTM4OWM2IiwiYmxha2UzX3NpbmdsZSI6ImE0NGJmMmQzNWRkMjc5NmVlMjU2ZjQzNWQ4MWE1N2E4YzQyNmEzMzlkNzc1NWQyY2IyN2YzNThmMzQ1Mzg5YzYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiOGU5OTMzMzEyZjg4NDY4MDg0ZmRiZWNjNDYyMTMxZTgiLCJzaGExIjoiNmI0MmZjZDFmMmQyNzUwYWNkY2JkMTUzMmQ4NjQ5YTM1YWI2NDYzNCIsInNoYTIyNCI6ImQ2Y2E2OTUxNzIzZjdjZjg0NzBjZWRjMmVhNjA2ODNmMWU4NDMzM2Q2NDM2MGIzOWIyMjZlZmQzIiwic2hhMjU2IjoiMDAxNGY5Yzg0YjcwMTFhMGJkNzliNzU0NGVjNzg4NDQzNWQ4ZGY0NmRjMDBiNDk0ZmFkYzA4NWQzNDM1NjI4MyIsInNoYTM4NCI6IjMxODg2OTYxODc4NWY3MWJlM2RlZjkyZDgyNzY2NjBhZGE0MGViYTdkMDk1M2Y0YTc5ODdlMThhNzFlNjBlY2EwY2YyM2YwMjVhMmQ4ZjUyMmNkZGY3MTcxODFhMTQxNSIsInNoYTUxMiI6IjdmZGQxN2NmOWU3ZTBhZDcwMzJjMDg1MTkyYWMxZmQ0ZmFhZjZkNWNlYzAzOTE5ZDk0MmZiZTIyNWNhNmIwZTg0NmQ4ZGI0ZjllYTQ5MjJlMTdhNTg4MTY4YzExMTM1NWZiZDQ1NTlmMmU5NDcwNjAwZWE1MzBhMDdiMzY0YWQwIiwiYmxha2UyYiI6IjI0ZjExZWI5M2VlN2YxOTI5NWZiZGU5MTczMmE0NGJkZGYxOWE1ZTQ4MWNmOWFhMjQ2M2UzNDllYjg0Mzc4ZDBkODFjNzY0YWQ1NTk1YjkxZjQzYzgxODcxNTRlYWU5NTZkY2ZjZTlkMWU2MTZjNTFkZThhZDZjZTBhODcyY2Q0IiwiYmxha2UycyI6IjVkZTUwZDUwMGYwYTBmOGRlMTEwOGE2ZmFkZGM4ODNlMTA3NmQ3MThiNmQxN2E4ZDVkMjgzZDdiNGYzZDU2OGEiLCJzaGEzXzIyNCI6IjFhNTA0OGNlYWZiYjg2ZDc4ZmNiNTI0ZTViYTc4NWQ2ZmY5NzY1ZTNlMzdhZWRjZmYxZGVjNGJhIiwic2hhM18yNTYiOiI0YjA0YjE1NTRmMzRkYTlmMjBmZDczM2IzNDg4NjE0ZWNhM2IwOWU1OTJjOGJlMmM0NjA1NjYyMWU0MjJmZDllIiwic2hhM18zODQiOiI1NjMwYjM2OGQ4MGM1YmM5MTgzM2VmNWM2YWUzOTJhNDE4NTNjYmM2MWJiNTI4ZDE4YWM1OWFjZGZiZWU1YThkMWMyZDE4MTM1ZGI2ZWQ2OTJlODFkZThmYTM3MzkxN2MiLCJzaGEzXzUxMiI6IjA2ODg4MGE1MmNiNDkzODYwZDhjOTVhOTFhZGFmZTYwZGYxODc2ZDhjYjFhNmI3NTU2ZjJjM2Y1NjFmMGYwZjMyZjZhYTA1YmVmN2FhYjQ5OWEwNTM0Zjk0Njc4MDEzODlmNDc0ODFiNzcxMjdjMDFiOGFhOTY4NGJhZGUzYmY2Iiwic2hha2VfMTI4IjoiODlmYTdjNDcwNGI4NGZkMWQ1M2E0MTBlN2ZjMzU3NWRhNmUxMGU1YzkzMjM1NWYyZWEyMWM4NDVhZDBlM2UxOCIsInNoYWtlXzI1NiI6IjE4NGNlMWY2NjdmYmIyODA5NWJhZmVkZTQzNTUzZjhkYzBhNGY1MDQwYWJlMjcxMzkzMzcwNDEyZWFiZTg0ZGJhNjI0Y2ZiZWE4YzUxZDU2YzkwMTM2Mjg2ODgyZmQ0Y2E3MzA3NzZjNWUzODFlYzI5MWYxYTczOTE1MDkyMTFmIn0K", + "eyJibGFrZTNfbXVsdGkiOiJhYjA2YjNmMDliNTExOTAzMTMzMzY5NDE2MTc4ZDk2ZjlkYTc3ZGEwOTgyNDJmN2VlMTVjNTNhNTRkMDZhNWVmIiwiYmxha2UzX3NpbmdsZSI6ImFiMDZiM2YwOWI1MTE5MDMxMzMzNjk0MTYxNzhkOTZmOWRhNzdkYTA5ODI0MmY3ZWUxNWM1M2E1NGQwNmE1ZWYiLCJyYW5kb20iOiJhNDQxYjE1ZmU5YTNjZjU2NjYxMTkwYTBiOTNiOWRlYzdkMDQxMjcyODhjYzg3MjUwOTY3Y2YzYjUyODk0ZDExIiwibWQ1IjoiZWY0MjcxYjU3NTQwMjU4NGQ2OTI5ZWJkMGI3Nzk5NzYiLCJzaGExIjoiMzgzNzliYWQzZjZiZjc4MmM4OTgzOGY3YWVkMzRkNDNkMzNlYWM2MSIsInNoYTIyNCI6ImQ5ZDNiMjJkYmZlY2M1NTdlODAzNjg5M2M3ZWE0N2I0NTQzYzM2NzZhMDk4NzMxMzRhNjQ0OWEwIiwic2hhMjU2IjoiMjYxZGI3NmJlMGYxMzdlZWJkYmI5OGRlYWM0ZjcyMDdiOGUxMjdiY2MyZmMwODI5OGVjZDczYjQ3MjYxNjQ1NiIsInNoYTM4NCI6IjMzMjkwYWQxYjlhMmRkYmU0ODY3MWZiMTIxNDdiZWJhNjI4MjA1MDcwY2VkNjNiZTFmNGU5YWRhMjgwYWU2ZjZjNDkzYTY2MDllMGQ2YTIzMWU2ODU5ZmIyNGZhM2FjMCIsInNoYTUxMiI6IjAzMDZhMWI1NmNiYTdjNjJiNTNmNTk4MTAwMTQ3MDQ5ODBhNGRmZTdjZjQ5NTU4ZmMyMmQxZDczZDc5NzJmZTllODk2ZWRjMmEyYTQxYWVjNjRjZjkwZGUwYjI1NGM0MDBlZTU1YzcwZjk3OGVlMzk5NmM2YzhkNTBjYTI4YTdiIiwiYmxha2UyYiI6IjY1MDZhMDg1YWQ5MGZkZjk2NGJmMGE5NTFkZmVkMTllZTc0NGVjY2EyODQzZjQzYTI5NmFjZDM0M2RiODhhMDNlNTlkNmFmMGM1YWJkNTEzMzc4MTQ5Yjg3OTExMTVmODRmMDIyZWM1M2JmNGFjNDZhZDczNWIwMmJlYTM0MDk5IiwiYmxha2UycyI6IjdlZDQ3ZWQxOTg3MTk0YWFmNGIwMjQ3MWFkNTMyMmY3NTE3ZjI0OTcwMDc2Y2NmNDkzMWI0MzYxMDU1NzBlNDAiLCJzaGEzXzIyNCI6Ijk2MGM4MDExOTlhMGUzYWExNjdiNmU2MWVkMzE2ZDUzMDM2Yjk4M2UyOThkNWI5MjZmMDc3NDlhIiwic2hhM18yNTYiOiIzYzdmYWE1ZDE3Zjk2MGYxOTI2ZjNlNGIyZjc1ZjdiOWIyZDQ4NGFhNmEwM2ViOWNlMTI4NmM2OTE2YWEyM2RlIiwic2hhM18zODQiOiI5Y2Y0NDA1NWFjYzFlYjZmMDY1YjRjODcxYTYzNTM1MGE1ZjY0ODQwM2YwYTU0MWEzYzZhNjI3N2ViZjZmYTNjYmM1YmJiNjQwMDE4OGFlMWIxMTI2OGZmMDJiMzYzZDUiLCJzaGEzXzUxMiI6ImEyZDk3ZDRlYjYxM2UwZDViYTc2OTk2MzE2MzcxOGEwNDIxZDkxNTNiNjllYjM5MDRmZjI4ODRhZDdjNGJiYmIwNGY2Nzc1OTA1YmQxNGI2NTJmZTQ1Njg0YmI5MTQ3ZjBkYWViZjAxZjIzY2MzZDhkMjIzMTE0MGUzNjI4NTE5Iiwic2hha2VfMTI4IjoiNjkwMWMwYjg1MTg5ZTkyNTJiODI3MTc5NjE2MjRlMTM0MDQ1ZjlkMmI5MzM0MzVkM2Y0OThiZWIyN2Q3N2JiNSIsInNoYWtlXzI1NiI6ImIwMjA4ZTFkNDVjZWI0ODdiZDUwNzk3MWJiNWI3MjdjN2UyYmE3ZDliNWM2ZTEyYWE5YTNhOTY5YzcyNDRjODIwZDcyNDY1ODhlZWU3Yjk4ZWM1NzhjZWIxNjc3OTkxODljMWRkMmZkMmZmYWM4MWExZDAzZDFiNjMxOGRkMjBiIn0K", ] From fbc5a8ec6554ff9b5c375122e1e99777bc4d3f47 Mon Sep 17 00:00:00 2001 From: Brandon Rising Date: Tue, 18 Jun 2024 09:38:22 -0400 Subject: [PATCH 18/24] Ignore validation on improperly formatted hashes (pytest) --- invokeai/backend/model_hash/hash_validator.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/invokeai/backend/model_hash/hash_validator.py b/invokeai/backend/model_hash/hash_validator.py index f0580e00dd..2064b74a92 100644 --- a/invokeai/backend/model_hash/hash_validator.py +++ b/invokeai/backend/model_hash/hash_validator.py @@ -3,6 +3,8 @@ from base64 import b64decode def validate_hash(hash: str): + if not ":" in hash: + return for enc_hash in hashes: alg, hash_ = hash.split(":") if alg == "blake3": From 63a7e19dbfd2d74a5939e7e9b077cf3051d63cec Mon Sep 17 00:00:00 2001 From: Brandon Rising Date: Tue, 18 Jun 2024 09:40:01 -0400 Subject: [PATCH 19/24] Run ruff --- invokeai/backend/model_hash/hash_validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/backend/model_hash/hash_validator.py b/invokeai/backend/model_hash/hash_validator.py index 2064b74a92..8c38788514 100644 --- a/invokeai/backend/model_hash/hash_validator.py +++ b/invokeai/backend/model_hash/hash_validator.py @@ -3,7 +3,7 @@ from base64 import b64decode def validate_hash(hash: str): - if not ":" in hash: + if ":" not in hash: return for enc_hash in hashes: alg, hash_ = hash.split(":") From d13aafb5146781539bd88e96f9b883d86da12dff Mon Sep 17 00:00:00 2001 From: Ryan Dick Date: Thu, 6 Jun 2024 09:30:49 -0400 Subject: [PATCH 20/24] Tidy denoise_latents.py imports to all use absolute import paths. --- invokeai/app/invocations/denoise_latents.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/invokeai/app/invocations/denoise_latents.py b/invokeai/app/invocations/denoise_latents.py index 7260fcb168..41e57ec63e 100644 --- a/invokeai/app/invocations/denoise_latents.py +++ b/invokeai/app/invocations/denoise_latents.py @@ -16,7 +16,9 @@ from pydantic import field_validator from torchvision.transforms.functional import resize as tv_resize from transformers import CLIPVisionModelWithProjection +from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation from invokeai.app.invocations.constants import LATENT_SCALE_FACTOR, SCHEDULER_NAME_VALUES +from invokeai.app.invocations.controlnet_image_processors import ControlField from invokeai.app.invocations.fields import ( ConditioningField, DenoiseMaskField, @@ -27,6 +29,7 @@ from invokeai.app.invocations.fields import ( UIType, ) from invokeai.app.invocations.ip_adapter import IPAdapterField +from invokeai.app.invocations.model import ModelIdentifierField, UNetField from invokeai.app.invocations.primitives import LatentsOutput from invokeai.app.invocations.t2i_adapter import T2IAdapterField from invokeai.app.services.shared.invocation_context import InvocationContext @@ -36,6 +39,11 @@ from invokeai.backend.lora import LoRAModelRaw from invokeai.backend.model_manager import BaseModelType from invokeai.backend.model_patcher import ModelPatcher from invokeai.backend.stable_diffusion import PipelineIntermediateState, set_seamless +from invokeai.backend.stable_diffusion.diffusers_pipeline import ( + ControlNetData, + StableDiffusionGeneratorPipeline, + T2IAdapterData, +) from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ( BasicConditioningInfo, IPAdapterConditioningInfo, @@ -45,20 +53,11 @@ from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ( TextConditioningData, TextConditioningRegions, ) +from invokeai.backend.stable_diffusion.schedulers import SCHEDULER_MAP +from invokeai.backend.util.devices import TorchDevice from invokeai.backend.util.mask import to_standard_float_mask from invokeai.backend.util.silence_warnings import SilenceWarnings -from ...backend.stable_diffusion.diffusers_pipeline import ( - ControlNetData, - StableDiffusionGeneratorPipeline, - T2IAdapterData, -) -from ...backend.stable_diffusion.schedulers import SCHEDULER_MAP -from ...backend.util.devices import TorchDevice -from .baseinvocation import BaseInvocation, invocation -from .controlnet_image_processors import ControlField -from .model import ModelIdentifierField, UNetField - def get_scheduler( context: InvocationContext, From 8e47e005a7e2cd404656558b2a27d3f3b14d7f08 Mon Sep 17 00:00:00 2001 From: Ryan Dick Date: Thu, 6 Jun 2024 10:28:00 -0400 Subject: [PATCH 21/24] Tidy SilenceWarnings context manager: - Fix type errors - Enable SilenceWarnings to be used as both a context manager and a decorator - Remove duplicate implementation - Check the initial verbosity on __enter__() rather than __init__() --- invokeai/backend/model_manager/probe.py | 2 +- invokeai/backend/util/silence_warnings.py | 33 ++++++++++++++--------- invokeai/backend/util/util.py | 21 --------------- 3 files changed, 21 insertions(+), 35 deletions(-) diff --git a/invokeai/backend/model_manager/probe.py b/invokeai/backend/model_manager/probe.py index 8f33e4b49f..4aef281bac 100644 --- a/invokeai/backend/model_manager/probe.py +++ b/invokeai/backend/model_manager/probe.py @@ -10,7 +10,7 @@ from picklescan.scanner import scan_file_path import invokeai.backend.util.logging as logger from invokeai.app.util.misc import uuid_string from invokeai.backend.model_hash.model_hash import HASHING_ALGORITHMS, ModelHash -from invokeai.backend.util.util import SilenceWarnings +from invokeai.backend.util.silence_warnings import SilenceWarnings from .config import ( AnyModelConfig, diff --git a/invokeai/backend/util/silence_warnings.py b/invokeai/backend/util/silence_warnings.py index 4c566ba759..0cd6d0738d 100644 --- a/invokeai/backend/util/silence_warnings.py +++ b/invokeai/backend/util/silence_warnings.py @@ -1,29 +1,36 @@ -"""Context class to silence transformers and diffusers warnings.""" - import warnings -from typing import Any +from contextlib import ContextDecorator -from diffusers import logging as diffusers_logging +from diffusers.utils import logging as diffusers_logging from transformers import logging as transformers_logging -class SilenceWarnings(object): - """Use in context to temporarily turn off warnings from transformers & diffusers modules. +# Inherit from ContextDecorator to allow using SilenceWarnings as both a context manager and a decorator. +class SilenceWarnings(ContextDecorator): + """A context manager that disables warnings from transformers & diffusers modules while active. + As context manager: + ``` with SilenceWarnings(): # do something + ``` + + As decorator: + ``` + @SilenceWarnings() + def some_function(): + # do something + ``` """ - def __init__(self) -> None: - self.transformers_verbosity = transformers_logging.get_verbosity() - self.diffusers_verbosity = diffusers_logging.get_verbosity() - def __enter__(self) -> None: + self._transformers_verbosity = transformers_logging.get_verbosity() + self._diffusers_verbosity = diffusers_logging.get_verbosity() transformers_logging.set_verbosity_error() diffusers_logging.set_verbosity_error() warnings.simplefilter("ignore") - def __exit__(self, *args: Any) -> None: - transformers_logging.set_verbosity(self.transformers_verbosity) - diffusers_logging.set_verbosity(self.diffusers_verbosity) + def __exit__(self, *args) -> None: + transformers_logging.set_verbosity(self._transformers_verbosity) + diffusers_logging.set_verbosity(self._diffusers_verbosity) warnings.simplefilter("default") diff --git a/invokeai/backend/util/util.py b/invokeai/backend/util/util.py index 1ee89dcc66..b3466ddba9 100644 --- a/invokeai/backend/util/util.py +++ b/invokeai/backend/util/util.py @@ -3,12 +3,9 @@ import io import os import re import unicodedata -import warnings from pathlib import Path -from diffusers import logging as diffusers_logging from PIL import Image -from transformers import logging as transformers_logging # actual size of a gig GIG = 1073741824 @@ -80,21 +77,3 @@ class Chdir(object): def __exit__(self, *args): os.chdir(self.original) - - -class SilenceWarnings(object): - """Context manager to temporarily lower verbosity of diffusers & transformers warning messages.""" - - def __enter__(self): - """Set verbosity to error.""" - self.transformers_verbosity = transformers_logging.get_verbosity() - self.diffusers_verbosity = diffusers_logging.get_verbosity() - transformers_logging.set_verbosity_error() - diffusers_logging.set_verbosity_error() - warnings.simplefilter("ignore") - - def __exit__(self, type, value, traceback): - """Restore logger verbosity to state before context was entered.""" - transformers_logging.set_verbosity(self.transformers_verbosity) - diffusers_logging.set_verbosity(self.diffusers_verbosity) - warnings.simplefilter("default") From 79ceac2f828e9410be6d2ed0681d9a681eba5d77 Mon Sep 17 00:00:00 2001 From: Ryan Dick Date: Thu, 6 Jun 2024 10:40:19 -0400 Subject: [PATCH 22/24] (minor) Use SilenceWarnings as a decorator rather than a context manager to save an indentation level. --- invokeai/app/invocations/denoise_latents.py | 274 ++++++++++---------- 1 file changed, 137 insertions(+), 137 deletions(-) diff --git a/invokeai/app/invocations/denoise_latents.py b/invokeai/app/invocations/denoise_latents.py index 41e57ec63e..e94daf70bd 100644 --- a/invokeai/app/invocations/denoise_latents.py +++ b/invokeai/app/invocations/denoise_latents.py @@ -657,155 +657,155 @@ class DenoiseLatentsInvocation(BaseInvocation): return 1 - mask, masked_latents, self.denoise_mask.gradient @torch.no_grad() + @SilenceWarnings() # This quenches the NSFW nag from diffusers. def invoke(self, context: InvocationContext) -> LatentsOutput: - with SilenceWarnings(): # this quenches NSFW nag from diffusers - seed = None - noise = None - if self.noise is not None: - noise = context.tensors.load(self.noise.latents_name) - seed = self.noise.seed - - if self.latents is not None: - latents = context.tensors.load(self.latents.latents_name) - if seed is None: - seed = self.latents.seed - - if noise is not None and noise.shape[1:] != latents.shape[1:]: - raise Exception(f"Incompatable 'noise' and 'latents' shapes: {latents.shape=} {noise.shape=}") - - elif noise is not None: - latents = torch.zeros_like(noise) - else: - raise Exception("'latents' or 'noise' must be provided!") + seed = None + noise = None + if self.noise is not None: + noise = context.tensors.load(self.noise.latents_name) + seed = self.noise.seed + if self.latents is not None: + latents = context.tensors.load(self.latents.latents_name) if seed is None: - seed = 0 + seed = self.latents.seed - mask, masked_latents, gradient_mask = self.prep_inpaint_mask(context, latents) + if noise is not None and noise.shape[1:] != latents.shape[1:]: + raise Exception(f"Incompatable 'noise' and 'latents' shapes: {latents.shape=} {noise.shape=}") - # TODO(ryand): I have hard-coded `do_classifier_free_guidance=True` to mirror the behaviour of ControlNets, - # below. Investigate whether this is appropriate. - t2i_adapter_data = self.run_t2i_adapters( - context, - self.t2i_adapter, - latents.shape, - do_classifier_free_guidance=True, + elif noise is not None: + latents = torch.zeros_like(noise) + else: + raise Exception("'latents' or 'noise' must be provided!") + + if seed is None: + seed = 0 + + mask, masked_latents, gradient_mask = self.prep_inpaint_mask(context, latents) + + # TODO(ryand): I have hard-coded `do_classifier_free_guidance=True` to mirror the behaviour of ControlNets, + # below. Investigate whether this is appropriate. + t2i_adapter_data = self.run_t2i_adapters( + context, + self.t2i_adapter, + latents.shape, + do_classifier_free_guidance=True, + ) + + ip_adapters: List[IPAdapterField] = [] + if self.ip_adapter is not None: + # ip_adapter could be a list or a single IPAdapterField. Normalize to a list here. + if isinstance(self.ip_adapter, list): + ip_adapters = self.ip_adapter + else: + ip_adapters = [self.ip_adapter] + + # If there are IP adapters, the following line runs the adapters' CLIPVision image encoders to return + # a series of image conditioning embeddings. This is being done here rather than in the + # big model context below in order to use less VRAM on low-VRAM systems. + # The image prompts are then passed to prep_ip_adapter_data(). + image_prompts = self.prep_ip_adapter_image_prompts(context=context, ip_adapters=ip_adapters) + + # get the unet's config so that we can pass the base to dispatch_progress() + unet_config = context.models.get_config(self.unet.unet.key) + + def step_callback(state: PipelineIntermediateState) -> None: + context.util.sd_step_callback(state, unet_config.base) + + def _lora_loader() -> Iterator[Tuple[LoRAModelRaw, float]]: + for lora in self.unet.loras: + lora_info = context.models.load(lora.lora) + assert isinstance(lora_info.model, LoRAModelRaw) + yield (lora_info.model, lora.weight) + del lora_info + return + + unet_info = context.models.load(self.unet.unet) + assert isinstance(unet_info.model, UNet2DConditionModel) + with ( + ExitStack() as exit_stack, + unet_info.model_on_device() as (model_state_dict, unet), + ModelPatcher.apply_freeu(unet, self.unet.freeu_config), + set_seamless(unet, self.unet.seamless_axes), # FIXME + # Apply the LoRA after unet has been moved to its target device for faster patching. + ModelPatcher.apply_lora_unet( + unet, + loras=_lora_loader(), + model_state_dict=model_state_dict, + ), + ): + assert isinstance(unet, UNet2DConditionModel) + latents = latents.to(device=unet.device, dtype=unet.dtype) + if noise is not None: + noise = noise.to(device=unet.device, dtype=unet.dtype) + if mask is not None: + mask = mask.to(device=unet.device, dtype=unet.dtype) + if masked_latents is not None: + masked_latents = masked_latents.to(device=unet.device, dtype=unet.dtype) + + scheduler = get_scheduler( + context=context, + scheduler_info=self.unet.scheduler, + scheduler_name=self.scheduler, + seed=seed, ) - ip_adapters: List[IPAdapterField] = [] - if self.ip_adapter is not None: - # ip_adapter could be a list or a single IPAdapterField. Normalize to a list here. - if isinstance(self.ip_adapter, list): - ip_adapters = self.ip_adapter - else: - ip_adapters = [self.ip_adapter] + pipeline = self.create_pipeline(unet, scheduler) - # If there are IP adapters, the following line runs the adapters' CLIPVision image encoders to return - # a series of image conditioning embeddings. This is being done here rather than in the - # big model context below in order to use less VRAM on low-VRAM systems. - # The image prompts are then passed to prep_ip_adapter_data(). - image_prompts = self.prep_ip_adapter_image_prompts(context=context, ip_adapters=ip_adapters) + _, _, latent_height, latent_width = latents.shape + conditioning_data = self.get_conditioning_data( + context=context, unet=unet, latent_height=latent_height, latent_width=latent_width + ) - # get the unet's config so that we can pass the base to dispatch_progress() - unet_config = context.models.get_config(self.unet.unet.key) + controlnet_data = self.prep_control_data( + context=context, + control_input=self.control, + latents_shape=latents.shape, + # do_classifier_free_guidance=(self.cfg_scale >= 1.0)) + do_classifier_free_guidance=True, + exit_stack=exit_stack, + ) - def step_callback(state: PipelineIntermediateState) -> None: - context.util.sd_step_callback(state, unet_config.base) + ip_adapter_data = self.prep_ip_adapter_data( + context=context, + ip_adapters=ip_adapters, + image_prompts=image_prompts, + exit_stack=exit_stack, + latent_height=latent_height, + latent_width=latent_width, + dtype=unet.dtype, + ) - def _lora_loader() -> Iterator[Tuple[LoRAModelRaw, float]]: - for lora in self.unet.loras: - lora_info = context.models.load(lora.lora) - assert isinstance(lora_info.model, LoRAModelRaw) - yield (lora_info.model, lora.weight) - del lora_info - return + num_inference_steps, timesteps, init_timestep, scheduler_step_kwargs = self.init_scheduler( + scheduler, + device=unet.device, + steps=self.steps, + denoising_start=self.denoising_start, + denoising_end=self.denoising_end, + seed=seed, + ) - unet_info = context.models.load(self.unet.unet) - assert isinstance(unet_info.model, UNet2DConditionModel) - with ( - ExitStack() as exit_stack, - unet_info.model_on_device() as (model_state_dict, unet), - ModelPatcher.apply_freeu(unet, self.unet.freeu_config), - set_seamless(unet, self.unet.seamless_axes), # FIXME - # Apply the LoRA after unet has been moved to its target device for faster patching. - ModelPatcher.apply_lora_unet( - unet, - loras=_lora_loader(), - model_state_dict=model_state_dict, - ), - ): - assert isinstance(unet, UNet2DConditionModel) - latents = latents.to(device=unet.device, dtype=unet.dtype) - if noise is not None: - noise = noise.to(device=unet.device, dtype=unet.dtype) - if mask is not None: - mask = mask.to(device=unet.device, dtype=unet.dtype) - if masked_latents is not None: - masked_latents = masked_latents.to(device=unet.device, dtype=unet.dtype) + result_latents = pipeline.latents_from_embeddings( + latents=latents, + timesteps=timesteps, + init_timestep=init_timestep, + noise=noise, + seed=seed, + mask=mask, + masked_latents=masked_latents, + gradient_mask=gradient_mask, + num_inference_steps=num_inference_steps, + scheduler_step_kwargs=scheduler_step_kwargs, + conditioning_data=conditioning_data, + control_data=controlnet_data, + ip_adapter_data=ip_adapter_data, + t2i_adapter_data=t2i_adapter_data, + callback=step_callback, + ) - scheduler = get_scheduler( - context=context, - scheduler_info=self.unet.scheduler, - scheduler_name=self.scheduler, - seed=seed, - ) + # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 + result_latents = result_latents.to("cpu") + TorchDevice.empty_cache() - pipeline = self.create_pipeline(unet, scheduler) - - _, _, latent_height, latent_width = latents.shape - conditioning_data = self.get_conditioning_data( - context=context, unet=unet, latent_height=latent_height, latent_width=latent_width - ) - - controlnet_data = self.prep_control_data( - context=context, - control_input=self.control, - latents_shape=latents.shape, - # do_classifier_free_guidance=(self.cfg_scale >= 1.0)) - do_classifier_free_guidance=True, - exit_stack=exit_stack, - ) - - ip_adapter_data = self.prep_ip_adapter_data( - context=context, - ip_adapters=ip_adapters, - image_prompts=image_prompts, - exit_stack=exit_stack, - latent_height=latent_height, - latent_width=latent_width, - dtype=unet.dtype, - ) - - num_inference_steps, timesteps, init_timestep, scheduler_step_kwargs = self.init_scheduler( - scheduler, - device=unet.device, - steps=self.steps, - denoising_start=self.denoising_start, - denoising_end=self.denoising_end, - seed=seed, - ) - - result_latents = pipeline.latents_from_embeddings( - latents=latents, - timesteps=timesteps, - init_timestep=init_timestep, - noise=noise, - seed=seed, - mask=mask, - masked_latents=masked_latents, - gradient_mask=gradient_mask, - num_inference_steps=num_inference_steps, - scheduler_step_kwargs=scheduler_step_kwargs, - conditioning_data=conditioning_data, - control_data=controlnet_data, - ip_adapter_data=ip_adapter_data, - t2i_adapter_data=t2i_adapter_data, - callback=step_callback, - ) - - # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 - result_latents = result_latents.to("cpu") - TorchDevice.empty_cache() - - name = context.tensors.save(tensor=result_latents) + name = context.tensors.save(tensor=result_latents) return LatentsOutput.build(latents_name=name, latents=result_latents, seed=None) From a43d602f16b41c3023fa9556205af8173345f58b Mon Sep 17 00:00:00 2001 From: steffylo Date: Wed, 19 Jun 2024 05:32:13 +0800 Subject: [PATCH 23/24] fix(queue): add clear_queue_on_startup config to clear problematic queues --- invokeai/app/services/config/config_default.py | 2 ++ .../services/session_queue/session_queue_sqlite.py | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/invokeai/app/services/config/config_default.py b/invokeai/app/services/config/config_default.py index 496988e853..1dc75add1d 100644 --- a/invokeai/app/services/config/config_default.py +++ b/invokeai/app/services/config/config_default.py @@ -113,6 +113,7 @@ class InvokeAIAppConfig(BaseSettings): force_tiled_decode: Whether to enable tiled VAE decode (reduces memory consumption with some performance penalty). pil_compress_level: The compress_level setting of PIL.Image.save(), used for PNG encoding. All settings are lossless. 0 = no compression, 1 = fastest with slightly larger filesize, 9 = slowest with smallest filesize. 1 is typically the best setting. max_queue_size: Maximum number of items in the session queue. + clear_queue_on_startup: Empties session queue on startup. allow_nodes: List of nodes to allow. Omit to allow all. deny_nodes: List of nodes to deny. Omit to deny none. node_cache_size: How many cached nodes to keep in memory. @@ -186,6 +187,7 @@ class InvokeAIAppConfig(BaseSettings): force_tiled_decode: bool = Field(default=False, description="Whether to enable tiled VAE decode (reduces memory consumption with some performance penalty).") pil_compress_level: int = Field(default=1, description="The compress_level setting of PIL.Image.save(), used for PNG encoding. All settings are lossless. 0 = no compression, 1 = fastest with slightly larger filesize, 9 = slowest with smallest filesize. 1 is typically the best setting.") max_queue_size: int = Field(default=10000, gt=0, description="Maximum number of items in the session queue.") + clear_queue_on_startup: bool = Field(default=False, description="Empties session queue on startup.") # NODES allow_nodes: Optional[list[str]] = Field(default=None, description="List of nodes to allow. Omit to allow all.") diff --git a/invokeai/app/services/session_queue/session_queue_sqlite.py b/invokeai/app/services/session_queue/session_queue_sqlite.py index 467853aae4..a3a7004c94 100644 --- a/invokeai/app/services/session_queue/session_queue_sqlite.py +++ b/invokeai/app/services/session_queue/session_queue_sqlite.py @@ -37,10 +37,14 @@ class SqliteSessionQueue(SessionQueueBase): def start(self, invoker: Invoker) -> None: self.__invoker = invoker self._set_in_progress_to_canceled() - prune_result = self.prune(DEFAULT_QUEUE_ID) - - if prune_result.deleted > 0: - self.__invoker.services.logger.info(f"Pruned {prune_result.deleted} finished queue items") + if self.__invoker.services.configuration.clear_queue_on_startup: + clear_result = self.clear(DEFAULT_QUEUE_ID) + if clear_result.deleted > 0: + self.__invoker.services.logger.info(f"Cleared all {clear_result.deleted} queue items") + else: + prune_result = self.prune(DEFAULT_QUEUE_ID) + if prune_result.deleted > 0: + self.__invoker.services.logger.info(f"Pruned {prune_result.deleted} finished queue items") def __init__(self, db: SqliteDatabase) -> None: super().__init__() From b03073d888b5f8cd77a119a4d8612c235c480859 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 19 Jun 2024 22:57:27 -0400 Subject: [PATCH 24/24] [MM] Add support for probing and loading SDXL VAE checkpoint files (#6524) * add support for probing and loading SDXL VAE checkpoint files * broaden regexp probe for SDXL VAEs --------- Co-authored-by: Lincoln Stein --- .../backend/model_manager/load/model_loaders/vae.py | 11 +++-------- invokeai/backend/model_manager/probe.py | 12 ++++++++++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/invokeai/backend/model_manager/load/model_loaders/vae.py b/invokeai/backend/model_manager/load/model_loaders/vae.py index 122b2f0797..f51c551f09 100644 --- a/invokeai/backend/model_manager/load/model_loaders/vae.py +++ b/invokeai/backend/model_manager/load/model_loaders/vae.py @@ -22,8 +22,7 @@ from .generic_diffusers import GenericDiffusersLoader @ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.VAE, format=ModelFormat.Diffusers) -@ModelLoaderRegistry.register(base=BaseModelType.StableDiffusion1, type=ModelType.VAE, format=ModelFormat.Checkpoint) -@ModelLoaderRegistry.register(base=BaseModelType.StableDiffusion2, type=ModelType.VAE, format=ModelFormat.Checkpoint) +@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.VAE, format=ModelFormat.Checkpoint) class VAELoader(GenericDiffusersLoader): """Class to load VAE models.""" @@ -40,12 +39,8 @@ class VAELoader(GenericDiffusersLoader): return True def _convert_model(self, config: AnyModelConfig, model_path: Path, output_path: Optional[Path] = None) -> AnyModel: - # TODO(MM2): check whether sdxl VAE models convert. - if config.base not in {BaseModelType.StableDiffusion1, BaseModelType.StableDiffusion2}: - raise Exception(f"VAE conversion not supported for model type: {config.base}") - else: - assert isinstance(config, CheckpointConfigBase) - config_file = self._app_config.legacy_conf_path / config.config_path + assert isinstance(config, CheckpointConfigBase) + config_file = self._app_config.legacy_conf_path / config.config_path if model_path.suffix == ".safetensors": checkpoint = safetensors_load_file(model_path, device="cpu") diff --git a/invokeai/backend/model_manager/probe.py b/invokeai/backend/model_manager/probe.py index 4aef281bac..a19a772764 100644 --- a/invokeai/backend/model_manager/probe.py +++ b/invokeai/backend/model_manager/probe.py @@ -451,8 +451,16 @@ class PipelineCheckpointProbe(CheckpointProbeBase): class VaeCheckpointProbe(CheckpointProbeBase): def get_base_type(self) -> BaseModelType: - # I can't find any standalone 2.X VAEs to test with! - return BaseModelType.StableDiffusion1 + # VAEs of all base types have the same structure, so we wimp out and + # guess using the name. + for regexp, basetype in [ + (r"xl", BaseModelType.StableDiffusionXL), + (r"sd2", BaseModelType.StableDiffusion2), + (r"vae", BaseModelType.StableDiffusion1), + ]: + if re.search(regexp, self.model_path.name, re.IGNORECASE): + return basetype + raise InvalidModelConfigException("Cannot determine base type") class LoRACheckpointProbe(CheckpointProbeBase):