diff --git a/.gitignore b/.gitignore
index 9b59054b2..4643ffaf2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,5 @@ playground.ipynb
composer-notebooks/playground.ipynb
*model_dir/
commit.sh
+test_env/
+release_env
diff --git a/Dockerfile b/Dockerfile
index 5886321da..b3b10e50d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -17,7 +17,7 @@ COPY ./biosimulator_processes /app/biosimulator_processes
COPY composer-notebooks /app/notebooks
# copy files
-COPY ./pyproject.toml ./poetry.lock ./data ./scripts/trust-notebooks.sh /app/
+COPY toml ./poetry.lock ./data ./scripts/trust-notebooks.sh /app/
COPY ./scripts/enter-lab.sh /usr/local/bin/enter-lab.sh
# COPY ./scripts/xvfb-startup.sh /xvfb-startup.sh
diff --git a/README.md b/README.md
index 1ab51644a..abf1226d1 100644
--- a/README.md
+++ b/README.md
@@ -89,4 +89,4 @@ TODO: copy this from the prompter demo
### A NOTE FOR DEVELOPERS:
This tooling implements version control for dynamically-created composite containers through
`poetry`. The version control for content on the Python Package Index is performed by
-`setup.py`.
+`setup.py`. Also, the PyTest configuration resides within `./pyproject.toml` at the root of this repository.
diff --git a/poetry.lock b/_lock
similarity index 100%
rename from poetry.lock
rename to _lock
diff --git a/biolab/__init__.py b/biolab/__init__.py
deleted file mode 100644
index 4be39b233..000000000
--- a/biolab/__init__.py
+++ /dev/null
@@ -1,39 +0,0 @@
-from biolab.biolab_data_model import (
- TimeCourseProcess,
- TimeCourseModelChanges,
- TimeCourseModel,
- ModelChanges,
- ModelChange,
- SteadyStateModel,
- SpatialModel,
- Experiment,
- ExperimentMetadata,
- SimulationModelParameter,
- SimulationResult,
- SedModel,
- SpeciesChange,
- GlobalParameterChange,
- ReactionChange,
- ReactionParameter,
- ModelUnits
-)
-
-
-'''class SedDataModel:
- TimeCourseModel = TimeCourseModel
- TimeCourseModelChanges = TimeCourseModelChanges
- ModelChanges = ModelChanges
- ModelChange = ModelChange
- TimeCourseProcess = TimeCourseProcess
- SteadyStateModel = SteadyStateModel
- SpatialModel = SpatialModel
- ExperimentMetadata = ExperimentMetadata
- Experiment = Experiment
- SimulationResult = SimulationResult
- SimulationModelParameter = SimulationModelParameter
- SedModel = SedModel
- SpeciesChange = SpeciesChange
- GlobalParameterChange = GlobalParameterChange
- ReactionParameter = ReactionParameter
- ReactionChange = ReactionChange
- ModelUnits = ModelUnits'''
diff --git a/biolab/biolab_data_model.py b/biolab/biolab_data_model.py
deleted file mode 100644
index eeadf9cb7..000000000
--- a/biolab/biolab_data_model.py
+++ /dev/null
@@ -1,468 +0,0 @@
-"""Data Model for the highest-level BioBuilder API
-
-author: Alex Patrie < alexanderpatrie@gmail.com >
-license: Apache 2.0
-created: 03/2024
-"""
-
-
-from typing import Dict, List, Union, Tuple, Optional, Any
-from types import NoneType
-from dataclasses import dataclass, asdict
-from abc import ABC, abstractmethod
-from pydantic import (
- BaseModel as _BaseModel,
- field_validator,
- field_serializer,
- Field,
- ConfigDict,
- create_model,
- ValidationError
-)
-
-
-@dataclass
-class _BaseClass:
- def to_dict(self):
- return asdict(self)
-
-
-@dataclass
-class SimulationModelParameter(_BaseClass):
- """
- Attributes:
- name:`str`
- feature:`str`
- value:`Union[float, int, str]`
- scope:`str`
- """
- name: str
- value: Union[float, int, str]
- feature: str
- scope: str = None
-
-
-# TODO: what could this specific name be? Are these changes etc, unique to Time Course / '2d' simulation?
-@dataclass
-class SpeciesChange(_BaseClass): # <-- this is done like set_species('B', kwarg=) where the inner most keys are the kwargs
- species_name: str
- unit: Union[str, NoneType, SimulationModelParameter] = None
- initial_concentration: Optional[Union[float, SimulationModelParameter]] = None
- initial_particle_number: Optional[Union[float, NoneType, SimulationModelParameter]] = None
- initial_expression: Union[str, NoneType, SimulationModelParameter] = None
- expression: Union[str, NoneType, SimulationModelParameter] = None
-
-
-@dataclass
-class GlobalParameterChange(_BaseClass): # <-- this is done with set_parameters(PARAM, kwarg=). where the inner most keys are the kwargs
- parameter_name: str
- initial_value: Union[float, NoneType] = None
- initial_expression: Union[str, NoneType] = None
- expression: Union[str, NoneType] = None
- status: Union[str, NoneType] = None
- param_type: Union[str, NoneType] = None # ie: fixed, assignment, reactions, etc
-
-
-@dataclass
-class ReactionParameter(_BaseClass):
- parameter_name: str
- value: Union[float, int, str]
-
-
-@dataclass
-class ReactionChange(_BaseClass):
- """
- Attributes:
- reaction_name:`str`: name of the reaction you wish to change.
- parameter_changes:`List[ReactionParameter]`: list of parameters you want to change from
- `reaction_name`. Defaults to `[]`, which denotes no parameter changes.
-
- """
- reaction_name: str
- parameter_changes: List[ReactionParameter] = None
- reaction_scheme: Union[NoneType, str] = None
-
-
-@dataclass
-class TimeCourseModelChanges(_BaseClass):
- species_changes: List[SpeciesChange] = None
- global_parameter_changes: List[GlobalParameterChange] = None
- reaction_changes: List[ReactionChange] = None
-
-
-@dataclass
-class ModelSource(_BaseClass):
- value: str
-
- @abstractmethod
- def validate_source(self):
- pass
-
-
-@dataclass
-class BiomodelID(ModelSource):
- def __init__(self, value):
- super().__init__(value)
- self.validate_source()
-
- def validate_source(self):
- if 'BIO' not in self.value:
- raise AttributeError('You must pass a valid biomodel id.')
-
-
-@dataclass
-class ModelFilepath(ModelSource):
- def __init__(self, value):
- super().__init__(value)
- self.validate_source()
-
- def validate_source(self):
- if '/' not in self.value:
- raise AttributeError('You must pass a valid model path.')
-
-
-@dataclass
-class ModelChange(_BaseClass):
- name: str
- scope: str
- value: Dict
-
-
-@dataclass
-class ModelChanges(_BaseClass):
- species_changes: List[ModelChange] = None
- param_changes: List[ModelChange] = None
- reaction_changes: List[ModelChange] = None
-
-
-class ModelUnits:
- def __init__(self, **units_config):
- for k, v in units_config:
- self.__setattr__(k, v)
-
-
-@dataclass
-class SedModel(_BaseClass):
- """The data model declaration for process configuration schemas that support SED.
-
- Attributes:
- model_id: `str`
- model_source: `Union[biosimulator_processes.data_model.ModelFilepath, biosimulator_processes.data_model.BiomodelId]`
- model_language: `str`
- model_name: `str`
- model_changes: `biosimulator_processes.data_model.TimeCourseModelChanges`
- """
- model_source: Union[BiomodelID, ModelFilepath, str]
- model_id: str = None
- model_name: str = None
- model_language: str = 'sbml'
- model_changes: ModelChanges = None
- model_units: ModelUnits = None
-
- def set_id(self, model_id=None):
- if model_id is None:
- if isinstance(self.model_source, ModelFilepath) \
- or isinstance(self.model_source, str) and '/' in self.model_source:
- if isinstance(self.model_source, ModelFilepath):
- source = self.model_source.value
- else:
- source = self.model_source
- modId = source.split('/')[-1]
- elif isinstance(self.model_source, str):
- modId = self.model_source
- else:
- modId = self.model_source.value
- return f'model_from_{modId}'
- else:
- return model_id
-
- def set_name(self, name=None):
- if name is None:
- if self.model_id is not None:
- return self.model_id
- else:
- return 'Un-named model'
- else:
- return name
-
- def set_source(self):
- if isinstance(self.model_source, str):
- if 'BIOMD' in self.model_source.upper():
- self.model_source = BiomodelID(value=self.model_source)
- elif '/' in self.model_source:
- self.model_source = ModelFilepath(value=self.model_source)
- else:
- raise AttributeError('You must pass either a valid model filepath or valid Biomodel id.')
-
- def get_model_source_info(self, source: str, validator, **kwargs):
- """Currently only support BioModel id."""
- return validator(source, **kwargs)
-
- def get_biomodel_model_source_info(self, biomodel_id: Union[biolab.BiomodelID, str]) -> Dict:
- source_id = biomodel_id.value if isinstance(biomodel_id, biolab.BiomodelID) else biomodel_id
- return requests.get(
- url=f'https://www.ebi.ac.uk/biomodels/{source_idß}',
- headers={'accept': 'application/json'}).json()
-
- def set_model_source_info(self, **kwargs):
- """Currently only support biomodel id"""
- return self.get_biomodel_model_source_info(**kwargs)
-
-
-# TODO: Provide this model if 'CopasiProcess', etc is selected by the user in prompt.
-
-@dataclass
-class TimeCourseModel(SedModel):
- model_language: str = None,
- model_changes: TimeCourseModelChanges = None,
- model_units: ModelUnits = None
-
- def __init__(self,
- model_source: Union[BiomodelID, ModelFilepath, str],
- model_id=None,
- model_name=None):
- """Class which inherits SedModel."""
- super().__init__(model_source, model_id, model_name)
- # TODO: extract functionality for algorithms related to UTC sims
- self.model_id = self.set_id(model_id)
- self.model_name = self.set_name(model_name)
- self.set_source()
-
-
-class SteadyStateModel(SedModel):
- def __init__(self,
- model_source: Union[BiomodelID, ModelFilepath, str],
- model_id=None,
- model_name=None,
- model_language: str = None,
- model_changes: ModelChanges = None,
- model_units: ModelUnits = None):
- """Class which inherits SedModel. # TODO: expand this."""
- super().__init__(model_source, model_id, model_name, model_language, model_changes, model_units)
- self.model_id = self.set_id(model_id)
- self.model_name = self.set_name(model_name)
- self.set_source()
-
-
-class SpatialModel(SedModel):
- def __init__(self,
- model_source: Union[BiomodelID, ModelFilepath, str],
- model_id=None,
- model_name=None,
- model_language: str = None,
- model_changes: ModelChanges = None,
- model_units: ModelUnits = None):
- """Class which inherits SedModel. # TODO: expand this."""
- super().__init__(model_source, model_id, model_name, model_language, model_changes, model_units)
- self.model_id = self.set_id(model_id)
- self.model_name = self.set_name(model_name)
- self.set_source()
-
-
-@dataclass
-class TimeCourseProcess(_BaseClass):
- """Used as config for BioBuilder API"""
- model: SedModel
- method: str = 'lsoda'
-
-
-@dataclass
-class ExperimentMetadata(_BaseClass):
- def __init__(self):
- raise NotImplementedError('Please do not use this class yet. Thanks!')
-
-
-@dataclass
-class SimulationResult(_BaseClass):
- value: Dict[str, Any]
-
- def serialize(self):
- pass
-
-
-@dataclass
-class Experiment:
- """Consider this a 'simulation run'."""
- simulation_model: Union[TimeCourseModel, Dict[str, Any]] # where the theory/hypothesis lies. you're stating your biological case here.
- duration: Union[int, float] # one level above theory model. you're sure of your case and want to not tell but show it.
- results: Dict[str, Union[NoneType, SimulationResult]] = None # consider async
- name: str = None
- metadata: ExperimentMetadata = None
-
- def get_results(self, source: Any):
- return source.get('results', {})
-
- def set_results(self):
- source = None
- results = self.get_results(source)
- self.results = results
-
-
-def dynamic_process_config(name: str = None, config: Dict = None, **kwargs):
- config = config or {}
- config.update(kwargs)
- dynamic_config_types = {}
- for param_name, param_val in config.items():
- dynamic_config_types[param_name] = (type(param_val), ...)
-
- model_name = 'ProcessConfig'
- if name is not None:
- proc_name = name.replace(name[0], name[0].upper())
- dynamic_name = proc_name + model_name
- else:
- dynamic_name = model_name
-
- DynamicProcessConfig = create_model(__model_name=dynamic_name, **dynamic_config_types)
-
- return DynamicProcessConfig(**config)
-
-
-class Port(_BaseClass):
- value: Dict
-
-
-# --- INSTALLATION
-@dataclass
-class DependencyFile(_BaseClass):
- name: str
- hash: str
-
-
-@dataclass
-class InstallationDependency(_BaseClass):
- name: str
- version: str
- markers: str = Field(default='') # ie: "markers": "platform_system == \"Windows\""
- files: List[DependencyFile] = Field(default=[])
-
-
-@dataclass
-class Simulator(_BaseClass):
- name: str # name installed by pip
- version: str
- deps: List[InstallationDependency]
-
-
-class SedDataModel:
- TimeCourseModel = TimeCourseModel
- TimeCourseModelChanges = TimeCourseModelChanges
- ModelChanges = ModelChanges
- ModelChange = ModelChange
- TimeCourseProcess = TimeCourseProcess
- SteadyStateModel = SteadyStateModel
- SpatialModel = SpatialModel
- ExperimentMetadata = ExperimentMetadata
- Experiment = Experiment
- SimulationResult = SimulationResult
- SimulationModelParameter = SimulationModelParameter
- SedModel = SedModel
- SpeciesChange = SpeciesChange
- GlobalParameterChange = GlobalParameterChange
- ReactionParameter = ReactionParameter
- ReactionChange = ReactionChange
- ModelUnits = ModelUnits
-
-
-# --- Non-Pydantic FromDict classes
-class FromDict(dict):
- def __init__(self, value: Dict):
- super().__init__(value)
-
-
-class BasicoModelChanges(FromDict):
- BASICO_MODEL_CHANGES_TYPE = {
- 'species_changes': {
- 'species_name': {
- 'unit': 'maybe[string]',
- 'initial_concentration': 'maybe[float]',
- 'initial_particle_number': 'maybe[float]',
- 'initial_expression': 'maybe[string]',
- 'expression': 'maybe[string]'
- }
- },
- 'global_parameter_changes': {
- 'global_parameter_name': {
- 'initial_value': 'maybe[float]',
- 'initial_expression': 'maybe[string]',
- 'expression': 'maybe[string]',
- 'status': 'maybe[string]',
- 'type': 'maybe[string]' # (ie: fixed, assignment, reactions)
- }
- },
- 'reaction_changes': {
- 'reaction_name': {
- 'parameters': {
- 'reaction_parameter_name': 'maybe[int]' # (new reaction_parameter_name value) <-- this is done with set_reaction_parameters(name="(REACTION_NAME).REACTION_NAME_PARAM", value=VALUE)
- },
- 'reaction_scheme': 'maybe[string]' # <-- this is done like set_reaction(name = 'R1', scheme = 'S + E + F = ES')
- }
- }
- }
-
- def __init__(self, _type: Dict = BASICO_MODEL_CHANGES_TYPE):
- super().__init__(_type)
-
-
-class SedModel(FromDict):
- """
- # examples
- # changes = {
- # 'species_changes': {
- # 'A': {
- # 'initial_concent': 24.2,
- # 'b': 'sbml'
- # }
- # }
- # }
- #
- # r = {
- # 'reaction_name': {
- # 'parameters': {
- # 'reaction_parameter_name': 23.2
- # },
- # 'reaction_scheme': 'maybe[string]'
- # }
- # }
- """
- # The first 3 params are NOT optional below for a TimeCourseModel in SEDML. model_source has been adapted to mean point of residence
- MODEL_TYPE = {
- 'model_id': 'string',
- 'model_source': 'dict[string]', # 'string', # could be used as the "model_file" or "biomodel_id" below (SEDML l1V4 uses URIs); what if it was 'model_source': 'sbml:model_filepath' ?
- 'model_language': { # could be used to load a different model language supported by COPASI/basico
- '_type': 'string',
- '_default': 'sbml' # perhaps concatenate this with 'model_source'.value? I.E: 'model_source': 'MODEL_LANGUAGE:MODEL_FILEPATH' <-- this would facilitate verifying correct model fp types.
- },
- 'model_name': {
- '_type': 'string',
- '_default': 'composite_process_model'
- },
- 'model_changes': {
- 'species_changes': 'maybe[tree[string]]', # <-- this is done like set_species('B', kwarg=) where the inner most keys are the kwargs
- 'global_parameter_changes': 'maybe[tree[string]]', # <-- this is done with set_parameters(PARAM, kwarg=). where the inner most keys are the kwargs
- 'reaction_changes': 'maybe[tree[string]]'
- },
- 'model_units': 'maybe[tree[string]]'
- }
-
- def __init__(self, _type: Dict = MODEL_TYPE):
- super().__init__(_type)
-
-
-MODEL_TYPE = {
- 'model_id': 'string',
- 'model_source': 'string', # 'tree[string]',
- 'model_language': {
- '_type': 'string',
- '_default': 'sbml'
- },
- 'model_name': {
- '_type': 'string',
- '_default': 'composite_process_model'
- },
- 'model_changes': {
- 'species_changes': 'maybe[tree[string]]',
- 'global_parameter_changes': 'maybe[tree[string]]',
- 'reaction_changes': 'maybe[tree[string]]'
- },
- 'model_units': 'maybe[tree[string]]'
- }
diff --git a/biosimulator_processes/__init__.py b/biosimulator_processes/__init__.py
index 4ed82b539..731a630b0 100644
--- a/biosimulator_processes/__init__.py
+++ b/biosimulator_processes/__init__.py
@@ -14,17 +14,14 @@
PROCESSES_TO_REGISTER = [
('cobra', 'cobra_process.CobraProcess'),
('copasi', 'copasi_process.CopasiProcess'),
- ('_copasi', 'copasi_process._CopasiProcess'),
- ('smoldyn', 'smoldyn_process.SmoldynProcess'),
+ # ('smoldyn', 'smoldyn_process.SmoldynProcess'),
('tellurium', 'tellurium_process.TelluriumProcess'),
- ('amici', 'amici_process.AmiciProcess'),
- ('compare_ode_process', 'comparator_process.ODEComparatorProcess')]
+ ('amici', 'amici_process.AmiciProcess')]
STEPS_TO_REGISTER = [
('get_sbml_step', 'get_sbml.GetSbmlStep'),
('plotter', 'viz.CompositionPlotter'),
- ('plotter2d', 'viz.Plotter2d'),
- ('compare_ode_step', 'comparator_step.ODEComparatorStep')]
+ ('plotter2d', 'viz.Plotter2d')]
# core process registry implementation (unique to this package)
diff --git a/biosimulator_processes/data_model/compare_data_model.py b/biosimulator_processes/data_model/compare_data_model.py
index d2c739e3a..ce7159bf8 100644
--- a/biosimulator_processes/data_model/compare_data_model.py
+++ b/biosimulator_processes/data_model/compare_data_model.py
@@ -216,6 +216,90 @@ def generate_ode_comparison(cls, biomodel_id: str, dur: int) -> Dict:
return {'outputs': output[('emitter',)]}
+@dataclass
+class ODECompositionResult(_BaseClass):
+ """Generalized class for composition results. TODO: switch to using this instead of ode comparison result. """
+ duration: int
+ num_steps: int
+ model_entrypoint: str # One of: biomodel id or sbml fp
+ simulator_names: List[str]
+ timestamp: Optional[str] = str(datetime.now()).replace(' ', '-').replace(':', '_').replace('.', '-')
+ outputs: Optional[List[ODEIntervalResult]] = None
+
+ def __init__(self, duration, num_steps, model_entrypoint, simulator_names):
+ super().__init__()
+ self.duration = duration
+ self.num_steps = num_steps
+ self.model_entrypoint = model_entrypoint
+ self.simulator_names = simulator_names
+ self.outputs = self._set_outputs()
+
+ def _set_outputs(self):
+ return self.generate_ode_interval_outputs(
+ self.duration,
+ self.num_steps)
+
+ def generate_ode_interval_outputs(self, duration: int, n_steps: int) -> List[ODEIntervalResult]:
+ return self._generate_ode_interval_results(duration, n_steps)
+
+ def _generate_ode_interval_results(self, duration: int, n_steps: int) -> List[ODEIntervalResult]:
+ results_dict = self.generate_ode_comparison(self.model_entrypoint, duration)
+ interval_results = []
+
+ for global_time_index, interval_result_data in enumerate(results_dict['outputs']):
+ interval_config = {
+ 'interval_id': float(global_time_index),
+ 'time': interval_result_data['time']
+ }
+
+ for k, v in interval_result_data.items():
+ for simulator_name in self.simulator_names:
+ if simulator_name in k:
+ interval_config[f'{simulator_name}_floating_species_concentrations'] = v
+
+ interval_result = ODEIntervalResult(**interval_config)
+ interval_results.append(interval_result)
+
+ return interval_results
+
+ @classmethod
+ def generate_ode_comparison(cls, model_entrypoint: str, dur: int) -> Dict:
+ """Run the `compare_ode_step` composite and return data which encapsulates another composite
+ workflow specified by dir.
+
+ Args:
+ model_entrypoint:`str`: A Valid Biomodel ID.
+ dur:`int`: duration of the internal composite simulation.
+
+ Returns:
+ `Dict` of simulation comparison results like `{'outputs': {...etc}}`
+ """
+ compare = {
+ 'compare_ode': {
+ '_type': 'step',
+ 'address': 'local:compare_ode_step',
+ 'config': {'model_entrypoint': model_entrypoint, 'duration': dur},
+ 'inputs': {},
+ 'outputs': {'comparison_data': ['comparison_store']}
+ },
+ 'verification_data': {
+ '_type': 'step',
+ 'address': 'local:ram-emitter',
+ 'config': {
+ 'emit': {'comparison_data': 'tree[any]'}
+ },
+ 'inputs': {'comparison_data': ['comparison_store']}
+ }
+ }
+
+ wf = Composite(config={'state': compare}, core=CORE)
+ wf.run(1)
+ comparison_results = wf.gather_results()
+ output = comparison_results[("verification_data"),][0]['comparison_data']
+
+ return {'outputs': output[('emitter',)]}
+
+
class CompositeRunError(BaseModel):
exception: Exception
diff --git a/biosimulator_processes/data_model/sed_data_model.py b/biosimulator_processes/data_model/sed_data_model.py
index 2ce0809eb..5cb2aa1db 100644
--- a/biosimulator_processes/data_model/sed_data_model.py
+++ b/biosimulator_processes/data_model/sed_data_model.py
@@ -338,26 +338,8 @@ class Simulator(_BaseClass):
deps: List[InstallationDependency]
-class SedDataModel:
- TimeCourseModel = TimeCourseModel
- TimeCourseModelChanges = TimeCourseModelChanges
- ModelChanges = ModelChanges
- ModelChange = ModelChange
- TimeCourseProcess = TimeCourseProcess
- SteadyStateModel = SteadyStateModel
- SpatialModel = SpatialModel
- ExperimentMetadata = ExperimentMetadata
- Experiment = Experiment
- SimulationResult = SimulationResult
- SimulationModelParameter = SimulationModelParameter
- SedModel = SedModel
- SpeciesChange = SpeciesChange
- GlobalParameterChange = GlobalParameterChange
- ReactionParameter = ReactionParameter
- ReactionChange = ReactionChange
- ModelUnits = ModelUnits
- ModelFilepath = ModelFilepath
- BiomodelID = BiomodelID
+
+
# --- Non-Pydantic FromDict classes
@@ -445,3 +427,26 @@ class SedModel(FromDict):
def __init__(self, _type: Dict = _MODEL_TYPE):
super().__init__(_type)
+
+# SED Enum Data model Store
+class SedDataModel:
+ TimeCourseModel = TimeCourseModel
+ TimeCourseModelChanges = TimeCourseModelChanges
+ ModelChanges = ModelChanges
+ ModelChange = ModelChange
+ TimeCourseProcess = TimeCourseProcess
+ SteadyStateModel = SteadyStateModel
+ SpatialModel = SpatialModel
+ ExperimentMetadata = ExperimentMetadata
+ Experiment = Experiment
+ SimulationResult = SimulationResult
+ SimulationModelParameter = SimulationModelParameter
+ SedModel = SedModel
+ SpeciesChange = SpeciesChange
+ GlobalParameterChange = GlobalParameterChange
+ ReactionParameter = ReactionParameter
+ ReactionChange = ReactionChange
+ ModelUnits = ModelUnits
+ ModelFilepath = ModelFilepath
+ BiomodelID = BiomodelID
+ ModelSchema = MODEL_TYPE
diff --git a/biosimulator_processes/data_model/service_data_model.py b/biosimulator_processes/data_model/service_data_model.py
new file mode 100644
index 000000000..433334a0c
--- /dev/null
+++ b/biosimulator_processes/data_model/service_data_model.py
@@ -0,0 +1,49 @@
+from dataclasses import dataclass
+from typing import List, Dict
+import abc
+
+import numpy as np
+
+from biosimulator_processes.data_model import _BaseClass
+
+
+@dataclass
+class BiosimulationsSpeciesOutput:
+ dataset_label: str
+ data: np.ndarray
+
+
+@dataclass
+class BiosimulationsRunOutputData:
+ report_path: str
+ data: list[BiosimulationsSpeciesOutput]
+
+
+@dataclass
+class ProjectsQuery(_BaseClass):
+ project_ids: List[str]
+ project_data: Dict
+
+
+@dataclass
+class ArchiveFiles(_BaseClass):
+ run_id: str
+ project_name: str
+ files: List[Dict]
+
+
+class RestService(abc.ABC):
+ @classmethod
+ @abc.abstractmethod
+ async def _search_source(cls, query: str) -> ProjectsQuery:
+ pass
+
+ @classmethod
+ @abc.abstractmethod
+ async def fetch_files(cls, query: str) -> ProjectsQuery:
+ pass
+
+ @classmethod
+ @abc.abstractmethod
+ async def extract_data(cls, query: str, ) -> ProjectsQuery:
+ pass
diff --git a/biosimulator_processes/data_model/verify_data_model.py b/biosimulator_processes/data_model/verify_data_model.py
new file mode 100644
index 000000000..bb12ecc7a
--- /dev/null
+++ b/biosimulator_processes/data_model/verify_data_model.py
@@ -0,0 +1,9 @@
+from dataclasses import dataclass
+
+
+@dataclass
+class OutputAspectVerification:
+ aspect_type: str # one of: 'names', 'values'. TODO: Add more
+ is_verified: bool
+ expected_data: any
+ process_data: any
diff --git a/biosimulator_processes/io.py b/biosimulator_processes/io.py
index f7e0fc5c1..4333be2f9 100644
--- a/biosimulator_processes/io.py
+++ b/biosimulator_processes/io.py
@@ -5,7 +5,7 @@
import os
-def fetch_sbml_file(biomodel_id: str, save_dir: Optional[str] = None) -> str:
+def fetch_biomodel_sbml_file(biomodel_id: str, save_dir: Optional[str] = None) -> str:
url = f'https://www.ebi.ac.uk/biomodels/search/download?models={biomodel_id}'
headers = {'accept': '*/*'}
response = requests.get(url, headers=headers)
diff --git a/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310.pyc b/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310.pyc
index cecafa752..7435f5625 100644
Binary files a/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310.pyc and b/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310.pyc differ
diff --git a/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310.pyc b/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310.pyc
index 4cb877016..734fa5035 100644
Binary files a/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310.pyc and b/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310.pyc differ
diff --git a/biosimulator_processes/processes/copasi_process.py b/biosimulator_processes/processes/copasi_process.py
index 3a907dcd4..2a7b26b77 100644
--- a/biosimulator_processes/processes/copasi_process.py
+++ b/biosimulator_processes/processes/copasi_process.py
@@ -1,6 +1,8 @@
from typing import Dict, Union, Optional, List
+from datetime import datetime
import json
+from process_bigraph import Process
from COPASI import CDataModel
from pandas import DataFrame
from basico import (
@@ -18,14 +20,248 @@
set_parameters,
add_parameter
)
-from process_bigraph import Process
+
from biosimulator_processes.utils import fetch_biomodel
from biosimulator_processes import CORE
from biosimulator_processes.data_model.sed_data_model import MODEL_TYPE
-from datetime import datetime
+from biosimulator_processes.processes.sed_process import SedProcess
+
+
+class CopasiProcess(SedProcess):
+ """
+ Entrypoint Options:
+
+ A. Filepath whose reference is a valid SBML model file(`str`),
+ B. A valid BioModel id which will return a simulator-instance object(`str`),
+ C. A specification of model configuration parameters whose values reflect those required by BasiCo. This
+ specification requires the presence of reactions which inherently define species types and optionally
+ addition parameters. See Basico for more details. There are two types of objects that are accepted
+ for this specification:
+ - A high-level server object from `biosimulator_processes.data_model`,
+ ie: `TimeCourseModel` or `SedModel`. (Recommended for first-time users). The parameters with
+ which these dataclasses are instantiated correspond to the `config_schema` for a given
+ process implementation. In the config schema, the outermost keys could be considered
+ parameters/kwargs for a process implementation's construction. The values are all terminally
+ strings that define the parameter "type" according to bigraph-schema.
+ - A dictionary which defines the same kwargs/values as the high-level objects. See
+ `biosimulator_processes.data_model.MODEL_TYPE` for details.
+
+ Config:
+ model: see datamodel for more details.
+ species_context: the context by which you measure the species data:: one of: 'concentrations', 'counts'. # TODO: map these to method inference
+ method: basico timecourse setting. Defaults to 'lsoda'.
+ """
+
+ def __init__(self,
+ config: Dict[str, Union[str, Dict[str, str], Dict[str, Optional[Dict[str, str]]], Optional[Dict[str, str]]]] = None,
+ core: Dict = CORE):
+ super().__init__(config, core)
+
+ # insert copasi process model config
+ model_source = self.config['model'].get('model_source') or self.config.get('sbml_fp')
+ assert model_source is not None, 'You must specify a model source of either a valid biomodel id or model filepath.'
+ model_changes = self.config['model'].get('model_changes', {})
+ self.model_changes = {} if model_changes is None else model_changes
+
+ # Option A:
+ if '/' in model_source:
+ self.copasi_model_object = load_model(model_source)
+ print('found a filepath')
+
+ # Option B:
+ elif 'BIO' in model_source:
+ self.copasi_model_object = fetch_biomodel(model_id=model_source)
+ print('found a biomodel id')
+
+ # Option C:
+ else:
+ if not self.model_changes:
+ raise AttributeError(
+ """You must pass a source of model changes specifying params, reactions,
+ species or all three if starting from an empty model.""")
+ model_units = self.config['model'].get('model_units', {})
+ self.copasi_model_object = new_model(
+ name='CopasiProcess TimeCourseModel',
+ **model_units)
+
+ # handle context of species output
+ context_type = self.config['species_context']
+ self.species_context_key = f'floating_species_{context_type}'
+ self.use_counts = 'concentrations' in context_type
+
+ # Get a list of reactions
+ self._set_reaction_changes()
+ reactions = get_reactions(model=self.copasi_model_object)
+ self.reaction_list = reactions.index.tolist() if reactions is not None else []
+ # if not self.reaction_list:
+ # raise AttributeError('No reactions could be parsed from this model. Your model must contain reactions to run.')
+
+ # Get the species (floating only) TODO: add boundary species
+ self._set_species_changes()
+ species_data = get_species(model=self.copasi_model_object)
+ self.floating_species_list = species_data.index.tolist()
+ self.floating_species_initial = species_data.particle_number.tolist() \
+ if self.use_counts else species_data.concentration.tolist()
+
+ # Get the list of parameters and their values (it is possible to run a model without any parameters)
+ self._set_global_param_changes()
+ model_parameters = get_parameters(model=self.copasi_model_object)
+ self.model_parameters_list = model_parameters.index.tolist() \
+ if isinstance(model_parameters, DataFrame) else []
+ self.model_parameters_values = model_parameters.initial_value.tolist() \
+ if isinstance(model_parameters, DataFrame) else []
+
+ # Get a list of compartments
+ self.compartments_list = get_compartments(model=self.copasi_model_object).index.tolist()
+
+ # ----SOLVER: Get the solver (defaults to deterministic)
+ self.method = self.config['method']
+
+ def initial_state(self):
+ # keep in mind that a valid simulation may not have global parameters
+ model_parameters_dict = dict(
+ zip(self.model_parameters_list, self.model_parameters_values))
+
+ floating_species_dict = dict(
+ zip(self.floating_species_list, self.floating_species_initial))
+
+ return {
+ 'time': 0.0,
+ 'model_parameters': model_parameters_dict,
+ self.species_context_key: floating_species_dict,
+ }
+
+ def inputs(self):
+ # dependent on species context set in self.config
+ floating_species_type = {
+ species_id: {
+ '_type': 'float',
+ '_apply': 'set'}
+ for species_id in self.floating_species_list
+ }
+
+ model_params_type = {
+ param_id: {
+ '_type': 'float',
+ '_apply': 'set'}
+ for param_id in self.model_parameters_list
+ }
+
+ reactions_type = {
+ reaction_id: 'float'
+ for reaction_id in self.reaction_list
+ }
+
+ return {
+ 'time': 'float',
+ self.species_context_key: floating_species_type,
+ 'model_parameters': model_params_type,
+ 'reactions': reactions_type}
+
+ def outputs(self):
+ floating_species_type = {
+ species_id: {
+ '_type': 'float',
+ '_apply': 'set'}
+ for species_id in self.floating_species_list
+ }
+ return {
+ 'time': 'float',
+ self.species_context_key: floating_species_type}
+
+ def update(self, inputs, interval):
+ # set copasi values according to what is passed in states for concentrations
+ for cat_id, value in inputs[self.species_context_key].items():
+ set_type = 'particle_number' if 'counts' in self.species_context_key else 'concentration'
+ species_config = {
+ 'name': cat_id,
+ 'model': self.copasi_model_object,
+ set_type: value}
+ set_species(**species_config)
+
+ # run model for "interval" length; we only want the state at the end
+ timecourse = run_time_course(
+ start_time=inputs['time'],
+ duration=interval,
+ update_model=True,
+ model=self.copasi_model_object,
+ method=self.method)
+
+ # extract end values of concentrations from the model and set them in results
+ results = {'time': interval}
+ if self.use_counts:
+ results[self.species_context_key] = {
+ mol_id: float(get_species(
+ name=mol_id,
+ exact=True,
+ model=self.copasi_model_object
+ ).particle_number[0])
+ for mol_id in self.floating_species_list}
+ else:
+ results[self.species_context_key] = {
+ mol_id: float(get_species(
+ name=mol_id,
+ exact=True,
+ model=self.copasi_model_object
+ ).concentration[0])
+ for mol_id in self.floating_species_list}
+
+ return results
+
+ def _set_reaction_changes(self):
+ # ----REACTIONS: set reactions
+ existing_reactions = get_reactions(model=self.copasi_model_object)
+ existing_reaction_names = existing_reactions.index.tolist() if existing_reactions is not None else []
+ reaction_changes = self.model_changes.get('reaction_changes', [])
+ if reaction_changes:
+ for reaction_change in reaction_changes:
+ reaction_name: str = reaction_change['reaction_name']
+ param_changes: list[dict[str, float]] = reaction_change['parameter_changes']
+ scheme_change: str = reaction_change.get('reaction_scheme')
+ # handle changes to existing reactions
+ if param_changes:
+ for param_name, param_change_val in param_changes:
+ set_reaction_parameters(param_name, value=param_change_val, model=self.copasi_model_object)
+ if scheme_change:
+ set_reaction(name=reaction_name, scheme=scheme_change, model=self.copasi_model_object)
+ # handle new reactions
+ if reaction_name not in existing_reaction_names and scheme_change:
+ add_reaction(reaction_name, scheme_change, model=self.copasi_model_object)
+
+ def _set_species_changes(self):
+ # ----SPECS: set species changes
+ species_changes = self.model_changes.get('species_changes', [])
+ if species_changes:
+ for species_change in species_changes:
+ if isinstance(species_change, dict):
+ species_name = species_change.pop('name')
+ changes_to_apply = {}
+ for spec_param_type, spec_param_value in species_change.items():
+ if spec_param_value:
+ changes_to_apply[spec_param_type] = spec_param_value
+ set_species(**changes_to_apply, model=self.copasi_model_object)
+
+ def _set_global_param_changes(self):
+ # ----GLOBAL PARAMS: set global parameter changes
+ global_parameter_changes = self.model_changes.get('global_parameter_changes', [])
+ if global_parameter_changes:
+ for param_change in global_parameter_changes:
+ param_name = param_change.pop('name')
+ for param_type, param_value in param_change.items():
+ if not param_value:
+ param_change.pop(param_type)
+ # handle changes to existing params
+ set_parameters(name=param_name, **param_change, model=self.copasi_model_object)
+ # set new params
+ global_params = get_parameters(model=self.copasi_model_object)
+ if global_params:
+ existing_global_parameters = global_params.index
+ if param_name not in existing_global_parameters:
+ assert param_change.get('initial_concentration') is not None, "You must pass an initial_concentration value if adding a new global parameter."
+ add_parameter(name=param_name, **param_change, model=self.copasi_model_object)
-class CopasiProcess(Process):
+class workingcopasiprocess(SedProcess):
"""
Entrypoint Options:
@@ -35,7 +271,7 @@ class CopasiProcess(Process):
specification requires the presence of reactions which inherently define species types and optionally
addition parameters. See Basico for more details. There are two types of objects that are accepted
for this specification:
- - A high-level api object from `biosimulator_processes.data_model`,
+ - A high-level server object from `biosimulator_processes.data_model`,
ie: `TimeCourseModel` or `SedModel`. (Recommended for first-time users). The parameters with
which these dataclasses are instantiated correspond to the `config_schema` for a given
process implementation. In the config schema, the outermost keys could be considered
diff --git a/biosimulator_processes/processes/instance.py b/biosimulator_processes/processes/instance.py
new file mode 100644
index 000000000..71a481bf9
--- /dev/null
+++ b/biosimulator_processes/processes/instance.py
@@ -0,0 +1,62 @@
+from dataclasses import dataclass
+from typing import *
+
+from process_bigraph.experiments.parameter_scan import RunProcess
+
+from biosimulator_processes import CORE
+from biosimulator_processes.data_model import _BaseClass
+
+
+class ODEProcess(RunProcess):
+ def __init__(self, config=None, core=None):
+ super().__init__(config, core)
+
+ def run(self, input_state=None):
+ return self.update(input_state or {})
+
+
+@dataclass
+class ProcessObservable(_BaseClass):
+ path_root: str
+ root_children: list[str]
+ path: list[str] = None
+
+ def __post_init__(self):
+ self.path = [self.path_root, *self.root_children]
+
+
+def generate_ode_process_instance(
+ entrypoint: Union[str, dict[str, any]], # either sbml model path or sed_model dict which conforms to the spec in sed data model in this repo.
+ process_address: str,
+ observables: List[str],
+ step_size: float,
+ duration: float,
+ **process_config
+) -> ODEProcess:
+ """Generate loaded ode process.
+
+ Args:
+ entrypoint (Union[str, dict[str, any]]): either sbml model path or sed_model dict which conforms to the spec in sed data model in this repo.
+ process_address (str): the address in registry of the process to be loaded as per the CORE registry
+ observables (list[str]): observables to be loaded in path form
+ step_size (float): the step size in seconds
+ duration (float): the duration in seconds
+ **process_config (dict): the process config kwargs specific to the simulator process
+
+ Returns:
+ ODEProcess instance
+ """
+ if not isinstance(entrypoint, str or dict[str, any]):
+ raise ValueError('entrypoint must be a string sbml model path or a dict defining SED_MODEL within biosimulator_processes.data_model.sed_data_model')
+
+ config = {'model': {'model_source': entrypoint, **process_config}} if isinstance(entrypoint, str) else entrypoint
+ return ODEProcess(
+ config={
+ 'process_address': f'local:{process_address}',
+ 'process_config': config,
+ 'observables': observables,
+ 'timestep': step_size,
+ 'runtime': duration
+ },
+ core=CORE)
+
diff --git a/biosimulator_processes/processes/sed_process.py b/biosimulator_processes/processes/sed_process.py
new file mode 100644
index 000000000..79c077e58
--- /dev/null
+++ b/biosimulator_processes/processes/sed_process.py
@@ -0,0 +1,40 @@
+from abc import ABC, abstractmethod
+
+from process_bigraph import Process
+
+from biosimulator_processes import CORE
+from biosimulator_processes.data_model.sed_data_model import SedDataModel
+
+
+class SedProcess(Process, ABC):
+ config_schema = {
+ 'model': SedDataModel.ModelSchema,
+ 'species_context': {
+ '_type': 'string',
+ '_default': 'concentrations'
+ },
+ 'method': {
+ '_type': 'string',
+ '_default': 'deterministic' # <-- CVODE for consistency, or should we use LSODA?
+ },
+ 'sbml_fp': 'maybe[string]'
+ }
+
+ def __init__(self, config=None, core=CORE):
+ super().__init__(config, core)
+
+ @abstractmethod
+ def initial_state(self):
+ pass
+
+ @abstractmethod
+ def inputs(self):
+ pass
+
+ @abstractmethod
+ def outputs(self):
+ pass
+
+ @abstractmethod
+ def update(self, inputs, interval):
+ pass
diff --git a/release_env/lib/python3.12/site-packages/importlib_metadata/compat/__init__.py b/biosimulator_processes/server/__init__.py
similarity index 100%
rename from release_env/lib/python3.12/site-packages/importlib_metadata/compat/__init__.py
rename to biosimulator_processes/server/__init__.py
diff --git a/biosimulator_processes/server/main.py b/biosimulator_processes/server/main.py
new file mode 100644
index 000000000..a88a0af72
--- /dev/null
+++ b/biosimulator_processes/server/main.py
@@ -0,0 +1,36 @@
+import tempfile
+
+from fastapi import FastAPI, UploadFile, File
+from fastapi.middleware.cors import CORSMiddleware
+import uvicorn
+
+from biosimulator_processes.server.src.io import save_omex_archive
+
+
+app = FastAPI(title='biosimulator-processes-server')
+
+
+origins = [
+ "http://localhost:4200",
+]
+app.add_middleware(
+ CORSMiddleware,
+ allow_origins=origins,
+ allow_credentials=True,
+ allow_methods=["*"],
+ allow_headers=["*"],
+)
+
+
+@app.post("/upload-omex")
+async def upload_omex(file: UploadFile = File(...)):
+ contents = await file.read()
+
+ save_dir = tempfile.mkdtemp()
+ archive_response = save_omex_archive(contents, save_dir)
+ print(archive_response['archive'].contents)
+ return {"filename": archive_response['source']}
+
+
+if __name__ == "__main__":
+ uvicorn.run(app, host="0.0.0.0", port=8000)
diff --git a/biosimulator_processes/server/spec/openapi_3_1_0_generated.yaml b/biosimulator_processes/server/spec/openapi_3_1_0_generated.yaml
new file mode 100644
index 000000000..d42f8beb0
--- /dev/null
+++ b/biosimulator_processes/server/spec/openapi_3_1_0_generated.yaml
@@ -0,0 +1,69 @@
+openapi: 3.1.0
+info:
+ title: biosimulator-processes-server
+ version: 0.1.0
+paths:
+ /upload-omex:
+ post:
+ summary: Upload Omex
+ operationId: upload_omex_upload_omex_post
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ $ref: '#/components/schemas/Body_upload_omex_upload_omex_post'
+ required: true
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema: {}
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+components:
+ schemas:
+ Body_upload_omex_upload_omex_post:
+ properties:
+ file:
+ type: string
+ format: binary
+ title: File
+ type: object
+ required:
+ - file
+ title: Body_upload_omex_upload_omex_post
+ HTTPValidationError:
+ properties:
+ detail:
+ items:
+ $ref: '#/components/schemas/ValidationError'
+ type: array
+ title: Detail
+ type: object
+ title: HTTPValidationError
+ ValidationError:
+ properties:
+ loc:
+ items:
+ anyOf:
+ - type: string
+ - type: integer
+ type: array
+ title: Location
+ msg:
+ type: string
+ title: Message
+ type:
+ type: string
+ title: Error Type
+ type: object
+ required:
+ - loc
+ - msg
+ - type
+ title: ValidationError
diff --git a/release_env/lib/python3.12/site-packages/jaraco/classes/__init__.py b/biosimulator_processes/server/src/__init__.py
similarity index 100%
rename from release_env/lib/python3.12/site-packages/jaraco/classes/__init__.py
rename to biosimulator_processes/server/src/__init__.py
diff --git a/biosimulator_processes/server/src/io.py b/biosimulator_processes/server/src/io.py
new file mode 100644
index 000000000..525860620
--- /dev/null
+++ b/biosimulator_processes/server/src/io.py
@@ -0,0 +1,16 @@
+import tempfile
+
+from biosimulators_utils.combine.io import CombineArchiveReader
+
+
+def unpack_omex(archive_fp: str, save_dir: str):
+ return CombineArchiveReader().run(archive_fp, save_dir)
+
+
+def save_omex_archive(contents: bytes, save_dir: str):
+ with tempfile.NamedTemporaryFile(delete=False, suffix='.omex') as temp_file:
+ temp_file.write(contents)
+ archive_path = temp_file.name
+
+ return {'source': archive_path, 'archive': unpack_omex(archive_path, save_dir), 'save_dir': save_dir}
+
diff --git a/biosimulator_processes/server/src/openapi_spec.py b/biosimulator_processes/server/src/openapi_spec.py
new file mode 100644
index 000000000..e96de1c1c
--- /dev/null
+++ b/biosimulator_processes/server/src/openapi_spec.py
@@ -0,0 +1,36 @@
+import json
+import os
+
+import yaml
+from fastapi.openapi.utils import get_openapi
+
+from biosimulator_processes.server.main import app
+
+
+def main():
+ openapi_spec = get_openapi(
+ title=app.title,
+ version=app.version,
+ openapi_version=app.openapi_version,
+ description=app.description,
+ routes=app.routes,
+ )
+
+ # Convert the JSON OpenAPI spec to YAML
+ openapi_spec_yaml = yaml.dump(json.loads(json.dumps(openapi_spec)), sort_keys=False)
+
+ current_directory = os.path.dirname(os.path.realpath(__file__))
+
+ # Write the YAML OpenAPI spec to a file in subdirectory spec
+ openapi_version = app.openapi_version.replace('.', '_')
+ spec_fp = f"{current_directory}/../spec/openapi_{openapi_version}_generated.yaml"
+ if os.path.exists(spec_fp):
+ print('Spec exists, overwriting')
+ os.remove(spec_fp)
+
+ with open(spec_fp, "w") as f:
+ f.write(openapi_spec_yaml)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/release_env/lib/python3.12/site-packages/keyring/backends/__init__.py b/biosimulator_processes/services/__init__.py
similarity index 100%
rename from release_env/lib/python3.12/site-packages/keyring/backends/__init__.py
rename to biosimulator_processes/services/__init__.py
diff --git a/biosimulator_processes/services/rest_service.py b/biosimulator_processes/services/rest_service.py
new file mode 100644
index 000000000..1599b4a69
--- /dev/null
+++ b/biosimulator_processes/services/rest_service.py
@@ -0,0 +1,177 @@
+from dataclasses import dataclass
+from typing import *
+from tempfile import mkdtemp
+from abc import ABC, abstractmethod
+import os
+
+import requests
+import h5py
+from process_bigraph import pp, pf
+
+from biosimulator_processes.data_model.service_data_model import RestService, ProjectsQuery, ArchiveFiles, BiosimulationsRunOutputData, BiosimulationsSpeciesOutput
+
+
+class BiosimulationsRestService(RestService):
+ def __init__(self):
+ super().__init__()
+
+ @classmethod
+ async def _search_source(cls, query: str) -> ProjectsQuery:
+ get_all_projects_url = 'https://api.biosimulations.dev/projects'
+ headers = {'accept': 'application/json'}
+ try:
+ all_projects_resp = requests.get(get_all_projects_url, headers=headers)
+ all_projects_resp.raise_for_status()
+ all_projects = all_projects_resp.json()
+ project_ids = [p['id'].lower() for p in all_projects]
+
+ query_result_ids = [project_id for project_id in project_ids if query.lower() in project_id]
+ query_result_data = {}
+ for project in all_projects:
+ project_id = project['id'].lower()
+ if project_id in query_result_ids:
+ query_result_data[project_id] = project
+
+ return ProjectsQuery(
+ project_ids=query_result_ids,
+ project_data=query_result_data)
+ except Exception as e:
+ print(f'Failed to fetch OMEX archive:\n{e}')
+
+ @classmethod
+ def get_project_files(cls, run_id: str, project_name: str = None) -> ArchiveFiles:
+ get_files_url = f'https://api.biosimulations.dev/files/{run_id}'
+ # get_files_url = f'https://api.biosimulations.dev/results/{run_id}/download'
+ headers = {'accept': 'application/json'}
+ try:
+ files_resp = requests.get(get_files_url, headers=headers)
+ run_files = files_resp.json()
+ return ArchiveFiles(run_id=run_id, project_name=project_name, files=run_files)
+ except Exception as e:
+ print(f'Failed to fetch simulation run files:\n{e}')
+
+ @classmethod
+ async def fetch_files(cls, query: str) -> ArchiveFiles:
+ archive_query = await cls._search_source(query)
+ query_results = archive_query.project_ids
+
+ options_menu = dict(zip(list(range(len(query_results))), query_results))
+ user_selection = int(input(f'Please enter your archive selection:\n{pf(options_menu)}'))
+
+ selected_project_id = options_menu[user_selection]
+ simulation_run_id = archive_query.project_data[selected_project_id]['simulationRun']
+ simulation_run_files = cls.get_project_files(simulation_run_id, selected_project_id)
+ return simulation_run_files
+
+ @classmethod
+ async def extract_data(cls, query: str, save_dir=None) -> str:
+ """Return a string representation sbml model from the given query"""
+ archive_files = await cls.fetch_files(query)
+ get_file_url = f'https://api.biosimulations.dev/files/{archive_files.run_id}'
+
+ model_file_location = [file['location'] for file in archive_files.files if file['location'].endswith('.xml')].pop()
+ model_file_resp = requests.get(get_file_url + f'/{model_file_location}/download', headers={'accept': 'application/xml'})
+
+ model_fp = os.path.join(save_dir or mkdtemp(), model_file_location)
+ with open(model_fp, 'w') as f:
+ f.write(model_file_resp.text)
+
+ return model_file_resp.text
+
+ @classmethod
+ def read_report_outputs(cls, report_file_path, group_path="simulation.sedml/report") -> BiosimulationsRunOutputData:
+ """Read the outputs from all species in the given report file from biosimulations output.
+
+ Args:
+ report_file_path (str): The path to the simulation.sedml/report.h5 HDF5 file.
+ group_path (str): The path to the simulation.sedml/report.h5 HDF5 file. Defaults to `simulation.sedml/report`
+
+ """
+ # TODO: implement auto gen from run id here.
+ outputs = []
+ with h5py.File(report_file_path, 'r') as f:
+ if group_path in f:
+ group = f[group_path]
+ dataset_labels = group.attrs['sedmlDataSetLabels']
+ for label in dataset_labels:
+ dataset_index = list(dataset_labels).index(label)
+ data = group[()]
+
+ specific_data = data[dataset_index]
+ output = BiosimulationsSpeciesOutput(dataset_label=label, data=specific_data)
+ outputs.append(output)
+ return BiosimulationsRunOutputData(report_path=report_file_path, data=outputs)
+ else:
+ print(f"Group '{group_path}' not found in the file.")
+
+
+class SimDataRestService(RestService):
+ def __init__(self):
+ super().__init__()
+
+ @classmethod
+ async def _search_source(cls, query: str) -> ProjectsQuery:
+ get_all_projects_url = 'https://api.biosimulations.dev/projects'
+ headers = {'accept': 'application/json'}
+ try:
+ all_projects_resp = requests.get(get_all_projects_url, headers=headers)
+ all_projects_resp.raise_for_status()
+ all_projects = all_projects_resp.json()
+ project_ids = [p['id'].lower() for p in all_projects]
+
+ query_result_ids = [project_id for project_id in project_ids if query.lower() in project_id]
+ query_result_data = {}
+ for project in all_projects:
+ project_id = project['id'].lower()
+ if project_id in query_result_ids:
+ query_result_data[project_id] = project
+
+ return ProjectsQuery(
+ project_ids=query_result_ids,
+ project_data=query_result_data)
+ except Exception as e:
+ print(f'Failed to fetch OMEX archive:\n{e}')
+
+ @classmethod
+ async def _get_files(cls, run_id: str, project_name: str) -> ArchiveFiles:
+ get_files_url = f'https://api.biosimulations.dev/files/{run_id}'
+ headers = {'accept': 'application/json'}
+ try:
+ files_resp = requests.get(get_files_url, headers=headers)
+ run_files = files_resp.json()
+ return ArchiveFiles(run_id=run_id, project_name=project_name, files=run_files)
+ except Exception as e:
+ print(f'Failed to fetch simulation run files:\n{e}')
+
+ @classmethod
+ async def fetch_files(cls, query: str) -> ArchiveFiles:
+ archive_query = await cls._search_source(query)
+ query_results = archive_query.project_ids
+
+ options_menu = dict(zip(list(range(len(query_results))), query_results))
+ user_selection = int(input(f'Please enter your archive selection:\n{pf(options_menu)}'))
+
+ selected_project_id = options_menu[user_selection]
+ simulation_run_id = archive_query.project_data[selected_project_id]['simulationRun']
+ simulation_run_files = await cls._get_files(simulation_run_id, selected_project_id)
+ return simulation_run_files
+
+ @classmethod
+ async def extract_data(cls, query: str, save_dir=None) -> str:
+ """Return a string representation sbml model from the given query"""
+ archive_files = await cls.fetch_files(query)
+ get_file_url = f'https://api.biosimulations.dev/files/{archive_files.run_id}'
+
+ model_file_location = [file['location'] for file in archive_files.files if file['location'].endswith('.xml')].pop()
+ model_file_resp = requests.get(get_file_url + f'/{model_file_location}/download', headers={'accept': 'application/xml'})
+
+ model_fp = os.path.join(save_dir or mkdtemp(), model_file_location)
+ with open(model_fp, 'w') as f:
+ f.write(model_file_resp.text)
+
+ return model_file_resp.text
+
+
+
+class BiomodelsRestService(RestService):
+ pass
diff --git a/biosimulator_processes/steps/comparator_step.py b/biosimulator_processes/steps/comparator_step.py
deleted file mode 100644
index 57817026d..000000000
--- a/biosimulator_processes/steps/comparator_step.py
+++ /dev/null
@@ -1,180 +0,0 @@
-"""Comparator Step:
-
- Here the entrypoint is the results of an emitter.
-"""
-
-
-from tempfile import mkdtemp
-from abc import abstractmethod
-from dataclasses import dataclass
-from typing import *
-
-from process_bigraph import Step, pp, Composite
-import numpy as np
-import pandas as pd
-
-from biosimulator_processes import CORE
-from biosimulator_processes.data_model import BaseModel, _BaseClass
-from biosimulator_processes.data_model.compare_data_model import ParameterMSE, ODEComparisonResult
-from biosimulator_processes.io import fetch_sbml_file
-
-
-@dataclass
-class ProcessComparisonMatrix(_BaseClass):
- data: np.ndarray
- time_id: int
-
-
-def calculate_comparison(a, b):
- return np.mean((a - b) ** 2)
-
-
-# Function to construct process interval matrix
-def _construct_process_interval_matrix(outputs_copasi, outputs_tellurium, outputs_amici, time_id) -> ProcessComparisonMatrix:
- comparison_matrix = np.zeros((3, 3), dtype=float)
-
- comparison_matrix[0, 1] = calculate_comparison(outputs_copasi, outputs_tellurium)
- comparison_matrix[0, 2] = calculate_comparison(outputs_copasi, outputs_amici)
- comparison_matrix[1, 2] = calculate_comparison(outputs_tellurium, outputs_amici)
- comparison_matrix[1, 0] = comparison_matrix[0, 1]
- comparison_matrix[2, 0] = comparison_matrix[0, 2]
- comparison_matrix[2, 1] = comparison_matrix[1, 2]
-
- np.fill_diagonal(comparison_matrix, 0.0) # Diagonal can be 0.0 as there is no comparison needed
- return ProcessComparisonMatrix(data=comparison_matrix, time_id=time_id)
-
-
-def _generate_ode_process_comparison_df(matrix: ProcessComparisonMatrix, simulators: list[str]) -> pd.DataFrame:
- return pd.DataFrame(matrix.data, columns=simulators, index=simulators)
-
-
-def generate_ode_process_comparison_data(outputs_copasi, outputs_tellurium, outputs_amici, time_id) -> pd.DataFrame:
- simulators = ['copasi', 'tellurium', 'amici']
-
- # Create interval data dictionary
- interval_data = dict(zip(simulators, [outputs_copasi, outputs_tellurium, outputs_amici]))
- interval_data['time_id'] = time_id
-
- # Construct the matrix
- matrix = _construct_process_interval_matrix(
- outputs_copasi=interval_data['copasi'],
- outputs_tellurium=interval_data['tellurium'],
- outputs_amici=interval_data['amici'],
- time_id=interval_data['time_id'])
-
- return _generate_ode_process_comparison_df(matrix, simulators)
-
-
-class SimulatorComparatorStep(Step):
- config_schema = {
- 'biomodel_id': 'string',
- 'duration': 'integer',
- 'simulators': {
- '_type': 'list[string]',
- '_default': []}}
-
- def __init__(self, config=None, core=CORE):
- super().__init__(config, core)
- self.biomodel_id = self.config['biomodel_id']
- self.duration = self.config['duration']
-
- def inputs(self):
- return {}
-
- def outputs(self):
- return {'comparison_data': 'tree[any]'}
-
- def update(self, state):
- results = self._run_workflow()
- output = {'comparison_data': results}
- return output
-
-
-class ODEComparatorStep(SimulatorComparatorStep):
- """config_schema = {'biomodel_id': 'string', 'duration': 'integer'}"""
-
- def __init__(self, config=None, core=CORE):
- super().__init__(config, core)
- self.biomodel_id = self.config['biomodel_id']
- self.duration = self.config['duration']
-
- directory = mkdtemp()
- model_fp = fetch_sbml_file(self.biomodel_id, save_dir=directory)
- self.document = {
- 'copasi_simple': {
- '_type': 'process',
- 'address': 'local:copasi',
- 'config': {'model': {'model_source': model_fp}},
- 'inputs': {'floating_species_concentrations': ['copasi_simple_floating_species_concentrations_store'],
- 'model_parameters': ['model_parameters_store'],
- 'time': ['time_store'],
- 'reactions': ['reactions_store']},
- 'outputs': {'floating_species_concentrations': ['copasi_simple_floating_species_concentrations_store'],
- 'time': ['time_store']}
- },
- 'amici_simple': {
- '_type': 'process',
- 'address': 'local:amici',
- 'config': {'model': {'model_source': model_fp}},
- 'inputs': {
- 'floating_species_concentrations': ['amici_simple_floating_species_concentrations_store'],
- 'model_parameters': ['model_parameters_store'],
- 'time': ['time_store'],
- 'reactions': ['reactions_store']},
- 'outputs': {
- 'floating_species_concentrations': ['amici_simple_floating_species_concentrations_store'],
- 'time': ['time_store']}
- },
- 'emitter': {
- '_type': 'step',
- 'address': 'local:ram-emitter',
- 'config': {
- 'emit': {
- 'copasi_simple_floating_species_concentrations': 'tree[float]',
- 'amici_simple_floating_species_concentrations': 'tree[float]',
- 'tellurium_simple_floating_species_concentrations': 'tree[float]',
- 'time': 'float'
- }
- },
- 'inputs': {
- 'copasi_simple_floating_species_concentrations': ['copasi_simple_floating_species_concentrations_store'],
- 'amici_simple_floating_species_concentrations': ['amici_simple_floating_species_concentrations_store'],
- 'tellurium_simple_floating_species_concentrations': ['tellurium_simple_floating_species_concentrations_store'],
- 'time': ['time_store']
- }
- },
- 'tellurium_simple': {
- '_type': 'process',
- 'address': 'local:tellurium',
- 'config': {'model': {'model_source': model_fp}},
- 'inputs': {'floating_species_concentrations': ['tellurium_simple_floating_species_concentrations_store'],
- 'model_parameters': ['model_parameters_store'],
- 'time': ['time_store'],
- 'reactions': ['reactions_store']},
- 'outputs': {'floating_species_concentrations': ['tellurium_simple_floating_species_concentrations_store'],
- 'time': ['time_store']}}}
-
- # TODO: Do we need this?
- # def inputs(self):
- # return {}
-
- # def outputs(self):
- # return {'comparison_data': 'tree[any]'}
-
- def update(self, state):
- comp = self._generate_composition(self.document)
- results = self._run_composition(comp)
- output = {'comparison_data': results}
- return output
-
- @staticmethod
- def _generate_composition(document: Dict) -> Composite:
- return Composite(config={'state': document}, core=CORE)
-
- def _run_composition(self, comp: Composite) -> Dict:
- comp.run(self.duration)
- return comp.gather_results()
-
-
-
-
diff --git a/biosimulator_processes/steps/get_sbml.py b/biosimulator_processes/steps/get_sbml.py
deleted file mode 100644
index ad069a240..000000000
--- a/biosimulator_processes/steps/get_sbml.py
+++ /dev/null
@@ -1,38 +0,0 @@
-from tempfile import mkdtemp
-import os
-import requests
-
-import libsbml
-from process_bigraph import Step, pp
-
-from biosimulator_processes import CORE
-from biosimulator_processes.io import fetch_sbml_file
-
-
-class GetSbmlStep(Step):
- config_schema = {
- 'biomodel_id': 'string',
- 'save_dir': 'maybe[string]'
- }
-
- def __init__(self, config=None, core=CORE):
- super().__init__(config, core)
- self.biomodel_id = self.config['biomodel_id']
- self.save_dir = self.config.get('save_dir')
-
- def initial_state(self):
- return {'biomodel_id': self.config['biomodel_id']}
-
- def inputs(self):
- return {'biomodel_id': 'string'}
-
- def outputs(self):
- return {'sbml_model_fp': 'string'}
-
- def update(self, state):
- # TODO: Use copasi for this
- try:
- model_fp = fetch_sbml_file(biomodel_id=self.biomodel_id, save_dir=self.save_dir)
- return {'sbml_model_fp': model_fp}
- except Exception as e:
- print(e)
diff --git a/biosimulator_processes/utils.py b/biosimulator_processes/utils.py
index 516753888..c02032a72 100644
--- a/biosimulator_processes/utils.py
+++ b/biosimulator_processes/utils.py
@@ -1,15 +1,14 @@
from typing import Dict, Union, List, Tuple
from types import FunctionType
import os
+
import numpy as np
from basico import biomodels, load_model_from_string
-from process_bigraph import Composite, pf
+from process_bigraph import Composite, pf, pp, ProcessTypes
import nbformat
-from pydantic import Field
-from biosimulator_processes.data_model import _BaseModel
-def register_module(items_to_register: List[Tuple[str, str]], core) -> None:
+def register_module(items_to_register: List[Tuple[str, str]], core: ProcessTypes) -> None:
for process_name, path in items_to_register:
module_name, class_name = path.rsplit('.', 1)
try:
@@ -26,9 +25,12 @@ def register_module(items_to_register: List[Tuple[str, str]], core) -> None:
# Register the process
core.process_registry.register(process_name, bigraph_class)
- print(f"{class_name} registered successfully.")
+ print(f"{class_name} registered successfully as {process_name}.\n")
except ImportError as e:
print(f"{class_name} not available. Error: {e}")
+ return
+ print(f'Available processes:\n{pf(list(core.process_registry.registry.keys()))}')
+
def prepare_single_ode_process_document(
diff --git a/biosimulator_processes/verify/core.py b/biosimulator_processes/verify/core.py
new file mode 100644
index 000000000..15cf43244
--- /dev/null
+++ b/biosimulator_processes/verify/core.py
@@ -0,0 +1,209 @@
+from typing import Dict, Union
+
+import numpy as np
+import pandas as pd
+import seaborn as sns
+import matplotlib.pyplot as plt
+from process_bigraph import Process
+
+from biosimulator_processes.data_model.compare_data_model import ODEProcessIntervalComparison, ODEComparisonResult
+from biosimulator_processes.data_model.verify_data_model import OutputAspectVerification
+from biosimulator_processes.services.rest_service import BiosimulationsRestService
+
+
+# *VERIFICATION*å
+def _is_equal(a, b):
+ if isinstance(a, list):
+ a = np.array(a)
+ if isinstance(b, list):
+ b = np.array(b)
+
+ return np.allclose(a, b)
+
+
+def is_equal(a, b) -> bool:
+ return a == b or b == a
+
+
+def create_ode_process_instance(process_name: str, biomodel_id=None, sbml_model_file=None) -> Process:
+ module_name = f'{process_name}_process'
+ import_statement = f'biosimulator_processes.processes.{module_name}'
+ module_paths = module_name.split('_')
+ class_name = module_paths[0].replace(module_name[0], module_name[0].upper())
+ class_name += module_paths[1].replace(module_paths[1][0], module_paths[1][0].upper())
+ module = __import__(
+ import_statement, fromlist=[class_name])
+ model_source = biomodel_id or sbml_model_file
+ bigraph_class = getattr(module, class_name)
+ return bigraph_class(config={'model': {'model_source': model_source}})
+
+
+def verify_ode_process_outputs(process_name: str, target_report_fp: str, biomodel_id: str = None, sbml_model_file: str = None):
+ process = create_ode_process_instance(process_name, biomodel_id, sbml_model_file)
+ process_keys = list(process.inputs()['floating_species_concentrations'].keys())
+
+ report_outputs = BiosimulationsRestService().read_report_outputs(report_file_path=target_report_fp)
+
+ names_verification = verify_ode_process_output_names(process_name, target_report_fp, biomodel_id, sbml_model_file)
+
+ # TODO: here, read the SEDML file to determine the duration of time used for expected results.
+ for d in report_outputs.data:
+ print(f'Species: {d.dataset_label}, Num points: {len(d.data)}')
+
+ # TODO: iterate over d.data length to infer number of steps used in original simulation.
+
+
+# TODO: make this more general
+def verify_ode_process_output_names(process_name: str, source_report_fp: str, biomodel_id: str = None, sbml_model_file: str = None) -> OutputAspectVerification:
+ # Get the class from the module
+ # TODO: Automatically generate this from the biosimulations rest server
+ process = create_ode_process_instance(process_name, biomodel_id, sbml_model_file)
+ process_keys = list(process.inputs()['floating_species_concentrations'].keys())
+
+ report_outputs = BiosimulationsRestService().read_report_outputs(report_file_path=source_report_fp)
+ report_keys = [datum.dataset_label for datum in report_outputs.data]
+ for i, val in enumerate(report_keys):
+ if report_keys[i].lower() == 'time':
+ report_keys.pop(i)
+
+ return OutputAspectVerification(
+ aspect_type='names',
+ is_verified=is_equal(report_keys, process_keys),
+ expected_data=report_keys,
+ process_data=process_keys)
+
+
+def transform_data(data: list[float], r: tuple, data_type: str = 'float64') -> np.ndarray:
+ """Transform the `data` to fit range `r`, where `r=(rangeStart, rangeStop)`"""
+ min_orig = min(data)
+ max_orig = max(data)
+ s, e = r[0], r[1]
+ normalized_data = [s + ((x - min_orig) * (e - s) / (max_orig - min_orig)) for x in data]
+ return np.array(normalized_data, dtype=data_type)
+
+
+# *COMPARISONS*
+def generate_interval_comparisons(ode_process_comparison_output: ODEComparisonResult):
+ all_comparison_data = []
+
+ for interval_output in ode_process_comparison_output.outputs:
+ time_id = interval_output.interval_id
+ interval_output_attributes = vars(interval_output)
+
+ concentrations_data = []
+ for output_key, output_value in interval_output_attributes.items():
+ if 'concentrations' in output_key:
+ process_interval_output = np.array(list(interval_output_attributes[output_key].values()))
+ concentrations_data.append(process_interval_output)
+ if isinstance(output_value, dict):
+ process_outputs = list(output_value.values())
+
+ interval_comparison = generate_ode_process_interval_comparison_data(outputs=concentrations_data, time_id=time_id)
+ all_comparison_data.append(interval_comparison)
+
+ return all_comparison_data
+
+
+def generate_ode_process_interval_comparison_data(outputs: list[np.array], time_id: Union[float, int]) -> ODEProcessIntervalComparison:
+ simulators = ['copasi', 'tellurium', 'amici']
+
+ mse_matrix = np.zeros((3, 3), dtype=float)
+ rmse_matrix = np.zeros((3, 3), dtype=float)
+ inner_product_matrix = np.zeros((3, 3), dtype=float)
+ outer_product_matrices = {}
+
+ # fill the matrices with the calculated values
+ for i in range(len(simulators)):
+ for j in range(i, len(simulators)):
+ mse_matrix[i, j] = calculate_mse(outputs[i], outputs[j])
+ rmse_matrix[i, j] = calculate_rmse(outputs[i], outputs[j])
+ inner_product_matrix[i, j] = calculate_inner_product(outputs[i], outputs[j])
+ outer_product_matrices[(simulators[i], simulators[j])] = calculate_outer_product(outputs[i], outputs[j])
+ if i != j:
+ mse_matrix[j, i] = mse_matrix[i, j]
+ rmse_matrix[j, i] = rmse_matrix[i, j]
+ inner_product_matrix[j, i] = inner_product_matrix[i, j]
+
+ # convert matrices to dataframes for better visualization
+ mse_df = pd.DataFrame(mse_matrix, index=simulators, columns=simulators)
+ rmse_df = pd.DataFrame(rmse_matrix, index=simulators, columns=simulators)
+ inner_product_df = pd.DataFrame(inner_product_matrix, index=simulators, columns=simulators)
+
+ return ODEProcessIntervalComparison(
+ mse_data=mse_df,
+ rmse_data=rmse_df,
+ inner_prod_data=inner_product_df,
+ outer_prod_data=outer_product_matrices,
+ time_id=time_id)
+
+
+def generate_comparison_matrix(arr1: np.ndarray, arr2: np.ndarray, *simulators: str, use_tol: bool = False) -> pd.DataFrame:
+ """Generate a Mean Squared Error comparison matrix of arr1 and arr2, indexed by simulators by default, or an AllClose Tolerance routine if `use_tol` is set to true."""
+
+ # TODO: map arrs to simulators more tightly.
+ mse_matrix = np.zeros((3, 3), dtype=float)
+ outputs = [arr1, arr2]
+
+ # fill the matrices with the calculated values
+ for i in range(len(simulators)):
+ for j in range(i, len(simulators)):
+ mse_matrix[i, j] = calculate_mse(outputs[i], outputs[j])
+ if i != j:
+ mse_matrix[j, i] = mse_matrix[i, j]
+
+ return pd.DataFrame(mse_matrix, index=simulators, columns=simulators)
+
+
+def plot_ode_process_comparison(
+ mse_df: pd.DataFrame,
+ rmse_df: pd.DataFrame,
+ inner_product_df: pd.DataFrame,
+ outer_product_matrices: Dict,
+ show_outer=False
+ ) -> None:
+ # plot heatmaps for MSE, RMSE, and inner product matrices
+ plt.figure(figsize=(15, 5))
+
+ plt.subplot(1, 3, 1)
+ sns.heatmap(mse_df, annot=True, cmap="coolwarm", cbar=True)
+ plt.title("MSE Matrix")
+
+ plt.subplot(1, 3, 2)
+ sns.heatmap(rmse_df, annot=True, cmap="coolwarm", cbar=True)
+ plt.title("RMSE Matrix")
+
+ plt.subplot(1, 3, 3)
+ sns.heatmap(inner_product_df, annot=True, cmap="coolwarm", cbar=True)
+ plt.title("Inner Product Matrix")
+
+ plt.tight_layout()
+ plt.show()
+
+ if show_outer:
+ # visualize outer product matrices
+ fig, axes = plt.subplots(3, 3, figsize=(15, 15))
+ for idx, ((sim1, sim2), matrix) in enumerate(outer_product_matrices.items()):
+ ax = axes[idx // 3, idx % 3]
+ sns.heatmap(matrix, annot=True, fmt=".2f", cmap="coolwarm", ax=ax, cbar=True)
+ ax.set_title(f"Outer Product: {sim1} vs {sim2}")
+ ax.set_xlabel(sim2)
+ ax.set_ylabel(sim1)
+
+ plt.tight_layout()
+ plt.show()
+
+
+def calculate_mse(a, b):
+ return np.mean((a - b) ** 2)
+
+
+def calculate_rmse(a, b):
+ return np.sqrt(calculate_mse(a, b))
+
+
+def calculate_inner_product(a, b) -> np.ndarray:
+ return np.dot(a, b)
+
+
+def calculate_outer_product(a, b) -> np.ndarray:
+ return np.outer(a, b)
diff --git a/biosimulator_processes/verify/exec.py b/biosimulator_processes/verify/exec.py
deleted file mode 100644
index 0836f50a6..000000000
--- a/biosimulator_processes/verify/exec.py
+++ /dev/null
@@ -1,117 +0,0 @@
-from typing import Dict, Union
-
-import numpy as np
-import pandas as pd
-import seaborn as sns
-import matplotlib.pyplot as plt
-
-from biosimulator_processes.data_model.compare_data_model import ODEProcessIntervalComparison, ODEComparisonResult
-
-
-def generate_interval_comparisons(ode_process_comparison_output: ODEComparisonResult):
- all_comparison_data = []
-
- for interval_output in ode_process_comparison_output.outputs:
- time_id = interval_output.interval_id
- interval_output_attributes = vars(interval_output)
-
- concentrations_data = []
- for output_key, output_value in interval_output_attributes.items():
- if 'concentrations' in output_key:
- process_interval_output = np.array(list(interval_output_attributes[output_key].values()))
- concentrations_data.append(process_interval_output)
- if isinstance(output_value, dict):
- process_outputs = list(output_value.values())
-
- interval_comparison = generate_ode_process_interval_comparison_data(outputs=concentrations_data, time_id=time_id)
- all_comparison_data.append(interval_comparison)
-
- return all_comparison_data
-
-
-def generate_ode_process_interval_comparison_data(outputs: list[np.array], time_id: Union[float, int]) -> ODEProcessIntervalComparison:
- simulators = ['copasi', 'tellurium', 'amici']
-
- mse_matrix = np.zeros((3, 3), dtype=float)
- rmse_matrix = np.zeros((3, 3), dtype=float)
- inner_product_matrix = np.zeros((3, 3), dtype=float)
- outer_product_matrices = {}
-
- # fill the matrices with the calculated values
- for i in range(len(simulators)):
- for j in range(i, len(simulators)):
- mse_matrix[i, j] = calculate_mse(outputs[i], outputs[j])
- rmse_matrix[i, j] = calculate_rmse(outputs[i], outputs[j])
- inner_product_matrix[i, j] = calculate_inner_product(outputs[i], outputs[j])
- outer_product_matrices[(simulators[i], simulators[j])] = calculate_outer_product(outputs[i], outputs[j])
- if i != j:
- mse_matrix[j, i] = mse_matrix[i, j]
- rmse_matrix[j, i] = rmse_matrix[i, j]
- inner_product_matrix[j, i] = inner_product_matrix[i, j]
-
- # convert matrices to dataframes for better visualization
- mse_df = pd.DataFrame(mse_matrix, index=simulators, columns=simulators)
- rmse_df = pd.DataFrame(rmse_matrix, index=simulators, columns=simulators)
- inner_product_df = pd.DataFrame(inner_product_matrix, index=simulators, columns=simulators)
-
- return ODEProcessIntervalComparison(
- mse_data=mse_df,
- rmse_data=rmse_df,
- inner_prod_data=inner_product_df,
- outer_prod_data=outer_product_matrices,
- time_id=time_id)
-
-
-def plot_ode_process_comparison(
- mse_df: pd.DataFrame,
- rmse_df: pd.DataFrame,
- inner_product_df: pd.DataFrame,
- outer_product_matrices: Dict,
- show_outer=False
- ) -> None:
- # plot heatmaps for MSE, RMSE, and inner product matrices
- plt.figure(figsize=(15, 5))
-
- plt.subplot(1, 3, 1)
- sns.heatmap(mse_df, annot=True, cmap="coolwarm", cbar=True)
- plt.title("MSE Matrix")
-
- plt.subplot(1, 3, 2)
- sns.heatmap(rmse_df, annot=True, cmap="coolwarm", cbar=True)
- plt.title("RMSE Matrix")
-
- plt.subplot(1, 3, 3)
- sns.heatmap(inner_product_df, annot=True, cmap="coolwarm", cbar=True)
- plt.title("Inner Product Matrix")
-
- plt.tight_layout()
- plt.show()
-
- if show_outer:
- # visualize outer product matrices
- fig, axes = plt.subplots(3, 3, figsize=(15, 15))
- for idx, ((sim1, sim2), matrix) in enumerate(outer_product_matrices.items()):
- ax = axes[idx // 3, idx % 3]
- sns.heatmap(matrix, annot=True, fmt=".2f", cmap="coolwarm", ax=ax, cbar=True)
- ax.set_title(f"Outer Product: {sim1} vs {sim2}")
- ax.set_xlabel(sim2)
- ax.set_ylabel(sim1)
-
- plt.tight_layout()
- plt.show()
-
-
-def calculate_mse(a, b):
- return np.mean((a - b) ** 2)
-
-
-def calculate_rmse(a, b):
- return np.sqrt(calculate_mse(a, b))
-
-
-def calculate_inner_product(a, b) -> np.ndarray:
- return np.dot(a, b)
-
-
-def calculate_outer_product(a, b) -> np.ndarray:
- return np.outer(a, b)
diff --git a/containers/exec.py b/containers/exec.py
index 0014c2250..f2e80b896 100644
--- a/containers/exec.py
+++ b/containers/exec.py
@@ -13,7 +13,7 @@ def get_simulators(sims: List[str]):
and format as a dictionary. This dictionary is used as configuration for the dynamic
creation of containers.
"""
- with open('biosimulator_processes/poetry.lock') as file:
+ with open('biosimulator_processes/_lock') as file:
lock_data = toml.load(file)
simulators = []
@@ -76,7 +76,7 @@ def generate_dockerfile_contents(config: dict) -> str:
"""
base_path = 'biosimulator_processes/Dockerfile-base'
- # TODO: automate mapping simulators to poetry.lock: ie: simulators arg that searches the lock file
+ # TODO: automate mapping simulators to _lock: ie: simulators arg that searches the lock file
with open(base_path, 'r') as fp:
dockerfile_contents = fp.read()
for simulator in config['simulators']:
diff --git a/demos/BIOMD0000000012_url.xml b/demos/BIOMD0000000012_url.xml
new file mode 100644
index 000000000..562478b60
--- /dev/null
+++ b/demos/BIOMD0000000012_url.xml
@@ -0,0 +1,1021 @@
+
+
+
+
+
+ Elowitz2000 - Repressilator
+
+
This model describes the deterministic version of the repressilator system.
+
The authors of this model (see reference) use three transcriptional repressor systems that are not part of any natural biological clock to build an oscillating network that they called the repressilator. The model system was induced in Escherichia coli.
+
In this system, LacI (variable X is the mRNA, variable PX is the protein) inhibits the tetracycline-resistance transposon tetR (Y, PY describe mRNA and protein). Protein tetR inhibits the gene Cl from phage Lambda (Z, PZ: mRNA, protein),and protein Cl inhibits lacI expression. With the appropriate parameter values this system oscillates.
+
+
+
This model is described in the article:
+
+
Elowitz MB, Leibler S.
+
Nature. 2000 Jan; 403(6767):335-338
+
Abstract:
+
+
Networks of interacting biomolecules carry out many essential functions in living cells, but the 'design principles' underlying the functioning of such intracellular networks remain poorly understood, despite intensive efforts including quantitative analysis of relatively simple systems. Here we present a complementary approach to this problem: the design and construction of a synthetic network to implement a particular function. We used three transcriptional repressor systems that are not part of any natural biological clock to build an oscillating network, termed the repressilator, in Escherichia coli. The network periodically induces the synthesis of green fluorescent protein as a readout of its state in individual cells. The resulting oscillations, with typical periods of hours, are slower than the cell-division cycle, so the state of the oscillator has to be transmitted from generation to generation. This artificial clock displays noisy behaviour, possibly because of stochastic fluctuations of its components. Such 'rational network design may lead both to the engineering of new cellular behaviours and to an improved understanding of naturally occurring networks.
+
+
+
+
The model is based upon the equations in Box 1 of the paper; however, these equations as printed are dimensionless, and the correct dimensions have been returned to the equations, and the parameters set to reproduce Figure 1C (left).
+
+
+
The original model was generated by B.E. Shapiro using Cellerator version 1.0 update 2.1127 using Mathematica 4.2 for Mac OS X (June 4, 2002), November 27, 2002 12:15:32, using (PowerMac,PowerPC, Mac OS X,MacOSX,Darwin).
+
Nicolas Le Novere provided a corrected version generated by SBMLeditor on Sun Aug 20 00:44:05 BST 2006. This removed the EmptySet species. Ran fine on COPASI 4.0 build 18.
+
Bruce Shapiro revised the model with SBMLeditor on 23 October 2006 20:39 PST. This defines default units and correct reactions. The original Cellerator reactions while being mathematically correct did not accurately reflect the intent of the authors. The original notes were mostly removed because they were mostly incorrect in the revised version. Tested with MathSBML 2.6.0.
+
Nicolas Le Novere changed the volume to 1 cubic micrometre, to allow for stochastic simulation.
+
Changed by Lukas Endler to use the average livetime of mRNA instead of its halflife and a corrected value of alpha and alpha0.
+
Moreover, the equations used in this model were clarified, cf. below.
+
The equations given in box 1
+ of the original publication are rescaled in three respects (lowercase letters denote the rescaled, uppercase letters the unscaled number of molecules per cell):
+
+ the time is rescaled to the average mRNA lifetime, t_ave: τ = t/t_ave
+ the mRNA concentration is rescaled to the translation efficiency eff: m = M/eff
+ the protein concentration is rescaled to Km: p = P/Km
+
+
+ α
+ in the equations should be in units of rescaled proteins per promotor and cell, and β
+ is the ratio of the protein to the mRNA decay rates or the ratio of the mRNA to the protein halflife.
+
In this version of the model α
+ and β
+ are calculated correspondingly to the article, while p
+ and m
+ where just replaced by P/Km
+ resp. M/eff
+ and all equations multiplied by 1/t_ave
+ . Also, to make the equations easier to read, commonly used variables derived from the parameters given in the article by simple rules were introduced.
+
The parameters given in the article were:
+
+
+ promotor strength (repressed) ( tps_repr
+ ):
+ 5*10 -4
+ transcripts/(promotor*s)
+
+
+ promotor strength (full) ( tps_active
+ ):
+ 0.5
+ transcripts/(promotor*s)
+
+
+ mRNA half life, τ 1/2,mRNA
+ :
+ 2
+ min
+
+
+ protein half life, τ 1/2,prot
+ :
+ 10
+ min
+
+
+ K M
+ :
+ 40
+ monomers/cell
+
+
+ Hill coefficient n:
+ 2
+
+
+
+
From these the following constants can be derived:
+
+
+ average mRNA lifetime ( t_ave
+ ):
+
+ τ 1/2,mRNA
+ /ln(2)
+
+ = 2.89 min
+
+
+ mRNA decay rate ( kd_mRNA
+ ):
+
+ ln(2)/ τ 1/2,mRNA
+
+ = 0.347 min -1
+
+
+ protein decay rate ( kd_prot
+ ):
+
+ ln(2)/ τ 1/2,prot
+
+
+
+ transcription rate ( a_tr
+ ):
+
+ tps_active*60
+
+ = 29.97 transcripts/min
+
+
+ transcription rate (repressed) ( a0_tr
+ ):
+
+ tps_repr*60
+
+ = 0.03 transcripts/min
+
+
+ translation rate ( k_tl
+ ):
+
+ eff*kd_mRNA
+
+ = 6.93 proteins/(mRNA*min)
+
+
+ α :
+
+ a_tr*eff*τ 1/2,prot
+ /(ln(2)*K M
+ )
+
+ = 216.4 proteins/(promotor*cell*Km)
+
+
+ α 0
+ :
+
+ a0_tr*eff*τ 1/2,prot
+ /(ln(2)*K M
+ )
+
+ = 0.2164 proteins/(promotor*cell*Km)
+
+
+ β :
+
+ k_dp/k_dm
+
+ = 0.2
+
+
+
+
Annotation by the Kinetic Simulation Algorithm Ontology (KiSAO):
+
To reproduce the simulations run published by the authors, the model has to be simulated with any of two different approaches. First, one could use a deterministic method ( KISAO_0000035
+ ) with continuous variables ( KISAO_0000018
+ ). One sample algorithm to use is the CVODE solver ( KISAO_0000019
+ ). Second, one could simulate the system using Gillespie's direct method ( KISAO_0000029
+ ), which is a stochastic method ( KISAO_0000036
+ ) supporting adaptive timesteps ( KISAO_0000041
+ ) and using discrete variables ( KISAO_0000016
+ ).
+
+
+
+
To the extent possible under law, all copyright and related or neighbouring rights to this encoded model have been dedicated to the public domain worldwide. Please refer to CC0 Public Domain Dedication
+ for more information.
+
+
+
+
+
+
+
+
+
+
+ Le Novère
+ Nicolas
+
+ lenov@ebi.ac.uk
+
+ EMBL-EBI
+
+
+
+
+ Chelliah
+ Vijayalakshmi
+
+ viji@ebi.ac.uk
+
+ EMBL-EBI
+
+
+
+
+ Endler
+ Lukas
+
+ lukas@ebi.ac.uk
+
+ EMBL-EBI
+
+
+
+
+ Juty
+ Nick
+
+ juty@ebi.ac.uk
+
+ EMBL-EBI
+
+
+
+
+ Shapiro
+ Bruce
+
+ bshapiro@caltech.edu
+
+ Jet Propulsion Laboratory
+
+
+
+
+
+ 2009-01-20T14:03:56Z
+
+
+ 2013-07-10T10:59:30Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lacI inhibitor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tet repressor protein
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lambda repressor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ratio of protein to mRNA decay rates
+
+
+
+
+
+ Leakiness in protein copies per promoter and cell
+
+
+
+
+
+ Protein copies per promoter and cell
+
+
+
+
+
+ Average number of proteins per transcript
+
+
+
+
+
+ Hill coefficient
+
+
+
+
+
+ Number of repressor molecules per cell giving half maximal repression, in monomers per cell
+
+
+
+
+
+
+
+
+ mRNA decay rate constant
+
+
+
+
+
+ Protein decay rate costant
+
+
+
+
+
+ Translation rate constant
+
+
+
+
+
+ Transcription rate from free promotor minus a0_tr
+
+
+
+
+
+ Transcrition from free promotor in transcripts per second and promotor
+
+
+
+
+
+ Transcrition from fully repressed promotor in transcripts per second and promotor
+
+
+
+
+
+ Transcription rate from fully repressed promotor
+
+
+
+
+
+
+
+
+ tau_mRNA
+
+
+ 2
+
+
+
+
+
+
+
+
+ tau_mRNA
+ tau_prot
+
+
+
+
+
+
+
+ eff
+ t_ave
+
+
+
+
+
+
+
+
+
+ ps_a
+ ps_0
+
+ 60
+
+
+
+
+
+
+
+ ps_0
+ 60
+
+
+
+
+
+
+
+
+
+ 2
+
+ tau_prot
+
+
+
+
+
+
+
+
+
+ 2
+
+ tau_mRNA
+
+
+
+
+
+
+
+
+
+ a_tr
+ eff
+ tau_prot
+
+
+
+
+
+ 2
+
+ KM
+
+
+
+
+
+
+
+
+
+
+ a0_tr
+ eff
+ tau_prot
+
+
+
+
+
+ 2
+
+ KM
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ kd_mRNA
+ X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ kd_mRNA
+ Y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ kd_mRNA
+ Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ k_tl
+ X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ k_tl
+ Y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ k_tl
+ Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ kd_prot
+ PX
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ kd_prot
+ PY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ kd_prot
+ PZ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ a0_tr
+
+
+
+
+ a_tr
+
+
+ KM
+ n
+
+
+
+
+
+
+ KM
+ n
+
+
+
+ PZ
+ n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ a0_tr
+
+
+
+
+ a_tr
+
+
+ KM
+ n
+
+
+
+
+
+
+ KM
+ n
+
+
+
+ PX
+ n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ a0_tr
+
+
+
+
+ a_tr
+
+
+ KM
+ n
+
+
+
+
+
+
+ KM
+ n
+
+
+
+ PY
+ n
+
+
+
+
+
+
+
+
+
+
diff --git a/demos/model.xml b/demos/model.xml
new file mode 100644
index 000000000..6704b4adb
--- /dev/null
+++ b/demos/model.xml
@@ -0,0 +1,1332 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Yhp1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cln3
+ 0
+
+
+
+ SMBF
+ 0
+
+
+
+ Cln2
+ 1
+
+
+
+ Clb2
+ 0
+
+
+
+
+
+
+ Cln3
+ 0
+
+
+
+ SMBF
+ 1
+
+
+
+ Clb2
+ 0
+
+
+
+
+
+
+ Cln3
+ 1
+
+
+
+ Clb2
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SMBF
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SMBF
+ 1
+
+
+
+ Cdc20
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SMBF
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Clb2
+ 0
+
+
+
+ Cdc20
+ 0
+
+
+
+ CKI
+ 0
+
+
+
+ B
+ 1
+
+
+
+
+
+
+ Clb2
+ 0
+
+
+
+ Cdc20
+ 1
+
+
+
+ CKI
+ 0
+
+
+
+ Cdh1
+ 0
+
+
+
+ B
+ 1
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ SFF
+ 0
+
+
+
+ Cdc20
+ 0
+
+
+
+ CKI
+ 0
+
+
+
+ B
+ 1
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ SFF
+ 0
+
+
+
+ Cdc20
+ 1
+
+
+
+ CKI
+ 0
+
+
+
+ Cdh1
+ 0
+
+
+
+ B
+ 1
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ SFF
+ 1
+
+
+
+ Cdc20
+ 0
+
+
+
+ CKI
+ 0
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ SFF
+ 1
+
+
+
+ Cdc20
+ 1
+
+
+
+ CKI
+ 0
+
+
+
+ Cdh1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Clb2
+ 0
+
+
+
+ Cdc20
+ 0
+
+
+
+ CKI
+ 0
+
+
+
+ B
+ 1
+
+
+
+
+
+
+ Clb2
+ 0
+
+
+
+ Cdc20
+ 1
+
+
+
+ CKI
+ 0
+
+
+
+ Cdh1
+ 0
+
+
+
+ B
+ 1
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ SFF
+ 0
+
+
+
+ Cdc20
+ 0
+
+
+
+ CKI
+ 0
+
+
+
+ B
+ 1
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ SFF
+ 0
+
+
+
+ Cdc20
+ 1
+
+
+
+ CKI
+ 0
+
+
+
+ Cdh1
+ 0
+
+
+
+ B
+ 1
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ SFF
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ SFF
+ 1
+
+
+
+ M
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cdc20
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ FEAR
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FEAR
+ 1
+
+
+
+ MEN
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Clb2
+ 0
+
+
+
+ SFF
+ 1
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ SFF
+ 1
+
+
+
+ Cdc14
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cln2
+ 0
+
+
+
+ Clb5
+ 0
+
+
+
+ Clb2
+ 0
+
+
+
+ Swi5
+ 0
+
+
+
+ CKI
+ 1
+
+
+
+
+
+
+ Cln2
+ 0
+
+
+
+ Clb5
+ 0
+
+
+
+ Clb2
+ 0
+
+
+
+ Swi5
+ 1
+
+
+
+
+
+
+ Cln2
+ 0
+
+
+
+ Clb5
+ 0
+
+
+
+ Clb2
+ 1
+
+
+
+ Cdc14
+ 1
+
+
+
+ Swi5
+ 1
+
+
+
+
+
+
+ Cln2
+ 0
+
+
+
+ Clb5
+ 1
+
+
+
+ Cdc14
+ 1
+
+
+
+ Swi5
+ 1
+
+
+
+
+
+
+ Cln2
+ 1
+
+
+
+ Cdc14
+ 1
+
+
+
+ Swi5
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cln2
+ 0
+
+
+
+ Clb5
+ 0
+
+
+
+ Clb2
+ 0
+
+
+
+
+
+
+ Cln2
+ 0
+
+
+
+ Clb5
+ 0
+
+
+
+ Clb2
+ 1
+
+
+
+ Cdc14
+ 1
+
+
+
+
+
+
+ Cln2
+ 0
+
+
+
+ Clb5
+ 1
+
+
+
+ Cdc14
+ 1
+
+
+
+
+
+
+ Cln2
+ 1
+
+
+
+ Cdc14
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Clb5
+ 0
+
+
+
+ Clb2
+ 0
+
+
+
+ S
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+ Clb5
+ 0
+
+
+
+ Clb2
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+ Clb5
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cln2
+ 0
+
+
+
+ Clb5
+ 0
+
+
+
+ B
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+ Cln2
+ 0
+
+
+
+ Clb5
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+ Cln2
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Clb2
+ 0
+
+
+
+ M
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ S
+ 0
+
+
+
+ M
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+ Clb2
+ 1
+
+
+
+ S
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FEAR
+ 1
+
+
+
+ Cdc14
+ 1
+
+
+
+ M
+ 1
+
+
+
+ CD
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demos/mtor-signaling.xml b/demos/mtor-signaling.xml
new file mode 100644
index 000000000..2441c2564
--- /dev/null
+++ b/demos/mtor-signaling.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ compartment
+
+ Henri_Michaelis_Menten__irreversible
+ IR
+ Km1
+ V1
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demos/nf1_model.xml b/demos/nf1_model.xml
new file mode 100644
index 000000000..a8eeba8c0
--- /dev/null
+++ b/demos/nf1_model.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ k_diff_WT
+
+
+
+
+
+
+
+
+
+
+
+
+ k_diff_Het
+
+
+
+
+
+
+
+
+
+
+
+
+ k_diff_Null
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ k_tumor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demos/nf1_model_2.xml b/demos/nf1_model_2.xml
new file mode 100644
index 000000000..8131e24c9
--- /dev/null
+++ b/demos/nf1_model_2.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demos/process_comparison_demo.ipynb b/demos/process_comparison_demo.ipynb
index 711a93f3a..942f2512b 100644
--- a/demos/process_comparison_demo.ipynb
+++ b/demos/process_comparison_demo.ipynb
@@ -18,8 +18,8 @@
"\n",
"sys.path.insert(0, '..')"
],
- "outputs": [],
- "execution_count": 1
+ "execution_count": 1,
+ "outputs": []
},
{
"metadata": {
@@ -51,19 +51,8 @@
"\"\"\""
],
"id": "c4afe383081a61e8",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "\"\\nInterpretation of Metrics\\nLow Inner Product & High MSE/RMSE:\\n\\nDescription: Simulators produce outputs that are different both in magnitude and direction.\\nExample: If inner_product_matrix[0, 2] is low and mse_matrix[0, 2] is high, copasi and amici are very different.\\nHigh Inner Product & Low MSE/RMSE:\\n\\nDescription: Simulators produce very similar and aligned outputs.\\nExample: If inner_product_matrix[0, 1] is high and mse_matrix[0, 1] is low, copasi and tellurium are very similar.\\nHigh Inner Product & High MSE/RMSE:\\n\\nDescription: Simulators produce outputs that are aligned in direction but have significant differences in magnitude.\\nExample: This scenario might indicate systematic biases in the simulators' outputs.\\nLow Inner Product & Low MSE/RMSE:\\n\\nDescription: Simulators produce similar outputs, but the alignment is not perfect.\\nExample: This might indicate outputs that are close but vary slightly in their direction.\\n\""
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 2
+ "execution_count": 2,
+ "outputs": []
},
{
"metadata": {},
@@ -94,8 +83,8 @@
"time_id = np.random.randint(0, duration)"
],
"id": "e545642fe90b038",
- "outputs": [],
- "execution_count": 3
+ "execution_count": 3,
+ "outputs": []
},
{
"metadata": {
@@ -107,29 +96,11 @@
"cell_type": "code",
"source": [
"from biosimulator_processes.data_model.compare_data_model import ODEProcessIntervalComparison, ODEComparisonResult\n",
- "from biosimulator_processes.verify.exec import generate_ode_process_interval_comparison_data, plot_ode_process_comparison"
+ "from biosimulator_processes.verify.core import generate_ode_process_interval_comparison_data, plot_ode_process_comparison"
],
"id": "4ef2db06b9b15dfa",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CobraProcess registered successfully.\n",
- "CopasiProcess registered successfully.\n",
- "_CopasiProcess registered successfully.\n",
- "SmoldynProcess registered successfully.\n",
- "TelluriumProcess registered successfully.\n",
- "AmiciProcess registered successfully.\n",
- "ODEComparatorProcess registered successfully.\n",
- "GetSbmlStep registered successfully.\n",
- "CompositionPlotter registered successfully.\n",
- "Plotter2d registered successfully.\n",
- "ODEComparatorStep registered successfully.\n"
- ]
- }
- ],
- "execution_count": 4
+ "execution_count": 4,
+ "outputs": []
},
{
"metadata": {
@@ -147,19 +118,8 @@
"interval_comparison_data.time_id"
],
"id": "b958d96e7fb44ea8",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "92"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 5
+ "execution_count": 5,
+ "outputs": []
},
{
"metadata": {
@@ -174,69 +134,8 @@
"interval_comparison_data.mse_data"
],
"id": "e715f63503a2c63c",
- "outputs": [
- {
- "data": {
- "text/plain": [
- " copasi tellurium amici\n",
- "copasi 0.000 0.012 0.044\n",
- "tellurium 0.012 0.000 0.012\n",
- "amici 0.044 0.012 0.000"
- ],
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " tellurium \n",
- " amici \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " 0.000 \n",
- " 0.012 \n",
- " 0.044 \n",
- " \n",
- " \n",
- " tellurium \n",
- " 0.012 \n",
- " 0.000 \n",
- " 0.012 \n",
- " \n",
- " \n",
- " amici \n",
- " 0.044 \n",
- " 0.012 \n",
- " 0.000 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 6
+ "execution_count": 6,
+ "outputs": []
},
{
"metadata": {
@@ -251,69 +150,8 @@
"interval_comparison_data.inner_prod_data"
],
"id": "386143081014569d",
- "outputs": [
- {
- "data": {
- "text/plain": [
- " copasi tellurium amici\n",
- "copasi 102.19 104.28 106.61\n",
- "tellurium 104.28 106.43 108.81\n",
- "amici 106.61 108.81 111.25"
- ],
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " tellurium \n",
- " amici \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " 102.19 \n",
- " 104.28 \n",
- " 106.61 \n",
- " \n",
- " \n",
- " tellurium \n",
- " 104.28 \n",
- " 106.43 \n",
- " 108.81 \n",
- " \n",
- " \n",
- " amici \n",
- " 106.61 \n",
- " 108.81 \n",
- " 111.25 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 7
+ "execution_count": 7,
+ "outputs": []
},
{
"metadata": {
@@ -328,69 +166,8 @@
"interval_comparison_data.rmse_data"
],
"id": "262aa8a0779f9286",
- "outputs": [
- {
- "data": {
- "text/plain": [
- " copasi tellurium amici\n",
- "copasi 0.000000 0.109545 0.209762\n",
- "tellurium 0.109545 0.000000 0.109545\n",
- "amici 0.209762 0.109545 0.000000"
- ],
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " tellurium \n",
- " amici \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " 0.000000 \n",
- " 0.109545 \n",
- " 0.209762 \n",
- " \n",
- " \n",
- " tellurium \n",
- " 0.109545 \n",
- " 0.000000 \n",
- " 0.109545 \n",
- " \n",
- " \n",
- " amici \n",
- " 0.209762 \n",
- " 0.109545 \n",
- " 0.000000 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 8
+ "execution_count": 8,
+ "outputs": []
},
{
"metadata": {
@@ -405,45 +182,8 @@
"pp(interval_comparison_data.outer_prod_data)"
],
"id": "cdb2131db5296468",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{ ('amici', 'amici'): array([[ 1.69, 3.12, 5.98, 7.54, 9.1 ],\n",
- " [ 3.12, 5.76, 11.04, 13.92, 16.8 ],\n",
- " [ 5.98, 11.04, 21.16, 26.68, 32.2 ],\n",
- " [ 7.54, 13.92, 26.68, 33.64, 40.6 ],\n",
- " [ 9.1 , 16.8 , 32.2 , 40.6 , 49. ]]),\n",
- " ('copasi', 'amici'): array([[ 1.69, 3.12, 5.98, 7.54, 9.1 ],\n",
- " [ 3.12, 5.76, 11.04, 13.92, 16.8 ],\n",
- " [ 5.59, 10.32, 19.78, 24.94, 30.1 ],\n",
- " [ 7.28, 13.44, 25.76, 32.48, 39.2 ],\n",
- " [ 8.71, 16.08, 30.82, 38.86, 46.9 ]]),\n",
- " ('copasi', 'copasi'): array([[ 1.69, 3.12, 5.59, 7.28, 8.71],\n",
- " [ 3.12, 5.76, 10.32, 13.44, 16.08],\n",
- " [ 5.59, 10.32, 18.49, 24.08, 28.81],\n",
- " [ 7.28, 13.44, 24.08, 31.36, 37.52],\n",
- " [ 8.71, 16.08, 28.81, 37.52, 44.89]]),\n",
- " ('copasi', 'tellurium'): array([[ 1.69, 3.12, 5.85, 7.41, 8.84],\n",
- " [ 3.12, 5.76, 10.8 , 13.68, 16.32],\n",
- " [ 5.59, 10.32, 19.35, 24.51, 29.24],\n",
- " [ 7.28, 13.44, 25.2 , 31.92, 38.08],\n",
- " [ 8.71, 16.08, 30.15, 38.19, 45.56]]),\n",
- " ('tellurium', 'amici'): array([[ 1.69, 3.12, 5.98, 7.54, 9.1 ],\n",
- " [ 3.12, 5.76, 11.04, 13.92, 16.8 ],\n",
- " [ 5.85, 10.8 , 20.7 , 26.1 , 31.5 ],\n",
- " [ 7.41, 13.68, 26.22, 33.06, 39.9 ],\n",
- " [ 8.84, 16.32, 31.28, 39.44, 47.6 ]]),\n",
- " ('tellurium', 'tellurium'): array([[ 1.69, 3.12, 5.85, 7.41, 8.84],\n",
- " [ 3.12, 5.76, 10.8 , 13.68, 16.32],\n",
- " [ 5.85, 10.8 , 20.25, 25.65, 30.6 ],\n",
- " [ 7.41, 13.68, 25.65, 32.49, 38.76],\n",
- " [ 8.84, 16.32, 30.6 , 38.76, 46.24]])}\n"
- ]
- }
- ],
- "execution_count": 9
+ "execution_count": 9,
+ "outputs": []
},
{
"metadata": {},
@@ -464,40 +204,8 @@
"ode_process_comparison_output = ODEComparisonResult(duration=duration, num_steps=400, biomodel_id=biomodel_id)"
],
"id": "d09fc6aec4acac8c",
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2024-05-16 09:31:19.126 - amici.sbml_import - INFO - Finished importing SBML (2.69E-02s)\n",
- "2024-05-16 09:31:19.147 - amici.sbml_import - INFO - Finished processing SBML observables (1.90E-02s)\n",
- "2024-05-16 09:31:19.149 - amici.sbml_import - INFO - Finished processing SBML event observables (7.91E-07s)\n",
- "2024-05-16 09:31:19.173 - amici.de_model - INFO - Finished computing xdot (1.59E-03s)\n",
- "2024-05-16 09:31:19.177 - amici.de_model - INFO - Finished computing x0 (1.64E-03s)\n",
- "2024-05-16 09:31:19.208 - amici.de_model - INFO - Finished computing w (1.79E-02s)\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "found a filepath\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2024-05-16 09:31:19.529 - amici.de_export - INFO - Finished generating cpp code (3.17E-01s)\n",
- "2024-05-16 09:31:27.868 - amici.de_export - INFO - Finished compiling cpp code (8.34E+00s)\n",
- "/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/demos/../biosimulator_processes/processes/copasi_process.py:205: FutureWarning:\n",
- "\n",
- "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n",
- "\n"
- ]
- }
- ],
- "execution_count": 10
+ "execution_count": 10,
+ "outputs": []
},
{
"metadata": {
@@ -512,49 +220,8 @@
"pp(ode_process_comparison_output.outputs[:2])"
],
"id": "c6beccc1dbac44c",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[ ODEIntervalResult(interval_id=0.0,\n",
- " copasi_floating_species_concentrations={ 'v': 0.0,\n",
- " 'w': 0.0,\n",
- " 'x': 0.0,\n",
- " 'y': 0.0,\n",
- " 'z': 0.0},\n",
- " tellurium_floating_species_concentrations={ 'v': 0.0,\n",
- " 'w': 0.0,\n",
- " 'x': 0.0,\n",
- " 'y': 0.0,\n",
- " 'z': 0.0},\n",
- " amici_floating_species_concentrations={ 'v': 0.0,\n",
- " 'w': 0.0,\n",
- " 'x': 0.0,\n",
- " 'y': 0.0,\n",
- " 'z': 0.0},\n",
- " time=0.0),\n",
- " ODEIntervalResult(interval_id=1.0,\n",
- " copasi_floating_species_concentrations={ 'v': 8.120385674906026e+29,\n",
- " 'w': 1.0269512321591818e+30,\n",
- " 'x': 4.561206356844313e+29,\n",
- " 'y': 3.3349051597179906e+27,\n",
- " 'z': 1.1215709979998012e+29},\n",
- " tellurium_floating_species_concentrations={ 'v': 0.0,\n",
- " 'w': 0.0,\n",
- " 'x': 0.0,\n",
- " 'y': 0.0,\n",
- " 'z': 3465.232864640857},\n",
- " amici_floating_species_concentrations={ 'v': 9.4,\n",
- " 'w': 50000.0,\n",
- " 'x': 1000000000.0,\n",
- " 'y': 5600000.0,\n",
- " 'z': 190000000.0},\n",
- " time=3.0)]\n"
- ]
- }
- ],
- "execution_count": 11
+ "execution_count": 11,
+ "outputs": []
},
{
"metadata": {
@@ -565,7 +232,7 @@
},
"cell_type": "code",
"source": [
- "from biosimulator_processes.verify.exec import generate_interval_comparisons\n",
+ "from biosimulator_processes.verify.core import generate_interval_comparisons\n",
"\n",
"# 2. generate comparison data for all intervals\n",
"all_interval_comparisons = generate_interval_comparisons(ode_process_comparison_output)\n",
@@ -574,8 +241,8 @@
"interval_index = np.random.randint(0, len(all_interval_comparisons)) "
],
"id": "701416bdd281d7e2",
- "outputs": [],
- "execution_count": 12
+ "execution_count": 12,
+ "outputs": []
},
{
"metadata": {
@@ -592,69 +259,8 @@
"interval_mse"
],
"id": "4e6c96f14eca96e",
- "outputs": [
- {
- "data": {
- "text/plain": [
- " copasi tellurium amici\n",
- "copasi 0.000000e+00 1.423025e+65 1.423025e+65\n",
- "tellurium 1.423025e+65 0.000000e+00 5.180653e+20\n",
- "amici 1.423025e+65 5.180653e+20 0.000000e+00"
- ],
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " tellurium \n",
- " amici \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " 0.000000e+00 \n",
- " 1.423025e+65 \n",
- " 1.423025e+65 \n",
- " \n",
- " \n",
- " tellurium \n",
- " 1.423025e+65 \n",
- " 0.000000e+00 \n",
- " 5.180653e+20 \n",
- " \n",
- " \n",
- " amici \n",
- " 1.423025e+65 \n",
- " 5.180653e+20 \n",
- " 0.000000e+00 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ]
- },
- "execution_count": 13,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 13
+ "execution_count": 13,
+ "outputs": []
},
{
"metadata": {
@@ -671,69 +277,8 @@
"interval_rmse"
],
"id": "9487c64da58b2c5d",
- "outputs": [
- {
- "data": {
- "text/plain": [
- " copasi tellurium amici\n",
- "copasi 0.000000e+00 3.772301e+32 3.772301e+32\n",
- "tellurium 3.772301e+32 0.000000e+00 2.276105e+10\n",
- "amici 3.772301e+32 2.276105e+10 0.000000e+00"
- ],
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " tellurium \n",
- " amici \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " 0.000000e+00 \n",
- " 3.772301e+32 \n",
- " 3.772301e+32 \n",
- " \n",
- " \n",
- " tellurium \n",
- " 3.772301e+32 \n",
- " 0.000000e+00 \n",
- " 2.276105e+10 \n",
- " \n",
- " \n",
- " amici \n",
- " 3.772301e+32 \n",
- " 2.276105e+10 \n",
- " 0.000000e+00 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 14
+ "execution_count": 14,
+ "outputs": []
},
{
"metadata": {
@@ -750,69 +295,8 @@
"interval_inner_prod"
],
"id": "4a97bfc438450674",
- "outputs": [
- {
- "data": {
- "text/plain": [
- " copasi tellurium amici\n",
- "copasi 7.115126e+65 3.962599e+35 1.386043e+42\n",
- "tellurium 3.962599e+35 1.223583e+10 1.050849e+15\n",
- "amici 1.386043e+42 1.050849e+15 2.590328e+21"
- ],
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " tellurium \n",
- " amici \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " 7.115126e+65 \n",
- " 3.962599e+35 \n",
- " 1.386043e+42 \n",
- " \n",
- " \n",
- " tellurium \n",
- " 3.962599e+35 \n",
- " 1.223583e+10 \n",
- " 1.050849e+15 \n",
- " \n",
- " \n",
- " amici \n",
- " 1.386043e+42 \n",
- " 1.050849e+15 \n",
- " 2.590328e+21 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ]
- },
- "execution_count": 15,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 15
+ "execution_count": 15,
+ "outputs": []
},
{
"metadata": {
@@ -827,70 +311,8 @@
"pp(all_interval_comparisons[interval_index].outer_prod_data)"
],
"id": "d6feb45e3c85a362",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{ ('amici', 'amici'): array([[2.500e+21, 1.400e+19, 4.750e+20, 1.250e+17, 2.350e+13],\n",
- " [1.400e+19, 7.840e+16, 2.660e+18, 7.000e+14, 1.316e+11],\n",
- " [4.750e+20, 2.660e+18, 9.025e+19, 2.375e+16, 4.465e+12],\n",
- " [1.250e+17, 7.000e+14, 2.375e+16, 6.250e+12, 1.175e+09],\n",
- " [2.350e+13, 1.316e+11, 4.465e+12, 1.175e+09, 2.209e+05]]),\n",
- " ('copasi', 'amici'): array([[1.35016695e+42, 7.56093494e+39, 2.56531721e+41, 6.75083477e+37,\n",
- " 1.26915694e+34],\n",
- " [1.28020019e+40, 7.16912104e+37, 2.43238035e+39, 6.40100093e+35,\n",
- " 1.20338817e+32],\n",
- " [1.79115615e+41, 1.00304744e+39, 3.40319668e+40, 8.95578074e+36,\n",
- " 1.68368678e+33],\n",
- " [3.54386837e+43, 1.98456629e+41, 6.73334990e+42, 1.77193418e+39,\n",
- " 3.33123626e+35],\n",
- " [2.28259931e+43, 1.27825561e+41, 4.33693869e+42, 1.14129965e+39,\n",
- " 2.14564335e+35]]),\n",
- " ('copasi', 'copasi'): array([[7.29180322e+62, 6.91393594e+60, 9.67343936e+61, 1.91392558e+64,\n",
- " 1.23275606e+64],\n",
- " [6.91393594e+60, 6.55565006e+58, 9.17215374e+59, 1.81474438e+62,\n",
- " 1.16887362e+62],\n",
- " [9.67343936e+61, 9.17215374e+59, 1.28329614e+61, 2.53904865e+63,\n",
- " 1.63539671e+63],\n",
- " [1.91392558e+64, 1.81474438e+62, 2.53904865e+63, 5.02360120e+65,\n",
- " 3.23569259e+65],\n",
- " [1.23275606e+64, 1.16887362e+62, 1.63539671e+63, 3.23569259e+65,\n",
- " 2.08410384e+65]]),\n",
- " ('copasi', 'tellurium'): array([[0.00000000e+00, 0.00000000e+00, 2.98699260e+36, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 2.83220418e+34, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 3.96259896e+35, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 7.84014789e+37, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 5.04982530e+37, 0.00000000e+00,\n",
- " 0.00000000e+00]]),\n",
- " ('tellurium', 'amici'): array([[0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [5.53078379e+15, 3.09723892e+13, 1.05084892e+15, 2.76539190e+11,\n",
- " 5.19893677e+07],\n",
- " [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
- " 0.00000000e+00]]),\n",
- " ('tellurium', 'tellurium'): array([[0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 1.22358277e+10, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
- " 0.00000000e+00],\n",
- " [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
- " 0.00000000e+00]])}\n"
- ]
- }
- ],
- "execution_count": 16
+ "execution_count": 16,
+ "outputs": []
},
{
"metadata": {
@@ -905,19 +327,8 @@
"plot_ode_process_comparison(interval_mse, interval_rmse, interval_inner_prod, outer_product_matrices=all_interval_comparisons[interval_index].outer_prod_data)"
],
"id": "c26cc20396bd028a",
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABbQAAAHqCAYAAADcachDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC3M0lEQVR4nOzde3yO9ePH8fe989iMzUzO5zkNMyEmUgklpXTgq5JMCRXCyJmGiWLRnAr5qoj6KpQilZxPkePM+TBzNpvd2H5/7OfObdi9w2334fV8PO5H3df9ua77c7m3ve/rc30OhvT09HQBAAAAAAAAAGDjXPK7AgAAAAAAAAAAWIIGbQAAAAAAAACAXaBBGwAAAAAAAABgF2jQBgAAAAAAAADYBRq0AQAAAAAAAAB2gQZtAAAAAAAAAIBdoEEbAAAAAAAAAGAXaNAGAAAAAAAAANgFGrQBO5aenp7fVQAAALlEngMAYHvyO5/z+/0BW0aDNuxWp06dFBwcrJdeeumuZd577z0FBwdrwIABZts3b96sN998Uw0aNFDNmjXVrFkzDRw4UEePHjUrN2DAAAUHB9/10bhx43vW8Wa5CRMm3PH1tLQ0NWnSRMHBwVq0aJGFZ55hwYIFGjt2bJblOnXqpE6dOmXr2AAA5NTNfL71UbVqVdWtW1ft2rXT999/b1a+efPmCg4OVp8+fe56zBdeeEHBwcGaPHmy2faVK1fq1VdfVb169RQSEqLHH39co0eP1tmzZ7Os062PF1544a7vfezYMVO5r7/++o5lLl++rJCQEAUHB2v9+vVZ/ROZmTJlimbOnJlluebNm2f6PgMAcFyTJ09WcHBwflcjS+vXr79r7r/00ktauXKlVd/fGvl46tQpRURE6Pjx43ctw/cDIH+55XcFgNxwcXHRtm3bdOrUKRUvXtzsteTkZK1atSrTPmvXrtUbb7xhuuj19fXVkSNHNGvWLD3//PNasGCBypQpYyofGBiomJiYO76/u7u7RXVcvny5evfunem1jRs36vTp01ke406mTp2q+vXrZ1lu6NChOTo+AAA5Vb16dbP8uXHjhk6dOqUvvvhC/fr1U+HChdW0aVPT6y4uLlq1apVSU1Pl6elpdqxjx45p+/btmd5j8eLFioyM1EsvvaTXXntN3t7eiouL07Rp07Rq1Sp9++238vPzu2udblWwYMEsz+lmnr/44ouZXluxYoWMRmOWx7iTTz75RD169MiyXExMjHx8fHL0HgAAWNuQIUNUo0YNSRk9iy9evKhZs2ape/fuio2NNct9W/fXX39p9erVFpXl+wGQP2jQhl2rXr264uLitHz5cr322mtmr61atUre3t4qVKiQ2fbPPvtMtWrV0scff2za1qBBAzVt2lSPP/64Pv/8c7MLXg8PD9WpUyfHdaxbt642bdqkXbt2qXr16mav/fjjj6pWrZp2796d4+NnpVKlSlY7NgAAd+Lj43PH7Hz44Yf10EMPadGiRWYXtjez8vfff9fjjz9uts/SpUvvmJWffvqpnnzySQ0bNsy0rWHDhqpXr57atm2rBQsW6I033siyTpaqW7eu1q9fr3Pnzsnf39/stfuR57d/hwAAwJZUqlQpU87Wq1dPzZo105w5c+yqQTs7+H4A5A+mHIFdK1CggJo2barly5dnem3p0qV64okn5OZmft/mzJkzd5yLqlixYvrggw+ynEYkux588EEVLVo0Ux2vX7+un3/+WU8++WSmffbs2aMePXqoYcOGqlGjhpo0aaJRo0bp6tWrkjKGFR0/flyLFy9WcHCwjh07pkWLFql69epasGCBGjdurPr16ysuLs5sypE5c+Zkmt5k3bp1qlq1qj799NM8PW8AAG7n6ekpDw8PGQwGs+2lS5dWzZo175rnd8rKu+V51apVFRkZqZo1a+ZdxSU9/vjjcnFx0YoVK8y2nz9/XuvWrbtjHTdu3KguXbrowQcfVM2aNdW8eXNNnjxZaWlpkmQaSh4TE2P6/8mTJ+vxxx9XTEyM6tevr/DwcF28eNFsSHFUVJSCg4O1bt0603stWrRIwcHB+u677/L0vAEAtuHm9d727dv14osvKiQkRI888ojZtBQ3p8FYtmyZevXqpdDQUNWvX18ffPCBkpOTzY63YMECPfnkk6YpOCdPnqwbN26YXh8wYIBeffVVDR06VHXr1lXr1q3NXreEj4+PypcvrxMnTkj6d3qSr776So888ojq1q2rNWvWSJLWrFmjDh06KCwsTA0aNFCfPn108uRJs+Pt2bNHnTt3VmhoqB555BH973//M3v95vnfPp3ngAED1Lx5c7Nt3333nZ599lnVrl1bzZo100cffSSj0ahFixYpMjJSkvToo49mOZ0H3w+A/EGDNuxe69atTdOO3JSUlKTff/9dTz31VKbyzZo109atW9WpUyctXLjQbN7s9u3b67HHHsu0z/Xr1+/4sGSRBldXVz3xxBOZLtLXrl2r1NTUTMF6+vRpdezYUSkpKRozZoymT5+uJ598UnPnztWcOXMkZQRbYGCgmjZtqq+//lrFihWTlDGke9asWRo9erQiIyNVsWJFs2N36tRJDz74oMaOHatz584pKSlJAwcOVJ06dfTmm29meS4AAFgiPT3dLC9TU1MVHx+vyMhIXblyRW3bts20T+vWrU3TjtwUHx+vPXv23PFisFmzZvrxxx/19ttv64cfflBCQoLptddee00NGza8Z52ym+eFChVS48aNM+X5Tz/9pBIlSqhWrVpm2/fs2aPXXntNhQsX1sSJEzV16lTVq1dPMTExWrZsmSSZ5tx8/vnnzebfPHHihFavXq2JEycqMjLSbOoUKWONkHLlymno0KEyGo06ceKERo8erVatWumZZ57J8lwAAPYpLS1N7777rlq3bq1p06apbt26GjdunP744w+zckOHDlXJkiU1ZcoUdenSRQsXLtTUqVNNr8fGxmrw4MF66KGH9Nlnn6ljx46aPn26Bg8ebHacTZs26eTJk/r000/Vp08fubq6Zqu+RqNRx44dM5vSU8q4nu3fv7+GDBmi0NBQfffdd3r99df1wAMPaMKECYqMjNTWrVv14osvmtbFSEhI0H/+8x9dvnxZ0dHReueddzR+/Hiz/LfUvHnz1L9/f9WoUUMxMTGKiIjQ3LlzNWrUKDVr1kxvvfWWqZ7du3e/57H4fgDkD6Ycgd1r1qyZvL29zaYdWbFihQICAhQWFpap/DvvvKPLly9r4cKF2rBhgySpePHiatq0qV577TVVqFDBrPzx48dNc4Hdrl+/furSpUuWdWzdurXmzZtnNu3I0qVL9eijj2aaK3Tfvn2qVq2aPvnkE9NcWI0aNdKaNWu0fv16RUREqHr16vLw8JC/v3+mYV1vvvmmmjVrdsd6GAwGRUVF6emnn1Z0dLRcXV114cIFzZ49O9tfToC8YDQa1a5dOw0ePFgNGjSwaJ8NGzZo9OjROnTokIKDgzVixAhVrVpVkrRr1y49++yzZuVr1KiR7UVXAeTOxo0bM2WnwWBQlSpV9Mknn+iRRx7JtE+rVq0UHR1tNu3I0qVLFRoaqhIlSmQqP3LkSKWlpennn3/WL7/8IkkqU6aMHn30UXXu3FlBQUFZ1ummTz75RC1btszyvFq1aqWBAweaDSv+8ccf1bp160xl9+zZo0aNGik6OlouLhl9SBo3bqyVK1dq/fr1evLJJ00ZXrx4cbM8v379uvr376969erdsR5eXl4aM2aMOnTooGnTpmnLli3y8fHR8OHDszwHIDdyktuff/65Zs+erfPnz6tevXoaPHiwypUrZzrexIkT9eOPPyolJUX169fX4MGDM62NAyBDenq6unfvrvbt20uSwsLCtGLFCv32229q0qSJqVzTpk3Vv39/SdJDDz2kNWvW6LffflOfPn10+fJlTZkyRS+++KI++OADSVJ4eLgKFy6sDz74QJ07d1blypUlZeTRiBEjLPqdTEtL0/Xr1037HT9+XFOmTNG5c+fUsWNHs7IdOnQw5W5aWprGjx+v8PBwffTRR6YyN3uFz5w5U/369dMXX3yhGzduaNq0aaYMLl++/D0Xdr5bPT/99FM99thjGjVqlGl7SkqKfvzxR/n6+poa4KtVq6ZSpUpleUy+H8BWOfL1Ng3asHteXl5q3ry5WYP2jz/+qFatWmUa0ixlzIk9YsQI9ezZU6tXr9a6deu0fv16ff3111q0aJEmTJigFi1amMoHBgaa3c2+1QMPPGBRHcPCwhQUFKTly5erevXqMhqN+uWXXxQdHZ2pbHh4uMLDw3Xt2jXFxcXp8OHD2rdvn86dO6fChQtn+V7VqlW75+ulS5dW3759NXLkSKWnpysqKkqlS5e26DyAvJSamqo+ffpo//79Fu9z9OhRde3aVV27dtVTTz2lmTNnqnv37lq+fLk8PDwUFxenatWqafr06aZ9bp92CID11ahRw3TxdPr0aX388ce6du2aPv7440w3jm8qUaKE6tSpo+XLl5s1aN9+EXyTr6+vJk2apGPHjmn16tVav3691q9fr88//1xff/21Zs2apdDQ0DvW6Xa39xy7m8cee0yDBw/WihUr9OKLL+r06dPatGmThgwZonPnzpmVfeaZZ/TMM88oNTVVBw8e1OHDh7V7927duHFD165dy/K9ssrz0NBQvfbaa/r000+Vnp6uzz//PFNPLSAv5SS3//e//+nTTz/VRx99pLJly2ry5Ml68803tWzZMhkMBk2aNEm//PKLxo8fL39/f0VHR6tHjx5asGDBHb/HA5BZtt3s5HT7dCK3d3oq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H68ePXqoW7dumjNnjl577TX99NNP8vDw0NGjR1WqVCl9+OGHunTpkqKiovT+++/fdR58APfXwIED9fTTT2vUqFFavHjxHRckbtWqlaKiomQwGMx6iNyqQoUKioiIUGxsrE6cOKGnn35axYsX19mzZ/X9999r7dq1+vzzz832SUpKumeeh4SEWLRAcoECBdS0aVNNmzZNtWrVuus6FLVq1dKyZcs0f/58VaxYUXv27NHUqVNlMBgy5fmWLVu0cePGuy7ydLuDBw/q448/1gsvvKAHH3xQdevW1ZIlSzRo0CAtWbIkW0PEgdzIKrdvatSokRYvXqxvv/1W3bt31+LFizP97vzyyy+aNWuWhg8fLg8Pj/t6HoAzKVKkiN544w198sknSkpKUoMGDZSQkKBPPvlEBoPB1BPzfnFxcVHv3r0VGRmpPn366Omnn9b58+cVExMjPz8/de7cWZL06quvauHCherSpYt69uypGzduaOLEiWajnv38/BQaGqq5c+eqbNmy8vPz05w5c3T16lVT47Grq6t69uypESNGKCAgQM2bN9fBgwc1adIkdezYUX5+fqZe3CtWrNDDDz+sihUrZnkefD+APXCk620atOEwGjVqpEKFCumBBx64Z+C89NJLKlu2rObMmaMJEybowoULKliwoGrVqqXZs2dnWvk1MTHRNFTyTr777rssF2a46eYqza1atbrrHddu3brp/PnzmjNnjj799FM98MADatu2rQwGg2JjY3Xp0iUVKlRIr7/+uj788EN16dIl00X73QwfPlwpKSlmi2INGTJErVu31qBBgzRz5kyLjgNYS3x8vFatWmW22M21a9dUvnx5SRlfQJs3b24aCjly5Eg1a9ZMK1euVJs2bbRu3Tp5enqavtiOGTNGzz33nBISEhQUFHT/TwiAmQoVKqhTp06aNWuW5s+fb/oyfauWLVtq9OjRatasmWmk0p307t1b1apV04IFCzRq1CglJSWpUKFCqlevnhYuXJjpgnzXrl33zPONGzeaLmCz0rp1ay1fvlytW7e+a5kBAwaYFsI0Go0qVaqU3nrrLcXFxWnlypW6ceOGXF1d9eabb2rKlCnq2rWrli5dmuV7p6WlKTIyUr6+vnr//fclZfxtHDlypJ5//nmNHTtWI0aMsOg8gNzKKrdvKlGihEqUKKFq1appw4YN+u6779SzZ0/T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1KNHDw0bNkyJiYmSpNGjRys/P18ff/yxVq5cqdDQUMXGxkqS4uPj9eqrr2rSpElatWqV2rVrpxEjRljDG2U3Z84c1a5dW+PHj9eECRP0xBNPKCYmRv/73/80ZswYvf3221q5cmW597NmzRrde++9ev/999WmTZtSrz979my9/PLLmj9/vr777jv16tVLvXr10scff6zU1FQtXLiw3H1EgdOnT2vQoEG68cYb9dVXX+ndd9/VoUOHtGDBAknSli1blJycrM8++0z33HOPYmNjtWTJEs2bN09jx47VokWLFB8fX2i7b775pj7//HNNmzZNn3zyiU6cOKFJkyZd6acHuB1y27WQ27gYuQ24FnLbtZDbuBi5DXui5Egp/Pbbb0pLS9O0adMUEBCgZs2a6fnnn1dGRob8/Pz04osvysvLS02aNFFqaqreeustPfroo5KkatWqacqUKTIajWrSpIl++eUX/fe//9Vzzz2n22+/XXfeeadq164tSerdu7cGDhwoSTpy5IgMBoPCwsJUt25djRgxQrfccgsBawfVq1eXp6enAgMDtXr1aoWEhGjEiBGSpIYNG+rIkSNasmSJunbtWq791KhRQ7169Srz+o8++qiioqIkSS1atFCjRo3UpUsXSVLnzp2VkJBQrv7hvOzsbA0ePFj9+/eXwWBQvXr11LlzZ8XFxally5ayWCx6/vnn5e/vr3//+996//33NXToUEVERCgiIkIzZ85UUlKSWrZsad2mxWLRp59+qjFjxujmm2+WJE2ePFmrVq2qqKcJuA1y27WQ27gYuQ24FnLbtZDbuBi5DXtiQLsU9u/fr0aNGikgIMDa1qNHD02aNEmRkZHy8jr/64yOjlZqaqpOnTolSWrVqpWMRqP18VatWmnfvn0yGAzq1auXvvnmG23evFn79+/Xjh07rAHaoUMHNW/eXPfdd59atmyp2267TQ8++KDNvlB+SUlJSkhIUHR0tLUtPz9fnp6e5d52nTp1yrV+vXr1rN/7+vrabM/X11cmk6lc28d5NWvWVNeuXfXee+9p165dSkxM1O7du603MQkJCbHeUMLHx0eSVLduXev6Rb0e6enpysjIUGRkpLWtadOmGjp0qKOfDuD2yG3XRW5DIrcBV0Nuuy5yGxK5DfviXboULhVq5/7RLnQuIPPz84tcNz8/Xx4eHjKbzRowYIBOnTqlu+++W7feeqtyc3M1ZMgQSZKfn5+WL1+uDRs26Mcff9SKFSv00UcfUQPIzvLy8nTDDTdo4sSJpVrPYDAUua0LX++i/j4u5dzfy4UuDnkPDyoFOUpKSop69OihyMhItW/fXj179tRPP/2kbdu2SSr6PaCov4EL8WEYqDjktusityGR24CrIbddF7kNidyGffGfWgoNGzbUwYMHlZWVZW175ZVX9OGHH2rnzp3Kzc21tm/ZskXBwcGqXr26JGn37t02ly3t2LFD4eHhSkxM1MaNG/Xee+/pySefVKdOnXTs2DFJBZdObNmyRfPnz9f111+vcePGafXq1crJybG5iQXKr1GjRtq/f7/q1q2rBg0aqEGDBtq6dauWLl162fW8vb0lSWfOnLG2nbvBREkYjUadPXvW+nNycnIpew57+v7771WtWjXNnz9f/fr1U7t27ZScnCyLxVLmbVatWlVBQUE2l6rt2rVLN998s7Kzs+3RbQCXQG67LnIbErkNuBpy23WR25DIbdgXA9ql0KFDB9WoUUMTJ07Uvn37tGbNGn388cd64403ZDKZrO0//PCD5syZo169elnPJiUnJ2vGjBlKSkrSvHnztHPnTj3wwAOqWrWqPDw89PXXX+vIkSNavXq19S68JpNJvr6+euutt7R8+XIdPnxYX3/9tTIzM7nbsp34+/srKSlJHTt2VHZ2tvU1/PnnnzV16lSFhIRcdv1mzZrJ19dX77zzjpKTky95k4JLadWqlVatWqW4uDjFxcVp9uzZ5X1KKIfq1avr6NGj+v3335WcnKwFCxbou+++K/dlZn369NGbb76pP/74Q3v37tXUqVN19dVXy9fX1049B1AUctv1kNu4ELkNuBZy2/WQ27gQuQ17Ym5+KXh5eentt9/WlClT1K1bN9WoUcN6k4mwsDBNnTpVXbt2VXBwsPr166dBgwZZ142KilJaWpq6du2qhg0basGCBdZaTbGxsXrrrbc0c+ZMNWrUSM8//7zGjBmj+Ph4RUdHa+rUqdb9hoWFacaMGWrSpImOHz9eUb8Kl9GrVy+99tprOnDggBYuXKhp06apa9euql69unr37m3zGhYlICBAL774ombNmqWlS5fqjjvuUO/evZWenl6i/ffv31979uzRI488otDQUE2YMKHYfcJxunTpoo0bN2rYsGEyGAxq3bq1xowZozlz5pQrZAcOHKjTp09rxIgRysvLU6dOnfTCCy/YsecAikJuux5yGxcitwHXQm67HnIbFyK3YU8GS3nm9qNE5syZow0bNhR7OQ0AAKh45DYAAM6D3AYA90PJEQAAAAAAAACAU2BAGwAAAAAAAADgFCg5AgAAAAAAAABwCszQBgAAAAAAAAA4BQa0AQAAAAAAAABOgQFtAAAAAAAAAIBTYEAbAAAAAAAAAOAUGNAGAAAAAAAAADgFBrQBAAAAAAAAAE6BAW0AAAAAAAAAgFNgQBsAAAAAAAAA4BQY0AYAAAAAAAAAOIX/B5sBmAqpgloIAAAAAElFTkSuQmCC"
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "execution_count": 17
+ "execution_count": 17,
+ "outputs": []
},
{
"metadata": {
@@ -929,8 +340,8 @@
"cell_type": "code",
"source": "",
"id": "84f8b41e67dba682",
- "outputs": [],
- "execution_count": 17
+ "execution_count": 17,
+ "outputs": []
}
],
"metadata": {
diff --git a/demos/test_suite_demo.ipynb b/demos/test_suite_demo.ipynb
new file mode 100644
index 000000000..4cee4340a
--- /dev/null
+++ b/demos/test_suite_demo.ipynb
@@ -0,0 +1,160 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "id": "initial_id",
+ "metadata": {
+ "collapsed": true,
+ "ExecuteTime": {
+ "end_time": "2024-05-18T15:17:32.545659Z",
+ "start_time": "2024-05-18T15:17:31.090958Z"
+ }
+ },
+ "source": [
+ "import enum\n",
+ "import sys\n",
+ "\n",
+ "sys.path.insert(0, '..')\n",
+ "\n",
+ "import os\n",
+ "import requests\n",
+ "import json\n",
+ "from tempfile import mkdtemp\n",
+ "from urllib.request import urlretrieve\n",
+ "\n",
+ "import libsbml\n",
+ "from process_bigraph import pp \n",
+ "\n",
+ "from test_suite.test_data_model import TestCompositionResults"
+ ],
+ "execution_count": 1,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-18T15:17:32.549856Z",
+ "start_time": "2024-05-18T15:17:32.546749Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "test_archive_fp = '../test_suite/examples/sbml-core/Varusai-Sci-Rep-2018-mTOR-signaling-LSODA-LSODAR-SBML.omex'\n",
+ "os.path.exists(test_archive_fp)"
+ ],
+ "id": "f7329fc0b6d2f5a0",
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-18T15:17:32.553067Z",
+ "start_time": "2024-05-18T15:17:32.550550Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "from dataclasses import dataclass\n",
+ "\n",
+ "\n",
+ "@dataclass(frozen=True)\n",
+ "class A:\n",
+ " x: float\n",
+ " y: float \n",
+ " \n",
+ "\n",
+ "a1 = A(x=0.5, y=0.5 / 2)\n",
+ "\n",
+ "a1.x"
+ ],
+ "id": "8736db2d5dbe199e",
+ "execution_count": 3,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-18T15:17:32.614584Z",
+ "start_time": "2024-05-18T15:17:32.553715Z"
+ }
+ },
+ "cell_type": "code",
+ "source": "a1.x = 0.3\n",
+ "id": "76617db4b0cf1622",
+ "execution_count": 4,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-18T15:17:32.615520Z",
+ "start_time": "2024-05-18T15:17:32.615470Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "@dataclass\n",
+ "class B:\n",
+ " x: float\n",
+ " y: float"
+ ],
+ "id": "2a4eb4d6b3d74946",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "b1 = B(x=0.5, y=0.5)\n",
+ "\n",
+ "b1.x"
+ ],
+ "id": "9104001913e636b",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "b1.x = 0.3\n",
+ "\n",
+ "b1.x"
+ ],
+ "id": "41ddc0673a6b0187",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "",
+ "id": "ad828894daaf69e",
+ "execution_count": null,
+ "outputs": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/demos/various.ipynb b/demos/various.ipynb
new file mode 100644
index 000000000..97445a178
--- /dev/null
+++ b/demos/various.ipynb
@@ -0,0 +1,681 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "id": "initial_id",
+ "metadata": {
+ "collapsed": true,
+ "ExecuteTime": {
+ "end_time": "2024-05-21T19:58:40.075077Z",
+ "start_time": "2024-05-21T19:58:38.555281Z"
+ }
+ },
+ "source": [
+ "import sys\n",
+ "import os \n",
+ "\n",
+ "import numpy as np\n",
+ "from process_bigraph import pp\n",
+ "\n",
+ "\n",
+ "sys.path.insert(0, '..')\n",
+ "\n",
+ "\n",
+ "from biosimulator_processes.services.rest_service import BiosimulationsRestService"
+ ],
+ "execution_count": 1,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-21T19:58:40.099182Z",
+ "start_time": "2024-05-21T19:58:40.076169Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "import tellurium as te \n",
+ "\n",
+ "teModel = te.loadSBMLModel('/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/test_suite/examples/sbml-core/Caravagna-J-Theor-Biol-2010-tumor-suppressive-oscillations/Caravagna2010.xml')\n",
+ "\n",
+ "\n",
+ "results = teModel.simulate(0, 100.0, 1000)"
+ ],
+ "id": "51505516b1a7bbd6",
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-21T19:58:40.153255Z",
+ "start_time": "2024-05-21T19:58:40.099880Z"
+ }
+ },
+ "cell_type": "code",
+ "source": "teModel.plot()",
+ "id": "7b7907231df4a571",
+ "execution_count": 3,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-21T19:58:42.939959Z",
+ "start_time": "2024-05-21T19:58:40.153887Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "repressilator_run_id = \"61fea4a08c1e3dc95a79802e\"\n",
+ "\n",
+ "query = \"elowitz\"\n",
+ "\n",
+ "\n",
+ "# TODO: Refactor this to just be able to take in an OMEX archive. \n",
+ "# TODO: Load expected results json from above.\n",
+ "\n",
+ "\n",
+ "def download_simulation_report_file(url: str, save_dir=None) -> str:\n",
+ " from tempfile import mkdtemp\n",
+ " import requests \n",
+ " response = requests.get(url, stream=True)\n",
+ " \n",
+ " local_filename = \"reports.h5\"\n",
+ " download_dir = save_dir or mkdtemp()\n",
+ " fp = os.path.join(download_dir, local_filename)\n",
+ " if response.status_code == 200:\n",
+ " with open(fp, 'wb') as f:\n",
+ " for chunk in response.iter_content(chunk_size=8192): \n",
+ " if chunk: # filter out keep-alive new chunks\n",
+ " f.write(chunk)\n",
+ " return fp \n",
+ " else:\n",
+ " print(f\"Failed to download file. Status code: {response.status_code}\")\n",
+ "\n",
+ "\n",
+ "async def fetch_simulation_report_file(query: str):\n",
+ " from tempfile import mkdtemp\n",
+ " service = BiosimulationsRestService()\n",
+ " result = await service.fetch_files(query)\n",
+ " for f in result.files:\n",
+ " file_url = f['url']\n",
+ " if '.h5' in file_url:\n",
+ " save_dir = mkdtemp()\n",
+ " report_fp = download_simulation_report_file(file_url, save_dir)\n",
+ " return service.read_report_outputs(report_fp)\n",
+ " \n",
+ " \n",
+ "await fetch_simulation_report_file(query)"
+ ],
+ "id": "792b41d7a7b6007",
+ "execution_count": 4,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-21T19:58:42.941445Z",
+ "start_time": "2024-05-21T19:58:42.941395Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "from basico import *\n",
+ "\n",
+ "model_fp = '/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/demos/mtor-signaling.xml'\n",
+ "\n",
+ "basicoModel = load_model(model_fp)"
+ ],
+ "id": "d662a5d917e52a42",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "basicoModel",
+ "id": "e4af8267e270eb8f",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "import requests\n",
+ "get_files_url = f'https://api.biosimulations.dev/results/{repressilator_run_id}/download'\n",
+ "headers = {'accept': 'application/json'}\n",
+ "files_resp = requests.get(get_files_url, headers=headers)"
+ ],
+ "id": "43e85b4f535dd796",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "files_resp.json()",
+ "id": "a5c17e52eafdec21",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "import h5py\n",
+ "\n",
+ "def explore_hdf5(file_path):\n",
+ " with h5py.File(file_path, 'r') as f:\n",
+ " def print_attrs(name, obj):\n",
+ " print(f\"Name: {name}\")\n",
+ " print(\"Attributes:\")\n",
+ " for key, val in obj.attrs.items():\n",
+ " print(f\" {key}: {val}\")\n",
+ " if isinstance(obj, h5py.Dataset):\n",
+ " print(f\"Dataset shape: {obj.shape}\")\n",
+ " print(f\"Dataset dtype: {obj.dtype}\")\n",
+ " elif isinstance(obj, h5py.Group):\n",
+ " print(\"Group\")\n",
+ " print()\n",
+ " \n",
+ " f.visititems(print_attrs)\n",
+ "\n",
+ "# Usage example\n",
+ "file_path = '/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/test_suite/examples/sbml-core/Elowitz-Nature-2000-Repressilator/reports.h5'\n",
+ "explore_hdf5(file_path)"
+ ],
+ "id": "a32cf79c43b3a52d",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "def read_dataset(file_path, dataset_id):\n",
+ " with h5py.File(file_path, 'r') as f:\n",
+ " if dataset_id in f:\n",
+ " data = f[dataset_id][:]\n",
+ " print(f\"Data from dataset '{dataset_id}':\\n{data}\")\n",
+ " else:\n",
+ " print(f\"Dataset '{dataset_id}' not found in the file.\")\n",
+ " \n",
+ " \n",
+ "read_dataset(file_path, 'data_set_time')"
+ ],
+ "id": "50e94bdbad1de41f",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "from biosimulator_processes.services.rest_service import BiosimulationsRestService",
+ "id": "e4079a96d9ec5db3",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "",
+ "id": "5a18bfb627415dae",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "from basico import * \n",
+ "\n",
+ "\n",
+ "fp = '/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/demos/BIOMD0000000012_url.xml'\n",
+ "\n",
+ "model = load_model(fp)"
+ ],
+ "id": "cb63a39f24a3794f",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "get_species(model=model)",
+ "id": "c4ce852efe9e1ca1",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "from biosimulator_processes.processes.copasi_process import CopasiProcess\n",
+ "group_path = 'simulation.sedml/report'\n",
+ "dataset_label = 'cI protein'\n",
+ "outputs = BiosimulationsRestService().read_report_outputs(file_path, dataset_label)\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "process = CopasiProcess(config={'model': {'model_source': fp}})"
+ ],
+ "id": "426f89565958f483",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "process.inputs()[f'floating_species_concentrations']",
+ "id": "4e34292653057f9a",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "from biosimulator_processes.verify.core import verify_ode_process_outputs\n",
+ "\n",
+ "\n",
+ "verification = verify_ode_process_outputs('copasi', file_path, fp)"
+ ],
+ "id": "7cb779ab9700e3b9",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "process.initial_state()['floating_species_concentrations'].keys()",
+ "id": "fe264b58abab6899",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "def is_equal(a, b):\n",
+ " return a == b or b == a \n",
+ "\n",
+ "\n",
+ "from dataclasses import dataclass\n",
+ "\n",
+ "from process_bigraph import Process\n",
+ "\n",
+ "\n",
+ "@dataclass \n",
+ "class OutputAspectVerification:\n",
+ " aspect_type: str # one of: 'names', 'values'. TODO: Add more\n",
+ " is_verified: bool\n",
+ " \n",
+ "\n",
+ "def create_ode_process_instance(process_name: str, biomodel_id=None, sbml_model_file=None) -> Process:\n",
+ " module_name = f'{process_name}_process'\n",
+ " import_statement = f'biosimulator_processes.processes.{module_name}'\n",
+ " module_paths = module_name.split('_')\n",
+ " class_name = module_paths[0].replace(module_name[0], module_name[0].upper())\n",
+ " class_name += module_paths[1].replace(module_paths[1][0], module_paths[1][0].upper())\n",
+ " module = __import__(\n",
+ " import_statement, fromlist=[class_name])\n",
+ " model_source = biomodel_id or sbml_model_file\n",
+ " bigraph_class = getattr(module, class_name)\n",
+ " return bigraph_class(config={'model': {'model_source':model_source}})\n",
+ "\n",
+ "\n",
+ "def verify_ode_process_output_names(process_name: str, source_report_fp: str, biomodel_id: str = None, sbml_model_file: str = None) -> OutputAspectVerification:\n",
+ " # Get the class from the module\n",
+ " # TODO: Automatically generate this from the biosimulations rest server\n",
+ " process = create_ode_process_instance(process_name, biomodel_id, sbml_model_file)\n",
+ " process_keys = list(process.inputs()['floating_species_concentrations'].keys())\n",
+ " \n",
+ " report_outputs = BiosimulationsRestService().read_report_outputs(report_file_path=source_report_fp)\n",
+ " report_keys = [datum.dataset_label for datum in report_outputs.data]\n",
+ " for i, val in enumerate(report_keys):\n",
+ " if report_keys[i].lower() == 'time':\n",
+ " report_keys.pop(i)\n",
+ " \n",
+ " return OutputAspectVerification(aspect_type='names', is_verified=is_equal(report_keys, process_keys))"
+ ],
+ "id": "3802dbae678cdaaa",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "from biosimulator_processes.verify.core import verify_ode_process_output_names\n",
+ "\n",
+ "\n",
+ "verify_ode_process_output_names(process_name='copasi', source_report_fp=file_path, sbml_model_file=fp)"
+ ],
+ "id": "301900dd238ff637",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "x = np.array([1, 2, 3])\n",
+ "y = np.array([1, 2, 3.0000001])"
+ ],
+ "id": "b5735ea91ffa5ada",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "np.allclose(x, y)",
+ "id": "a18a4b13fc1307d9",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "class TokenizedWord:\n",
+ " def __init__(self, word: str, alphabet=None, language='english'):\n",
+ " super().__init__()\n",
+ " self.word = word\n",
+ " self.alphabet = alphabet or [chr(i) for i in range(ord('a'), ord('z') + 1)]\n",
+ " self.language = language\n",
+ " self.data = self.tokenize()\n",
+ " self.encoded = list(self.data.values())\n",
+ " \n",
+ " def __repr__(self):\n",
+ " return repr(self.tokenize())\n",
+ " \n",
+ " def tokenized_word(self):\n",
+ " return list(self.tokenize().values())\n",
+ " \n",
+ " def _create_mapping(self, data):\n",
+ " return {float(i): letter for i, letter in enumerate(data)}\n",
+ " \n",
+ " def transform_data(self, data, r: tuple) -> np.ndarray:\n",
+ " \"\"\"Transform the `data` to fit range `r`, where `r=(rangeStart, rangeStop)`\"\"\"\n",
+ " min_orig = min(data)\n",
+ " max_orig = max(data)\n",
+ " normalized_data = [a + ((x - min_orig) * (r[1] - r[0]) / (max_orig - min_orig)) for x in data]\n",
+ " return np.array(normalized_data, dtype='float64')\n",
+ " \n",
+ " def normalize(self, data, a, z):\n",
+ " min_orig = min(data)\n",
+ " max_orig = max(data)\n",
+ " \n",
+ " # Apply min-max normalization\n",
+ " normalized_data = [a + ((x - min_orig) * (z - a) / (max_orig - min_orig)) for x in data]\n",
+ " return normalized_data\n",
+ " \n",
+ " def tokenize(self):\n",
+ " # 1. create alphabet mapping (implement this for any given spoken language/music. For example, 12 tones mapped to the harmonic series\n",
+ " alphabet_data = self.alphabet\n",
+ " alphabet_mapping = self._create_mapping(alphabet_data)\n",
+ " \n",
+ " # 2. transform letter mapping range to fit 0-9, as double digits cannot be verified/read, which in python is 0, 9+1\n",
+ " alphabet_index = [int(n) for n in list(alphabet_mapping.keys())]\n",
+ " \n",
+ " input_range = [int(min(list(alphabet_mapping.keys()))), int(max(list(alphabet_mapping.keys())))]\n",
+ " start = input_range[0]\n",
+ " end = input_range[1]\n",
+ " transformed_letter_map_index = np.linspace(0, 9, end, dtype='float64')\n",
+ " \n",
+ " transformed_alphabet_mapping = dict(zip(alphabet_data, transformed_letter_map_index))\n",
+ " word_letters = [letter for letter in self.word]\n",
+ " \n",
+ " return {\n",
+ " letter: transformed_alphabet_mapping[letter]\n",
+ " for letter in word_letters}\n",
+ " "
+ ],
+ "id": "7ae1b5c1df0d3bb7",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "[letter for letter in 'hello']",
+ "id": "703de44f17ea10a9",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "tokenized = TokenizedWord(word='what')\n",
+ "\n",
+ "tokenized.tokenized_word()"
+ ],
+ "id": "8b05c8ab2f3aaf32",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "tokenize_word('hello')",
+ "id": "ef062eee373b198d",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "def transform_data(data, r: tuple) -> np.ndarray:\n",
+ " \"\"\"Transform the `data` to fit range `r`, where `r=(rangeStart, rangeStop)`\"\"\"\n",
+ " min_orig = min(data)\n",
+ " max_orig = max(data)\n",
+ " normalized_data = [a + ((x - min_orig) * (r[1] - r[0]) / (max_orig - min_orig)) for x in data]\n",
+ " return np.array(normalized_data, dtype='float64')\n",
+ "\n",
+ "\n",
+ "# Original data\n",
+ "data = list(range(26)) # This generates a list [0, 1, 2, ..., 25]\n",
+ "\n",
+ "# Define the target range\n",
+ "a = 0\n",
+ "z = 1\n",
+ "\n",
+ "# Normalize the data\n",
+ "normalized_data = transform_data(data, (a, z))\n",
+ "print(normalized_data)"
+ ],
+ "id": "c9c049229c12835a",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "",
+ "id": "badac6786b231c34",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": [
+ "# 1. User uploads an omex archive(fp) --> .\n",
+ "# 2. Omex is unpacked into a temp dir\n",
+ "# 3. report.h5 is extracted from temp dir (list of paths?)\n",
+ "# 3a. expected-results.json extracted from temp dir\n",
+ "# 4. Return dataclass from expected results json\n",
+ "# 5. Extract species names/dataset labels by indexing over the datasets in expected results\n",
+ "# 6. Use the output of #5 as an index over the report.h5 from #3.\n",
+ "# 7. Extract the time points data from #4 and create/infer time vector.\n",
+ "# 8. Use the inference from #7 as set data for both the Composite engine AND process itself (num steps).\n",
+ "# 9. Verify the simulation settings in process constructor(s) against ExpectedResults (#5) BEFORE running \n",
+ "# 10. Run the composite from #8 if #9 passes.\n",
+ "# 11. Get the results from #10.\n",
+ "# 12. Run Comparison matrices and assert all zeros."
+ ],
+ "id": "4b9f65536036a6f7",
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-21T19:58:44.645234Z",
+ "start_time": "2024-05-21T19:58:44.444828Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "from biosimulators_utils.combine.io import CombineArchiveReader\n",
+ "from fastapi import FastAPI, UploadFile, File \n",
+ "from fastapi.responses import StreamingResponse\n",
+ "\n",
+ "# app = FastAPI()\n",
+ "\n",
+ "\n",
+ "class SourceServerExchange:\n",
+ " pass \n",
+ "\n",
+ "\n",
+ "class UploadOmexExchange(SourceServerExchange):\n",
+ " app = FastAPI()\n",
+ " def __init__(self, app: FastAPI = app):\n",
+ " self.app = app \n",
+ " \n",
+ " @app.post(\"/upload-omex\")\n",
+ " async def upload_omex(self, file: UploadFile = File(...)):\n",
+ " contents = await file.read()\n",
+ " path = self.save_omex_archive(contents)\n",
+ " return {\"filename\": path}\n",
+ " \n",
+ " def save_omex_archive(self, contents: bytes) -> str:\n",
+ " with tempfile.NamedTemporaryFile(delete=False, suffix='.omex') as temp_file:\n",
+ " temp_file.write(contents)\n",
+ " archive_path = temp_file.name\n",
+ " return archive_path\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "app = FastAPI()\n",
+ "@app.post(\"/upload-omex\")\n",
+ "async def upload_omex(file: UploadFile = File(...)):\n",
+ " contents = await file.read()\n",
+ " \n",
+ " save_dir = tempfile.mkdtemp()\n",
+ " archive_response = save_omex_archive(contents, save_dir)\n",
+ " return {\"filename\": archive_response['source']}\n",
+ "\n",
+ "\n",
+ "def unpack_omex(archive_fp: str, save_dir: str):\n",
+ " return CombineArchiveReader().run(archive_fp, save_dir)\n",
+ "\n",
+ "\n",
+ "def save_omex_archive(contents: bytes, save_dir: str):\n",
+ " with tempfile.NamedTemporaryFile(delete=False, suffix='.omex') as temp_file:\n",
+ " temp_file.write(contents)\n",
+ " archive_path = temp_file.name\n",
+ " \n",
+ " return {'source': archive_path, 'archive': unpack_omex(archive_path, save_dir), 'save_dir': save_dir}"
+ ],
+ "id": "e15bceef13ab6cab",
+ "execution_count": 5,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-21T20:01:22.604852Z",
+ "start_time": "2024-05-21T20:01:22.601504Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "from biosimulator_processes.services.rest_service import BiosimulationsRestService\n",
+ "\n",
+ "\n",
+ "RUN_ID = '61fea4a08c1e3dc95a79802e'\n",
+ "PROJECT_NAME = 'Repressilator'\n",
+ "\n",
+ "\n",
+ "class VerifyResults:\n",
+ " def __init__(self, process_address_name: str, truth_run_id: str, truth_project_name: str):\n",
+ " self.process_address_name = process_address_name\n",
+ " self.truth_run_project_name = truth_project_name\n",
+ " self.biosim_service = BiosimulationsRestService()\n",
+ " \n",
+ " self.get_report_and_expected_results_from_project(truth_run_id, truth_project_name)\n",
+ " \n",
+ " def fetch_project_files(self, run_id: str, proj_name: str):\n",
+ " return self.biosim_service.get_project_files(run_id=run_id, project_name=proj_name)\n",
+ " \n",
+ " def get_report_and_expected_results_from_project(self, run_id, proj_name):\n",
+ " project_files = self.fetch_project_files(run_id, proj_name)\n",
+ " report_file = None \n",
+ " expected_results_file = None\n",
+ " \n",
+ " for file in project_files.files:\n",
+ " location = file['location']\n",
+ " if 'expected_results' in location:\n",
+ " expected_results_file = file \n",
+ " if 'report' in location:\n",
+ " report_file = file \n",
+ " \n",
+ " print(expected_results_file)"
+ ],
+ "id": "283df04da7d3e400",
+ "execution_count": 8,
+ "outputs": []
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-05-21T20:01:23.255668Z",
+ "start_time": "2024-05-21T20:01:23.106727Z"
+ }
+ },
+ "cell_type": "code",
+ "source": "VerifyResults('copasi', RUN_ID, PROJECT_NAME)",
+ "id": "713848772f8edba6",
+ "execution_count": 9,
+ "outputs": []
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "source": "",
+ "id": "228f552cd30039b9",
+ "execution_count": null,
+ "outputs": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/demos/verify_api_demo.ipynb b/demos/verify_api_demo.ipynb
deleted file mode 100644
index d190f3def..000000000
--- a/demos/verify_api_demo.ipynb
+++ /dev/null
@@ -1,3030 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "source": [
- "import sys\n",
- "\n",
- "sys.path.insert(0, '..')\n",
- "\n",
- "import os\n",
- "import requests\n",
- "import json\n",
- "from tempfile import mkdtemp\n",
- "from urllib.request import urlretrieve\n",
- "import libsbml\n",
- "import amici\n",
- "import os\n",
- "from biosimulator_processes.utils import prepare_single_ode_process_document\n",
- "from biosimulator_processes.data_model.compare_data_model import ODEComparisonDocument, DocumentFactory\n",
- "from biosimulator_processes import CORE\n",
- "from process_bigraph import Composite, pp"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:42.738914Z",
- "start_time": "2024-05-16T11:34:42.736916Z"
- }
- },
- "id": "159305ff5f3dc676",
- "outputs": [],
- "execution_count": 4
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:43.065601Z",
- "start_time": "2024-05-16T11:34:43.062732Z"
- }
- },
- "cell_type": "code",
- "source": [
- "process_name = 'copasi'\n",
- "module_name = f'{process_name}_process'\n",
- "import_statement = f'biosimulator_processes.processes.{module_name}'\n",
- "module_paths = module_name.split('_')\n",
- "class_name = module_paths[0].replace(module_name[0], module_name[0].upper())\n",
- "class_name += module_paths[1].replace(module_paths[1][0], module_paths[1][0].upper())\n",
- "\n",
- "\n",
- "class_name, module_paths[1][0].upper()"
- ],
- "id": "521b15f5cec33415",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "('CopasiProcess', 'P')"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 5
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:43.069587Z",
- "start_time": "2024-05-16T11:34:43.068029Z"
- }
- },
- "cell_type": "code",
- "source": [
- "module = __import__(\n",
- " import_statement, fromlist=[class_name])\n",
- "# Get the class from the module\n",
- "bigraph_class = getattr(module, class_name)"
- ],
- "id": "2a0046a55ff3a429",
- "outputs": [],
- "execution_count": 6
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:45.107025Z",
- "start_time": "2024-05-16T11:34:43.105213Z"
- }
- },
- "cell_type": "code",
- "source": "process = bigraph_class(config={'model': {'model_source': 'BIOMD0000000630'}})",
- "id": "dc3b61b7e6043409",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "found a biomodel id\n"
- ]
- }
- ],
- "execution_count": 7
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:45.110301Z",
- "start_time": "2024-05-16T11:34:45.108802Z"
- }
- },
- "cell_type": "code",
- "source": "",
- "id": "9918f0853c8f92f2",
- "outputs": [],
- "execution_count": 7
- },
- {
- "cell_type": "code",
- "id": "initial_id",
- "metadata": {
- "collapsed": true,
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:45.112906Z",
- "start_time": "2024-05-16T11:34:45.110936Z"
- }
- },
- "source": [
- "# Step 1: Define the input parameters of the api method\n",
- "\n",
- "biomodel_id = 'BIOMD0000000630'\n",
- "sbml_dirpath = '../biosimulator_processes/model_files/sbml'\n",
- "model_fp = os.path.join(sbml_dirpath, f'{biomodel_id}_url.xml')\n",
- "species_context = 'concentrations'\n",
- "species_port_name = f'floating_species_{species_context}'\n",
- "species_store = [f'floating_species_{species_context}_store']\n",
- "duration = 30\n",
- "n_steps = 42\n",
- "simulators = ['copasi', 'tellurium']"
- ],
- "outputs": [],
- "execution_count": 8
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:45.116248Z",
- "start_time": "2024-05-16T11:34:45.114099Z"
- }
- },
- "cell_type": "code",
- "source": [
- "# Step 2: Define a simple function that encapsulates that which is defined in the rest of the workflow\n",
- "\n",
- "def generate_ode_verification(biomodel_id, dur) -> dict:\n",
- " compare = {\n",
- " 'compare_ode': {\n",
- " '_type': 'step',\n",
- " 'address': 'local:compare_ode_step',\n",
- " 'config': {'biomodel_id': biomodel_id, 'duration': dur},\n",
- " 'inputs': {},\n",
- " 'outputs': {\n",
- " 'comparison_data': ['comparison_store']\n",
- " }\n",
- " },\n",
- " 'verification_data': {\n",
- " '_type': 'step',\n",
- " 'address': 'local:ram-emitter',\n",
- " 'config': {\n",
- " 'emit': {\n",
- " 'comparison_data': 'tree[any]'\n",
- " }\n",
- " },\n",
- " 'inputs': {\n",
- " 'comparison_data': ['comparison_store']\n",
- " }\n",
- " }\n",
- " }\n",
- " \n",
- " \n",
- " wf = Composite(config={'state': compare}, core=CORE)\n",
- " wf.run(1)\n",
- " comparison_results = wf.gather_results()\n",
- " return comparison_results, wf"
- ],
- "id": "9edbdd9710f9fc35",
- "outputs": [],
- "execution_count": 9
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.767240Z",
- "start_time": "2024-05-16T11:34:45.116737Z"
- }
- },
- "cell_type": "code",
- "source": [
- "# Step 3: View the results. TODO: Add RMSE here.\n",
- "\n",
- "verification_results, wf = generate_ode_verification(biomodel_id, duration)\n",
- "\n",
- "pp(verification_results)"
- ],
- "id": "f5da5662b93fb7d1",
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2024-05-16 07:34:47.707 - amici.sbml_import - INFO - Finished importing SBML (2.75E-02s)\n",
- "2024-05-16 07:34:47.730 - amici.sbml_import - INFO - Finished processing SBML observables (2.15E-02s)\n",
- "2024-05-16 07:34:47.733 - amici.sbml_import - INFO - Finished processing SBML event observables (6.25E-07s)\n",
- "2024-05-16 07:34:47.754 - amici.de_model - INFO - Finished computing xdot (2.41E-03s)\n",
- "2024-05-16 07:34:47.758 - amici.de_model - INFO - Finished computing x0 (1.39E-03s)\n",
- "2024-05-16 07:34:47.764 - amici.de_model - INFO - Finished computing w (4.87E-03s)\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "found a filepath\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2024-05-16 07:34:48.150 - amici.de_export - INFO - Finished generating cpp code (3.82E-01s)\n",
- "2024-05-16 07:34:58.009 - amici.de_export - INFO - Finished compiling cpp code (9.86E+00s)\n",
- "/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/biosimulator_processes/processes/copasi_process.py:205: FutureWarning:\n",
- "\n",
- "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n",
- "\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{ ('verification_data',): [ { 'comparison_data': { ('emitter',): [ { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.0,\n",
- " 'species_2': 0.0,\n",
- " 'species_3': 0.0,\n",
- " 'species_4': 0.0},\n",
- " 'time': 0.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.01,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 1096150505274.1506,\n",
- " 'plasminogen': 1.1758171177387002e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2955755808974603.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 80249.33829510311,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.009841338446759926,\n",
- " 'species_2': 3.50091366956004e-07,\n",
- " 'species_3': 0.003069285532211755,\n",
- " 'species_4': 1.9636710780672987e-15},\n",
- " 'time': 3.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.02,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 5222330686186.079,\n",
- " 'plasminogen': 2.906965478662947e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 7521737002805166.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 3056809.711550413,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.019370741206347065,\n",
- " 'species_2': 2.6272526301288495e-06,\n",
- " 'species_3': 0.005891282520935982,\n",
- " 'species_4': 4.144775521499997e-13},\n",
- " 'time': 6.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.03,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.006,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 15007287507829.184,\n",
- " 'plasminogen': 5.175661366004397e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.3568209719518684e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 34007920.46373009,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.028596342905413796,\n",
- " 'species_2': 8.321241846536777e-06,\n",
- " 'species_3': 0.008485914712845363,\n",
- " 'species_4': 9.064979257024028e-12},\n",
- " 'time': 9.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.04,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.008,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 33565727048979.074,\n",
- " 'plasminogen': 7.964609474406293e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.0975892498384424e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 209050119.41932496,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.03752631341708181,\n",
- " 'species_2': 1.8517915076922777e-05,\n",
- " 'species_3': 0.010871500529085486,\n",
- " 'species_4': 7.737118488498422e-11},\n",
- " 'time': 12.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.05,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.01,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 64326729734488.97,\n",
- " 'plasminogen': 1.1257001125312219e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.96351139747236e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 896339651.927586,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.04616881823934249,\n",
- " 'species_2': 3.3969300114182935e-05,\n",
- " 'species_3': 0.013064882358297098,\n",
- " 'species_4': 3.9452490810562224e-10},\n",
- " 'time': 15.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.060000000000000005,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.012,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 110894032416029.44,\n",
- " 'plasminogen': 1.503651068623031e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.9445038293153576e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 3009353032.8912554,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.05453198468487382,\n",
- " 'species_2': 5.515355602934109e-05,\n",
- " 'species_3': 0.015081545292805518,\n",
- " 'species_4': 1.4529464715886217e-09},\n",
- " 'time': 18.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.07,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.014,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 176933438191236.38,\n",
- " 'plasminogen': 1.9287290473362544e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 5.031295274551519e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 8458572892.051851,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.06262387319177992,\n",
- " 'species_2': 8.23261468502052e-05,\n",
- " 'species_3': 0.016935726217283342,\n",
- " 'species_4': 4.2762054232334345e-09},\n",
- " 'time': 21.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.08,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.016,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 266083249464442.2,\n",
- " 'plasminogen': 2.3993964382399222e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 6.215361260273988e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 20768081090.95895,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.07045245317639325,\n",
- " 'species_2': 0.00011556339052995251,\n",
- " 'species_3': 0.01864051413640196,\n",
- " 'species_4': 1.0684114291167734e-08},\n",
- " 'time': 24.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.09,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.018000000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 381884173654541.75,\n",
- " 'plasminogen': 2.914162046157488e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 7.488863853126006e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 45843252377.02612,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.07802558272179654,\n",
- " 'species_2': 0.00015479940113689877,\n",
- " 'species_3': 0.02020794222146432,\n",
- " 'species_4': 2.3561925029847964e-08},\n",
- " 'time': 27.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.09999999999999999,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.020000000000000004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 527725640728921.3,\n",
- " 'plasminogen': 3.471580261362678e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 8.844596238664414e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 92858414470.11996,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.0853509919069679,\n",
- " 'species_2': 0.00019985731306503037,\n",
- " 'species_3': 0.021649072721059724,\n",
- " 'species_4': 4.710120023413839e-08},\n",
- " 'time': 30.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.10999999999999999,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.022000000000000006,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 706805878584604.9,\n",
- " 'plasminogen': 4.0702501590140115e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.0275931747618923e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 175220918225.79663,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.09243626875891199,\n",
- " 'species_2': 0.00025047556886063574,\n",
- " 'species_3': 0.02297407432135808,\n",
- " 'species_4': 8.698538721535593e-08},\n",
- " 'time': 33.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.11999999999999998,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.024000000000000007,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 922103497330043.6,\n",
- " 'plasminogen': 4.708814541892021e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.1776776983667472e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 311561458618.54663,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.0992888485375883,\n",
- " 'species_2': 0.0003063300314006377,\n",
- " 'species_3': 0.02419229520209456,\n",
- " 'species_4': 1.504991492189103e-07},\n",
- " 'time': 36.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.12999999999999998,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.02600000000000001,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 1176358602206408.8,\n",
- " 'plasminogen': 5.385958938909901e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.3341528718753062e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 526699035306.65027,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.10591600435070338,\n",
- " 'species_2': 0.0003670523120345621,\n",
- " 'species_3': 0.0253123275140173,\n",
- " 'species_4': 2.4655794189787547e-07},\n",
- " 'time': 39.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.13999999999999999,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.02800000000000001,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 1472061766369929.8,\n",
- " 'plasminogen': 6.100410570097e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.496503426116489e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 852532194947.7025,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.11232484037603455,\n",
- " 'species_2': 0.0004322450676053817,\n",
- " 'species_3': 0.026342068797861596,\n",
- " 'species_4': 3.856501017450368e-07},\n",
- " 'time': 42.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.15,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.030000000000000013,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 1811449423416284.2,\n",
- " 'plasminogen': 6.850937287415196e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.6642555023190093e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 1328814523600.3286,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.1185222875935492,\n",
- " 'species_2': 0.0005014945154063643,\n",
- " 'species_3': 0.02728877944189248,\n",
- " 'species_4': 5.797018678169073e-07},\n",
- " 'time': 45.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.032000000000000015,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 2196504436002455.5,\n",
- " 'plasminogen': 7.636346499575204e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.8369733030715098e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 2003781415544.8093,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.124515097978394,\n",
- " 'species_2': 0.0005743807338346568,\n",
- " 'species_3': 0.02815913012116271,\n",
- " 'species_4': 8.418792839080272e-07},\n",
- " 'time': 48.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.034000000000000016,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 2628960788614912.0,\n",
- " 'plasminogen': 8.455484087913398e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.014256014437774e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 2934604516266.0967,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.13030984438201815,\n",
- " 'species_2': 0.0006504858613515347,\n",
- " 'species_3': 0.028959253047104026,\n",
- " 'species_4': 1.1863318711262537e-06},\n",
- " 'time': 51.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.18000000000000002,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.03600000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 3110311613977164.0,\n",
- " 'plasminogen': 9.307233308300915e+17,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.195734952162914e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 4187660123431.369,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.13591291880733408,\n",
- " 'species_2': 0.000729400564832842,\n",
- " 'species_3': 0.029694787262330106,\n",
- " 'species_4': 1.6279048130782806e-06},\n",
- " 'time': 54.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.19000000000000003,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.03800000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 3641819228426353.0,\n",
- " 'plasminogen': 1.0190513737139044e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.3810710329672243e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 5838608534631.993,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.14133053076126656,\n",
- " 'species_2': 0.0008107293350206784,\n",
- " 'species_3': 0.030370912649572562,\n",
- " 'species_4': 2.181834372283923e-06},\n",
- " 'time': 57.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.20000000000000004,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04000000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 4224527559630487.5,\n",
- " 'plasminogen': 1.1104280170498171e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.5699523304094835e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 7972287476793.123,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.14656870922035203,\n",
- " 'species_2': 0.0008940942117176781,\n",
- " 'species_3': 0.030992391352147035,\n",
- " 'species_4': 2.863433737883515e-06},\n",
- " 'time': 60.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.21000000000000005,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04200000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 4859275565880223.0,\n",
- " 'plasminogen': 1.2047521558302108e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.7620918845826746e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 10682428737523.426,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.15163330373022232,\n",
- " 'species_2': 0.00097913762857444,\n",
- " 'species_3': 0.031563601048511435,\n",
- " 'species_4': 3.6877904985946876e-06},\n",
- " 'time': 63.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.22000000000000006,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.044000000000000025,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 5546711400539904.0,\n",
- " 'plasminogen': 1.301925995608038e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.9572256955187366e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 14071218572656.512,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.1565299857453634,\n",
- " 'species_2': 0.001065524447129876,\n",
- " 'species_3': 0.03208856507899147,\n",
- " 'species_4': 4.669480018733145e-06},\n",
- " 'time': 66.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.23000000000000007,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04600000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 6287307041603754.0,\n",
- " 'plasminogen': 1.4018549490049797e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.155110872305762e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 18248719344734.445,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.16126425206820036,\n",
- " 'species_2': 0.0011529430297014824,\n",
- " 'species_3': 0.032570983035777844,\n",
- " 'species_4': 5.822314786305203e-06},\n",
- " 'time': 69.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.24000000000000007,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04800000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 7081373023654231.0,\n",
- " 'plasminogen': 1.504447534166925e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.355523933189119e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 23332175714787.86,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.16584142720018882,\n",
- " 'species_2': 0.001241105932088521,\n",
- " 'species_3': 0.03301425603795781,\n",
- " 'species_4': 7.159120266407245e-06},\n",
- " 'time': 72.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.25000000000000006,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.05000000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 7929073021642943.0,\n",
- " 'plasminogen': 1.609615275340101e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.558259243399044e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 29445229874409.176,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.17026669075238648,\n",
- " 'species_2': 0.0013297487881120918,\n",
- " 'species_3': 0.033421525770300435,\n",
- " 'species_4': 8.691607483997918e-06},\n",
- " 'time': 75.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.26000000000000006,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.05200000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 8830438082803756.0,\n",
- " 'plasminogen': 1.7172726057421437e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.7631275807910374e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 36717068900222.91,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.17454501798183603,\n",
- " 'species_2': 0.0014186334192657372,\n",
- " 'species_3': 0.03379565712807753,\n",
- " 'species_4': 1.0430072993800591e-05},\n",
- " 'time': 78.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.2700000000000001,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.054000000000000034,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 9785380350919352.0,\n",
- " 'plasminogen': 1.8273367728339643e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.9699548180479994e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 45281527967682.16,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.17868123328029295,\n",
- " 'species_2': 0.0015075442549891977,\n",
- " 'species_3': 0.034139291761595345,\n",
- " 'species_4': 1.2383430184618205e-05},\n",
- " 'time': 81.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.2800000000000001,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.056000000000000036,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 1.0793706165056844e+16,\n",
- " 'plasminogen': 1.939727746080806e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 4.1785807119580525e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 55276170930671.53,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.1826799996779901,\n",
- " 'species_2': 0.0015962882738013808,\n",
- " 'species_3': 0.03445485760237462,\n",
- " 'species_4': 1.4559108037785673e-05},\n",
- " 'time': 84.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.2900000000000001,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.05800000000000004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 1.1855128447138338e+16,\n",
- " 'plasminogen': 2.0543681272645033e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 4.388857791010213e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 66841367830565.49,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.18654583515282042,\n",
- " 'species_2': 0.0016846934852132339,\n",
- " 'species_3': 0.03474459209750613,\n",
- " 'species_4': 1.6963035848722523e-05},\n",
- " 'time': 87.0},\n",
- " { 'amici_simple_floating_species_concentrations': { 'plasmin': 0.0,\n",
- " 'plasminogen': 0.3000000000000001,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.06000000000000004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'copasi_simple_floating_species_concentrations': { 'plasmin': 1.2969278320685966e+16,\n",
- " 'plasminogen': 2.1711830633846438e+18,\n",
- " 'single intact chain urokinase-type plasminogen activator': 4.6006503332166214e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 80119386576721.52,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': { 'species_1': 0.19028311113729995,\n",
- " 'species_2': 0.0017726080771210792,\n",
- " 'species_3': 0.0350105545243426,\n",
- " 'species_4': 1.9599628084815148e-05},\n",
- " 'time': 90.0}]}}]}\n"
- ]
- }
- ],
- "execution_count": 10
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.774246Z",
- "start_time": "2024-05-16T11:34:58.767950Z"
- }
- },
- "cell_type": "code",
- "source": "verification_results",
- "id": "996e8cd3aa562878",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{('verification_data',): [{'comparison_data': {('emitter',): [{'copasi_simple_floating_species_concentrations': {'plasminogen': 0.0,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.0,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.0,\n",
- " 'species_2': 0.0,\n",
- " 'species_3': 0.0,\n",
- " 'species_4': 0.0},\n",
- " 'time': 0.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.1758171177387002e+16,\n",
- " 'plasmin': 1096150505274.1506,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2955755808974603.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 80249.33829510311,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.01,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.009841338446759926,\n",
- " 'species_2': 3.50091366956004e-07,\n",
- " 'species_3': 0.003069285532211755,\n",
- " 'species_4': 1.9636710780672987e-15},\n",
- " 'time': 3.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.906965478662947e+16,\n",
- " 'plasmin': 5222330686186.079,\n",
- " 'single intact chain urokinase-type plasminogen activator': 7521737002805166.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 3056809.711550413,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.02,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.019370741206347065,\n",
- " 'species_2': 2.6272526301288495e-06,\n",
- " 'species_3': 0.005891282520935982,\n",
- " 'species_4': 4.144775521499997e-13},\n",
- " 'time': 6.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 5.175661366004397e+16,\n",
- " 'plasmin': 15007287507829.184,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.3568209719518684e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 34007920.46373009,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.03,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.006,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.028596342905413796,\n",
- " 'species_2': 8.321241846536777e-06,\n",
- " 'species_3': 0.008485914712845363,\n",
- " 'species_4': 9.064979257024028e-12},\n",
- " 'time': 9.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 7.964609474406293e+16,\n",
- " 'plasmin': 33565727048979.074,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.0975892498384424e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 209050119.41932496,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.04,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.008,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.03752631341708181,\n",
- " 'species_2': 1.8517915076922777e-05,\n",
- " 'species_3': 0.010871500529085486,\n",
- " 'species_4': 7.737118488498422e-11},\n",
- " 'time': 12.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.1257001125312219e+17,\n",
- " 'plasmin': 64326729734488.97,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.96351139747236e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 896339651.927586,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.05,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.01,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.04616881823934249,\n",
- " 'species_2': 3.3969300114182935e-05,\n",
- " 'species_3': 0.013064882358297098,\n",
- " 'species_4': 3.9452490810562224e-10},\n",
- " 'time': 15.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.503651068623031e+17,\n",
- " 'plasmin': 110894032416029.44,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.9445038293153576e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 3009353032.8912554,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.060000000000000005,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.012,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.05453198468487382,\n",
- " 'species_2': 5.515355602934109e-05,\n",
- " 'species_3': 0.015081545292805518,\n",
- " 'species_4': 1.4529464715886217e-09},\n",
- " 'time': 18.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.9287290473362544e+17,\n",
- " 'plasmin': 176933438191236.38,\n",
- " 'single intact chain urokinase-type plasminogen activator': 5.031295274551519e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 8458572892.051851,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.07,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.014,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.06262387319177992,\n",
- " 'species_2': 8.23261468502052e-05,\n",
- " 'species_3': 0.016935726217283342,\n",
- " 'species_4': 4.2762054232334345e-09},\n",
- " 'time': 21.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.3993964382399222e+17,\n",
- " 'plasmin': 266083249464442.2,\n",
- " 'single intact chain urokinase-type plasminogen activator': 6.215361260273988e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 20768081090.95895,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.08,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.016,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.07045245317639325,\n",
- " 'species_2': 0.00011556339052995251,\n",
- " 'species_3': 0.01864051413640196,\n",
- " 'species_4': 1.0684114291167734e-08},\n",
- " 'time': 24.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.914162046157488e+17,\n",
- " 'plasmin': 381884173654541.75,\n",
- " 'single intact chain urokinase-type plasminogen activator': 7.488863853126006e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 45843252377.02612,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.09,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.018000000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.07802558272179654,\n",
- " 'species_2': 0.00015479940113689877,\n",
- " 'species_3': 0.02020794222146432,\n",
- " 'species_4': 2.3561925029847964e-08},\n",
- " 'time': 27.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 3.471580261362678e+17,\n",
- " 'plasmin': 527725640728921.3,\n",
- " 'single intact chain urokinase-type plasminogen activator': 8.844596238664414e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 92858414470.11996,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.09999999999999999,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.020000000000000004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.0853509919069679,\n",
- " 'species_2': 0.00019985731306503037,\n",
- " 'species_3': 0.021649072721059724,\n",
- " 'species_4': 4.710120023413839e-08},\n",
- " 'time': 30.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 4.0702501590140115e+17,\n",
- " 'plasmin': 706805878584604.9,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.0275931747618923e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 175220918225.79663,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.10999999999999999,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.022000000000000006,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.09243626875891199,\n",
- " 'species_2': 0.00025047556886063574,\n",
- " 'species_3': 0.02297407432135808,\n",
- " 'species_4': 8.698538721535593e-08},\n",
- " 'time': 33.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 4.708814541892021e+17,\n",
- " 'plasmin': 922103497330043.6,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.1776776983667472e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 311561458618.54663,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.11999999999999998,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.024000000000000007,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.0992888485375883,\n",
- " 'species_2': 0.0003063300314006377,\n",
- " 'species_3': 0.02419229520209456,\n",
- " 'species_4': 1.504991492189103e-07},\n",
- " 'time': 36.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 5.385958938909901e+17,\n",
- " 'plasmin': 1176358602206408.8,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.3341528718753062e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 526699035306.65027,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.12999999999999998,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.02600000000000001,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.10591600435070338,\n",
- " 'species_2': 0.0003670523120345621,\n",
- " 'species_3': 0.0253123275140173,\n",
- " 'species_4': 2.4655794189787547e-07},\n",
- " 'time': 39.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 6.100410570097e+17,\n",
- " 'plasmin': 1472061766369929.8,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.496503426116489e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 852532194947.7025,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.13999999999999999,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.02800000000000001,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.11232484037603455,\n",
- " 'species_2': 0.0004322450676053817,\n",
- " 'species_3': 0.026342068797861596,\n",
- " 'species_4': 3.856501017450368e-07},\n",
- " 'time': 42.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 6.850937287415196e+17,\n",
- " 'plasmin': 1811449423416284.2,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.6642555023190093e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 1328814523600.3286,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.15,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.030000000000000013,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.1185222875935492,\n",
- " 'species_2': 0.0005014945154063643,\n",
- " 'species_3': 0.02728877944189248,\n",
- " 'species_4': 5.797018678169073e-07},\n",
- " 'time': 45.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 7.636346499575204e+17,\n",
- " 'plasmin': 2196504436002455.5,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.8369733030715098e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 2003781415544.8093,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.16,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.032000000000000015,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.124515097978394,\n",
- " 'species_2': 0.0005743807338346568,\n",
- " 'species_3': 0.02815913012116271,\n",
- " 'species_4': 8.418792839080272e-07},\n",
- " 'time': 48.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 8.455484087913398e+17,\n",
- " 'plasmin': 2628960788614912.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.014256014437774e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 2934604516266.0967,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.17,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.034000000000000016,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.13030984438201815,\n",
- " 'species_2': 0.0006504858613515347,\n",
- " 'species_3': 0.028959253047104026,\n",
- " 'species_4': 1.1863318711262537e-06},\n",
- " 'time': 51.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 9.307233308300915e+17,\n",
- " 'plasmin': 3110311613977164.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.195734952162914e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 4187660123431.369,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.18000000000000002,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.03600000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.13591291880733408,\n",
- " 'species_2': 0.000729400564832842,\n",
- " 'species_3': 0.029694787262330106,\n",
- " 'species_4': 1.6279048130782806e-06},\n",
- " 'time': 54.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.0190513737139044e+18,\n",
- " 'plasmin': 3641819228426353.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.3810710329672243e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 5838608534631.993,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.19000000000000003,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.03800000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.14133053076126656,\n",
- " 'species_2': 0.0008107293350206784,\n",
- " 'species_3': 0.030370912649572562,\n",
- " 'species_4': 2.181834372283923e-06},\n",
- " 'time': 57.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.1104280170498171e+18,\n",
- " 'plasmin': 4224527559630487.5,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.5699523304094835e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 7972287476793.123,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.20000000000000004,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04000000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.14656870922035203,\n",
- " 'species_2': 0.0008940942117176781,\n",
- " 'species_3': 0.030992391352147035,\n",
- " 'species_4': 2.863433737883515e-06},\n",
- " 'time': 60.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.2047521558302108e+18,\n",
- " 'plasmin': 4859275565880223.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.7620918845826746e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 10682428737523.426,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.21000000000000005,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04200000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.15163330373022232,\n",
- " 'species_2': 0.00097913762857444,\n",
- " 'species_3': 0.031563601048511435,\n",
- " 'species_4': 3.6877904985946876e-06},\n",
- " 'time': 63.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.301925995608038e+18,\n",
- " 'plasmin': 5546711400539904.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.9572256955187366e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 14071218572656.512,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.22000000000000006,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.044000000000000025,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.1565299857453634,\n",
- " 'species_2': 0.001065524447129876,\n",
- " 'species_3': 0.03208856507899147,\n",
- " 'species_4': 4.669480018733145e-06},\n",
- " 'time': 66.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.4018549490049797e+18,\n",
- " 'plasmin': 6287307041603754.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.155110872305762e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 18248719344734.445,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.23000000000000007,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04600000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.16126425206820036,\n",
- " 'species_2': 0.0011529430297014824,\n",
- " 'species_3': 0.032570983035777844,\n",
- " 'species_4': 5.822314786305203e-06},\n",
- " 'time': 69.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.504447534166925e+18,\n",
- " 'plasmin': 7081373023654231.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.355523933189119e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 23332175714787.86,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.24000000000000007,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04800000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.16584142720018882,\n",
- " 'species_2': 0.001241105932088521,\n",
- " 'species_3': 0.03301425603795781,\n",
- " 'species_4': 7.159120266407245e-06},\n",
- " 'time': 72.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.609615275340101e+18,\n",
- " 'plasmin': 7929073021642943.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.558259243399044e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 29445229874409.176,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.25000000000000006,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.05000000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.17026669075238648,\n",
- " 'species_2': 0.0013297487881120918,\n",
- " 'species_3': 0.033421525770300435,\n",
- " 'species_4': 8.691607483997918e-06},\n",
- " 'time': 75.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.7172726057421437e+18,\n",
- " 'plasmin': 8830438082803756.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.7631275807910374e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 36717068900222.91,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.26000000000000006,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.05200000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.17454501798183603,\n",
- " 'species_2': 0.0014186334192657372,\n",
- " 'species_3': 0.03379565712807753,\n",
- " 'species_4': 1.0430072993800591e-05},\n",
- " 'time': 78.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.8273367728339643e+18,\n",
- " 'plasmin': 9785380350919352.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.9699548180479994e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 45281527967682.16,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.2700000000000001,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.054000000000000034,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.17868123328029295,\n",
- " 'species_2': 0.0015075442549891977,\n",
- " 'species_3': 0.034139291761595345,\n",
- " 'species_4': 1.2383430184618205e-05},\n",
- " 'time': 81.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.939727746080806e+18,\n",
- " 'plasmin': 1.0793706165056844e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 4.1785807119580525e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 55276170930671.53,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.2800000000000001,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.056000000000000036,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.1826799996779901,\n",
- " 'species_2': 0.0015962882738013808,\n",
- " 'species_3': 0.03445485760237462,\n",
- " 'species_4': 1.4559108037785673e-05},\n",
- " 'time': 84.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.0543681272645033e+18,\n",
- " 'plasmin': 1.1855128447138338e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 4.388857791010213e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 66841367830565.49,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.2900000000000001,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.05800000000000004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.18654583515282042,\n",
- " 'species_2': 0.0016846934852132339,\n",
- " 'species_3': 0.03474459209750613,\n",
- " 'species_4': 1.6963035848722523e-05},\n",
- " 'time': 87.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.1711830633846438e+18,\n",
- " 'plasmin': 1.2969278320685966e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 4.6006503332166214e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 80119386576721.52,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.3000000000000001,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.06000000000000004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.19028311113729995,\n",
- " 'species_2': 0.0017726080771210792,\n",
- " 'species_3': 0.0350105545243426,\n",
- " 'species_4': 1.9599628084815148e-05},\n",
- " 'time': 90.0}]}}]}"
- ]
- },
- "execution_count": 11,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 11
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.775922Z",
- "start_time": "2024-05-16T11:34:58.774902Z"
- }
- },
- "cell_type": "code",
- "source": "",
- "id": "5440292c4b8a9c2e",
- "outputs": [],
- "execution_count": 11
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.777472Z",
- "start_time": "2024-05-16T11:34:58.776396Z"
- }
- },
- "cell_type": "code",
- "source": "",
- "id": "ee40c0e3ed534d5",
- "outputs": [],
- "execution_count": 11
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.779125Z",
- "start_time": "2024-05-16T11:34:58.778017Z"
- }
- },
- "cell_type": "code",
- "source": "",
- "id": "bde13aa49d73341c",
- "outputs": [],
- "execution_count": 11
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.783180Z",
- "start_time": "2024-05-16T11:34:58.781158Z"
- }
- },
- "cell_type": "code",
- "source": [
- "\"\"\"TODO: Update the input/output schema of the ODEComparatorProcess to mimic the following:\n",
- "\n",
- "{('emitter',): [{\n",
- " 'copasi': [\n",
- " {\n",
- " 'floating_species_concentrations': {\n",
- " 'plasminogen': 0.0,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'time': 0.0\n",
- " },\n",
- " ...\n",
- " ],\n",
- " 'amici': [\n",
- " {\n",
- " 'floating_species_concentrations': {\n",
- " 'plasminogen': 1.1758171177387002e+16,\n",
- " 'plasmin': 1096150505274.1506,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2955755808974603.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 80249.33829510311,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'time': 0.0},\n",
- " },\n",
- " ...\n",
- " ]\n",
- "\n",
- "\n",
- "\"\"\""
- ],
- "id": "2b8beaf137e9704d",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "\"TODO: Update the input/output schema of the ODEComparatorProcess to mimic the following:\\n\\n{('emitter',): [{\\n 'copasi': [\\n {\\n 'floating_species_concentrations': {\\n 'plasminogen': 0.0,\\n 'plasmin': 0.0,\\n 'single intact chain urokinase-type plasminogen activator': 0.0,\\n 'two-chain urokinase-type plasminogen activator': 0.0,\\n 'x': 0.0,\\n 'x-plasmin': 0.0},\\n 'time': 0.0\\n },\\n ...\\n ],\\n 'amici': [\\n {\\n 'floating_species_concentrations': {\\n 'plasminogen': 1.1758171177387002e+16,\\n 'plasmin': 1096150505274.1506,\\n 'single intact chain urokinase-type plasminogen activator': 2955755808974603.0,\\n 'two-chain urokinase-type plasminogen activator': 80249.33829510311,\\n 'x': 0.0,\\n 'x-plasmin': 0.0},\\n 'time': 0.0},\\n },\\n ...\\n ]\\n\\n\\n\""
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 12
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.785433Z",
- "start_time": "2024-05-16T11:34:58.783646Z"
- }
- },
- "cell_type": "code",
- "source": "wf",
- "id": "66d59fb01c1756dd",
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 13,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 13
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.787558Z",
- "start_time": "2024-05-16T11:34:58.785884Z"
- }
- },
- "cell_type": "code",
- "source": "wf.state.keys()",
- "id": "e82af6540d453d2f",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "dict_keys(['compare_ode', 'verification_data', 'global_time', 'comparison_store'])"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 14
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.789412Z",
- "start_time": "2024-05-16T11:34:58.788052Z"
- }
- },
- "cell_type": "code",
- "source": "emitter = wf.state['verification_data']['instance']",
- "id": "55b6115089b582c8",
- "outputs": [],
- "execution_count": 15
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.795660Z",
- "start_time": "2024-05-16T11:34:58.789903Z"
- }
- },
- "cell_type": "code",
- "source": "emitter.history",
- "id": "7ccbabb3f8f8880",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[{'comparison_data': {('emitter',): [{'copasi_simple_floating_species_concentrations': {'plasminogen': 0.0,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.0,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.0,\n",
- " 'species_2': 0.0,\n",
- " 'species_3': 0.0,\n",
- " 'species_4': 0.0},\n",
- " 'time': 0.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.1758171177387002e+16,\n",
- " 'plasmin': 1096150505274.1506,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2955755808974603.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 80249.33829510311,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.01,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.009841338446759926,\n",
- " 'species_2': 3.50091366956004e-07,\n",
- " 'species_3': 0.003069285532211755,\n",
- " 'species_4': 1.9636710780672987e-15},\n",
- " 'time': 3.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.906965478662947e+16,\n",
- " 'plasmin': 5222330686186.079,\n",
- " 'single intact chain urokinase-type plasminogen activator': 7521737002805166.0,\n",
- " 'two-chain urokinase-type plasminogen activator': 3056809.711550413,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.02,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.019370741206347065,\n",
- " 'species_2': 2.6272526301288495e-06,\n",
- " 'species_3': 0.005891282520935982,\n",
- " 'species_4': 4.144775521499997e-13},\n",
- " 'time': 6.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 5.175661366004397e+16,\n",
- " 'plasmin': 15007287507829.184,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.3568209719518684e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 34007920.46373009,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.03,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.006,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.028596342905413796,\n",
- " 'species_2': 8.321241846536777e-06,\n",
- " 'species_3': 0.008485914712845363,\n",
- " 'species_4': 9.064979257024028e-12},\n",
- " 'time': 9.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 7.964609474406293e+16,\n",
- " 'plasmin': 33565727048979.074,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.0975892498384424e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 209050119.41932496,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.04,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.008,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.03752631341708181,\n",
- " 'species_2': 1.8517915076922777e-05,\n",
- " 'species_3': 0.010871500529085486,\n",
- " 'species_4': 7.737118488498422e-11},\n",
- " 'time': 12.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.1257001125312219e+17,\n",
- " 'plasmin': 64326729734488.97,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.96351139747236e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 896339651.927586,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.05,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.01,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.04616881823934249,\n",
- " 'species_2': 3.3969300114182935e-05,\n",
- " 'species_3': 0.013064882358297098,\n",
- " 'species_4': 3.9452490810562224e-10},\n",
- " 'time': 15.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.503651068623031e+17,\n",
- " 'plasmin': 110894032416029.44,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.9445038293153576e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 3009353032.8912554,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.060000000000000005,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.012,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.05453198468487382,\n",
- " 'species_2': 5.515355602934109e-05,\n",
- " 'species_3': 0.015081545292805518,\n",
- " 'species_4': 1.4529464715886217e-09},\n",
- " 'time': 18.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.9287290473362544e+17,\n",
- " 'plasmin': 176933438191236.38,\n",
- " 'single intact chain urokinase-type plasminogen activator': 5.031295274551519e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 8458572892.051851,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.07,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.014,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.06262387319177992,\n",
- " 'species_2': 8.23261468502052e-05,\n",
- " 'species_3': 0.016935726217283342,\n",
- " 'species_4': 4.2762054232334345e-09},\n",
- " 'time': 21.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.3993964382399222e+17,\n",
- " 'plasmin': 266083249464442.2,\n",
- " 'single intact chain urokinase-type plasminogen activator': 6.215361260273988e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 20768081090.95895,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.08,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.016,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.07045245317639325,\n",
- " 'species_2': 0.00011556339052995251,\n",
- " 'species_3': 0.01864051413640196,\n",
- " 'species_4': 1.0684114291167734e-08},\n",
- " 'time': 24.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.914162046157488e+17,\n",
- " 'plasmin': 381884173654541.75,\n",
- " 'single intact chain urokinase-type plasminogen activator': 7.488863853126006e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 45843252377.02612,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.09,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.018000000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.07802558272179654,\n",
- " 'species_2': 0.00015479940113689877,\n",
- " 'species_3': 0.02020794222146432,\n",
- " 'species_4': 2.3561925029847964e-08},\n",
- " 'time': 27.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 3.471580261362678e+17,\n",
- " 'plasmin': 527725640728921.3,\n",
- " 'single intact chain urokinase-type plasminogen activator': 8.844596238664414e+16,\n",
- " 'two-chain urokinase-type plasminogen activator': 92858414470.11996,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.09999999999999999,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.020000000000000004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.0853509919069679,\n",
- " 'species_2': 0.00019985731306503037,\n",
- " 'species_3': 0.021649072721059724,\n",
- " 'species_4': 4.710120023413839e-08},\n",
- " 'time': 30.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 4.0702501590140115e+17,\n",
- " 'plasmin': 706805878584604.9,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.0275931747618923e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 175220918225.79663,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.10999999999999999,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.022000000000000006,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.09243626875891199,\n",
- " 'species_2': 0.00025047556886063574,\n",
- " 'species_3': 0.02297407432135808,\n",
- " 'species_4': 8.698538721535593e-08},\n",
- " 'time': 33.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 4.708814541892021e+17,\n",
- " 'plasmin': 922103497330043.6,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.1776776983667472e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 311561458618.54663,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.11999999999999998,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.024000000000000007,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.0992888485375883,\n",
- " 'species_2': 0.0003063300314006377,\n",
- " 'species_3': 0.02419229520209456,\n",
- " 'species_4': 1.504991492189103e-07},\n",
- " 'time': 36.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 5.385958938909901e+17,\n",
- " 'plasmin': 1176358602206408.8,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.3341528718753062e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 526699035306.65027,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.12999999999999998,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.02600000000000001,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.10591600435070338,\n",
- " 'species_2': 0.0003670523120345621,\n",
- " 'species_3': 0.0253123275140173,\n",
- " 'species_4': 2.4655794189787547e-07},\n",
- " 'time': 39.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 6.100410570097e+17,\n",
- " 'plasmin': 1472061766369929.8,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.496503426116489e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 852532194947.7025,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.13999999999999999,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.02800000000000001,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.11232484037603455,\n",
- " 'species_2': 0.0004322450676053817,\n",
- " 'species_3': 0.026342068797861596,\n",
- " 'species_4': 3.856501017450368e-07},\n",
- " 'time': 42.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 6.850937287415196e+17,\n",
- " 'plasmin': 1811449423416284.2,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.6642555023190093e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 1328814523600.3286,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.15,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.030000000000000013,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.1185222875935492,\n",
- " 'species_2': 0.0005014945154063643,\n",
- " 'species_3': 0.02728877944189248,\n",
- " 'species_4': 5.797018678169073e-07},\n",
- " 'time': 45.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 7.636346499575204e+17,\n",
- " 'plasmin': 2196504436002455.5,\n",
- " 'single intact chain urokinase-type plasminogen activator': 1.8369733030715098e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 2003781415544.8093,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.16,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.032000000000000015,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.124515097978394,\n",
- " 'species_2': 0.0005743807338346568,\n",
- " 'species_3': 0.02815913012116271,\n",
- " 'species_4': 8.418792839080272e-07},\n",
- " 'time': 48.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 8.455484087913398e+17,\n",
- " 'plasmin': 2628960788614912.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.014256014437774e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 2934604516266.0967,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.17,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.034000000000000016,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.13030984438201815,\n",
- " 'species_2': 0.0006504858613515347,\n",
- " 'species_3': 0.028959253047104026,\n",
- " 'species_4': 1.1863318711262537e-06},\n",
- " 'time': 51.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 9.307233308300915e+17,\n",
- " 'plasmin': 3110311613977164.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.195734952162914e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 4187660123431.369,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.18000000000000002,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.03600000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.13591291880733408,\n",
- " 'species_2': 0.000729400564832842,\n",
- " 'species_3': 0.029694787262330106,\n",
- " 'species_4': 1.6279048130782806e-06},\n",
- " 'time': 54.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.0190513737139044e+18,\n",
- " 'plasmin': 3641819228426353.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.3810710329672243e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 5838608534631.993,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.19000000000000003,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.03800000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.14133053076126656,\n",
- " 'species_2': 0.0008107293350206784,\n",
- " 'species_3': 0.030370912649572562,\n",
- " 'species_4': 2.181834372283923e-06},\n",
- " 'time': 57.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.1104280170498171e+18,\n",
- " 'plasmin': 4224527559630487.5,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.5699523304094835e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 7972287476793.123,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.20000000000000004,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04000000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.14656870922035203,\n",
- " 'species_2': 0.0008940942117176781,\n",
- " 'species_3': 0.030992391352147035,\n",
- " 'species_4': 2.863433737883515e-06},\n",
- " 'time': 60.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.2047521558302108e+18,\n",
- " 'plasmin': 4859275565880223.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.7620918845826746e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 10682428737523.426,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.21000000000000005,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04200000000000002,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.15163330373022232,\n",
- " 'species_2': 0.00097913762857444,\n",
- " 'species_3': 0.031563601048511435,\n",
- " 'species_4': 3.6877904985946876e-06},\n",
- " 'time': 63.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.301925995608038e+18,\n",
- " 'plasmin': 5546711400539904.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 2.9572256955187366e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 14071218572656.512,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.22000000000000006,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.044000000000000025,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.1565299857453634,\n",
- " 'species_2': 0.001065524447129876,\n",
- " 'species_3': 0.03208856507899147,\n",
- " 'species_4': 4.669480018733145e-06},\n",
- " 'time': 66.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.4018549490049797e+18,\n",
- " 'plasmin': 6287307041603754.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.155110872305762e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 18248719344734.445,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.23000000000000007,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04600000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.16126425206820036,\n",
- " 'species_2': 0.0011529430297014824,\n",
- " 'species_3': 0.032570983035777844,\n",
- " 'species_4': 5.822314786305203e-06},\n",
- " 'time': 69.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.504447534166925e+18,\n",
- " 'plasmin': 7081373023654231.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.355523933189119e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 23332175714787.86,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.24000000000000007,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.04800000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.16584142720018882,\n",
- " 'species_2': 0.001241105932088521,\n",
- " 'species_3': 0.03301425603795781,\n",
- " 'species_4': 7.159120266407245e-06},\n",
- " 'time': 72.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.609615275340101e+18,\n",
- " 'plasmin': 7929073021642943.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.558259243399044e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 29445229874409.176,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.25000000000000006,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.05000000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.17026669075238648,\n",
- " 'species_2': 0.0013297487881120918,\n",
- " 'species_3': 0.033421525770300435,\n",
- " 'species_4': 8.691607483997918e-06},\n",
- " 'time': 75.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.7172726057421437e+18,\n",
- " 'plasmin': 8830438082803756.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.7631275807910374e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 36717068900222.91,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.26000000000000006,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.05200000000000003,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.17454501798183603,\n",
- " 'species_2': 0.0014186334192657372,\n",
- " 'species_3': 0.03379565712807753,\n",
- " 'species_4': 1.0430072993800591e-05},\n",
- " 'time': 78.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.8273367728339643e+18,\n",
- " 'plasmin': 9785380350919352.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 3.9699548180479994e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 45281527967682.16,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.2700000000000001,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.054000000000000034,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.17868123328029295,\n",
- " 'species_2': 0.0015075442549891977,\n",
- " 'species_3': 0.034139291761595345,\n",
- " 'species_4': 1.2383430184618205e-05},\n",
- " 'time': 81.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 1.939727746080806e+18,\n",
- " 'plasmin': 1.0793706165056844e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 4.1785807119580525e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 55276170930671.53,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.2800000000000001,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.056000000000000036,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.1826799996779901,\n",
- " 'species_2': 0.0015962882738013808,\n",
- " 'species_3': 0.03445485760237462,\n",
- " 'species_4': 1.4559108037785673e-05},\n",
- " 'time': 84.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.0543681272645033e+18,\n",
- " 'plasmin': 1.1855128447138338e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 4.388857791010213e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 66841367830565.49,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.2900000000000001,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.05800000000000004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.18654583515282042,\n",
- " 'species_2': 0.0016846934852132339,\n",
- " 'species_3': 0.03474459209750613,\n",
- " 'species_4': 1.6963035848722523e-05},\n",
- " 'time': 87.0},\n",
- " {'copasi_simple_floating_species_concentrations': {'plasminogen': 2.1711830633846438e+18,\n",
- " 'plasmin': 1.2969278320685966e+16,\n",
- " 'single intact chain urokinase-type plasminogen activator': 4.6006503332166214e+17,\n",
- " 'two-chain urokinase-type plasminogen activator': 80119386576721.52,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'amici_simple_floating_species_concentrations': {'plasminogen': 0.3000000000000001,\n",
- " 'plasmin': 0.0,\n",
- " 'single intact chain urokinase-type plasminogen activator': 0.06000000000000004,\n",
- " 'two-chain urokinase-type plasminogen activator': 0.0,\n",
- " 'x': 0.0,\n",
- " 'x-plasmin': 0.0},\n",
- " 'tellurium_simple_floating_species_concentrations': {'species_1': 0.19028311113729995,\n",
- " 'species_2': 0.0017726080771210792,\n",
- " 'species_3': 0.0350105545243426,\n",
- " 'species_4': 1.9599628084815148e-05},\n",
- " 'time': 90.0}]}}]"
- ]
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 16
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.797931Z",
- "start_time": "2024-05-16T11:34:58.796232Z"
- }
- },
- "cell_type": "code",
- "source": "wf.state['global_time']",
- "id": "9a5e39ae34754ae5",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "1.0"
- ]
- },
- "execution_count": 17,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 17
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.800458Z",
- "start_time": "2024-05-16T11:34:58.798383Z"
- }
- },
- "cell_type": "code",
- "source": [
- "outputs_1 = {\n",
- " \"interval_id\": 1,\n",
- " \"copasi_floating_species_concentrations\": {\n",
- " \"plasminogen\": 11758171177387002,\n",
- " \"plasmin\": 1096150505274.1506,\n",
- " \"single intact chain urokinase-type plasminogen activator\": 2955755808974603,\n",
- " \"two-chain urokinase-type plasminogen activator\": 80249.33829510311,\n",
- " \"x\": 0,\n",
- " \"x-plasmin\": 0\n",
- " },\n",
- " \"tellurium_floating_species_concentrations\": {\n",
- " \"species_1\": 0.009841338446759926,\n",
- " \"species_2\": 3.50091366956004e-7,\n",
- " \"species_3\": 0.003069285532211755,\n",
- " \"species_4\": 1.9636710780672987e-15\n",
- " },\n",
- " \"amici_floating_species_concentrations\": {\n",
- " \"plasminogen\": 0.01,\n",
- " \"plasmin\": 0,\n",
- " \"single intact chain urokinase-type plasminogen activator\": 0.002,\n",
- " \"two-chain urokinase-type plasminogen activator\": 0,\n",
- " \"x\": 0,\n",
- " \"x-plasmin\": 0\n",
- " },\n",
- " \"time\": 3\n",
- "}"
- ],
- "id": "ace3a362ce7ec826",
- "outputs": [],
- "execution_count": 18
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.921288Z",
- "start_time": "2024-05-16T11:34:58.800991Z"
- }
- },
- "cell_type": "code",
- "source": [
- "from biosimulator_processes.steps.comparator_step import generate_ode_process_comparison_matrix\n",
- "\n",
- "species_data_index = 0\n",
- "\n",
- "results = generate_ode_process_comparison_matrix(outputs_copasi=list(outputs_1['copasi_floating_species_concentrations'].values())[species_data_index],\n",
- " outputs_amici=list(outputs_1['amici_floating_species_concentrations'].values())[species_data_index],\n",
- " outputs_tellurium=list(outputs_1['tellurium_floating_species_concentrations'].values())[species_data_index])"
- ],
- "id": "35916db31a17f5f7",
- "outputs": [
- {
- "ename": "ImportError",
- "evalue": "cannot import name 'generate_ode_process_comparison_matrix' from 'biosimulator_processes.steps.comparator_step' (/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/biosimulator_processes/steps/comparator_step.py)",
- "output_type": "error",
- "traceback": [
- "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
- "\u001B[0;31mImportError\u001B[0m Traceback (most recent call last)",
- "Cell \u001B[0;32mIn[19], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mbiosimulator_processes\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01msteps\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mcomparator_step\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m generate_ode_process_comparison_matrix\n\u001B[1;32m 3\u001B[0m species_data_index \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m0\u001B[39m\n\u001B[1;32m 5\u001B[0m results \u001B[38;5;241m=\u001B[39m generate_ode_process_comparison_matrix(outputs_copasi\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mlist\u001B[39m(outputs_1[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mcopasi_floating_species_concentrations\u001B[39m\u001B[38;5;124m'\u001B[39m]\u001B[38;5;241m.\u001B[39mvalues())[species_data_index],\n\u001B[1;32m 6\u001B[0m outputs_amici\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mlist\u001B[39m(outputs_1[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mamici_floating_species_concentrations\u001B[39m\u001B[38;5;124m'\u001B[39m]\u001B[38;5;241m.\u001B[39mvalues())[species_data_index],\n\u001B[1;32m 7\u001B[0m outputs_tellurium\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mlist\u001B[39m(outputs_1[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mtellurium_floating_species_concentrations\u001B[39m\u001B[38;5;124m'\u001B[39m]\u001B[38;5;241m.\u001B[39mvalues())[species_data_index])\n",
- "\u001B[0;31mImportError\u001B[0m: cannot import name 'generate_ode_process_comparison_matrix' from 'biosimulator_processes.steps.comparator_step' (/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/biosimulator_processes/steps/comparator_step.py)"
- ]
- }
- ],
- "execution_count": 19
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:34:58.922866Z",
- "start_time": "2024-05-16T11:34:58.922808Z"
- }
- },
- "cell_type": "code",
- "source": "results",
- "id": "424a8223f3022c8b",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "from biosimulator_processes.data_model import DescriptiveArray\n",
- "import numpy as np\n",
- "import pandas as pd\n",
- "\n",
- "\n",
- "output_copasi = DescriptiveArray(np.random.random(100), description='copasi output', process_id='simple_copasi')\n",
- "output_tellurium = DescriptiveArray(np.random.random(100), description='tell output', process_id='simple_tellurium')\n",
- "\n",
- "output_copasi.metadata, output_tellurium.metadata"
- ],
- "id": "a66ac403d5afb8f1",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "raw_outputs_matrix = np.stack([output_copasi, output_tellurium])\n",
- "\n",
- "raw_outputs_matrix"
- ],
- "id": "4ee14cc965f71424",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "raw_outputs_df = pd.DataFrame(\n",
- " raw_outputs_matrix, \n",
- " columns=[f'param_{str(n)}' for n in range(raw_outputs_matrix.shape[1])],\n",
- " index=[output_copasi.metadata['process_id'], output_tellurium.metadata['process_id']])"
- ],
- "id": "76c3510c2f90988e",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "raw_outputs_df",
- "id": "3729534a6ca4ce7a",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "transposed_outputs_df = raw_outputs_df.transpose()\n",
- "\n",
- "transposed_outputs_df"
- ],
- "id": "9ab4e552bb8a5d24",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "transposed_outputs_df.index",
- "id": "35c01d13c6266498",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "def calc_comparison(a, b):\n",
- " return (a - b) ** 2"
- ],
- "id": "3f2617bd5d66feac",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "np.random.random(3) - np.random.random(3)",
- "id": "9eea410f528888d6",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "transposed_comparisons = dict(zip(transposed_outputs_df.index, \n",
- " [calc_comparison(*output_vals) for output_vals in transposed_outputs_df.values]))"
- ],
- "id": "9d9ea9d251d8a175",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "for outputs in raw_outputs_matrix:\n",
- " print(outputs)"
- ],
- "id": "c1f4eda6ab255e8b",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "transposed_comparisons",
- "id": "1226a18101cdd5d1",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "comparison_data = {\n",
- " ('copasi', 'tellurium'): transposed_comparisons\n",
- "}"
- ],
- "id": "5bbbfa5e6a134925",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "comparison_data",
- "id": "78aa6a4eb02b0ec1",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "import json \n",
- "from biosimulator_processes.data_model.compare_data_model import ODEComparisonResult\n",
- "\n",
- "\n",
- "with open('/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/test_outputs/test_ode_comparison_object.json', 'r') as f:\n",
- " output_data_response = json.load(f)\n",
- "\n",
- "data_config = output_data_response.copy()\n",
- "data_config.pop('outputs')\n",
- "data_config.pop('timestamp')\n",
- " \n",
- " \n",
- "output_data = ODEComparisonResult(**data_config)"
- ],
- "id": "dd84993ad2bf2db0",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "def extract_unique_output_names(output_data: ODEComparisonResult) -> list[str]: \n",
- " output_names = []\n",
- " for i, interval_output in enumerate(output_data.outputs):\n",
- " output_attributes = vars(interval_output)\n",
- " for output_attribute_key, output_value in output_attributes.items():\n",
- " if isinstance(output_value, dict):\n",
- " output_names.append(output_attribute_key)\n",
- " return list(set(output_names))\n",
- " "
- ],
- "id": "ba9803ca38af83e9",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "extract_unique_output_names(output_data)",
- "id": "b5e1ac83b12a8672",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "from biosimulator_processes.steps.comparator_step import construct_process_interval_matrix",
- "id": "e15b85bd970f7f1e",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "import numpy as np\n",
- "import random\n",
- "import pandas as pd\n",
- "\n",
- "\n",
- "output_copasi = np.array([1.3, 2.4, 4.3])\n",
- "output_tellurium = np.array([1.3, 2.4, 4.5])\n",
- "output_amici = np.array([1.3, 2.4, 4.6])\n",
- "\n",
- "simulators = ['copasi', 'tellurium', 'amici']\n",
- "\n",
- "interval_data = dict(zip(simulators, [output_copasi, output_tellurium, output_amici]))\n",
- "\n",
- "interval_data['time_id'] = random.randint(0, 400)\n",
- "\n",
- "matrix = construct_process_interval_matrix(\n",
- " outputs_copasi=interval_data['copasi'],\n",
- " outputs_tellurium=interval_data['tellurium'],\n",
- " outputs_amici=interval_data['amici'],\n",
- " time_id=interval_data['time_id'],\n",
- " rtol=1e-05,\n",
- " atol=1e-08,\n",
- ")\n",
- "\n",
- "\n",
- "# matrix_df = pd.DataFrame(matrix, index=simulators, columns=simulators)\n",
- "matrix"
- ],
- "id": "3c2e8c6aea6c27fd",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "matrix_df = pd.DataFrame(matrix, columns=simulators, index=simulators)\n",
- "\n",
- "matrix_df"
- ],
- "id": "b0d94c75e3941ace",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "tolerance_range = np.linspace(0, 1, 1000)\n",
- "\n",
- "all_close_data = []\n",
- "\n",
- "for i, tolerance in enumerate(tolerance_range):\n",
- " tol_data = calc_comparison(output_copasi, output_tellurium)\n",
- " all_close_data.append(tol_data)"
- ],
- "id": "1dcbc0df0833277f",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "output_copasi, output_tellurium, output_amici",
- "id": "d4e97554c1928f15",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "y_data = all_close_data\n",
- "x_data = list(range(len(all_close_data)))\n",
- "\n",
- "len(x_data), len(y_data)"
- ],
- "id": "766c7ae74056c472",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "import matplotlib.pyplot as plt\n",
- "\n",
- "plt.plot(x_data, y_data)\n",
- "\n",
- "plt.show()"
- ],
- "id": "21902da5fce4c2e",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "comparison_matrices = []\n",
- "\n",
- "for i, output in enumerate(output_data.outputs):\n",
- " output_attributes = vars(output)\n",
- " for dataKey, dataVals in output_attributes.items():\n",
- " if isinstance(dataVals, dict):\n",
- " print(f'is dict: {dataKey}')\n",
- " interval_data_dict = dataVals \n",
- " for k, v in interval_data_dict.items():\n",
- " pass"
- ],
- "id": "2fcfa527c41c8de9",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "import numpy as np\n",
- "\n",
- "x = np.array([0, 1, 2, 3, 4])\n",
- "y = np.array([0, 1.01, 2.02, 3.03, 4.04])\n",
- "\n",
- "\n",
- "score = lambda a, b: (a - b) ** 2\n",
- "z = np.stack([x, y], axis=1)\n",
- "\n",
- "scores = [score(*output) * 100 for output in z]\n",
- "\n",
- "scores\n"
- ],
- "id": "f369481bef1c5b10",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": [
- "x = np.array([1, 3])\n",
- "y = np.array([3, 3])\n",
- "\n",
- "z = np.sum([x, y])\n",
- "\n",
- "z"
- ],
- "id": "67c1a82f754cdfdf",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "x - y",
- "id": "9274e21f6a7b8362",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "np.sum((x - y) ** 2) / 2",
- "id": "11e088b9aeda56a8",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "x - y",
- "id": "e510d3b32724162f",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:35:05.815961Z",
- "start_time": "2024-05-16T11:35:05.811759Z"
- }
- },
- "cell_type": "code",
- "source": [
- "import numpy as np\n",
- "import random\n",
- "from biosimulator_processes.steps.comparator_step import generate_ode_process_comparison_data\n",
- "\n",
- " \n",
- "# Sample outputs\n",
- "output_copasi = np.array([1.3, 2.4, 4.3])\n",
- "output_tellurium = np.array([1.3, 2.4, 4.5])\n",
- "output_amici = np.array([1.3, 2.4, 4.6])\n",
- "time_id = random.randint(0, 400)\n",
- "\n",
- "\n",
- "# Construct the matrix\n",
- "matrix_df = generate_ode_process_comparison_data(\n",
- " outputs_copasi=output_copasi,\n",
- " outputs_tellurium=output_tellurium,\n",
- " outputs_amici=output_amici,\n",
- " time_id=time_id)\n",
- "\n",
- "\n",
- "matrix_df"
- ],
- "id": "16066ce1f04f998d",
- "outputs": [
- {
- "data": {
- "text/plain": [
- " copasi tellurium amici\n",
- "copasi 0.000000 0.013333 0.030000\n",
- "tellurium 0.013333 0.000000 0.003333\n",
- "amici 0.030000 0.003333 0.000000"
- ],
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " tellurium \n",
- " amici \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " 0.000000 \n",
- " 0.013333 \n",
- " 0.030000 \n",
- " \n",
- " \n",
- " tellurium \n",
- " 0.013333 \n",
- " 0.000000 \n",
- " 0.003333 \n",
- " \n",
- " \n",
- " amici \n",
- " 0.030000 \n",
- " 0.003333 \n",
- " 0.000000 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ]
- },
- "execution_count": 20,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 20
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:37:39.283117Z",
- "start_time": "2024-05-16T11:37:39.278876Z"
- }
- },
- "cell_type": "code",
- "source": "matrix_df.to_json()",
- "id": "5481fd36ff6820dd",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'{\"copasi\":{\"copasi\":0.0,\"tellurium\":0.0133333333,\"amici\":0.03},\"tellurium\":{\"copasi\":0.0133333333,\"tellurium\":0.0,\"amici\":0.0033333333},\"amici\":{\"copasi\":0.03,\"tellurium\":0.0033333333,\"amici\":0.0}}'"
- ]
- },
- "execution_count": 24,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 24
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:41:59.384417Z",
- "start_time": "2024-05-16T11:41:59.382707Z"
- }
- },
- "cell_type": "code",
- "source": "# TODO: Iterate over ODEComparisonResults object for intervals and call matrix_df on each iteration.\n",
- "id": "1792c48b8910982b",
- "outputs": [],
- "execution_count": 26
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:49:58.869491Z",
- "start_time": "2024-05-16T11:49:58.867645Z"
- }
- },
- "cell_type": "code",
- "source": "inner = np.inner(output_copasi, output_amici)",
- "id": "c05779e940c0da43",
- "outputs": [],
- "execution_count": 27
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:50:00.299005Z",
- "start_time": "2024-05-16T11:50:00.296485Z"
- }
- },
- "cell_type": "code",
- "source": "inner",
- "id": "34aa12aac6a0bf41",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "27.229999999999997"
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 28
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:51:34.370629Z",
- "start_time": "2024-05-16T11:51:34.364529Z"
- }
- },
- "cell_type": "code",
- "source": [
- "import numpy as np\n",
- "import pandas as pd\n",
- "import random\n",
- "\n",
- "\n",
- "# Sample outputs\n",
- "output_copasi = np.array([1.3, 2.4, 4.3])\n",
- "output_tellurium = np.array([1.3, 2.4, 4.5])\n",
- "output_amici = np.array([1.3, 2.4, 4.6])\n",
- "\n",
- "# List of simulators\n",
- "simulators = ['copasi', 'tellurium', 'amici']\n",
- "\n",
- "# Function to calculate the mean squared error (MSE)\n",
- "def calculate_mse(a, b):\n",
- " return np.mean((a - b) ** 2)\n",
- "\n",
- "# Function to calculate the inner product\n",
- "def calculate_inner_product(a, b):\n",
- " return np.dot(a, b)\n",
- "\n",
- "# Calculate MSE and inner product matrices\n",
- "mse_matrix = np.zeros((3, 3), dtype=float)\n",
- "inner_product_matrix = np.zeros((3, 3), dtype=float)\n",
- "\n",
- "# Fill the matrices\n",
- "for i in range(3):\n",
- " for j in range(i, 3):\n",
- " mse_matrix[i, j] = calculate_mse(output_copasi, output_tellurium) if i != j else 0.0\n",
- " inner_product_matrix[i, j] = calculate_inner_product(output_copasi, output_tellurium) if i != j else np.dot(output_copasi, output_copasi)\n",
- " if i != j:\n",
- " mse_matrix[j, i] = mse_matrix[i, j]\n",
- " inner_product_matrix[j, i] = inner_product_matrix[i, j]\n",
- "\n",
- "# Create dataframes for better visualization\n",
- "mse_df = pd.DataFrame(mse_matrix, index=simulators, columns=simulators)\n",
- "inner_product_df = pd.DataFrame(inner_product_matrix, index=simulators, columns=simulators)\n",
- "\n",
- "print(\"MSE Matrix:\\n\", mse_df)\n",
- "print(\"\\nInner Product Matrix:\\n\", inner_product_df)"
- ],
- "id": "8bc4039937523a41",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "MSE Matrix:\n",
- " copasi tellurium amici\n",
- "copasi 0.000000 0.013333 0.013333\n",
- "tellurium 0.013333 0.000000 0.013333\n",
- "amici 0.013333 0.013333 0.000000\n",
- "\n",
- "Inner Product Matrix:\n",
- " copasi tellurium amici\n",
- "copasi 25.94 26.80 26.80\n",
- "tellurium 26.80 25.94 26.80\n",
- "amici 26.80 26.80 25.94\n"
- ]
- }
- ],
- "execution_count": 29
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:51:49.066008Z",
- "start_time": "2024-05-16T11:51:48.339049Z"
- }
- },
- "cell_type": "code",
- "source": [
- "import seaborn as sns\n",
- "import matplotlib.pyplot as plt\n",
- "\n",
- "# Plot MSE matrix\n",
- "plt.figure(figsize=(10, 4))\n",
- "plt.subplot(1, 2, 1)\n",
- "sns.heatmap(mse_df, annot=True, cmap=\"coolwarm\", cbar=True)\n",
- "plt.title(\"Mean Squared Error Matrix\")\n",
- "\n",
- "# Plot Inner Product matrix\n",
- "plt.subplot(1, 2, 2)\n",
- "sns.heatmap(inner_product_df, annot=True, cmap=\"coolwarm\", cbar=True)\n",
- "plt.title(\"Inner Product Matrix\")\n",
- "\n",
- "plt.tight_layout()\n",
- "plt.show()"
- ],
- "id": "7c4a7a4f05a43f52",
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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/1fNysoSAAgJCQnV2gAgREdH13qMqamp1Y6n6v3u37+/8OjRI1n5vXv3hJYtWwohISFybeTk5Ajm5uZy5R4eHoKdnZ1w9+5dWdnvv/8uABAcHBwUv0GPqXqfFG1Tp06V1YuOjhYACOPGjavWhoODgwBASEpKkisPDw8XAAh//PGH3LE5OTkJjo6OQmVlpSAIgrBv3z4BgNChQweF750iAITQ0FChsLBQMDQ0FL777jtBEARh165dgkgkEq5evSqLOT8/X7afovZjY2MFkUgk938gNDRUUPSnqur/gZmZmZCXl6fwuSf/j4wbN05o3ry5cPHiReGLL74QAAjbt29X6jiJiBqjx78vVAkKChIACB9//LFc3R49egi9evWSPa76W9mqVSuhsLBQVv7zzz8LAIRffvlFVjZo0CChW7duct8PJBKJ4O3tLbi4uFSL58l8WpOqGObPny/k5+cLOTk5wv79+4UePXoIAISffvqp1nbz8vIEQ0NDYciQIbJcJgiCsGLFCgGAsGbNGkEQBKG8vFywtrYWPDw8hLKyMlm91atXCwCEAQMGVDuGrKwsuVircuS+ffsEQRCER48eCU5OToKDg4Nw584duboSiUT2c015rCYDBgwQunbtKgiCIPTu3VuYNGmSIAiCcOfOHcHQ0FBYt26dLJbNmzfL9lP2O8/mzZvljuNxNX2PqHouKChIruybb74RAAgbNmwQjh49Kujr6wvh4eFKHyuRLuIUbh3w2muv4eHDh9i5cyfu3buHnTt31jh9e/PmzTA3N8fgwYNRUFAg23r16oUWLVpg3759srqPXxd77949FBQU4Pnnn8eDBw+qrY7dokULuWuTDA0N0bdvX1y5cqXW2EUiEX777Td88sknsLCwwA8//IDQ0FA4ODhgzJgxsulVlZWV+O233xAYGIj27dvL9u/cuTP8/f2Vfq+e9PgxVlRU4Pbt2+jYsSNatmyJ06dPV6sfEhICfX192ePk5GTcvXsX48aNk3s/9fX14enpKXs/b926hbNnzyIoKEhuwa/BgwejS5cuSsfr6OiI5OTkalt4eHi1um+//bbCNpycnKq9Z7/++iv69u0rtxhdixYtMGXKFFy9ehUXLlyQqx8UFKTyddMWFhYICAjADz/8AEB6ltzb21s2C+FJj7dfUlKCgoICeHt7QxAEnDlzRunXHTVqFKysrJSq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"
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "execution_count": 30
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:55:14.570531Z",
- "start_time": "2024-05-16T11:55:13.372814Z"
- }
- },
- "cell_type": "code",
- "source": [
- "from dataclasses import dataclass\n",
- "from typing import Dict \n",
- "\n",
- "import numpy as np\n",
- "import pandas as pd\n",
- "import seaborn as sns\n",
- "import matplotlib.pyplot as plt\n",
- "\n",
- "from biosimulator_processes.data_model import _BaseClass\n",
- "\n",
- "\n",
- "def calculate_mse(a, b):\n",
- " return np.mean((a - b) ** 2)\n",
- "\n",
- "def calculate_rmse(a, b):\n",
- " return np.sqrt(calculate_mse(a, b))\n",
- "\n",
- "def calculate_inner_product(a, b):\n",
- " return np.dot(a, b)\n",
- "\n",
- "def calculate_outer_product(a, b):\n",
- " return np.outer(a, b)\n",
- " \n",
- " \n",
- "def generate_ode_process_interval_comparison_data(outputs: list[np.array]):\n",
- " simulators = ['copasi', 'tellurium', 'amici']\n",
- " \n",
- " mse_matrix = np.zeros((3, 3), dtype=float)\n",
- " rmse_matrix = np.zeros((3, 3), dtype=float)\n",
- " inner_product_matrix = np.zeros((3, 3), dtype=float)\n",
- " outer_product_matrices = {}\n",
- " \n",
- " # fill the matrices with the calculated values\n",
- " for i in range(len(simulators)):\n",
- " for j in range(i, len(simulators)):\n",
- " mse_matrix[i, j] = calculate_mse(outputs[i], outputs[j])\n",
- " rmse_matrix[i, j] = calculate_rmse(outputs[i], outputs[j])\n",
- " inner_product_matrix[i, j] = calculate_inner_product(outputs[i], outputs[j])\n",
- " outer_product_matrices[(simulators[i], simulators[j])] = calculate_outer_product(outputs[i], outputs[j])\n",
- " if i != j:\n",
- " mse_matrix[j, i] = mse_matrix[i, j]\n",
- " rmse_matrix[j, i] = rmse_matrix[i, j]\n",
- " inner_product_matrix[j, i] = inner_product_matrix[i, j]\n",
- " \n",
- " # convert matrices to dataframes for better visualization\n",
- " mse_df = pd.DataFrame(mse_matrix, index=simulators, columns=simulators)\n",
- " rmse_df = pd.DataFrame(rmse_matrix, index=simulators, columns=simulators)\n",
- " inner_product_df = pd.DataFrame(inner_product_matrix, index=simulators, columns=simulators)\n",
- " return \n",
- "\n",
- "\n",
- "def plot_ode_process_comparison(mse_df, rmse_df, inner_product_df):\n",
- " # Plot heatmaps for MSE, RMSE, and inner product matrices\n",
- " plt.figure(figsize=(15, 5))\n",
- " \n",
- " plt.subplot(1, 3, 1)\n",
- " sns.heatmap(mse_df, annot=True, cmap=\"coolwarm\", cbar=True)\n",
- " plt.title(\"MSE Matrix\")\n",
- " \n",
- " plt.subplot(1, 3, 2)\n",
- " sns.heatmap(rmse_df, annot=True, cmap=\"coolwarm\", cbar=True)\n",
- " plt.title(\"RMSE Matrix\")\n",
- " \n",
- " plt.subplot(1, 3, 3)\n",
- " sns.heatmap(inner_product_df, annot=True, cmap=\"coolwarm\", cbar=True)\n",
- " plt.title(\"Inner Product Matrix\")\n",
- " \n",
- " plt.tight_layout()\n",
- " plt.show()\n",
- " \n",
- " # Visualize outer product matrices\n",
- " fig, axes = plt.subplots(3, 3, figsize=(15, 15))\n",
- " for idx, ((sim1, sim2), matrix) in enumerate(outer_product_matrices.items()):\n",
- " ax = axes[idx // 3, idx % 3]\n",
- " sns.heatmap(matrix, annot=True, fmt=\".2f\", cmap=\"coolwarm\", ax=ax, cbar=True)\n",
- " ax.set_title(f\"Outer Product: {sim1} vs {sim2}\")\n",
- " ax.set_xlabel(sim2)\n",
- " ax.set_ylabel(sim1)\n",
- " \n",
- " plt.tight_layout()\n",
- " plt.show()\n",
- " \n",
- "\n",
- "# Sample time series outputs from three simulators\n",
- "output_copasi = np.array([1.3, 2.4, 4.3, 5.6, 6.7])\n",
- "output_tellurium = np.array([1.3, 2.4, 4.5, 5.7, 6.8])\n",
- "output_amici = np.array([1.3, 2.4, 4.6, 5.8, 7.0])\n",
- "\n",
- "# List of simulators and their outputs\n",
- "\n",
- "outputs = [output_copasi, output_tellurium, output_amici]"
- ],
- "id": "876dd13c84bdc99",
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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/vlnzJs3D7Nnz4ajoyPeffdd2NnZlXvQ5fz583H37l0sXrwYT58+RdeuXZUeEP/4449x8+ZNHDt2DEZGRgBK1lb/7rvv0KFDB8yZMwerV69W2/kREZHua9asGU6fPo0FCxZg06ZNePz4Mezt7dG6dWvMnz+/WvsWFhYGOzs7rFq1CrNmzYK1tTUmT56M//u//4OBgYGs3uTJk1FcXIyvvvoKc+bMQcuWLbF7926FDwrdvHkzpkyZgkWLFsHS0hKBgYHo3r07evXqJVfPz88PBw8exIIFC7B06VJIpVK4ubkhKChIVmfo0KGYPn06tmzZgh9++AGCICg1IF5Zy5cvh56eHjZv3oy8vDx06tQJ+/fvL7fuu6OjI6KiohAeHo7AwEAUFxfj4MGDSg2I//PPP5g1axYGDhwoNwFx3Lhx2L59Oz744AP07duXzx+j15JI4D0QRERERERERERERFQDcA1xIiIiIiIiIiIiIqoROCBORERERERERERERDUCB8SJiIiIiIiIiIiIqEbggDgRERERERERERER1QgcECciIiIiIiIiIiKiGoED4kRERERERERERERUI3BAnIiIiIiIiIiIiIhqBP3q7kCpzgMPV3cXSAPGTO1a3V0gDXAZ1KS6u0Aa0L/wusba3mug/v9nNNlfUg2z/PX04zK76u4CaciFZkOquwukAZrKR2Z5zcAsf331H9+5urtAGjDM60F1d4E0oLFbPY20yywvwxniRERERERERERERFQjaM0McSIien2JDETV3QUiIiJ6BcxyIiIi3cYsL8MZ4kRERERERERERERUI3CGOBERaZxYn1eiiYiIdBmznIiISLcxy8twQJyIiDROZMAbkoiIiHQZs5yIiEi3McvL8J0gIiIiIiIiIiIiohqBM8SJiEjjeGsWERGRbmOWExER6TZmeRnOECciIiIiIiIiIiKiGoEzxImISONEBrwSTUREpMuY5URERLqNWV6GA+JERKRxvDWLiIhItzHLiYiIdBuzvAyXTCEiIiIiIiIiIiKiGoEzxImISON4axYREZFuY5YTERHpNmZ5Gc4QJyIiIiIiIiIiIqIagTPEiYhI47hWGRERkW5jlhMREek2ZnkZDogTEZHGifQYvERERLqMWU5ERKTbmOVluGQKERERERER6YTIyEi4uLjAyMgI3t7eOHnyZIV1v/32W7zx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IiIi3cYsJyIiUo1IEARB1RdnZ2fj6tWrMDY2RqNGjRSu3VpZnQceVvm1pL3GTO1a3V0gDXAZ1KS6u0Aa0L/wusbafrJsptrbNA+JUHubNRGznF7mx2V21d0F0pALzYZUdxdIAzSV58xy7cUsp8roP75zdXeBNGCY14Pq7gJpQGO3ehppl1leRqUZ4qXMzMzQrl07dfWFiIiIqhiznIiISLcxy4mIiJTzSgPiRERElSLmWmVEREQ6jVlORESk25jlMhwQJyIijROJdPfp00RERMQsJyIi0nXM8jK8NEBERERERERERERENQJniBMRkebx1iwiIiLdxiwnIiLSbcxyGb4TRERERERERERERFQjcIY4ERFpnEjMtcqIiIh0GbOciIhItzHLy3BAnIiINE/EG5KIiIh0GrOciIhItzHLZfhOEBEREREREREREVGNwBniRESkebw1i4iISLcxy4mIiHQbs1yGM8SJiIiIiIiIiIiIqEbgDHEiItI4EdcqIyIi0mnMciIiIt3GLC/DAXEiItI83ppFRESk25jlREREuo1ZLsNLA0RERERERERERERUI3CGOBERaZxIzOuvREREuoxZTkREpNuY5WX4ThARERERERERERFRjcAZ4kREpHkirlVGRESk05jlREREuo1ZLsMBcSIi0jzemkVERKTbmOVERES6jVkuw3eCiIiIiIiIiIiIiGoEzhAnIiLN461ZREREuo1ZTkREpNuY5TKcIU5ERERERERERERENQJniBMRkcaJuFYZERGRTmOWExER6TZmeRkOiBMRkeaJGLxEREQ6jVlORESk25jlMnwniIiIiIiISCdERkbCxcUFRkZG8Pb2xsmTJyuse/nyZQwbNgwuLi4QiUSIiIgoVycsLAwikUhuc3d3l6uTl5eHadOmwcbGBmZmZhg2bBhSUlLUfWpERERURTggTkREmicWqX8jIiKiqqMFWb5161aEhIQgNDQUZ86cgYeHB/z8/JCamqqwfm5uLho0aIBFixbB0dGxwnabN2+OpKQk2Xb06FG5/bNmzcKvv/6Kbdu24fDhw3j48CGGDh2qdP+JiIiqlRZkubbggDgRERERERFpvWXLliEoKAgBAQFo1qwZoqKiYGJigg0bNiis365dO3z11VcYPXo0JBJJhe3q6+vD0dFRttna2sr2ZWVlYf369Vi2bBl69OgB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IiLN423RREREuo1ZTkREpNs0kOUSiURtA+Cl63+npKTIDWynpKTA09MTAHDgwAHs2bMHGRkZMDc3BwCsXr0asbGx+O677/DRRx9V6lj8VENERERERERERERE1cbV1RWOjo6Ii4uTlT158gQnTpyAj48PACA3NxcAIBbLD2mLxWJIpdJKH4szxImISPN4mzUREZFuY5YTERHpNi3I8uzsbNy8eVP2c2JiIs6dOwdra2vUq1cPM2fOxOeff45GjRrB1dUVn376KZydneHv7w8A8PHxgZWVFSZOnIj58+fD2NgY3377LRITE9G/f/9K94MD4kRERERERERERESkUadPn0b37t1lP5euPz5x4kRs2rQJH3zwAXJycjB58mRkZmaic+fOiImJgZGREQDA1tYWMTEx+OSTT9CjRw8UFhaiefPm2LVrFzw8PCrdDw6IExGR5om5QhcREZFOY5YTERHpNi3I8m7dukEQhAr3i0QiLFy4EAsXLqywTtu2bfH777+/Uj84IE5ERBqniadZExERUdVhlhMREek2ZnmZ6r80QERERERERERERERUBThDnIiINE/E669EREQ6jVlORESk25jlMnwniIiIiIiIiIiIiKhG4AxxIiLSOIFXoomIiHQas5yIiEi3McvLcECciIg0jw/vICIi0m3MciIiIt3GLJfhpQEiIiIiIiIiIiIiqhE4Q5yIiDSOt2YRERHpNmY5ERGRbmOWl+E7QURERERERDohMjISLi4uMDIygre3N06ePFlh3cuXL2PYsGFwcXGBSCRCREREuTrh4eFo164datWqBXt7e/j7++P69etydbp16waRSCS3vfPOO+o+NSIiIqoiHBAnIiLNE4nUvxEREVHV0YIs37p1K0JCQhAaGoozZ87Aw8MDfn5+SE1NVVg/NzcXDRo0wKJFi+Do6KiwzuHDhzFt2jQcP34csbGxKCwsRO/evZGTkyNXLygoCElJSbJt8eLFSvefiIioWmlBlmsLLplCRESax1uziIiIdJsWZPmyZcsQFBSEgIAAAEBUVBT27t2LDRs24KOPPipXv127dmjXrh0AKNwPADExMXI/b9q0Cfb29khISECXLl1k5SYmJhUOqhMREekELchybcF3goiIiIiIiLRaQUEBEhIS4OvrKysTi8Xw9fVFfHy82o6TlZUFALC2tpYr37x5M2xtbdGiRQvMnTsXubm5ajsmERERVS3OECciIo0TdPhWKiIiItJMlufn5yM/P1+uTCKRQCKRlKublpaG4uJiODg4yJU7ODjg2rVraumPVCrFzJkz0alTJ7Ro0UJWPnbsWNSvXx/Ozs64cOECPvzwQ1y/fh07duxQy3GJiIiqAr+Xl+GAOBEREREREVW58PBwLFiwQK4sNDQUYWFh1dKfadOm4dKlSzh69Khc+eTJk2V/btmyJZycnNCzZ0/cunULbm5uVd1NIiIiekUcECciIs3jWmVERES6TQNZPnfuXISEhMiVKZodDgC2trbQ09NDSkqKXHlKSopa1vYODg7Gnj17cOTIEdSpU+eFdb29vQEAN2/e5IA4ERHpDn4vl+E7QUREGidApPaNiIiIqo4mslwikcDc3Fxuq2hA3NDQEF5eXoiLi5OVSaVSxMXFwcfHR/XzEgQEBwfjl19+wYEDB+Dq6vrS15w7dw4A4OTkpPJxiYiIqhq/l5fhDHEiIiIiIiLSeiEhIZg4cSLatm2L9u3bIyIiAjk5OQgICAAATJgwAbVr10Z4eDiAkgdxXrlyRfbnBw8e4Ny5czAzM0PDhg0BlCyTEh0djV27dqFWrVpITk4GAFhYWMDY2Bi3bt1CdHQ0+vXrBxsbG1y4cAGzZs1Cly5d0KpVq2p4F4iIiOhVcUCciIg0TuCtWURERDpNG7J81KhRePToEebPn4/k5GR4enoiJiZG9qDNe/fuQSwu6+fDhw/RunVr2c9LlizBkiVL0LVrVxw6dAgAsGbNGgBAt27d5I61ceNGTJo0CYaGhti/f79s8L1u3boYNmwY5s2bp9mTJSIiUjNtyHJtwQFxIiIiIiIi0gnBwcEIDg5WuK90kLuUi4sLBEF4YXsv21+3bl0cPnxYqT4SERGRduOAOBERaR6vRBMREek2ZjkREZFuY5bL8J0gIiKNE0QitW/KioyMhIuLC4yMjODt7Y2TJ0++sP62bdvg7u4OIyMjtGzZEvv27ZPtKywsxIcffoiWLVvC1NQUzs7OmDBhAh4+fCjXhouLC0Qikdy2aNEipftORERU3bQhy4mIiEh1zPIyHBAnIqLX3tatWxESEoLQ0FCcOXMGHh4e8PPzQ2pqqsL6x44dw5gxYxAYGIizZ8/C398f/v7+uHTpEgAgNzcXZ86cwaeffoozZ85gx44duH79OgYNGlSurYULFyIpKUm2TZ8+XaPnSkREREREREQV45IpRESkcdX98I5ly5YhKCgIAQEBAICoqCjs3bsXGzZswEcffVSu/vLly9GnTx/MmTMHAPDZZ58hNjYWq1atQlRUFCwsLBAbGyv3mlWrVqF9+/a4d+8e6tWrJyuvVasWHB0dNXh2REREmlfdWU5ERESvhllehu8EERFpnkik9i0/Px9PnjyR2/Lz88sduqCgAAkJCfD19ZWVicVi+Pr6Ij4+XmF34+Pj5eoDgJ+fX4X1ASArKwsikQiWlpZy5YsWLYKNjQ1at26Nr776CkVFRUq8cURERFpCA1lOREREVYhZLqPyDPHU1FSkpqZCKpXKlbdq1eqVO0VERPQy4eHhWLBggVxZaGgowsLC5MrS0tJQXFwMBwcHuXIHBwdcu3ZNYdvJyckK6ycnJyusn5eXhw8//BBjxoyBubm5rPy9995DmzZtYG1tjWPHjmHu3LlISkrCsmXLKnuaGsc8JyIi0m3MciIiIuUoPSCekJCAiRMn4urVqxAEAQAgEokgCAJEIhGKi4vV3kkiItJtmrg1a+7cuQgJCZErk0gkaj/OyxQWFmLkyJEQBAFr1qyR2/d8/1q1agVDQ0NMmTIF4eHh1dLX5zHPiYhIGbzNWvswy4mISBnM8jJKD4i/9dZbaNy4MdavXw8HBweIdHh6PBER6S6JRFKpQWVbW1vo6ekhJSVFrjwlJaXCtb0dHR0rVb90MPzu3bs4cOCA3OxwRby9vVFUVIQ7d+6gSZMmL+27JjHPiYiIdBuznIiISDVKD4jfvn0b27dvR8OGDTXRHyIieg0JqL4vaIaGhvDy8kJcXBz8/f0BAFKpFHFxcQgODlb4Gh8fH8TFxWHmzJmystjYWPj4+Mh+Lh0Mv3HjBg4ePAgbG5uX9uXcuXMQi8Wwt7d/pXNSB+Y5EREpozqznBRjlhMRkTKY5WWUHhDv2bMnzp8/z9AlIqJKq+5bs0JCQjBx4kS0bdsW7du3R0REBHJychAQEAAAmDBhAmrXro3w8HAAwIwZM9C1a1csXboU/fv3x5YtW3D69GmsXbsWQMlg+PDhw3HmzBns2bMHxcXFsvXFra2tYWhoiPj4eJw4cQLdu3dHrVq1EB8fj1mzZuHNN9+ElZVV9bwRz2GeExGRMqo7y6k8ZjkRESmDWV5G6QHxdevWYeLEibh06RJatGgBAwMDuf2DBg1SW+eIiIjUYdSoUXj06BHmz5+P5ORkeHp6IiYmRvbgzHv37kEsLvtw0LFjR0RHR2PevHn4+OOP0ahRI+zcuRMtWrQAADx48AC7d+8GAHh6esod6+DBg+jWrRskEgm2bNmCsLAw5Ofnw9XVFbNmzSq37nl1YZ4TERHpNmY5ERGRapQeEI+Pj8dff/2F3377rdw+PriDiIgU0oI1LYODgytcIuXQoUPlykaMGIERI0YorO/i4iJ7eFVF2rRpg+PHjyvdz6rCPCciIqVoQZaTPGY5EREphVkuo/Rc+enTp+PNN99EUlISpFKp3MbAJSIi0g3McyIiIt3GLCciIlKN0jPEHz9+jFmzZsluMyciInoZQfnrr6RhzHMiIlIGs1z7MMuJiEgZzPIySr8TQ4cOxcGDBzXRFyIiek0JIpHaN3o1zHMiIlIGs1z7MMuJiEgZzPIySs8Qb9y4MebOnYujR4+iZcuW5R7c8d5776mtc0RERKQZzHMiIiLdxiwnIiJSjdID4uvWrYOZmRkOHz6Mw4cPy+0TiUQMXSIiKkcQ8dYsbcM8JyIiZTDLtQ+znIiIlMEsL6P0gHhiYqIm+kFERERViHlORESk25jlREREqlF6QJyIiEhZAnR3bTEiIiJilhMREek6ZnkZpQfE33rrrRfu37Bhg8qdISKi1xNvzdI+zHMiIlIGs1z7MMuJiEgZzPIySg+IZ2RkyP1cWFiIS5cuITMzEz169FBbx4iIiEhzmOdERES6jVlORESkGqUHxH/55ZdyZVKpFO+++y7c3NzU0ikiInq9CCLemqVtmOdERKQMZrn2YZYTEZEymOVl1DJXXiwWIyQkBF9//bU6miMiIqJqwDwnIiLSbcxyIiKil1PbQzVv3bqFoqIidTVHRESvET68Q3cwz4mISBFmue5glhMRkSLM8jJKD4iHhITI/SwIApKSkrB3715MnDhRbR0jIqLXBx/eoX2Y50REpAxmufZhlhMRkTKY5WWUHhA/e/as3M9isRh2dnZYunTpS59yTURERNqBeU5ERKTbmOVERESqUXpA/ODBg5roBxERvcZ4a5b2YZ4TEZEymOXah1lORETKYJaX4Vx5IiIiIiIiIiIiIqoRKjVDvE2bNoiLi4OVlRVat24NkajiKwpnzpxRW+e00fk/N+PMgfXIffoIts7u6DrsUzjWb1Vh/RvnfsPxfcvxJP0BLO1c0GngbLg06yrbf/P8H7h4bAse3b+MvNxMjJm9E3Z1msr25+Vk4njMSty7dhRPM5NgbGoNt5a+6NBvBiTGtTR6rlR5Q/s5Y8zQurC2MsStxGx8/c1NXL3xtLq7VePx91V7cK0y7cA8r9iuPfvw046dSM/IhJurC4KnvA33Jo0V1r1z9x42bf4RN27eQkrqI7wb9BaGDR4oV+fCpcv4aftO3Lh1C4/TM7Dgk4/Qyce7Kk6FVMQs1x38fa0ezHLtUFOzvK4t4O0uhqMVUMtYhJ+PFuPGQ80es01DEbybiGBmBKRmAn+clSIpvWSfkSHwRnMRXB1EMDcBcvOBGw8FHLkkIL9Qs/3SNZcvnceu7Vtw6+bfyEh/jA/nfQZvnzcqrJ+e/hjfrVuNmzeuIznpAfoNGorAydM13s9LF85i47rVuH/3Dmzt7DB81Hj06NVXtn/7T5tx/NgRPPjnHgwNJXBv2hzjA6agdp16Gu+btkq4l4Lvj1/FleR0pGU/w7JhXdC9Sd0K6z/KfoZl+xNwJTkd99OfYky7JpjTq63G+3n6bgqW7k/ArbQsOJqb4O1OLTColZts//pjl3Dg+n3cefwEEn09eNSxw4zureFiY67xvlU1ZnmZSg2IDx48GBKJBADg7++vyf5otb/P7MOfO8PRY+QCONT3wLnD32FXVCDGfxwDk1o25eonJZ5BzPfvo+OAELg2647rZ37FnvXTMGb2Dtg4lXxoLyzIhbNrGzTy7IsDW+eVayPnSSpyslLRefCHsHZsiKfpD3BwWxiyn6Sif8AKjZ8zvVyPznYIftsNSyL/xpW/n2LkoNpYtrAlxrxzCplZ/DRUXfj7ql14a5Z2YJ4rdvDIUUSt24gZ095B0yaNsX3Xr/ho/kJs/GYVrCwty9XPy8+Hk6MDunbqiDXrNipsMy8vDw0auKBPr54I+78vNXwG9KqY5bqDv6/Vh1muHWpqlhvoA6mZAi4kChjWSe+V22vpIkJLFxGiD0kV7m9aV4SeHiLEJAh4mC6gXSMRRnURY+1vUuTmA2ZGgJmxCAfOS5H2BLAwBfp4iWFmJMIv8YrbrKny8/Lg4uqGHr36YfEXn760flFhAcwtLDF89Hjs2blNLX1ITUnCO2+NwY69hxTuT0lOwhdhc9G73yDMmj0PF84nYPWKr2BlbYPWXu0BAJcvnkPf/v5o2NgdxcXF2PzdOiyYNwcrojbByMhYLf3UNc8Ki9DY3hKDPdzw/vYjL61fWFQMKxMjvN2pBTafvKaWPjzMzEb/1btw9uNxCvc/yMzG9J8OYnjrRvhicCecvJOMhXtPwNbMGB0bOAMAztxLxSivxmjuZIMiqYBVh87h3R/jsGPyQBgbKr3StFZjlpep1N9saGgoAKC4uBjdu3dHq1atYKngA+fr7uyhjWjhMxLNvIcBAHqMWIA7Vw7hyontaOs7uVz9c4e/R333N+DV420AgE+/mbh3/RjO//kDeoxcCABo2s4fAPDk8T8Kj2nj1Bj931op+9nSth58+s/E7/+bA2lxEcR6r9cvpy4a7V8Hv/6ehH1xKQCAr1bfgE87Gwzo5Ygffr5fzb2rufj7SlQe81yx7Tt3o59fL/Tp1RMAMHPaOzhxKgExsXEYM2JYufrujRvBvXEjAMC67/6nsM32bb3Qvq2X5jpNasUs1x38faWarqZm+e1k4HayUOF+PTHQtaUIzeqKIDEE0rKAgxekuPdIteO1byzC+dsCLt4pOWZMgoCGTiK0chXh+DUBaU+AX46VDXxn5gCHL0ox0FsMkQgQKu5qjdOmrTfatK38XTf2Dk4InFIyI/xA7L4K68X+vge7d/yE1JQk2Ds4ot/AYeg7wF+lPv6+bzfsHR0R8PZUAECdevVx9cpF/Lpzm2xAfP5nX8m9ZnrIRwgY649bN/9G8xYeKh1X13V2q43ObrUrXd/Z0gwf9C6ZEb7r/K0K6+04dxM/nLiKB5nZcLYww5h2TTDSS/GdYC/z85kbqG1hhvd9S3K+ga0Fzt5/hM0nr8kGxCNH95B7zYIBPui5fDuuJD+GVz0HlY5L2k+pufJ6enro3bs3MjIyNNUfrVVcVIDUfy6jbuOOsjKRWIy6jTsi6c5Zha9JunMOdRv7yJXVd++M5DvnXqkv+c+yYWhkxsE1LaCvL0LjhrVw+nzZ74QgAKfPZaB5k9fv9hpdwd9X7SOIxGrfSHU1Oc//q7CwEH/fvIU2nmVfZMRiMdp4tsKVa9ersWdUVZjluoO/r9WLWa5dmOXyercRobaNCDuPS7H+dymu/iNgVBcxrMyUb0ssBhytgMQU+VHtO6kCattUPLtSYiBCQSEHw6vC4YOx2PLDRoyb8DZWRH2PcROC8OMPG3Bwf4xK7f197TJaecpfGPVs0x5/X7tS4Wtyc7IBAGZmNXtpTHXbdykRa45cwLSuHtgxZSCCu3lg9ZHz2H3htkrtnX/wCN6ujnJlHRs44cKDtApfk/3vukcWRhKVjqnNmOVllO55ixYtcPu2av8j6rJnORkQpMXlllowqWWD3CeKf5Fyn6bBpJZtufo5FdSvVD+y03Hqj9Vo0XGUym2Q+liYG0BfT4T0DPnbqdMzC2FjZVhNvSL+vhK9XE3N8//KevIUUqkUVpYWcuVWlpbIyMisnk5RlWKW6w7+vhLJY5aXMDcBWrmI8MsxKf5JK5mtffK6gPtpQCtX5ZcHMDEExGIRcvPly3PySpZKUcTYEOjUTISztzkaXhW2bt6ISYFT0aFTFzg4OqFDpy4Y6D8cf/z2q0rtZWSkw9LSWq7M0tIKubk5yM/PL1dfKpViw9pVcG/WAvVdGqh0TFIs6s8LCOnZBj3d66G2pRl6utfDuHbu2H72hkrtPc7Jg7Wp/C+utakRsvMLkVdYVK6+VBCwZP9peNaxQ0N7S5WOSbpB6SmLn3/+OWbPno3PPvsMXl5eMDU1ldtvbv7ymTT5+fnl/lEpLJTAwOD1u/qiTvl52di9dgqsHdzg3Se4urtDRC/A31d5XKtM+7xqnivK8vyCAkgMOYBIRPQ6YpZrH01keVGhPvR17Hu5nUXJAPaUvvLz/fT0gGf/np65CRDkV7ZfLAbEIuD9IWVlx64JiL+q/IC2oT4w8g0x0p4ARy9zQFzT8vKeITnpISJXLMaalWXLmBQXF8PEtOyWgBnvTsKj1GQAZbP2xw7rI9vftHkrfLpwsUp9+HZNBO7dTcQXX618eWWqtGcFRbifkY2Fe4/js30nZOXFUinMJGXfMYat3YOkrBwAgICSv9yOX22V7W9d167cMiiVFR5zCjcfZWHj+N4qvV7bMcvLKD0g3q9fPwDAoEGD5J5oLQgCRCIRiouLX9pGeHg4FixYIFfWd2wo+r8Zpmx3qoyxqRVEYj3kPn0sV5779DFMzG0Vvsakli1yn6aVq29aQf0XKcjLxq6ot2FoZIr+gZHQ0zNQug1Sv6wnhSgqFmBtJf/3YW1pgMcZBdXUK+Lvq/YRRAxebfOqea4oy2cGT0XIe9PU31kNsjCvBbFYjIzMLLnyjMxMWFlZVk+nqEoxy3UHf1+rF7Nc+2giy3sM/xS+I0LV31kNMtQXQSoVsHG/tNxyJQX/TgB9+gzYEFu25nfj2iK41xFh94mysmf//pOfWwBIpQJM/nNdwNQIyM7777GBUV3EyC8Ctv8lhZTj4RqX9+wZAODd6bPRuElTuX1icdkDVz9ZsAjFRSX/A6Q/TsOnH83E0pXrZPsNDcv+gq2srJGZmS7XVmZmBkxMTGUPsS317ZoInD4Zj8+/XAFbW3v1nBQBAHILSu7W+7SfN1o4y38P1xOX/Ru3clQ3FBWX/LKlPs1F0Ob92BLYT7bfyKDs/wMbUyOk58j/4qbn5MFMYgAjA/kh0UW/n8KfNx9g/fhecDA3Uc9JaRlmeRmlB8QPHjz4ygedO3cuQkJC5Mo2HNLuq9B6+oawr9Mc92/Ew62VLwBAkEpx/+94eLzxpsLXOLl44v6N42jdbZKs7N71Y3B08VTq2Pl52di1JhB6+oYY8PYanbti/zorKhLw982n8GplhT+Plwy+ikSAl4cVdux9UM29q7n4+0r0cq+a54qyPPW+7t22bWBggMYN3XDm/AV08il54JNUKsXZ8xcxeEDfau4dVQVmue7g7yuRPE1k+fJfde+5NykZAsRiMUwkwD8VrHYoCEBGdtnPuflAYbF8WSmpFEjOAFwcRLjxsGyEu769CAk3y3421AdGdxGjSAr8fFSKYmn5tkj9LK2sYW1ji5TkJHTt3qvCevb2ZetG6+mVDJA6OddRWLexe3OcOX1cruzC2dNo7N5M9rMgCFgXtRwn4o9iYXgEHBydXuU0SAEbM2PYmRnjn8xs9GvhWmE9Z4uyOwH0/x0or2eteC13j9p2OHpL/vPc8cQktKpdNuAuCAK+/OM0Dly/j2/f9EVtSxUePkA6R+m069q16ysfVCKRlLvKZqADEyhbdwtAbPSHcKjbAg71WuHc4e9QVPAMzbyHAgD++OEDmFo4oNPA9wEAnl0nYPvK8ThzcANcmnXF32f2IfX+JfQctVDWZl5OJp5mJCHnSSoAICM1EQBgYm4LU3M75OdlY+eat1BU8Ay9x3+FgrxsFOSVpLaxmbXcFVCqHlt2/oNPZrnj2s2nuPr3U4wcXBvGRmLs3Z9c3V2r0fj7ql0EgVeitc2r5rmiLM/S0eVShvkPwuKvV6BJIzc0adwIO3btQV5eHvr49gQALFq6HLY21nh70ngAJQ/2u3v/HwBAUVER0h4/xs3biTA2MkJt55IvR8+ePcODpLIcSEpJwc3biahlZgYHe7sqPkN6GWa57uDva/VhlmsfTWS5vsHL7/iuDgb6kHtApqWZCPaWAvIKgPRs4NJdKQa2FyPuvBQpmYCJBHCxFyE1S8CtJOWPd/JvAQPai5CcDjxMF9CusQgG+sCFxJIBcUN9YHRXMQz0gN1/SSExACT/jmnk5vPBms979iwXyQ/LBiRTk5OReOsGzGqZw87eAT9sWovHj9Mw4/2PZXUSb5WsF5337BmeZGUh8dYN6BsYoG49FwDAqHGTsP6blTA1NUVrr/YoLCzEzRvXkZP9FIOGjFS6j379BuG3Pb/g+w1R6NGrLy6eP4u//jyIT8IWyeqsXR2BPw/vx9xPv4CxsTEy0ksuopuYmpX7PaopcgsKcT/jqeznB1nZuJ6SDnMjCZwsTLHi4FmkPn2Gzwd1lNW5npL+72uLkJGbj+sp6dAX68HNruT5IO90aYWv/jgNM4kBOjVwRkFxMa4kpeNJXgHGe8vfEVAZw9s0wpaE64g4cAaDW7nh1N0UxF69hxWjusnqhP9+Cr9dvoOvh3eFqaEB0rJL7kJQNItc1zHLyyj9N3vkyJEX7u/SpYvKndF2jdv0w7OcdBz/bQVynjyCXe2mGDxlnexBfE8zkiB67gmrTq5t4DdhCeL3RuDYnmWwtHPBgMBI2Dg1ltW5fekA9v84V/ZzzPezAADt/YLRoe90PLp/GSl3zwMAvv9c/urnpE/jYG6j+AonVZ0DRx/B0sIAb49zgbWVIW7ezsb7oReRkVn48heTxvD3lejFanKe/1f3Lp2RlfUEm37YgoyMDLg1cEX4wvmyJRhSHz2C+LnbNB+nZ+Cd98pm1G3bsQvbduxCqxbNsWzR5wCA6zduYfbHn8rqRK3bCADo3bM7Ppj1XhWcFSmDWa47+PtKVKYmZbmTFTCue9nkEl/Pks/xFxKl2HtKwN6TAjo1A3p6iFHLuGTZk4ePgZtJqo1MX71fsmTKGy1EMDUSITUT+OmIVPagTUcroLZNyb817/aXn/Syek8xsnJVOuxr6daN65g/d5bs543rIgEA3Xv6YXrIXGSkP0baoxS517z/XlDZ62/+jT8P7YedvQO+2ViyTnQvvwGQSIywa/sWfLc+CkZGRqjn0gADBg9XqY8Ojk74JCwcG7+NxJ5d22Fja4ep781Ba6/2sjq/79sFAPj0o5lyrw2e+SF69KqZdyldSUpH0Ob9sp+X7j8DABjYsgEWDvRBWnYekp/kyL1m9PrfZH++mpyO3y7fgZOFKfZN8wcADPVsCGMDPXx3/CoiDpyFsYE+GtpZYlx7d5X6WNvSDCtHdseS/QmIPnUdDrVMML+/Nzo2cJbV2Xam5ALM8+cCAAsGdMCgVm4qHZe0n0gQlLt2KRaLy5U9v15ZZdYQVyTyt5fXId3z4+rD1d0F0oAxU1/9ThHSPtM0+Dnuxq27am+zkVt9tbdZk2giz+/fuPJKfSLtNCbkUXV3gTTkx2Wc/fw6qtuo2csrqYBZrn00keXhP2nnDHF6dYPapFZ3F0gDXP/6trq7QBpgMnG+Rtpllpcpn6AvkZGRIbelpqYiJiYG7dq1wx9//KGJPhIRkY4TIFL7Rq+GeU5ERMpglmsfZjkRESmDWV5G6QFxCwsLuc3W1ha9evXCl19+iQ8++EATfSQiIiI1Y54TEZEuioyMhIuLC4yMjODt7Y2TJ09WWPfy5csYNmwYXFxcIBKJEBERoVKbeXl5mDZtGmxsbGBmZoZhw4YhJSVFYVtViVlORESkGqUHxCvi4OCA69evq6s5IiJ6jfBKtO5gnhMRkSLakOVbt25FSEgIQkNDcebMGXh4eMDPzw+pqYqXgsjNzUWDBg2waNEiODo6qtzmrFmz8Ouvv2Lbtm04fPgwHj58iKFDhyrd/6rCLCciIkW0Icu1hdIP1bxw4YLcz4IgICkpCYsWLYKnp6e6+kVEREQaxDwnIiJds2zZMgQFBSEgIAAAEBUVhb1792LDhg346KOPytVv164d2rVrBwAK91emzaysLKxfvx7R0dHo0aMHAGDjxo1o2rQpjh8/jg4dOmjiVCuFWU5ERKQapQfEPT09IRKJ8N9ncXbo0AEbNmxQW8eIiOj1octXjl9XzHMiIlKGJrI8Pz8f+fn5cmUSiQQSiaRc3YKCAiQkJGDu3LmyMrFYDF9fX8THx6t0/Mq0mZCQgMLCQvj6+srquLu7o169eoiPj6/WAXFmORERKYPfy8soPSCemJgo97NYLIadnR2MjIzU1ikiInq9MHi1D/OciIiUoYksDw8Px4IFC+TKQkNDERYWVq5uWloaiouL4eDgIFfu4OCAa9euqXT8yrSZnJwMQ0NDWFpalquTnJys0nHVhVlORETK4PfyMkoPiNevX18T/SAiIqIqxDwnIqLqNnfuXISEhMiVKZodTooxy4mIiFRTqQHxFStWVLrB9957T+XOEBHR60kQeCVaGzDPiYhIVZrI8oqWR1HE1tYWenp6SElJkStPSUmp8IGZ6mjT0dERBQUFyMzMlJsl/irHfRXMciIiUhW/l5ep1ID4119/XanGRCIRQ5eIiEhLMc+JiEhXGRoawsvLC3FxcfD39wcASKVSxMXFITg4WGNtenl5wcDAAHFxcRg2bBgA4Pr167h37x58fHxe+byUxSwnIiJ6dZUaEP/v2mRERETK4Fpl2oF5TkREqtKGLA8JCcHEiRPRtm1btG/fHhEREcjJyUFAQAAAYMKECahduzbCw8MBlDw088qVK7I/P3jwAOfOnYOZmRkaNmxYqTYtLCwQGBiIkJAQWFtbw9zcHNOnT4ePj0+1PFCTWU5ERKrShizXFuLq7gAREb3+BIjUvikrMjISLi4uMDIygre3N06ePPnC+tu2bYO7uzuMjIzQsmVL7Nu3T7avsLAQH374IVq2bAlTU1M4OztjwoQJePjwoVwb6enpGDduHMzNzWFpaYnAwEBkZ2cr3XciIqLqpg1ZPmrUKCxZsgTz58+Hp6cnzp07h5iYGNlDMe/du4ekpCRZ/YcPH6J169Zo3bo1kpKSsGTJErRu3Rpvv/12pdsESmZlDxgwAMOGDUOXLl3g6OiIHTt2vMK7SUREVPW0Icu1RaVmiP/3QScvsmzZMpU7Q0REpAlbt25FSEgIoqKi4O3tjYiICPj5+eH69euwt7cvV//YsWMYM2YMwsPDMWDAAERHR8Pf3x9nzpxBixYtkJubizNnzuDTTz+Fh4cHMjIyMGPGDAwaNAinT5+WtTNu3DgkJSUhNjYWhYWFCAgIwOTJkxEdHV2Vpy/DPCciIl0XHBxc4RIphw4dkvvZxcUFgiC8UpsAYGRkhMjISERGRirVV01glhMREb26Sg2Inz17tlKNiUS6e2WAiIg0p7qvHC9btgxBQUGy25+joqKwd+9ebNiwAR999FG5+suXL0efPn0wZ84cAMBnn32G2NhYrFq1ClFRUbCwsEBsbKzca1atWoX27dvj3r17qFevHq5evYqYmBicOnUKbdu2BQCsXLkS/fr1w5IlS+Ds7Kzhsy6PeU5ERKqq7iynEsxyIiJSFbO8TKUGxA8ePKjpfhAREWlEQUEBEhISMHfuXFmZWCyGr68v4uPjFb4mPj6+3AwsPz8/7Ny5s8LjZGVlQSQSwdLSUtaGpaWlbDAcAHx9fSEWi3HixAkMGTJE9ZNSEfOciIhItzHLiYiIXl2lBsQVuXnzJm7duoUuXbrA2NgYgiDwKjQRESkkCOrPh/z8fOTn58uVSSQSSCQSubK0tDQUFxfLrQUKAA4ODrh27ZrCtpOTkxXWT05OVlg/Ly8PH374IcaMGQNzc3NZG/9djkVfXx/W1tYVtlMdmOdERFQZmshyUg9mORERVQazvIzSD9V8/PgxevbsicaNG6Nfv36yh5YEBgbi/fffV3sHiYhI90khUvsWHh4OCwsLuS08PLzKz62wsBAjR46EIAhYs2ZNlR9fVcxzIiJShiaynF4Ns5yIiJTBLC+j9ID4rFmzYGBggHv37sHExERWPmrUKMTExKi1c0RERBWZO3cusrKy5Lbnl0UpZWtrCz09PaSkpMiVp6SkwNHRUWHbjo6OlapfOhh+9+5dxMbGymaHl7aRmpoqV7+oqAjp6ekVHrcqMc+JiIh0G7OciIhINUoPiP/xxx/48ssvUadOHbnyRo0a4e7du2rrGBERvT4EiNS+SSQSmJuby23/XS4FAAwNDeHl5YW4uDhZmVQqRVxcHHx8fBT218fHR64+AMTGxsrVLx0Mv3HjBvbv3w8bG5tybWRmZiIhIUFWduDAAUilUnh7e6v0PqoT85yIiJShiSynV8MsJyIiZTDLyyi9hnhOTo7c1edS6enpCgciiIiIqnutspCQEEycOBFt27ZF+/btERERgZycHAQEBAAAJkyYgNq1a8uWXJkxYwa6du2KpUuXon///tiyZQtOnz6NtWvXAigZDB8+fDjOnDmDPXv2oLi4WLYuuLW1NQwNDdG0aVP06dMHQUFBiIqKQmFhIYKDgzF69Gg4OztXzxvxHOY5EREpo7qznMpjlhMRkTKY5WWUniH+xhtv4Pvvv5f9LBKJIJVKsXjxYnTv3l2tnSMiIlKHUaNGYcmSJZg/fz48PT1x7tw5xMTEyB6cee/ePdm6mwDQsWNHREdHY+3atfDw8MDPP/+MnTt3okWLFgCABw8eYPfu3fjnn3/g6ekJJycn2Xbs2DFZO5s3b4a7uzt69uyJfv36oXPnzrJB9erGPCciItJtzHIiIiLVKD1DfPHixejZsydOnz6NgoICfPDBB7h8+TLS09Px119/aaKPRESk47ThVqrg4GAEBwcr3Hfo0KFyZSNGjMCIESMU1ndxcYEgCC89prW1NaKjo5XqZ1VhnhMRkTK0IctJHrOciIiUwSwvo/QMcXNzc1y9ehWdO3fG4MGDkZOTg6FDh+Ls2bMwMDDQRB+JiIhIzZjnREREuo1ZTkREpBqlZ4i7uroiKSkJn3zyiVz548ePUadOHRQXF6utc0RE9HrgWmXah3lORETKYJZrH2Y5EREpg1leRukB8YpuEc/OzoaRkdErd4iIiF4/vDVL+zDPiYhIGcxy7cMsJyIiZTDLy1R6QDwkJARAyYM65s+fL/c06+LiYpw4cQKenp5q7yARERGpD/OciIhItzHLiYhIVx05cgRfffUVEhISkJSUhF9++QX+/v6y/YIgIDQ0FN9++y0yMzPRqVMnrFmzBo0aNZJrZ+/evVi4cCEuXLgAIyMjdO3aFTt37qx0Pyo9IH727FlZxy5evAhDQ0PZPkNDQ3h4eGD27NmVPjAREdUcvDVLezDPiYhIFcxy7cEsJyIiVWhDlufk5MDDwwNvvfUWhg4dWm7/4sWLseL/27v3uCirxI/j3wFlUBEUL1xMBc285IXEIsxNUwrNSjbX1MxbpNmmqVQm/VS8tItlmpoWa2WXTdN1a61Nswy1MtG8m6amJmEKiCIaKNeZ3x+sgxODAjIyA5/36/W8gvOc53nOMxN85cw551m4UO+//74CAwM1depUhYeH66effrLMfvr44481atQo/f3vf1fPnj2Vn5+v/fv3l6kdpe4Q37hxoyRp5MiRWrBggTw9Pct0IQAAUPnIcwAAnBtZDgBwVn369FGfPn1s7jObzZo/f76mTJmifv36SZI++OAD+fj4aPXq1Ro0aJDy8/M1fvx4zZkzR5GRkZZj27VrV6Z2uJS14e+++y6BCwAoE5MdNlwf8hwAUBZkueMhywEAZeHoWX78+HGlpKQoLCzMUubl5aWQkBAlJCRIknbt2qWTJ0/KxcVFt912m/z8/NSnTx/7jRAHAKC8HGFqFgAAKD+yHAAA52aPLM/JyVFOTo5VmdFolNFoLPO5UlJSJEk+Pj5W5T4+PpZ9v/zyiyRp+vTpmjdvngICAjR37lz16NFDP//8s7y9vUt1rTKPEAcAAAAAAAAAVG+xsbHy8vKy2mJjY+12PZOpcFz6//3f/6l///4KDg7Wu+++K4PBoFWrVpX6PIwQBwDYnVmMKgMAwJmR5QAAODd7ZHl0dLSioqKsysozOlySfH19JUmpqany8/OzlKempiooKEiSLOVXrhluNBrVokULJSUllfpajBAHAAAAAAAAAJSJ0WiUp6en1VbeDvHAwED5+voqPj7eUnbhwgVt27ZNoaGhkqTg4GAZjUYdPnzYUicvL0+JiYlq3rx5qa/FCHEAgN2x7igAAM6NLAcAwLk5QpZnZmbq6NGjlu+PHz+uPXv2yNvbW82aNdOECRP00ksvqVWrVgoMDNTUqVPl7++viIgISZKnp6fGjBmjmJgYNW3aVM2bN9ecOXMkSQMGDCh1O+gQBwDYHdOsAQBwbmQ5AADOzRGyfMeOHbrnnnss319ebmX48OF67733NGnSJGVlZWn06NHKyMhQt27dtG7dOrm7u1uOmTNnjmrUqKGhQ4fq0qVLCgkJ0YYNG1S/fv1St4MOcQAAAAAAAACAXfXo0UNms7nE/QaDQTNnztTMmTNLrFOzZk29+uqrevXVV8vdDjrEAQB2Zyo57wAAgBMgywEAcG5keREeqgkAAAAAAAAAqBYYIQ4AsDtHWKsMAACUH1kOAIBzI8uL0CEOALA7R3iaNQAAKD+yHAAA50aWF2HJFAAAAAAAAABAtcAIcQCA3V3lIdIAAMAJkOUAADg3srwII8QBAAAAAAAAANUCI8QBAHZn4uEdAAA4NbIcAADnRpYXoUMcAGB3PLwDAADnRpYDAODcyPIiLJkCAAAAAAAAAKgWGCEOALA7Ht4BAIBzI8sBAHBuZHkRRogDAAAAAAAAAKoFRogDAOzOzMM7AABwamQ5AADOjSwvQoc4AMDuTEzNAgDAqZHlAAA4N7K8CEumAAAAAAAAAACqBUaIAwDszmxmahYAAM6MLAcAwLmR5UUYIQ4AAAAAcAqLFy9WQECA3N3dFRISoh9++OGq9VetWqU2bdrI3d1dHTp00Nq1a632GwwGm9ucOXMsdQICAortnz17tl3uDwAA2B8d4gAAuzObK34DAAA3jiNk+cqVKxUVFaWYmBjt2rVLnTp1Unh4uE6fPm2z/pYtWzR48GBFRkZq9+7dioiIUEREhPbv32+pk5ycbLUtXbpUBoNB/fv3tzrXzJkzreqNGzeu7DcAAEAlcoQsdxR0iAMA7M4kQ4VvAADgxnGELJ83b55GjRqlkSNHql27doqLi1Pt2rW1dOlSm/UXLFig3r176/nnn1fbtm01a9Ysde7cWYsWLbLU8fX1tdo+/fRT3XPPPWrRooXVuerWrWtVr06dOmVuPwAAlckRstxR0CEOAAAAAHBoubm52rlzp8LCwixlLi4uCgsLU0JCgs1jEhISrOpLUnh4eIn1U1NTtWbNGkVGRhbbN3v2bDVo0EC33Xab5syZo/z8/Ou4GwAAUJl4qCYAwO6ceSoVAACwT5bn5OQoJyfHqsxoNMpoNBare+bMGRUUFMjHx8eq3MfHR4cOHbJ5/pSUFJv1U1JSbNZ///33VbduXT388MNW5c8884w6d+4sb29vbdmyRdHR0UpOTta8efOueY8AADgK/i4vwghxAAAAAMANFxsbKy8vL6stNja20tqzdOlSDRkyRO7u7lblUVFR6tGjhzp27KgxY8Zo7ty5ev3114t15gMAAOfACHEAgN2Zzc67thgAALBPlkdHRysqKsqqzNbocElq2LChXF1dlZqaalWempoqX19fm8f4+vqWuv53332nw4cPa+XKlddsd0hIiPLz85WYmKjWrVtfsz4AAI6Av8uLMEIcAGB3JnPFb2W1ePFiBQQEyN3dXSEhIfrhhx+uWn/VqlVq06aN3N3d1aFDB61du9Zq/yeffKL77rtPDRo0kMFg0J49e4qdo0ePHjIYDFbbmDFjyt54AAAqmT2y3Gg0ytPT02orqUPczc1NwcHBio+PL2qTyaT4+HiFhobaPCY0NNSqviStX7/eZv133nlHwcHB6tSp0zVfiz179sjFxUWNGze+Zl0AAByFI/xd7ijoEAcAVHkrV65UVFSUYmJitGvXLnXq1Enh4eE6ffq0zfpbtmzR4MGDFRkZqd27dysiIkIRERHav3+/pU5WVpa6deuml19++arXHjVqlJKTky3bK6+8UqH3BgBAdREVFaW33npL77//vg4ePKinnnpKWVlZGjlypCRp2LBhio6OttQfP3681q1bp7lz5+rQoUOaPn26duzYobFjx1qd98KFC1q1apWeeOKJYtdMSEjQ/PnztXfvXv3yyy9atmyZJk6cqMcee0z169e37w0DAAC7YMkUAIDdVfbDO+bNm6dRo0ZZ/mCOi4vTmjVrtHTpUk2ePLlY/QULFqh37956/vnnJUmzZs3S+vXrtWjRIsXFxUmShg4dKklKTEy86rVr165d4lRuAACcRWVnuSQNHDhQaWlpmjZtmlJSUhQUFKR169ZZHpyZlJQkF5eiMV9du3bV8uXLNWXKFL344otq1aqVVq9erfbt21udd8WKFTKbzRo8eHCxaxqNRq1YsULTp09XTk6OAgMDNXHixGJLvQAA4OgcIcsdBR3iAIAqLTc3Vzt37rQaMebi4qKwsDAlJCTYPCYhIaHYH7rh4eFavXp1ma+/bNkyffjhh/L19dWDDz6oqVOnqnbt2mU+DwAAkMaOHVtshPdlmzZtKlY2YMAADRgw4KrnHD16tEaPHm1zX+fOnbV169YytxMAADguOsQBAHZnVsU/vCMnJ0c5OTlWZUajsdjao2fOnFFBQYFl9NhlPj4+OnTokM1zp6Sk2KyfkpJSpjY++uijat68ufz9/bVv3z698MILOnz4sD755JMynQcAgMpmjywHAAA3DllehA5xAIDd2eNhG7GxsZoxY4ZVWUxMjKZPn17xFyunK0ebdejQQX5+furVq5eOHTumli1bVmLLAAAoG2d+cBYAACDLr0SHOADAKUVHRxdb1uSPo8MlqWHDhnJ1dVVqaqpVeWpqaolre/v6+papfmmFhIRIko4ePUqHOAAAAAAAlcDl2lUAALg+ZnPFb0ajUZ6enlabrQ5xNzc3BQcHKz4+3lJmMpkUHx+v0NBQm+0NDQ21qi9J69evL7F+ae3Zs0eS5Ofnd13nAQDgRrNHlgMAgBuHLC/iMCPEAx5qXdlNgB0M/uxwZTcBdvDRG99UdhNgB0/36V7ZTbCbqKgoDR8+XF26dNEdd9yh+fPnKysrSyNHjpQkDRs2TE2aNFFsbKwkafz48erevbvmzp2rvn37asWKFdqxY4eWLFliOWd6erqSkpJ06tQpSdLhw4W/73x9feXr66tjx45p+fLluv/++9WgQQPt27dPEydO1N13362OHTve4FfgxtjX7s+V3QTYwUc//aeymwA7GRyVVtlNgB1s/m9ltwDOrH/wycpuAuzkps3vVXYTYAcbn1hW2U2AHfQdPq2ym1DlOUyHOACg6qrsT44HDhyotLQ0TZs2TSkpKQoKCtK6dessD85MSkqSi0vRpKmuXbtq+fLlmjJlil588UW1atVKq1evVvv27S11PvvsM0uHuiQNGjRIUtE65m5ubvr6668tne9NmzZV//79NWXKlBt01wAAVJzKznIAAHB9yPIidIgDAOzOZK78p1mPHTtWY8eOtblv06ZNxcoGDBigAQMGlHi+ESNGaMSIESXub9q0qb75htkUAICqwRGyHAAAlB9ZXoQ1xAEAAAAAAAAA1QIjxAEAdsfULAAAnBtZDgCAcyPLi9AhDgCwO4IXAADnRpYDAODcyPIiLJkCAAAAAAAAAKgWGCEOALA7E59EAwDg1MhyAACcG1lehBHiAAAAAAAAAIBqgRHiAAC7M5sNld0EAABwHchyAACcG1lehA5xAIDd8fAOAACcG1kOAIBzI8uLsGQKAAAAAAAAAKBaYIQ4AMDueHgHAADOjSwHAMC5keVFGCEOAAAAAAAAAKgWGCEOALA71ioDAMC5keUAADg3srwIHeIAALsjeAEAcG5kOQAAzo0sL8KSKQAAAAAAAACAaoER4gAAu+PhHQAAODeyHAAA50aWF2GEOAAAAAAAAACgWmCEOADA7lirDAAA50aWAwDg3MjyInSIAwDszmSq7BYAAIDrQZYDAODcyPIiLJkCAAAAAAAAAKgWGCEOALA7pmYBAODcyHIAAJwbWV6EEeIAAAAAAAAAgGqBEeIAALvjk2gAAJwbWQ4AgHMjy4vQIQ4AsDsTwQsAgFMjywEAcG5keRGWTAEAAAAAAAAAVAuMEAcA2J3ZLnOzDHY4JwAAsIUsBwDAuZHlRRghDgAAAAAAAACoFhghDgCwOx7eAQCAcyPLAQBwbmR5ETrEAQB2ZzJVdgsAAMD1IMsBAHBuZHkRlkwBAAAAAAAAAFQLjBAHANgdU7MAAHBuZDkAAM6NLC/CCHEAAAAAAAAAQLXACHEAgN2Z+CQaAACnRpYDAODcyPIidIgDAOyOqVkAADg3shwAAOdGlhdhyRQAAAAAgFNYvHixAgIC5O7urpCQEP3www9Xrb9q1Sq1adNG7u7u6tChg9auXWu1f8SIETIYDFZb7969reqkp6dryJAh8vT0VL169RQZGanMzMwKvzcAAHBj0CEOALA7s8lc4RsAALhxHCHLV65cqaioKMXExGjXrl3q1KmTwsPDdfr0aZv1t2zZosGDBysyMlK7d+9WRESEIiIitH//fqt6vXv3VnJysmX76KOPrPYPGTJEBw4c0Pr16/X555/r22+/1ejRo8vcfgAAKpMjZLmjoEMcAAAAAODw5s2bp1GjRmnkyJFq166d4uLiVLt2bS1dutRm/QULFqh37956/vnn1bZtW82aNUudO3fWokWLrOoZjUb5+vpatvr161v2HTx4UOvWrdPbb7+tkJAQdevWTa+//rpWrFihU6dO2fV+AQCAfdAhDgCwO5O54jcAAHDj2CPLc3JydOHCBastJyfH5vVzc3O1c+dOhYWFWcpcXFwUFhamhIQEm8ckJCRY1Zek8PDwYvU3bdqkxo0bq3Xr1nrqqad09uxZq3PUq1dPXbp0sZSFhYXJxcVF27ZtK/PrCABAZeHv8iJ0iAMA7M5srvitrCp6zdFPPvlE9913nxo0aCCDwaA9e/YUO0d2draefvppNWjQQB4eHurfv79SU1PL3ngAACqZPbI8NjZWXl5eVltsbKzN6585c0YFBQXy8fGxKvfx8VFKSorNY1JSUq5Zv3fv3vrggw8UHx+vl19+Wd9884369OmjgoICyzkaN25sdY4aNWrI29u7xOsCAOCIHOHvckdBhzgAoMqzx5qjWVlZ6tatm15++eUSrztx4kT997//1apVq/TNN9/o1KlTevjhhyv8/gAAcEbR0dE6f/681RYdHX1D2zBo0CA99NBD6tChgyIiIvT5559r+/bt2rRp0w1tBwAAuHFqVHYDAABVn6mS51JdueaoJMXFxWnNmjVaunSpJk+eXKz+lWuOStKsWbO0fv16LVq0SHFxcZKkoUOHSpISExNtXvP8+fN65513tHz5cvXs2VOS9O6776pt27baunWr7rzzzoq+TQAA7MYeWW40GmU0GktVt2HDhnJ1dS020yo1NVW+vr42j/H19S1TfUlq0aKFGjZsqKNHj6pXr17y9fUt9gF6fn6+0tPTr3oeAAAcTWX/Xe5IGCEOAKjS7Lnm6NXs3LlTeXl5Vudp06aNmjVrVqbzAAAAyc3NTcHBwYqPj7eUmUwmxcfHKzQ01OYxoaGhVvUlaf369SXWl6TffvtNZ8+elZ+fn+UcGRkZ2rlzp6XOhg0bZDKZFBIScj23BAAAKgkjxAEAdmePtcVycnKKPXjL1kizq605eujQIZvnLs2ao9eSkpIiNzc31atX77rOAwCAI3CEdUKjoqI0fPhwdenSRXfccYfmz5+vrKwsywywYcOGqUmTJpZ1yMePH6/u3btr7ty56tu3r1asWKEdO3ZoyZIlkqTMzEzNmDFD/fv3l6+vr44dO6ZJkybp5ptvVnh4uCSpbdu26t27t0aNGqW4uDjl5eVp7NixGjRokPz9/SvnhQAAoBwcIcsdBSPEAQB2V9kP4gIAANfHER7ENXDgQL366quaNm2agoKCtGfPHq1bt87yIXZSUpKSk5Mt9bt27arly5dryZIl6tSpk/79739r9erVat++vSTJ1dVV+/bt00MPPaRbbrlFkZGRCg4O1nfffWf1AfuyZcvUpk0b9erVS/fff7+6detm6VQHAMBZOEKWOwpGiAMAnFJ0dLSioqKsymytQ3qj1hy1dY7c3FxlZGRYjRIv63kAAECRsWPHauzYsTb32XoQ5oABAzRgwACb9WvVqqUvv/zymtf09vbW8uXLy9ROAADguBghDgCwO5PZXOGb0WiUp6en1WarQ/xGrTn6R8HBwapZs6bVeQ4fPqykpKQynQcAAEdgjywHAAA3DllehBHiAIAqr6LXHJWk9PR0JSUl6dSpU5IKO7ulwpHhvr6+8vLyUmRkpKKiouTt7S1PT0+NGzdOoaGhuvPOO2/wKwAAAAAAACQ6xAEAN4DZVLnXHzhwoNLS0jRt2jSlpKQoKCio2JqjLi5Fk6Yurzk6ZcoUvfjii2rVqpXVmqOS9Nlnn1k61CVp0KBBkqSYmBhNnz5dkvTaa6/JxcVF/fv3V05OjsLDw/XGG2/cgDsGAKBiVXaWAwCA60OWF6FDHABgd2YHmEpVkWuOStKIESM0YsSIq17T3d1dixcv1uLFi8vSVAAAHI4jZDkAACg/srwIa4gDAAAAAAAAAKoFOsQBAHZnMlX8BgAAbhyyHAAA5+YIWf7tt9/qwQcflL+/vwwGg1avXm2132w2a9q0afLz81OtWrUUFhamI0eO2DxXTk6OgoKCZDAYtGfPnjK1gw5xAAAAAAAAAIBdZWVlqVOnTiUuK/rKK69o4cKFiouL07Zt21SnTh2Fh4crOzu7WN1JkybJ39+/XO0o9Rri+/btU/v27eXi4qJ9+/ZdtW7Hjh3L1RgAQNXEWmWOgSwHAJQXWe44yHMAQHk4Qpb36dNHffr0sbnPbDZr/vz5mjJlivr16ydJ+uCDD+Tj46PVq1dr0KBBlrpffPGFvvrqK3388cf64osvytyOUneIBwUFKSUlRY0bN7YMR7/yhbz8vcFgUEFBQZkbAgCoukyVn7sQWQ4AKD+y3HGQ5wCA8nD0LD9+/LhSUlIUFhZmKfPy8lJISIgSEhIsHeKpqakaNWqUVq9erdq1a5frWqXuED9+/LgaNWpk+RoAADgXshwAAOdHngMAHEVOTo5ycnKsyoxGo4xGY5nPlZKSIkny8fGxKvfx8bHsM5vNGjFihMaMGaMuXbooMTGxXO0udYd48+bNbX4NAMC1mB39o+hqgiwHAJQXWe44yHMAQHnYI8tjY2M1Y8YMq7KYmBhNnz69wq8lSa+//rp+//13RUdHX9d5yvVQzdjYWC1durRY+dKlS/Xyyy9fV4MAAFWP2VzxG64PWQ4AKAuy3DGR5wCA0rJHlkdHR+v8+fNWW3k7q319fSUVLolypdTUVMu+DRs2KCEhQUajUTVq1NDNN98sSerSpYuGDx9e6muVq0P8H//4h9q0aVOs/NZbb1VcXFx5TgkAAG4gshwAAOdHngMAKpPRaJSnp6fVVp7lUiQpMDBQvr6+io+Pt5RduHBB27ZtU2hoqCRp4cKF2rt3r/bs2aM9e/Zo7dq1kqSVK1fqb3/7W6mvVeolU66UkpIiPz+/YuWNGjVScnJyeU4JAKjCTEyzdjhkOQCgLMhyx0SeAwBKyxGyPDMzU0ePHrV8f/z4ce3Zs0fe3t5q1qyZJkyYoJdeekmtWrVSYGCgpk6dKn9/f0VEREiSmjVrZnU+Dw8PSVLLli110003lbod5eoQb9q0qb7//nsFBgZalX///ffy9/cvzykBAMANRJYDAOD8yHMAgDPZsWOH7rnnHsv3UVFRkqThw4frvffe06RJk5SVlaXRo0crIyND3bp107p16+Tu7l6h7ShXh/ioUaM0YcIE5eXlqWfPnpKk+Ph4TZo0Sc8++2yFNhAA4PzMLBTqcMhyAEBZkOWOiTwHAJSWI2R5jx49rtoOg8GgmTNnaubMmaU6X0BAQLnuq1wd4s8//7zOnj2rv/71r8rNzZUkubu764UXXrjup3wCAKoes6myW4A/IssBAGVBljsm8hwAUFpkeZFydYgbDAa9/PLLmjp1qg4ePKhatWqpVatW5V40HQAA3FhkOQAAzo88BwCg7MrVIX6Zh4eHbr/99opqi1No/tSjahEVKaNvI13Yd0gHJszS+e0/lljft39vtZ4+XrUCmijraKIORb+qtHXf2qzbfvEMNR89SAee/bsSF75fbL+LW0113bJKXp3a6rsu/XRh76EKu6/qbu93y7Rrwzu6+HuaGvq3Uff+U+XbvGOJ9Y/s+UJb1y7QhfSTqtcoQHc9+JwC2nW37D+69yv9uGWF0k4cUPbFDA1+brUa3dTWsj87K0Nb172upEOb9XtGsmrV8VbLDmG68/7xMtaqa9d7Rek9fL+/Bj/cVN713XTseKZe+8dRHTzye2U3yymZHGBqFmyrjlluS1nyvWnkAN30WITq3tpKknR+1wEdmjrPqr5vxL1qNnqQvDrfKrcG9cntSvLp52v1r09WK/1chloGBmjsk0+oTetbbNZN/DVJ7y37SEeOHlPq6TQ9Nepx9e/3oFWdffsP6F8fr9aRY8d0Nv2cZvzfZN0VGnIjbgXlRJZXHLLcsVWFPN//4z598vEqHTv6s9LT0/XilOkK7XpXifXT08/qnbf+oaNHflZy8ik9+FCERj35V7u388d9e/X2W3FK+vVXNWrUSI8MelRh94Zb9q9a+ZG2bNmsk7+dkJubUW3attOIx5/QTTc1tXvbHNHOpFR9sPWgfkpJ15nMS5rX/27d07rk1yIt85Lmfb1TP6Wk60T67xp8e2s9f28Xu7dzx6+pmvv1Th07c16+nrX1xF3t9VDHlpb972zZrw2HTyjx7AUZa7iq002NNP6e2xTQwNPubXNU3t26qMWzkfLq3F7u/o21o/9flfpZfIn1jb6N1PaVF+QV3F51bm6uxEX/1E/P/t3+7bz7DrV7dbI82rVS9olkHY19U7998B/L/paTRsv3z/fJo3ULFVzK1rmE3Tr04qvK+vm43dt2o5HlRVxKW/Hhhx/WhQsXLF9fbauq/Ab0Uds50Try0mJtvuPP+n3fIYWseUdujbxt1q8feptu+3CuTrz7b22+PUKpn8ary8eL5fG/P6Cv5NMvTPVCOin7ZGqJ128ze5JyTp2usPtBoZ93rdV3q2MV0vtpDXruP2rYpI0+jYvUxd/P2qyffHyX1n3wrNrd+RcNfm61WnTopc/feVpnk3+21MnLvSj/wM7q+uBzNs+RdeG0ss6fVrd+L2jIC5/r3kdj9euh7/T1iv+zyz2i7Hp2a6SxT7TUux8lKnLCTh09nql5MzuonlfNym4aUG5kuW1lzfcG3UN0auUabb13mL7/0yBd+i1ZIWuXyujf2FLHtU5tpX+/S4defPVG3Qb+YOO3mxX39rsaOnig4hbMVYvAAE2eNlPnMjJs1s/OyZGfr4+eGD5U3vXr266Tna0WLQI0bsxoO7YcFYUsR1VVVfM8OztbgYEtNOav40pVPy8vT15eXho4eIgCA1tUSBtSU1P04P33lrg/JSVZM2KmqGPHTlq46E09FPFnvb5gnnbt3G6ps3//PvV94CHNmbdQs/42WwUF+Zr2f5OVnX2pQtrobC7l5euWxvUUHV66D2zy8gtUv7a7nrirvW7xsZ3HZXUqI1O3/X1ZiftPZmRq3L82qktzH62IvF+P3t5GM9ds05ZfTlnq7Eo6rYHBt+iD4eF6c3Av5ReY9NRH8bqUm18hbXRGrnVq68K+w9r/zIxS1Xcxuin3zDkdjX1TF/ZVzECRWs2bqG/e4ZL3B9yk2z/7h85u2qbNXfrp+Ovvq8M/XlLDe7tZ6njffYd+fXOZvu/2iLb1GSmXmjV0x9p35Fq7VoW0EY6p1CPEvby8ZDAYLF9XR4ETRurEO//Sb+9/Ikn68a8xatynh5qO6K9jc94qVj9g7DClffmdfpn3jiTp5+kL1DCsqwL++pj2Px1jqWf0b6xb50/VD30jdfun/7B57Ubhd6tR2F3aOXCcGvfpbrMOymf3pnfVPvQRtQvpL0nqOWCGEn/apJ+2fawuYcX/4N3zzQdq3uZPCu75hCQp9P4JSjq8RXu/+1A9Hylc9L/t7RGSpAtnf7N5zQZ+t6jv469bvq/XsJlC+07Ql/98XqaCfLm4XtfkDVSAQRE36b9fJmttfOGHVHPeOKLQ2xvogXt99eG/T1Ry65yPIzy8A2R5Scqa73uGWX/YuW/0FPn+OVwNe4bq5IefSpJOLiv8b63mTezcepTk49Wf6f7we9X73l6SpAlPj9G27Tu1bn28Bg/oX6x+m1taqc0thYMW3n7/nzbPeUeXYN3RJdh+jUaFIssrFlnuOKpqnne5/Q51uf2OUtf38fHV6DFPS5LWf7WuxHpfrlur1f/5t1JTUtTYx1cPPhShvg88VK42rlv7uXx8fRU5aowkqWmz5vrpwAF9uvoTdQ4u7PCdMSvW6pgJUc/rscEDdPTIEbXvUPIs5KqqW8sm6tay9P8e8q/noUn3FY4I/3TvsRLrfbLnqD7cdlAnMzLl7+Whwbe31iPBtmeBXcu/dx1REy8PPRtWmPEtGnpp94k0LfvhkLq28JckLR7U0+qYGQ+EqteCj/VTylkFN/Mp13WdXdqX3yrtS9srINhy6deT+inqb5KkpiOK/1vssqaP/0UtJjyuWoE36VLiSSUu/qd+jVterjY2Hz1Il47/poOTXpYkZR76Rd5dgxU4foTOrN8sSdr+wBNWx+yNnKx7k7fKq/OtSt+8o1zXdVRkeZFS97q9++67Nr+uLgw1a8qr86069vIVHdZms85s2KJ6d95m85j6dwbplwXvWZWlfbVZvv3CrjixQUHvzdEv895R5k9HbZ7HrXEDdYibpZ1/eVoFF7Ov91ZwhYL8XJ3+7YC6hD1pKTO4uKjpLV2VnLjb5jHJiXt0W48RVmXN23TTLz9+fV1tybmUKTd3DzrDHUCNGgbdcnNd/fPfSZYys1naseecbm1dfafEXQ+TieB1BNU9y20pT77/kWvtWnKpWUN56eft1EqUVV5enn4+esyq49vFxUWdgzrqp0MljyJC1UGWVzyy3HGQ56W3aWO8ln/4vp58aqxatLxZvxw7qkULX5O7u7t6hd1X5vMdOnhQQUHW/z7o3DlYby15s8RjsrKyJEl167I0ZkVZu/+43vx2nybf10VtfL11KCVds77YJveaNfRQx7LPFth7Mk0hgb5WZV1b+OnVr3eWeExmTp4kycud9forkv/gB3VLzHgdGD9T5/cclFdQW3WIm6X8rIs6+c/VZT5fvTuDdGZDglVZ2vrNajf3xRKPqeFV+LOae67q/dueLC9Cz1spuTWsL5caNZRz2noZjZzUs6rT2vYvXKNvQ+WmnrEqyz19VkafhpbvWz4/Sub8fCW+/kGJ1+70zmwlLVmh8zv3M9Ksgl3KOiezqUC16zawKq9dt4HOpf5i85iLv59R7boNi9XPunDGZv1StSMzXdu/ekPtuw4s9zlQcbw8a6qGq0Hp5/KsytMz8tT8ptqV1CoA9lCefP+jtrHPKfvUaZ2J32KPJqIczl/4XSaTSfXrWY+crF+vnk78drKSWoUbiSwHIEnLP/xAjz/xpLre9SdJkq+vn04kJWndF2vK1SF+7ly66tWzXsajXv36unjxonJycoo9zNRkMumtf7yptu1uVfOAwPLfCKzEfbdPUb06q1ebZpKkJvU89MuZ8/p495FydYifzcqWdx13qzLvOu7KzMlTdl6+3Gtad52ZzGa9+vUOBd3USDc3rlfu+0Bxt0wbp4OTZitl9XpJ0qXE3+TR9mY1HzWwXB3iRp+GyvlDv1xO6hnV9KorF3ejTNk51gcYDGo390Wlf79TmQeOlPc24ATK1SF+9uxZTZs2TRs3btTp06dlMpms9qenp1/1+JycHOXkWP9Pl2c2qaah1EuaVwmenW9VwLhh2nxHyWu7BYwdqhp16+joy7aXUoHzy8nO1GdLnpS3T0uF9B5b2c0B7IKZWY6HLK8YLZ8fJb9H7tfWsGEy5eRWdnMAwG7Icsd0PXluK8tzc3LkZqwaI16zsy8pOfmUFi6Yp0ULX7OUFxQUqE6dOpbv/zrmCaWdLlxa6fL/5wMeLnqocrtbO2jGrPI9+C/ujdeV9GuiXn71tWtXRqlcys3XiXOZmrlmq2at3WYpLzCZ5GF0s3zff8nnSj5fODrfrMI3tuuclZb9tzVtVGwZlNKKXbddR9PO692hZf9QBSVzrV1LdW5uro5L/qYOcbMs5YYaNZR/vuiB2Hfv+Vy1mvv/b2fh8lHh53ZZ9qdv3qntD44qVxvavx6jure2UkKPR8t1vKMjy4uUq0N86NChOnr0qCIjI+Xj42NZv6y0YmNjNWOG9aL7gw3eGuLasIQjKl/umXMy5efL2Nh6JLHRp4FyUmyPDM5JOSM3H+t7cmvcwPLplHe3LjI2bqCev2y07HepUUPtXnlBgeOGaWOrXmrQ407VvzNIfbJ+tDrPXVs/1qmP/qu9j0+uiNurtmrVqS+Di2uxB2he/P2sanva/v+xdt2Guvj7mWL165RQ/2pyszP1adwTcnOvo76Ri+XqykOeHMH5C3nKLzDLu771++Fdr6bOnqPDC1VDdcxyW8qT75e1mPi4Wk4arW29R+r3H1mGw5F4edaVi4uLzmVYT3U9l5Gh+vXrVU6jcEOR5agurifPbWX52HETNG78xIpuZqW4dKlwudFxz0zULa3bWO1zcSn6AH/6jL8pv6DwwYhnz57Riy88pwWL4iz7jW5FHxDUr++tjIxzVufKOHdOtWvXLjY6PO6N17X9h22KfWWuGjZsVDE3BV3MLZz5M/X+ELX3t/53p6tL0f//rw/sofyCwt6/079f1KhlX2tF5P2W/e41XS1fN6jjrvQs6+Vp07Oy5WGsWWx0+Owvt+u7oyf1ztB75ePJjKOK5OpR+HruGzNVGT/stdpnLij6sG/7Q6Nl+N/74u7vo9ANH+q7LhGW/QWXit7LnNQzVqs0SIWjxvPO/15sdPitC6aq8f09lNDzMWWfTK2Qe4LjKleH+HfffafNmzerU6dO5bpodHS0oqKirMo2eDv2A4rMeXk6v+uAGvYMVepn8YWFBoMa3BOqX9/40OYx57buUcN77lTiwvctZY3Cuurc1j2SpJMfflpsenXImnf027JPLQ/2OjDxJR2OmW/Z7+7XWCFfLNXuRycW+wWBsnOt4abGN92qE0cS1LJj4druZpNJJ35OUKc/PWbzGL+AIJ04stVqHfGkw1vkGxBUpmvnZGfq0zcj5VrDTQ888aZq1KwaIzGqgvx8s34++ruCO9bXd1sLPywxGKTgTvX1yRqm2peHmbXKHE51zHJbypPvktTi2Sd0c/QY/dA3Uud37r9BrUVp1axZU7fc3FK79u7TXaEhkgqnre/e+6P6PdCnkluHG4Esr3hkuWO6njy3leVJv1WdTqD69evLu0EDpSQnq8c9vUqs19in6IGIrq6FnaT+/raXKm3Ttq12bP/Bqmz37l1q07ad5Xuz2ax/vLlICQnfK3b2q/L19bue28AfNPCopUYetfRbRqbub1/yMjT+Xh6Wr2v8r6O8mbftddw7NWmkzcess2Hr8WR1bFLUkWo2m/XyVzu04fAJvfVYmJrU8/jjaXCdck+fVfbJVNUObKpTH/23xHqXkk5ZvjbnF0iSLh5Lslk3Y+seNepzt1VZw15F/XKX3bpgqnz73auEsKG6lPhbOe/A8ZHlRcrVId6mTRtdunSp3Bc1Go3FPj11hinWx+e/q05LX1bGzv06v32fAp4Zrhp1aunE/zqvO737srJPpurwlHmSpMRFH+jO+H8qcMJInf7iG/k/cr+8gttr31PTJEl56RnKS8+wuoYpL085qWeU9fNxSVL2iWSr/QWZFyVJF39J4hOrCnJbj5Fav/wF+TRtL59mHbXnm/eVn3tJ7UIKl7L56sNJquPlo7sefFaSFNR9mD5+fah2bVyqgHbd9fOutTp9Yr96DZxpOWd2VoZ+P5esrAunJUnnThe+n7U9G6qOZyPlZGdq9ZuPKz/3ku4bOke52ZnKzc6UJNXy8JaLi6tQuVas/k3/N7GNDh39XQd//l2P9GuiWu4uWvN1SmU3zSmZmJvlcKprlttS1nxv8dwo3TL9Ge0Z+qwuJZ60jDrJz7yogqzCnK5Z30u1mvnJ6NdYklTnlsI/2HJSzhRbxxD20T/iIb3y2kK1btVSrW9ppU8+/VzZ2dnqHVbYKTJ77gI1bOCtJ0YMlVT4IM5fTxT+AZSfn68zZ8/q6C/HVcvdXU38CzszLl26pJPJRTmQnJqqo78cV10PD/k0ZvSfoyHLKxZZ7piuJ89tZbmbMaMCWlU+ly5dUvKpok7J1NQU/XLsqDzqeqpx48Z6/913dPbsGUU994Klzi/HjkqSsi9d0vnz5/XLsaOqUbOmmjVrLkl6dMgwLfnHG6pdp46Cg29XXl6ejh45rMzMTEU8/Jcyt7H3/Q/o8/9+pnffeUth94Vr39492vzdN4qZ8ZKlzptvvK5vN23Q/02boVq1auvc/5atqV2nTrHXuzq4mJunE+eKlrs4eT5Th1PT5elulJ9XHS3cuFunf7+klx7qaqlzODX9f8fm69zFHB1OTVcNF1e1bFT4bJAxd3fUnK92yMNYU3e18FduQYF+Sk7XhexcDQ1pW+Y2/qVzK63YeVjzN+xSv44ttf3XVK0/mKSFA3tY6sR+uV1fHEjUa3/prjpuNXUms/DnztYo8urCtU5t1bm5meX72oE3ybNTG+Wmn1f2iWS1filK7k18tHdk0c+sZ6fC2RquHnXk1shbnp3ayJSbp8yDxyRJP89cqFtfm6L8C78r7cvv5GJ0k1dwe9Ws76nj898rcxt/XbJCzf86RG1in9eJ9z5Ww3vulN+APtr+0JOWOu1fj5H/oAe04+G/quD3LMu/7W2NInd2ZHmRcv3UvvHGG5o8ebKmTZum9u3bq2ZN66mInp5V88ntyau+kFsjb90S84yMvo10Ye9B/fDAE8r934O4ajX1k/mKNdvOJezW7qHPqfWMCWr9UpQuHknUjv5PszC/g7ml8/26lJWurV8sVNaFNDVq0lb9nnzb8uDM388ly3BFJ49fYGeFD3tVCWvma8vn81SvUYAeiFysBn63WOr8sn+Dvv4o2vL9ug8Kpx3eET5Wd/YZp7QTB5T6a+EI/w9euteqPSOmxsuzwU12u1+UzobNaarnVVNPDAmQd303Hf0lU8/G/KhzGXnXPhhwAtU1y20pa743f3KQXI1uCv7X61bn+Xnm6zoya5EkyefBnur0zmzLvs7L5xerA/u65+5uOn/+gt77cIXOnTunli0CFTtzmmXJlNNpaXK5Ymr12fRzGvNM0UjJVZ98qlWffKqO7W/VvNmFHR2HjxzTcy9OtdSJe/tdSdJ9ve7RpInP3IC7QlmQ5agOqlKeHz3ys16c/Jzl+3feKly2pGfYvZoYNUnp584qLe201THjxz1VdPzRI/pm0wY1buyjd94rnOUV3vt+GY3u+s/H/9K777wld3d3NQ8IUL+Ikp/jdTW+vn6KmfGS3l7ypj779D9q2LChxo2PUufg2y11vlhTOLL1xReeszp2/MTnFHZveLmu68x+Sk7XqGVfW76f+3XhWs8PdmihmQ+G6kxmtlIuZFkdM+idLyxfH0xJ1xcHEuXnVUdrn46QJD0cdLNq1XTV+1sPav6G3apVs4ZublRPQ+6wXhqntJrU89Drj9yjV7/eqeXbD8unbm1N6xuiri38LXVW7Srsx7nyXiRpxgN36qGOLct1XWfnFdxeofH/tHzf7tUXJUknPvhE+yKjZfRrpFpNrWdI/GnHp5av6wW3V5PBD+pi4m/a2KpwwMKJpf9WwcVstXg2Um1mT1JB1kX9vv9nHb9i5YWyuJT4m7Y/9KTazY1WwLhhyv4tRT8+OUVn1m+21Gk+pnC98NAN1rND90ZO1m8f/Kdc14XjM5jNZf944MiRI3r00Ue1a9cuq3Kz2SyDwaCCgoIyN2RNzdZlPgaOL/Ez1lStij5645vKbgLsYPN/u9vt3GPnnb92pTJaFOVV4eesTshylFbHn/hDoKoaHJVW2U2AHdgrz8lyx1TRef5zCcsOwPndtPm9ym4C7GDjE8squwmwg7559ulLI8uLlGuE+JAhQ1SzZk0tX768XA/iAgAAlYssBwDA+ZHnAACUXbk6xPfv36/du3erdWtGggEAro2HdzgeshwAUBZkuWMizwEApUWWFynX06+6dOmiEydOVHRbAABVlMlc8RuuD1kOACgLstwxkecAgNIiy4uUa4T4uHHjNH78eD3//PPq0KFDsQd3dOzYsUIaBwAA7IMsBwDA+ZHnAACUXbk6xAcOHChJevzxx4vtK++DuAAAVRdTsxwPWQ4AKAuy3DGR5wCA0iLLi5SrQ/z48eMV3Q4AAHADkeUAADg/8hwAgLIrV4d48+bNJUk//fSTkpKSlJuba9lnMBgs+wEAkCSzmU+iHQ1ZDgAoC7LcMZHnAIDSIsuLlKtD/JdfftGf//xn/fjjjzIYDJYX1GAwSBLTsgAAVkxMzXI4ZDkAoCzIcsdEngMASossL+JSnoPGjx+vwMBAnT59WrVr19b+/fv17bffqkuXLtq0aVMFNxEAAFQ0shwAAOdHngMAUHblGiGekJCgDRs2qGHDhnJxcZGrq6u6deum2NhYPfPMM9q9e3dFtxMA4MSYmuV4yHIAQFmQ5Y6JPAcAlBZZXqRcI8QLCgpUt25dSVLDhg116tQpSYXrlx0+fLjiWgcAAOyCLAcAOKPFixcrICBA7u7uCgkJ0Q8//HDV+qtWrVKbNm3k7u6uDh06aO3atZZ9eXl5euGFF9ShQwfVqVNH/v7+GjZsmCUTLwsICJDBYLDaZs+ebZf7KyvyHACAsivXCPH27dtr7969CgwMVEhIiF555RW5ublpyZIlatGiRUW3EQDg5MysVeZwyHIAQFk4QpavXLlSUVFRiouLU0hIiObPn6/w8HAdPnxYjRs3LlZ/y5YtGjx4sGJjY/XAAw9o+fLlioiI0K5du9S+fXtdvHhRu3bt0tSpU9WpUyedO3dO48eP10MPPaQdO3ZYnWvmzJkaNWqU5fvLndCVjTwHAJSWI2S5oyhXh/iUKVOUlZUlqfAfBg888ID+9Kc/qUGDBlq5cmWFNhAA4PwIXsdDlgMAysIRsnzevHkaNWqURo4cKUmKi4vTmjVrtHTpUk2ePLlY/QULFqh37956/vnnJUmzZs3S+vXrtWjRIsXFxcnLy0vr16+3OmbRokW64447lJSUpGbNmlnK69atK19fXzveXfmQ5wCA0nKELHcU5VoyJTw8XA8//LAk6eabb9ahQ4d05swZnT59Wj179qzQBgIAUBEqcoq1VLj+2rRp0+Tn56datWopLCxMR44csarjyFOsyXIAgDPJzc3Vzp07FRYWZilzcXFRWFiYEhISbB6TkJBgVV8qzL+S6kvS+fPnZTAYVK9ePavy2bNnq0GDBrrttts0Z84c5efnl/9mKhB5DgBA2ZWrQ9wWb29vGQyGijodAKAKMZnNFb6VxeUp1jExMdq1a5c6deqk8PBwnT592mb9y1OsIyMjtXv3bkVERCgiIkL79++31HnllVe0cOFCxcXFadu2bapTp47Cw8OVnZ1tda6ZM2cqOTnZso0bN67sL+ANQpYDAEpijyzPycnRhQsXrLacnByb1z9z5owKCgrk4+NjVe7j46OUlBSbx6SkpJSpfnZ2tl544QUNHjxYnp6elvJnnnlGK1as0MaNG/Xkk0/q73//uyZNmlSWl++GIs8BALZU9t/ljqTCOsQBAHBUV06xbteuneLi4lS7dm0tXbrUZv0rp1i3bdtWs2bNUufOnbVo0SJJhaPD58+frylTpqhfv37q2LGjPvjgA506dUqrV6+2OtflKdaXtzp16tj7dgEAcAqxsbHy8vKy2mJjYyulLXl5eXrkkUdkNpv15ptvWu2LiopSjx491LFjR40ZM0Zz587V66+/XmLnPQAAcGx0iAMA7M5sMlf4VtpRZfaYYn38+HGlpKRY1fHy8lJISEixczrqFGsAAMrCHlkeHR2t8+fPW23R0dE2r9+wYUO5uroqNTXVqjw1NbXEtb19fX1LVf9yZ/ivv/6q9evXW40OtyUkJET5+flKTEy8xqsGAIDjsEeWOys6xAEAdmc2myt8K+2oMntMsb7832ud09mmWAMAUBJ7ZLnRaJSnp6fVZjQabV7fzc1NwcHBio+Pt5SZTCbFx8crNDTU5jGhoaFW9SVp/fr1VvUvd4YfOXJEX3/9tRo0aHDN12LPnj1ycXFR48aNS/PSAQDgEOyR5c6qRmU3AACA8oiOjlZUVJRVWUl/RFeWK9vXsWNHubm56cknn1RsbKzDtRUAAEcXFRWl4cOHq0uXLrrjjjs0f/58ZWVlaeTIkZKkYcOGqUmTJpYPyMePH6/u3btr7ty56tu3r1asWKEdO3ZoyZIlkgo7w//yl79o165d+vzzz1VQUGD5YNvb21tubm5KSEjQtm3bdM8996hu3bpKSEjQxIkT9dhjj6l+/fqV80IAAIDrQoc4AMDuTHaYSmU0GkvVqWyPKdaX/5uamio/Pz+rOkFBQSW25cop1q1bt75m2wEAcBT2yPKyGjhwoNLS0jRt2jSlpKQoKChI69ats8zYSkpKkotL0STorl27avny5ZoyZYpefPFFtWrVSqtXr1b79u0lSSdPntRnn30mScXye+PGjerRo4eMRqNWrFih6dOnKycnR4GBgZo4cWKxD+UBAHB0jpDljoIOcQBAlXblFOuIiAhJRVOsx44da/OYy1OsJ0yYYCm7cop1YGCgfH19FR8fb/kD+sKFC9q2bZueeuqpEtvCFGsAAK7P2LFjS8zvTZs2FSsbMGCABgwYYLN+QEDANad7d+7cWVu3bi1zOwEAgOOiQxwAYHeV/bCNip5ibTAYNGHCBL300ktq1aqVAgMDNXXqVPn7+1s63ZliDQCoSio7ywEAwPUhy4vQIQ4AsLvKfthGRU+xlqRJkyYpKytLo0ePVkZGhrp166Z169bJ3d1dkphiDQCoUio7ywEAwPUhy4vQIQ4AqBYqcoq1VDhKfObMmZo5c6bN/UyxBgAAAADA8dAhDgCwO7PJVNlNAAAA14EsBwDAuZHlRVyuXQUAAAAAAAAAAOfHCHEAgN2ZeHgHAABOjSwHAMC5keVF6BAHANgdD+8AAMC5keUAADg3srwIS6YAAAAAAAAAAKoFRogDAOzOzNQsAACcGlkOAIBzI8uLMEIcAAAAAAAAAFAtMEIcAGB3fBINAIBzI8sBAHBuZHkROsQBAHZnMpsquwkAAOA6kOUAADg3srwIS6YAAAAAAAAAAKoFRogDAOyOqVkAADg3shwAAOdGlhehQxwAYHcELwAAzo0sBwDAuZHlRVgyBQAAAAAAAABQLTBCHABgd2Yzn0QDAODMyHIAAJwbWV6EEeIAAAAAAAAAgGqBEeIAALszmUyV3QQAAHAdyHIAAJwbWV6EDnEAgN3x8A4AAJwbWQ4AgHMjy4uwZAoAAAAAAAAAoFpghDgAwO7MZqZmAQDgzMhyAACcG1lehBHiAAAAAAAAAIBqgRHiAAC7Y60yAACcG1kOAIBzI8uL0CEOALA7ghcAAOdGlgMA4NzI8iIsmQIAAAAAAAAAqBYYIQ4AsDsTD+8AAMCpkeUAADg3srwII8QBAAAAAAAAANUCI8QBAHbHWmUAADg3shwAAOdGlhehQxwAYHdmE1OzAABwZmQ5AADOjSwvwpIpAAAAAAAAAIBqgRHiAAC7Y2oWAADOjSwHAMC5keVFGCEOAAAAAAAAAKgWGCEOALA7s5m1ygAAcGZkOQAAzo0sL0KHOADA7kxMzQIAwKmR5QAAODeyvAhLpgAAAAAAAAAAqgVGiAMA7M5sYmoWAADOjCwHAMC5keVFGCEOAAAAAAAAAKgWGCEOALA7M2uVAQDg1MhyAACcG1lehA5xAIDd8TRrAACcG1kOAIBzI8uLsGQKAKBaWLx4sQICAuTu7q6QkBD98MMPV62/atUqtWnTRu7u7urQoYPWrl1rtd9sNmvatGny8/NTrVq1FBYWpiNHjljVSU9P15AhQ+Tp6al69eopMjJSmZmZFX5vAABUF+Q5AAC4XnSIAwDszmwyV/hWFitXrlRUVJRiYmK0a9cuderUSeHh4Tp9+rTN+lu2bNHgwYMVGRmp3bt3KyIiQhEREdq/f7+lziuvvKKFCxcqLi5O27ZtU506dRQeHq7s7GxLnSFDhujAgQNav369Pv/8c3377bcaPXp0+V5EAAAqUWVnuUSeAwBwPRwhyx2FwWw2O0Tr19RsXdlNgB0kfna4spsAO/jojW8quwmwg83/7W63c/+p33cVfs7vPv1TqeuGhITo9ttv16JFiyRJJpNJTZs21bhx4zR58uRi9QcOHKisrCx9/vnnlrI777xTQUFBiouLk9lslr+/v5599lk999xzkqTz58/Lx8dH7733ngYNGqSDBw+qXbt22r59u7p06SJJWrdune6//3799ttv8vf3v57bd0hkedXU8af/VHYTYCeDo9IquwmwA3vleWVnuUSe3wg/H0uq7CbATm7a/F5lNwF2sPGJZZXdBNhB3zz79KU5QpY7CkaIAwDszmwyVfiWk5OjCxcuWG05OTnFrp2bm6udO3cqLCzMUubi4qKwsDAlJCTYbG9CQoJVfUkKDw+31D9+/LhSUlKs6nh5eSkkJMRSJyEhQfXq1bP88SxJYWFhcnFx0bZt28r/YgIAUAkqM8sl8hwAgOtljyx3Vg7zUE17ffrhaHJychQbG6vo6GgZjcbKbg4qSHV7X5/uY7+RxI6kur2v9mSP0WrTp0/XjBkzrMpiYmI0ffp0q7IzZ86ooKBAPj4+VuU+Pj46dOiQzXOnpKTYrJ+SkmLZf7nsanUaN25stb9GjRry9va21KlqyHI4s+r4vm7+b2W34Maoju+tPVRmlkvk+Y1yS8tmld2EG6ba/W5oOa2yW3BDVLf3te9w3leUnj1nhTsbRojfYDk5OZoxY0aJIx/gnHhfqybeV8cWHR2t8+fPW23R0dGV3SxUA/xuqJp4X6su3lvHRZajMvG7oWrifa2aeF9R0RxmhDgAAGVhNBpLNTqgYcOGcnV1VWpqqlV5amqqfH19bR7j6+t71fqX/5uamio/Pz+rOkFBQZY6f3zIV35+vtLT00u8LgAA1Ulps1wizwEAQMVhhDgAoEpzc3NTcHCw4uPjLWUmk0nx8fEKDQ21eUxoaKhVfUlav369pX5gYKB8fX2t6ly4cEHbtm2z1AkNDVVGRoZ27txpqbNhwwaZTCaFhIRU2P0BAFAdkOcAAKCiMEIcAFDlRUVFafjw4erSpYvuuOMOzZ8/X1lZWRo5cqQkadiwYWrSpIliY2MlSePHj1f37t01d+5c9e3bVytWrNCOHTu0ZMkSSZLBYNCECRP00ksvqVWrVgoMDNTUqVPl7++viIgISVLbtm3Vu3dvjRo1SnFxccrLy9PYsWM1aNAg+fv7V8rrAACAMyPPAQBARaBD/AYzGo2KiYnhIQBVDO9r1cT7WnUMHDhQaWlpmjZtmlJSUhQUFKR169ZZHqKVlJQkF5eiSVNdu3bV8uXLNWXKFL344otq1aqVVq9erfbt21vqTJo0SVlZWRo9erQyMjLUrVs3rVu3Tu7u7pY6y5Yt09ixY9WrVy+5uLiof//+Wrhw4Y27cdgFvxuqJt7Xqov3tuogz1GR+N1QNfG+Vk28r6hoBrPZbK7sRgAAAAAAAAAAYG+sIQ4AAAAAAAAAqBboEAcAAAAAAAAAVAt0iAMAAAAAAAAAqgU6xJ2cwWDQ6tWrK7sZTq9Hjx6aMGGC5fuAgADNnz//us87ffp0BQUFXfd54DhGjBihiIiIUtVNTEyUwWDQnj177NomAM6PPK8Y5DlKizwHUNHI8opBlqO0yHJcjxqV3QBcn+TkZNWvX7+ym+FQevTooaCgoAoJzev13HPPady4cZXdDFSgBQsWqLTPIm7atKmSk5PVsGFDO7cKgLMjz4sjz2FP5DmAikaWF0eWw57IclwPOsSdnK+vb2U3ATaYzWYVFBTIw8NDHh4eld0cVCAvL69S13V1deVnFECp8LvCMZHnVRd5DqCi8XvCMZHlVRdZjuvBkinXYDKZ9Morr+jmm2+W0WhUs2bN9Le//U2S9OOPP6pnz56qVauWGjRooNGjRyszM9Ny7OXpGzNmzFCjRo3k6empMWPGKDc311Jn3bp16tatm+rVq6cGDRrogQce0LFjxyz7c3NzNXbsWPn5+cnd3V3NmzdXbGysZT/TsqyNGDFC33zzjRYsWCCDwSCDwaDExETt379fffr0kYeHh3x8fDR06FCdOXOmVOe0NbUmIyNDBoNBmzZtkiRt2rRJBoNBX3zxhYKDg2U0GrV58+Zi07L+OP1LkiIiIjRixAjL9wEBAXrppZc0bNgweXh4qHnz5vrss8+Ulpamfv36ycPDQx07dtSOHTvK+SpVH1f7+br8vv7rX//Sn/70J9WqVUu33367fv75Z23fvl1dunSRh4eH+vTpo7S0NMs5/zgt62q/I5iWBTgO8ty5kOe4EnkOQCLLnQ1ZjiuR5XA0dIhfQ3R0tGbPnq2pU6fqp59+0vLly+Xj46OsrCyFh4erfv362r59u1atWqWvv/5aY8eOtTo+Pj5eBw8e1KZNm/TRRx/pk08+0YwZMyz7s7KyFBUVpR07dig+Pl4uLi7685//LJPJJElauHChPvvsM/3rX//S4cOHtWzZMgUEBNzIl8CpLFiwQKGhoRo1apSSk5OVnJysunXrqmfPnrrtttu0Y8cOrVu3TqmpqXrkkUcq/PqTJ0/W7NmzdfDgQXXs2LHc53nttdd01113affu3erbt6+GDh2qYcOG6bHHHtOuXbvUsmVLDRs2rNTTg6qra/18SVJMTIymTJmiXbt2qUaNGnr00Uc1adIkLViwQN99952OHj2qadOmlXiNkn5HAHAs5LlzIc9xJfIcgESWOxuyHFciy+FwzCjRhQsXzEaj0fzWW28V27dkyRJz/fr1zZmZmZayNWvWmF1cXMwpKSlms9lsHj58uNnb29uclZVlqfPmm2+aPTw8zAUFBTavmZaWZpZk/vHHH81ms9k8btw4c8+ePc0mk8lmfUnm//znP+W9xSqpe/fu5vHjx1u+nzVrlvm+++6zqnPixAmzJPPhw4dtHtO8eXPza6+9Zjabzebjx4+bJZl3795t2X/u3DmzJPPGjRvNZrPZvHHjRrMk8+rVq62uExMTY+7UqVOJbTObzeZ+/fqZhw8fbnXtxx57zPJ9cnKyWZJ56tSplrKEhASzJHNycvI1Xg1c6cqfr8vv69tvv23Z/9FHH5klmePj4y1lsbGx5tatW1u+Hz58uLlfv35ms/nqvyPMZtv/7wC48chz50SeoyTkOVD9kOXOiSxHSchyVDZGiF/FwYMHlZOTo169etnc16lTJ9WpU8dSdtddd8lkMunw4cOWsk6dOql27dqW70NDQ5WZmakTJ05Iko4cOaLBgwerRYsW8vT0tHzCnJSUJKlwCsiePXvUunVrPfPMM/rqq6/scatV2t69e7Vx40bLmmEeHh5q06aNJFlNgasIXbp0qZDzXPkJ9uVPNDt06FCs7PTp0xVyvarqWj9fUule65Je56v9jgDgOMjzqoE8r77IcwBkedVAlldfZDkcDQ/VvIpatWrZ/RoPPvigmjdvrrfeekv+/v4ymUxq3769ZS2zzp076/jx4/riiy/09ddf65FHHlFYWJj+/e9/271tVUVmZqYefPBBvfzyy8X2+fn5XfN4F5fCz43MV0yBysvLs1n3yn+ElXQu8x+mUtk6V82aNS1fGwyGEsuunF6E4q718yWV7rUu6XW+Eb8jAFw/8rxqIM+rL/IcAFleNZDl1RdZDkfDCPGraNWqlWrVqqX4+Phi+9q2bau9e/cqKyvLUvb999/LxcVFrVu3tpTt3btXly5dsny/detWeXh4qGnTpjp79qwOHz6sKVOmqFevXmrbtq3OnTtX7Fqenp4aOHCg3nrrLa1cuVIff/yx0tPTK/huqw43NzcVFBRYvu/cubMOHDiggIAA3XzzzVbbtUJSkho1aiRJSk5OtpSV90EMjRo1sjpPQUGB9u/fX65z4epK+/N1Pa72OwKA4yDPnRN5Dok8B1CILHdOZDkkshyOiRHiV+Hu7q4XXnhBkyZNkpubm+666y6lpaXpwIEDGjJkiGJiYjR8+HBNnz5daWlpGjdunIYOHWq1aH9ubq4iIyM1ZcoUJSYmKiYmRmPHjpWLi4vq16+vBg0aaMmSJfLz81NSUpImT55s1YZ58+bJz89Pt912m1xcXLRq1Sr5+vqqXr16N/jVcB4BAQHatm2bEhMT5eHhoaefflpvvfWWBg8erEmTJsnb21tHjx7VihUr9Pbbb8vV1fWq56tVq5buvPNOzZ49W4GBgTp9+rSmTJlSrrb17NlTUVFRWrNmjVq2bKl58+YpIyOjXOfC1ZXm5+t6Xe13RGRkZIVeC0D5kefOiTyHRJ4DKESWOyeyHBJZDsfECPFrmDp1qp599llNmzZNbdu21cCBA3X69GnVrl1bX375pdLT03X77bfrL3/5i3r16qVFixZZHd+rVy+1atVKd999twYOHKiHHnpI06dPl1Q4RWfFihXauXOn2rdvr4kTJ2rOnDlWx9etW1evvPKKunTpottvv12JiYlau3atZaoQinvuuefk6uqqdu3aqVGjRsrNzdX333+vgoIC3XffferQoYMmTJigevXqlfp1XLp0qfLz8xUcHKwJEybopZdeKlfbHn/8cQ0fPlzDhg1T9+7d1aJFC91zzz3lOheurjQ/XxWhpN8RABwLee58yHNI5DmAImS58yHLIZHlcEwG8x8XTUKFGTFihDIyMrR69erKbgoAACgn8hwAAOdGlgMArsRHmQAAAAAAAACAaoEOcQAAAAAAAABAtcCSKQAAAAAAAACAaoER4gAAAAAAAACAaoEOcQAAAAAAAABAtUCHOAAAAAAAAACgWqBDHAAAAAAAAABQLdAhDgAAAAAAAACoFugQBwAAAAAAAABUC3SIAwAAAAAAAACqBTrEAQAAAAAAAADVAh3iAAAAAAAAAIBq4f8BY+4DmZX/HJMAAAAASUVORK5CYII="
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAXRCAYAAABxVdQKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hTVQMG8Pdmdqd70UKhQMveQpElU2RT2SjrkyEgggPrYjiKExwslaWCIMsBInsoS/ambCh07502yf3+iE0JHbQlbW7x/T1PHsjJzem5N+PNPffccwVRFEUQEREREREREREREVEhMms3gIiIiIiIiIiIiIhIqtiJTkRERERERERERERUDHaiExEREREREREREREVg53oRERERERERERERETFYCc6EREREREREREREVEx2IlORERERERERERERFQMdqITERERERERERERERWDnehERERERERERERERMVgJzoRERERERERERERUTHYiU6PpdGjRyMgIMDazXjs7du3D4IgYN++fdZuSpUXEBCA0aNHW7sZRESPhPlbOR6n/O3UqRM6depkun/r1i0IgoCVK1da9O9UVL1ERP8lzPnK8TjlfGmUN6NXrlwJQRBw69atCmkX0YPYiS4hFy5cwMiRI1GtWjWo1Wr4+vpixIgRuHDhwiPV++GHH+KXX36xTCNLSRAE000mk8HX1xfdu3d/bELg0KFDmD17NlJSUqzdFCIiekTM36qD+Sstf/zxB2bPnm3tZhARlYg5X3Uw54lIytiJLhGbNm1C8+bNsXv3bowZMwaLFi3CuHHjsHfvXjRv3hybN28ud93WCHcA6NatG3744QesWrUKEydOxNmzZ9G5c2ds27at0ttiaYcOHcKcOXP+8+HeoUMHZGdno0OHDtZuSpUXERGBb7/91trNIPrPYf5WLcxfI6nk7x9//IE5c+ZYtQ2lVaNGDWRnZ+O5556zdlOIqBIx56sW5ryRVHK+spQ3o5977jlkZ2ejRo0aFdQyInMKazeAgOvXr+O5555DrVq1cODAAXh4eJgemzZtGtq3b4/nnnsOZ8+eRa1atazY0gI5OTlQqVSQyYo/DlO3bl2MHDnSdH/AgAFo3LgxFixYgJ49e5a7XpIOmUwGGxsbazfjsaBWq63dBKL/HOZv2eol6WD+lp5Op4PBYIBKpeI2I/qPYc6XrV6S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v/0W77//fqHH7ezs4O3tbYWWERERWZ8Usvpxw+lciIhIUgSlzOI3IiIispyKyGqtVou0tDSzm1arLbYNkydPRq9evdC1a9ciH1+9ejXc3d3RsGFDhIWFISsrq6I2BxERkeRwv9ryuAWIiIiIiIjIqsLDw6HRaMxu4eHhRS67du1anDx5stjHhw8fjh9//BF79+5FWFgYfvjhB4wcObIim09ERESPOU7nQkREksLTzoiIiKStIrI6LCwMM2bMMCtTq9WFlouMjMS0adOwc+dO2NjYFFnX+PHjTf9v1KgRfHx80KVLF1y/fh2BgYGWbTgREZEEcb/a8tiJTkRERERERFalVquL7DR/0IkTJxAXF4fmzZubyvR6PQ4cOICvv/4aWq0Wcrnc7DmtW7cGAFy7do2d6ERERFQu7EQnIiJJEZQ8Yk5ERCRl1szqLl264Ny5c2ZlY8aMQXBwMGbOnFmoAx0ATp8+DQDw8fGpjCYSERFZHferLY+d6EREJCk87YyIiEjarJnVjo6OaNiwoVmZvb093Nzc0LBhQ1y/fh1r1qzBM888Azc3N5w9exbTp09Hhw4d0LhxYyu1moiIqHJxv9ry2IlOREREREREjwWVSoVdu3ZhwYIFyMzMhL+/P0JDQ/H2229bu2lERERUhbETnYiIJIWnnREREUmb1LJ63759pv/7+/tj//791msMERGRBEgtqx8H7EQnIiJJ4WlnRERE0sasJiIikjZmteXJrN0AIiIiIiIiIiIiIiKp4kh0IiKSFEHOI+ZERERSxqwmIiKSNma15XEkOhERERERERERERFRMTgSnYiIJEXGI+ZERESSxqwmIiKSNma15bETnYiIJEWQMeyJiIikjFlNREQkbcxqy+N0LkRERERERERERERExeBIdCIikhRBzuO7REREUsasJiIikjZmteVxixIRERERERERERERFYMj0YmISFJ4ARQiIiJpY1YTERFJG7Pa8tiJTkREksILoBAREUkbs5qIiEjamNWWx+lciIiIiIiIiIiIiIiKwZHoREQkKTztjIiISNqY1URERNLGrLY8jkQnIiIiIiIiIiIiIioGR6ITEZGkCDxiTkREJGnMaiIiImljVlseO9GJiEhSBBlPkiIiIpIyZjUREZG0Mastj1uUiIiIiIiIiIiIiKgYHIlORESSIsh42hkREZGUMauJiIikjVlteRyJTkRERERERERERERUDI5EJyIiSZHxAihERESSxqwmIiKSNma15bETnYiIJIWnnREREUkbs5qIiEjamNWWx+lciIiIiIiIiIiIiIiKwZHoREQkKYKMx3eJiIikjFlNREQkbcxqy+MWJSIiIiIiIiIiIiIqBkeil1KTBhoMH+iPoEAHuLupEfbBefx1JLHE5ygVAsYMq4Hunbzg6qJCYlIuVq69ja27YgAAcrmA5wZVR8/OXnB3UyPyXhYWr7yBoyeTK2OVHlnvLu7o09UDXh5qAMDtu9n4cXM0jp1JK3L5GtVsMOpZX9SpaQdvDzUW/RCJzX/GmS0ztK832rV0hr+vDbS5Bly8monv1t7F3Whtha+PJTzbXYNB3Z3Nyu7F5WHGx1FFLt+xpT1eHOpuVpabJ+K5sDum+xoHGYb3ckHjujawt5Xh0g0tVvyShJgEncXbX1HmTXaBu7O8UPme49lYsz2zUHn7pmqENLJBNQ/jc27H6LB5XxZuRhWss1oJhHa2R9O6KjjYypCQosfu4znYfzKn4lbEggQB6NlahZbBSjjaC0jLEHH0Uh52/JNb7HOGd7NB6/rKQuXRiXrM+zELABDoK0fnFir4e8qgcZDhu9+zce5G1XmvAJy7jcqPWV0Ys7qw0G4aPNtNY1Z2Ly4Pr34aXexzerZzRNcQB7g7y5GeacDRc1lYuy0Febry1yk1Zc3q+7Wqr8KEAU44FaHFwg3ppvLmQSp0bG6DGt4KONjJMOe7ZETG6i3e9opSnqwGgBZBCnRpoYKHswzZuSIu3dLj179zkFXET5RmdRUY3dMWZ6/nYdmWqvEbBmBWU/kxqwtjVhetrNkqlwH9OjuhQwt7uDgpEB2fh5/+SMGZKwXfrYIAPNtNg3bN7eHsKENymh77j2di8+6it7XUlDWr2zZWY2wfR7OyPJ2ISR8V/Zkb2dMenZrbYu2ODOw6VnUySa0EnglRo3GgAg52Au7FGbDpQA7uxBqKXN7JTkD/Dmr4e8rh7izgwOk8bD5Q+LPRtLYCz4So4OokQ3yKAb8f1OLirSr0O4ZZbXHsRC8lWxs5rt3MwNad0fjwrYales7cmfXh6qzCvC8jcDc6G24uatx/NsX4kQHo/pQXPvrqCu7czcITzV3w4ZsNMPH107h6I6OC1sRyEpLysGztPdyL0QIC0L29G+bMCMSkNy/h9r3CX7hqtQzRcVocOJqMiSP9i6yzcbADftsVj4jrmZDLBYwdXA3z3qiD/71+ETnaor8ApSYyJhfvLY013Tc85Ds2K9uAlz++V1Agmj/+6mhP6A0iPl0Zj6wcA3p3cMLbE7zwyidR0OY+sLBEvb8iBfd/f1fzUOCVERqcuFT0TmhQDSX+uajF9bt5yNMBPUNsMX2YE979JgUp6cb3weBuDqhXQ4llv2YgIVWPBrWUGPG0A1LSDThzteSdWyno2lKFJxsrsXpHDmISDfD3kmN4NxvkaEUcOJNX5HM27c/B7wcLwl0mA2YOt8fpqwWd5ColcC9Bj6MX8zCut22Fr0dF4FXEqbyY1YUxq4sWGZOLD74p6HAwlNDstk3tMLSnM5auT8SV21r4uCsxaYgrRBH4cUtKueqUorJmdT43jQyDutjjyp3C2aVSCrgamYfjl7QY1cuxiGdLW3myuqaPHCO722DzAS3O39TB2UGGwU+pMbSLDZZvNf/MuToK6N9OjWv3qtbBboBZTeXHrC6MWV28smTr4B7OaNfcDt9uTEJUXB4a17XFjFHumLUwFreijN/ZfTs5oVuIAxavS0RkbB5q+akwcbAbsnIM2H5Q+u+V8mR1Vo4Bby95+AGlZkEq1KqmRHJ61ekkzje0qw183GT4cXsOUjMNaBmsxIsD7BD+QyZSMwv3mSjkQEaWiB3/aNGpmarIOgN8ZHi+pw22HNTiwk09WgQpMK63LT79KQvRiVXjM8Sstjx2opfSkRNJOHIiqdTLt27ugqYNnTH4haNIzzD+MI6JMz+y1eMpL3z/8x1Tvb9si0bLpi4Y2t8P731+2XKNryBHTqWa3V+xPgq9u3qgXm37IsP+yo0sXLlhHC07bmi1Iut88+NrZvc/WXoLG5Y0QZ2adjh3WfqhBgB6PZCaXvovVRHFL+/jrkDdADVe+SQKd2ONwf/dpiQsneWHJ5vaY88/VWObZGSZB1fPtirEJekRUcQONwB896v5eq3cmoHmwa6oF6DE4XPGz1HtagocOpdjquPAKS06NrNFTV9FlehEr+kjx/kbOtOR7KR0HVoE6VDDWw4Us2Oekwvk3HfgpFEtBWxtgKMXC5a/dFuPS7er3g8fIktgVhfGrC6a3gCkZpQuq+vWUOPKLS0OnTZul4RkPQ6dzkKgv/lOV1nqlKKyZjVgHNH3Qj9H/HYgC3X8lbCzMd9ZO3Le+Hly01TNGSTLk9UBPjIkpRV0siel6XHwfB66tjB/vwgC8NzTtth2NBe1fOWwVVfsuhBJBbO6MGZ18cqSre1b2GHz7jScvmzcZruOZKBhHRv06uCEhWuNI6/rBqhx/EI2Tv27TEJyNto2zUFtfzW2Q/rbpTxZDQBpRXQk38/ZUYZh3e2x4Kc0vDTE6ZHbWZmUcqBJbQW++z0b16OMef3n0Vw0rKnAk42V+ONw4b6BpHQRm/4ded66QeEzvQGgY1MVLt/WY89J47b940gugqor0L6JEj/vqTpndJBlsRO9grRr7YaIa+kYEeqPHk95ISdHj7//ScS3P95Cbq4xBJRKGbR55oGg1RrQuL6mqColTSYAHVq7wEYtw8VrJZ/yWxb2dsZTlfJ/MFUF3h4KLH6nGvJ0Iq7ezsWaP5KRmFJ8p6aNSsDXb1WDIAA37+Zi7bYUU4e5QmHcGc3TFYSeKBrvB9VUV5lO9PvJZUCbhmrsPJpd6ueolALkMgGZ2QWfl2v3dGhSR4W/z2iRkm5AUA0lvFxlWLtT+h3oAHAzWo+Qhkp4OOciPkWEr7sMtXzlRZ5GVpw2DZS4ckeP5PSqcUZCafG0M6oszGrLqJJZ7a7Aord9kZsHXL2jxdptKcVm9ZXbWrRrbo9AfxWuR+bC01WOpkG2+OtkZrnrlLrSZnWf9nZIyzLg7zNa1PEveie0KitPVt+KNqB3WwH1A+S4eEsPRzsBTWsrcPGW+efj6dYqZGQZcORCHmr5Fj41X+qY1VRZmNWWURWzGihbtirkgtl+MwDk5YkICig4SnnllhZdWjvA212BmAQdqvsoERygxg9bqsbUP/crbVarVQI+muICQfh3mtS9WYhKKNiGAoBxfR2w/Ui2WXlVIZMBcpkA3QNNz9OLj5SvNX3k2HvSvG/h8h0dGtWqOt2ozGrLs+qrn5CQgOXLl+Pw4cOIiTHOZ+bt7Y22bdti9OjR8PDweGgdWq0WWq35D1mDPhcyedGnZFQWXy9bNKqvgTbPgDc/uACNkxKvTKoDJ0clwr+IAAD8cyoJQ/v74cz5VNyLyUaLJi7o2NYdsir0Rg/wt8GXs4OhUsqQnaPHnPnXcaeIo+XlIQjApOf8cD4iA7fuVo35uK7d0WLx2kRExefBxVGO0O4azJnsjVc/jUKOtnBHZ1R8Hpb8nIjb0bmws5GhTycnvDfFG698GoWkVD2i4vIQn6zDsGec8e2GJOTkGtCrgxPcnRVwcap6O1yA8TQxOxsBB8+WvrP42c52SMkw4OLNgiPsP23PwPPPOODTl1yh04sQReD7PzJwNbJq/DDcdSwXNirgzeftIRoAQQZsPZSLExGla7+TvYB6AXJ8/2fV+GyUBa8iLj2PmtfMautiVpu7dkeLJetyER2vg7OTHKFdNZg1yQuvfx5dZFYfOp0FR3sZZk/yAgTjTvrOw+n4dW9aueuUutJkdW0/Bdo1UWPudymV17BKVp6svhmtxw9/5mBUT1so5ca5ms/d0GH9voJtWctXjjb1lfh4TVZlrEaFYFZLz+O6b82sfnRVMauBsmfr2Ss56NXeEZdvahGbqEPD2jZo1dDW7H3w27402NoI+OxVHxhE40GLn7en4uCpqvd9XJqsjknUY+WWDNyN08FWLaBHGzu8MUqDWd+kIPnfs+GfbmsLgwHYXYXmQL+fNg+4GaVH9ydUiEnKQXqWiBZ1FQjwliM+tfy/wRztBKQ/MPI/PUuEk33V+V5hVlue1bbosWPHULduXXz55ZfQaDTo0KEDOnToAI1Ggy+//BLBwcE4fvz4Q+sJDw+HRqMxu929troS1qBkggyAKGLup5dw6Wo6jpxIwlfLrqNnZy+oVMbN/sU31xEZlY3Vi1th7+YOmDGhNv7YFQPRUHV2tu5GaTHxzUuY+u5l/L47Hq9NDED1ajYWqXvq6OoI8LPFB1/fsEh9leH05RwcOZuFO9F5OHMlB/O+i4O9jQwhTeyLXP7q7VwcOJGJ21F5uHRDi89WxiMtU4+ubRwAGE9f+2xlPHzclVj+nj9++LA6GgTa4NSlbFSht4mZdk1scP56XqlPy+sZYosn6quxaEOa2dHlzi1tUauaAl/9nIb3l6fg592ZGNHDHvUCqsZIuKZ1FWgRpMT3f+bgk5+ysHpHDjo3V6FVvdId23yinhLZWhHnrleNgwZUdVkir5nV1sWsNncmIgdHz2XjTkwezl7JwUfLjVndprFdkcvXq6VG/84aLP8lCW9+EYPPVsWjWbAtBnRxKnedUvewrFarBIzr54jv/8hARnbV+SyUVXmy2stVhoEd1dh+VItP12Zh8eYsuDkJGNLZOBJSrQRGdrfB2t05yMx5fLcdVa7Hed+aWf3oqmJWA2XP1lW/JSM6QYfPXvXBDx/6Y3R/F+w/nglRLHgftGlsh3bN7PH1T4l484sYLP45Eb06OKJDi6L316WsNPvVN+7pcPicFpGxely5o8OiDWnIyBLRobnxvVXDW46urWyx/Peqd4b7/X7YkQ0BwHv/c8BnUxzQoakKJ6/ozF57Ikuw2kj0qVOnYtCgQViyZAkEwfxIjiiKmDhxIqZOnYrDhw+XWE9YWBhmzJhhVvb00KMWb29ZJSblIj4xF5lZBb1+tyOzIJMJ8HRT4250NlLS8vDmBxegUgpwclQiISkXk0bVRFRs1TkCqNOLiIo1Hvm8eisLQbXsMaCHJ75YfueR6p0yyh+tm2nwynsRSEgqeX4vKcvKERGdkAdvt9J91PQG4Na9XHi7F3QE37yXi5nzo2FrI0AhF5CeacD7L3njRmTVmLbkfq5OMtSvqcSijemlWr57a1v0bGuLz9ak4W5cwWdJqQAGPmWHhRvScO6a8f1xN06P6l4K9Ghji0u3pP+e6ddOjV3Hc3HqirETPDrRAFfHXHRrqcKxSw/vGG/TQInjl3XQV93pd4vF086kxRJ5zay2LmZ1yR6W1YN7aPDXyUzs/cd4Wn1kTB5sVAL+F+qKX/akoaj9s7Lmv5SUJqs9XWTwcJZj6uCCAwn5Xw9Lw9zw9uJkxKdU/YAqT1Z3a6nCjeiCOVSjAOTu1WLaIDtsPZQLRzsBbhoZXuhbcPHv/G33+VQHfPB9JhIfYeRcZWFWS8vjvG/NrGZW53tYtqZnGvD59wlQKgAHOzmS0/QY1tMZcYkF39cjejnj171pOHzGOPI8MiYPHs4K9H3KCQdOWG76nIpW1v3qfHoDcCdWB08X41ntdfyVcLQX8PFUF9MycpmAwV3t0fUJW7yxsGpMc5OYKuKrjdlQKYzT5aZliRjV0+aR8jQ9S4Sjnfn3qaOd8ND55aWEWW15Vvtlf+bMGaxcubJQyAOAIAiYPn06mjVr9tB61Go11GrzK/FY+/RwADh3KQ1PtfOArY0M2TnGnQj/arbQ60XEJZqfbpObJyIhKRdyuYCObT2w5+94azTZIgTBOH/1o5gyyh9PtnTGq+9fQUx81esovp9aJcDLTYEDpbzCtSAA/j4qnLpUeF6z7BwRgAhvdwUC/VT4+c8Uyza2ErRrYoO0LBFnS3Hhz6fb2OKZJ22x4Kc03I4231GVy4wHFB7suDAYRBTxlSJJKkUR7RdR5Hfig2pXk8PDWYYjF6r2D+GqYN68eQgLC8O0adOwYMECAEBOTg5eeeUVrF27FlqtFj169MCiRYvg5eVl3cZWEEvkNbNaWpjV5vKz+q+TRWe1SimD+EB/8MMGNz6sTikrTVZHJ+jx7jfmO9YDOtrBRiXgp52ZSEqr+h3oQPmyWqVEoQPchvw3jADEJhsw70fzjppnQlSwUQnYtF+LlMfsOidUOR7nfWtmdfk9TlkNlD5b83RAcpoechnwRCNbHDlbMFWLSln093pV62ssy371/QQBqOYhx7nrxv3Iw+e1uPjAALTpw5xw5JwWf5+pehfPzNUBuToRtmoguIYCv/1d/nW4Ga1HXX8F9p8u2D5B/grciql6v+3IcqzWie7t7Y1//vkHwcHBRT7+zz//SKpDwtZGhmo+BSNGfLxsULumPdIzdIiN12LC8zXh4abC+/ON87Lt3B+LUUOq481pwVi25hY0TkpMHlMLW3fFmC6AUr+uI9zd1Lh2IwPubmqMHV4DMhmwZtOjHW2uLGOH+OLYmTTEJeTC1laGzm1d0aSeI8I+ugoAeH1iABKSc7F8XRQA4xyiNfyMpw0pFQLcXZQIrGGL7ByD6aj71NH+6NzWFbM+v46sHD1cNMa3aGaWHrl50t+pGNnbGScuZiMhWQcXJwUG9dDAYAAOnjLuLE0e6oakVD1+2pYCAAjtpsHV21rEJOhgb2ucE93DRW52wdA2je2QlqlHQrIe1X2UGNXPFcfOZ+HslaozsgIwXrDkySZqHD6bU6jzYWwfB6SkG7Bpn/EHztMhtujXwQ7f/pKOhFS9ad4xba4IbR6Qkysi4nYeBnW2R15eJhJT9ahbQ4mQRjb4eVfVGEFw/qYO3VupkJxuQEyiAX6ecjzVTIkjFwtCundbFTQOMqzeYf5at2mgxK1oPaITC3dSqJSAh6Zgpi43jYBq7jJkacUqcwFSqRwxP3bsGJYuXYrGjRublU+fPh1bt27F+vXrodFoMGXKFAwcOBAHDx60UksrVlXKa2Z1Yczqwkb0csbJS9mIT9bBxUmOQd2MWX3otDGDJg1xQ3KqDmv/TAUAnLyUjWfaO+JWVC6u3dHC212JQd01OHkp27Qj/rA6q4rSZrVOD0TFm+9EZv07Ncn95fY2Alw1Mjg7GHPJ29U48i01w1AlRnKVJ6vP39BhaBcbPNlIicu3dXCyN07vcitGb1rnB/M7WwsAYpG5LlVSyWoyYlYzqx+3rAbKnteB/iq4auS4HZULFycFnu2mgSAI+H1fwTVMTl7KRv/OTkhM0SEyNg8Bvio8094R+45VjX1IoGz71b3b2eLGPR3ikvWwszHOie6mkeOv08YR7JnZIjKzzfNcrzfmdGxS1eksDq4uBwQgLtkAD2cZ+rZTIy7JgKP/5nVR+9XV3I2/TdRKAQ62xn1mnQGITTJ+r+w/nYuXQu3wVDMlLtzSo3ldBfy9ZFi3p+r0wzCrLc9qneivvvoqxo8fjxMnTqBLly6mUI+NjcXu3bvx7bff4tNPP7VW8woJru2Ir8Kbmu6/9L/aAIA/dsfgwwURcHNVwcujYM6y7BwDpr97FtPH18F385sjNS0Pe/+Oxzc/3jIto1LJ8MLIAPh62yI7R48jxxPx3ueXkZFZNb6snJ2UeH1iAFydlcjM0uNmZDbCPrqKk+eNX8iebiqzOajcXJRY8mF90/3Bvb0xuLc3zlxMx6sfXAEA9O3mCQD47J0gs7/1ydJb2HEgsaJX6ZG5aRR4aYQ7HO3lSMvQI+KmFm9/FYP0TOMXsZuLwizo7G1lGD/IDc6OcmRmGXDjnhbvfBWDe7EFO2fOTnI819cFzg5yJKfrceB4BjbuSq3sVXtk9Woq4aaR4+8zhUPHTSM3GxHQqbkNlAoBLz7rZLbcbwey8Ntfxh8ESzenIfQpe/yvvwPsbWRITNVj875M7DtZNUJt474cPBOixqCnbOBgJyAtQ8TB83nYfrRgNIGTvQwujubBZ6MCmtRWYNP+oo+qV/eUY+qzBfMEDuhg/F46ejEPa3ZWjW0jhbDPyMjAiBEj8O233+L99983laempmLZsmVYs2YNOnfuDABYsWIF6tWrhyNHjqBNmzbWanKFqUp5zawujFldmKtGjqnD3eBg929W39Lina9jTVnt7iw32yabd6cCoojBPTRw1ciRlmHAyUvZWHffGWEPq7OqKEtWl0aTuiqM7eNouj9hoDHX789zKStPVv9zSQe1Sov2TZTo316NbK2Iq3f1jzQaToqkkNVUgFnNrH7cshooe16rlAIG93CGp6sC2lwDTl3OwaJ1iaaDvACw8tdkDO6uwZgBrtA4yJCcpsfuo1Vr/7osWW1vI8OoXg5wspchK0fE7RgdwlelIDqhanw2SstGLaBPWzWcHQRkakWcuabD1kNaGP79GVbUfvXrIwrmwa/uJUfLYCUS0wyYu8J4QOVWtAHf/5mDZ9qq0butgPgUA5ZtyeYB7/84QbTiTPvr1q3D/PnzceLECej1xg+xXC5HixYtMGPGDAwePLhc9bbrs9+SzXxs2Do5WLsJkuPq427tJkiOo0vVu6hKZbB3UD98of+YL6Y5Pnyhcrgy7GmL11lj5a/Qas07MIo6ZTnfqFGj4Orqivnz56NTp05o2rQpFixYgD179qBLly5ITk6Gs7NzQf01auDll1/G9OnTLd52KaiIvGZWF41ZXZh7NQ9rN0Fy7DVV84KlFY1ZXVhVyuq6P/1p8Tr/S7hvXXmY1YUxq4vGvC6MWV0Ys7rqsOrVjoYMGYIhQ4YgLy8PCQkJAAB3d3colcqHPJOIiB5Xgkz28IXKKDw8HHPmzDErmzVrFmbPnl1o2bVr1+LkyZM4duxYocdiYmKgUqnMOtABwMvLCzExMZZssqQwr4mI6H4VkdX0aJjVRER0P2a15Vm1Ez2fUqmEj4+PtZtBRESPqbCwMMyYMcOsrKhR6JGRkZg2bRp27twJGxubQo//1zGviYiIpI1ZTUREVDF4WIKIiCRFJhcsflOr1XBycjK7FdWJfuLECcTFxaF58+ZQKBRQKBTYv38/vvzySygUCnh5eSE3NxcpKSlmz4uNjYW3t3clbSEiIiLrqoisLq958+ZBEAS8/PLLprKcnBxMnjwZbm5ucHBwQGhoKGJjYy2w5kRERFWDlLL6cSGJkehERET5rHkBlC5duuDcuXNmZWPGjEFwcDBmzpwJf39/KJVK7N69G6GhoQCAiIgI3LlzByEhIdZoMhERUaWTysXKjh07hqVLl6Jx48Zm5dOnT8fWrVuxfv16aDQaTJkyBQMHDsTBgwet1FIiIqLKJZWsfpywE52IiOhfjo6OaNiwoVmZvb093NzcTOXjxo3DjBkz4OrqCicnJ0ydOhUhISFo06aNNZpMRET0n5SRkYERI0bg22+/xfvvv28qT01NxbJly7BmzRp07twZALBixQrUq1cPR44cYV4TERFRubATnYiIJEXqF0CZP38+ZDIZQkNDodVq0aNHDyxatMjazSIiIqo0FZHVWq0WWq3WrEytVhc5/RoATJ48Gb169ULXrl3NOtFPnDiBvLw8dO3a1VQWHByM6tWr4/Dhw+xEJyKi/wSp71dXRexEJyIiKsG+ffvM7tvY2GDhwoVYuHChdRpERET0GAoPD8ecOXPMymbNmoXZs2cXWnbt2rU4efIkjh07VuixmJgYqFQqODs7m5V7eXkhJibGkk0mIiKi/xB2ohMRkaRw7jYiIiJpq4isDgsLw4wZM8zKihqFHhkZiWnTpmHnzp2wsbGxeDuIiIgeB9yvtjx2ohMRkaQw7ImIiKStIrK6pKlb7nfixAnExcWhefPmpjK9Xo8DBw7g66+/xvbt25Gbm4uUlBSz0eixsbHw9va2eLuJiIikiPvVlsdOdCIiIiIiIqoSunTpgnPnzpmVjRkzBsHBwZg5cyb8/f2hVCqxe/duhIaGAgAiIiJw584dhISEWKPJRERE9BhgJzoREUkKL4BCREQkbdbMakdHRzRs2NCszN7eHm5ubqbycePGYcaMGXB1dYWTkxOmTp2KkJAQXlSUiIj+M7hfbXnsRCciIiIiIqLHxvz58yGTyRAaGgqtVosePXpg0aJF1m4WERERVWHsRCciIknh3G1ERETSJrWs3rdvn9l9GxsbLFy4EAsXLrROg4iIiKxMaln9OODYfiIikhRBJrP4jYiIiCyHWU1ERCRtUsrqefPmQRAEvPzyy6aynJwcTJ48GW5ubnBwcEBoaChiY2MtsOYVh79WiIiIiIiIiIiIiMiijh07hqVLl6Jx48Zm5dOnT8fvv/+O9evXY//+/YiKisLAgQOt1MrSYSc6ERFJiyBY/kZERESWw6wmIiKSNglkdUZGBkaMGIFvv/0WLi4upvLU1FQsW7YMn3/+OTp37owWLVpgxYoVOHToEI4cOWLJrWBR7EQnIiJJEWSCxW9ERERkOcxqIiIiaauIrNZqtUhLSzO7abXaYtswefJk9OrVC127djUrP3HiBPLy8szKg4ODUb16dRw+fLjCtsmjYic6ERERERERERERERUrPDwcGo3G7BYeHl7ksmvXrsXJkyeLfDwmJgYqlQrOzs5m5V5eXoiJiamIpluEwtoNICIiuh8vLkZERCRtzGoiIiJpq4isDgsLw4wZM8zK1Gp1oeUiIyMxbdo07Ny5EzY2NhZvh7WwE52IiIiIiIiIiIiIiqVWq4vsNH/QiRMnEBcXh+bNm5vK9Ho9Dhw4gK+//hrbt29Hbm4uUlJSzEajx8bGwtvbuyKabhHsRCciIknhvKhERETSxqwmIiKSNmtmdZcuXXDu3DmzsjFjxiA4OBgzZ86Ev78/lEoldu/ejdDQUABAREQE7ty5g5CQEGs0uVTYiU5ERJLCU8SJiIikjVlNREQkbdbMakdHRzRs2NCszN7eHm5ubqbycePGYcaMGXB1dYWTkxOmTp2KkJAQtGnTxhpNLhV2ohMRERERERERERFRpZg/fz5kMhlCQ0Oh1WrRo0cPLFq0yNrNKhE70YmISFJ4ijgREZG0MauJiIikTWpZvW/fPrP7NjY2WLhwIRYuXGidBpUDz8MjIiIiIiIiIiIiIioGR6ITEZGkSO2IOREREZljVhMREUkbs9ry2IlORETSwouVERERSRuzmoiISNqY1RbHLUpEREREREREREREVAyORCciIkkRBJ52RkREJGXMaiIiImljVlseR6ITERERERERERERERWDI9GJiEhSBM7dRkREJGnMaiIiImljVlseO9GJiEhSeBVxIiIiaWNWExERSRuz2vJ4WIKIiIiIiIiIiIiIqBgciU5ERNLC086IiIikjVlNREQkbcxqi+MWJSIiIiIiIiIiIiIqBkeiExGRpHDuNiIiImljVhMREUkbs9ry2IlORESSIgg8SYqIiEjKmNVERETSxqy2vMeyE93WycHaTZAk92oe1m6C5ATW97Z2EyTHx0tl7SZIkqeLwdpNIHqsMKuL5urjbu0mSE7dhj7WboLkeHoord0ESWJWE1ke87owZnVhdRpwv7ooXp7ct34Qs5qqsseyE52IiKownnZGREQkbcxqIiIiaWNWWxw70YmISFIEXkWciIhI0pjVRERE0sastjxuUSIiIiIiIiIiIiKiYnAkOhERSQqvIk5ERCRtzGoiIiJpY1ZbHkeiExEREREREREREREVgyPRiYhIWgQe3yUiIpI0ZjUREZG0Mastjp3oREQkKTztjIiISNqY1URERNLGrLY8HpYgIiK6z+LFi9G4cWM4OTnByckJISEh2LZtm+nxTp06QRAEs9vEiROt2GIiIiIiIiIiqkgciU5ERNIis+7xXT8/P8ybNw916tSBKIpYtWoV+vXrh1OnTqFBgwYAgBdeeAFz5841PcfOzs5azSUiIqp8Vs5qIiIieghmtcWxE52IiOg+ffr0Mbv/wQcfYPHixThy5IipE93Ozg7e3t7WaB4RERERERERVTIeliAiIkl5cKoUS9y0Wi3S0tLMblqt9qFt0ev1WLt2LTIzMxESEmIqX716Ndzd3dGwYUOEhYUhKyurIjcJERGRpFREVhMREZHlMKstjyPRiYhIWirgtLPw8HDMmTPHrGzWrFmYPXt2kcufO3cOISEhyMnJgYODAzZv3oz69esDAIYPH44aNWrA19cXZ8+excyZMxEREYFNmzZZvN1ERESSxFPEiYiIpI1ZbXHcokRE9NgLCwtDamqq2S0sLKzY5YOCgnD69GkcPXoUkyZNwqhRo3Dx4kUAwPjx49GjRw80atQII0aMwPfff4/Nmzfj+vXrlbU6RERE/2m8CDgRERFVNo5EJyIiSRFklj9NTK1WQ61Wl3p5lUqF2rVrAwBatGiBY8eO4YsvvsDSpUsLLdu6dWsAwLVr1xAYGGiZBhMREUlYRWR1WfAi4ERERCWzdlY/jtiJTkRE9BAGg6HYOdRPnz4NAPDx8anEFhEREf138SLgREREVNnYiU5ERNIiWHemsbCwMPTs2RPVq1dHeno61qxZg3379mH79u24fv061qxZg2eeeQZubm44e/Yspk+fjg4dOqBx48ZWbTcREVGlqYCs1mq1hQ5Yl+ZMMr1ej/Xr1xd5EfAff/wR3t7e6NOnD9555x2ORiciov8OK+9XP47YiU5ERNJi5dPO4uLi8PzzzyM6OhoajQaNGzfG9u3b0a1bN0RGRmLXrl1YsGABMjMz4e/vj9DQULz99ttWbTMREVGlqoCs5kXAiYiILIjTuVgcO9GJiIjus2zZsmIf8/f3x/79+yuxNURERP8NYWFhmDFjhllZSaPQ8y8Cnpqaig0bNmDUqFHYv38/6tevj/Hjx5uWa9SoEXx8fNClSxdcv36d1y8hIiKicmEnOhERSYrA086IiIgkrSKymhcBJyIishzuV1setygRERERERFVabwIOBEREVUkjkQnIiJp4dxtRERE0mblrOZFwImIiB6C+9UWx050IiKSFEHGk6SIiIikzNpZzYuAExERlczaWf04Yic6ERERERERVRm8CDgRERFVNnaiExGRtAg87YyIiEjSmNVERETSxqy2OHaiExGRtPC0MyIiImljVhMREUkbs9riuEWJiIiIiIiIiIiIiIrBkehERCQtPO2MiIhI2pjVRERE0sastjiORCciIiIiIiIiIiIiKgZHohMRkaQInLuNiIhI0pjVRERE0sastjx2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iIrBkehERCQposALoBAREUkZs5qIiEjamNWWx5HoRERERERERERERETF4Eh0IiKSFF4AhYiISNqY1URERNLGrLY8dqITEZG08LQzIiIiaWNWExERSRuz2uJ4WIKIiIiIiIiIiIiIqBgciU5ERJLC086IiIikjVlNREQkbcxqy2MnOhERSYoInnZGREQkZcxqIiIiaWNWWx4PSxARERERERERERERFYMj0YmISFJ42hkREZG0MauJiIikjVltedyiRERERERERERERETF4Eh0IiKSFoFztxEREUkas5qIiEjamNUWx050IiKSFJEnSREREUkas5qIiEjamNWWxy1KRERERERERERERFQMdqITEZGkiIJg8VtphYeHo1WrVnB0dISnpyf69++PiIgIs2U6deoEQRDMbhMnTrT0ZiAiIpIsa2Y1ERERPRyz2vJKPZ3Lb7/9hp49e0KpVOK3334rcdm+ffs+csOIiIgq2/79+zF58mS0atUKOp0Ob775Jrp3746LFy/C3t7etNwLL7yAuXPnmu7b2dlZo7mFMKuJiIikjVlNRERUNZW6E71///6IiYkxjcwrjiAI0Ov1lmgbERH9B4mC5U+S0mq10Gq1ZmVqtRpqtdqs7M8//zS7v3LlSnh6euLEiRPo0KGDqdzOzg7e3t4Wb+ejYlYTEVFlqIis/q9gVhMRUWVgVlteqbeowWCAp6en6f/F3Rj0RET0KEQIFr+Fh4dDo9GY3cLDwx/altTUVACAq6urWfnq1avh7u6Ohg0bIiwsDFlZWRWyLcqKWU1ERJWhIrK6LKry9GvMaiIiqgzWzurHUalHoj9MSkoKnJ2dLVUdERGRxYSFhWHGjBlmZQ+OQn+QwWDAyy+/jCeffBINGzY0lQ8fPhw1atSAr68vzp49i5kzZyIiIgKbNm2qkLZbErOaiIgeB1V9+rWSMKuJiIikqVyd6B999BECAgIwZMgQAMCgQYOwceNG+Pj44I8//kCTJk0s2kgiIvrvqIjTzoqauuVhJk+ejPPnz+Pvv/82Kx8/frzp/40aNYKPjw+6dOmC69evIzAw0CLttQRmNRERVRRrnyJe1adfy8esJiKiimLtrH4clWuLLlmyBP7+/gCAnTt3YteuXfjzzz/Rs2dPvPbaaxZtIBERUWWbMmUKtmzZgr1798LPz6/EZVu3bg0AuHbtWmU0rdSY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bixKREQkaMxqIiIiYdN3Vr+Lm4CzE52IiASF66ISEREJG7OaiIhI2JjVuseNRYmIiIiIiIiIiIiIisCR6EREJCj63gCFiIiIisesJiIiEjZmte5xJDoRERERERERERERURE4Ep2IiARFzc3KiIiIBI1ZTUREJGzMat1jJzoREQmKitPOiIiIBI1ZTUREJGzMat3jci5EREREREREREREREXgSHQiIhIUtZrTzoiIiISMWU1ERCRszGrd40h0IiIiIiIiIiIiIqIicCQ6EREJipprtxEREQkas5qIiEjYmNW6x050IiISFBV3ESciIhI0ZjUREZGwMat1j8u5EBEREREREREREREVgSPRiYhIUDjtjIiISNiY1URERMLGrNY9jkQnIiIiIiIiIiIiIioCR6ITEZGgqNVcu42IiEjImNVERETCxqzWPXaiExGRoKg47YyIiEjQmNVERETCxqzWPS7nQkRERERERERERERUBI5EJyIiQeEGKERERMLGrCYiIhI2ZrXucSQ6EREREREREREREVEROBKdiIgERQ1ugEJERCRkzGoiIiJhY1brHjvRiYhIULgBChERkbAxq4mIiISNWa17XM6FiIiIiIiIiIiIiKgIHIlORESCwg1QiIiIhI1ZTUREJGzMat1jJzoREQkKw56IiEjYmNVERETCxqzWPS7nQkRERERERERERERUBI5EJyIiQVGpuYs4ERGRkDGriYiIhI1ZrXsciU5EREREREREREREVASORCciIkHh2m1ERETCxqwmIiISNma17rETnYiIBIVhT0REJGzMaiIiImFjVusel3MhIiIiIiIiIiIiIioCO9GJiEhQVGrdP17GqVOn0LVrV5QrVw4ikQi7du3Sen3w4MEQiURaj44dO+ruG0BERCRw+s5qIiIiKh6zWvfYiU5ERPSc9PR0+Pr64o8//ijynI4dOyIqKirvsWnTpjdYQyIiIiIiIiJ6k7gmeinNHm0NOyuDAsePXcnExoPpBY43qyWDXw0jlLfXvCc0WoGdJzIQHKnIO0cmBXq1NkWtSoYwMxYjLkmJo1eycPJaVtk15DVEPLqMq8dWIvbJbaSnxOKDIX/Aq2bbvNcv7F+EB9f3IjUpGgYGUjhUqAa/zv+Dk7tvqcq/cmQZzv03F7WaD0Lznt8XeF2tVuPfv4Yh9N7pAl9bXzZt3Y4z5y/g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+89Q3kbzOxMSm4i0zNLPALU2M8afw3tg0b6zGLbkHyiUKng52WDBZ13hU07/o/NLymqJnTPMOvaF2NgMysRYpB//FxmnD2iV8WJWm/hplsax+eJ7rfOSty5D1tXTAIDU/zYAajWsBn4JkUQK+f2bSN25tiybSgIkUutxPsbSpUtRoUIFfPDBB4W+/t133+Hp06dYsWLFS5X7+c9xuqjeO6d2HbuST3rPdK0YqO8qCI5D4DF9V0GQks9eKPmk94zjL2WzduLyI7ovc1jbks+hwpVVVg/9SRjrTApN7brM6hf18mRH4ousg15+34z3QfK5i/quguAwq98PZZXVADBkesnrCL9vfOvovyNRaPpUuqXvKgiSzYOz+q6C4CSfPqfvKggOs/rtodeR6F988UWxr8+aNesN1YSIiIRCJbxl/d9rzGoiInoRs1pYmNVERPQiZrXucbcaIiIiIiIiIiIiIqIi6H1jUSIioucJdNN3IiIiysWsJiIiEjZmte5xJDoRERERERERERERURE4Ep2IiASFd8yJiIiEjVlNREQkbMxq3WMnOhERCYqKYU9ERCRozGoiIiJhY1brHpdzISIiIiIiIiIiIiIqAkeiExGRoKjLZN6ZqAzKJCIiej8xq4mIiISNWa177EQnIiJB4dptREREwsasJiIiEjZmte5xORciIiIiIiIiIiIioiJwJDoREQmKSqXvGhAREVFxmNVERETCxqzWPY5EJyIiIiIiIiIiIiIqAkeiExGRoHDtNiIiImFjVhMREQkbs1r32IlORESComLYExERCRqzmoiISNiY1brH5VyIiIiIiIiIiIiIiIrAkehERCQonHZGREQkbMxqIiIiYWNW6x5HohMRERERERERERERFYEj0YmISFDUZbJ4m6gMyiQiIno/MauJiIiEjVmte+xEJyIiQeEGKERERMLGrCYiIhI2ZrXucTkXIiIiIiIiIiIiIqIicCQ6EREJCjdAISIiEjZmNRERkbAxq3WPI9GJiIiIiIiIiIiIiIrAkehERCQoKi7eRkREJGjMaiIiImFjVuseO9GJiEhQOO2MiIhI2JjVREREwsas1j0u50JEREREREREREREVASORCciIkHhHXMiIiJhY1YTEREJG7Na9zgSnYiIiIiIiIiIiIioCByJTkREgqLiLXMiIiJBY1YTEREJG7Na99iJTkREgqJW6bsGREREVBxmNRERkbAxq3WPy7kQERERERERERERERWBI9GJiEhQ1Jx2RkREJGjMaiIiImFjVuseO9GJiEhQVJx2RkREJGjMaiIiImFjVusel3MhIiIiIiIiIiIiIioCR6ITEZGgcNoZERGRsDGriYiIhI1ZrXsciU5EREREREREREREVASORCciIkFR8YY5ERGRoDGriYiIhI1ZrXvvZCe6qZlM31UQJAdr7irwIrund/VdBcFJPntB31UQpCvzLum7CoLzwS9lU65az2l/6tQpzJkzB1evXkVUVBR27tyJ7t27572uVqsxdepULF++HElJSWjSpAmWLFkCb29v/VX6LWRizqwujJ2VvmsgPFaRt/RdBcFJPndR31UQJGZ1Qe9qVtObw7wuyN5a3zUQHuuoO/qugiClnGdev4hZXRCz+u3B5VyIiIiek56eDl9fX/zxxx+Fvv7rr79i4cKFWLp0KS5evAhTU1N06NABWVlZb7imRERE76dTp06ha9euKFeuHEQiEXbt2qX1ulqtxo8//ghnZ2cYGxujbdu2ePDggX4qS0RERO8EdqITEZGgqNW6f8jlcqSkpGg95HJ5oV+/U6dOmDlzJnr06FFI3dSYP38+pkyZgm7duqFmzZpYt24dIiMjC1zAExERvavKIqtfBm94ExERFU/fWf0uYic6ERG98/z9/WFpaan18Pf3f+lygoODER0djbZt2+Yds7S0RMOGDXH+/HldVpmIiIiKwBveREREwvYuzhpjJzoREQmKSqXW+WPy5MlITk7WekyePPml6xYdHQ0AcHR01Dru6OiY9xoREdG7riyy+mVmjRWHN7yJiIjKJqtfxrs4a+yd3FiUiIjeXuoymCcmkxlBJuPGWERERLpQFlnt7z8b06dP1zo2depUTJs27aXK4Q1vIiKissnql9GpUyd06tSp0NdenDUGAOvWrYOjoyN27dqFfv36vcmqlhpHohMREZWSk5MTACAmJkbreExMTN5rRERE9PJ0NWuMiIiIysb7PmuMnehERCQoapXuH7ri4eEBJycnHD16NO9YSkoKLl68CD8/P919ISIiIgEri6yWyWSwsLDQerzKLDLe8CYiIiqbrNbVXmNv66wxLudCRET0nLS0NDx8+DDveXBwMG7cuAEbGxu4urpi/PjxmDlzJry9veHh4YEffvgB5cqVQ/fu3fVXaSIiIgKgfcO7Vq1aAPJveI8cOVK/lSMiInqLTZ48GRMmTNA69j4tm8pOdCIiEhSVntduu3LlClq1apX3/NmHhE8//RRr1qzBN998g/T0dAwfPhxJSUlo2rQpDhw4ACMjI31VmYiI6I3Sd1bzhjcREVHxyiKrZTKZTjrNn5815uzsnHc8JiYm7wa4ELETnYiIBEXfG6C0bNmy2DqIRCLMmDEDM2bMeIO1IiIiEg59ZzVveBMRERVP31ldnLd11hg70YmIiIiIiOitwRveREREwvYuzhpjJzoREQmKSiXcO+ZERETErCYiIhI6fWf1uzhrjJ3oRERERERERERERKQT7+KsMXaiExGRoAh46TYiIiICs5qIiEjomNW6x050IiISFDWniBMREQkas5qIiEjYmNW6J9Z3BYiIiIiIiIiIiIiIhIoj0YmISFBUnHdGREQkaMxqIiIiYWNW6x470YmISFA47YyIiEjYmNVERETCxqzWPS7nQkRERERERERERERUBI5EJyIiQeEdcyIiImFjVhMREQkbs1r3OBKdiIiIiIiIiIiIiKgIHIlORESCwhvmREREwsasJiIiEjZmte6xE52IiASF086IiIiEjVlNREQkbMxq3eNyLkREREREREREREREReBIdCIiEhS1mnfMiYiIhIxZTUREJGzMat3jSHQiIiIiIiIiIiIioiJwJDoREQmKimu3ERERCRqzmoiISNiY1brHTnQiIhIUTjsjIiISNmY1ERGRsDGrdY/LuRARERERERERERERFYEj0YmISFDUnHZGREQkaMxqIiIiYWNW6x5HohMRERERERERERERFYEj0YmISFB4x5yIiEjYmNVERETCxqzWPXaiExGRoKi4AQoREZGgMauJiIiEjVmte1zOhYiIiIiIiIiIiIioCByJTkREgsJpZ0RERMLGrCYiIhI2ZrXucSQ6EREREREREREREVEROBK9lEQioFNDQ9SrLIW5qQgpaWpcDMzBoUvZRb6nfzsjNKwqLXA8Kl6J2eszAABe5QzQuq4hKjiIYWkmxoo9mbj1WFFm7Xgdwfcu48z+VYgMuYPUpFj0/3IRqtZtq3XO08hHOLRlLoKDLkOlVMKhvBc+HrsAVrbliiz39qUDOLJjIZLiImDr6Ib2fb+Cj2+LvNflWek4tHUeAq8dRUZaEqztXeDX7hM0aN2vzNpaWiv3nsCxq3cQEhULmaEUvhVdMa53R7g72+edE5ecivlb9+PCnYdIz5LD3ckeQ7u0RNt61YssV6lSYemuo9h34Qbik1Nhb2WBrk3qYFjXVhCJRACAo1dvY/uJSwgMiUByeiY2TxsDH9eiv89vinGjNjBu1BoG1prvgSImHOlHdyE76CbE1naw//b3Qt+XtH4R5LcuFfqaRZ/hMK7XTOuYPOgmklbNAQCIre1g1qY7DL2qQmxuCWVKIrKun0P6sd2AUqnD1umG19fDUHnWRAQvXIu7X80q8Hr9Pcvh0LE5rvQahZh/jxZZjoGpCSrP+gqOH7aFoa0VMoLDEfLH3whbtjnvHBPPCqjyyyRYN6kLscwQsQdP4874n5D9NL5M2qYLaq7dRq9IJAI6N5Khfm5WJ6epcfFuNg4Wk9WftDdCw6qGBY5HxSsx6+90AIBXeQO0qWsIVwcDWJqJsXxPBm4+EmZWhwRdxtn9KxEVqsnqfmMXo0od7ayOjXyEw9t+Q0huVtuX88JHYxYWm9V3Lh/AsR0LkBQXARtHN7TrMxGVXsjqI9vm4t71/Kxu2HYg6rfSf1ZvPXkV205fRWR8EgDAy9kewzs3Q9PqFQEA8hwF5m4/jINX7yJboUDjKl747uOOsLUwK7LMo9fvYdvpqwgMi9Zk8Hefo3IFJ61zhs5bh6sPwrSO9W5WB1P6d9ZtA19BcVkNAGIzS5h90A+G3tUhlhlDERuF9GO7Ib99pcgypR4+MG3+ASQu7jCwsEbS2vmQ372qdY7YzAJmnfrBsFJ1iI1MkB0chNTd66CMjym7xr6iwrK60ZF1sG3RUOu80GWbcXv01CLLqbnSHxUG9dQ69vTgaVzu8rnWMYdOLVBxymhY1PCBKkuO+FOXcbX3aB21RveY1fSqRCKgs58M9asYwsJUhOQ0FS7eycGBi/Ii3/NJB2M0qlZIVscp8fO6NACarG5bTwZXR01WL9udLtisDg26jHMHVyIy5A7SkmPx0ejFqFxIVh/Z/htC7+dndd9RC2FZQlYf37Ug77q6be+J8K6Zn9XZWek48o8mqzPTkmBlp8nqei2FkNWXse3k5eey2gHDu7RA0+reAAB5Tg7mbjuEg1dua7K6akV81/+DYrM6I0uOBTuP4PiNe0hOz0R5Oyt83Koh+rSoDwBITs/Akn9P4HzgI0QnJMPazAStalXGqG6tYW5sVOZtLolxg1YwbtgaYis7AIDyaQTSj+9G9v1bAHKzuuNHkFasBrHMCIq4KGSc+A/yO0VnNUQimLbpASNfP4jNLaFKSULm9TPIOP6v1mkG9s4w69AXUg8fiMQGUDyNQPLGxVAlJ5RZe19VUdfWVo1qwWfG/2DVoCbUShVSAgJxqfNQqLIK/1tjYGYKn+nj4NitLWQOtki5cRd3JsxC8pVbWudVmvolKgztA6mVBRLPXcOtMdOQ8TC0TNv4qpjVusdO9FJqW88QTWpKseFQFqLjVajgaID+7YyQJVfjVEBOoe/ZcTILe87m/4KKxcCk/qa48SA/zA2lQEScEhfv5mBoF+Myb8fryJFnwqmCD+o264mNi74s8Hp8TBiWzxyAui16oXXPMZAZmeFpxENIpLIiywx7cB1bl0xEuz7/g0+tlrh5/j9sXDAWo2Zsh6NLJQDA/o2/4HHgRfQe8Sus7crj4e2z2LNuBsytHFClTusya29pXAsKxketG6GahwsUShUW7ziEkfNWY8fM8TCWaT7o/bBiG1IzsjD/y4GwMjPF/os3MGnJJmz4cTQquxX+IWjNvlPYfuIiZgztDa/yjrgTEo5pK/+BmbER+rdrDADIlOeglrcb2tWvgZ/W7HxjbS6JMjkBafu3QhkXDYhEMKrbFFaD/of4hVOgfBqJ2J/GaJ1v3LAVTFp0RnZQQLHlyoMCkLJ1ed5ztTL/905i7wyIREjZsQrK+BhIHF1g3msoRIYypO3dpNsGvibLejXgOqwfUm7eK/R1j3GfAqUMu6q/fQvblo1w49OvkRkaAbt2TVB90VRkRT7F0/+OwcDEGA32rULqzXu42P5TAEClaeNQf9dSnG3St9Rf501TcdoZvaJ29QzRtKYU6w9mISpBCVcHAwxob4ysbODkjcI70refyMLuM/lZbSAGvh1giuvPZbVMKkJErAoX7uRgWFeTMm/H69BkdWXUadYLmxePLfB6wtMwrJzVH3Wa90ar7mMhMy5NVl/D9qVfoU3vCfDxbYmbF/7D5kVjMGLaP3lZfXDzbAQHXkTP4b/Cyq48Ht0+i71/a7K6cm39ZrWjtTm+7N4arg42gFqNfy/cxPilW7H5u2GoWM4ev207hNO3H2LO5z1hZmyE2VsOYMJf27H268FFlpmZnY3aXhXQvk5VzNiwt8jzejatjVFd8jswjAwLDq7Qh2KzOiYCFh+NgNjYBElrfoc6IxVGtRrDcsBYJCz6EYrIwi8URYYy5ESFIfPKSVgNGl/oOZaDxgNKJZLW/g51ViZMmneC9bBvETf3WyCn6A60N624rA5bsQX3py3Me67MyCyxvKcHTuHm55Pz3yPX/nvk1KM9aiz9CUE//I744xcgkhjAvFql12hB2WNW06tqV1+GZr6G+PtAJqLilXB1NMAnHUyQma3GyetFZPXxTOw+nZX33EAMTB5ohusP8q8HNFmtxPk72Rj+oWmZt+N1ZGdnwtGlMmo17YWtfxSe1atn90ftZr3Rspsmq2Mji8/qJw+v4Z9lX6FNrwmoVLMlbl38D5sXj8GIH/+Bw7Os3jIbwfcuoufnuVl95yz2rtdktU8tPWe1lQW+7NEWrg62ANT493wAxv+5CZunfIGK5Rzw29aDOH3rPuYM76PJ6k37MGHpFqz9ZmiRZf627SAuBwXj5yE9Uc7WCufvPoL/pr2wtzJHS9/KiE1KRWxyKib0ag/PcvaIik/CzA3/ITY5Fb+N+OjNNb4IypREpB3clnej2ahOU1gOGIeEP36E8mkkLHoPg8jYBMnr50OVngYj30aw6DcKiX9OgyIqrNAyTZp/AOMGrZDyzwooYiIgLe8O815Doc7KQOb5IwAAAxt7WA//HplXTiH96E6o5ZkwcCgPtaLwfi99KiqvrRrVQoP/VuDRL3/hzvifoFYoYVGzMqBSFVlWzb9mwryaNwIGf4OsqKco3/9DNDywGidrdoY88ikAwHPiMLiPGYiAId8iIyQclaaNQ8O9K3GyZmeo5EUP2tEXZrXusRO9lDycDXD7sQJ3QzSjWhNSFajro4CbkwFQRCd6VjaQlZ3/Q1vDUwJjI+Di3fzzA0OVCAwV3kjZwlTybY5Kvs2LfP3IP/NRybc5On70dd4xW0fXYss8d2gdvGs0RbPOmvBr22scHt45hwtHNqLb4GkAgLCH11G7aTd4VmkAAKjfqi8uH9+C8Mc39d6J/seEz7SeTx/SC23Gz8LdkAjU9fEAAAQ8DMN3A7uhumcFAMCwrq2x4dBZ3A2NKLITPeBhKFrUqoJmvpUBAOXsrHHg4k3cCQ7PO6dL49oAgMi4RJ2363VkB17Xep5+cDtMGrWB1LUilDERUKUla70uq1YX8puXoM4u/uJZrVAUeG/e17x/K++OPAAoE2JhcGofjBu1EVQnuoGpCWqtnYObX0yB93cjC7xu4VsZHuOH4GyjXmgbfrbE8qwb1Ub437uQcEozgv/Jiq1wG/YRrOrXxNP/jsG6cR2YuJfHmfrdoUjVjKgNGDIJ7WMvw7ZVI8QfO6/bBhLpmYezAW49UuBOiKYDPCElN6sdi1697sWsruklgbGRCBfu5H8QvhuiwN0QYY5me5F3zebwrll0Vh/9Zz68a7ZA+775WW3jUHxWXzj8NyrWaIqmnTRZ3abnODy+cw6Xjm5A10+nAwCePLwB3ybd4VFZM0q3XsuPcOXEFkQ8vqn3TvQWNbU7I8d2a4Vtp67iVnA4HK3NsfPcDfgP6YEGlTW5PX1QV/SYvhQ3H4ejpqdLoWV2aVgTABCRO2KuKEZSKewsix4lpy8lZbXUzRupO9dAEf5Y8/qx3TBp2gHS8u5FdqJnB93MG8leGAM7Jxi6eSNu3rdQxkQAAFJ3roHRlMUwrtUImZdP6qh1r6ekrFZmZEEeE/dSZark2UW+R2RggKrzvse9b+fgyertecfTAh+9XMWJ3hKe5Qxw85ECd4Lzs7pe5dzr6iIUldXnb7+lWV2jObxrFJ3Vx3bMh3eNFmjXp/RZffHI36hYvSmadNRkdese4/D47jlcOrYBXQY9l9WNu8M9N6vrtvgIV09qslrfnegtfH20no/t3gbbTl7GrcfhcLS2wM6z1+A/tBcaVPYEAEwf3A09pv6Bm4+foGbudfaLAh4/QVe/Wqife13eu3k9/HP6Km4HR6Clb2VULO+IuV/kd5ZXsLfBmO5t8P2qHVAolZAYFP0z+SZk37uh9Tz98D8wbtAK0goVoXwaCYlrRaT9uw6K8GAAQMaJPTBp0gGS8u5FdqJLXStCHng9bwCbPCkOspqNIHXxxLNbwqbteiM76CbSD27Ne58yIVbn7XtdxeV11d8mI2Tx33g0J38QXvr94CLLEhvJ4NSzPa72HIWEM5qR/A9+WgzHLq3gNqI/7k+dDwDw+HIQHs5agpg9mtniAZ99g7YR5+DYrS2itu7TcQtJiAS3JrpQpxsERynhXUECeyvNUhrl7MTwLGfwUkHdqJoU98OUSEwVZhtfh0qlQlDASdg5uWPNnM/hP6YJlk7/CHevHin2fU8eBsCrmp/WMe/qTfHk4Y28564Va+Pe9eNISYiBWq3G48CLiIsJQcXqTcqiKa8lLVPTEWxpmj+rwLeiKw5duonktAyoVCocuBgAeY4C9Xw8iyzHt6IbLgU+Qmi05oIrKCwKNx6EoEkNYY9KKkAkgsy3kWZ0WuiDAi9LyrtDWt69VBfOhp6VYf/DH7Cd+CvMuw+GyKT4TgmRkQnUmWmvXPWyUH3Rj3i6/2ShnddiYyPUWjcXd76cUeqL88QL1+HYtTVk5RwAALYtGsLU2wNxh89oypQZQq1Wa90VV2XJoVapYNOkrg5aVDbUKrXOH6RbQs7qSq4S2FtpPt6Uf8WsDnqHs/r+zROwdXLHut+G4tcvG2PZT30ReK34rA5/dAOeVRtrHfOq3gRPHt3Ie16hYi0EXT+GlERNVgcHXkB8TAi8BJbVSpUKBy7fQWZ2Dmp6uiAwNAoKpQoNczvQAcDDyQ7ONhYICI547a+3//JttJw4F71m/IWFu44hM1t4o7gKy+qc0Acw8m0IkbFp/utSQ2Q/Dnz1LyPJHbuT89z3QK2GWpEDqbtP4W/Sg+KyGgDKfdwV7aIuoPn1PfCZOQHiUkz5t23RAG0jzqHF7QOovngapDZWea9Z1KkKYxcnqFUqNL28E23CTqP+nuUwq+atqyaVCWb120GIef04UgmfChI4vJjVwaXPar/qhggKVbyTWa1WqfDg5gnYOLlj/byhmDO+MVbM7It7JWT1k8KyuloThL+Q1fdvPJfV9y4gPjoEXtWEmNW3nsvqSE1WV8m/fvZwsoezjSUCHocXWY6vZwWcCAhCTGIK1Go1LgcFIzQmHn5VvYp8T1pmFsyMZHrvQC9AJIKsRkNNVoc9BAAowh5CVqNBflbXaAiRRIqcx4XPeAaAnLCHMPSqCgNbRwCAxKkCDN29IX82IE0kgqFPTSjio2E5+CvYTV4I6y9+gGGVOmXexJdVVF4b2tvAumEtZMfGo/GpTWgbfhaNjv4N62Kuf0USCcQSCZQvLPWizJTDpomm7cYeLjBydkDcsXN5rytS0pB0KQDWjWrrsGW6w6zWPcGNRJfJZAgICECVKlVKdb5cLodcrv2DrlBkQyIpeqrTqzhyORtGhsB3g0yhVgEiMbD3XDauBpUu7C1MRajiboB1B7JKPvktlJ4Sj+ysDJz6bwXa9voSHfp+hfu3zmDToi8x5Ns18KjcoND3pSXHwdTCTuuYmaUtUpPzOxG7DJyCXat/xK//awmxgQQikQjdP5sBj8r1y7JJL02lUuG3Tf+hVkU3VHTJXxf115EfY9KSzWj55UxIDMQwMpRi3phP4OpoW2RZn3VujrTMLPT4/ncYiEVQqtQY3bMdOvvVegMteX0SJxdYj5oKkUQKdXYWktYtgPJpZIHzjOu3gCImotAO9ufJ79+E/PZlKBNjYWDjCLOOfWA9ZCIS/phe6JIkBrYOMGnSTlCj0J37doZF7ao426h3oa9XnTsZiReu593VLo07435CjaU/oW3oaahycqBWqXHriyl5d8+TLt6AMj0Tlf2/xr0p8yASiVB51lcQSySQPbduv9AI8YKPtOkiq5UKOQx0nNWHL2fDyFCEKZ/mZ/V/5+S48hJZXdVdgrX7S16e4W2UnqrJ6jN7l6N1z3Fo13ciHt46jS2Lx2LwN2vhXkxWm1loZ5aZpR3SnsvqzgN+wL9rfsDcCS3ysvrDwT/B3UcYWf0g4ikGzVmN7BwFjGWGmDeiD7yc7RH0JAZSiQEsTLQ7Qm3MzRCf8no3YjvVr45ytpawtzTH/YgYLNh5DCEx8Zg3os9rlasrxWV18obFsBwwGg7TlkKtVECdk42kdfOhjH/6yl9P8TQKysQ4mHXqi5Qdq6DOlsOkaUcYWNlCbGGpq2a9lpKyOmLzf8gMjYQ86inMa/ig8qyJMKvkgat9Cy7H8EzswdOI3nkYmSHhMPGsAJ+fJqDBf8txtulHgEoFEw/NCErvH8Yg8OvZyAiNgOf4z+B35G+cqNoBOYmFz8LTN2b120GIeX34khxGhsCUz8zys/qMHFfule4mo6WpCFU9JFiz7x3OankGzu5bjlY9xqFt74l4ePs0tvw5Fp9+vRbuPsVdV7+Q1RZ2SEvJz+pO/X/Af+t+wO8T87O666c/wU0wWR2DQb+syM/qLz6CVzkHBIVH52a19vK3NhamiE8uOqu/7dcZM9bvQYdv50EiFkMkFuHHT7qibiX3Qs9PTEvH8r2n0LOZcAYbGTi6wHrElNysliN5wyIoY3OzevOfsOg3EvZT/sjL6uQNC6FMKDqrM07thUhmDJvx/nj2C5h++B/IAzQd0WJTC4hlxjBt/gHSDv+D9IPbYOhdA5b9xyBp5S/ICQl6I+0uSXF5beL5XK5O+hUpAYEo/0l3NDy4BqdqdSl0/XJlWjoSz1+D9/ejkHbvMeQxcSjfrwusG9VC+kPNqH4jJ831szxGe28xeUw8ZI52BcoUAma17umtE33ChAmFHlcqlZg9ezZsbTUBMG/evGLL8ff3x/Tp07WONejwLRp1+k43Fc1Vq5IEdX2kWHdAsyZ6eXsxejY3QnK6CpcDS744b1BFiky5GrcEurnJ63r2y1mlTms06TgYAODsVgVPHlzHpWNbiuxEL40Lh9cj/FEAPhn/J6xsyyEk6Ar2/P0TzK0dULFa45ILeEP81/+LhxExWD15hNbxP3YeRmpGJpZOHAIrM1OcuH4X3yzZhFWTh8PbxanQsg5dvoX9FwIwa3hfeJV3RFBYFH7b9B/srSzwYRPh3QV+kSI2CgkLvofIyARGNRrAsu9wJPz1s3ZHukQKo1p+SD+6u8Ty5AEX8suODociOgx2k+bB0LMKsh/d1TpXbGENqyHfQH7zEjIvndBVk16LkYsTqs37Hhc7DSl0rTSHLq1h17IRTtfv8VLluo8eCKsGtXC5+xfIDIuETbN6qL5QsyZ6/LHzyI5LxLV+41B98TS4jxkItUqFyC17kXztNsC7yFQKZZnV9Tt8i4YdJxfxjldTu5IE9SpLsXZ/JqLiVXCxN0CvFjIkp6lxKbDki/OGVTVZLdSNyF6XOncdyMq1W6Nxh8EAAGfXKnjy8Doun9hcZCd6aVw88jfCHweg/7g/YWlbHqFBl/PWWfUSQFa7O9piy3fDkJYpx5Hrgfhx7b9YMWFgmX7N3s3y89q7vAPsLcwwfMEGPIlNQAV7mzL92qVRXFabte8FsZEpEpf5Q5WRBlm1urAcMAaJS2dCEV30qL9iqZRI+nsBLHp/Dodpf0GtVCL74R3I7wUAIt227VWUlNWAZtm0Z1Jv34c8KhaNDq+FiWcFZDx+Uuh7np/enXr7PlJuBaH1/aOwbdFAs/65WDMa9+HspYjeeQgAcPPzyWgdcgrOvTsibPkWXTWR3mFlmtftJ6FBB93ldR0fKepXMcTafZo10cvbG6B3S8119fPLnhalYVVDTVY/FODMHh14ltU+tVvDr/1gAIBTblZfPbG5yE700rh09G+EPwpAv7F/wsq2PELvX8a+3Kx+cRS7Prg72mLLlC80WX3tLn5cswsrvhr8yuVtOn4Rt4LDsWDUx3C2tcS1B6Hw37QP9lbmaFRFezR6WmYWxi7aCE9ne3zRteXrNUSHlHFRSFz8I0RGxpBVrw+L3p8jcflsKGMjYdq2J8RGJkhc+QvUGWkwrFoHFv1GI3H5LChjCs9qWfUGMPJthJStf0HxNAJSZ1eYfdAfqtQkZF0/q9n5F4A88Boyz2kySREVBqlrRRg3aCWITvSS8vpZroYt34LwtTsAACk3AmHX2g8VBvdC0JTC/w7eGPwNai6fhbZhp6FSKJBy/S4it+yFZe1qZdcYeuvorRN9/vz58PX1hZWVldZxtVqNwMBAmJqaQiQq+RP15MmTC3xomLxc9wv6d2sqw5Er2bh+X3NhHRWvgo15NtrVMyxVJ3qjalJcuaeAsuh9DN5qJuZWEBtIYF9OO4zsy3ki9P61It9nZmmH9BTtpSvSkuNhbqm5k5eTnYXD2+ej/5cL4VOrJQDAydUHUWGBOLt/tWA60Wev/xenA4Kw8tthcLTJH0315Gk8thy9gO0/jYNXec2UKR9XZ1y7H4Itxy5gyqDuhZY3f+sBfNa5OTo29AUAeLs4ISo+Eav3nngrOtGhVOaNVkuLCIHExQMmTTsgdcfqvFOMajSASCpD5rUzL198QixUaSkwsHMEnutEF5tbwXr4ZOSEPkDKjlWv3w4dsaxTDTJHOzS9tCPvmFgigU2z+nAbNQBhf22CiZcr2sdd1npf3a2LkHDmCi60HVSgTLGRDD4z/4ervcfg6X7Ncjipt4Jg4VsFnhOG5k1riztyFicqt4PU1hpqhQKK5FS0eXIGGY+Fu2abupgNX+jNKsus/naZ7jcR7N7MCIcvy3Ht+ay2EKF9fcNSdaI3qirF5cCcdzirrXOzuqLWcTtnL4Q9uFrk+8ws7ZCWoj3qJi05DmbPZfXRf+aj39hFqOTbEgDgVMEH0WH3cO7AKkF0okslBpqNRQFUdXPGnZBIbDx2CR3qVkWOQomUjCyt0egJqWmwtdDtWuY1PMoDAJ7EJgqiE72orM44sRcmTdprrV2uiAqD1L0SjP3aInXnmlf+koqIECQsmAKRkTFgIIE6PRU2o6chJ7zodUrflJKyer9pjQIbkiVd0qwpa+LlVmQn+osyg8Mhj02AaUU3xB+/AHmUZp3Z59dAV2XnICP4CYwrOL9us8oMs1pYyjKvJy3V7Uzq7s2NcPiSHFeDNLkcGaeCjYUY7RrIStWJ3qi6FJfuvgdZ7Vwwq588LD6r01/M6pQ4mFk8l9U75uOj0flZ7VjBB9FP7uHcwVWC6ESXSiS5G4sCVd3K4U5IBDYeu4gO9arlZnWm1mj0hJR02Bax70hWdg4W7TqKeSP7oXnukqiVXJwQ9CQa6w6d0+pET8+SY9TC9TA1MsS8kR9BKqSlXJTKvJHlishQSMt7wKRxO2Sc3gcTv7aIX/Bd3kA1RfQTGLpVgkmjNkjdvbbQ4sw69kXGqX2Q37qoKT4mHGIrW5i06IKs62ehykiFWqmA4oVZ5IrYSEjdhLG0bEl5fbJaRwAF9xZJC3wEY9fC96QDgIzHT3ChzUAYmBhDYmEGeXQsam/4HRnBmnzPitbktczRFvLo/DXiZY62SAkoegkdfWJW657eOtFnzZqFZcuWYe7cuWjdOn8TC6lUijVr1qBq1aqlKkcmk0Em055eJpGk6rSuAGAoERVYNUKlRqk+jFQsbwB7KzEu3Hk375YDgERiiPIe1REXrX0RFBcdAiu7ov9QVajoi0d3L6Bxh0/zjj28cw4VKtYCACiVCiiVORCJtJfvF4kNoBLAHwS1Wo1fNuzBsWt3sXzS5yj/wkVxVu7apy/+nBiIxcWuJ5WVnQ2RWPs9YrEYqrd0Oo5IJIbIQKp1zLh+C8gDr0Gd/vK/r2JLa4hMzKBKSco/ZmEN6+GToYgIQcq2ZYUu86Ivcccu4GStLlrHfFf4Iy3oMR7NWY6cuESEvjDSrMWN/3B3oj9i/jteaJliqQRiQ8MCP0dqpbLAzw4A5MRrNqC1bdkIMgdbxPx37HWaRO+JssxqA0mKTusKAIYS4MXffE1Wl/zeii4GcLA2wIr/3s3p4UBuVrsXzOr4mBBY2Rad1S5etfD47nn4tc/P6sd3zqGCVy0AxWW1GGq1/rO6MCq1GtkKJaq4OUNiIMale8FoW0ez3EFIdDyiElLgm9vprSv3wmMAAHY67pzXlWdZLTI01Bx4MUefrbugA+osze+Zga0jJC4eSDu0vYR3lL2SsvrFDnQAsKil+Zl5/mK6JEblHWFoa4Ws3M7z5Gu3ocySw6ySBxLPajrIRBIJTNzK40lYwaXwiApTtnmt28/UhpKCEyLVKqCQj68FeOdm9fnbGTqtk5AYSAxRzr064l/I6oSYEFgWk9UVvGohOPA8GrV7LqvvnoNLblarlAqolDl5o3SfEYnFgu1o02S1AlXcyj2X1Zqf5ZDoOEQlJMO3iA3AFUolFEoVxKLir6nTMrMwasF6SKUGmD/6Y8ik0heLEhaRCJBIAWnu7+kLWa1Wq4r94CsylGl+4Z6neu49SiUU4cGQ2GnfxJXYOUGV9HKbapeVkvI64/ETZEXEwLSSh9Y5ppXcEXvgVInlKzMyoczIhMTKAvbtmyJw8hwAmpvgWVFPYdvKL6/TXGJuCqsGvgj9SzjLyFLZ0tvGot9++y22bNmCkSNHYuLEicjJEXYH8+1gBdrXN0RVdwPYmItQ00uCVrWluPkov95dGhtiQPuCmws1qiZFSJQSUfEFw8lQqtlMpbyd5p/C1lKE8nZiWJsLYF7rC+RZ6YgKDURUqGZTqcTYcESFBiIpXvMBv1mnIbh98QAun9iK+JhQXDi8AUE3TqBBm4/zytj+1yQc2po/faZx+0F4cOsMzuxfjdjIxzi6czEig++gUdv+AAAjYzO4V66PA1vm4HHgJSTEhuPa6Z24cXY3qtZt+wZbXzj/9f9i7/kbmDWiL0yNZIhLTkVccmpe57m7kz0qONhi5rpduP34CZ48jce6A6dx4e5DtKyT/2F2xJwV2Hw0f0OM5rWqYOV/J3A64B4i4xJx7OodrD94Bq3r5E8lSk7LQFBYJB5Fau5Mh0THISgsEnHJur+J9DLMOvaF1MMHYms7SJxcNM89KyPrRv4GHAa2DpB6+BS53IrtV79AVk2zFp3IUAazzv0gdfWC2NoOhl5VYTXof1DGx+RtgCK2sIb1iO+gTIpH6t5NmrXczCwhNhPGGqvKtHSk3Xmg9VCmZyAnPglpdx5AHhNX4HUAyAyLRGZI/lS8Frf2w7Gb5udekZqO+JMXUWX217Bp3gDG7i5wGdQDLp90R/Tu/I2HXD7tCauGvjDxrIDy/T9Enc3zEbxgTbG7k+ubSqXW+YNezduZ1TJUc5fAxuJZVhsi4LnlWbo2kWFgIVntV02K4ChF0VltL0Z5+9ysttD8v2CzOiwQUWHPZXVYflY36TQUdy7tx5WTmqy+eGQ97t84jvqt++eVsWP5JBzeNjfveaN2A/Hw9hmcPbAKsVGPcXzXIkSG3EGDNgMA5Ga1T30c2joHwfcuIjE2HNfP7EDAud2oXKfdG2x94RbuOoarD0IREZ+EBxFPsXDXMVx5EIrODarD3NgIPRrXwtx/DuNyUAjuhkbhx7/3oKanC2o+d2HefdoSHLuRP8ooOT0T955E+VCP4AABAABJREFU43GU5oIyNCYe955EIy53bdYnsQlYtu807oZGISI+CScC7uOHNbtR19sVlVwc3+w3oBDFZbXiaRQUcdGw6PEZJC6eMLBxgEmzTjCsWB3yO/mjIK2GfQtjv/zPYiJDGSTOrpA4uwIADGzsIXF2hdgqf41eWY0GkHpWhoGNPWRV68D680mQ37mK7Ae331zji1BSVpt4VkDF70bBok41GLuVh0OX1vBd9QviT11C6q386e3PZ7WBqQkqz/4GVg19YexWHratGqHejj+R/jAUcYdOA9DkediyzfD+cSzs2jaBaSUPVP9jGgAgavuBN/59KC1mtbC8TXl967ECHRrKUM0jN6srStCqriECHuZn9YdNZRjY0bjAe/2qG5Y+qy2Fm9XZWemIDgtE9LOsjgtHdFggknOzunHHobh9eT+untyKhJhQXDq6HkEBx1G/VX5W71wxCUf+yc/qhm01WX3u4CrERT3Gid25Wd1ak9UyYzO4+dTH4a1zEJKb1TfO7MBNoWT1ziO4ej8EEXGJeBARg4U7j+DK/RB0blBTk9VN6mDutoO4HBSMu6GR+HHtrtysrpBXRvcfF+HYdc331MzYCHUrueH3fw7hclAwIuISsfvcdfx3IQCta2tugKZlZmHkgr+RmZ2NaYO6IT1Tnnc9rxTAjQXT9r0hda8EsZUdDBxdNM89KiPrxnkoYzVZbd5tMCQuHjCwsYdxk44w9KoG+d38lQCshnwD40Zt8p7L792AScuuMPTxhdjKDoZV68CkaQfI7+bne/qZ/ZDVaACjei1gYOMA40ZtYOhTC5kXhTEIq6S8BoBH81bCfcxAOPXsABMvV1SaNg5mPp54sjr/pn3Dg2vgNmpA3nO7dk1h374ZjN1dYNemMRodWYe0oMcIX5M/4j144Tp4fzcSDl1aw7x6Jfiu/hXyyKeI2V38xr/6wqzWPb1uLFq/fn1cvXoVo0ePRr169bBhw4ZSjezWh39OZKGznwx9WhnBzESElDQ1zt7OwcGL+UvHWJgWDGkjQ8C3ogQ7ThY+bd3VwQBje5vkPe/RXHNhf/FuDjYeFtYmpBHBd7Bqdv6d7f2bfgEA1G7aHb2G+aNqvXb4cPBUnPpvGfaunwU7Zw98PHYB3Cvlb8yRlBCldffb1bs2+n4xB0f+WYDD23+HraMb+o9bBEeX/KlCH42ci0Pbfse2pV8jMz0ZVnbl0K73eDRo3e8NtLp4245rpkEN+2WF1vHpQ3rhw6Z1IZUYYNH/PsXC7QcxbuE6ZGRlo4KDLWYM7Y1mNX3yzn/yNAFJqel5zyf174o/dx7GrPX/IjElDfZWFujdsgGGf5g/suTkjUBMXfVP3vNvl24GAIz4sDW+6K6/GwxiMwtY9h0BsYUV1FmZyIkKQ9KqOVoXyMb1WkCVklDkRbPEoRxERprfC7VKBYlzBRjXbQaRkQlUKYmQP7iN9EPbAaXmw7ahd3VI7JwgsXOC/fcLtcqKmVS2a96+SWaVPSG1NM97fn3ABPj8PAG11/0GqY0lMkMjEfTj7wh77k64aSUP+MycAEMbS2SERODh7KUInr9GD7UvPW6AIixvU1ZvO56FDxrL0Le1JquT09Q4eysHBy7mZ7ClqQjWFtpjCIwMgVoVpfjnZOG56+pogHG9TfOe92zxLKuzsf6QsLI6MuQ21vySn9UHN88GANRq0h09Pp+NKnXbocugaTi9dxn2b/gZdk4e+Gj0Qrg9l9XJ8ZFa/8au3nXQe8RvOLpjPo7+8ztsHd3Rb+xirazuPXIejmyfh3/+ys1q23Jo02s86rfSf1YnpKZjypp/EZeSBjMjGSqVd8CfY/vDr4onAGBin/YQiUT4atl2ZCuUaFzVE9/166RVRkhMPFIz83+OTty8j6nr9uQ9n7RyJwBgxAfNMLJLC0gNDHDxXjA2HLuETHk2HK0t0KZ2FQzr1PQNtLhkJWV10qrfYNbpI1gNngCxzAiKuBikbF2G7KCAvDIkNg7IMc3PJImLB2xGfJ/33Lyr5sI088ppzQwxaJZdM+/SH2IzS6hSk5B57QzSj+56Ay1+farsHNi18YPHl4NgYGqCrCdRiN55CA9n/al13vNZrVYqYVGjElwGdofUyhxZkU8Rd+QsgqYugCo7v5MzcNKvUCsUqLXmV4iNjZB0KQAX2n8KRZLuZ+zoCrNaeN6WvN52LBNdmhjhozbGuVmtwtmb2dh/If9vrIWpGDbmhWS1txTbTxQ+Y8zN0QDj+ubP9OnVUtMJf+FONtYfFNYss8iQ21g7Jz+rD23RZLVv4+7oPnQ2qtRphy4Dp+HMvmU4sOln2Dp5oO+ohXD1fi6rE7SzukLFOug57Dcc3zkfx3b8DhsHd/QbsxgOz2f1iHk4+s887FiuyWpL23Jo3WM86rUUSlbvRFxyGsyMZahU3hF/fjkQflU1y65M7NtBk9VLt+RmtRe+6/+BVhmarM7/XPbL572xcOdRfLdqB1LSM+FsY4kx3VqjT/N6AIDAsCjcCtYsW9Z1ivY15N6fx6G8nXVZNrlEYlMLWPQeDrG5JdRZmVBEP0HSmrnIeXQHAJC87neYtu8Dq4HjITI0giI+Bqn/rED2/Zt5ZRjYOEBskp/VaXvWw7RtT5h3HQixmQVUKUnIvHQC6cfz9ynLvnsNqf+uhUnzD2DQZQAUcdFI3rQYOaEP3lzjX1PIwrUwkBmi6m+TIbWxROrNe7jYaYjW0msmnhVgaJv/byy1NIfPzAkwcnFCTkISonceQtAPv0OtyL/B9/i35ZCYGqPGkhmQWlkg8exVXOryeZF7qegbs1r3RGqBfFc3b96M8ePHIzY2Frdu3Sr1lLPCjFug35G4QtW0oWnJJ71nPlDu1HcVBCf13136roIgXZl3Sd9VEJwPcspmY5m+X4XovMytc911Xub7SJdZPXa+cDuH9KlJA/OST3rPdMtar+8qCE7KwUP6roIgMasLYla/n3SZ12PmJeuwZu+Gxg0s9F0Fwemh2KzvKghS6uGD+q6C4Fz+9XzJJ71nmNVvD70t5/Kifv364cqVK9ixYwfc3Nz0XR0iItITtUqt88fLmDZtGkQikdajcuXKZdTatwuzmoiIAP1nNRWPeU1ERMxq3dPrci4vcnFxgYtL4RtDEBERvSnVqlXDkSP5a9tJJIKKS71iVhMRkb5NmzYN06dP1zrm4+ODe/fuFfGO9w/zmoiISLfYK0BERIIihDvcEokETk5O+q4GERGRIAkhq3nDm4iIqGhCyOp3DT9pEBGRoKjUKp2XKZfLIZdrb/Ask8kgk8kKPf/BgwcoV64cjIyM4OfnB39/f7i6uuq8XkRERG8jIWQ1b3gTEREVrSyy+n0nmDXRiYiIyoq/vz8sLS21Hv7+/oWe27BhQ6xZswYHDhzAkiVLEBwcjGbNmiE1lZtWExERlZWXyWog/4a3p6cnBgwYgLCwsDdYWyIiInrfcCQ6EREJSllMO5s8eTImTJigdayokW2dOnXK+/+aNWuiYcOGcHNzw9atWzF06FCd142IiOhto++sfnbD28fHB1FRUZg+fTqaNWuG27dvw9zcXOd1IyIiettwORfdYyc6ERG984qbDl4SKysrVKpUCQ8fPtRxrYiIiOiZl8lq3vAmIiKiN42d6EREJChCu2OelpaGR48eYeDAgfquChERkSAILat5w5uIiEib0LL6XcA10YmISFDUarXOHy9j4sSJOHnyJEJCQnDu3Dn06NEDBgYG+Pjjj8uoxURERG8XfWf1i57d8HZ2dtZRC4mIiN5uQsvqdwFHohMRET0nPDwcH3/8MeLj42Fvb4+mTZviwoULsLe313fViIiICJob3l27doWbmxsiIyMxdepU3vAmIiKiMsVOdCIiEhSVSqXXr79582a9fn0iIiKh03dW84Y3ERFR8fSd1e8idqITERERERHRW4M3vImIiOhNYyc6EREJCjdAISIiEjZmNRERkbAxq3WPnehERCQoajWnnREREQkZs5qIiEjYmNW6J9Z3BYiIiIiIiIiIiIiIhIoj0YmISFA47YyIiEjYmNVERETCxqzWPY5EJyIiIiIiIiIiIiIqAkeiExGRoPyfvfsOj6pY3Dj+7qb3DgkQeicEBBRDlyoCgqCgooBiBxSwxmvBdoPlqqiAiID8vCo28KqIoEiRpkhHIPQektACJKTu+f0RWVhSIGHDnsD38zz7wM6encyZ3eybnTNnDkfMAQAwN7IaAABzI6udj0F0AICp2LgACgAApkZWAwBgbmS187GcCwAAAAAAAAAARWAmOgDAVDjtDAAAcyOrAQAwN7La+RhEBwCYimHjtDMAAMyMrAYAwNzIaudjORcAAAAAAAAAAIrATHQAgKlw2hkAAOZGVgMAYG5ktfMxEx0AAAAAAAAAgCIwEx0AYCqGwdptAACYGVkNAIC5kdXOxyA6AMBUbJx2BgCAqZHVAACYG1ntfCznAgAAAAAAAABAEZiJDgAwFcPGaWcAAJgZWQ0AgLmR1c7HTHQAAAAAAAAAAIrATHQAgKkYrN0GAICpkdUAAJgbWe18DKIDAEyFq4gDAGBuZDUAAOZGVjsfy7kAAAAAAAAAAFAEZqIDAEyF084AADA3shoAAHMjq52PmegAAAAAAAAAABSBmegAAFMxbKzdBgCAmZHVAACYG1ntfBbDMJjfX0aysrKUkJCg+Ph4eXl5ubo5pkCfFI5+KYg+KYg+AZyP36uC6JPC0S8F0ScF0SeA8/F7VTj6pSD6pCD6pHD0C0qDQfQydOLECQUFBSktLU2BgYGubo4p0CeFo18Kok8Kok8A5+P3qiD6pHD0S0H0SUH0CeB8/F4Vjn4piD4piD4pHP2C0mBNdAAAAAAAAAAAisAgOgAAAAAAAAAARWAQHQAAAAAAAACAIjCIXoa8vLz04osvcpGCc9AnhaNfCqJPCqJPAOfj96og+qRw9EtB9ElB9AngfPxeFY5+KYg+KYg+KRz9gtLgwqIAAAAAAAAAABSBmegAAAAAAAAAABSBQXQAAAAAAAAAAIrAIDoAAAAAAAAAAEVgEB0AAAAAAAAAgCIwiA4AAAAAAAAAQBEYRC8j48ePV/Xq1eXt7a2WLVvqzz//dHWTXGrx4sXq1auXKlWqJIvFou+++87VTXK5hIQEXXvttQoICFCFChXUp08fJSYmurpZLjdx4kTFxsYqMDBQgYGBiouL05w5c1zdLFMZO3asLBaLRo4c6eqmAOUeee2IvHZEVheOrL4wshpwHrLaEVldEHldEFl9YWQ1SopB9DLw5ZdfavTo0XrxxRe1evVqNWnSRN26dVNKSoqrm+Yy6enpatKkicaPH+/qppjGokWLNGzYMK1YsUK//PKLcnJy1LVrV6Wnp7u6aS5VpUoVjR07VqtWrdJff/2ljh07qnfv3vr7779d3TRTWLlypSZNmqTY2FhXNwUo98jrgshrR2R14cjq4pHVgPOQ1QWR1QWR1wWR1cUjq1EaFsMwDFc34krTsmVLXXvttfrggw8kSTabTdHR0RoxYoSeeeYZF7fO9SwWi2bNmqU+ffq4uimmkpqaqgoVKmjRokVq166dq5tjKqGhoXrzzTc1dOhQVzfFpU6dOqVmzZppwoQJevXVV9W0aVO9++67rm4WUG6R18Ujrwsiq4tGVucjqwHnIquLR1YXjrwuHFmdj6xGaTET3cmys7O1atUqde7c2V5mtVrVuXNnLV++3IUtg9mlpaVJyg825MvLy9OMGTOUnp6uuLg4VzfH5YYNG6YePXo4fL4AKB3yGqVBVhdEVjsiqwHnIatRWuS1I7LaEVmN0nJ3dQOuNIcPH1ZeXp4qVqzoUF6xYkVt2bLFRa2C2dlsNo0cOVKtW7dWTEyMq5vjchs2bFBcXJwyMzPl7++vWbNmqWHDhq5ulkvNmDFDq1ev1sqVK13dFOCKQF6jpMhqR2R1QWQ14FxkNUqDvD6LrC6IrMalYBAdMIFhw4Zp48aNWrJkiaubYgr16tXT2rVrlZaWpm+++UaDBw/WokWLrtrA37dvnx577DH98ssv8vb2dnVzAOCqRFY7IqsdkdUAYA7k9VlktSOyGpeKQXQnCw8Pl5ubm5KTkx3Kk5OTFRkZ6aJWwcyGDx+uH3/8UYsXL1aVKlVc3RxT8PT0VO3atSVJzZs318qVKzVu3DhNmjTJxS1zjVWrViklJUXNmjWzl+Xl5Wnx4sX64IMPlJWVJTc3Nxe2ECh/yGuUBFldEFntiKwGnI+sRkmR147IakdkNS4Va6I7maenp5o3b6758+fby2w2m+bPn8/aU3BgGIaGDx+uWbNm6bffflONGjVc3STTstlsysrKcnUzXKZTp07asGGD1q5da7+1aNFCAwcO1Nq1awl6oBTIa1wMsvrikdVkNeBsZDUuFnl9cchqshqXhpnoZWD06NEaPHiwWrRooeuuu07vvvuu0tPTdc8997i6aS5z6tQpbd++3X5/165dWrt2rUJDQ1W1alUXtsx1hg0bps8//1z/+9//FBAQoEOHDkmSgoKC5OPj4+LWuU58fLy6d++uqlWr6uTJk/r888+1cOFCzZ0719VNc5mAgIAC6/n5+fkpLCzsql/nD7gU5HVB5LUjsrpwZHVBZDVQNsjqgsjqgsjrgsjqgshqXCoG0cvAgAEDlJqaqhdeeEGHDh1S06ZN9fPPPxe4IMrV5K+//tINN9xgvz969GhJ0uDBg/XJJ5+4qFWuNXHiRElShw4dHMqnTZumIUOGXP4GmURKSooGDRqkpKQkBQUFKTY2VnPnzlWXLl1c3TQAVxjyuiDy2hFZXTiyGsDlQlYXRFYXRF4XRFYDzmcxDMNwdSMAAAAAAAAAADAj1kQHAAAAAAAAAKAIDKIDAAAAAAAAAFAEBtEBAAAAAAAAACgCg+gAAAAAAAAAABSBQXQAAAAAAAAAAIrAIDoAAAAAAAAAAEVgEB0AAAAAAAAAgCIwiA4AAAAAAAAAQBEYRAeuQBaLRd99952rmwEAgGl06NBBI0eOtN+vXr263n333Uuud8yYMWratOkl1wMAAJxvyJAh6tOnz0Vtu3v3blksFq1du7ZM2wSgfHJ3dQMAOF9SUpJCQkJc3QwAAMpEhw4d1LRpU6cMgl+qJ554QiNGjHB1MwAAQCHGjRsnwzAuatvo6GglJSUpPDy8jFsFoDxiEB24AkVGRrq6CQAAXNEMw1BeXp78/f3l7+/v6uYAAIBCBAUFXfS2bm5ufJcGUCSWcwFKwWaz6Y033lDt2rXl5eWlqlWr6rXXXpMkbdiwQR07dpSPj4/CwsL0wAMP6NSpU/bnnjmd7KWXXlJERIQCAwP10EMPKTs7277Nzz//rDZt2ig4OFhhYWHq2bOnduzYYX88Oztbw4cPV1RUlLy9vVWtWjUlJCTYH2c5FwDAlWrIkCFatGiRxo0bJ4vFIovFot27d2vjxo3q3r27/P39VbFiRd199906fPjwRdVZ2Onbx48fl8Vi0cKFCyVJCxculMVi0Zw5c9S8eXN5eXlpyZIlBZZzOX/ZGEnq06ePhgwZYr9fvXp1vfrqqxo0aJD8/f1VrVo1ff/990pNTVXv3r3l7++v2NhY/fXXX6XsJQAAyp/ivgefyeqvvvpKbdu2lY+Pj6699lpt3bpVK1euVIsWLeTv76/u3bsrNTXVXuf5y7kU912e5VwAFIdBdKAU4uPjNXbsWD3//PPatGmTPv/8c1WsWFHp6enq1q2bQkJCtHLlSn399df69ddfNXz4cIfnz58/X5s3b9bChQv1xRdfaObMmXrppZfsj6enp2v06NH666+/NH/+fFmtVt1yyy2y2WySpPfee0/ff/+9vvrqKyUmJuqzzz5T9erVL2cXAADgEuPGjVNcXJzuv/9+JSUlKSkpSQEBAerYsaOuueYa/fXXX/r555+VnJys/v37O/3nP/PMMxo7dqw2b96s2NjYUtfzzjvvqHXr1lqzZo169Oihu+++W4MGDdJdd92l1atXq1atWho0aNBFn4IOAEB5d6HvwZL04osv6rnnntPq1avl7u6uO++8U0899ZTGjRun33//Xdu3b9cLL7xQ5M8o6rs8AFwIy7kAJXTy5EmNGzdOH3zwgQYPHixJqlWrltq0aaPJkycrMzNT//d//yc/Pz9J0gcffKBevXrp9ddft4ezp6enpk6dKl9fXzVq1Egvv/yynnzySb3yyiuyWq3q16+fw8+cOnWqIiIitGnTJsXExGjv3r2qU6eO2rRpI4vFomrVql3eTgAAwEWCgoLk6ekpX19f+ynXr776qq655hr9+9//tm83depURUdHa+vWrapbt67Tfv7LL7+sLl26XHI9N910kx588EFJ0gsvvKCJEyfq2muv1W233SZJevrppxUXF6fk5GROLQcAXBWK+x58Zum0J554Qt26dZMkPfbYY7rjjjs0f/58tW7dWpI0dOhQffLJJ4XWX9x3eQC4EGaiAyW0efNmZWVlqVOnToU+1qRJE/sAuiS1bt1aNptNiYmJ9rImTZrI19fXfj8uLk6nTp3Svn37JEnbtm3THXfcoZo1ayowMNA+y3zv3r2S8k9JW7t2rerVq6dHH31U8+bNK4tdBQCgXFi3bp0WLFhgX5/c399f9evXlySH5dCcoUWLFk6p59xZ7GcOsjdu3LhAWUpKilN+HgAAZneh78HSxeVnUdlZ3Hd5ALgQZqIDJeTj41PmP6NXr16qVq2aJk+erEqVKslmsykmJsa+bnqzZs20a9cuzZkzR7/++qv69++vzp0765tvvinztgEAYDanTp2yn/V1vqioqAs+32rNn1dy7tIpOTk5hW577oHyouo6fwmWwury8PCw/99isRRZdu4p7AAAXMku9D1Yurj8LCo7L8d3eQBXLmaiAyVUp04d+fj4aP78+QUea9CggdatW6f09HR72dKlS2W1WlWvXj172bp163T69Gn7/RUrVsjf31/R0dE6cuSIEhMT9dxzz6lTp05q0KCBjh07VuBnBQYGasCAAZo8ebK+/PJLffvttzp69KiT9xYAAPPx9PRUXl6e/X6zZs30999/q3r16qpdu7bD7UKD3pIUEREhSUpKSrKXlfaiYhEREQ715OXlaePGjaWqCwCAq8XFfg++FMV9lweAC2EmOlBC3t7eevrpp/XUU0/J09NTrVu3Vmpqqv7++28NHDhQL774ogYPHqwxY8YoNTVVI0aM0N133+1wsZLs7GwNHTpUzz33nHbv3q0XX3xRw4cPl9VqVUhIiMLCwvTRRx8pKipKe/fu1TPPPOPQhrfffltRUVG65pprZLVa9fXXXysyMlLBwcGXuTcAALj8qlevrj/++EO7d++Wv7+/hg0bpsmTJ+uOO+7QU089pdDQUG3fvl0zZszQxx9/LDc3t2Lr8/Hx0fXXX6+xY8eqRo0aSklJ0XPPPVeqtnXs2FGjR4/W7NmzVatWLb399ts6fvx4qeoCAOBqcTHfgy9Vcd/lhw4d6tSfBeDKw0x0oBSef/55Pf7443rhhRfUoEEDDRgwQCkpKfL19dXcuXN19OhRXXvttbr11lvVqVMnffDBBw7P79Spk+rUqaN27dppwIABuvnmmzVmzBhJ+aeBz5gxQ6tWrVJMTIxGjRqlN9980+H5AQEBeuONN9SiRQtde+212r17t3766Sf76egAAFzJnnjiCbm5ualhw4aKiIhQdna2li5dqry8PHXt2lWNGzfWyJEjFRwcfNHZOHXqVOXm5qp58+YaOXKkXn311VK17d5779XgwYM1aNAgtW/fXjVr1tQNN9xQqroAALhaXMz3YGco6rs8AFyIxTh/0UYAZWrIkCE6fvy4vvvuO1c3BQAAAAAAAMAFMG0VAAAAAAAAAIAiMIgOAAAAAAAAAEARWM4FAAAAAAAAAIAiMBMdAAAAAAAAAIAiMIgOAAAAAAAAAEARGEQHAAAAAAAAAKAIDKIDAAAAAAAAAFAEBtEBAAAAAAAAACgCg+gAAAAAAAAAABSBQXQAAAAAAAAAAIrAIDoAAAAAAAAAAEVgEB0AAAAAAAAAgCIwiA4AAAAAAAAAQBEYRAcAAAAAAAAAoAgMogMAAAAAAAAAUAQG0QEAAAAAAAAAKAKD6AAAAAAAAAAAFIFBdLjUkCFDVL16dVc3o8zt3r1bFotFn3zyib1szJgxslgsTv9ZZVXvlWzhwoWyWCxauHChvays3ptXy3seAKSr5zOPnL8ylPb9Wr16dQ0ZMsTp7QEAs7tacv5ilTajO3TooA4dOji/QSZF3qK8YhC9FP7++2/dddddqly5sry8vFSpUiUNHDhQf//99yXV++9//1vfffedcxp5kSwWi/1mtVpVqVIlde3a1WEwsTxbtmyZxowZo+PHj19SPa54bXBxMjIyNGbMmCvmPQvA9cj58oOcBwCUFDlffjgr5wHAGRhEL6GZM2eqWbNmmj9/vu655x5NmDBBQ4cO1YIFC9SsWTPNmjWr1HW76gtcly5d9Omnn2r69Ol66KGHtH79enXs2FFz5sy57G1xtmXLlumll166qr5cP/fcczp9+rSrm3HZZGRk6KWXXio3fyhOnjxZiYmJrm4GgCKQ8+ULOQ9nKm1GJyYmavLkyWXQIgDORs6XL87K+cultBk9b948zZs3rwxaZE7kLcord1c3oDzZsWOH7r77btWsWVOLFy9WRESE/bHHHntMbdu21d13363169erZs2aLmzpWZmZmfL09JTVWvTxkrp16+quu+6y37/lllsUGxurd999V927dy91vbi80tPT5efnJ3d3d7m786ttNmdeHw8PD1c3BUARyPmS1YvLi5wve6XNaC8vLye3BEBZIOdLVi9KrrQZ7enpWQatMS/yFuUVn5gl8OabbyojI0MfffSRQ+BKUnh4uCZNmqT09HS98cYb9vKi1no6f60si8Wi9PR0TZ8+3X461rlrPR04cED33nuvKlasKC8vLzVq1EhTp051qPPMus4zZszQc889p8qVK8vX11cnTpwo0X42btxY4eHh2rVr10XV+/XXX6t58+by8fFReHi47rrrLh04cKBAvd99951iYmLk7e2tmJiYQo/yF7Y2tVT4WqOStGXLFvXv318RERHy8fFRvXr19K9//UtSfh8/+eSTkqQaNWrY+3X37t2SpMOHD2vLli3KyMgotj+c8dpcjKL28UwbxowZY79/5v2zadMm3XnnnQoJCVGbNm0cHruUerdu3aq77rpLQUFBioiI0PPPPy/DMLRv3z717t1bgYGBioyM1H/+858L7ldMTIxuuOGGAuU2m02VK1fWrbfeai+bMWOGmjdvroCAAAUGBqpx48YaN25ckXXv3r3b/rv40ksv2V+fc/dpy5YtuvXWWxUaGipvb2+1aNFC33///QXbfb6SvDeHDBkif39/7dixQzfddJMCAgI0cOBA+2PnfiaUpt69e/eqZ8+e8vf3V+XKlTV+/HhJ0oYNG9SxY0f5+fmpWrVq+vzzz0u8n8DVjJwn58l5c+X8GW+99ZZatWqlsLAw+fj4qHnz5vrmm28K3d/hw4fr66+/VsOGDeXj46O4uDht2LBBkjRp0iTVrl1b3t7e6tChg/29ckZhv882m03jxo1T48aN5e3trYiICN14443666+/7NuwRitQPpDzV2fOS9K0adPUsWNHVahQQV5eXmrYsKEmTpxYYLvq1aurZ8+eWrhwoVq0aCEfHx81btzYvj8zZ86050Hz5s21Zs0ah+cXtSb6f//7X1133XXy9fVVSEiI2rVr5zDz/GLWRCdvyVu4HtNYSuCHH35Q9erV1bZt20Ifb9eunapXr67Zs2eXuO5PP/1U9913n6677jo98MADkqRatWpJkpKTk3X99dfbP6giIiI0Z84cDR06VCdOnNDIkSMd6nrllVfk6empJ554QllZWSU+qnns2DEdO3ZMtWvXvmC9n3zyie655x5de+21SkhIUHJyssaNG6elS5dqzZo1Cg4OlpR/elK/fv3UsGFDJSQk6MiRI7rnnntUpUqVEvfVGevXr1fbtm3l4eGhBx54QNWrV9eOHTv0ww8/6LXXXlPfvn21detWffHFF3rnnXcUHh4uSfY/mD744AO99NJLWrBgQbGB5czXxtluu+021alTR//+979lGIbT6h0wYIAaNGigsWPHavbs2Xr11VcVGhqqSZMmqWPHjnr99df12Wef6YknntC1116rdu3aFVvXmDFjdOjQIUVGRtrLlyxZooMHD+r222+XJP3yyy+644471KlTJ73++uuSpM2bN2vp0qV67LHHCq07IiJCEydO1MMPP6xbbrlFffv2lSTFxsZKyl/vsHXr1qpcubKeeeYZ+fn56auvvlKfPn307bff6pZbbnFKfxUmNzdX3bp1U5s2bfTWW2/J19fXKfXm5eWpe/fuateund544w199tlnGj58uPz8/PSvf/1LAwcOVN++ffXhhx9q0KBBiouLU40aNZzys4ErHTlPzpPz5sr5M8aNG6ebb75ZAwcOVHZ2tmbMmKHbbrtNP/74o3r06OGw7e+//67vv/9ew4YNkyQlJCSoZ8+eeuqppzRhwgQ98sgjOnbsmN544w3de++9+u2334r92UOHDtUnn3yi7t2767777lNubq5+//13rVixQi1atCj2uQDMhZy/OnNekiZOnKhGjRrp5ptvlru7u3744Qc98sgjstls9rw4Y/v27brzzjv14IMP6q677tJbb72lXr166cMPP9Szzz6rRx55RFJ+vvTv31+JiYnFzuh/6aWXNGbMGLVq1Uovv/yyPD099ccff+i3335T165dL7q/yFvABAxclOPHjxuSjN69exe73c0332xIMk6cOGEYhmEMHjzYqFatWoHtXnzxReP87vfz8zMGDx5cYNuhQ4caUVFRxuHDhx3Kb7/9diMoKMjIyMgwDMMwFixYYEgyatasaS+7EEnG0KFDjdTUVCMlJcX4448/jE6dOhmSjP/85z/F1pudnW1UqFDBiImJMU6fPm0v//HHHw1JxgsvvGAva9q0qREVFWUcP37cXjZv3jxDkkP/nPlZCxYscGjnrl27DEnGtGnT7GXt2rUzAgICjD179jhsa7PZ7P9/8803DUnGrl27Cuz7mdfg/J9VmEt9bQpr//nvgcK2OUOS8eKLLxZ47h133FHkfl1KvQ888IC9LDc316hSpYphsViMsWPH2suPHTtm+Pj4FNov50pMTDQkGe+//75D+SOPPGL4+/vb++ixxx4zAgMDjdzc3GLrO19qamqB/TijU6dORuPGjY3MzEx7mc1mM1q1amXUqVPHXlbY++78392SvDcHDx5sSDKeeeaZAm1yRr3//ve/7WVnXgeLxWLMmDHDXr5ly5Yi+wVAQeQ8OU/OmzPnDcMo8H7Pzs42YmJijI4dOzqUSzK8vLwc3g+TJk0yJBmRkZH231vDMIz4+PgC753zf59/++03Q5Lx6KOPFmjTue/DatWqXbCfALgWOX9153xh/dmtWzejZs2aDmXVqlUzJBnLli2zl82dO9eQZPj4+Di09Uy+nPvzz39fbNu2zbBarcYtt9xi5OXlFbmf7du3N9q3b1/sPpC35C1cj+VcLtLJkyclSQEBAcVud+bxkp5yVRTDMPTtt9+qV69eMgxDhw8ftt+6deumtLQ0rV692uE5gwcPlo+Pz0X/jClTpigiIkIVKlRQy5YttXTpUo0ePbrAEfHz6/3rr7+UkpKiRx55RN7e3vbyHj16qH79+vYj+ElJSVq7dq0GDx6soKAg+3ZdunRRw4YNS9IddqmpqVq8eLHuvfdeVa1a1eGxwk6fKsyYMWNkGMYFj1oXpTSvjbM99NBDZVLvfffdZ/+/m5ubWrRoIcMwNHToUHt5cHCw6tWrp507dxZbV926ddW0aVN9+eWX9rK8vDx988036tWrl/09FRwcrPT0dP3yyy9O2YejR4/qt99+U//+/XXy5En7a3PkyBF169ZN27ZtK/Q0RWd6+OGHy6Tec1+fM6+Dn5+f+vfvby+vV6+egoODL/j6AMhHzpPz5yPnzZPz574vjx07prS0NLVt27bQ/u/UqZPDKeItW7aUJPXr18/h9/tMeXH79+2338pisejFF18s8NjFvg8BmAM5f3Xn/Ln7nZaWpsOHD6t9+/bauXOn0tLSHLZt2LCh4uLi7PfP5EXHjh0d2noxOfLdd9/JZrPphRdeKDBbvaQ5Qt4CrsdyLhfpzIfAmfAtysWG88VKTU3V8ePH9dFHH+mjjz4qdJuUlBSH+yVduqF3794aPny4LBaLAgIC1KhRI/n5+RXY7vx69+zZIyl/sO589evX15IlSxy2q1OnToHt6tWrV6ovoGc+gGNiYkr8XGcpzWvjbGW1TMf5f8gEBQXJ29vbfgrdueVHjhy5YH0DBgzQs88+qwMHDqhy5cpauHChUlJSNGDAAPs2jzzyiL766it1795dlStXVteuXdW/f3/deOONpdqH7du3yzAMPf/883r++ecL3SYlJUWVK1cuVf0X4u7ufkmnNxblzPpw5woKClKVKlUK/IERFBSkY8eOOb0NwJWInCfnz0fOmyfnf/zxR7366qtau3atsrKy7OWFfbEubN8kKTo6utDy4nJyx44dqlSpkkJDQy/YRgDmRs5f3Tm/dOlSvfjii1q+fHmBNdTT0tIcDg44O0esVmupDzacj7wFXItB9IsUFBSkqKgorV+/vtjt1q9fr8qVKyswMFBS0UfN8vLyLurn2mw2SdJdd92lwYMHF7rNmfWfzyjJUWtJqlKlijp37nzB7Upab2lcan9dTqV5bYpTmn2/mNekNPW6ubldVJmki1qjdcCAAYqPj9fXX3+tkSNH6quvvlJQUJBDkFeoUEFr167V3LlzNWfOHM2ZM0fTpk3ToEGDNH369Av+jPOdeX2eeOIJdevWrdBtzl8nsDgl7UcvL6+Lutp9Sest6nW4lNcHADlfmnpLg5wviJwvPud///133XzzzWrXrp0mTJigqKgoeXh4aNq0aYVeQJucBFAYcv7qzfkdO3aoU6dOql+/vt5++21FR0fL09NTP/30k9555x37a3SGmXOEvAVci0H0EujZs6cmT56sJUuWqE2bNgUe//3337V79249+OCD9rKQkBAdP368wLZnjuaeq7DAiYiIUEBAgPLy8i4qGC+natWqSZISExPVsWNHh8cSExPtj5/5d9u2bQXqSExMdLgfEhIiSQX67Pz+qlmzpiRp48aNxbbRWaf+XI7X5mL33Sz1lkSNGjV03XXX6csvv9Tw4cM1c+ZM9enTR15eXg7beXp6qlevXurVq5dsNpseeeQRTZo0Sc8//3yRA95FvcZn3iMeHh68PgAuCjnviJwn5y9WWeb8t99+K29vb82dO9ehvmnTppXpPkn5FwWcO3eujh49yuw44ApAzju6WnL+hx9+UFZWlr7//nuH2dMLFiy45LovpFatWrLZbNq0aZOaNm16yfWRt4BrsSZ6CTz55JPy8fHRgw8+WODU1qNHj+qhhx6Sr6+vnnzySXt5rVq1lJaW5nDEOykpSbNmzSpQv5+fX4GwcXNzU79+/fTtt98WGjCpqamXuFel16JFC1WoUEEffvihw6k+c+bM0ebNm+1Xb46KilLTpk01ffp0h/XGfvnlF23atMmhzmrVqsnNzU2LFy92KJ8wYYLD/YiICLVr105Tp07V3r17HR479wjnmdPYCvvD5/Dhw9qyZUuB07kKczlem8DAQIWHh19w30uqrOotqQEDBmjFihWaOnWqDh8+7HDKmaQCv1NWq9U+K+Pc99f5fH19JRV8jStUqKAOHTpo0qRJSkpKKvC8kr4+F/veLKmyqhdAyZHzjsh5cr4kyirn3dzcZLFYHGYx7t69W999953zGl+Efv36yTAMvfTSSwUeY0YdUP6Q846ulpw/MzP63HrT0tIuy+Bwnz59ZLVa9fLLLxeY8V7aHCFvAddhJnoJ1KlTR9OnT9fAgQPVuHFjDR06VDVq1NDu3bs1ZcoUHT58WF988YVq1aplf87tt9+up59+WrfccoseffRRZWRkaOLEiapbt26BtcOaN2+uX3/9VW+//bYqVaqkGjVqqGXLlho7dqwWLFigli1b6v7771fDhg119OhRrV69Wr/++quOHj16ubtCUv4M39dff1333HOP2rdvrzvuuEPJyckaN26cqlevrlGjRtm3TUhIUI8ePdSmTRvde++9Onr0qN5//301atRIp06dsm8XFBSk2267Te+//74sFotq1aqlH3/8sdA1R9977z21adNGzZo10wMPPGB/LWbPnq21a9dKyu9TSfrXv/6l22+/XR4eHurVq5f8/Pz0wQcf6KWXXtKCBQsueDGSy/Xa3HfffRo7dqzuu+8+tWjRQosXL9bWrVtLVMflrLck+vfvryeeeEJPPPGEQkNDC8zEuO+++3T06FF17NhRVapU0Z49e/T++++radOmatCgQZH1+vj4qGHDhvryyy9Vt25dhYaGKiYmRjExMRo/frzatGmjxo0b6/7771fNmjWVnJys5cuXa//+/Vq3bt1Ft78k782SKKt6AZQcOe+InCfnS6Kscr5Hjx56++23deONN+rOO+9USkqKxo8fr9q1a19wWYZLdcMNN+juu+/We++9p23btunGG2+UzWbT77//rhtuuEHDhw8v058PwLnIeUdXS8537drVPjP7wQcf1KlTpzR58mRVqFCh0MlWzlS7dm3961//0iuvvKK2bduqb9++8vLy0sqVK1WpUiUlJCSUuE7yFnAhAyW2fv1644477jCioqIMDw8PIzIy0rjjjjuMDRs2FLr9vHnzjJiYGMPT09OoV6+e8d///td48cUXjfO7f8uWLUa7du0M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c+cN3QSj4/TzukKpl1mtfwYdif7dd99Bqcy6g+zv76/z/IEDB/K1izgREZG+JCcn4/Hjx9rHT58+xc2bN2FnZwc7OztMmzYNXbp0gYuLC4KCgjB27Fj4+PigRYsWBmx14WFWExERGTdmNRERUeEzaCf6oEGD8nz+f//7XxG1hIiIjIWh9/C5evUqGjdurH38ekPSL774AkuXLsXt27exfv16xMfHo1ixYmjevDlmzJihtzXXjQ2zmoiI3mborCZdzGoiInobs1r/DL4mOhER0ZsMvYt4o0aNkNdKZ4cOHSrC1hARERkfQ2c1ERER5Y1ZrX9CQzeAiIiIiIiIiIiIiMhYcSQ6EREZFd4xJyIiMm7MaiIiIuPGrNY/jkQnIiIiIiIiIiIiIsoFR6ITEZFRUfGOORERkVFjVhMRERk3ZrX+sROdiIiMSl6ber4/QSHUSURE9GliVhMRERk3ZrX+cTkXIiIiIiIiIiIiIqJccCQ6EREZFW6AQkREZNyY1URERMaNWa1/HIlORERERERERERERJQLjkQnIiKjolIZugVERESUF2Y1ERGRcWNW6x870YmIyKhw2hkREZFxY1YTEREZN2a1/nE5FyIiIiIiIiIiIiKiXHAkOhERGRUV75gTEREZNWY1ERGRcWNW6x9HohMRERERERERERER5YIj0YmIyKhw7TYiIiLjxqwmIiIybsxq/WMnOhERGRV1ocw7ExRCnURERJ8mZjUREZFxY1brH5dzISIiIiIiIiIiIiLKBUeiExGRUeEGKERERMaNWU1ERGTcmNX6x050IiIyKly7jYiIyLgxq4mIiIwbs1r/uJwLEREREREREREREVEuOBKdiIiMiorzzoiIiIwas5qIiMi4Mav1jyPRiYiIiIiIiIiIiIhywZHoRERkVLh2GxERkXFjVhMRERk3ZrX+sROdiIiMCsOeiIjIuDGriYiIjBuzWv+4nAsRERERERERERERUS44Ep2IiIyKirfMiYiIjBqzmoiIyLgxq/WPI9GJiIiIiIiIiIiIiHLBkehERGRU1CpDt4CIiIjywqwmIiIybsxq/WMnOhERGRU1p50REREZNWY1ERGRcWNW6x+XcyEiIiIiIiIiIiIiygVHohMRkVFRcdoZERGRUWNWExERGTdmtf5xJDoRERERERERERERUS44Ep2IiIwK124jIiIybsxq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jUMPPTSeffbZmDlzZlRWVsbJJ5/c7M8/YcKEmDp1arz00kvRr1+/7T7Pf/7nf8awYcPiueeei5NOOinGjBkTY8eOjX/913+NefPmxd577x1jx47d6q+1AUBrt27duigvL49nn302Zs2aFfn5+fHlL3856urq6veZPHlyXHzxxTFv3rxo165dnHrqqXHBBRfENddcE//7v/8br7/+ekyaNCn1OSZOnBhTp06NSy65JF588cW47bbborS0tCVeHgC0erIayGWWc4GPKCkpicLCwujUqVP917guv/zyOPTQQ+OKK66o3+/mm2+OsrKyePXVV2Pfffdttuf/0Y9+FJ///Oc/9XlOPPHE+M53vhMREZMmTYrrr78+Bg8eHF//+tcjIuLCCy+MoUOHRmVlpa+rAdAmfPWrX23w88033xy77bZbvPjii/VLp51//vkxYsSIiIg455xz4pRTTolZs2bFsGHDIiLizDPPjFtuuaXJ869ZsyauueaauPbaa2PcuHEREbH33nvHkUcemaFXBAA7FlkN5DJXosMn+Pvf/x5/+ctf6tcn79y5c+y///4REfVfLWsugwYNapbzfPQq9g8/VT/kkEMabVu+fHmzPB8A5LrXXnstTjnllOjbt28UFxdHnz59IiJiyZIl9ftsTX6mZedLL70U1dXVcdxxx2Vg9ACw45PVQC5zJTp8grVr18bIkSPjpz/9aaP/1rNnz088Pj9/02dVH106ZcOGDU3uu9NOO33iuT6+BEtT52rfvn39/87Ly0vd9tGvxQHAjmzkyJGx5557xk033RS9evWKurq6OPjgg6OmpqZ+n63Jz7Ts7NixY4ZGDgBtg6wGcpkr0eFjCgsLo7a2tv7nww47LF544YXo06dP7LPPPg0en1R6R0TstttuERGxbNmy+m3be6OS3XbbrcF5amtrY8GCBdt1LgBoK95555145ZVX4uKLL47jjjsuDjjggHjvvfea9Tk+85nPRMeOHWPWrFnNel4AaAtkNZDrXIkOH9OnT5/429/+FosXL47OnTvH+PHj46abbopTTjklLrjggujatWu8/vrrMWPGjPj1r38dBQUFWzxfx44d47Of/WxMnTo19tprr1i+fHlcfPHF2zW2Y489NsrLy+P++++PvffeO66++upYtWrVdp0LANqKXXbZJXbddde48cYbo2fPnrFkyZKYMGFCsz5Hhw4d4sILL4wLLrggCgsLY9iwYbFixYp44YUX4swzz2zW5wKAHY2sBnKdK9HhY84///woKCiIAw88MHbbbbeoqamJJ598Mmpra+P444+PQw45JM4999zYeeed65dq+SQ333xzbNy4MQYOHBjnnntuXH755ds1tm9+85sxbty4GDt2bBx99NHRt2/fOOaYY7brXADQVuTn58eMGTNi7ty5cfDBB8d5550XV111VbM/zyWXXBI//OEPY9KkSXHAAQfE6NGj3X8EALaCrAZyXV7y8QWWAQAAAACAiHAlOgAAAAAApFKiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKTIaIn++OOPx8iRI6NXr16Rl5cX99xzzyceM3v27DjssMOiqKgo9tlnn7jlllsyOUQAaNNkNQDkNlkNANmX0RJ93bp10b9//5g+ffpW7b9o0aI46aST4phjjon58+fHueeeG9/61rfioYceyuQwAaDNktUAkNtkNQBkX16SJEmLPFFeXtx9990xatSo1H0uvPDCuP/++2PBggX1277xjW/EqlWrYubMmU0eU11dHdXV1fU/19XVxbvvvhu77rpr5OXlNdv4AaAlJEkSa9asiV69ekV+fsuuuiarAeCT7YhZHSGvAdhxZCKr2zXLWZrJnDlzYvjw4Q22jRgxIs4999zUY6ZMmRKXXXZZhkcGAC1r6dKlsfvuu2d7GI3IagDYZEfK6gh5DcCOpzmzOqdK9IqKiigtLW2wrbS0NFavXh3r16+Pjh07Njpm4sSJUV5eXv9zVVVV7LHHHrF06dIoLi7O+JgBoDmtXr06ysrKokuXLtkeSpNkNQBt3Y6Y1RHy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JToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRQogMAAAAAQAolOgAAAAAApFCiAwAAAABACiU6AAAAAACkUKIDAAAAAEAKJToAAAAAAKRokRJ9+vTp0adPn+jQoUMMGTIknn766a06bsaMGZGXlxejRo3K7AABoI2T1QCQ22Q1AGRPxkv022+/PcrLy2Py5Mkxb9686N+/f4wYMSKWL1++xeMWL14c559/fhx11FGZHiIAtGmyGgBym6wGgOzKeIl+9dVXx7e//e0444wz4sADD4wbbrghOnXqFDfffHPqMbW1tXHaaafFZZddFn379s30EAGgTZPVAJDbZDUAZFdGS/SampqYO3duDB8+fPMT5ufH8OHDY86cOanH/ehHP4ru3bvHmWee+YnPUV1dHatXr27wAAC2jqwGgNzWElkdIa8BYEsyWqKvXLkyamtro7S0tMH20tLSqKioaPKYJ554In7zm9/ETTfdtFXPMWXKlCgpKal/lJWVfepxA0BbIasBILe1RFZHyGsA2JIWubHo1lqzZk2MGTMmbrrppujWrdtWHTNx4sSoqqqqfyxdujTDowSAtktWA0Bu256sjpDXALAl7TJ58m7dukVBQUFUVlY22F5ZWRk9evRotP8bb7wRixcvjpEjR9Zvq6ur2zTQdu3ilVdeib333rvBMUVFRVFUVJSB0QPAjk9WA0Bua4msjpDXALAlGb0SvbCwMAYOHBizZs2q31ZXVxezZs2KoUOHNtp///33j+effz7mz59f//jiF78YxxxzTMyfP9/XyQCgmclqAMhtshoAsi+jV6JHRJSXl8e4ceNi0KBBcfjhh8e0adNi3bp1ccYZZ0RExNixY6N3794xZcqU6NChQxx88MENjt95550jIhptBwCah6wGgNwmqwEguzJeoo8ePTpWrFgRkyZNioqKihgwYEDMnDmz/qYoS5Ys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"
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "execution_count": 31
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-05-16T11:55:48.035570Z",
- "start_time": "2024-05-16T11:55:48.031507Z"
- }
- },
- "cell_type": "code",
- "source": "rmse_df",
- "id": "71578fe1d7e942ae",
- "outputs": [
- {
- "data": {
- "text/plain": [
- " copasi tellurium amici\n",
- "copasi 0.000000 0.109545 0.209762\n",
- "tellurium 0.109545 0.000000 0.109545\n",
- "amici 0.209762 0.109545 0.000000"
- ],
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " tellurium \n",
- " amici \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " copasi \n",
- " 0.000000 \n",
- " 0.109545 \n",
- " 0.209762 \n",
- " \n",
- " \n",
- " tellurium \n",
- " 0.109545 \n",
- " 0.000000 \n",
- " 0.109545 \n",
- " \n",
- " \n",
- " amici \n",
- " 0.209762 \n",
- " 0.109545 \n",
- " 0.000000 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ]
- },
- "execution_count": 32,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 32
- },
- {
- "metadata": {},
- "cell_type": "code",
- "outputs": [],
- "execution_count": null,
- "source": "",
- "id": "d9854a2a6cbc7945"
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 2
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython2",
- "version": "2.7.6"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/pyproject.toml b/pyproject.toml
deleted file mode 100644
index dd1b60dee..000000000
--- a/pyproject.toml
+++ /dev/null
@@ -1,59 +0,0 @@
-[tool.poetry]
-name = "biosimulator-processes"
-version = "0.0.24"
-description = "Core implementations of process-bigraph.composite.Process aligning with BioSimulators simulator tools."
-authors = ["Alex Patrie "]
-readme = "README.md"
-packages = [{include = "biosimulator_processes"}]
-
-[tool.poetry.dependencies]
-python = ">=3.10"
-zarr = "*"
-termcolor = "*"
-jupyterlab = "*"
-bigraph-schema = "*"
-process-bigraph = "^0.0.17"
-bigraph-viz = "*"
-bigraph-builder = "*"
-numpy = "*"
-copasi-basico = "*"
-cobra = "*"
-tellurium = "*"
-amici = "*"
-# smoldyn = {version = ">=2.72", optional = true}
-python-libsbml = "^5.20.2"
-docker = ">=7.0"
-python-libnuml = "^1.1.6"
-notebook = "^7.1.1"
-toml = "*"
-fastapi = "^0.109.0" # "*"
-pyyaml = "*"
-pydantic = "*"
-h5py = "*"
-pydantic-settings = "*"
-httpx = "*"
-tensorstore = "*"
-aiofiles = "*"
-aiobotocore = "*"
-uvicorn = {extras = ["standard"], version = "*"}
-seaborn = "^0.13.2"
-# psutil = "^5.9.8"
-
-[tool.poetry.extras]
-smoldyn = ["smoldyn"]
-# simulariumio = "*"
-
-[tool.poetry.group.dev.dependencies]
-pytest = "*"
-mypy = ">=1.8.0"
-flake8 = "*"
-twine = "*"
-
-[tool.pytest.ini_options]
-testpaths = ["biosimulator_processes"]
-addopts = "--ignore=setup.py"
-python_files = "*.py"
-
-[build-system]
-requires = ["poetry-core"]
-build-backend = "poetry.core.masonry.api"
diff --git a/release_env/bin/Activate.ps1 b/release_env/bin/Activate.ps1
deleted file mode 100644
index b49d77ba4..000000000
--- a/release_env/bin/Activate.ps1
+++ /dev/null
@@ -1,247 +0,0 @@
-<#
-.Synopsis
-Activate a Python virtual environment for the current PowerShell session.
-
-.Description
-Pushes the python executable for a virtual environment to the front of the
-$Env:PATH environment variable and sets the prompt to signify that you are
-in a Python virtual environment. Makes use of the command line switches as
-well as the `pyvenv.cfg` file values present in the virtual environment.
-
-.Parameter VenvDir
-Path to the directory that contains the virtual environment to activate. The
-default value for this is the parent of the directory that the Activate.ps1
-script is located within.
-
-.Parameter Prompt
-The prompt prefix to display when this virtual environment is activated. By
-default, this prompt is the name of the virtual environment folder (VenvDir)
-surrounded by parentheses and followed by a single space (ie. '(.venv) ').
-
-.Example
-Activate.ps1
-Activates the Python virtual environment that contains the Activate.ps1 script.
-
-.Example
-Activate.ps1 -Verbose
-Activates the Python virtual environment that contains the Activate.ps1 script,
-and shows extra information about the activation as it executes.
-
-.Example
-Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
-Activates the Python virtual environment located in the specified location.
-
-.Example
-Activate.ps1 -Prompt "MyPython"
-Activates the Python virtual environment that contains the Activate.ps1 script,
-and prefixes the current prompt with the specified string (surrounded in
-parentheses) while the virtual environment is active.
-
-.Notes
-On Windows, it may be required to enable this Activate.ps1 script by setting the
-execution policy for the user. You can do this by issuing the following PowerShell
-command:
-
-PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
-
-For more information on Execution Policies:
-https://go.microsoft.com/fwlink/?LinkID=135170
-
-#>
-Param(
- [Parameter(Mandatory = $false)]
- [String]
- $VenvDir,
- [Parameter(Mandatory = $false)]
- [String]
- $Prompt
-)
-
-<# Function declarations --------------------------------------------------- #>
-
-<#
-.Synopsis
-Remove all shell session elements added by the Activate script, including the
-addition of the virtual environment's Python executable from the beginning of
-the PATH variable.
-
-.Parameter NonDestructive
-If present, do not remove this function from the global namespace for the
-session.
-
-#>
-function global:deactivate ([switch]$NonDestructive) {
- # Revert to original values
-
- # The prior prompt:
- if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
- Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
- Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
- }
-
- # The prior PYTHONHOME:
- if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
- Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
- Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
- }
-
- # The prior PATH:
- if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
- Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
- Remove-Item -Path Env:_OLD_VIRTUAL_PATH
- }
-
- # Just remove the VIRTUAL_ENV altogether:
- if (Test-Path -Path Env:VIRTUAL_ENV) {
- Remove-Item -Path env:VIRTUAL_ENV
- }
-
- # Just remove VIRTUAL_ENV_PROMPT altogether.
- if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
- Remove-Item -Path env:VIRTUAL_ENV_PROMPT
- }
-
- # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
- if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
- Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
- }
-
- # Leave deactivate function in the global namespace if requested:
- if (-not $NonDestructive) {
- Remove-Item -Path function:deactivate
- }
-}
-
-<#
-.Description
-Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
-given folder, and returns them in a map.
-
-For each line in the pyvenv.cfg file, if that line can be parsed into exactly
-two strings separated by `=` (with any amount of whitespace surrounding the =)
-then it is considered a `key = value` line. The left hand string is the key,
-the right hand is the value.
-
-If the value starts with a `'` or a `"` then the first and last character is
-stripped from the value before being captured.
-
-.Parameter ConfigDir
-Path to the directory that contains the `pyvenv.cfg` file.
-#>
-function Get-PyVenvConfig(
- [String]
- $ConfigDir
-) {
- Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
-
- # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
- $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
-
- # An empty map will be returned if no config file is found.
- $pyvenvConfig = @{ }
-
- if ($pyvenvConfigPath) {
-
- Write-Verbose "File exists, parse `key = value` lines"
- $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
-
- $pyvenvConfigContent | ForEach-Object {
- $keyval = $PSItem -split "\s*=\s*", 2
- if ($keyval[0] -and $keyval[1]) {
- $val = $keyval[1]
-
- # Remove extraneous quotations around a string value.
- if ("'""".Contains($val.Substring(0, 1))) {
- $val = $val.Substring(1, $val.Length - 2)
- }
-
- $pyvenvConfig[$keyval[0]] = $val
- Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
- }
- }
- }
- return $pyvenvConfig
-}
-
-
-<# Begin Activate script --------------------------------------------------- #>
-
-# Determine the containing directory of this script
-$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
-$VenvExecDir = Get-Item -Path $VenvExecPath
-
-Write-Verbose "Activation script is located in path: '$VenvExecPath'"
-Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
-Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
-
-# Set values required in priority: CmdLine, ConfigFile, Default
-# First, get the location of the virtual environment, it might not be
-# VenvExecDir if specified on the command line.
-if ($VenvDir) {
- Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
-}
-else {
- Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
- $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
- Write-Verbose "VenvDir=$VenvDir"
-}
-
-# Next, read the `pyvenv.cfg` file to determine any required value such
-# as `prompt`.
-$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
-
-# Next, set the prompt from the command line, or the config file, or
-# just use the name of the virtual environment folder.
-if ($Prompt) {
- Write-Verbose "Prompt specified as argument, using '$Prompt'"
-}
-else {
- Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
- if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
- Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
- $Prompt = $pyvenvCfg['prompt'];
- }
- else {
- Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
- Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
- $Prompt = Split-Path -Path $venvDir -Leaf
- }
-}
-
-Write-Verbose "Prompt = '$Prompt'"
-Write-Verbose "VenvDir='$VenvDir'"
-
-# Deactivate any currently active virtual environment, but leave the
-# deactivate function in place.
-deactivate -nondestructive
-
-# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
-# that there is an activated venv.
-$env:VIRTUAL_ENV = $VenvDir
-
-if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
-
- Write-Verbose "Setting prompt to '$Prompt'"
-
- # Set the prompt to include the env name
- # Make sure _OLD_VIRTUAL_PROMPT is global
- function global:_OLD_VIRTUAL_PROMPT { "" }
- Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
- New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
-
- function global:prompt {
- Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
- _OLD_VIRTUAL_PROMPT
- }
- $env:VIRTUAL_ENV_PROMPT = $Prompt
-}
-
-# Clear PYTHONHOME
-if (Test-Path -Path Env:PYTHONHOME) {
- Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
- Remove-Item -Path Env:PYTHONHOME
-}
-
-# Add the venv to the PATH
-Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
-$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
diff --git a/release_env/bin/activate b/release_env/bin/activate
deleted file mode 100644
index a29c5b823..000000000
--- a/release_env/bin/activate
+++ /dev/null
@@ -1,70 +0,0 @@
-# This file must be used with "source bin/activate" *from bash*
-# You cannot run it directly
-
-deactivate () {
- # reset old environment variables
- if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
- PATH="${_OLD_VIRTUAL_PATH:-}"
- export PATH
- unset _OLD_VIRTUAL_PATH
- fi
- if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
- PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
- export PYTHONHOME
- unset _OLD_VIRTUAL_PYTHONHOME
- fi
-
- # Call hash to forget past commands. Without forgetting
- # past commands the $PATH changes we made may not be respected
- hash -r 2> /dev/null
-
- if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
- PS1="${_OLD_VIRTUAL_PS1:-}"
- export PS1
- unset _OLD_VIRTUAL_PS1
- fi
-
- unset VIRTUAL_ENV
- unset VIRTUAL_ENV_PROMPT
- if [ ! "${1:-}" = "nondestructive" ] ; then
- # Self destruct!
- unset -f deactivate
- fi
-}
-
-# unset irrelevant variables
-deactivate nondestructive
-
-# on Windows, a path can contain colons and backslashes and has to be converted:
-if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then
- # transform D:\path\to\venv to /d/path/to/venv on MSYS
- # and to /cygdrive/d/path/to/venv on Cygwin
- export VIRTUAL_ENV=$(cygpath "/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env")
-else
- # use the path as-is
- export VIRTUAL_ENV="/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env"
-fi
-
-_OLD_VIRTUAL_PATH="$PATH"
-PATH="$VIRTUAL_ENV/bin:$PATH"
-export PATH
-
-# unset PYTHONHOME if set
-# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
-# could use `if (set -u; : $PYTHONHOME) ;` in bash
-if [ -n "${PYTHONHOME:-}" ] ; then
- _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
- unset PYTHONHOME
-fi
-
-if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
- _OLD_VIRTUAL_PS1="${PS1:-}"
- PS1="(release_env) ${PS1:-}"
- export PS1
- VIRTUAL_ENV_PROMPT="(release_env) "
- export VIRTUAL_ENV_PROMPT
-fi
-
-# Call hash to forget past commands. Without forgetting
-# past commands the $PATH changes we made may not be respected
-hash -r 2> /dev/null
diff --git a/release_env/bin/activate.csh b/release_env/bin/activate.csh
deleted file mode 100644
index c8a2b9868..000000000
--- a/release_env/bin/activate.csh
+++ /dev/null
@@ -1,27 +0,0 @@
-# This file must be used with "source bin/activate.csh" *from csh*.
-# You cannot run it directly.
-
-# Created by Davide Di Blasi .
-# Ported to Python 3.3 venv by Andrew Svetlov
-
-alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate'
-
-# Unset irrelevant variables.
-deactivate nondestructive
-
-setenv VIRTUAL_ENV "/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env"
-
-set _OLD_VIRTUAL_PATH="$PATH"
-setenv PATH "$VIRTUAL_ENV/bin:$PATH"
-
-
-set _OLD_VIRTUAL_PROMPT="$prompt"
-
-if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
- set prompt = "(release_env) $prompt"
- setenv VIRTUAL_ENV_PROMPT "(release_env) "
-endif
-
-alias pydoc python -m pydoc
-
-rehash
diff --git a/release_env/bin/activate.fish b/release_env/bin/activate.fish
deleted file mode 100644
index fabf253a7..000000000
--- a/release_env/bin/activate.fish
+++ /dev/null
@@ -1,69 +0,0 @@
-# This file must be used with "source /bin/activate.fish" *from fish*
-# (https://fishshell.com/). You cannot run it directly.
-
-function deactivate -d "Exit virtual environment and return to normal shell environment"
- # reset old environment variables
- if test -n "$_OLD_VIRTUAL_PATH"
- set -gx PATH $_OLD_VIRTUAL_PATH
- set -e _OLD_VIRTUAL_PATH
- end
- if test -n "$_OLD_VIRTUAL_PYTHONHOME"
- set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
- set -e _OLD_VIRTUAL_PYTHONHOME
- end
-
- if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
- set -e _OLD_FISH_PROMPT_OVERRIDE
- # prevents error when using nested fish instances (Issue #93858)
- if functions -q _old_fish_prompt
- functions -e fish_prompt
- functions -c _old_fish_prompt fish_prompt
- functions -e _old_fish_prompt
- end
- end
-
- set -e VIRTUAL_ENV
- set -e VIRTUAL_ENV_PROMPT
- if test "$argv[1]" != "nondestructive"
- # Self-destruct!
- functions -e deactivate
- end
-end
-
-# Unset irrelevant variables.
-deactivate nondestructive
-
-set -gx VIRTUAL_ENV "/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env"
-
-set -gx _OLD_VIRTUAL_PATH $PATH
-set -gx PATH "$VIRTUAL_ENV/bin" $PATH
-
-# Unset PYTHONHOME if set.
-if set -q PYTHONHOME
- set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
- set -e PYTHONHOME
-end
-
-if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
- # fish uses a function instead of an env var to generate the prompt.
-
- # Save the current fish_prompt function as the function _old_fish_prompt.
- functions -c fish_prompt _old_fish_prompt
-
- # With the original prompt function renamed, we can override with our own.
- function fish_prompt
- # Save the return status of the last command.
- set -l old_status $status
-
- # Output the venv prompt; color taken from the blue of the Python logo.
- printf "%s%s%s" (set_color 4B8BBE) "(release_env) " (set_color normal)
-
- # Restore the return status of the previous command.
- echo "exit $old_status" | .
- # Output the original/"old" prompt.
- _old_fish_prompt
- end
-
- set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
- set -gx VIRTUAL_ENV_PROMPT "(release_env) "
-end
diff --git a/release_env/bin/docutils b/release_env/bin/docutils
deleted file mode 100755
index d410bb312..000000000
--- a/release_env/bin/docutils
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.__main__ import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/bin/keyring b/release_env/bin/keyring
deleted file mode 100755
index 81d95d129..000000000
--- a/release_env/bin/keyring
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from keyring.cli import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/bin/markdown-it b/release_env/bin/markdown-it
deleted file mode 100755
index 7c1f03d14..000000000
--- a/release_env/bin/markdown-it
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from markdown_it.cli.parse import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/bin/normalizer b/release_env/bin/normalizer
deleted file mode 100755
index 2eec88b75..000000000
--- a/release_env/bin/normalizer
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from charset_normalizer.cli import cli_detect
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(cli_detect())
diff --git a/release_env/bin/pip b/release_env/bin/pip
deleted file mode 100755
index b8ba952e6..000000000
--- a/release_env/bin/pip
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from pip._internal.cli.main import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/bin/pip3 b/release_env/bin/pip3
deleted file mode 100755
index b8ba952e6..000000000
--- a/release_env/bin/pip3
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from pip._internal.cli.main import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/bin/pip3.12 b/release_env/bin/pip3.12
deleted file mode 100755
index b8ba952e6..000000000
--- a/release_env/bin/pip3.12
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from pip._internal.cli.main import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/bin/pkginfo b/release_env/bin/pkginfo
deleted file mode 100755
index 04f77cc16..000000000
--- a/release_env/bin/pkginfo
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from pkginfo.commandline import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/bin/pygmentize b/release_env/bin/pygmentize
deleted file mode 100755
index 2e42a47a5..000000000
--- a/release_env/bin/pygmentize
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from pygments.cmdline import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/bin/python b/release_env/bin/python
deleted file mode 120000
index 11b9d8853..000000000
--- a/release_env/bin/python
+++ /dev/null
@@ -1 +0,0 @@
-python3.12
\ No newline at end of file
diff --git a/release_env/bin/python3 b/release_env/bin/python3
deleted file mode 120000
index 11b9d8853..000000000
--- a/release_env/bin/python3
+++ /dev/null
@@ -1 +0,0 @@
-python3.12
\ No newline at end of file
diff --git a/release_env/bin/python3.12 b/release_env/bin/python3.12
deleted file mode 120000
index a7a5fcca3..000000000
--- a/release_env/bin/python3.12
+++ /dev/null
@@ -1 +0,0 @@
-/Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12
\ No newline at end of file
diff --git a/release_env/bin/rst2html b/release_env/bin/rst2html
deleted file mode 100755
index fd9590b21..000000000
--- a/release_env/bin/rst2html
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2html
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2html())
diff --git a/release_env/bin/rst2html4 b/release_env/bin/rst2html4
deleted file mode 100755
index bc802dfb0..000000000
--- a/release_env/bin/rst2html4
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2html4
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2html4())
diff --git a/release_env/bin/rst2html5 b/release_env/bin/rst2html5
deleted file mode 100755
index c9ef4a279..000000000
--- a/release_env/bin/rst2html5
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2html5
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2html5())
diff --git a/release_env/bin/rst2latex b/release_env/bin/rst2latex
deleted file mode 100755
index b468f8fb2..000000000
--- a/release_env/bin/rst2latex
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2latex
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2latex())
diff --git a/release_env/bin/rst2man b/release_env/bin/rst2man
deleted file mode 100755
index d8b4ce410..000000000
--- a/release_env/bin/rst2man
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2man
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2man())
diff --git a/release_env/bin/rst2odt b/release_env/bin/rst2odt
deleted file mode 100755
index 809cc3bac..000000000
--- a/release_env/bin/rst2odt
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2odt
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2odt())
diff --git a/release_env/bin/rst2pseudoxml b/release_env/bin/rst2pseudoxml
deleted file mode 100755
index 1dd4e686e..000000000
--- a/release_env/bin/rst2pseudoxml
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2pseudoxml
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2pseudoxml())
diff --git a/release_env/bin/rst2s5 b/release_env/bin/rst2s5
deleted file mode 100755
index 93da25858..000000000
--- a/release_env/bin/rst2s5
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2s5
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2s5())
diff --git a/release_env/bin/rst2xetex b/release_env/bin/rst2xetex
deleted file mode 100755
index ef4104900..000000000
--- a/release_env/bin/rst2xetex
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2xetex
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2xetex())
diff --git a/release_env/bin/rst2xml b/release_env/bin/rst2xml
deleted file mode 100755
index 17357c3c4..000000000
--- a/release_env/bin/rst2xml
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from docutils.core import rst2xml
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(rst2xml())
diff --git a/release_env/bin/twine b/release_env/bin/twine
deleted file mode 100755
index 87b2b417e..000000000
--- a/release_env/bin/twine
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from twine.__main__ import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/bin/wheel b/release_env/bin/wheel
deleted file mode 100755
index 32f882fec..000000000
--- a/release_env/bin/wheel
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/Users/alexanderpatrie/Desktop/repos/biosimulator-processes/release_env/bin/python3.12
-# -*- coding: utf-8 -*-
-import re
-import sys
-from wheel.cli import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/release_env/lib/python3.12/site-packages/_distutils_hack/__init__.py b/release_env/lib/python3.12/site-packages/_distutils_hack/__init__.py
deleted file mode 100644
index 34463d5f2..000000000
--- a/release_env/lib/python3.12/site-packages/_distutils_hack/__init__.py
+++ /dev/null
@@ -1,220 +0,0 @@
-# don't import any costly modules
-import sys
-import os
-
-
-def warn_distutils_present():
- if 'distutils' not in sys.modules:
- return
- import warnings
-
- warnings.warn(
- "Distutils was imported before Setuptools, but importing Setuptools "
- "also replaces the `distutils` module in `sys.modules`. This may lead "
- "to undesirable behaviors or errors. To avoid these issues, avoid "
- "using distutils directly, ensure that setuptools is installed in the "
- "traditional way (e.g. not an editable install), and/or make sure "
- "that setuptools is always imported before distutils."
- )
-
-
-def clear_distutils():
- if 'distutils' not in sys.modules:
- return
- import warnings
-
- warnings.warn("Setuptools is replacing distutils.")
- mods = [
- name
- for name in sys.modules
- if name == "distutils" or name.startswith("distutils.")
- ]
- for name in mods:
- del sys.modules[name]
-
-
-def enabled():
- """
- Allow selection of distutils by environment variable.
- """
- which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local')
- return which == 'local'
-
-
-def ensure_local_distutils():
- import importlib
-
- clear_distutils()
-
- # With the DistutilsMetaFinder in place,
- # perform an import to cause distutils to be
- # loaded from setuptools._distutils. Ref #2906.
- with shim():
- importlib.import_module('distutils')
-
- # check that submodules load as expected
- core = importlib.import_module('distutils.core')
- assert '_distutils' in core.__file__, core.__file__
- assert 'setuptools._distutils.log' not in sys.modules
-
-
-def do_override():
- """
- Ensure that the local copy of distutils is preferred over stdlib.
-
- See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
- for more motivation.
- """
- if enabled():
- warn_distutils_present()
- ensure_local_distutils()
-
-
-class _TrivialRe:
- def __init__(self, *patterns):
- self._patterns = patterns
-
- def match(self, string):
- return all(pat in string for pat in self._patterns)
-
-
-class DistutilsMetaFinder:
- def find_spec(self, fullname, path, target=None):
- # optimization: only consider top level modules and those
- # found in the CPython test suite.
- if path is not None and not fullname.startswith('test.'):
- return None
-
- method_name = 'spec_for_{fullname}'.format(**locals())
- method = getattr(self, method_name, lambda: None)
- return method()
-
- def spec_for_distutils(self):
- if self.is_cpython():
- return None
-
- import importlib
- import importlib.abc
- import importlib.util
-
- try:
- mod = importlib.import_module('setuptools._distutils')
- except Exception:
- # There are a couple of cases where setuptools._distutils
- # may not be present:
- # - An older Setuptools without a local distutils is
- # taking precedence. Ref #2957.
- # - Path manipulation during sitecustomize removes
- # setuptools from the path but only after the hook
- # has been loaded. Ref #2980.
- # In either case, fall back to stdlib behavior.
- return None
-
- class DistutilsLoader(importlib.abc.Loader):
- def create_module(self, spec):
- mod.__name__ = 'distutils'
- return mod
-
- def exec_module(self, module):
- pass
-
- return importlib.util.spec_from_loader(
- 'distutils', DistutilsLoader(), origin=mod.__file__
- )
-
- @staticmethod
- def is_cpython():
- """
- Suppress supplying distutils for CPython (build and test-suite).
- Ref #2965 and #3007.
- """
- return os.path.isfile('pybuilddir.txt')
-
- def spec_for_pip(self):
- """
- Ensure stdlib distutils when running under pip.
- See pypa/pip#8761 for rationale.
- """
- if sys.version_info >= (3, 12) or self.pip_imported_during_build():
- return
- clear_distutils()
- self.spec_for_distutils = lambda: None
-
- @classmethod
- def pip_imported_during_build(cls):
- """
- Detect if pip is being imported in a build script. Ref #2355.
- """
- import traceback
-
- return any(
- cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None)
- )
-
- @staticmethod
- def frame_file_is_setup(frame):
- """
- Return True if the indicated frame suggests a setup.py file.
- """
- # some frames may not have __file__ (#2940)
- return frame.f_globals.get('__file__', '').endswith('setup.py')
-
- def spec_for_sensitive_tests(self):
- """
- Ensure stdlib distutils when running select test-suite under CPython.
-
- python/cpython#91169
- """
- clear_distutils()
- self.spec_for_distutils = lambda: None
-
- sensitive_tests = (
- [
- 'test.test_distutils',
- 'test.test_peg_generator',
- 'test.test_importlib',
- ]
- if sys.version_info < (3, 10)
- else [
- 'test.test_distutils',
- ]
- )
-
-
-for name in DistutilsMetaFinder.sensitive_tests:
- setattr(
- DistutilsMetaFinder,
- f'spec_for_{name}',
- DistutilsMetaFinder.spec_for_sensitive_tests,
- )
-
-
-DISTUTILS_FINDER = DistutilsMetaFinder()
-
-
-def add_shim():
- DISTUTILS_FINDER in sys.meta_path or insert_shim()
-
-
-class shim:
- def __enter__(self):
- insert_shim()
-
- def __exit__(self, exc, value, tb):
- _remove_shim()
-
-
-def insert_shim():
- sys.meta_path.insert(0, DISTUTILS_FINDER)
-
-
-def _remove_shim():
- try:
- sys.meta_path.remove(DISTUTILS_FINDER)
- except ValueError:
- pass
-
-
-if sys.version_info < (3, 12):
- # DistutilsMetaFinder can only be disabled in Python < 3.12 (PEP 632)
- remove_shim = _remove_shim
diff --git a/release_env/lib/python3.12/site-packages/_distutils_hack/override.py b/release_env/lib/python3.12/site-packages/_distutils_hack/override.py
deleted file mode 100644
index 2cc433a4a..000000000
--- a/release_env/lib/python3.12/site-packages/_distutils_hack/override.py
+++ /dev/null
@@ -1 +0,0 @@
-__import__('_distutils_hack').do_override()
diff --git a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/INSTALLER b/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/INSTALLER
deleted file mode 100644
index a1b589e38..000000000
--- a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/LICENSE b/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/LICENSE
deleted file mode 100644
index 62b076cde..000000000
--- a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-This package contains a modified version of ca-bundle.crt:
-
-ca-bundle.crt -- Bundle of CA Root Certificates
-
-This is a bundle of X.509 certificates of public Certificate Authorities
-(CA). These were automatically extracted from Mozilla's root certificates
-file (certdata.txt). This file can be found in the mozilla source tree:
-https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt
-It contains the certificates in PEM format and therefore
-can be directly used with curl / libcurl / php_curl, or with
-an Apache+mod_ssl webserver for SSL client authentication.
-Just configure this file as the SSLCACertificateFile.#
-
-***** BEGIN LICENSE BLOCK *****
-This Source Code Form is subject to the terms of the Mozilla Public License,
-v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
-one at http://mozilla.org/MPL/2.0/.
-
-***** END LICENSE BLOCK *****
-@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
diff --git a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/METADATA b/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/METADATA
deleted file mode 100644
index c688a6284..000000000
--- a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/METADATA
+++ /dev/null
@@ -1,66 +0,0 @@
-Metadata-Version: 2.1
-Name: certifi
-Version: 2024.2.2
-Summary: Python package for providing Mozilla's CA Bundle.
-Home-page: https://github.com/certifi/python-certifi
-Author: Kenneth Reitz
-Author-email: me@kennethreitz.com
-License: MPL-2.0
-Project-URL: Source, https://github.com/certifi/python-certifi
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
-Classifier: Natural Language :: English
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: 3.11
-Requires-Python: >=3.6
-License-File: LICENSE
-
-Certifi: Python SSL Certificates
-================================
-
-Certifi provides Mozilla's carefully curated collection of Root Certificates for
-validating the trustworthiness of SSL certificates while verifying the identity
-of TLS hosts. It has been extracted from the `Requests`_ project.
-
-Installation
-------------
-
-``certifi`` is available on PyPI. Simply install it with ``pip``::
-
- $ pip install certifi
-
-Usage
------
-
-To reference the installed certificate authority (CA) bundle, you can use the
-built-in function::
-
- >>> import certifi
-
- >>> certifi.where()
- '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem'
-
-Or from the command line::
-
- $ python -m certifi
- /usr/local/lib/python3.7/site-packages/certifi/cacert.pem
-
-Enjoy!
-
-.. _`Requests`: https://requests.readthedocs.io/en/master/
-
-Addition/Removal of Certificates
---------------------------------
-
-Certifi does not support any addition/removal or other modification of the
-CA trust store content. This project is intended to provide a reliable and
-highly portable root of trust to python deployments. Look to upstream projects
-for methods to use alternate trust.
diff --git a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/RECORD b/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/RECORD
deleted file mode 100644
index 5d6cce618..000000000
--- a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/RECORD
+++ /dev/null
@@ -1,14 +0,0 @@
-certifi-2024.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-certifi-2024.2.2.dist-info/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989
-certifi-2024.2.2.dist-info/METADATA,sha256=1noreLRChpOgeSj0uJT1mehiBl8ngh33Guc7KdvzYYM,2170
-certifi-2024.2.2.dist-info/RECORD,,
-certifi-2024.2.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
-certifi-2024.2.2.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8
-certifi/__init__.py,sha256=ljtEx-EmmPpTe2SOd5Kzsujm_lUD0fKJVnE9gzce320,94
-certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243
-certifi/__pycache__/__init__.cpython-312.pyc,,
-certifi/__pycache__/__main__.cpython-312.pyc,,
-certifi/__pycache__/core.cpython-312.pyc,,
-certifi/cacert.pem,sha256=ejR8qP724p-CtuR4U1WmY1wX-nVeCUD2XxWqj8e9f5I,292541
-certifi/core.py,sha256=qRDDFyXVJwTB_EmoGppaXU_R9qCZvhl-EzxPMuV3nTA,4426
-certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
diff --git a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/WHEEL b/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/WHEEL
deleted file mode 100644
index 98c0d20b7..000000000
--- a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.42.0)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
diff --git a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/top_level.txt b/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/top_level.txt
deleted file mode 100644
index 963eac530..000000000
--- a/release_env/lib/python3.12/site-packages/certifi-2024.2.2.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-certifi
diff --git a/release_env/lib/python3.12/site-packages/certifi/__init__.py b/release_env/lib/python3.12/site-packages/certifi/__init__.py
deleted file mode 100644
index 1c91f3ec9..000000000
--- a/release_env/lib/python3.12/site-packages/certifi/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from .core import contents, where
-
-__all__ = ["contents", "where"]
-__version__ = "2024.02.02"
diff --git a/release_env/lib/python3.12/site-packages/certifi/__main__.py b/release_env/lib/python3.12/site-packages/certifi/__main__.py
deleted file mode 100644
index 8945b5da8..000000000
--- a/release_env/lib/python3.12/site-packages/certifi/__main__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import argparse
-
-from certifi import contents, where
-
-parser = argparse.ArgumentParser()
-parser.add_argument("-c", "--contents", action="store_true")
-args = parser.parse_args()
-
-if args.contents:
- print(contents())
-else:
- print(where())
diff --git a/release_env/lib/python3.12/site-packages/certifi/cacert.pem b/release_env/lib/python3.12/site-packages/certifi/cacert.pem
deleted file mode 100644
index fac3c3190..000000000
--- a/release_env/lib/python3.12/site-packages/certifi/cacert.pem
+++ /dev/null
@@ -1,4814 +0,0 @@
-
-# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
-# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
-# Label: "GlobalSign Root CA"
-# Serial: 4835703278459707669005204
-# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
-# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
-# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
-MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
-YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
-aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
-jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
-xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
-1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
-snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
-U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
-9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
-AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
-yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
-38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
-AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
-DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
-HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
-# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
-# Label: "Entrust.net Premium 2048 Secure Server CA"
-# Serial: 946069240
-# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
-# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
-# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
-MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
-LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
-YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
-A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
-K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
-sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
-MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
-XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
-HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
-4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
-j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
-U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
-zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
-u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
-bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
-fF6adulZkMV8gzURZVE=
------END CERTIFICATE-----
-
-# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
-# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
-# Label: "Baltimore CyberTrust Root"
-# Serial: 33554617
-# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
-# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
-# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
-RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
-VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
-DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
-ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
-VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
-mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
-IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
-mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
-XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
-dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
-jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
-BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
-DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
-9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
-jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
-Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
-ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
-R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
-# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
-# Label: "Entrust Root Certification Authority"
-# Serial: 1164660820
-# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
-# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
-# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
-Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
-KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
-NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
-NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
-ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
-BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
-Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
-4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
-KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
-rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
-94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
-sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
-gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
-kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
-vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
-O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
-AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
-9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
-eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
-0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
-
-# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
-# Subject: CN=AAA Certificate Services O=Comodo CA Limited
-# Label: "Comodo AAA Services root"
-# Serial: 1
-# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
-# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
-# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
-YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
-GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
-BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
-3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
-YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
-rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
-ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
-oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
-QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
-b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
-AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
-GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
-G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
-l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
-smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 2"
-# Serial: 1289
-# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
-# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
-# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
-GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
-Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
-WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
-rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
-+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
-ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
-Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
-PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
-/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
-oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
-yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
-EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
-A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
-MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
-BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
-g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
-fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
-WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
-B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
-hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
-TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
-mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
-ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
-4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
-8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 3"
-# Serial: 1478
-# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
-# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
-# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
-V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
-4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
-H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
-8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
-vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
-mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
-btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
-T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
-WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
-c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
-4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
-VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
-CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
-aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
-dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
-czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
-A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
-Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
-7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
-d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
-+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
-4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
-t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
-DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
-k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
-zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
-Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
-mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
-4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
-
-# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
-# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
-# Label: "XRamp Global CA Root"
-# Serial: 107108908803651509692980124233745014957
-# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
-# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
-# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
-gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
-MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
-UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
-NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
-dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
-dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
-38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
-KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
-DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
-qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
-JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
-PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
-BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
-jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
-eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
-vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
-IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
-i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
-O+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
-
-# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
-# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
-# Label: "Go Daddy Class 2 CA"
-# Serial: 0
-# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
-# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
-# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
-MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
-YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
-MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
-ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
-MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
-ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
-PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
-wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
-EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
-avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
-YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
-sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
-/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
-IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
-ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
-OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
-TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
-dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
-ReYNnyicsbkqWletNw+vHX/bvZ8=
------END CERTIFICATE-----
-
-# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
-# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
-# Label: "Starfield Class 2 CA"
-# Serial: 0
-# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
-# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
-# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
-MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
-U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
-NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
-ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
-ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
-DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
-8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
-+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
-X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
-K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
-1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
-A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
-zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
-YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
-bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
-DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
-L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
-eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
-VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
-WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Assured ID Root CA"
-# Serial: 17154717934120587862167794914071425081
-# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
-# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
-# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
-JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
-mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
-wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
-VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
-AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
-AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
-BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
-pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
-dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
-fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
-NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
-H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Global Root CA"
-# Serial: 10944719598952040374951832963794454346
-# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
-# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
-# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
-QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
-CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
-nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
-43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
-T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
-gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
-BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
-TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
-DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
-hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
-06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
-PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
-YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert High Assurance EV Root CA"
-# Serial: 3553400076410547919724730734378100087
-# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
-# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
-# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
-LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
-RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
-+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
-PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
-xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
-Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
-hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
-EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
-FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
-nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
-eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
-hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
-Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
-+OkuE6N36B9K
------END CERTIFICATE-----
-
-# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
-# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
-# Label: "SwissSign Gold CA - G2"
-# Serial: 13492815561806991280
-# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
-# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
-# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
-BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
-biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
-MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
-d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
-76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
-bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
-6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
-emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
-MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
-MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
-MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
-FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
-aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
-gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
-qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
-lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
-8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
-45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
-UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
-O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
-bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
-GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
-77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
-hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
-92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
-Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
-ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
-Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
-
-# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
-# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
-# Label: "SwissSign Silver CA - G2"
-# Serial: 5700383053117599563
-# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
-# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
-# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
------BEGIN CERTIFICATE-----
-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
------END CERTIFICATE-----
-
-# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
-# Subject: CN=SecureTrust CA O=SecureTrust Corporation
-# Label: "SecureTrust CA"
-# Serial: 17199774589125277788362757014266862032
-# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
-# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
-# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
-MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
-cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
-Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
-0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
-wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
-7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
-8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
-BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
-JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
-NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
-6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
-3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
-D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
-CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
-
-# Issuer: CN=Secure Global CA O=SecureTrust Corporation
-# Subject: CN=Secure Global CA O=SecureTrust Corporation
-# Label: "Secure Global CA"
-# Serial: 9751836167731051554232119481456978597
-# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
-# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
-# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
-MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
-Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
-iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
-/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
-jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
-HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
-sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
-gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
-KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
-AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
-URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
-H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
-I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
-iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
-
-# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
-# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
-# Label: "COMODO Certification Authority"
-# Serial: 104350513648249232941998508985834464573
-# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
-# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
-# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
-MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
-YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
-RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
-UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
-2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
-Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
-+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
-DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
-nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
-/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
-PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
-QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
-SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
-IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
-zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
-BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
-ZQ==
------END CERTIFICATE-----
-
-# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
-# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
-# Label: "COMODO ECC Certification Authority"
-# Serial: 41578283867086692638256921589707938090
-# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
-# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
-# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
-IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
-MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
-ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
-T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
-FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
-cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
-BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
-fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
-GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
-
-# Issuer: CN=Certigna O=Dhimyotis
-# Subject: CN=Certigna O=Dhimyotis
-# Label: "Certigna"
-# Serial: 18364802974209362175
-# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
-# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
-# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
------BEGIN CERTIFICATE-----
-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
-BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
-DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
-BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
-QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
-gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
-zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
-130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
-JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
-ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
-AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
-AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
-9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
-bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
-fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
-HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
-t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
------END CERTIFICATE-----
-
-# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
-# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
-# Label: "ePKI Root Certification Authority"
-# Serial: 28956088682735189655030529057352760477
-# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
-# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
-# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
------BEGIN CERTIFICATE-----
-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
-MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
-ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
-IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
-SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
-SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
-ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
-DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
-TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
-fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
-sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
-WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
-nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
-dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
-NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
-AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
-MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
-uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
-PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
-JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
-gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
-j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
-5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
-o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
-/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
-Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
-W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
-hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
------END CERTIFICATE-----
-
-# Issuer: O=certSIGN OU=certSIGN ROOT CA
-# Subject: O=certSIGN OU=certSIGN ROOT CA
-# Label: "certSIGN ROOT CA"
-# Serial: 35210227249154
-# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
-# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
-# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
------BEGIN CERTIFICATE-----
-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
-AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
-QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
-MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
-0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
-UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
-RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
-OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
-JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
-AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
-BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
-LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
-MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
-44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
-Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
-i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
-9u6wWk5JRFRYX0KD
------END CERTIFICATE-----
-
-# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
-# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
-# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny"
-# Serial: 80544274841616
-# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
-# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
-# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
-EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
-MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
-cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
-dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
-pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
-b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
-IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
-lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
-AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
-VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
-ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
-BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
-AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
-U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
-bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
-+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
-uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
-XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
-
-# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
-# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
-# Label: "SecureSign RootCA11"
-# Serial: 1
-# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
-# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
-# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
------BEGIN CERTIFICATE-----
-MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
-MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
-A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
-MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
-Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
-QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
-i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
-h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
-MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
-UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
-8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
-h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
-VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
-AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
-KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
-X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
-QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
-pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
-QSdJQO7e5iNEOdyhIta6A/I=
------END CERTIFICATE-----
-
-# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
-# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
-# Label: "Microsec e-Szigno Root CA 2009"
-# Serial: 14014712776195784473
-# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
-# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
-# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
------BEGIN CERTIFICATE-----
-MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
-VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
-ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
-CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
-OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
-FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
-Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
-dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
-kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
-cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
-fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
-N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
-xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
-+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
-Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
-SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
-mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
-ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
-tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
-2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
-HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
-# Label: "GlobalSign Root CA - R3"
-# Serial: 4835703278459759426209954
-# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
-# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
-# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
------BEGIN CERTIFICATE-----
-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
-MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
-RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
-gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
-KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
-QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
-XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
-LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
-RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
-jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
-6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
-mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
-Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
-WD9f
------END CERTIFICATE-----
-
-# Issuer: CN=Izenpe.com O=IZENPE S.A.
-# Subject: CN=Izenpe.com O=IZENPE S.A.
-# Label: "Izenpe.com"
-# Serial: 917563065490389241595536686991402621
-# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
-# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
-# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
------BEGIN CERTIFICATE-----
-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
------END CERTIFICATE-----
-
-# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
-# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
-# Label: "Go Daddy Root Certificate Authority - G2"
-# Serial: 0
-# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
-# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
-# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
-EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
-ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
-NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
-EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
-AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
-E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
-/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
-DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
-GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
-tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
-AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
-FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
-WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
-9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
-gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
-2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
-4uJEvlz36hz1
------END CERTIFICATE-----
-
-# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Label: "Starfield Root Certificate Authority - G2"
-# Serial: 0
-# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
-# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
-# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
-ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
-MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
-aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
-Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
-nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
-HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
-Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
-dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
-HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
-CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
-sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
-4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
-8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
-mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
-
-# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Label: "Starfield Services Root Certificate Authority - G2"
-# Serial: 0
-# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
-# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
-# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
-ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
-VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
-ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
-dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
-OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
-8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
-Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
-hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
-6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
-AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
-bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
-ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
-qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
-0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
-sSi6
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
-# Subject: CN=AffirmTrust Commercial O=AffirmTrust
-# Label: "AffirmTrust Commercial"
-# Serial: 8608355977964138876
-# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
-# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
-# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
-Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
-ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
-MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
-yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
-VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
-nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
-XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
-vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
-Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
-N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
-nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Networking O=AffirmTrust
-# Subject: CN=AffirmTrust Networking O=AffirmTrust
-# Label: "AffirmTrust Networking"
-# Serial: 8957382827206547757
-# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
-# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
-# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
-YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
-kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
-QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
-6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
-yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
-QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
-tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
-QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
-Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
-olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
-x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Premium O=AffirmTrust
-# Subject: CN=AffirmTrust Premium O=AffirmTrust
-# Label: "AffirmTrust Premium"
-# Serial: 7893706540734352110
-# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
-# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
-# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
-dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
-A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
-cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
-qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
-JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
-+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
-s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
-HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
-70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
-V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
-qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
-5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
-C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
-OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
-FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
-KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
-8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
-MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
-0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
-u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
-u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
-YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
-GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
-RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
-KeC2uAloGRwYQw==
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
-# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
-# Label: "AffirmTrust Premium ECC"
-# Serial: 8401224907861490260
-# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
-# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
-# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
-VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
-cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
-BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
-VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
-0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
-ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
-A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
-aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
-flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Label: "Certum Trusted Network CA"
-# Serial: 279744
-# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
-# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
-# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
-MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
-ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
-cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
-WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
-Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
-IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
-UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
-TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
-BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
-kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
-AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
-sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
-I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
-J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
-VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
-
-# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
-# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
-# Label: "TWCA Root Certification Authority"
-# Serial: 1
-# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
-# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
-# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
-MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
-V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
-WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
-LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
-AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
-K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
-RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
-rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
-3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
-hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
-MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
-XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
-lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
-aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
-YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
-
-# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
-# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
-# Label: "Security Communication RootCA2"
-# Serial: 0
-# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
-# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
-# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
-MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
-U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
-DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
-dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
-YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
-OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
-zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
-VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
-hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
-ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
-awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
-OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
-DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
-coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
-okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
-t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
-1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
-SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
------END CERTIFICATE-----
-
-# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
-# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
-# Label: "Actalis Authentication Root CA"
-# Serial: 6271844772424770508
-# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
-# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
-# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
------BEGIN CERTIFICATE-----
-MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
-BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
-MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
-IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
-SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
-ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
-UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
-4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
-KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
-gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
-rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
-51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
-be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
-KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
-v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
-fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
-jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
-ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
-ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
-e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
-jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
-WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
-SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
-pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
-X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
-fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
-K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
-ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
-LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
-LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
------END CERTIFICATE-----
-
-# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
-# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
-# Label: "Buypass Class 2 Root CA"
-# Serial: 2
-# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
-# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
-# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
-Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
-6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
-L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
-1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
-MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
-QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
-arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
-Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
-FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
-P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
-9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
-uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
-9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
-A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
-OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
-+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
-KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
-DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
-H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
-I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
-5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
-3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
-Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
------END CERTIFICATE-----
-
-# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
-# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
-# Label: "Buypass Class 3 Root CA"
-# Serial: 2
-# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
-# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
-# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
-Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
-ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
-N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
-tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
-0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
-/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
-KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
-zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
-O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
-34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
-K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
-Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
-QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
-cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
-IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
-HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
-O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
-033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
-dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
-kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
-3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
-u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
-4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
------END CERTIFICATE-----
-
-# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Label: "T-TeleSec GlobalRoot Class 3"
-# Serial: 1
-# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
-# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
-# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
-YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
-8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
-RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
-hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
-ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
-EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
-A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
-WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
-1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
-6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
-91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
-e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
-TpPDpFQUWw==
------END CERTIFICATE-----
-
-# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
-# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
-# Label: "D-TRUST Root Class 3 CA 2 2009"
-# Serial: 623603
-# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
-# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
-# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
------BEGIN CERTIFICATE-----
-MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
-bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
-ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
-HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
-UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
-tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
-ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
-lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
-/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
-A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
-A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
-dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
-MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
-cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
-L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
-BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
-acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
-o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
-zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
-PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
-Johw1+qRzT65ysCQblrGXnRl11z+o+I=
------END CERTIFICATE-----
-
-# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
-# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
-# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
-# Serial: 623604
-# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
-# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
-# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
-bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
-NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
-BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
-ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
-3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
-qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
-p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
-HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
-ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
-HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
-Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
-c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
-RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
-dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
-Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
-3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
-nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
-CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
-xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
-KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
------END CERTIFICATE-----
-
-# Issuer: CN=CA Disig Root R2 O=Disig a.s.
-# Subject: CN=CA Disig Root R2 O=Disig a.s.
-# Label: "CA Disig Root R2"
-# Serial: 10572350602393338211
-# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
-# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
-# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
------BEGIN CERTIFICATE-----
-MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
-BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
-MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
-MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
-EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
-ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
-NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
-PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
-x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
-QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
-yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
-QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
-H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
-QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
-i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
-nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
-rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
-hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
-tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
-GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
-lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
-+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
-TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
-nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
-gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
-G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
-zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
-L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
------END CERTIFICATE-----
-
-# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
-# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
-# Label: "ACCVRAIZ1"
-# Serial: 6828503384748696800
-# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02
-# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17
-# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13
------BEGIN CERTIFICATE-----
-MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
-AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
-CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
-BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
-VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
-qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
-HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
-G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
-lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
-IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
-0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
-k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
-4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
-m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
-cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
-uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
-KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
-ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
-AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
-VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
-VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
-CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
-cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
-QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
-7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
-cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
-QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
-czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
-aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
-aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
-DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
-BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
-D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
-JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
-AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
-vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
-tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
-7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
-I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
-h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
-d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
-pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
------END CERTIFICATE-----
-
-# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
-# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
-# Label: "TWCA Global Root CA"
-# Serial: 3262
-# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96
-# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65
-# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b
------BEGIN CERTIFICATE-----
-MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
-EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
-VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
-NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
-B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
-10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
-0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
-MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
-zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
-46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
-yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
-laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
-oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
-BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
-qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
-4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
-1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
-LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
-H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
-RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
-nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
-15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
-6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
-nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
-wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
-aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
-KwbQBM0=
------END CERTIFICATE-----
-
-# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera
-# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera
-# Label: "TeliaSonera Root CA v1"
-# Serial: 199041966741090107964904287217786801558
-# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c
-# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37
-# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89
------BEGIN CERTIFICATE-----
-MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
-NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
-b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
-VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
-VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
-7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
-Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
-/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
-81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
-dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
-Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
-sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
-pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
-slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
-arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
-VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
-9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
-dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
-0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
-TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
-Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
-Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
-OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
-vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
-t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
-HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
-SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
------END CERTIFICATE-----
-
-# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Label: "T-TeleSec GlobalRoot Class 2"
-# Serial: 1
-# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a
-# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9
-# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
-YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
-AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
-FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
-1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
-jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
-wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
-WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
-NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
-uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
-IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
-g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
-9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
-BSeOE6Fuwg==
------END CERTIFICATE-----
-
-# Issuer: CN=Atos TrustedRoot 2011 O=Atos
-# Subject: CN=Atos TrustedRoot 2011 O=Atos
-# Label: "Atos TrustedRoot 2011"
-# Serial: 6643877497813316402
-# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56
-# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21
-# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE
-AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG
-EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM
-FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC
-REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp
-Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM
-VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+
-SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ
-4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L
-cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi
-eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV
-HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG
-A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
-DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j
-vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP
-DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc
-maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D
-lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
-KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 1 G3"
-# Serial: 687049649626669250736271037606554624078720034195
-# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab
-# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67
-# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00
-MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV
-wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe
-rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341
-68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh
-4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp
-UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o
-abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc
-3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G
-KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt
-hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO
-Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt
-zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD
-ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
-MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2
-cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN
-qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5
-YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv
-b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2
-8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k
-NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj
-ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp
-q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt
-nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 2 G3"
-# Serial: 390156079458959257446133169266079962026824725800
-# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06
-# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36
-# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
-MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
-qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
-n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
-c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
-O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
-o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
-IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
-IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
-8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
-vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
-7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
-cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
-ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
-AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
-roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
-W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
-lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
-+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
-csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
-dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
-KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
-HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
-WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 3 G3"
-# Serial: 268090761170461462463995952157327242137089239581
-# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7
-# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d
-# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00
-MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR
-/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu
-FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR
-U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c
-ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR
-FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k
-A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw
-eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl
-sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp
-VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q
-A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+
-ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD
-ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
-KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI
-FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv
-oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg
-u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP
-0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf
-3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl
-8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+
-DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN
-PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/
-ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Assured ID Root G2"
-# Serial: 15385348160840213938643033620894905419
-# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d
-# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f
-# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85
------BEGIN CERTIFICATE-----
-MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
-n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
-biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
-EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
-bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
-YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
-AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
-BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
-QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
-0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
-lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
-B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
-ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
-IhNzbM8m9Yop5w==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Assured ID Root G3"
-# Serial: 15459312981008553731928384953135426796
-# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb
-# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89
-# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2
------BEGIN CERTIFICATE-----
-MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
-RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
-Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
-RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
-AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
-JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
-6pZjamVFkpUBtA==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Global Root G2"
-# Serial: 4293743540046975378534879503202253541
-# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44
-# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4
-# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f
------BEGIN CERTIFICATE-----
-MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
-MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
-2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
-1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
-q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
-tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
-vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
-5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
-1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
-NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
-Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
-8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
-pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
-MrY=
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Global Root G3"
-# Serial: 7089244469030293291760083333884364146
-# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca
-# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e
-# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0
------BEGIN CERTIFICATE-----
-MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
-Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
-EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
-IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
-K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
-fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
-Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
-BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
-AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
-oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
-sycX
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Trusted Root G4"
-# Serial: 7451500558977370777930084869016614236
-# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49
-# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4
-# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88
------BEGIN CERTIFICATE-----
-MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
-RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
-ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
-xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
-ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
-DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
-jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
-CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
-EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
-fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
-uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
-chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
-9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
-ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
-SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
-+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
-fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
-sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
-cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
-0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
-4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
-r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
-/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
-gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
------END CERTIFICATE-----
-
-# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited
-# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited
-# Label: "COMODO RSA Certification Authority"
-# Serial: 101909084537582093308941363524873193117
-# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18
-# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4
-# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34
------BEGIN CERTIFICATE-----
-MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
-hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
-BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
-EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
-6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
-pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
-9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
-/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
-Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
-+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
-qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
-SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
-u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
-Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
-crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
-FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
-/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
-wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
-4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
-2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
-FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
-CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
-boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
-jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
-S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
-QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
-0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
-NVOFBkpdn627G190
------END CERTIFICATE-----
-
-# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
-# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
-# Label: "USERTrust RSA Certification Authority"
-# Serial: 2645093764781058787591871645665788717
-# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5
-# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e
-# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2
------BEGIN CERTIFICATE-----
-MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
-iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
-cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
-BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
-MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
-BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
-aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
-3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
-tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
-Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
-VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
-79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
-c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
-Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
-c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
-UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
-Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
-BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
-Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
-VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
-ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
-8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
-iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
-Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
-XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
-qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
-VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
-L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
-jjxDah2nGN59PRbxYvnKkKj9
------END CERTIFICATE-----
-
-# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
-# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
-# Label: "USERTrust ECC Certification Authority"
-# Serial: 123013823720199481456569720443997572134
-# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1
-# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0
-# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a
------BEGIN CERTIFICATE-----
-MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
-MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
-eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
-JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
-Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
-VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
-I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
-o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
-A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
-zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
-RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
-# Label: "GlobalSign ECC Root CA - R5"
-# Serial: 32785792099990507226680698011560947931244
-# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08
-# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa
-# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24
------BEGIN CERTIFICATE-----
-MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
-QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
-MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
-8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
-hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
-KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
-515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
-xwy8p2Fp8fc74SrL+SvzZpA3
------END CERTIFICATE-----
-
-# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
-# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
-# Label: "IdenTrust Commercial Root CA 1"
-# Serial: 13298821034946342390520003877796839426
-# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7
-# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25
-# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
-VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
-MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
-JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
-3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
-+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
-S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
-bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
-T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
-vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
-Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
-dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
-c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
-l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
-iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
-ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
-6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
-LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
-nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
-+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
-W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
-AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
-l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
-4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
-mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
-7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
------END CERTIFICATE-----
-
-# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
-# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
-# Label: "IdenTrust Public Sector Root CA 1"
-# Serial: 13298821034946342390521976156843933698
-# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba
-# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd
-# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f
------BEGIN CERTIFICATE-----
-MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN
-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu
-VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN
-MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0
-MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7
-ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy
-RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS
-bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF
-/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R
-3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw
-EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy
-9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V
-GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ
-2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV
-WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD
-W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN
-AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
-t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV
-DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9
-TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G
-lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW
-mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df
-WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5
-+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ
-tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA
-GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv
-8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
-# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
-# Label: "Entrust Root Certification Authority - G2"
-# Serial: 1246989352
-# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
-# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
-# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
------BEGIN CERTIFICATE-----
-MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
-cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
-IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
-dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
-NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
-dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
-dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
-aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
-RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
-cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
-wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
-U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
-jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
-BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
-jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
-Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
-1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
-nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
-VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
-# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
-# Label: "Entrust Root Certification Authority - EC1"
-# Serial: 51543124481930649114116133369
-# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
-# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
-# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
------BEGIN CERTIFICATE-----
-MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
-A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
-d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
-dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
-RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
-MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
-VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
-L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
-Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
-A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
-ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
-Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
-BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
-R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
-hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
------END CERTIFICATE-----
-
-# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority
-# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority
-# Label: "CFCA EV ROOT"
-# Serial: 407555286
-# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30
-# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83
-# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd
------BEGIN CERTIFICATE-----
-MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
-TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
-MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
-aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
-T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
-sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
-TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
-/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
-7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
-EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
-hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
-a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
-aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
-TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
-PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
-cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
-tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
-BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
-ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
-ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
-jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
-ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
-P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
-xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
-Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
-5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
-/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
-AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
-5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
------END CERTIFICATE-----
-
-# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
-# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
-# Label: "OISTE WISeKey Global Root GB CA"
-# Serial: 157768595616588414422159278966750757568
-# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d
-# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed
-# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6
------BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt
-MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg
-Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i
-YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x
-CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG
-b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
-bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3
-HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx
-WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX
-1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk
-u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P
-99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r
-M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB
-BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh
-cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5
-gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO
-ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf
-aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
-Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
------END CERTIFICATE-----
-
-# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
-# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
-# Label: "SZAFIR ROOT CA2"
-# Serial: 357043034767186914217277344587386743377558296292
-# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99
-# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de
-# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe
------BEGIN CERTIFICATE-----
-MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL
-BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6
-ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw
-NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L
-cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg
-Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN
-QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT
-3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw
-3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6
-3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5
-BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN
-XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
-AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF
-AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw
-8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG
-nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP
-oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy
-d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg
-LvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
------END CERTIFICATE-----
-
-# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Label: "Certum Trusted Network CA 2"
-# Serial: 44979900017204383099463764357512596969
-# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2
-# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92
-# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04
------BEGIN CERTIFICATE-----
-MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB
-gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
-QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG
-A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz
-OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ
-VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3
-b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA
-DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn
-0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB
-OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE
-fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E
-Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m
-o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i
-sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW
-OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez
-Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS
-adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n
-3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ
-F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf
-CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29
-XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm
-djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/
-WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb
-AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq
-P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko
-b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj
-XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P
-5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi
-DrW5viSP
------END CERTIFICATE-----
-
-# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Label: "Hellenic Academic and Research Institutions RootCA 2015"
-# Serial: 0
-# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce
-# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6
-# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36
------BEGIN CERTIFICATE-----
-MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix
-DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k
-IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT
-N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v
-dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG
-A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh
-ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx
-QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
-dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA
-4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0
-AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10
-4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C
-ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV
-9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD
-gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6
-Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq
-NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko
-LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
-Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd
-ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I
-XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI
-M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot
-9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V
-Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea
-j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh
-X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ
-l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf
-bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4
-pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK
-e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0
-vm9qp/UsQu0yrbYhnr68
------END CERTIFICATE-----
-
-# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015"
-# Serial: 0
-# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef
-# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66
-# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33
------BEGIN CERTIFICATE-----
-MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN
-BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl
-bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv
-b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ
-BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj
-YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5
-MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0
-dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg
-QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa
-jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi
-C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep
-lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof
-TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
------END CERTIFICATE-----
-
-# Issuer: CN=ISRG Root X1 O=Internet Security Research Group
-# Subject: CN=ISRG Root X1 O=Internet Security Research Group
-# Label: "ISRG Root X1"
-# Serial: 172886928669790476064670243504169061120
-# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e
-# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8
-# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6
------BEGIN CERTIFICATE-----
-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
------END CERTIFICATE-----
-
-# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
-# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
-# Label: "AC RAIZ FNMT-RCM"
-# Serial: 485876308206448804701554682760554759
-# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d
-# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20
-# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa
------BEGIN CERTIFICATE-----
-MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx
-CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ
-WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ
-BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG
-Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/
-yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf
-BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz
-WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF
-tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z
-374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC
-IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL
-mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7
-wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS
-MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2
-ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet
-UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H
-YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3
-LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
-nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1
-RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM
-LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf
-77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N
-JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm
-fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp
-6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp
-1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B
-9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok
-RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv
-uu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 1 O=Amazon
-# Subject: CN=Amazon Root CA 1 O=Amazon
-# Label: "Amazon Root CA 1"
-# Serial: 143266978916655856878034712317230054538369994
-# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6
-# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16
-# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e
------BEGIN CERTIFICATE-----
-MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
-b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
-b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
-ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
-9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
-IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
-VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
-93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
-jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
-A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
-U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
-N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
-o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
-5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
-rqXRfboQnoZsG4q5WTP468SQvvG5
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 2 O=Amazon
-# Subject: CN=Amazon Root CA 2 O=Amazon
-# Label: "Amazon Root CA 2"
-# Serial: 143266982885963551818349160658925006970653239
-# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66
-# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a
-# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4
------BEGIN CERTIFICATE-----
-MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF
-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
-b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL
-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
-b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK
-gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ
-W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg
-1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K
-8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r
-2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me
-z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR
-8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj
-mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz
-7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6
-+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI
-0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB
-Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm
-UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2
-LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
-+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS
-k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl
-7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm
-btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl
-urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+
-fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63
-n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE
-76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H
-9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT
-4PsJYGw=
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 3 O=Amazon
-# Subject: CN=Amazon Root CA 3 O=Amazon
-# Label: "Amazon Root CA 3"
-# Serial: 143266986699090766294700635381230934788665930
-# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87
-# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e
-# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4
------BEGIN CERTIFICATE-----
-MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
-Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
-Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
-ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
-ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
-BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
-YyRIHN8wfdVoOw==
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 4 O=Amazon
-# Subject: CN=Amazon Root CA 4 O=Amazon
-# Label: "Amazon Root CA 4"
-# Serial: 143266989758080763974105200630763877849284878
-# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd
-# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be
-# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92
------BEGIN CERTIFICATE-----
-MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5
-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
-Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
-Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi
-9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk
-M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB
-MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw
-CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
-1KyLa2tJElMzrdfkviT8tQp21KW8EA==
------END CERTIFICATE-----
-
-# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
-# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
-# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1"
-# Serial: 1
-# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49
-# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca
-# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16
------BEGIN CERTIFICATE-----
-MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx
-GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp
-bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w
-KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0
-BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy
-dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG
-EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll
-IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU
-QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT
-TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg
-LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7
-a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr
-LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr
-N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X
-YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/
-iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f
-AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH
-V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
-BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
-AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf
-IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4
-lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c
-8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf
-lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
------END CERTIFICATE-----
-
-# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
-# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
-# Label: "GDCA TrustAUTH R5 ROOT"
-# Serial: 9009899650740120186
-# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4
-# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4
-# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93
------BEGIN CERTIFICATE-----
-MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE
-BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
-IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0
-MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV
-BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w
-HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj
-Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj
-TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u
-KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj
-qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm
-MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12
-ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP
-zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk
-L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC
-jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA
-HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC
-AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
-p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm
-DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5
-COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry
-L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf
-JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg
-IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io
-2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV
-09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ
-XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq
-T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe
-MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
-# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
-# Label: "SSL.com Root Certification Authority RSA"
-# Serial: 8875640296558310041
-# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29
-# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb
-# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69
------BEGIN CERTIFICATE-----
-MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE
-BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK
-DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz
-OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
-dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
-bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN
-AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R
-xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX
-qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC
-C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3
-6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh
-/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF
-YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E
-JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc
-US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8
-ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm
-+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi
-M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
-HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G
-A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV
-cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc
-Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs
-PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/
-q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0
-cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr
-a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I
-H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y
-K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu
-nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf
-oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY
-Ic2wBlX7Jz9TkHCpBB5XJ7k=
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
-# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
-# Label: "SSL.com Root Certification Authority ECC"
-# Serial: 8495723813297216424
-# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e
-# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a
-# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65
------BEGIN CERTIFICATE-----
-MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC
-VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
-U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz
-WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0
-b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS
-b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
-BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI
-7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg
-CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud
-EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD
-VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T
-kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+
-gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
-# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
-# Label: "SSL.com EV Root Certification Authority RSA R2"
-# Serial: 6248227494352943350
-# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95
-# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a
-# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c
------BEGIN CERTIFICATE-----
-MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV
-BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE
-CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy
-MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G
-A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD
-DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq
-M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf
-OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa
-4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9
-HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR
-aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA
-b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ
-Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV
-PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO
-pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu
-UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY
-MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
-HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4
-9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW
-s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5
-Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg
-cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM
-79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz
-/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt
-ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm
-Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK
-QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ
-w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi
-S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07
-mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
-# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
-# Label: "SSL.com EV Root Certification Authority ECC"
-# Serial: 3182246526754555285
-# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90
-# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d
-# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8
------BEGIN CERTIFICATE-----
-MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC
-VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
-U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx
-NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
-dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv
-bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49
-AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA
-VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku
-WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP
-MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX
-5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ
-ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg
-h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
-# Label: "GlobalSign Root CA - R6"
-# Serial: 1417766617973444989252670301619537
-# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae
-# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1
-# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69
------BEGIN CERTIFICATE-----
-MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg
-MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh
-bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx
-MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET
-MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI
-xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k
-ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD
-aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw
-LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw
-1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX
-k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2
-SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h
-bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n
-WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY
-rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce
-MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu
-bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
-nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt
-Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61
-55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj
-vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf
-cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz
-oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp
-nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs
-pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v
-JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R
-8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4
-5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
------END CERTIFICATE-----
-
-# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed
-# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed
-# Label: "OISTE WISeKey Global Root GC CA"
-# Serial: 44084345621038548146064804565436152554
-# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23
-# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31
-# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d
------BEGIN CERTIFICATE-----
-MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw
-CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91
-bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg
-Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ
-BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu
-ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS
-b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni
-eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W
-p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T
-rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV
-57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg
-Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
------END CERTIFICATE-----
-
-# Issuer: CN=UCA Global G2 Root O=UniTrust
-# Subject: CN=UCA Global G2 Root O=UniTrust
-# Label: "UCA Global G2 Root"
-# Serial: 124779693093741543919145257850076631279
-# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8
-# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a
-# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9
-MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH
-bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x
-CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds
-b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr
-b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9
-kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm
-VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R
-VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc
-C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj
-tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY
-D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv
-j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl
-NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6
-iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP
-O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV
-ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj
-L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
-1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl
-1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU
-b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV
-PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj
-y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb
-EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg
-DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI
-+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy
-YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX
-UB+K+wb1whnw0A==
------END CERTIFICATE-----
-
-# Issuer: CN=UCA Extended Validation Root O=UniTrust
-# Subject: CN=UCA Extended Validation Root O=UniTrust
-# Label: "UCA Extended Validation Root"
-# Serial: 106100277556486529736699587978573607008
-# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2
-# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a
-# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH
-MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF
-eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx
-MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV
-BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog
-D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS
-sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop
-O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk
-sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi
-c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj
-VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz
-KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/
-TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G
-sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs
-1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD
-fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN
-l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
-ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ
-VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5
-c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp
-4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s
-t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj
-2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO
-vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C
-xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx
-cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM
-fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax
------END CERTIFICATE-----
-
-# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036
-# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036
-# Label: "Certigna Root CA"
-# Serial: 269714418870597844693661054334862075617
-# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77
-# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43
-# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68
------BEGIN CERTIFICATE-----
-MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw
-WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw
-MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x
-MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD
-VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX
-BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO
-ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M
-CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu
-I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm
-TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh
-C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf
-ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz
-IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT
-Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k
-JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5
-hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB
-GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
-FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
-1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov
-L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo
-dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr
-aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq
-hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L
-6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG
-HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6
-0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB
-lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi
-o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1
-gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v
-faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63
-Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh
-jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw
-3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
------END CERTIFICATE-----
-
-# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI
-# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI
-# Label: "emSign Root CA - G1"
-# Serial: 235931866688319308814040
-# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac
-# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c
-# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67
------BEGIN CERTIFICATE-----
-MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD
-VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU
-ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH
-MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO
-MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv
-Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz
-f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO
-8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq
-d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM
-tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt
-Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB
-o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x
-PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM
-wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d
-GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH
-6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby
-RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
-iN66zB+Afko=
------END CERTIFICATE-----
-
-# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI
-# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI
-# Label: "emSign ECC Root CA - G3"
-# Serial: 287880440101571086945156
-# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40
-# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1
-# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b
------BEGIN CERTIFICATE-----
-MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG
-EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo
-bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
-RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ
-TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s
-b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw
-djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0
-WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS
-fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB
-zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq
-hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB
-CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD
-+JbNR6iC8hZVdyR+EhCVBCyj
------END CERTIFICATE-----
-
-# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
-# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
-# Label: "emSign Root CA - C1"
-# Serial: 825510296613316004955058
-# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68
-# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01
-# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f
------BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG
-A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg
-SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw
-MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
-biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v
-dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ
-BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ
-HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH
-3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH
-GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c
-xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1
-aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq
-TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
-BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87
-/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4
-kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG
-YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT
-+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo
-WXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
------END CERTIFICATE-----
-
-# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
-# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
-# Label: "emSign ECC Root CA - C3"
-# Serial: 582948710642506000014504
-# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5
-# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66
-# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3
------BEGIN CERTIFICATE-----
-MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG
-EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx
-IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw
-MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
-biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND
-IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci
-MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti
-sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O
-BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
-Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c
-3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J
-0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post
-# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post
-# Label: "Hongkong Post Root CA 3"
-# Serial: 46170865288971385588281144162979347873371282084
-# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0
-# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02
-# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6
------BEGIN CERTIFICATE-----
-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
-mpv0
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only
-# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only
-# Label: "Entrust Root Certification Authority - G4"
-# Serial: 289383649854506086828220374796556676440
-# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88
-# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01
-# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88
------BEGIN CERTIFICATE-----
-MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw
-gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL
-Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg
-MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw
-BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0
-MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1
-c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ
-bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ
-2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E
-T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j
-5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM
-C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T
-DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX
-wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A
-2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm
-nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8
-dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl
-N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj
-c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS
-5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS
-Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr
-hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/
-B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI
-AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw
-H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+
-b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk
-2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol
-IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk
-5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY
-n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw==
------END CERTIFICATE-----
-
-# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation
-# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation
-# Label: "Microsoft ECC Root Certificate Authority 2017"
-# Serial: 136839042543790627607696632466672567020
-# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67
-# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5
-# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02
------BEGIN CERTIFICATE-----
-MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw
-CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD
-VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw
-MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV
-UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy
-b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR
-ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb
-hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3
-FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV
-L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB
-iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
------END CERTIFICATE-----
-
-# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation
-# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation
-# Label: "Microsoft RSA Root Certificate Authority 2017"
-# Serial: 40975477897264996090493496164228220339
-# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47
-# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74
-# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0
------BEGIN CERTIFICATE-----
-MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl
-MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
-NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG
-EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N
-aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ
-Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0
-ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1
-HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm
-gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ
-jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc
-aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG
-YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6
-W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K
-UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH
-+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q
-W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
-NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC
-LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC
-gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6
-tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh
-SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2
-TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3
-pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR
-xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp
-GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9
-dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN
-AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB
-RA+GsCyRxj3qrg+E
------END CERTIFICATE-----
-
-# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd.
-# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd.
-# Label: "e-Szigno Root CA 2017"
-# Serial: 411379200276854331539784714
-# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98
-# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1
-# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99
------BEGIN CERTIFICATE-----
-MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV
-BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk
-LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv
-b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ
-BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg
-THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v
-IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv
-xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H
-Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB
-eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo
-jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ
-+efcMQ==
------END CERTIFICATE-----
-
-# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2
-# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2
-# Label: "certSIGN Root CA G2"
-# Serial: 313609486401300475190
-# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7
-# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32
-# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05
------BEGIN CERTIFICATE-----
-MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV
-BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g
-Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ
-BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ
-R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF
-dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw
-vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ
-uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp
-n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs
-cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW
-xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P
-rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF
-DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx
-DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy
-LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C
-eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ
-d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq
-kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
-b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl
-qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0
-OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c
-NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk
-ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO
-pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj
-03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk
-PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE
-1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX
-QRBdJ3NghVdJIgc=
------END CERTIFICATE-----
-
-# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc.
-# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc.
-# Label: "Trustwave Global Certification Authority"
-# Serial: 1846098327275375458322922162
-# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e
-# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5
-# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8
------BEGIN CERTIFICATE-----
-MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw
-CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x
-ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1
-c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx
-OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI
-SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI
-b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
-ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn
-swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu
-7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8
-1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW
-80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP
-JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l
-RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw
-hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10
-coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc
-BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n
-twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud
-DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W
-0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe
-uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q
-lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB
-aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE
-sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT
-MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe
-qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh
-VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8
-h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9
-EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK
-yeC2nOnOcXHebD8WpHk=
------END CERTIFICATE-----
-
-# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc.
-# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc.
-# Label: "Trustwave Global ECC P256 Certification Authority"
-# Serial: 4151900041497450638097112925
-# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54
-# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf
-# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4
------BEGIN CERTIFICATE-----
-MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD
-VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf
-BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3
-YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x
-NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G
-A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0
-d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF
-Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG
-SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN
-FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w
-DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw
-CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh
-DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7
------END CERTIFICATE-----
-
-# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc.
-# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc.
-# Label: "Trustwave Global ECC P384 Certification Authority"
-# Serial: 2704997926503831671788816187
-# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6
-# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2
-# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97
------BEGIN CERTIFICATE-----
-MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD
-VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf
-BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3
-YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x
-NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G
-A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0
-d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF
-Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB
-BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ
-j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF
-1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G
-A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3
-AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC
-MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu
-Sw==
------END CERTIFICATE-----
-
-# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp.
-# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp.
-# Label: "NAVER Global Root Certification Authority"
-# Serial: 9013692873798656336226253319739695165984492813
-# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b
-# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1
-# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65
------BEGIN CERTIFICATE-----
-MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM
-BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG
-T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx
-CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD
-b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA
-iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH
-38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE
-HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz
-kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP
-szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq
-vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf
-nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG
-YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo
-0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a
-CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K
-AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I
-36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB
-Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN
-qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj
-cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm
-+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL
-hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe
-lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7
-p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8
-piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR
-LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX
-5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO
-dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul
-9XXeifdy
------END CERTIFICATE-----
-
-# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres
-# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres
-# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
-# Serial: 131542671362353147877283741781055151509
-# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb
-# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a
-# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb
------BEGIN CERTIFICATE-----
-MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw
-CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw
-FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S
-Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5
-MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL
-DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS
-QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB
-BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH
-sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK
-Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu
-SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC
-MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy
-v+c=
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa
-# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa
-# Label: "GlobalSign Root R46"
-# Serial: 1552617688466950547958867513931858518042577
-# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef
-# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90
-# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA
-MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD
-VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy
-MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt
-c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ
-OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG
-vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud
-316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo
-0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE
-y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF
-zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE
-+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN
-I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs
-x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa
-ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC
-4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4
-7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
-JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti
-2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk
-pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF
-FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt
-rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk
-ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5
-u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP
-4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6
-N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3
-vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa
-# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa
-# Label: "GlobalSign Root E46"
-# Serial: 1552617690338932563915843282459653771421763
-# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f
-# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84
-# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58
------BEGIN CERTIFICATE-----
-MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx
-CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD
-ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw
-MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
-HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq
-R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd
-yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
-DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ
-7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8
-+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A=
------END CERTIFICATE-----
-
-# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH
-# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH
-# Label: "GLOBALTRUST 2020"
-# Serial: 109160994242082918454945253
-# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8
-# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2
-# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a
------BEGIN CERTIFICATE-----
-MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG
-A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw
-FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx
-MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u
-aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq
-hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b
-RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z
-YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3
-QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw
-yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+
-BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ
-SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH
-r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0
-4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me
-dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw
-q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2
-nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu
-H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
-VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC
-XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd
-6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf
-+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi
-kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7
-wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB
-TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C
-MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn
-4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I
-aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy
-qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
------END CERTIFICATE-----
-
-# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz
-# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz
-# Label: "ANF Secure Server Root CA"
-# Serial: 996390341000653745
-# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96
-# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74
-# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99
------BEGIN CERTIFICATE-----
-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
------END CERTIFICATE-----
-
-# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority
-# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority
-# Label: "Certum EC-384 CA"
-# Serial: 160250656287871593594747141429395092468
-# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1
-# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed
-# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6
------BEGIN CERTIFICATE-----
-MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw
-CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw
-JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT
-EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0
-WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT
-LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX
-BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE
-KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm
-Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8
-EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J
-UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn
-nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=
------END CERTIFICATE-----
-
-# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority
-# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority
-# Label: "Certum Trusted Root CA"
-# Serial: 40870380103424195783807378461123655149
-# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29
-# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5
-# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd
------BEGIN CERTIFICATE-----
-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
------END CERTIFICATE-----
-
-# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique
-# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique
-# Label: "TunTrust Root CA"
-# Serial: 108534058042236574382096126452369648152337120275
-# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4
-# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb
-# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41
------BEGIN CERTIFICATE-----
-MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL
-BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg
-Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv
-b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG
-EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u
-IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ
-n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd
-2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF
-VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ
-GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF
-li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU
-r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2
-eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb
-MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg
-jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB
-7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW
-5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE
-ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0
-90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z
-xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu
-QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4
-FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH
-22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP
-xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn
-dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5
-Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b
-nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ
-CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH
-u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj
-d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o=
------END CERTIFICATE-----
-
-# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA
-# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA
-# Label: "HARICA TLS RSA Root CA 2021"
-# Serial: 76817823531813593706434026085292783742
-# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91
-# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d
-# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs
-MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg
-Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL
-MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
-YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv
-b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l
-mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE
-4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv
-a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M
-pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw
-Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b
-LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY
-AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB
-AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq
-E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr
-W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ
-CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU
-X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3
-f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja
-H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP
-JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P
-zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt
-jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0
-/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT
-BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79
-aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW
-xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU
-63ZTGI0RmLo=
------END CERTIFICATE-----
-
-# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA
-# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA
-# Label: "HARICA TLS ECC Root CA 2021"
-# Serial: 137515985548005187474074462014555733966
-# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0
-# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48
-# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01
------BEGIN CERTIFICATE-----
-MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw
-CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh
-cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v
-dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG
-A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
-aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg
-Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7
-KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y
-STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD
-AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw
-SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN
-nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
------END CERTIFICATE-----
-
-# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
-# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
-# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
-# Serial: 1977337328857672817
-# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3
-# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe
-# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE
-BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
-cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1
-MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
-Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
-thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
-cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
-L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
-NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
-X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
-m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
-Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
-EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
-KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
-6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
-OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc
-tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd
-IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j
-b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC
-AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw
-ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m
-iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF
-Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ
-hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P
-Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE
-EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV
-1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t
-CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR
-5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw
-f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9
-ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK
-GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV
------END CERTIFICATE-----
-
-# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd.
-# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd.
-# Label: "vTrus ECC Root CA"
-# Serial: 630369271402956006249506845124680065938238527194
-# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85
-# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1
-# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3
------BEGIN CERTIFICATE-----
-MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw
-RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY
-BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz
-MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u
-LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF
-K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0
-v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd
-e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw
-V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA
-AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG
-GJTO
------END CERTIFICATE-----
-
-# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd.
-# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd.
-# Label: "vTrus Root CA"
-# Serial: 387574501246983434957692974888460947164905180485
-# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc
-# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7
-# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87
------BEGIN CERTIFICATE-----
-MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL
-BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x
-FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx
-MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s
-THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc
-IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU
-AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+
-GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9
-8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH
-flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt
-J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim
-0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN
-pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ
-UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW
-OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB
-AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet
-8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd
-nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j
-bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM
-Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv
-TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS
-S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr
-I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9
-b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB
-UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P
-Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven
-sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s=
------END CERTIFICATE-----
-
-# Issuer: CN=ISRG Root X2 O=Internet Security Research Group
-# Subject: CN=ISRG Root X2 O=Internet Security Research Group
-# Label: "ISRG Root X2"
-# Serial: 87493402998870891108772069816698636114
-# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5
-# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af
-# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70
------BEGIN CERTIFICATE-----
-MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
-CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
-R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
-MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
-ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
-EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
-+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
-ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
-AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
-zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
-tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
-/q4AaOeMSQ+2b1tbFfLn
------END CERTIFICATE-----
-
-# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd.
-# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd.
-# Label: "HiPKI Root CA - G1"
-# Serial: 60966262342023497858655262305426234976
-# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3
-# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60
-# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc
------BEGIN CERTIFICATE-----
-MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP
-MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
-ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa
-Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3
-YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw
-qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv
-Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6
-lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz
-Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ
-KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK
-FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj
-HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr
-y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ
-/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM
-a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6
-fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG
-SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi
-7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc
-SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza
-ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc
-XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg
-iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho
-L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF
-Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr
-kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+
-vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU
-YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ==
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
-# Label: "GlobalSign ECC Root CA - R4"
-# Serial: 159662223612894884239637590694
-# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc
-# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28
-# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2
------BEGIN CERTIFICATE-----
-MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD
-VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh
-bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw
-MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g
-UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT
-BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx
-uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV
-HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/
-+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147
-bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R1 O=Google Trust Services LLC
-# Subject: CN=GTS Root R1 O=Google Trust Services LLC
-# Label: "GTS Root R1"
-# Serial: 159662320309726417404178440727
-# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40
-# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a
-# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf
------BEGIN CERTIFICATE-----
-MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw
-CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
-MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
-MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
-Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo
-27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w
-Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw
-TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl
-qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH
-szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8
-Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk
-MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92
-wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p
-aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN
-VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID
-AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb
-C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe
-QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy
-h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4
-7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J
-ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef
-MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/
-Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT
-6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ
-0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm
-2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb
-bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R2 O=Google Trust Services LLC
-# Subject: CN=GTS Root R2 O=Google Trust Services LLC
-# Label: "GTS Root R2"
-# Serial: 159662449406622349769042896298
-# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc
-# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94
-# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8
------BEGIN CERTIFICATE-----
-MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw
-CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
-MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
-MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
-Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt
-nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY
-6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu
-MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k
-RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg
-f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV
-+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo
-dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW
-Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa
-G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq
-gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID
-AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H
-vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8
-0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC
-B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u
-NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg
-yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev
-HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6
-xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR
-TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg
-JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV
-7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl
-6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R3 O=Google Trust Services LLC
-# Subject: CN=GTS Root R3 O=Google Trust Services LLC
-# Label: "GTS Root R3"
-# Serial: 159662495401136852707857743206
-# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73
-# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46
-# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48
------BEGIN CERTIFICATE-----
-MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD
-VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG
-A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw
-WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz
-IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
-AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G
-jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2
-4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
-BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7
-VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm
-ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R4 O=Google Trust Services LLC
-# Subject: CN=GTS Root R4 O=Google Trust Services LLC
-# Label: "GTS Root R4"
-# Serial: 159662532700760215368942768210
-# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8
-# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47
-# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d
------BEGIN CERTIFICATE-----
-MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD
-VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG
-A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw
-WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz
-IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
-AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi
-QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR
-HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
-BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D
-9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8
-p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD
------END CERTIFICATE-----
-
-# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj
-# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj
-# Label: "Telia Root CA v2"
-# Serial: 7288924052977061235122729490515358
-# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48
-# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd
-# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c
------BEGIN CERTIFICATE-----
-MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx
-CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE
-AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1
-NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ
-MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq
-AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9
-vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9
-lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD
-n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT
-7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o
-6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC
-TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6
-WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R
-DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI
-pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj
-YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy
-rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ
-8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi
-0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM
-A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS
-SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K
-TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF
-6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er
-3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt
-Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT
-VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW
-ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA
-rBPuUBQemMc=
------END CERTIFICATE-----
-
-# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH
-# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH
-# Label: "D-TRUST BR Root CA 1 2020"
-# Serial: 165870826978392376648679885835942448534
-# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed
-# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67
-# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44
------BEGIN CERTIFICATE-----
-MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw
-CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS
-VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5
-NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG
-A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB
-BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS
-zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0
-QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/
-VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g
-PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf
-Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l
-dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1
-c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO
-PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW
-wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV
-dWNbFJWcHwHP2NVypw87
------END CERTIFICATE-----
-
-# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH
-# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH
-# Label: "D-TRUST EV Root CA 1 2020"
-# Serial: 126288379621884218666039612629459926992
-# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e
-# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07
-# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db
------BEGIN CERTIFICATE-----
-MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw
-CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS
-VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5
-NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG
-A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB
-BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC
-/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD
-wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3
-OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g
-PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf
-Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l
-dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1
-c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO
-PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA
-y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb
-gfM0agPnIjhQW+0ZT0MW
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc.
-# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc.
-# Label: "DigiCert TLS ECC P384 Root G5"
-# Serial: 13129116028163249804115411775095713523
-# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed
-# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee
-# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05
------BEGIN CERTIFICATE-----
-MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp
-Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2
-MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ
-bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG
-ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS
-7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp
-0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS
-B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49
-BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ
-LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4
-DXZDjC5Ty3zfDBeWUA==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc.
-# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc.
-# Label: "DigiCert TLS RSA4096 Root G5"
-# Serial: 11930366277458970227240571539258396554
-# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1
-# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35
-# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75
------BEGIN CERTIFICATE-----
-MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN
-MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT
-HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN
-NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs
-IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+
-ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0
-2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp
-wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM
-pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD
-nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po
-sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx
-Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd
-Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX
-KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe
-XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL
-tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv
-TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN
-AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw
-GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H
-PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF
-O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ
-REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik
-AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv
-/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+
-p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw
-MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF
-qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK
-ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+
------END CERTIFICATE-----
-
-# Issuer: CN=Certainly Root R1 O=Certainly
-# Subject: CN=Certainly Root R1 O=Certainly
-# Label: "Certainly Root R1"
-# Serial: 188833316161142517227353805653483829216
-# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12
-# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af
-# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0
------BEGIN CERTIFICATE-----
-MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw
-PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy
-dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9
-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0
-YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2
-1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT
-vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed
-aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0
-1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5
-r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5
-cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ
-wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ
-6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA
-2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH
-Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR
-eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB
-/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u
-d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr
-PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d
-8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi
-1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd
-rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di
-taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7
-lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj
-yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn
-Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy
-yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n
-wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6
-OV+KmalBWQewLK8=
------END CERTIFICATE-----
-
-# Issuer: CN=Certainly Root E1 O=Certainly
-# Subject: CN=Certainly Root E1 O=Certainly
-# Label: "Certainly Root E1"
-# Serial: 8168531406727139161245376702891150584
-# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9
-# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b
-# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2
------BEGIN CERTIFICATE-----
-MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw
-CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu
-bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ
-BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s
-eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK
-+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2
-QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4
-hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm
-ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG
-BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
------END CERTIFICATE-----
-
-# Issuer: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD.
-# Subject: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD.
-# Label: "Security Communication RootCA3"
-# Serial: 16247922307909811815
-# MD5 Fingerprint: 1c:9a:16:ff:9e:5c:e0:4d:8a:14:01:f4:35:5d:29:26
-# SHA1 Fingerprint: c3:03:c8:22:74:92:e5:61:a2:9c:5f:79:91:2b:1e:44:13:91:30:3a
-# SHA256 Fingerprint: 24:a5:5c:2a:b0:51:44:2d:06:17:76:65:41:23:9a:4a:d0:32:d7:c5:51:75:aa:34:ff:de:2f:bc:4f:5c:52:94
------BEGIN CERTIFICATE-----
-MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNV
-BAYTAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScw
-JQYDVQQDEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2
-MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UEAxMeU2VjdXJpdHkg
-Q29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4r
-CmDvu20rhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzA
-lrenfna84xtSGc4RHwsENPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MG
-TfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF7
-9+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGmnpjKIG58u4iFW/vAEGK7
-8vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtYXLVqAvO4
-g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3we
-GVPKp7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst
-+3A7caoreyYn8xrC3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M
-0V9hvqG8OmpI6iZVIhZdXw3/JzOfGAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQ
-T9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0VcwCBEF/VfR2ccCAwEAAaNCMEAw
-HQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS
-YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PA
-FNr0Y/Dq9HHuTofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd
-9XbXv8S2gVj/yP9kaWJ5rW4OH3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQI
-UYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASxYfQAW0q3nHE3GYV5v4GwxxMOdnE+
-OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZXSEIx2C/pHF7uNke
-gr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml+LLf
-iAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUV
-nuiZIesnKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD
-2NCcnWXL0CsnMQMeNuE9dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//
-1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm6Vwdp6POXiUyK+OVrCoHzrQoeIY8Laad
-TdJ0MN1kURXbg4NR16/9M51NZg==
------END CERTIFICATE-----
-
-# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD.
-# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD.
-# Label: "Security Communication ECC RootCA1"
-# Serial: 15446673492073852651
-# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86
-# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41
-# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11
------BEGIN CERTIFICATE-----
-MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT
-AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD
-VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx
-NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT
-HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5
-IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
-AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl
-dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK
-ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu
-9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O
-be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k=
------END CERTIFICATE-----
-
-# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY
-# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY
-# Label: "BJCA Global Root CA1"
-# Serial: 113562791157148395269083148143378328608
-# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90
-# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a
-# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae
------BEGIN CERTIFICATE-----
-MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU
-MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI
-T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz
-MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF
-SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh
-bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z
-xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ
-spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5
-58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR
-at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll
-5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq
-nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK
-V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/
-pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO
-z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn
-jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+
-WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF
-7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4
-YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli
-awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u
-+2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88
-X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN
-SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo
-P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI
-+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz
-znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9
-eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2
-YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy
-r/6zcCwupvI=
------END CERTIFICATE-----
-
-# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY
-# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY
-# Label: "BJCA Global Root CA2"
-# Serial: 58605626836079930195615843123109055211
-# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c
-# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6
-# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82
------BEGIN CERTIFICATE-----
-MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw
-CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ
-VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy
-MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ
-TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS
-b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B
-IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+
-+kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK
-sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
-AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA
-94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B
-43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w==
------END CERTIFICATE-----
-
-# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited
-# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited
-# Label: "Sectigo Public Server Authentication Root E46"
-# Serial: 88989738453351742415770396670917916916
-# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01
-# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a
-# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83
------BEGIN CERTIFICATE-----
-MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw
-CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T
-ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN
-MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG
-A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT
-ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC
-WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+
-6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B
-Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa
-qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q
-4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw==
------END CERTIFICATE-----
-
-# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited
-# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited
-# Label: "Sectigo Public Server Authentication Root R46"
-# Serial: 156256931880233212765902055439220583700
-# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5
-# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38
-# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06
------BEGIN CERTIFICATE-----
-MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf
-MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD
-Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw
-HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY
-MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp
-YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa
-ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz
-SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf
-iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X
-ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3
-IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS
-VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE
-SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu
-+Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt
-8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L
-HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt
-zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P
-AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c
-mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ
-YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52
-gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA
-Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB
-JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX
-DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui
-TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5
-dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65
-LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp
-0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY
-QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation
-# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation
-# Label: "SSL.com TLS RSA Root CA 2022"
-# Serial: 148535279242832292258835760425842727825
-# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da
-# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca
-# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed
------BEGIN CERTIFICATE-----
-MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO
-MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD
-DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX
-DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw
-b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC
-AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP
-L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY
-t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins
-S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3
-PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO
-L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3
-R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w
-dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS
-+YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS
-d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG
-AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f
-gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
-BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z
-NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt
-hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM
-QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf
-R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ
-DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW
-P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy
-lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq
-bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w
-AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q
-r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji
-Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU
-98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA=
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation
-# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation
-# Label: "SSL.com TLS ECC Root CA 2022"
-# Serial: 26605119622390491762507526719404364228
-# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5
-# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39
-# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43
------BEGIN CERTIFICATE-----
-MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw
-CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT
-U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2
-MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh
-dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG
-ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm
-acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN
-SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
-GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW
-uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp
-15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN
-b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g==
------END CERTIFICATE-----
-
-# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos
-# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos
-# Label: "Atos TrustedRoot Root CA ECC TLS 2021"
-# Serial: 81873346711060652204712539181482831616
-# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8
-# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd
-# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8
------BEGIN CERTIFICATE-----
-MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w
-LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w
-CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0
-MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF
-Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI
-zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X
-tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4
-AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2
-KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD
-aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu
-CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo
-9H1/IISpQuQo
------END CERTIFICATE-----
-
-# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos
-# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos
-# Label: "Atos TrustedRoot Root CA RSA TLS 2021"
-# Serial: 111436099570196163832749341232207667876
-# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2
-# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48
-# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f
------BEGIN CERTIFICATE-----
-MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM
-MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx
-MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00
-MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD
-QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN
-BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z
-4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv
-Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ
-kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs
-GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln
-nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh
-3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD
-0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy
-geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8
-ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB
-c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI
-pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
-dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
-DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS
-4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs
-o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ
-qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw
-xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM
-rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4
-AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR
-0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY
-o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5
-dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE
-oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ==
------END CERTIFICATE-----
-
-# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc.
-# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc.
-# Label: "TrustAsia Global Root CA G3"
-# Serial: 576386314500428537169965010905813481816650257167
-# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04
-# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7
-# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08
------BEGIN CERTIFICATE-----
-MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM
-BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp
-ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe
-Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw
-IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU
-cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS
-T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK
-AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1
-nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep
-qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA
-yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs
-hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX
-zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv
-kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT
-f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA
-uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB
-o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih
-MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E
-BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4
-wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2
-XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1
-JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j
-ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV
-VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx
-xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on
-AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d
-7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj
-gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV
-+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo
-FGWsJwt0ivKH
------END CERTIFICATE-----
-
-# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc.
-# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc.
-# Label: "TrustAsia Global Root CA G4"
-# Serial: 451799571007117016466790293371524403291602933463
-# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb
-# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a
-# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c
------BEGIN CERTIFICATE-----
-MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw
-WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs
-IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y
-MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD
-VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz
-dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx
-s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw
-LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij
-YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD
-pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE
-AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR
-UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj
-/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA==
------END CERTIFICATE-----
-
-# Issuer: CN=CommScope Public Trust ECC Root-01 O=CommScope
-# Subject: CN=CommScope Public Trust ECC Root-01 O=CommScope
-# Label: "CommScope Public Trust ECC Root-01"
-# Serial: 385011430473757362783587124273108818652468453534
-# MD5 Fingerprint: 3a:40:a7:fc:03:8c:9c:38:79:2f:3a:a2:6c:b6:0a:16
-# SHA1 Fingerprint: 07:86:c0:d8:dd:8e:c0:80:98:06:98:d0:58:7a:ef:de:a6:cc:a2:5d
-# SHA256 Fingerprint: 11:43:7c:da:7b:b4:5e:41:36:5f:45:b3:9a:38:98:6b:0d:e0:0d:ef:34:8e:0c:7b:b0:87:36:33:80:0b:c3:8b
------BEGIN CERTIFICATE-----
-MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMw
-TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t
-bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNa
-Fw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv
-cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEw
-djAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLxeP0C
-flfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJE
-hRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq
-hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg
-2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uS
-Um9poIyNStDuiw7LR47QjRE=
------END CERTIFICATE-----
-
-# Issuer: CN=CommScope Public Trust ECC Root-02 O=CommScope
-# Subject: CN=CommScope Public Trust ECC Root-02 O=CommScope
-# Label: "CommScope Public Trust ECC Root-02"
-# Serial: 234015080301808452132356021271193974922492992893
-# MD5 Fingerprint: 59:b0:44:d5:65:4d:b8:5c:55:19:92:02:b6:d1:94:b2
-# SHA1 Fingerprint: 3c:3f:ef:57:0f:fe:65:93:86:9e:a0:fe:b0:f6:ed:8e:d1:13:c7:e5
-# SHA256 Fingerprint: 2f:fb:7f:81:3b:bb:b3:c8:9a:b4:e8:16:2d:0f:16:d7:15:09:a8:30:cc:9d:73:c2:62:e5:14:08:75:d1:ad:4a
------BEGIN CERTIFICATE-----
-MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMw
-TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t
-bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRa
-Fw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv
-cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIw
-djAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/MMDAL
-j2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmU
-v4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq
-hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/n
-ich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AV
-mkzw5l4lIhVtwodZ0LKOag==
------END CERTIFICATE-----
-
-# Issuer: CN=CommScope Public Trust RSA Root-01 O=CommScope
-# Subject: CN=CommScope Public Trust RSA Root-01 O=CommScope
-# Label: "CommScope Public Trust RSA Root-01"
-# Serial: 354030733275608256394402989253558293562031411421
-# MD5 Fingerprint: 0e:b4:15:bc:87:63:5d:5d:02:73:d4:26:38:68:73:d8
-# SHA1 Fingerprint: 6d:0a:5f:f7:b4:23:06:b4:85:b3:b7:97:64:fc:ac:75:f5:33:f2:93
-# SHA256 Fingerprint: 02:bd:f9:6e:2a:45:dd:9b:f1:8f:c7:e1:db:df:21:a0:37:9b:a3:c9:c2:61:03:44:cf:d8:d6:06:fe:c1:ed:81
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQEL
-BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi
-Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1
-NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t
-U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt
-MDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45FtnYSk
-YZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslh
-suitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0al
-DrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj
-WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFl
-P8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547
-KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7p
-UcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/
-kQO9lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JO
-Hg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkB
-Ea801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6U
-CBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ
-KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6
-NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQ
-nmhUQo8mUuJM3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+
-QgvfKNmwrZggvkN80V4aCRckjXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2v
-trV0KnahP/t1MJ+UXjulYPPLXAziDslg+MkfFoom3ecnf+slpoq9uC02EJqxWE2a
-aE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/WNyVntHKLr4W96ioD
-j8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+o/E4
-Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0w
-lREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn
-YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVoc
-icCMb3SgazNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw
------END CERTIFICATE-----
-
-# Issuer: CN=CommScope Public Trust RSA Root-02 O=CommScope
-# Subject: CN=CommScope Public Trust RSA Root-02 O=CommScope
-# Label: "CommScope Public Trust RSA Root-02"
-# Serial: 480062499834624527752716769107743131258796508494
-# MD5 Fingerprint: e1:29:f9:62:7b:76:e2:96:6d:f3:d4:d7:0f:ae:1f:aa
-# SHA1 Fingerprint: ea:b0:e2:52:1b:89:93:4c:11:68:f2:d8:9a:ac:22:4c:a3:8a:57:ae
-# SHA256 Fingerprint: ff:e9:43:d7:93:42:4b:4f:7c:44:0c:1c:3d:64:8d:53:63:f3:4b:82:dc:87:aa:7a:9f:11:8f:c5:de:e1:01:f1
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQEL
-BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi
-Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2
-NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t
-U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt
-MDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3VrCLE
-NQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0
-kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1C
-rWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz
-hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2
-LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcs
-n/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tku
-FT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5
-kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3
-wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6v
-wQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs
-5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ
-KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB
-KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3
-+VGXu6TwYofF1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbyme
-APnCKfWxkxlSaRosTKCL4BWaMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3Nyq
-pgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT
-6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2OHG1QAk8mGEPej1WF
-sQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+NmYWvt
-PjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2d
-lklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670
-v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17O
-rg3bhzjlP1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7
------END CERTIFICATE-----
-
-# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH
-# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH
-# Label: "Telekom Security TLS ECC Root 2020"
-# Serial: 72082518505882327255703894282316633856
-# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd
-# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec
-# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1
------BEGIN CERTIFICATE-----
-MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw
-CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH
-bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw
-MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx
-JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE
-AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49
-AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O
-tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP
-f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA
-MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di
-z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn
-27iQ7t0l
------END CERTIFICATE-----
-
-# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH
-# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH
-# Label: "Telekom Security TLS RSA Root 2023"
-# Serial: 44676229530606711399881795178081572759
-# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2
-# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93
-# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46
------BEGIN CERTIFICATE-----
-MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj
-MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0
-eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy
-MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC
-REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG
-A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9
-cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV
-cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA
-U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6
-Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug
-BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy
-8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J
-co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg
-8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8
-rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12
-mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg
-+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX
-gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
-p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ
-pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm
-9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw
-M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd
-GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+
-CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t
-xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+
-w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK
-L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj
-X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q
-ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm
-dTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
------END CERTIFICATE-----
diff --git a/release_env/lib/python3.12/site-packages/certifi/core.py b/release_env/lib/python3.12/site-packages/certifi/core.py
deleted file mode 100644
index 91f538bb1..000000000
--- a/release_env/lib/python3.12/site-packages/certifi/core.py
+++ /dev/null
@@ -1,114 +0,0 @@
-"""
-certifi.py
-~~~~~~~~~~
-
-This module returns the installation location of cacert.pem or its contents.
-"""
-import sys
-import atexit
-
-def exit_cacert_ctx() -> None:
- _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr]
-
-
-if sys.version_info >= (3, 11):
-
- from importlib.resources import as_file, files
-
- _CACERT_CTX = None
- _CACERT_PATH = None
-
- def where() -> str:
- # This is slightly terrible, but we want to delay extracting the file
- # in cases where we're inside of a zipimport situation until someone
- # actually calls where(), but we don't want to re-extract the file
- # on every call of where(), so we'll do it once then store it in a
- # global variable.
- global _CACERT_CTX
- global _CACERT_PATH
- if _CACERT_PATH is None:
- # This is slightly janky, the importlib.resources API wants you to
- # manage the cleanup of this file, so it doesn't actually return a
- # path, it returns a context manager that will give you the path
- # when you enter it and will do any cleanup when you leave it. In
- # the common case of not needing a temporary file, it will just
- # return the file system location and the __exit__() is a no-op.
- #
- # We also have to hold onto the actual context manager, because
- # it will do the cleanup whenever it gets garbage collected, so
- # we will also store that at the global level as well.
- _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem"))
- _CACERT_PATH = str(_CACERT_CTX.__enter__())
- atexit.register(exit_cacert_ctx)
-
- return _CACERT_PATH
-
- def contents() -> str:
- return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii")
-
-elif sys.version_info >= (3, 7):
-
- from importlib.resources import path as get_path, read_text
-
- _CACERT_CTX = None
- _CACERT_PATH = None
-
- def where() -> str:
- # This is slightly terrible, but we want to delay extracting the
- # file in cases where we're inside of a zipimport situation until
- # someone actually calls where(), but we don't want to re-extract
- # the file on every call of where(), so we'll do it once then store
- # it in a global variable.
- global _CACERT_CTX
- global _CACERT_PATH
- if _CACERT_PATH is None:
- # This is slightly janky, the importlib.resources API wants you
- # to manage the cleanup of this file, so it doesn't actually
- # return a path, it returns a context manager that will give
- # you the path when you enter it and will do any cleanup when
- # you leave it. In the common case of not needing a temporary
- # file, it will just return the file system location and the
- # __exit__() is a no-op.
- #
- # We also have to hold onto the actual context manager, because
- # it will do the cleanup whenever it gets garbage collected, so
- # we will also store that at the global level as well.
- _CACERT_CTX = get_path("certifi", "cacert.pem")
- _CACERT_PATH = str(_CACERT_CTX.__enter__())
- atexit.register(exit_cacert_ctx)
-
- return _CACERT_PATH
-
- def contents() -> str:
- return read_text("certifi", "cacert.pem", encoding="ascii")
-
-else:
- import os
- import types
- from typing import Union
-
- Package = Union[types.ModuleType, str]
- Resource = Union[str, "os.PathLike"]
-
- # This fallback will work for Python versions prior to 3.7 that lack the
- # importlib.resources module but relies on the existing `where` function
- # so won't address issues with environments like PyOxidizer that don't set
- # __file__ on modules.
- def read_text(
- package: Package,
- resource: Resource,
- encoding: str = 'utf-8',
- errors: str = 'strict'
- ) -> str:
- with open(where(), encoding=encoding) as data:
- return data.read()
-
- # If we don't have importlib.resources, then we will just do the old logic
- # of assuming we're on the filesystem and munge the path directly.
- def where() -> str:
- f = os.path.dirname(__file__)
-
- return os.path.join(f, "cacert.pem")
-
- def contents() -> str:
- return read_text("certifi", "cacert.pem", encoding="ascii")
diff --git a/release_env/lib/python3.12/site-packages/certifi/py.typed b/release_env/lib/python3.12/site-packages/certifi/py.typed
deleted file mode 100644
index e69de29bb..000000000
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/INSTALLER b/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/INSTALLER
deleted file mode 100644
index a1b589e38..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/LICENSE b/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/LICENSE
deleted file mode 100644
index ad82355b8..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2019 TAHRI Ahmed R.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/METADATA b/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/METADATA
deleted file mode 100644
index 822550e36..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/METADATA
+++ /dev/null
@@ -1,683 +0,0 @@
-Metadata-Version: 2.1
-Name: charset-normalizer
-Version: 3.3.2
-Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.
-Home-page: https://github.com/Ousret/charset_normalizer
-Author: Ahmed TAHRI
-Author-email: ahmed.tahri@cloudnursery.dev
-License: MIT
-Project-URL: Bug Reports, https://github.com/Ousret/charset_normalizer/issues
-Project-URL: Documentation, https://charset-normalizer.readthedocs.io/en/latest
-Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Intended Audience :: Developers
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: 3.11
-Classifier: Programming Language :: Python :: 3.12
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Text Processing :: Linguistic
-Classifier: Topic :: Utilities
-Classifier: Typing :: Typed
-Requires-Python: >=3.7.0
-Description-Content-Type: text/markdown
-License-File: LICENSE
-Provides-Extra: unicode_backport
-
-Charset Detection, for Everyone 👋
-
-
- The Real First Universal Charset Detector
-
-
-
-
-
-
-
-
-
-
-
- Featured Packages
-
-
-
-
-
-
-
-
- In other language (unofficial port - by the community)
-
-
-
-
-
-> A library that helps you read text from an unknown charset encoding. Motivated by `chardet`,
-> I'm trying to resolve the issue by taking a new approach.
-> All IANA character set names for which the Python core library provides codecs are supported.
-
-
- >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<<
-
-
-This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**.
-
-| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) |
-|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:|
-| `Fast` | ❌ | ✅ | ✅ |
-| `Universal**` | ❌ | ✅ | ❌ |
-| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ |
-| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ |
-| `License` | LGPL-2.1 _restrictive_ | MIT | MPL-1.1 _restrictive_ |
-| `Native Python` | ✅ | ✅ | ❌ |
-| `Detect spoken language` | ❌ | ✅ | N/A |
-| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ |
-| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB |
-| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 |
-
-
-
-
-
-*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
-Did you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html)
-
-## ⚡ Performance
-
-This package offer better performance than its counterpart Chardet. Here are some numbers.
-
-| Package | Accuracy | Mean per file (ms) | File per sec (est) |
-|-----------------------------------------------|:--------:|:------------------:|:------------------:|
-| [chardet](https://github.com/chardet/chardet) | 86 % | 200 ms | 5 file/sec |
-| charset-normalizer | **98 %** | **10 ms** | 100 file/sec |
-
-| Package | 99th percentile | 95th percentile | 50th percentile |
-|-----------------------------------------------|:---------------:|:---------------:|:---------------:|
-| [chardet](https://github.com/chardet/chardet) | 1200 ms | 287 ms | 23 ms |
-| charset-normalizer | 100 ms | 50 ms | 5 ms |
-
-Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload.
-
-> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows.
-> And yes, these results might change at any time. The dataset can be updated to include more files.
-> The actual delays heavily depends on your CPU capabilities. The factors should remain the same.
-> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability
-> (eg. Supported Encoding) Challenge-them if you want.
-
-## ✨ Installation
-
-Using pip:
-
-```sh
-pip install charset-normalizer -U
-```
-
-## 🚀 Basic Usage
-
-### CLI
-This package comes with a CLI.
-
-```
-usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD]
- file [file ...]
-
-The Real First Universal Charset Detector. Discover originating encoding used
-on text file. Normalize text to unicode.
-
-positional arguments:
- files File(s) to be analysed
-
-optional arguments:
- -h, --help show this help message and exit
- -v, --verbose Display complementary information about file if any.
- Stdout will contain logs about the detection process.
- -a, --with-alternative
- Output complementary possibilities if any. Top-level
- JSON WILL be a list.
- -n, --normalize Permit to normalize input file. If not set, program
- does not write anything.
- -m, --minimal Only output the charset detected to STDOUT. Disabling
- JSON output.
- -r, --replace Replace file when trying to normalize it instead of
- creating a new one.
- -f, --force Replace file without asking if you are sure, use this
- flag with caution.
- -t THRESHOLD, --threshold THRESHOLD
- Define a custom maximum amount of chaos allowed in
- decoded content. 0. <= chaos <= 1.
- --version Show version information and exit.
-```
-
-```bash
-normalizer ./data/sample.1.fr.srt
-```
-
-or
-
-```bash
-python -m charset_normalizer ./data/sample.1.fr.srt
-```
-
-🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format.
-
-```json
-{
- "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt",
- "encoding": "cp1252",
- "encoding_aliases": [
- "1252",
- "windows_1252"
- ],
- "alternative_encodings": [
- "cp1254",
- "cp1256",
- "cp1258",
- "iso8859_14",
- "iso8859_15",
- "iso8859_16",
- "iso8859_3",
- "iso8859_9",
- "latin_1",
- "mbcs"
- ],
- "language": "French",
- "alphabets": [
- "Basic Latin",
- "Latin-1 Supplement"
- ],
- "has_sig_or_bom": false,
- "chaos": 0.149,
- "coherence": 97.152,
- "unicode_path": null,
- "is_preferred": true
-}
-```
-
-### Python
-*Just print out normalized text*
-```python
-from charset_normalizer import from_path
-
-results = from_path('./my_subtitle.srt')
-
-print(str(results.best()))
-```
-
-*Upgrade your code without effort*
-```python
-from charset_normalizer import detect
-```
-
-The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible.
-
-See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/)
-
-## 😇 Why
-
-When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a
-reliable alternative using a completely different method. Also! I never back down on a good challenge!
-
-I **don't care** about the **originating charset** encoding, because **two different tables** can
-produce **two identical rendered string.**
-What I want is to get readable text, the best I can.
-
-In a way, **I'm brute forcing text decoding.** How cool is that ? 😎
-
-Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode.
-
-## 🍰 How
-
- - Discard all charset encoding table that could not fit the binary content.
- - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding.
- - Extract matches with the lowest mess detected.
- - Additionally, we measure coherence / probe for a language.
-
-**Wait a minute**, what is noise/mess and coherence according to **YOU ?**
-
-*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then
-**I established** some ground rules about **what is obvious** when **it seems like** a mess.
- I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to
- improve or rewrite it.
-
-*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought
-that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design.
-
-## ⚡ Known limitations
-
- - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters))
- - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content.
-
-## ⚠️ About Python EOLs
-
-**If you are running:**
-
-- Python >=2.7,<3.5: Unsupported
-- Python 3.5: charset-normalizer < 2.1
-- Python 3.6: charset-normalizer < 3.1
-- Python 3.7: charset-normalizer < 4.0
-
-Upgrade your Python interpreter as soon as possible.
-
-## 👤 Contributing
-
-Contributions, issues and feature requests are very much welcome.
-Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute.
-
-## 📝 License
-
-Copyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
-This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed.
-
-Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/)
-
-## 💼 For Enterprise
-
-Professional support for charset-normalizer is available as part of the [Tidelift
-Subscription][1]. Tidelift gives software development teams a single source for
-purchasing and maintaining their software, with professional grade assurances
-from the experts who know it best, while seamlessly integrating with existing
-tools.
-
-[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme
-
-# Changelog
-All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
-
-## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31)
-
-### Fixed
-- Unintentional memory usage regression when using large payload that match several encoding (#376)
-- Regression on some detection case showcased in the documentation (#371)
-
-### Added
-- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife)
-
-## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22)
-
-### Changed
-- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8
-- Improved the general detection reliability based on reports from the community
-
-## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30)
-
-### Added
-- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer`
-- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323)
-
-### Removed
-- (internal) Redundant utils.is_ascii function and unused function is_private_use_only
-- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant
-
-### Changed
-- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection
-- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8
-
-### Fixed
-- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350)
-
-## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07)
-
-### Changed
-- Typehint for function `from_path` no longer enforce `PathLike` as its first argument
-- Minor improvement over the global detection reliability
-
-### Added
-- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries
-- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True)
-- Explicit support for Python 3.12
-
-### Fixed
-- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289)
-
-## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06)
-
-### Added
-- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262)
-
-### Removed
-- Support for Python 3.6 (PR #260)
-
-### Changed
-- Optional speedup provided by mypy/c 1.0.1
-
-## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18)
-
-### Fixed
-- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233)
-
-### Changed
-- Speedup provided by mypy/c 0.990 on Python >= 3.7
-
-## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20)
-
-### Added
-- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results
-- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES
-- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio
-- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)
-
-### Changed
-- Build with static metadata using 'build' frontend
-- Make the language detection stricter
-- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1
-
-### Fixed
-- CLI with opt --normalize fail when using full path for files
-- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it
-- Sphinx warnings when generating the documentation
-
-### Removed
-- Coherence detector no longer return 'Simple English' instead return 'English'
-- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'
-- Breaking: Method `first()` and `best()` from CharsetMatch
-- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII)
-- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches
-- Breaking: Top-level function `normalize`
-- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch
-- Support for the backport `unicodedata2`
-
-## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18)
-
-### Added
-- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results
-- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES
-- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio
-
-### Changed
-- Build with static metadata using 'build' frontend
-- Make the language detection stricter
-
-### Fixed
-- CLI with opt --normalize fail when using full path for files
-- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it
-
-### Removed
-- Coherence detector no longer return 'Simple English' instead return 'English'
-- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'
-
-## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21)
-
-### Added
-- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)
-
-### Removed
-- Breaking: Method `first()` and `best()` from CharsetMatch
-- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII)
-
-### Fixed
-- Sphinx warnings when generating the documentation
-
-## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15)
-
-### Changed
-- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1
-
-### Removed
-- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches
-- Breaking: Top-level function `normalize`
-- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch
-- Support for the backport `unicodedata2`
-
-## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19)
-
-### Deprecated
-- Function `normalize` scheduled for removal in 3.0
-
-### Changed
-- Removed useless call to decode in fn is_unprintable (#206)
-
-### Fixed
-- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204)
-
-## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19)
-
-### Added
-- Output the Unicode table version when running the CLI with `--version` (PR #194)
-
-### Changed
-- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175)
-- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183)
-
-### Fixed
-- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175)
-- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181)
-
-### Removed
-- Support for Python 3.5 (PR #192)
-
-### Deprecated
-- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194)
-
-## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12)
-
-### Fixed
-- ASCII miss-detection on rare cases (PR #170)
-
-## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30)
-
-### Added
-- Explicit support for Python 3.11 (PR #164)
-
-### Changed
-- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165)
-
-## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04)
-
-### Fixed
-- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154)
-
-### Changed
-- Skipping the language-detection (CD) on ASCII (PR #155)
-
-## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03)
-
-### Changed
-- Moderating the logging impact (since 2.0.8) for specific environments (PR #147)
-
-### Fixed
-- Wrong logging level applied when setting kwarg `explain` to True (PR #146)
-
-## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24)
-### Changed
-- Improvement over Vietnamese detection (PR #126)
-- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124)
-- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122)
-- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129)
-- Code style as refactored by Sourcery-AI (PR #131)
-- Minor adjustment on the MD around european words (PR #133)
-- Remove and replace SRTs from assets / tests (PR #139)
-- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135)
-- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135)
-
-### Fixed
-- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137)
-- Avoid using too insignificant chunk (PR #137)
-
-### Added
-- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135)
-- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141)
-
-## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11)
-### Added
-- Add support for Kazakh (Cyrillic) language detection (PR #109)
-
-### Changed
-- Further, improve inferring the language from a given single-byte code page (PR #112)
-- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116)
-- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113)
-- Various detection improvement (MD+CD) (PR #117)
-
-### Removed
-- Remove redundant logging entry about detected language(s) (PR #115)
-
-### Fixed
-- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102)
-
-## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18)
-### Fixed
-- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100)
-- Fix CLI crash when using --minimal output in certain cases (PR #103)
-
-### Changed
-- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101)
-
-## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14)
-### Changed
-- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81)
-- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82)
-- The Unicode detection is slightly improved (PR #93)
-- Add syntax sugar \_\_bool\_\_ for results CharsetMatches list-container (PR #91)
-
-### Removed
-- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92)
-
-### Fixed
-- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95)
-- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96)
-- The MANIFEST.in was not exhaustive (PR #78)
-
-## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30)
-### Fixed
-- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70)
-- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68)
-- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72)
-- Submatch factoring could be wrong in rare edge cases (PR #72)
-- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72)
-- Fix line endings from CRLF to LF for certain project files (PR #67)
-
-### Changed
-- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76)
-- Allow fallback on specified encoding if any (PR #71)
-
-## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16)
-### Changed
-- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63)
-- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64)
-
-## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15)
-### Fixed
-- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59)
-
-### Changed
-- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57)
-
-## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13)
-### Fixed
-- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55)
-- Using explain=False permanently disable the verbose output in the current runtime (PR #47)
-- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47)
-- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52)
-
-### Changed
-- Public function normalize default args values were not aligned with from_bytes (PR #53)
-
-### Added
-- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47)
-
-## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02)
-### Changed
-- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet.
-- Accent has been made on UTF-8 detection, should perform rather instantaneous.
-- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible.
-- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time)
-- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+
-- utf_7 detection has been reinstated.
-
-### Removed
-- This package no longer require anything when used with Python 3.5 (Dropped cached_property)
-- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian.
-- The exception hook on UnicodeDecodeError has been removed.
-
-### Deprecated
-- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0
-
-### Fixed
-- The CLI output used the relative path of the file(s). Should be absolute.
-
-## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28)
-### Fixed
-- Logger configuration/usage no longer conflict with others (PR #44)
-
-## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21)
-### Removed
-- Using standard logging instead of using the package loguru.
-- Dropping nose test framework in favor of the maintained pytest.
-- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text.
-- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version.
-- Stop support for UTF-7 that does not contain a SIG.
-- Dropping PrettyTable, replaced with pure JSON output in CLI.
-
-### Fixed
-- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process.
-- Not searching properly for the BOM when trying utf32/16 parent codec.
-
-### Changed
-- Improving the package final size by compressing frequencies.json.
-- Huge improvement over the larges payload.
-
-### Added
-- CLI now produces JSON consumable output.
-- Return ASCII if given sequences fit. Given reasonable confidence.
-
-## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13)
-
-### Fixed
-- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40)
-
-## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12)
-
-### Fixed
-- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39)
-
-## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12)
-
-### Fixed
-- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38)
-
-## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09)
-
-### Changed
-- Amend the previous release to allow prettytable 2.0 (PR #35)
-
-## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08)
-
-### Fixed
-- Fix error while using the package with a python pre-release interpreter (PR #33)
-
-### Changed
-- Dependencies refactoring, constraints revised.
-
-### Added
-- Add python 3.9 and 3.10 to the supported interpreters
-
-MIT License
-
-Copyright (c) 2019 TAHRI Ahmed R.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/RECORD b/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/RECORD
deleted file mode 100644
index 9863d1b3a..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/RECORD
+++ /dev/null
@@ -1,35 +0,0 @@
-../../../bin/normalizer,sha256=mvTpROUZj2CmbEn7soYlp678uzFco5p6mnJHB4QAivI,303
-charset_normalizer-3.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-charset_normalizer-3.3.2.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070
-charset_normalizer-3.3.2.dist-info/METADATA,sha256=cfLhl5A6SI-F0oclm8w8ux9wshL1nipdeCdVnYb4AaA,33550
-charset_normalizer-3.3.2.dist-info/RECORD,,
-charset_normalizer-3.3.2.dist-info/WHEEL,sha256=FCrbbeH_Uuw2ZMaB8nW-JE7XeUWVfF-XtWcVJYU0Zm8,110
-charset_normalizer-3.3.2.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65
-charset_normalizer-3.3.2.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19
-charset_normalizer/__init__.py,sha256=UzI3xC8PhmcLRMzSgPb6minTmRq0kWznnCBJ8ZCc2XI,1577
-charset_normalizer/__main__.py,sha256=JxY8bleaENOFlLRb9HfoeZCzAMnn2A1oGR5Xm2eyqg0,73
-charset_normalizer/__pycache__/__init__.cpython-312.pyc,,
-charset_normalizer/__pycache__/__main__.cpython-312.pyc,,
-charset_normalizer/__pycache__/api.cpython-312.pyc,,
-charset_normalizer/__pycache__/cd.cpython-312.pyc,,
-charset_normalizer/__pycache__/constant.cpython-312.pyc,,
-charset_normalizer/__pycache__/legacy.cpython-312.pyc,,
-charset_normalizer/__pycache__/md.cpython-312.pyc,,
-charset_normalizer/__pycache__/models.cpython-312.pyc,,
-charset_normalizer/__pycache__/utils.cpython-312.pyc,,
-charset_normalizer/__pycache__/version.cpython-312.pyc,,
-charset_normalizer/api.py,sha256=WOlWjy6wT8SeMYFpaGbXZFN1TMXa-s8vZYfkL4G29iQ,21097
-charset_normalizer/cd.py,sha256=xwZliZcTQFA3jU0c00PRiu9MNxXTFxQkFLWmMW24ZzI,12560
-charset_normalizer/cli/__init__.py,sha256=D5ERp8P62llm2FuoMzydZ7d9rs8cvvLXqE-1_6oViPc,100
-charset_normalizer/cli/__main__.py,sha256=2F-xURZJzo063Ye-2RLJ2wcmURpbKeAzKwpiws65dAs,9744
-charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc,,
-charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc,,
-charset_normalizer/constant.py,sha256=p0IsOVcEbPWYPOdWhnhRbjK1YVBy6fs05C5vKC-zoxU,40481
-charset_normalizer/legacy.py,sha256=T-QuVMsMeDiQEk8WSszMrzVJg_14AMeSkmHdRYhdl1k,2071
-charset_normalizer/md.cpython-312-darwin.so,sha256=gn0KHqCaBQKs1NXXD-KhWWZuIsln7MbSyMHBRQzgzK8,50117
-charset_normalizer/md.py,sha256=NkSuVLK13_a8c7BxZ4cGIQ5vOtGIWOdh22WZEvjp-7U,19624
-charset_normalizer/md__mypyc.cpython-312-darwin.so,sha256=6gGafMj9_ZMZrOf5ONR4lCisR_Rr8DC1dcZXuzzrxos,232652
-charset_normalizer/models.py,sha256=I5i0s4aKCCgLPY2tUY3pwkgFA-BUbbNxQ7hVkVTt62s,11624
-charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-charset_normalizer/utils.py,sha256=teiosMqzKjXyAHXnGdjSBOgnBZwx-SkBbCLrx0UXy8M,11894
-charset_normalizer/version.py,sha256=iHKUfHD3kDRSyrh_BN2ojh43TA5-UZQjvbVIEFfpHDs,79
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/WHEEL b/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/WHEEL
deleted file mode 100644
index 2e30befe3..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.41.2)
-Root-Is-Purelib: false
-Tag: cp312-cp312-macosx_11_0_arm64
-
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/entry_points.txt b/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/entry_points.txt
deleted file mode 100644
index 65619e73e..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/entry_points.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-[console_scripts]
-normalizer = charset_normalizer.cli:cli_detect
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/top_level.txt b/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/top_level.txt
deleted file mode 100644
index 66958f0a0..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer-3.3.2.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-charset_normalizer
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/__init__.py b/release_env/lib/python3.12/site-packages/charset_normalizer/__init__.py
deleted file mode 100644
index 55991fc38..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/__init__.py
+++ /dev/null
@@ -1,46 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Charset-Normalizer
-~~~~~~~~~~~~~~
-The Real First Universal Charset Detector.
-A library that helps you read text from an unknown charset encoding.
-Motivated by chardet, This package is trying to resolve the issue by taking a new approach.
-All IANA character set names for which the Python core library provides codecs are supported.
-
-Basic usage:
- >>> from charset_normalizer import from_bytes
- >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8'))
- >>> best_guess = results.best()
- >>> str(best_guess)
- 'Bсеки човек има право на образование. Oбразованието!'
-
-Others methods and usages are available - see the full documentation
-at .
-:copyright: (c) 2021 by Ahmed TAHRI
-:license: MIT, see LICENSE for more details.
-"""
-import logging
-
-from .api import from_bytes, from_fp, from_path, is_binary
-from .legacy import detect
-from .models import CharsetMatch, CharsetMatches
-from .utils import set_logging_handler
-from .version import VERSION, __version__
-
-__all__ = (
- "from_fp",
- "from_path",
- "from_bytes",
- "is_binary",
- "detect",
- "CharsetMatch",
- "CharsetMatches",
- "__version__",
- "VERSION",
- "set_logging_handler",
-)
-
-# Attach a NullHandler to the top level logger by default
-# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library
-
-logging.getLogger("charset_normalizer").addHandler(logging.NullHandler())
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/__main__.py b/release_env/lib/python3.12/site-packages/charset_normalizer/__main__.py
deleted file mode 100644
index beae2ef77..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/__main__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from .cli import cli_detect
-
-if __name__ == "__main__":
- cli_detect()
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/api.py b/release_env/lib/python3.12/site-packages/charset_normalizer/api.py
deleted file mode 100644
index f7705148f..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/api.py
+++ /dev/null
@@ -1,626 +0,0 @@
-import logging
-from os import PathLike
-from typing import BinaryIO, List, Optional, Set, Union
-
-from .cd import (
- coherence_ratio,
- encoding_languages,
- mb_encoding_languages,
- merge_coherence_ratios,
-)
-from .constant import IANA_SUPPORTED, TOO_BIG_SEQUENCE, TOO_SMALL_SEQUENCE, TRACE
-from .md import mess_ratio
-from .models import CharsetMatch, CharsetMatches
-from .utils import (
- any_specified_encoding,
- cut_sequence_chunks,
- iana_name,
- identify_sig_or_bom,
- is_cp_similar,
- is_multi_byte_encoding,
- should_strip_sig_or_bom,
-)
-
-# Will most likely be controversial
-# logging.addLevelName(TRACE, "TRACE")
-logger = logging.getLogger("charset_normalizer")
-explain_handler = logging.StreamHandler()
-explain_handler.setFormatter(
- logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")
-)
-
-
-def from_bytes(
- sequences: Union[bytes, bytearray],
- steps: int = 5,
- chunk_size: int = 512,
- threshold: float = 0.2,
- cp_isolation: Optional[List[str]] = None,
- cp_exclusion: Optional[List[str]] = None,
- preemptive_behaviour: bool = True,
- explain: bool = False,
- language_threshold: float = 0.1,
- enable_fallback: bool = True,
-) -> CharsetMatches:
- """
- Given a raw bytes sequence, return the best possibles charset usable to render str objects.
- If there is no results, it is a strong indicator that the source is binary/not text.
- By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence.
- And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will.
-
- The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page
- but never take it for granted. Can improve the performance.
-
- You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that
- purpose.
-
- This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32.
- By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain'
- toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging.
- Custom logging format and handler can be set manually.
- """
-
- if not isinstance(sequences, (bytearray, bytes)):
- raise TypeError(
- "Expected object of type bytes or bytearray, got: {0}".format(
- type(sequences)
- )
- )
-
- if explain:
- previous_logger_level: int = logger.level
- logger.addHandler(explain_handler)
- logger.setLevel(TRACE)
-
- length: int = len(sequences)
-
- if length == 0:
- logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.")
- if explain:
- logger.removeHandler(explain_handler)
- logger.setLevel(previous_logger_level or logging.WARNING)
- return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")])
-
- if cp_isolation is not None:
- logger.log(
- TRACE,
- "cp_isolation is set. use this flag for debugging purpose. "
- "limited list of encoding allowed : %s.",
- ", ".join(cp_isolation),
- )
- cp_isolation = [iana_name(cp, False) for cp in cp_isolation]
- else:
- cp_isolation = []
-
- if cp_exclusion is not None:
- logger.log(
- TRACE,
- "cp_exclusion is set. use this flag for debugging purpose. "
- "limited list of encoding excluded : %s.",
- ", ".join(cp_exclusion),
- )
- cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion]
- else:
- cp_exclusion = []
-
- if length <= (chunk_size * steps):
- logger.log(
- TRACE,
- "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.",
- steps,
- chunk_size,
- length,
- )
- steps = 1
- chunk_size = length
-
- if steps > 1 and length / steps < chunk_size:
- chunk_size = int(length / steps)
-
- is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE
- is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE
-
- if is_too_small_sequence:
- logger.log(
- TRACE,
- "Trying to detect encoding from a tiny portion of ({}) byte(s).".format(
- length
- ),
- )
- elif is_too_large_sequence:
- logger.log(
- TRACE,
- "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format(
- length
- ),
- )
-
- prioritized_encodings: List[str] = []
-
- specified_encoding: Optional[str] = (
- any_specified_encoding(sequences) if preemptive_behaviour else None
- )
-
- if specified_encoding is not None:
- prioritized_encodings.append(specified_encoding)
- logger.log(
- TRACE,
- "Detected declarative mark in sequence. Priority +1 given for %s.",
- specified_encoding,
- )
-
- tested: Set[str] = set()
- tested_but_hard_failure: List[str] = []
- tested_but_soft_failure: List[str] = []
-
- fallback_ascii: Optional[CharsetMatch] = None
- fallback_u8: Optional[CharsetMatch] = None
- fallback_specified: Optional[CharsetMatch] = None
-
- results: CharsetMatches = CharsetMatches()
-
- sig_encoding, sig_payload = identify_sig_or_bom(sequences)
-
- if sig_encoding is not None:
- prioritized_encodings.append(sig_encoding)
- logger.log(
- TRACE,
- "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.",
- len(sig_payload),
- sig_encoding,
- )
-
- prioritized_encodings.append("ascii")
-
- if "utf_8" not in prioritized_encodings:
- prioritized_encodings.append("utf_8")
-
- for encoding_iana in prioritized_encodings + IANA_SUPPORTED:
- if cp_isolation and encoding_iana not in cp_isolation:
- continue
-
- if cp_exclusion and encoding_iana in cp_exclusion:
- continue
-
- if encoding_iana in tested:
- continue
-
- tested.add(encoding_iana)
-
- decoded_payload: Optional[str] = None
- bom_or_sig_available: bool = sig_encoding == encoding_iana
- strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom(
- encoding_iana
- )
-
- if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available:
- logger.log(
- TRACE,
- "Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.",
- encoding_iana,
- )
- continue
- if encoding_iana in {"utf_7"} and not bom_or_sig_available:
- logger.log(
- TRACE,
- "Encoding %s won't be tested as-is because detection is unreliable without BOM/SIG.",
- encoding_iana,
- )
- continue
-
- try:
- is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana)
- except (ModuleNotFoundError, ImportError):
- logger.log(
- TRACE,
- "Encoding %s does not provide an IncrementalDecoder",
- encoding_iana,
- )
- continue
-
- try:
- if is_too_large_sequence and is_multi_byte_decoder is False:
- str(
- sequences[: int(50e4)]
- if strip_sig_or_bom is False
- else sequences[len(sig_payload) : int(50e4)],
- encoding=encoding_iana,
- )
- else:
- decoded_payload = str(
- sequences
- if strip_sig_or_bom is False
- else sequences[len(sig_payload) :],
- encoding=encoding_iana,
- )
- except (UnicodeDecodeError, LookupError) as e:
- if not isinstance(e, LookupError):
- logger.log(
- TRACE,
- "Code page %s does not fit given bytes sequence at ALL. %s",
- encoding_iana,
- str(e),
- )
- tested_but_hard_failure.append(encoding_iana)
- continue
-
- similar_soft_failure_test: bool = False
-
- for encoding_soft_failed in tested_but_soft_failure:
- if is_cp_similar(encoding_iana, encoding_soft_failed):
- similar_soft_failure_test = True
- break
-
- if similar_soft_failure_test:
- logger.log(
- TRACE,
- "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!",
- encoding_iana,
- encoding_soft_failed,
- )
- continue
-
- r_ = range(
- 0 if not bom_or_sig_available else len(sig_payload),
- length,
- int(length / steps),
- )
-
- multi_byte_bonus: bool = (
- is_multi_byte_decoder
- and decoded_payload is not None
- and len(decoded_payload) < length
- )
-
- if multi_byte_bonus:
- logger.log(
- TRACE,
- "Code page %s is a multi byte encoding table and it appear that at least one character "
- "was encoded using n-bytes.",
- encoding_iana,
- )
-
- max_chunk_gave_up: int = int(len(r_) / 4)
-
- max_chunk_gave_up = max(max_chunk_gave_up, 2)
- early_stop_count: int = 0
- lazy_str_hard_failure = False
-
- md_chunks: List[str] = []
- md_ratios = []
-
- try:
- for chunk in cut_sequence_chunks(
- sequences,
- encoding_iana,
- r_,
- chunk_size,
- bom_or_sig_available,
- strip_sig_or_bom,
- sig_payload,
- is_multi_byte_decoder,
- decoded_payload,
- ):
- md_chunks.append(chunk)
-
- md_ratios.append(
- mess_ratio(
- chunk,
- threshold,
- explain is True and 1 <= len(cp_isolation) <= 2,
- )
- )
-
- if md_ratios[-1] >= threshold:
- early_stop_count += 1
-
- if (early_stop_count >= max_chunk_gave_up) or (
- bom_or_sig_available and strip_sig_or_bom is False
- ):
- break
- except (
- UnicodeDecodeError
- ) as e: # Lazy str loading may have missed something there
- logger.log(
- TRACE,
- "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s",
- encoding_iana,
- str(e),
- )
- early_stop_count = max_chunk_gave_up
- lazy_str_hard_failure = True
-
- # We might want to check the sequence again with the whole content
- # Only if initial MD test-suite passes
- if (
- not lazy_str_hard_failure
- and is_too_large_sequence
- and not is_multi_byte_decoder
- ):
- try:
- sequences[int(50e3) :].decode(encoding_iana, errors="strict")
- except UnicodeDecodeError as e:
- logger.log(
- TRACE,
- "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s",
- encoding_iana,
- str(e),
- )
- tested_but_hard_failure.append(encoding_iana)
- continue
-
- mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0
- if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up:
- tested_but_soft_failure.append(encoding_iana)
- logger.log(
- TRACE,
- "%s was excluded because of initial chaos probing. Gave up %i time(s). "
- "Computed mean chaos is %f %%.",
- encoding_iana,
- early_stop_count,
- round(mean_mess_ratio * 100, ndigits=3),
- )
- # Preparing those fallbacks in case we got nothing.
- if (
- enable_fallback
- and encoding_iana in ["ascii", "utf_8", specified_encoding]
- and not lazy_str_hard_failure
- ):
- fallback_entry = CharsetMatch(
- sequences, encoding_iana, threshold, False, [], decoded_payload
- )
- if encoding_iana == specified_encoding:
- fallback_specified = fallback_entry
- elif encoding_iana == "ascii":
- fallback_ascii = fallback_entry
- else:
- fallback_u8 = fallback_entry
- continue
-
- logger.log(
- TRACE,
- "%s passed initial chaos probing. Mean measured chaos is %f %%",
- encoding_iana,
- round(mean_mess_ratio * 100, ndigits=3),
- )
-
- if not is_multi_byte_decoder:
- target_languages: List[str] = encoding_languages(encoding_iana)
- else:
- target_languages = mb_encoding_languages(encoding_iana)
-
- if target_languages:
- logger.log(
- TRACE,
- "{} should target any language(s) of {}".format(
- encoding_iana, str(target_languages)
- ),
- )
-
- cd_ratios = []
-
- # We shall skip the CD when its about ASCII
- # Most of the time its not relevant to run "language-detection" on it.
- if encoding_iana != "ascii":
- for chunk in md_chunks:
- chunk_languages = coherence_ratio(
- chunk,
- language_threshold,
- ",".join(target_languages) if target_languages else None,
- )
-
- cd_ratios.append(chunk_languages)
-
- cd_ratios_merged = merge_coherence_ratios(cd_ratios)
-
- if cd_ratios_merged:
- logger.log(
- TRACE,
- "We detected language {} using {}".format(
- cd_ratios_merged, encoding_iana
- ),
- )
-
- results.append(
- CharsetMatch(
- sequences,
- encoding_iana,
- mean_mess_ratio,
- bom_or_sig_available,
- cd_ratios_merged,
- decoded_payload,
- )
- )
-
- if (
- encoding_iana in [specified_encoding, "ascii", "utf_8"]
- and mean_mess_ratio < 0.1
- ):
- logger.debug(
- "Encoding detection: %s is most likely the one.", encoding_iana
- )
- if explain:
- logger.removeHandler(explain_handler)
- logger.setLevel(previous_logger_level)
- return CharsetMatches([results[encoding_iana]])
-
- if encoding_iana == sig_encoding:
- logger.debug(
- "Encoding detection: %s is most likely the one as we detected a BOM or SIG within "
- "the beginning of the sequence.",
- encoding_iana,
- )
- if explain:
- logger.removeHandler(explain_handler)
- logger.setLevel(previous_logger_level)
- return CharsetMatches([results[encoding_iana]])
-
- if len(results) == 0:
- if fallback_u8 or fallback_ascii or fallback_specified:
- logger.log(
- TRACE,
- "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.",
- )
-
- if fallback_specified:
- logger.debug(
- "Encoding detection: %s will be used as a fallback match",
- fallback_specified.encoding,
- )
- results.append(fallback_specified)
- elif (
- (fallback_u8 and fallback_ascii is None)
- or (
- fallback_u8
- and fallback_ascii
- and fallback_u8.fingerprint != fallback_ascii.fingerprint
- )
- or (fallback_u8 is not None)
- ):
- logger.debug("Encoding detection: utf_8 will be used as a fallback match")
- results.append(fallback_u8)
- elif fallback_ascii:
- logger.debug("Encoding detection: ascii will be used as a fallback match")
- results.append(fallback_ascii)
-
- if results:
- logger.debug(
- "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.",
- results.best().encoding, # type: ignore
- len(results) - 1,
- )
- else:
- logger.debug("Encoding detection: Unable to determine any suitable charset.")
-
- if explain:
- logger.removeHandler(explain_handler)
- logger.setLevel(previous_logger_level)
-
- return results
-
-
-def from_fp(
- fp: BinaryIO,
- steps: int = 5,
- chunk_size: int = 512,
- threshold: float = 0.20,
- cp_isolation: Optional[List[str]] = None,
- cp_exclusion: Optional[List[str]] = None,
- preemptive_behaviour: bool = True,
- explain: bool = False,
- language_threshold: float = 0.1,
- enable_fallback: bool = True,
-) -> CharsetMatches:
- """
- Same thing than the function from_bytes but using a file pointer that is already ready.
- Will not close the file pointer.
- """
- return from_bytes(
- fp.read(),
- steps,
- chunk_size,
- threshold,
- cp_isolation,
- cp_exclusion,
- preemptive_behaviour,
- explain,
- language_threshold,
- enable_fallback,
- )
-
-
-def from_path(
- path: Union[str, bytes, PathLike], # type: ignore[type-arg]
- steps: int = 5,
- chunk_size: int = 512,
- threshold: float = 0.20,
- cp_isolation: Optional[List[str]] = None,
- cp_exclusion: Optional[List[str]] = None,
- preemptive_behaviour: bool = True,
- explain: bool = False,
- language_threshold: float = 0.1,
- enable_fallback: bool = True,
-) -> CharsetMatches:
- """
- Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode.
- Can raise IOError.
- """
- with open(path, "rb") as fp:
- return from_fp(
- fp,
- steps,
- chunk_size,
- threshold,
- cp_isolation,
- cp_exclusion,
- preemptive_behaviour,
- explain,
- language_threshold,
- enable_fallback,
- )
-
-
-def is_binary(
- fp_or_path_or_payload: Union[PathLike, str, BinaryIO, bytes], # type: ignore[type-arg]
- steps: int = 5,
- chunk_size: int = 512,
- threshold: float = 0.20,
- cp_isolation: Optional[List[str]] = None,
- cp_exclusion: Optional[List[str]] = None,
- preemptive_behaviour: bool = True,
- explain: bool = False,
- language_threshold: float = 0.1,
- enable_fallback: bool = False,
-) -> bool:
- """
- Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string.
- Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match
- are disabled to be stricter around ASCII-compatible but unlikely to be a string.
- """
- if isinstance(fp_or_path_or_payload, (str, PathLike)):
- guesses = from_path(
- fp_or_path_or_payload,
- steps=steps,
- chunk_size=chunk_size,
- threshold=threshold,
- cp_isolation=cp_isolation,
- cp_exclusion=cp_exclusion,
- preemptive_behaviour=preemptive_behaviour,
- explain=explain,
- language_threshold=language_threshold,
- enable_fallback=enable_fallback,
- )
- elif isinstance(
- fp_or_path_or_payload,
- (
- bytes,
- bytearray,
- ),
- ):
- guesses = from_bytes(
- fp_or_path_or_payload,
- steps=steps,
- chunk_size=chunk_size,
- threshold=threshold,
- cp_isolation=cp_isolation,
- cp_exclusion=cp_exclusion,
- preemptive_behaviour=preemptive_behaviour,
- explain=explain,
- language_threshold=language_threshold,
- enable_fallback=enable_fallback,
- )
- else:
- guesses = from_fp(
- fp_or_path_or_payload,
- steps=steps,
- chunk_size=chunk_size,
- threshold=threshold,
- cp_isolation=cp_isolation,
- cp_exclusion=cp_exclusion,
- preemptive_behaviour=preemptive_behaviour,
- explain=explain,
- language_threshold=language_threshold,
- enable_fallback=enable_fallback,
- )
-
- return not guesses
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/cd.py b/release_env/lib/python3.12/site-packages/charset_normalizer/cd.py
deleted file mode 100644
index 4ea6760c4..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/cd.py
+++ /dev/null
@@ -1,395 +0,0 @@
-import importlib
-from codecs import IncrementalDecoder
-from collections import Counter
-from functools import lru_cache
-from typing import Counter as TypeCounter, Dict, List, Optional, Tuple
-
-from .constant import (
- FREQUENCIES,
- KO_NAMES,
- LANGUAGE_SUPPORTED_COUNT,
- TOO_SMALL_SEQUENCE,
- ZH_NAMES,
-)
-from .md import is_suspiciously_successive_range
-from .models import CoherenceMatches
-from .utils import (
- is_accentuated,
- is_latin,
- is_multi_byte_encoding,
- is_unicode_range_secondary,
- unicode_range,
-)
-
-
-def encoding_unicode_range(iana_name: str) -> List[str]:
- """
- Return associated unicode ranges in a single byte code page.
- """
- if is_multi_byte_encoding(iana_name):
- raise IOError("Function not supported on multi-byte code page")
-
- decoder = importlib.import_module(
- "encodings.{}".format(iana_name)
- ).IncrementalDecoder
-
- p: IncrementalDecoder = decoder(errors="ignore")
- seen_ranges: Dict[str, int] = {}
- character_count: int = 0
-
- for i in range(0x40, 0xFF):
- chunk: str = p.decode(bytes([i]))
-
- if chunk:
- character_range: Optional[str] = unicode_range(chunk)
-
- if character_range is None:
- continue
-
- if is_unicode_range_secondary(character_range) is False:
- if character_range not in seen_ranges:
- seen_ranges[character_range] = 0
- seen_ranges[character_range] += 1
- character_count += 1
-
- return sorted(
- [
- character_range
- for character_range in seen_ranges
- if seen_ranges[character_range] / character_count >= 0.15
- ]
- )
-
-
-def unicode_range_languages(primary_range: str) -> List[str]:
- """
- Return inferred languages used with a unicode range.
- """
- languages: List[str] = []
-
- for language, characters in FREQUENCIES.items():
- for character in characters:
- if unicode_range(character) == primary_range:
- languages.append(language)
- break
-
- return languages
-
-
-@lru_cache()
-def encoding_languages(iana_name: str) -> List[str]:
- """
- Single-byte encoding language association. Some code page are heavily linked to particular language(s).
- This function does the correspondence.
- """
- unicode_ranges: List[str] = encoding_unicode_range(iana_name)
- primary_range: Optional[str] = None
-
- for specified_range in unicode_ranges:
- if "Latin" not in specified_range:
- primary_range = specified_range
- break
-
- if primary_range is None:
- return ["Latin Based"]
-
- return unicode_range_languages(primary_range)
-
-
-@lru_cache()
-def mb_encoding_languages(iana_name: str) -> List[str]:
- """
- Multi-byte encoding language association. Some code page are heavily linked to particular language(s).
- This function does the correspondence.
- """
- if (
- iana_name.startswith("shift_")
- or iana_name.startswith("iso2022_jp")
- or iana_name.startswith("euc_j")
- or iana_name == "cp932"
- ):
- return ["Japanese"]
- if iana_name.startswith("gb") or iana_name in ZH_NAMES:
- return ["Chinese"]
- if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES:
- return ["Korean"]
-
- return []
-
-
-@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT)
-def get_target_features(language: str) -> Tuple[bool, bool]:
- """
- Determine main aspects from a supported language if it contains accents and if is pure Latin.
- """
- target_have_accents: bool = False
- target_pure_latin: bool = True
-
- for character in FREQUENCIES[language]:
- if not target_have_accents and is_accentuated(character):
- target_have_accents = True
- if target_pure_latin and is_latin(character) is False:
- target_pure_latin = False
-
- return target_have_accents, target_pure_latin
-
-
-def alphabet_languages(
- characters: List[str], ignore_non_latin: bool = False
-) -> List[str]:
- """
- Return associated languages associated to given characters.
- """
- languages: List[Tuple[str, float]] = []
-
- source_have_accents = any(is_accentuated(character) for character in characters)
-
- for language, language_characters in FREQUENCIES.items():
- target_have_accents, target_pure_latin = get_target_features(language)
-
- if ignore_non_latin and target_pure_latin is False:
- continue
-
- if target_have_accents is False and source_have_accents:
- continue
-
- character_count: int = len(language_characters)
-
- character_match_count: int = len(
- [c for c in language_characters if c in characters]
- )
-
- ratio: float = character_match_count / character_count
-
- if ratio >= 0.2:
- languages.append((language, ratio))
-
- languages = sorted(languages, key=lambda x: x[1], reverse=True)
-
- return [compatible_language[0] for compatible_language in languages]
-
-
-def characters_popularity_compare(
- language: str, ordered_characters: List[str]
-) -> float:
- """
- Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language.
- The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit).
- Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.)
- """
- if language not in FREQUENCIES:
- raise ValueError("{} not available".format(language))
-
- character_approved_count: int = 0
- FREQUENCIES_language_set = set(FREQUENCIES[language])
-
- ordered_characters_count: int = len(ordered_characters)
- target_language_characters_count: int = len(FREQUENCIES[language])
-
- large_alphabet: bool = target_language_characters_count > 26
-
- for character, character_rank in zip(
- ordered_characters, range(0, ordered_characters_count)
- ):
- if character not in FREQUENCIES_language_set:
- continue
-
- character_rank_in_language: int = FREQUENCIES[language].index(character)
- expected_projection_ratio: float = (
- target_language_characters_count / ordered_characters_count
- )
- character_rank_projection: int = int(character_rank * expected_projection_ratio)
-
- if (
- large_alphabet is False
- and abs(character_rank_projection - character_rank_in_language) > 4
- ):
- continue
-
- if (
- large_alphabet is True
- and abs(character_rank_projection - character_rank_in_language)
- < target_language_characters_count / 3
- ):
- character_approved_count += 1
- continue
-
- characters_before_source: List[str] = FREQUENCIES[language][
- 0:character_rank_in_language
- ]
- characters_after_source: List[str] = FREQUENCIES[language][
- character_rank_in_language:
- ]
- characters_before: List[str] = ordered_characters[0:character_rank]
- characters_after: List[str] = ordered_characters[character_rank:]
-
- before_match_count: int = len(
- set(characters_before) & set(characters_before_source)
- )
-
- after_match_count: int = len(
- set(characters_after) & set(characters_after_source)
- )
-
- if len(characters_before_source) == 0 and before_match_count <= 4:
- character_approved_count += 1
- continue
-
- if len(characters_after_source) == 0 and after_match_count <= 4:
- character_approved_count += 1
- continue
-
- if (
- before_match_count / len(characters_before_source) >= 0.4
- or after_match_count / len(characters_after_source) >= 0.4
- ):
- character_approved_count += 1
- continue
-
- return character_approved_count / len(ordered_characters)
-
-
-def alpha_unicode_split(decoded_sequence: str) -> List[str]:
- """
- Given a decoded text sequence, return a list of str. Unicode range / alphabet separation.
- Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list;
- One containing the latin letters and the other hebrew.
- """
- layers: Dict[str, str] = {}
-
- for character in decoded_sequence:
- if character.isalpha() is False:
- continue
-
- character_range: Optional[str] = unicode_range(character)
-
- if character_range is None:
- continue
-
- layer_target_range: Optional[str] = None
-
- for discovered_range in layers:
- if (
- is_suspiciously_successive_range(discovered_range, character_range)
- is False
- ):
- layer_target_range = discovered_range
- break
-
- if layer_target_range is None:
- layer_target_range = character_range
-
- if layer_target_range not in layers:
- layers[layer_target_range] = character.lower()
- continue
-
- layers[layer_target_range] += character.lower()
-
- return list(layers.values())
-
-
-def merge_coherence_ratios(results: List[CoherenceMatches]) -> CoherenceMatches:
- """
- This function merge results previously given by the function coherence_ratio.
- The return type is the same as coherence_ratio.
- """
- per_language_ratios: Dict[str, List[float]] = {}
- for result in results:
- for sub_result in result:
- language, ratio = sub_result
- if language not in per_language_ratios:
- per_language_ratios[language] = [ratio]
- continue
- per_language_ratios[language].append(ratio)
-
- merge = [
- (
- language,
- round(
- sum(per_language_ratios[language]) / len(per_language_ratios[language]),
- 4,
- ),
- )
- for language in per_language_ratios
- ]
-
- return sorted(merge, key=lambda x: x[1], reverse=True)
-
-
-def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches:
- """
- We shall NOT return "English—" in CoherenceMatches because it is an alternative
- of "English". This function only keeps the best match and remove the em-dash in it.
- """
- index_results: Dict[str, List[float]] = dict()
-
- for result in results:
- language, ratio = result
- no_em_name: str = language.replace("—", "")
-
- if no_em_name not in index_results:
- index_results[no_em_name] = []
-
- index_results[no_em_name].append(ratio)
-
- if any(len(index_results[e]) > 1 for e in index_results):
- filtered_results: CoherenceMatches = []
-
- for language in index_results:
- filtered_results.append((language, max(index_results[language])))
-
- return filtered_results
-
- return results
-
-
-@lru_cache(maxsize=2048)
-def coherence_ratio(
- decoded_sequence: str, threshold: float = 0.1, lg_inclusion: Optional[str] = None
-) -> CoherenceMatches:
- """
- Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers.
- A layer = Character extraction by alphabets/ranges.
- """
-
- results: List[Tuple[str, float]] = []
- ignore_non_latin: bool = False
-
- sufficient_match_count: int = 0
-
- lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else []
- if "Latin Based" in lg_inclusion_list:
- ignore_non_latin = True
- lg_inclusion_list.remove("Latin Based")
-
- for layer in alpha_unicode_split(decoded_sequence):
- sequence_frequencies: TypeCounter[str] = Counter(layer)
- most_common = sequence_frequencies.most_common()
-
- character_count: int = sum(o for c, o in most_common)
-
- if character_count <= TOO_SMALL_SEQUENCE:
- continue
-
- popular_character_ordered: List[str] = [c for c, o in most_common]
-
- for language in lg_inclusion_list or alphabet_languages(
- popular_character_ordered, ignore_non_latin
- ):
- ratio: float = characters_popularity_compare(
- language, popular_character_ordered
- )
-
- if ratio < threshold:
- continue
- elif ratio >= 0.8:
- sufficient_match_count += 1
-
- results.append((language, round(ratio, 4)))
-
- if sufficient_match_count >= 3:
- break
-
- return sorted(
- filter_alt_coherence_matches(results), key=lambda x: x[1], reverse=True
- )
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py b/release_env/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py
deleted file mode 100644
index d95fedfe5..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from .__main__ import cli_detect, query_yes_no
-
-__all__ = (
- "cli_detect",
- "query_yes_no",
-)
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py b/release_env/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py
deleted file mode 100644
index f4bcbaac0..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py
+++ /dev/null
@@ -1,296 +0,0 @@
-import argparse
-import sys
-from json import dumps
-from os.path import abspath, basename, dirname, join, realpath
-from platform import python_version
-from typing import List, Optional
-from unicodedata import unidata_version
-
-import charset_normalizer.md as md_module
-from charset_normalizer import from_fp
-from charset_normalizer.models import CliDetectionResult
-from charset_normalizer.version import __version__
-
-
-def query_yes_no(question: str, default: str = "yes") -> bool:
- """Ask a yes/no question via input() and return their answer.
-
- "question" is a string that is presented to the user.
- "default" is the presumed answer if the user just hits .
- It must be "yes" (the default), "no" or None (meaning
- an answer is required of the user).
-
- The "answer" return value is True for "yes" or False for "no".
-
- Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input
- """
- valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False}
- if default is None:
- prompt = " [y/n] "
- elif default == "yes":
- prompt = " [Y/n] "
- elif default == "no":
- prompt = " [y/N] "
- else:
- raise ValueError("invalid default answer: '%s'" % default)
-
- while True:
- sys.stdout.write(question + prompt)
- choice = input().lower()
- if default is not None and choice == "":
- return valid[default]
- elif choice in valid:
- return valid[choice]
- else:
- sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n")
-
-
-def cli_detect(argv: Optional[List[str]] = None) -> int:
- """
- CLI assistant using ARGV and ArgumentParser
- :param argv:
- :return: 0 if everything is fine, anything else equal trouble
- """
- parser = argparse.ArgumentParser(
- description="The Real First Universal Charset Detector. "
- "Discover originating encoding used on text file. "
- "Normalize text to unicode."
- )
-
- parser.add_argument(
- "files", type=argparse.FileType("rb"), nargs="+", help="File(s) to be analysed"
- )
- parser.add_argument(
- "-v",
- "--verbose",
- action="store_true",
- default=False,
- dest="verbose",
- help="Display complementary information about file if any. "
- "Stdout will contain logs about the detection process.",
- )
- parser.add_argument(
- "-a",
- "--with-alternative",
- action="store_true",
- default=False,
- dest="alternatives",
- help="Output complementary possibilities if any. Top-level JSON WILL be a list.",
- )
- parser.add_argument(
- "-n",
- "--normalize",
- action="store_true",
- default=False,
- dest="normalize",
- help="Permit to normalize input file. If not set, program does not write anything.",
- )
- parser.add_argument(
- "-m",
- "--minimal",
- action="store_true",
- default=False,
- dest="minimal",
- help="Only output the charset detected to STDOUT. Disabling JSON output.",
- )
- parser.add_argument(
- "-r",
- "--replace",
- action="store_true",
- default=False,
- dest="replace",
- help="Replace file when trying to normalize it instead of creating a new one.",
- )
- parser.add_argument(
- "-f",
- "--force",
- action="store_true",
- default=False,
- dest="force",
- help="Replace file without asking if you are sure, use this flag with caution.",
- )
- parser.add_argument(
- "-t",
- "--threshold",
- action="store",
- default=0.2,
- type=float,
- dest="threshold",
- help="Define a custom maximum amount of chaos allowed in decoded content. 0. <= chaos <= 1.",
- )
- parser.add_argument(
- "--version",
- action="version",
- version="Charset-Normalizer {} - Python {} - Unicode {} - SpeedUp {}".format(
- __version__,
- python_version(),
- unidata_version,
- "OFF" if md_module.__file__.lower().endswith(".py") else "ON",
- ),
- help="Show version information and exit.",
- )
-
- args = parser.parse_args(argv)
-
- if args.replace is True and args.normalize is False:
- print("Use --replace in addition of --normalize only.", file=sys.stderr)
- return 1
-
- if args.force is True and args.replace is False:
- print("Use --force in addition of --replace only.", file=sys.stderr)
- return 1
-
- if args.threshold < 0.0 or args.threshold > 1.0:
- print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr)
- return 1
-
- x_ = []
-
- for my_file in args.files:
- matches = from_fp(my_file, threshold=args.threshold, explain=args.verbose)
-
- best_guess = matches.best()
-
- if best_guess is None:
- print(
- 'Unable to identify originating encoding for "{}". {}'.format(
- my_file.name,
- "Maybe try increasing maximum amount of chaos."
- if args.threshold < 1.0
- else "",
- ),
- file=sys.stderr,
- )
- x_.append(
- CliDetectionResult(
- abspath(my_file.name),
- None,
- [],
- [],
- "Unknown",
- [],
- False,
- 1.0,
- 0.0,
- None,
- True,
- )
- )
- else:
- x_.append(
- CliDetectionResult(
- abspath(my_file.name),
- best_guess.encoding,
- best_guess.encoding_aliases,
- [
- cp
- for cp in best_guess.could_be_from_charset
- if cp != best_guess.encoding
- ],
- best_guess.language,
- best_guess.alphabets,
- best_guess.bom,
- best_guess.percent_chaos,
- best_guess.percent_coherence,
- None,
- True,
- )
- )
-
- if len(matches) > 1 and args.alternatives:
- for el in matches:
- if el != best_guess:
- x_.append(
- CliDetectionResult(
- abspath(my_file.name),
- el.encoding,
- el.encoding_aliases,
- [
- cp
- for cp in el.could_be_from_charset
- if cp != el.encoding
- ],
- el.language,
- el.alphabets,
- el.bom,
- el.percent_chaos,
- el.percent_coherence,
- None,
- False,
- )
- )
-
- if args.normalize is True:
- if best_guess.encoding.startswith("utf") is True:
- print(
- '"{}" file does not need to be normalized, as it already came from unicode.'.format(
- my_file.name
- ),
- file=sys.stderr,
- )
- if my_file.closed is False:
- my_file.close()
- continue
-
- dir_path = dirname(realpath(my_file.name))
- file_name = basename(realpath(my_file.name))
-
- o_: List[str] = file_name.split(".")
-
- if args.replace is False:
- o_.insert(-1, best_guess.encoding)
- if my_file.closed is False:
- my_file.close()
- elif (
- args.force is False
- and query_yes_no(
- 'Are you sure to normalize "{}" by replacing it ?'.format(
- my_file.name
- ),
- "no",
- )
- is False
- ):
- if my_file.closed is False:
- my_file.close()
- continue
-
- try:
- x_[0].unicode_path = join(dir_path, ".".join(o_))
-
- with open(x_[0].unicode_path, "w", encoding="utf-8") as fp:
- fp.write(str(best_guess))
- except IOError as e:
- print(str(e), file=sys.stderr)
- if my_file.closed is False:
- my_file.close()
- return 2
-
- if my_file.closed is False:
- my_file.close()
-
- if args.minimal is False:
- print(
- dumps(
- [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__,
- ensure_ascii=True,
- indent=4,
- )
- )
- else:
- for my_file in args.files:
- print(
- ", ".join(
- [
- el.encoding or "undefined"
- for el in x_
- if el.path == abspath(my_file.name)
- ]
- )
- )
-
- return 0
-
-
-if __name__ == "__main__":
- cli_detect()
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/constant.py b/release_env/lib/python3.12/site-packages/charset_normalizer/constant.py
deleted file mode 100644
index 863490461..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/constant.py
+++ /dev/null
@@ -1,1995 +0,0 @@
-# -*- coding: utf-8 -*-
-from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE
-from encodings.aliases import aliases
-from re import IGNORECASE, compile as re_compile
-from typing import Dict, List, Set, Union
-
-# Contain for each eligible encoding a list of/item bytes SIG/BOM
-ENCODING_MARKS: Dict[str, Union[bytes, List[bytes]]] = {
- "utf_8": BOM_UTF8,
- "utf_7": [
- b"\x2b\x2f\x76\x38",
- b"\x2b\x2f\x76\x39",
- b"\x2b\x2f\x76\x2b",
- b"\x2b\x2f\x76\x2f",
- b"\x2b\x2f\x76\x38\x2d",
- ],
- "gb18030": b"\x84\x31\x95\x33",
- "utf_32": [BOM_UTF32_BE, BOM_UTF32_LE],
- "utf_16": [BOM_UTF16_BE, BOM_UTF16_LE],
-}
-
-TOO_SMALL_SEQUENCE: int = 32
-TOO_BIG_SEQUENCE: int = int(10e6)
-
-UTF8_MAXIMAL_ALLOCATION: int = 1_112_064
-
-# Up-to-date Unicode ucd/15.0.0
-UNICODE_RANGES_COMBINED: Dict[str, range] = {
- "Control character": range(32),
- "Basic Latin": range(32, 128),
- "Latin-1 Supplement": range(128, 256),
- "Latin Extended-A": range(256, 384),
- "Latin Extended-B": range(384, 592),
- "IPA Extensions": range(592, 688),
- "Spacing Modifier Letters": range(688, 768),
- "Combining Diacritical Marks": range(768, 880),
- "Greek and Coptic": range(880, 1024),
- "Cyrillic": range(1024, 1280),
- "Cyrillic Supplement": range(1280, 1328),
- "Armenian": range(1328, 1424),
- "Hebrew": range(1424, 1536),
- "Arabic": range(1536, 1792),
- "Syriac": range(1792, 1872),
- "Arabic Supplement": range(1872, 1920),
- "Thaana": range(1920, 1984),
- "NKo": range(1984, 2048),
- "Samaritan": range(2048, 2112),
- "Mandaic": range(2112, 2144),
- "Syriac Supplement": range(2144, 2160),
- "Arabic Extended-B": range(2160, 2208),
- "Arabic Extended-A": range(2208, 2304),
- "Devanagari": range(2304, 2432),
- "Bengali": range(2432, 2560),
- "Gurmukhi": range(2560, 2688),
- "Gujarati": range(2688, 2816),
- "Oriya": range(2816, 2944),
- "Tamil": range(2944, 3072),
- "Telugu": range(3072, 3200),
- "Kannada": range(3200, 3328),
- "Malayalam": range(3328, 3456),
- "Sinhala": range(3456, 3584),
- "Thai": range(3584, 3712),
- "Lao": range(3712, 3840),
- "Tibetan": range(3840, 4096),
- "Myanmar": range(4096, 4256),
- "Georgian": range(4256, 4352),
- "Hangul Jamo": range(4352, 4608),
- "Ethiopic": range(4608, 4992),
- "Ethiopic Supplement": range(4992, 5024),
- "Cherokee": range(5024, 5120),
- "Unified Canadian Aboriginal Syllabics": range(5120, 5760),
- "Ogham": range(5760, 5792),
- "Runic": range(5792, 5888),
- "Tagalog": range(5888, 5920),
- "Hanunoo": range(5920, 5952),
- "Buhid": range(5952, 5984),
- "Tagbanwa": range(5984, 6016),
- "Khmer": range(6016, 6144),
- "Mongolian": range(6144, 6320),
- "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6400),
- "Limbu": range(6400, 6480),
- "Tai Le": range(6480, 6528),
- "New Tai Lue": range(6528, 6624),
- "Khmer Symbols": range(6624, 6656),
- "Buginese": range(6656, 6688),
- "Tai Tham": range(6688, 6832),
- "Combining Diacritical Marks Extended": range(6832, 6912),
- "Balinese": range(6912, 7040),
- "Sundanese": range(7040, 7104),
- "Batak": range(7104, 7168),
- "Lepcha": range(7168, 7248),
- "Ol Chiki": range(7248, 7296),
- "Cyrillic Extended-C": range(7296, 7312),
- "Georgian Extended": range(7312, 7360),
- "Sundanese Supplement": range(7360, 7376),
- "Vedic Extensions": range(7376, 7424),
- "Phonetic Extensions": range(7424, 7552),
- "Phonetic Extensions Supplement": range(7552, 7616),
- "Combining Diacritical Marks Supplement": range(7616, 7680),
- "Latin Extended Additional": range(7680, 7936),
- "Greek Extended": range(7936, 8192),
- "General Punctuation": range(8192, 8304),
- "Superscripts and Subscripts": range(8304, 8352),
- "Currency Symbols": range(8352, 8400),
- "Combining Diacritical Marks for Symbols": range(8400, 8448),
- "Letterlike Symbols": range(8448, 8528),
- "Number Forms": range(8528, 8592),
- "Arrows": range(8592, 8704),
- "Mathematical Operators": range(8704, 8960),
- "Miscellaneous Technical": range(8960, 9216),
- "Control Pictures": range(9216, 9280),
- "Optical Character Recognition": range(9280, 9312),
- "Enclosed Alphanumerics": range(9312, 9472),
- "Box Drawing": range(9472, 9600),
- "Block Elements": range(9600, 9632),
- "Geometric Shapes": range(9632, 9728),
- "Miscellaneous Symbols": range(9728, 9984),
- "Dingbats": range(9984, 10176),
- "Miscellaneous Mathematical Symbols-A": range(10176, 10224),
- "Supplemental Arrows-A": range(10224, 10240),
- "Braille Patterns": range(10240, 10496),
- "Supplemental Arrows-B": range(10496, 10624),
- "Miscellaneous Mathematical Symbols-B": range(10624, 10752),
- "Supplemental Mathematical Operators": range(10752, 11008),
- "Miscellaneous Symbols and Arrows": range(11008, 11264),
- "Glagolitic": range(11264, 11360),
- "Latin Extended-C": range(11360, 11392),
- "Coptic": range(11392, 11520),
- "Georgian Supplement": range(11520, 11568),
- "Tifinagh": range(11568, 11648),
- "Ethiopic Extended": range(11648, 11744),
- "Cyrillic Extended-A": range(11744, 11776),
- "Supplemental Punctuation": range(11776, 11904),
- "CJK Radicals Supplement": range(11904, 12032),
- "Kangxi Radicals": range(12032, 12256),
- "Ideographic Description Characters": range(12272, 12288),
- "CJK Symbols and Punctuation": range(12288, 12352),
- "Hiragana": range(12352, 12448),
- "Katakana": range(12448, 12544),
- "Bopomofo": range(12544, 12592),
- "Hangul Compatibility Jamo": range(12592, 12688),
- "Kanbun": range(12688, 12704),
- "Bopomofo Extended": range(12704, 12736),
- "CJK Strokes": range(12736, 12784),
- "Katakana Phonetic Extensions": range(12784, 12800),
- "Enclosed CJK Letters and Months": range(12800, 13056),
- "CJK Compatibility": range(13056, 13312),
- "CJK Unified Ideographs Extension A": range(13312, 19904),
- "Yijing Hexagram Symbols": range(19904, 19968),
- "CJK Unified Ideographs": range(19968, 40960),
- "Yi Syllables": range(40960, 42128),
- "Yi Radicals": range(42128, 42192),
- "Lisu": range(42192, 42240),
- "Vai": range(42240, 42560),
- "Cyrillic Extended-B": range(42560, 42656),
- "Bamum": range(42656, 42752),
- "Modifier Tone Letters": range(42752, 42784),
- "Latin Extended-D": range(42784, 43008),
- "Syloti Nagri": range(43008, 43056),
- "Common Indic Number Forms": range(43056, 43072),
- "Phags-pa": range(43072, 43136),
- "Saurashtra": range(43136, 43232),
- "Devanagari Extended": range(43232, 43264),
- "Kayah Li": range(43264, 43312),
- "Rejang": range(43312, 43360),
- "Hangul Jamo Extended-A": range(43360, 43392),
- "Javanese": range(43392, 43488),
- "Myanmar Extended-B": range(43488, 43520),
- "Cham": range(43520, 43616),
- "Myanmar Extended-A": range(43616, 43648),
- "Tai Viet": range(43648, 43744),
- "Meetei Mayek Extensions": range(43744, 43776),
- "Ethiopic Extended-A": range(43776, 43824),
- "Latin Extended-E": range(43824, 43888),
- "Cherokee Supplement": range(43888, 43968),
- "Meetei Mayek": range(43968, 44032),
- "Hangul Syllables": range(44032, 55216),
- "Hangul Jamo Extended-B": range(55216, 55296),
- "High Surrogates": range(55296, 56192),
- "High Private Use Surrogates": range(56192, 56320),
- "Low Surrogates": range(56320, 57344),
- "Private Use Area": range(57344, 63744),
- "CJK Compatibility Ideographs": range(63744, 64256),
- "Alphabetic Presentation Forms": range(64256, 64336),
- "Arabic Presentation Forms-A": range(64336, 65024),
- "Variation Selectors": range(65024, 65040),
- "Vertical Forms": range(65040, 65056),
- "Combining Half Marks": range(65056, 65072),
- "CJK Compatibility Forms": range(65072, 65104),
- "Small Form Variants": range(65104, 65136),
- "Arabic Presentation Forms-B": range(65136, 65280),
- "Halfwidth and Fullwidth Forms": range(65280, 65520),
- "Specials": range(65520, 65536),
- "Linear B Syllabary": range(65536, 65664),
- "Linear B Ideograms": range(65664, 65792),
- "Aegean Numbers": range(65792, 65856),
- "Ancient Greek Numbers": range(65856, 65936),
- "Ancient Symbols": range(65936, 66000),
- "Phaistos Disc": range(66000, 66048),
- "Lycian": range(66176, 66208),
- "Carian": range(66208, 66272),
- "Coptic Epact Numbers": range(66272, 66304),
- "Old Italic": range(66304, 66352),
- "Gothic": range(66352, 66384),
- "Old Permic": range(66384, 66432),
- "Ugaritic": range(66432, 66464),
- "Old Persian": range(66464, 66528),
- "Deseret": range(66560, 66640),
- "Shavian": range(66640, 66688),
- "Osmanya": range(66688, 66736),
- "Osage": range(66736, 66816),
- "Elbasan": range(66816, 66864),
- "Caucasian Albanian": range(66864, 66928),
- "Vithkuqi": range(66928, 67008),
- "Linear A": range(67072, 67456),
- "Latin Extended-F": range(67456, 67520),
- "Cypriot Syllabary": range(67584, 67648),
- "Imperial Aramaic": range(67648, 67680),
- "Palmyrene": range(67680, 67712),
- "Nabataean": range(67712, 67760),
- "Hatran": range(67808, 67840),
- "Phoenician": range(67840, 67872),
- "Lydian": range(67872, 67904),
- "Meroitic Hieroglyphs": range(67968, 68000),
- "Meroitic Cursive": range(68000, 68096),
- "Kharoshthi": range(68096, 68192),
- "Old South Arabian": range(68192, 68224),
- "Old North Arabian": range(68224, 68256),
- "Manichaean": range(68288, 68352),
- "Avestan": range(68352, 68416),
- "Inscriptional Parthian": range(68416, 68448),
- "Inscriptional Pahlavi": range(68448, 68480),
- "Psalter Pahlavi": range(68480, 68528),
- "Old Turkic": range(68608, 68688),
- "Old Hungarian": range(68736, 68864),
- "Hanifi Rohingya": range(68864, 68928),
- "Rumi Numeral Symbols": range(69216, 69248),
- "Yezidi": range(69248, 69312),
- "Arabic Extended-C": range(69312, 69376),
- "Old Sogdian": range(69376, 69424),
- "Sogdian": range(69424, 69488),
- "Old Uyghur": range(69488, 69552),
- "Chorasmian": range(69552, 69600),
- "Elymaic": range(69600, 69632),
- "Brahmi": range(69632, 69760),
- "Kaithi": range(69760, 69840),
- "Sora Sompeng": range(69840, 69888),
- "Chakma": range(69888, 69968),
- "Mahajani": range(69968, 70016),
- "Sharada": range(70016, 70112),
- "Sinhala Archaic Numbers": range(70112, 70144),
- "Khojki": range(70144, 70224),
- "Multani": range(70272, 70320),
- "Khudawadi": range(70320, 70400),
- "Grantha": range(70400, 70528),
- "Newa": range(70656, 70784),
- "Tirhuta": range(70784, 70880),
- "Siddham": range(71040, 71168),
- "Modi": range(71168, 71264),
- "Mongolian Supplement": range(71264, 71296),
- "Takri": range(71296, 71376),
- "Ahom": range(71424, 71504),
- "Dogra": range(71680, 71760),
- "Warang Citi": range(71840, 71936),
- "Dives Akuru": range(71936, 72032),
- "Nandinagari": range(72096, 72192),
- "Zanabazar Square": range(72192, 72272),
- "Soyombo": range(72272, 72368),
- "Unified Canadian Aboriginal Syllabics Extended-A": range(72368, 72384),
- "Pau Cin Hau": range(72384, 72448),
- "Devanagari Extended-A": range(72448, 72544),
- "Bhaiksuki": range(72704, 72816),
- "Marchen": range(72816, 72896),
- "Masaram Gondi": range(72960, 73056),
- "Gunjala Gondi": range(73056, 73136),
- "Makasar": range(73440, 73472),
- "Kawi": range(73472, 73568),
- "Lisu Supplement": range(73648, 73664),
- "Tamil Supplement": range(73664, 73728),
- "Cuneiform": range(73728, 74752),
- "Cuneiform Numbers and Punctuation": range(74752, 74880),
- "Early Dynastic Cuneiform": range(74880, 75088),
- "Cypro-Minoan": range(77712, 77824),
- "Egyptian Hieroglyphs": range(77824, 78896),
- "Egyptian Hieroglyph Format Controls": range(78896, 78944),
- "Anatolian Hieroglyphs": range(82944, 83584),
- "Bamum Supplement": range(92160, 92736),
- "Mro": range(92736, 92784),
- "Tangsa": range(92784, 92880),
- "Bassa Vah": range(92880, 92928),
- "Pahawh Hmong": range(92928, 93072),
- "Medefaidrin": range(93760, 93856),
- "Miao": range(93952, 94112),
- "Ideographic Symbols and Punctuation": range(94176, 94208),
- "Tangut": range(94208, 100352),
- "Tangut Components": range(100352, 101120),
- "Khitan Small Script": range(101120, 101632),
- "Tangut Supplement": range(101632, 101760),
- "Kana Extended-B": range(110576, 110592),
- "Kana Supplement": range(110592, 110848),
- "Kana Extended-A": range(110848, 110896),
- "Small Kana Extension": range(110896, 110960),
- "Nushu": range(110960, 111360),
- "Duployan": range(113664, 113824),
- "Shorthand Format Controls": range(113824, 113840),
- "Znamenny Musical Notation": range(118528, 118736),
- "Byzantine Musical Symbols": range(118784, 119040),
- "Musical Symbols": range(119040, 119296),
- "Ancient Greek Musical Notation": range(119296, 119376),
- "Kaktovik Numerals": range(119488, 119520),
- "Mayan Numerals": range(119520, 119552),
- "Tai Xuan Jing Symbols": range(119552, 119648),
- "Counting Rod Numerals": range(119648, 119680),
- "Mathematical Alphanumeric Symbols": range(119808, 120832),
- "Sutton SignWriting": range(120832, 121520),
- "Latin Extended-G": range(122624, 122880),
- "Glagolitic Supplement": range(122880, 122928),
- "Cyrillic Extended-D": range(122928, 123024),
- "Nyiakeng Puachue Hmong": range(123136, 123216),
- "Toto": range(123536, 123584),
- "Wancho": range(123584, 123648),
- "Nag Mundari": range(124112, 124160),
- "Ethiopic Extended-B": range(124896, 124928),
- "Mende Kikakui": range(124928, 125152),
- "Adlam": range(125184, 125280),
- "Indic Siyaq Numbers": range(126064, 126144),
- "Ottoman Siyaq Numbers": range(126208, 126288),
- "Arabic Mathematical Alphabetic Symbols": range(126464, 126720),
- "Mahjong Tiles": range(126976, 127024),
- "Domino Tiles": range(127024, 127136),
- "Playing Cards": range(127136, 127232),
- "Enclosed Alphanumeric Supplement": range(127232, 127488),
- "Enclosed Ideographic Supplement": range(127488, 127744),
- "Miscellaneous Symbols and Pictographs": range(127744, 128512),
- "Emoticons range(Emoji)": range(128512, 128592),
- "Ornamental Dingbats": range(128592, 128640),
- "Transport and Map Symbols": range(128640, 128768),
- "Alchemical Symbols": range(128768, 128896),
- "Geometric Shapes Extended": range(128896, 129024),
- "Supplemental Arrows-C": range(129024, 129280),
- "Supplemental Symbols and Pictographs": range(129280, 129536),
- "Chess Symbols": range(129536, 129648),
- "Symbols and Pictographs Extended-A": range(129648, 129792),
- "Symbols for Legacy Computing": range(129792, 130048),
- "CJK Unified Ideographs Extension B": range(131072, 173792),
- "CJK Unified Ideographs Extension C": range(173824, 177984),
- "CJK Unified Ideographs Extension D": range(177984, 178208),
- "CJK Unified Ideographs Extension E": range(178208, 183984),
- "CJK Unified Ideographs Extension F": range(183984, 191472),
- "CJK Compatibility Ideographs Supplement": range(194560, 195104),
- "CJK Unified Ideographs Extension G": range(196608, 201552),
- "CJK Unified Ideographs Extension H": range(201552, 205744),
- "Tags": range(917504, 917632),
- "Variation Selectors Supplement": range(917760, 918000),
- "Supplementary Private Use Area-A": range(983040, 1048576),
- "Supplementary Private Use Area-B": range(1048576, 1114112),
-}
-
-
-UNICODE_SECONDARY_RANGE_KEYWORD: List[str] = [
- "Supplement",
- "Extended",
- "Extensions",
- "Modifier",
- "Marks",
- "Punctuation",
- "Symbols",
- "Forms",
- "Operators",
- "Miscellaneous",
- "Drawing",
- "Block",
- "Shapes",
- "Supplemental",
- "Tags",
-]
-
-RE_POSSIBLE_ENCODING_INDICATION = re_compile(
- r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)",
- IGNORECASE,
-)
-
-IANA_NO_ALIASES = [
- "cp720",
- "cp737",
- "cp856",
- "cp874",
- "cp875",
- "cp1006",
- "koi8_r",
- "koi8_t",
- "koi8_u",
-]
-
-IANA_SUPPORTED: List[str] = sorted(
- filter(
- lambda x: x.endswith("_codec") is False
- and x not in {"rot_13", "tactis", "mbcs"},
- list(set(aliases.values())) + IANA_NO_ALIASES,
- )
-)
-
-IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED)
-
-# pre-computed code page that are similar using the function cp_similarity.
-IANA_SUPPORTED_SIMILAR: Dict[str, List[str]] = {
- "cp037": ["cp1026", "cp1140", "cp273", "cp500"],
- "cp1026": ["cp037", "cp1140", "cp273", "cp500"],
- "cp1125": ["cp866"],
- "cp1140": ["cp037", "cp1026", "cp273", "cp500"],
- "cp1250": ["iso8859_2"],
- "cp1251": ["kz1048", "ptcp154"],
- "cp1252": ["iso8859_15", "iso8859_9", "latin_1"],
- "cp1253": ["iso8859_7"],
- "cp1254": ["iso8859_15", "iso8859_9", "latin_1"],
- "cp1257": ["iso8859_13"],
- "cp273": ["cp037", "cp1026", "cp1140", "cp500"],
- "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"],
- "cp500": ["cp037", "cp1026", "cp1140", "cp273"],
- "cp850": ["cp437", "cp857", "cp858", "cp865"],
- "cp857": ["cp850", "cp858", "cp865"],
- "cp858": ["cp437", "cp850", "cp857", "cp865"],
- "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"],
- "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"],
- "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"],
- "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"],
- "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"],
- "cp866": ["cp1125"],
- "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"],
- "iso8859_11": ["tis_620"],
- "iso8859_13": ["cp1257"],
- "iso8859_14": [
- "iso8859_10",
- "iso8859_15",
- "iso8859_16",
- "iso8859_3",
- "iso8859_9",
- "latin_1",
- ],
- "iso8859_15": [
- "cp1252",
- "cp1254",
- "iso8859_10",
- "iso8859_14",
- "iso8859_16",
- "iso8859_3",
- "iso8859_9",
- "latin_1",
- ],
- "iso8859_16": [
- "iso8859_14",
- "iso8859_15",
- "iso8859_2",
- "iso8859_3",
- "iso8859_9",
- "latin_1",
- ],
- "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"],
- "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"],
- "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"],
- "iso8859_7": ["cp1253"],
- "iso8859_9": [
- "cp1252",
- "cp1254",
- "cp1258",
- "iso8859_10",
- "iso8859_14",
- "iso8859_15",
- "iso8859_16",
- "iso8859_3",
- "iso8859_4",
- "latin_1",
- ],
- "kz1048": ["cp1251", "ptcp154"],
- "latin_1": [
- "cp1252",
- "cp1254",
- "cp1258",
- "iso8859_10",
- "iso8859_14",
- "iso8859_15",
- "iso8859_16",
- "iso8859_3",
- "iso8859_4",
- "iso8859_9",
- ],
- "mac_iceland": ["mac_roman", "mac_turkish"],
- "mac_roman": ["mac_iceland", "mac_turkish"],
- "mac_turkish": ["mac_iceland", "mac_roman"],
- "ptcp154": ["cp1251", "kz1048"],
- "tis_620": ["iso8859_11"],
-}
-
-
-CHARDET_CORRESPONDENCE: Dict[str, str] = {
- "iso2022_kr": "ISO-2022-KR",
- "iso2022_jp": "ISO-2022-JP",
- "euc_kr": "EUC-KR",
- "tis_620": "TIS-620",
- "utf_32": "UTF-32",
- "euc_jp": "EUC-JP",
- "koi8_r": "KOI8-R",
- "iso8859_1": "ISO-8859-1",
- "iso8859_2": "ISO-8859-2",
- "iso8859_5": "ISO-8859-5",
- "iso8859_6": "ISO-8859-6",
- "iso8859_7": "ISO-8859-7",
- "iso8859_8": "ISO-8859-8",
- "utf_16": "UTF-16",
- "cp855": "IBM855",
- "mac_cyrillic": "MacCyrillic",
- "gb2312": "GB2312",
- "gb18030": "GB18030",
- "cp932": "CP932",
- "cp866": "IBM866",
- "utf_8": "utf-8",
- "utf_8_sig": "UTF-8-SIG",
- "shift_jis": "SHIFT_JIS",
- "big5": "Big5",
- "cp1250": "windows-1250",
- "cp1251": "windows-1251",
- "cp1252": "Windows-1252",
- "cp1253": "windows-1253",
- "cp1255": "windows-1255",
- "cp1256": "windows-1256",
- "cp1254": "Windows-1254",
- "cp949": "CP949",
-}
-
-
-COMMON_SAFE_ASCII_CHARACTERS: Set[str] = {
- "<",
- ">",
- "=",
- ":",
- "/",
- "&",
- ";",
- "{",
- "}",
- "[",
- "]",
- ",",
- "|",
- '"',
- "-",
-}
-
-
-KO_NAMES: Set[str] = {"johab", "cp949", "euc_kr"}
-ZH_NAMES: Set[str] = {"big5", "cp950", "big5hkscs", "hz"}
-
-# Logging LEVEL below DEBUG
-TRACE: int = 5
-
-
-# Language label that contain the em dash "—"
-# character are to be considered alternative seq to origin
-FREQUENCIES: Dict[str, List[str]] = {
- "English": [
- "e",
- "a",
- "t",
- "i",
- "o",
- "n",
- "s",
- "r",
- "h",
- "l",
- "d",
- "c",
- "u",
- "m",
- "f",
- "p",
- "g",
- "w",
- "y",
- "b",
- "v",
- "k",
- "x",
- "j",
- "z",
- "q",
- ],
- "English—": [
- "e",
- "a",
- "t",
- "i",
- "o",
- "n",
- "s",
- "r",
- "h",
- "l",
- "d",
- "c",
- "m",
- "u",
- "f",
- "p",
- "g",
- "w",
- "b",
- "y",
- "v",
- "k",
- "j",
- "x",
- "z",
- "q",
- ],
- "German": [
- "e",
- "n",
- "i",
- "r",
- "s",
- "t",
- "a",
- "d",
- "h",
- "u",
- "l",
- "g",
- "o",
- "c",
- "m",
- "b",
- "f",
- "k",
- "w",
- "z",
- "p",
- "v",
- "ü",
- "ä",
- "ö",
- "j",
- ],
- "French": [
- "e",
- "a",
- "s",
- "n",
- "i",
- "t",
- "r",
- "l",
- "u",
- "o",
- "d",
- "c",
- "p",
- "m",
- "é",
- "v",
- "g",
- "f",
- "b",
- "h",
- "q",
- "à",
- "x",
- "è",
- "y",
- "j",
- ],
- "Dutch": [
- "e",
- "n",
- "a",
- "i",
- "r",
- "t",
- "o",
- "d",
- "s",
- "l",
- "g",
- "h",
- "v",
- "m",
- "u",
- "k",
- "c",
- "p",
- "b",
- "w",
- "j",
- "z",
- "f",
- "y",
- "x",
- "ë",
- ],
- "Italian": [
- "e",
- "i",
- "a",
- "o",
- "n",
- "l",
- "t",
- "r",
- "s",
- "c",
- "d",
- "u",
- "p",
- "m",
- "g",
- "v",
- "f",
- "b",
- "z",
- "h",
- "q",
- "è",
- "à",
- "k",
- "y",
- "ò",
- ],
- "Polish": [
- "a",
- "i",
- "o",
- "e",
- "n",
- "r",
- "z",
- "w",
- "s",
- "c",
- "t",
- "k",
- "y",
- "d",
- "p",
- "m",
- "u",
- "l",
- "j",
- "ł",
- "g",
- "b",
- "h",
- "ą",
- "ę",
- "ó",
- ],
- "Spanish": [
- "e",
- "a",
- "o",
- "n",
- "s",
- "r",
- "i",
- "l",
- "d",
- "t",
- "c",
- "u",
- "m",
- "p",
- "b",
- "g",
- "v",
- "f",
- "y",
- "ó",
- "h",
- "q",
- "í",
- "j",
- "z",
- "á",
- ],
- "Russian": [
- "о",
- "а",
- "е",
- "и",
- "н",
- "с",
- "т",
- "р",
- "в",
- "л",
- "к",
- "м",
- "д",
- "п",
- "у",
- "г",
- "я",
- "ы",
- "з",
- "б",
- "й",
- "ь",
- "ч",
- "х",
- "ж",
- "ц",
- ],
- # Jap-Kanji
- "Japanese": [
- "人",
- "一",
- "大",
- "亅",
- "丁",
- "丨",
- "竹",
- "笑",
- "口",
- "日",
- "今",
- "二",
- "彳",
- "行",
- "十",
- "土",
- "丶",
- "寸",
- "寺",
- "時",
- "乙",
- "丿",
- "乂",
- "气",
- "気",
- "冂",
- "巾",
- "亠",
- "市",
- "目",
- "儿",
- "見",
- "八",
- "小",
- "凵",
- "県",
- "月",
- "彐",
- "門",
- "間",
- "木",
- "東",
- "山",
- "出",
- "本",
- "中",
- "刀",
- "分",
- "耳",
- "又",
- "取",
- "最",
- "言",
- "田",
- "心",
- "思",
- "刂",
- "前",
- "京",
- "尹",
- "事",
- "生",
- "厶",
- "云",
- "会",
- "未",
- "来",
- "白",
- "冫",
- "楽",
- "灬",
- "馬",
- "尸",
- "尺",
- "駅",
- "明",
- "耂",
- "者",
- "了",
- "阝",
- "都",
- "高",
- "卜",
- "占",
- "厂",
- "广",
- "店",
- "子",
- "申",
- "奄",
- "亻",
- "俺",
- "上",
- "方",
- "冖",
- "学",
- "衣",
- "艮",
- "食",
- "自",
- ],
- # Jap-Katakana
- "Japanese—": [
- "ー",
- "ン",
- "ス",
- "・",
- "ル",
- "ト",
- "リ",
- "イ",
- "ア",
- "ラ",
- "ッ",
- "ク",
- "ド",
- "シ",
- "レ",
- "ジ",
- "タ",
- "フ",
- "ロ",
- "カ",
- "テ",
- "マ",
- "ィ",
- "グ",
- "バ",
- "ム",
- "プ",
- "オ",
- "コ",
- "デ",
- "ニ",
- "ウ",
- "メ",
- "サ",
- "ビ",
- "ナ",
- "ブ",
- "ャ",
- "エ",
- "ュ",
- "チ",
- "キ",
- "ズ",
- "ダ",
- "パ",
- "ミ",
- "ェ",
- "ョ",
- "ハ",
- "セ",
- "ベ",
- "ガ",
- "モ",
- "ツ",
- "ネ",
- "ボ",
- "ソ",
- "ノ",
- "ァ",
- "ヴ",
- "ワ",
- "ポ",
- "ペ",
- "ピ",
- "ケ",
- "ゴ",
- "ギ",
- "ザ",
- "ホ",
- "ゲ",
- "ォ",
- "ヤ",
- "ヒ",
- "ユ",
- "ヨ",
- "ヘ",
- "ゼ",
- "ヌ",
- "ゥ",
- "ゾ",
- "ヶ",
- "ヂ",
- "ヲ",
- "ヅ",
- "ヵ",
- "ヱ",
- "ヰ",
- "ヮ",
- "ヽ",
- "゠",
- "ヾ",
- "ヷ",
- "ヿ",
- "ヸ",
- "ヹ",
- "ヺ",
- ],
- # Jap-Hiragana
- "Japanese——": [
- "の",
- "に",
- "る",
- "た",
- "と",
- "は",
- "し",
- "い",
- "を",
- "で",
- "て",
- "が",
- "な",
- "れ",
- "か",
- "ら",
- "さ",
- "っ",
- "り",
- "す",
- "あ",
- "も",
- "こ",
- "ま",
- "う",
- "く",
- "よ",
- "き",
- "ん",
- "め",
- "お",
- "け",
- "そ",
- "つ",
- "だ",
- "や",
- "え",
- "ど",
- "わ",
- "ち",
- "み",
- "せ",
- "じ",
- "ば",
- "へ",
- "び",
- "ず",
- "ろ",
- "ほ",
- "げ",
- "む",
- "べ",
- "ひ",
- "ょ",
- "ゆ",
- "ぶ",
- "ご",
- "ゃ",
- "ね",
- "ふ",
- "ぐ",
- "ぎ",
- "ぼ",
- "ゅ",
- "づ",
- "ざ",
- "ぞ",
- "ぬ",
- "ぜ",
- "ぱ",
- "ぽ",
- "ぷ",
- "ぴ",
- "ぃ",
- "ぁ",
- "ぇ",
- "ぺ",
- "ゞ",
- "ぢ",
- "ぉ",
- "ぅ",
- "ゐ",
- "ゝ",
- "ゑ",
- "゛",
- "゜",
- "ゎ",
- "ゔ",
- "゚",
- "ゟ",
- "゙",
- "ゕ",
- "ゖ",
- ],
- "Portuguese": [
- "a",
- "e",
- "o",
- "s",
- "i",
- "r",
- "d",
- "n",
- "t",
- "m",
- "u",
- "c",
- "l",
- "p",
- "g",
- "v",
- "b",
- "f",
- "h",
- "ã",
- "q",
- "é",
- "ç",
- "á",
- "z",
- "í",
- ],
- "Swedish": [
- "e",
- "a",
- "n",
- "r",
- "t",
- "s",
- "i",
- "l",
- "d",
- "o",
- "m",
- "k",
- "g",
- "v",
- "h",
- "f",
- "u",
- "p",
- "ä",
- "c",
- "b",
- "ö",
- "å",
- "y",
- "j",
- "x",
- ],
- "Chinese": [
- "的",
- "一",
- "是",
- "不",
- "了",
- "在",
- "人",
- "有",
- "我",
- "他",
- "这",
- "个",
- "们",
- "中",
- "来",
- "上",
- "大",
- "为",
- "和",
- "国",
- "地",
- "到",
- "以",
- "说",
- "时",
- "要",
- "就",
- "出",
- "会",
- "可",
- "也",
- "你",
- "对",
- "生",
- "能",
- "而",
- "子",
- "那",
- "得",
- "于",
- "着",
- "下",
- "自",
- "之",
- "年",
- "过",
- "发",
- "后",
- "作",
- "里",
- "用",
- "道",
- "行",
- "所",
- "然",
- "家",
- "种",
- "事",
- "成",
- "方",
- "多",
- "经",
- "么",
- "去",
- "法",
- "学",
- "如",
- "都",
- "同",
- "现",
- "当",
- "没",
- "动",
- "面",
- "起",
- "看",
- "定",
- "天",
- "分",
- "还",
- "进",
- "好",
- "小",
- "部",
- "其",
- "些",
- "主",
- "样",
- "理",
- "心",
- "她",
- "本",
- "前",
- "开",
- "但",
- "因",
- "只",
- "从",
- "想",
- "实",
- ],
- "Ukrainian": [
- "о",
- "а",
- "н",
- "і",
- "и",
- "р",
- "в",
- "т",
- "е",
- "с",
- "к",
- "л",
- "у",
- "д",
- "м",
- "п",
- "з",
- "я",
- "ь",
- "б",
- "г",
- "й",
- "ч",
- "х",
- "ц",
- "ї",
- ],
- "Norwegian": [
- "e",
- "r",
- "n",
- "t",
- "a",
- "s",
- "i",
- "o",
- "l",
- "d",
- "g",
- "k",
- "m",
- "v",
- "f",
- "p",
- "u",
- "b",
- "h",
- "å",
- "y",
- "j",
- "ø",
- "c",
- "æ",
- "w",
- ],
- "Finnish": [
- "a",
- "i",
- "n",
- "t",
- "e",
- "s",
- "l",
- "o",
- "u",
- "k",
- "ä",
- "m",
- "r",
- "v",
- "j",
- "h",
- "p",
- "y",
- "d",
- "ö",
- "g",
- "c",
- "b",
- "f",
- "w",
- "z",
- ],
- "Vietnamese": [
- "n",
- "h",
- "t",
- "i",
- "c",
- "g",
- "a",
- "o",
- "u",
- "m",
- "l",
- "r",
- "à",
- "đ",
- "s",
- "e",
- "v",
- "p",
- "b",
- "y",
- "ư",
- "d",
- "á",
- "k",
- "ộ",
- "ế",
- ],
- "Czech": [
- "o",
- "e",
- "a",
- "n",
- "t",
- "s",
- "i",
- "l",
- "v",
- "r",
- "k",
- "d",
- "u",
- "m",
- "p",
- "í",
- "c",
- "h",
- "z",
- "á",
- "y",
- "j",
- "b",
- "ě",
- "é",
- "ř",
- ],
- "Hungarian": [
- "e",
- "a",
- "t",
- "l",
- "s",
- "n",
- "k",
- "r",
- "i",
- "o",
- "z",
- "á",
- "é",
- "g",
- "m",
- "b",
- "y",
- "v",
- "d",
- "h",
- "u",
- "p",
- "j",
- "ö",
- "f",
- "c",
- ],
- "Korean": [
- "이",
- "다",
- "에",
- "의",
- "는",
- "로",
- "하",
- "을",
- "가",
- "고",
- "지",
- "서",
- "한",
- "은",
- "기",
- "으",
- "년",
- "대",
- "사",
- "시",
- "를",
- "리",
- "도",
- "인",
- "스",
- "일",
- ],
- "Indonesian": [
- "a",
- "n",
- "e",
- "i",
- "r",
- "t",
- "u",
- "s",
- "d",
- "k",
- "m",
- "l",
- "g",
- "p",
- "b",
- "o",
- "h",
- "y",
- "j",
- "c",
- "w",
- "f",
- "v",
- "z",
- "x",
- "q",
- ],
- "Turkish": [
- "a",
- "e",
- "i",
- "n",
- "r",
- "l",
- "ı",
- "k",
- "d",
- "t",
- "s",
- "m",
- "y",
- "u",
- "o",
- "b",
- "ü",
- "ş",
- "v",
- "g",
- "z",
- "h",
- "c",
- "p",
- "ç",
- "ğ",
- ],
- "Romanian": [
- "e",
- "i",
- "a",
- "r",
- "n",
- "t",
- "u",
- "l",
- "o",
- "c",
- "s",
- "d",
- "p",
- "m",
- "ă",
- "f",
- "v",
- "î",
- "g",
- "b",
- "ș",
- "ț",
- "z",
- "h",
- "â",
- "j",
- ],
- "Farsi": [
- "ا",
- "ی",
- "ر",
- "د",
- "ن",
- "ه",
- "و",
- "م",
- "ت",
- "ب",
- "س",
- "ل",
- "ک",
- "ش",
- "ز",
- "ف",
- "گ",
- "ع",
- "خ",
- "ق",
- "ج",
- "آ",
- "پ",
- "ح",
- "ط",
- "ص",
- ],
- "Arabic": [
- "ا",
- "ل",
- "ي",
- "م",
- "و",
- "ن",
- "ر",
- "ت",
- "ب",
- "ة",
- "ع",
- "د",
- "س",
- "ف",
- "ه",
- "ك",
- "ق",
- "أ",
- "ح",
- "ج",
- "ش",
- "ط",
- "ص",
- "ى",
- "خ",
- "إ",
- ],
- "Danish": [
- "e",
- "r",
- "n",
- "t",
- "a",
- "i",
- "s",
- "d",
- "l",
- "o",
- "g",
- "m",
- "k",
- "f",
- "v",
- "u",
- "b",
- "h",
- "p",
- "å",
- "y",
- "ø",
- "æ",
- "c",
- "j",
- "w",
- ],
- "Serbian": [
- "а",
- "и",
- "о",
- "е",
- "н",
- "р",
- "с",
- "у",
- "т",
- "к",
- "ј",
- "в",
- "д",
- "м",
- "п",
- "л",
- "г",
- "з",
- "б",
- "a",
- "i",
- "e",
- "o",
- "n",
- "ц",
- "ш",
- ],
- "Lithuanian": [
- "i",
- "a",
- "s",
- "o",
- "r",
- "e",
- "t",
- "n",
- "u",
- "k",
- "m",
- "l",
- "p",
- "v",
- "d",
- "j",
- "g",
- "ė",
- "b",
- "y",
- "ų",
- "š",
- "ž",
- "c",
- "ą",
- "į",
- ],
- "Slovene": [
- "e",
- "a",
- "i",
- "o",
- "n",
- "r",
- "s",
- "l",
- "t",
- "j",
- "v",
- "k",
- "d",
- "p",
- "m",
- "u",
- "z",
- "b",
- "g",
- "h",
- "č",
- "c",
- "š",
- "ž",
- "f",
- "y",
- ],
- "Slovak": [
- "o",
- "a",
- "e",
- "n",
- "i",
- "r",
- "v",
- "t",
- "s",
- "l",
- "k",
- "d",
- "m",
- "p",
- "u",
- "c",
- "h",
- "j",
- "b",
- "z",
- "á",
- "y",
- "ý",
- "í",
- "č",
- "é",
- ],
- "Hebrew": [
- "י",
- "ו",
- "ה",
- "ל",
- "ר",
- "ב",
- "ת",
- "מ",
- "א",
- "ש",
- "נ",
- "ע",
- "ם",
- "ד",
- "ק",
- "ח",
- "פ",
- "ס",
- "כ",
- "ג",
- "ט",
- "צ",
- "ן",
- "ז",
- "ך",
- ],
- "Bulgarian": [
- "а",
- "и",
- "о",
- "е",
- "н",
- "т",
- "р",
- "с",
- "в",
- "л",
- "к",
- "д",
- "п",
- "м",
- "з",
- "г",
- "я",
- "ъ",
- "у",
- "б",
- "ч",
- "ц",
- "й",
- "ж",
- "щ",
- "х",
- ],
- "Croatian": [
- "a",
- "i",
- "o",
- "e",
- "n",
- "r",
- "j",
- "s",
- "t",
- "u",
- "k",
- "l",
- "v",
- "d",
- "m",
- "p",
- "g",
- "z",
- "b",
- "c",
- "č",
- "h",
- "š",
- "ž",
- "ć",
- "f",
- ],
- "Hindi": [
- "क",
- "र",
- "स",
- "न",
- "त",
- "म",
- "ह",
- "प",
- "य",
- "ल",
- "व",
- "ज",
- "द",
- "ग",
- "ब",
- "श",
- "ट",
- "अ",
- "ए",
- "थ",
- "भ",
- "ड",
- "च",
- "ध",
- "ष",
- "इ",
- ],
- "Estonian": [
- "a",
- "i",
- "e",
- "s",
- "t",
- "l",
- "u",
- "n",
- "o",
- "k",
- "r",
- "d",
- "m",
- "v",
- "g",
- "p",
- "j",
- "h",
- "ä",
- "b",
- "õ",
- "ü",
- "f",
- "c",
- "ö",
- "y",
- ],
- "Thai": [
- "า",
- "น",
- "ร",
- "อ",
- "ก",
- "เ",
- "ง",
- "ม",
- "ย",
- "ล",
- "ว",
- "ด",
- "ท",
- "ส",
- "ต",
- "ะ",
- "ป",
- "บ",
- "ค",
- "ห",
- "แ",
- "จ",
- "พ",
- "ช",
- "ข",
- "ใ",
- ],
- "Greek": [
- "α",
- "τ",
- "ο",
- "ι",
- "ε",
- "ν",
- "ρ",
- "σ",
- "κ",
- "η",
- "π",
- "ς",
- "υ",
- "μ",
- "λ",
- "ί",
- "ό",
- "ά",
- "γ",
- "έ",
- "δ",
- "ή",
- "ω",
- "χ",
- "θ",
- "ύ",
- ],
- "Tamil": [
- "க",
- "த",
- "ப",
- "ட",
- "ர",
- "ம",
- "ல",
- "ன",
- "வ",
- "ற",
- "ய",
- "ள",
- "ச",
- "ந",
- "இ",
- "ண",
- "அ",
- "ஆ",
- "ழ",
- "ங",
- "எ",
- "உ",
- "ஒ",
- "ஸ",
- ],
- "Kazakh": [
- "а",
- "ы",
- "е",
- "н",
- "т",
- "р",
- "л",
- "і",
- "д",
- "с",
- "м",
- "қ",
- "к",
- "о",
- "б",
- "и",
- "у",
- "ғ",
- "ж",
- "ң",
- "з",
- "ш",
- "й",
- "п",
- "г",
- "ө",
- ],
-}
-
-LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES)
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/legacy.py b/release_env/lib/python3.12/site-packages/charset_normalizer/legacy.py
deleted file mode 100644
index 43aad21a9..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/legacy.py
+++ /dev/null
@@ -1,54 +0,0 @@
-from typing import Any, Dict, Optional, Union
-from warnings import warn
-
-from .api import from_bytes
-from .constant import CHARDET_CORRESPONDENCE
-
-
-def detect(
- byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any
-) -> Dict[str, Optional[Union[str, float]]]:
- """
- chardet legacy method
- Detect the encoding of the given byte string. It should be mostly backward-compatible.
- Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it)
- This function is deprecated and should be used to migrate your project easily, consult the documentation for
- further information. Not planned for removal.
-
- :param byte_str: The byte sequence to examine.
- :param should_rename_legacy: Should we rename legacy encodings
- to their more modern equivalents?
- """
- if len(kwargs):
- warn(
- f"charset-normalizer disregard arguments '{','.join(list(kwargs.keys()))}' in legacy function detect()"
- )
-
- if not isinstance(byte_str, (bytearray, bytes)):
- raise TypeError( # pragma: nocover
- "Expected object of type bytes or bytearray, got: "
- "{0}".format(type(byte_str))
- )
-
- if isinstance(byte_str, bytearray):
- byte_str = bytes(byte_str)
-
- r = from_bytes(byte_str).best()
-
- encoding = r.encoding if r is not None else None
- language = r.language if r is not None and r.language != "Unknown" else ""
- confidence = 1.0 - r.chaos if r is not None else None
-
- # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process
- # but chardet does return 'utf-8-sig' and it is a valid codec name.
- if r is not None and encoding == "utf_8" and r.bom:
- encoding += "_sig"
-
- if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE:
- encoding = CHARDET_CORRESPONDENCE[encoding]
-
- return {
- "encoding": encoding,
- "language": language,
- "confidence": confidence,
- }
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-darwin.so b/release_env/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-darwin.so
deleted file mode 100755
index d905e2c8d..000000000
Binary files a/release_env/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-darwin.so and /dev/null differ
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/md.py b/release_env/lib/python3.12/site-packages/charset_normalizer/md.py
deleted file mode 100644
index 77897aae4..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/md.py
+++ /dev/null
@@ -1,615 +0,0 @@
-from functools import lru_cache
-from logging import getLogger
-from typing import List, Optional
-
-from .constant import (
- COMMON_SAFE_ASCII_CHARACTERS,
- TRACE,
- UNICODE_SECONDARY_RANGE_KEYWORD,
-)
-from .utils import (
- is_accentuated,
- is_arabic,
- is_arabic_isolated_form,
- is_case_variable,
- is_cjk,
- is_emoticon,
- is_hangul,
- is_hiragana,
- is_katakana,
- is_latin,
- is_punctuation,
- is_separator,
- is_symbol,
- is_thai,
- is_unprintable,
- remove_accent,
- unicode_range,
-)
-
-
-class MessDetectorPlugin:
- """
- Base abstract class used for mess detection plugins.
- All detectors MUST extend and implement given methods.
- """
-
- def eligible(self, character: str) -> bool:
- """
- Determine if given character should be fed in.
- """
- raise NotImplementedError # pragma: nocover
-
- def feed(self, character: str) -> None:
- """
- The main routine to be executed upon character.
- Insert the logic in witch the text would be considered chaotic.
- """
- raise NotImplementedError # pragma: nocover
-
- def reset(self) -> None: # pragma: no cover
- """
- Permit to reset the plugin to the initial state.
- """
- raise NotImplementedError
-
- @property
- def ratio(self) -> float:
- """
- Compute the chaos ratio based on what your feed() has seen.
- Must NOT be lower than 0.; No restriction gt 0.
- """
- raise NotImplementedError # pragma: nocover
-
-
-class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin):
- def __init__(self) -> None:
- self._punctuation_count: int = 0
- self._symbol_count: int = 0
- self._character_count: int = 0
-
- self._last_printable_char: Optional[str] = None
- self._frenzy_symbol_in_word: bool = False
-
- def eligible(self, character: str) -> bool:
- return character.isprintable()
-
- def feed(self, character: str) -> None:
- self._character_count += 1
-
- if (
- character != self._last_printable_char
- and character not in COMMON_SAFE_ASCII_CHARACTERS
- ):
- if is_punctuation(character):
- self._punctuation_count += 1
- elif (
- character.isdigit() is False
- and is_symbol(character)
- and is_emoticon(character) is False
- ):
- self._symbol_count += 2
-
- self._last_printable_char = character
-
- def reset(self) -> None: # pragma: no cover
- self._punctuation_count = 0
- self._character_count = 0
- self._symbol_count = 0
-
- @property
- def ratio(self) -> float:
- if self._character_count == 0:
- return 0.0
-
- ratio_of_punctuation: float = (
- self._punctuation_count + self._symbol_count
- ) / self._character_count
-
- return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0
-
-
-class TooManyAccentuatedPlugin(MessDetectorPlugin):
- def __init__(self) -> None:
- self._character_count: int = 0
- self._accentuated_count: int = 0
-
- def eligible(self, character: str) -> bool:
- return character.isalpha()
-
- def feed(self, character: str) -> None:
- self._character_count += 1
-
- if is_accentuated(character):
- self._accentuated_count += 1
-
- def reset(self) -> None: # pragma: no cover
- self._character_count = 0
- self._accentuated_count = 0
-
- @property
- def ratio(self) -> float:
- if self._character_count < 8:
- return 0.0
-
- ratio_of_accentuation: float = self._accentuated_count / self._character_count
- return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0
-
-
-class UnprintablePlugin(MessDetectorPlugin):
- def __init__(self) -> None:
- self._unprintable_count: int = 0
- self._character_count: int = 0
-
- def eligible(self, character: str) -> bool:
- return True
-
- def feed(self, character: str) -> None:
- if is_unprintable(character):
- self._unprintable_count += 1
- self._character_count += 1
-
- def reset(self) -> None: # pragma: no cover
- self._unprintable_count = 0
-
- @property
- def ratio(self) -> float:
- if self._character_count == 0:
- return 0.0
-
- return (self._unprintable_count * 8) / self._character_count
-
-
-class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin):
- def __init__(self) -> None:
- self._successive_count: int = 0
- self._character_count: int = 0
-
- self._last_latin_character: Optional[str] = None
-
- def eligible(self, character: str) -> bool:
- return character.isalpha() and is_latin(character)
-
- def feed(self, character: str) -> None:
- self._character_count += 1
- if (
- self._last_latin_character is not None
- and is_accentuated(character)
- and is_accentuated(self._last_latin_character)
- ):
- if character.isupper() and self._last_latin_character.isupper():
- self._successive_count += 1
- # Worse if its the same char duplicated with different accent.
- if remove_accent(character) == remove_accent(self._last_latin_character):
- self._successive_count += 1
- self._last_latin_character = character
-
- def reset(self) -> None: # pragma: no cover
- self._successive_count = 0
- self._character_count = 0
- self._last_latin_character = None
-
- @property
- def ratio(self) -> float:
- if self._character_count == 0:
- return 0.0
-
- return (self._successive_count * 2) / self._character_count
-
-
-class SuspiciousRange(MessDetectorPlugin):
- def __init__(self) -> None:
- self._suspicious_successive_range_count: int = 0
- self._character_count: int = 0
- self._last_printable_seen: Optional[str] = None
-
- def eligible(self, character: str) -> bool:
- return character.isprintable()
-
- def feed(self, character: str) -> None:
- self._character_count += 1
-
- if (
- character.isspace()
- or is_punctuation(character)
- or character in COMMON_SAFE_ASCII_CHARACTERS
- ):
- self._last_printable_seen = None
- return
-
- if self._last_printable_seen is None:
- self._last_printable_seen = character
- return
-
- unicode_range_a: Optional[str] = unicode_range(self._last_printable_seen)
- unicode_range_b: Optional[str] = unicode_range(character)
-
- if is_suspiciously_successive_range(unicode_range_a, unicode_range_b):
- self._suspicious_successive_range_count += 1
-
- self._last_printable_seen = character
-
- def reset(self) -> None: # pragma: no cover
- self._character_count = 0
- self._suspicious_successive_range_count = 0
- self._last_printable_seen = None
-
- @property
- def ratio(self) -> float:
- if self._character_count <= 24:
- return 0.0
-
- ratio_of_suspicious_range_usage: float = (
- self._suspicious_successive_range_count * 2
- ) / self._character_count
-
- return ratio_of_suspicious_range_usage
-
-
-class SuperWeirdWordPlugin(MessDetectorPlugin):
- def __init__(self) -> None:
- self._word_count: int = 0
- self._bad_word_count: int = 0
- self._foreign_long_count: int = 0
-
- self._is_current_word_bad: bool = False
- self._foreign_long_watch: bool = False
-
- self._character_count: int = 0
- self._bad_character_count: int = 0
-
- self._buffer: str = ""
- self._buffer_accent_count: int = 0
-
- def eligible(self, character: str) -> bool:
- return True
-
- def feed(self, character: str) -> None:
- if character.isalpha():
- self._buffer += character
- if is_accentuated(character):
- self._buffer_accent_count += 1
- if (
- self._foreign_long_watch is False
- and (is_latin(character) is False or is_accentuated(character))
- and is_cjk(character) is False
- and is_hangul(character) is False
- and is_katakana(character) is False
- and is_hiragana(character) is False
- and is_thai(character) is False
- ):
- self._foreign_long_watch = True
- return
- if not self._buffer:
- return
- if (
- character.isspace() or is_punctuation(character) or is_separator(character)
- ) and self._buffer:
- self._word_count += 1
- buffer_length: int = len(self._buffer)
-
- self._character_count += buffer_length
-
- if buffer_length >= 4:
- if self._buffer_accent_count / buffer_length > 0.34:
- self._is_current_word_bad = True
- # Word/Buffer ending with an upper case accentuated letter are so rare,
- # that we will consider them all as suspicious. Same weight as foreign_long suspicious.
- if (
- is_accentuated(self._buffer[-1])
- and self._buffer[-1].isupper()
- and all(_.isupper() for _ in self._buffer) is False
- ):
- self._foreign_long_count += 1
- self._is_current_word_bad = True
- if buffer_length >= 24 and self._foreign_long_watch:
- camel_case_dst = [
- i
- for c, i in zip(self._buffer, range(0, buffer_length))
- if c.isupper()
- ]
- probable_camel_cased: bool = False
-
- if camel_case_dst and (len(camel_case_dst) / buffer_length <= 0.3):
- probable_camel_cased = True
-
- if not probable_camel_cased:
- self._foreign_long_count += 1
- self._is_current_word_bad = True
-
- if self._is_current_word_bad:
- self._bad_word_count += 1
- self._bad_character_count += len(self._buffer)
- self._is_current_word_bad = False
-
- self._foreign_long_watch = False
- self._buffer = ""
- self._buffer_accent_count = 0
- elif (
- character not in {"<", ">", "-", "=", "~", "|", "_"}
- and character.isdigit() is False
- and is_symbol(character)
- ):
- self._is_current_word_bad = True
- self._buffer += character
-
- def reset(self) -> None: # pragma: no cover
- self._buffer = ""
- self._is_current_word_bad = False
- self._foreign_long_watch = False
- self._bad_word_count = 0
- self._word_count = 0
- self._character_count = 0
- self._bad_character_count = 0
- self._foreign_long_count = 0
-
- @property
- def ratio(self) -> float:
- if self._word_count <= 10 and self._foreign_long_count == 0:
- return 0.0
-
- return self._bad_character_count / self._character_count
-
-
-class CjkInvalidStopPlugin(MessDetectorPlugin):
- """
- GB(Chinese) based encoding often render the stop incorrectly when the content does not fit and
- can be easily detected. Searching for the overuse of '丅' and '丄'.
- """
-
- def __init__(self) -> None:
- self._wrong_stop_count: int = 0
- self._cjk_character_count: int = 0
-
- def eligible(self, character: str) -> bool:
- return True
-
- def feed(self, character: str) -> None:
- if character in {"丅", "丄"}:
- self._wrong_stop_count += 1
- return
- if is_cjk(character):
- self._cjk_character_count += 1
-
- def reset(self) -> None: # pragma: no cover
- self._wrong_stop_count = 0
- self._cjk_character_count = 0
-
- @property
- def ratio(self) -> float:
- if self._cjk_character_count < 16:
- return 0.0
- return self._wrong_stop_count / self._cjk_character_count
-
-
-class ArchaicUpperLowerPlugin(MessDetectorPlugin):
- def __init__(self) -> None:
- self._buf: bool = False
-
- self._character_count_since_last_sep: int = 0
-
- self._successive_upper_lower_count: int = 0
- self._successive_upper_lower_count_final: int = 0
-
- self._character_count: int = 0
-
- self._last_alpha_seen: Optional[str] = None
- self._current_ascii_only: bool = True
-
- def eligible(self, character: str) -> bool:
- return True
-
- def feed(self, character: str) -> None:
- is_concerned = character.isalpha() and is_case_variable(character)
- chunk_sep = is_concerned is False
-
- if chunk_sep and self._character_count_since_last_sep > 0:
- if (
- self._character_count_since_last_sep <= 64
- and character.isdigit() is False
- and self._current_ascii_only is False
- ):
- self._successive_upper_lower_count_final += (
- self._successive_upper_lower_count
- )
-
- self._successive_upper_lower_count = 0
- self._character_count_since_last_sep = 0
- self._last_alpha_seen = None
- self._buf = False
- self._character_count += 1
- self._current_ascii_only = True
-
- return
-
- if self._current_ascii_only is True and character.isascii() is False:
- self._current_ascii_only = False
-
- if self._last_alpha_seen is not None:
- if (character.isupper() and self._last_alpha_seen.islower()) or (
- character.islower() and self._last_alpha_seen.isupper()
- ):
- if self._buf is True:
- self._successive_upper_lower_count += 2
- self._buf = False
- else:
- self._buf = True
- else:
- self._buf = False
-
- self._character_count += 1
- self._character_count_since_last_sep += 1
- self._last_alpha_seen = character
-
- def reset(self) -> None: # pragma: no cover
- self._character_count = 0
- self._character_count_since_last_sep = 0
- self._successive_upper_lower_count = 0
- self._successive_upper_lower_count_final = 0
- self._last_alpha_seen = None
- self._buf = False
- self._current_ascii_only = True
-
- @property
- def ratio(self) -> float:
- if self._character_count == 0:
- return 0.0
-
- return self._successive_upper_lower_count_final / self._character_count
-
-
-class ArabicIsolatedFormPlugin(MessDetectorPlugin):
- def __init__(self) -> None:
- self._character_count: int = 0
- self._isolated_form_count: int = 0
-
- def reset(self) -> None: # pragma: no cover
- self._character_count = 0
- self._isolated_form_count = 0
-
- def eligible(self, character: str) -> bool:
- return is_arabic(character)
-
- def feed(self, character: str) -> None:
- self._character_count += 1
-
- if is_arabic_isolated_form(character):
- self._isolated_form_count += 1
-
- @property
- def ratio(self) -> float:
- if self._character_count < 8:
- return 0.0
-
- isolated_form_usage: float = self._isolated_form_count / self._character_count
-
- return isolated_form_usage
-
-
-@lru_cache(maxsize=1024)
-def is_suspiciously_successive_range(
- unicode_range_a: Optional[str], unicode_range_b: Optional[str]
-) -> bool:
- """
- Determine if two Unicode range seen next to each other can be considered as suspicious.
- """
- if unicode_range_a is None or unicode_range_b is None:
- return True
-
- if unicode_range_a == unicode_range_b:
- return False
-
- if "Latin" in unicode_range_a and "Latin" in unicode_range_b:
- return False
-
- if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b:
- return False
-
- # Latin characters can be accompanied with a combining diacritical mark
- # eg. Vietnamese.
- if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and (
- "Combining" in unicode_range_a or "Combining" in unicode_range_b
- ):
- return False
-
- keywords_range_a, keywords_range_b = unicode_range_a.split(
- " "
- ), unicode_range_b.split(" ")
-
- for el in keywords_range_a:
- if el in UNICODE_SECONDARY_RANGE_KEYWORD:
- continue
- if el in keywords_range_b:
- return False
-
- # Japanese Exception
- range_a_jp_chars, range_b_jp_chars = (
- unicode_range_a
- in (
- "Hiragana",
- "Katakana",
- ),
- unicode_range_b in ("Hiragana", "Katakana"),
- )
- if (range_a_jp_chars or range_b_jp_chars) and (
- "CJK" in unicode_range_a or "CJK" in unicode_range_b
- ):
- return False
- if range_a_jp_chars and range_b_jp_chars:
- return False
-
- if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b:
- if "CJK" in unicode_range_a or "CJK" in unicode_range_b:
- return False
- if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin":
- return False
-
- # Chinese/Japanese use dedicated range for punctuation and/or separators.
- if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or (
- unicode_range_a in ["Katakana", "Hiragana"]
- and unicode_range_b in ["Katakana", "Hiragana"]
- ):
- if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b:
- return False
- if "Forms" in unicode_range_a or "Forms" in unicode_range_b:
- return False
- if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin":
- return False
-
- return True
-
-
-@lru_cache(maxsize=2048)
-def mess_ratio(
- decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False
-) -> float:
- """
- Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier.
- """
-
- detectors: List[MessDetectorPlugin] = [
- md_class() for md_class in MessDetectorPlugin.__subclasses__()
- ]
-
- length: int = len(decoded_sequence) + 1
-
- mean_mess_ratio: float = 0.0
-
- if length < 512:
- intermediary_mean_mess_ratio_calc: int = 32
- elif length <= 1024:
- intermediary_mean_mess_ratio_calc = 64
- else:
- intermediary_mean_mess_ratio_calc = 128
-
- for character, index in zip(decoded_sequence + "\n", range(length)):
- for detector in detectors:
- if detector.eligible(character):
- detector.feed(character)
-
- if (
- index > 0 and index % intermediary_mean_mess_ratio_calc == 0
- ) or index == length - 1:
- mean_mess_ratio = sum(dt.ratio for dt in detectors)
-
- if mean_mess_ratio >= maximum_threshold:
- break
-
- if debug:
- logger = getLogger("charset_normalizer")
-
- logger.log(
- TRACE,
- "Mess-detector extended-analysis start. "
- f"intermediary_mean_mess_ratio_calc={intermediary_mean_mess_ratio_calc} mean_mess_ratio={mean_mess_ratio} "
- f"maximum_threshold={maximum_threshold}",
- )
-
- if len(decoded_sequence) > 16:
- logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}")
- logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}")
-
- for dt in detectors: # pragma: nocover
- logger.log(TRACE, f"{dt.__class__}: {dt.ratio}")
-
- return round(mean_mess_ratio, 3)
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-darwin.so b/release_env/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-darwin.so
deleted file mode 100755
index 7440ba516..000000000
Binary files a/release_env/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-darwin.so and /dev/null differ
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/models.py b/release_env/lib/python3.12/site-packages/charset_normalizer/models.py
deleted file mode 100644
index a760b9c55..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/models.py
+++ /dev/null
@@ -1,340 +0,0 @@
-from encodings.aliases import aliases
-from hashlib import sha256
-from json import dumps
-from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
-
-from .constant import TOO_BIG_SEQUENCE
-from .utils import iana_name, is_multi_byte_encoding, unicode_range
-
-
-class CharsetMatch:
- def __init__(
- self,
- payload: bytes,
- guessed_encoding: str,
- mean_mess_ratio: float,
- has_sig_or_bom: bool,
- languages: "CoherenceMatches",
- decoded_payload: Optional[str] = None,
- ):
- self._payload: bytes = payload
-
- self._encoding: str = guessed_encoding
- self._mean_mess_ratio: float = mean_mess_ratio
- self._languages: CoherenceMatches = languages
- self._has_sig_or_bom: bool = has_sig_or_bom
- self._unicode_ranges: Optional[List[str]] = None
-
- self._leaves: List[CharsetMatch] = []
- self._mean_coherence_ratio: float = 0.0
-
- self._output_payload: Optional[bytes] = None
- self._output_encoding: Optional[str] = None
-
- self._string: Optional[str] = decoded_payload
-
- def __eq__(self, other: object) -> bool:
- if not isinstance(other, CharsetMatch):
- raise TypeError(
- "__eq__ cannot be invoked on {} and {}.".format(
- str(other.__class__), str(self.__class__)
- )
- )
- return self.encoding == other.encoding and self.fingerprint == other.fingerprint
-
- def __lt__(self, other: object) -> bool:
- """
- Implemented to make sorted available upon CharsetMatches items.
- """
- if not isinstance(other, CharsetMatch):
- raise ValueError
-
- chaos_difference: float = abs(self.chaos - other.chaos)
- coherence_difference: float = abs(self.coherence - other.coherence)
-
- # Below 1% difference --> Use Coherence
- if chaos_difference < 0.01 and coherence_difference > 0.02:
- return self.coherence > other.coherence
- elif chaos_difference < 0.01 and coherence_difference <= 0.02:
- # When having a difficult decision, use the result that decoded as many multi-byte as possible.
- # preserve RAM usage!
- if len(self._payload) >= TOO_BIG_SEQUENCE:
- return self.chaos < other.chaos
- return self.multi_byte_usage > other.multi_byte_usage
-
- return self.chaos < other.chaos
-
- @property
- def multi_byte_usage(self) -> float:
- return 1.0 - (len(str(self)) / len(self.raw))
-
- def __str__(self) -> str:
- # Lazy Str Loading
- if self._string is None:
- self._string = str(self._payload, self._encoding, "strict")
- return self._string
-
- def __repr__(self) -> str:
- return "".format(self.encoding, self.fingerprint)
-
- def add_submatch(self, other: "CharsetMatch") -> None:
- if not isinstance(other, CharsetMatch) or other == self:
- raise ValueError(
- "Unable to add instance <{}> as a submatch of a CharsetMatch".format(
- other.__class__
- )
- )
-
- other._string = None # Unload RAM usage; dirty trick.
- self._leaves.append(other)
-
- @property
- def encoding(self) -> str:
- return self._encoding
-
- @property
- def encoding_aliases(self) -> List[str]:
- """
- Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855.
- """
- also_known_as: List[str] = []
- for u, p in aliases.items():
- if self.encoding == u:
- also_known_as.append(p)
- elif self.encoding == p:
- also_known_as.append(u)
- return also_known_as
-
- @property
- def bom(self) -> bool:
- return self._has_sig_or_bom
-
- @property
- def byte_order_mark(self) -> bool:
- return self._has_sig_or_bom
-
- @property
- def languages(self) -> List[str]:
- """
- Return the complete list of possible languages found in decoded sequence.
- Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'.
- """
- return [e[0] for e in self._languages]
-
- @property
- def language(self) -> str:
- """
- Most probable language found in decoded sequence. If none were detected or inferred, the property will return
- "Unknown".
- """
- if not self._languages:
- # Trying to infer the language based on the given encoding
- # Its either English or we should not pronounce ourselves in certain cases.
- if "ascii" in self.could_be_from_charset:
- return "English"
-
- # doing it there to avoid circular import
- from charset_normalizer.cd import encoding_languages, mb_encoding_languages
-
- languages = (
- mb_encoding_languages(self.encoding)
- if is_multi_byte_encoding(self.encoding)
- else encoding_languages(self.encoding)
- )
-
- if len(languages) == 0 or "Latin Based" in languages:
- return "Unknown"
-
- return languages[0]
-
- return self._languages[0][0]
-
- @property
- def chaos(self) -> float:
- return self._mean_mess_ratio
-
- @property
- def coherence(self) -> float:
- if not self._languages:
- return 0.0
- return self._languages[0][1]
-
- @property
- def percent_chaos(self) -> float:
- return round(self.chaos * 100, ndigits=3)
-
- @property
- def percent_coherence(self) -> float:
- return round(self.coherence * 100, ndigits=3)
-
- @property
- def raw(self) -> bytes:
- """
- Original untouched bytes.
- """
- return self._payload
-
- @property
- def submatch(self) -> List["CharsetMatch"]:
- return self._leaves
-
- @property
- def has_submatch(self) -> bool:
- return len(self._leaves) > 0
-
- @property
- def alphabets(self) -> List[str]:
- if self._unicode_ranges is not None:
- return self._unicode_ranges
- # list detected ranges
- detected_ranges: List[Optional[str]] = [
- unicode_range(char) for char in str(self)
- ]
- # filter and sort
- self._unicode_ranges = sorted(list({r for r in detected_ranges if r}))
- return self._unicode_ranges
-
- @property
- def could_be_from_charset(self) -> List[str]:
- """
- The complete list of encoding that output the exact SAME str result and therefore could be the originating
- encoding.
- This list does include the encoding available in property 'encoding'.
- """
- return [self._encoding] + [m.encoding for m in self._leaves]
-
- def output(self, encoding: str = "utf_8") -> bytes:
- """
- Method to get re-encoded bytes payload using given target encoding. Default to UTF-8.
- Any errors will be simply ignored by the encoder NOT replaced.
- """
- if self._output_encoding is None or self._output_encoding != encoding:
- self._output_encoding = encoding
- self._output_payload = str(self).encode(encoding, "replace")
-
- return self._output_payload # type: ignore
-
- @property
- def fingerprint(self) -> str:
- """
- Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one.
- """
- return sha256(self.output()).hexdigest()
-
-
-class CharsetMatches:
- """
- Container with every CharsetMatch items ordered by default from most probable to the less one.
- Act like a list(iterable) but does not implements all related methods.
- """
-
- def __init__(self, results: Optional[List[CharsetMatch]] = None):
- self._results: List[CharsetMatch] = sorted(results) if results else []
-
- def __iter__(self) -> Iterator[CharsetMatch]:
- yield from self._results
-
- def __getitem__(self, item: Union[int, str]) -> CharsetMatch:
- """
- Retrieve a single item either by its position or encoding name (alias may be used here).
- Raise KeyError upon invalid index or encoding not present in results.
- """
- if isinstance(item, int):
- return self._results[item]
- if isinstance(item, str):
- item = iana_name(item, False)
- for result in self._results:
- if item in result.could_be_from_charset:
- return result
- raise KeyError
-
- def __len__(self) -> int:
- return len(self._results)
-
- def __bool__(self) -> bool:
- return len(self._results) > 0
-
- def append(self, item: CharsetMatch) -> None:
- """
- Insert a single match. Will be inserted accordingly to preserve sort.
- Can be inserted as a submatch.
- """
- if not isinstance(item, CharsetMatch):
- raise ValueError(
- "Cannot append instance '{}' to CharsetMatches".format(
- str(item.__class__)
- )
- )
- # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage)
- if len(item.raw) <= TOO_BIG_SEQUENCE:
- for match in self._results:
- if match.fingerprint == item.fingerprint and match.chaos == item.chaos:
- match.add_submatch(item)
- return
- self._results.append(item)
- self._results = sorted(self._results)
-
- def best(self) -> Optional["CharsetMatch"]:
- """
- Simply return the first match. Strict equivalent to matches[0].
- """
- if not self._results:
- return None
- return self._results[0]
-
- def first(self) -> Optional["CharsetMatch"]:
- """
- Redundant method, call the method best(). Kept for BC reasons.
- """
- return self.best()
-
-
-CoherenceMatch = Tuple[str, float]
-CoherenceMatches = List[CoherenceMatch]
-
-
-class CliDetectionResult:
- def __init__(
- self,
- path: str,
- encoding: Optional[str],
- encoding_aliases: List[str],
- alternative_encodings: List[str],
- language: str,
- alphabets: List[str],
- has_sig_or_bom: bool,
- chaos: float,
- coherence: float,
- unicode_path: Optional[str],
- is_preferred: bool,
- ):
- self.path: str = path
- self.unicode_path: Optional[str] = unicode_path
- self.encoding: Optional[str] = encoding
- self.encoding_aliases: List[str] = encoding_aliases
- self.alternative_encodings: List[str] = alternative_encodings
- self.language: str = language
- self.alphabets: List[str] = alphabets
- self.has_sig_or_bom: bool = has_sig_or_bom
- self.chaos: float = chaos
- self.coherence: float = coherence
- self.is_preferred: bool = is_preferred
-
- @property
- def __dict__(self) -> Dict[str, Any]: # type: ignore
- return {
- "path": self.path,
- "encoding": self.encoding,
- "encoding_aliases": self.encoding_aliases,
- "alternative_encodings": self.alternative_encodings,
- "language": self.language,
- "alphabets": self.alphabets,
- "has_sig_or_bom": self.has_sig_or_bom,
- "chaos": self.chaos,
- "coherence": self.coherence,
- "unicode_path": self.unicode_path,
- "is_preferred": self.is_preferred,
- }
-
- def to_json(self) -> str:
- return dumps(self.__dict__, ensure_ascii=True, indent=4)
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/py.typed b/release_env/lib/python3.12/site-packages/charset_normalizer/py.typed
deleted file mode 100644
index e69de29bb..000000000
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/utils.py b/release_env/lib/python3.12/site-packages/charset_normalizer/utils.py
deleted file mode 100644
index e5cbbf4c0..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/utils.py
+++ /dev/null
@@ -1,421 +0,0 @@
-import importlib
-import logging
-import unicodedata
-from codecs import IncrementalDecoder
-from encodings.aliases import aliases
-from functools import lru_cache
-from re import findall
-from typing import Generator, List, Optional, Set, Tuple, Union
-
-from _multibytecodec import MultibyteIncrementalDecoder
-
-from .constant import (
- ENCODING_MARKS,
- IANA_SUPPORTED_SIMILAR,
- RE_POSSIBLE_ENCODING_INDICATION,
- UNICODE_RANGES_COMBINED,
- UNICODE_SECONDARY_RANGE_KEYWORD,
- UTF8_MAXIMAL_ALLOCATION,
-)
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_accentuated(character: str) -> bool:
- try:
- description: str = unicodedata.name(character)
- except ValueError:
- return False
- return (
- "WITH GRAVE" in description
- or "WITH ACUTE" in description
- or "WITH CEDILLA" in description
- or "WITH DIAERESIS" in description
- or "WITH CIRCUMFLEX" in description
- or "WITH TILDE" in description
- or "WITH MACRON" in description
- or "WITH RING ABOVE" in description
- )
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def remove_accent(character: str) -> str:
- decomposed: str = unicodedata.decomposition(character)
- if not decomposed:
- return character
-
- codes: List[str] = decomposed.split(" ")
-
- return chr(int(codes[0], 16))
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def unicode_range(character: str) -> Optional[str]:
- """
- Retrieve the Unicode range official name from a single character.
- """
- character_ord: int = ord(character)
-
- for range_name, ord_range in UNICODE_RANGES_COMBINED.items():
- if character_ord in ord_range:
- return range_name
-
- return None
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_latin(character: str) -> bool:
- try:
- description: str = unicodedata.name(character)
- except ValueError:
- return False
- return "LATIN" in description
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_punctuation(character: str) -> bool:
- character_category: str = unicodedata.category(character)
-
- if "P" in character_category:
- return True
-
- character_range: Optional[str] = unicode_range(character)
-
- if character_range is None:
- return False
-
- return "Punctuation" in character_range
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_symbol(character: str) -> bool:
- character_category: str = unicodedata.category(character)
-
- if "S" in character_category or "N" in character_category:
- return True
-
- character_range: Optional[str] = unicode_range(character)
-
- if character_range is None:
- return False
-
- return "Forms" in character_range and character_category != "Lo"
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_emoticon(character: str) -> bool:
- character_range: Optional[str] = unicode_range(character)
-
- if character_range is None:
- return False
-
- return "Emoticons" in character_range or "Pictographs" in character_range
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_separator(character: str) -> bool:
- if character.isspace() or character in {"|", "+", "<", ">"}:
- return True
-
- character_category: str = unicodedata.category(character)
-
- return "Z" in character_category or character_category in {"Po", "Pd", "Pc"}
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_case_variable(character: str) -> bool:
- return character.islower() != character.isupper()
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_cjk(character: str) -> bool:
- try:
- character_name = unicodedata.name(character)
- except ValueError:
- return False
-
- return "CJK" in character_name
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_hiragana(character: str) -> bool:
- try:
- character_name = unicodedata.name(character)
- except ValueError:
- return False
-
- return "HIRAGANA" in character_name
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_katakana(character: str) -> bool:
- try:
- character_name = unicodedata.name(character)
- except ValueError:
- return False
-
- return "KATAKANA" in character_name
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_hangul(character: str) -> bool:
- try:
- character_name = unicodedata.name(character)
- except ValueError:
- return False
-
- return "HANGUL" in character_name
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_thai(character: str) -> bool:
- try:
- character_name = unicodedata.name(character)
- except ValueError:
- return False
-
- return "THAI" in character_name
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_arabic(character: str) -> bool:
- try:
- character_name = unicodedata.name(character)
- except ValueError:
- return False
-
- return "ARABIC" in character_name
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_arabic_isolated_form(character: str) -> bool:
- try:
- character_name = unicodedata.name(character)
- except ValueError:
- return False
-
- return "ARABIC" in character_name and "ISOLATED FORM" in character_name
-
-
-@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED))
-def is_unicode_range_secondary(range_name: str) -> bool:
- return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD)
-
-
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_unprintable(character: str) -> bool:
- return (
- character.isspace() is False # includes \n \t \r \v
- and character.isprintable() is False
- and character != "\x1A" # Why? Its the ASCII substitute character.
- and character != "\ufeff" # bug discovered in Python,
- # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space.
- )
-
-
-def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> Optional[str]:
- """
- Extract using ASCII-only decoder any specified encoding in the first n-bytes.
- """
- if not isinstance(sequence, bytes):
- raise TypeError
-
- seq_len: int = len(sequence)
-
- results: List[str] = findall(
- RE_POSSIBLE_ENCODING_INDICATION,
- sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"),
- )
-
- if len(results) == 0:
- return None
-
- for specified_encoding in results:
- specified_encoding = specified_encoding.lower().replace("-", "_")
-
- encoding_alias: str
- encoding_iana: str
-
- for encoding_alias, encoding_iana in aliases.items():
- if encoding_alias == specified_encoding:
- return encoding_iana
- if encoding_iana == specified_encoding:
- return encoding_iana
-
- return None
-
-
-@lru_cache(maxsize=128)
-def is_multi_byte_encoding(name: str) -> bool:
- """
- Verify is a specific encoding is a multi byte one based on it IANA name
- """
- return name in {
- "utf_8",
- "utf_8_sig",
- "utf_16",
- "utf_16_be",
- "utf_16_le",
- "utf_32",
- "utf_32_le",
- "utf_32_be",
- "utf_7",
- } or issubclass(
- importlib.import_module("encodings.{}".format(name)).IncrementalDecoder,
- MultibyteIncrementalDecoder,
- )
-
-
-def identify_sig_or_bom(sequence: bytes) -> Tuple[Optional[str], bytes]:
- """
- Identify and extract SIG/BOM in given sequence.
- """
-
- for iana_encoding in ENCODING_MARKS:
- marks: Union[bytes, List[bytes]] = ENCODING_MARKS[iana_encoding]
-
- if isinstance(marks, bytes):
- marks = [marks]
-
- for mark in marks:
- if sequence.startswith(mark):
- return iana_encoding, mark
-
- return None, b""
-
-
-def should_strip_sig_or_bom(iana_encoding: str) -> bool:
- return iana_encoding not in {"utf_16", "utf_32"}
-
-
-def iana_name(cp_name: str, strict: bool = True) -> str:
- cp_name = cp_name.lower().replace("-", "_")
-
- encoding_alias: str
- encoding_iana: str
-
- for encoding_alias, encoding_iana in aliases.items():
- if cp_name in [encoding_alias, encoding_iana]:
- return encoding_iana
-
- if strict:
- raise ValueError("Unable to retrieve IANA for '{}'".format(cp_name))
-
- return cp_name
-
-
-def range_scan(decoded_sequence: str) -> List[str]:
- ranges: Set[str] = set()
-
- for character in decoded_sequence:
- character_range: Optional[str] = unicode_range(character)
-
- if character_range is None:
- continue
-
- ranges.add(character_range)
-
- return list(ranges)
-
-
-def cp_similarity(iana_name_a: str, iana_name_b: str) -> float:
- if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b):
- return 0.0
-
- decoder_a = importlib.import_module(
- "encodings.{}".format(iana_name_a)
- ).IncrementalDecoder
- decoder_b = importlib.import_module(
- "encodings.{}".format(iana_name_b)
- ).IncrementalDecoder
-
- id_a: IncrementalDecoder = decoder_a(errors="ignore")
- id_b: IncrementalDecoder = decoder_b(errors="ignore")
-
- character_match_count: int = 0
-
- for i in range(255):
- to_be_decoded: bytes = bytes([i])
- if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded):
- character_match_count += 1
-
- return character_match_count / 254
-
-
-def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool:
- """
- Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using
- the function cp_similarity.
- """
- return (
- iana_name_a in IANA_SUPPORTED_SIMILAR
- and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a]
- )
-
-
-def set_logging_handler(
- name: str = "charset_normalizer",
- level: int = logging.INFO,
- format_string: str = "%(asctime)s | %(levelname)s | %(message)s",
-) -> None:
- logger = logging.getLogger(name)
- logger.setLevel(level)
-
- handler = logging.StreamHandler()
- handler.setFormatter(logging.Formatter(format_string))
- logger.addHandler(handler)
-
-
-def cut_sequence_chunks(
- sequences: bytes,
- encoding_iana: str,
- offsets: range,
- chunk_size: int,
- bom_or_sig_available: bool,
- strip_sig_or_bom: bool,
- sig_payload: bytes,
- is_multi_byte_decoder: bool,
- decoded_payload: Optional[str] = None,
-) -> Generator[str, None, None]:
- if decoded_payload and is_multi_byte_decoder is False:
- for i in offsets:
- chunk = decoded_payload[i : i + chunk_size]
- if not chunk:
- break
- yield chunk
- else:
- for i in offsets:
- chunk_end = i + chunk_size
- if chunk_end > len(sequences) + 8:
- continue
-
- cut_sequence = sequences[i : i + chunk_size]
-
- if bom_or_sig_available and strip_sig_or_bom is False:
- cut_sequence = sig_payload + cut_sequence
-
- chunk = cut_sequence.decode(
- encoding_iana,
- errors="ignore" if is_multi_byte_decoder else "strict",
- )
-
- # multi-byte bad cutting detector and adjustment
- # not the cleanest way to perform that fix but clever enough for now.
- if is_multi_byte_decoder and i > 0:
- chunk_partial_size_chk: int = min(chunk_size, 16)
-
- if (
- decoded_payload
- and chunk[:chunk_partial_size_chk] not in decoded_payload
- ):
- for j in range(i, i - 4, -1):
- cut_sequence = sequences[j:chunk_end]
-
- if bom_or_sig_available and strip_sig_or_bom is False:
- cut_sequence = sig_payload + cut_sequence
-
- chunk = cut_sequence.decode(encoding_iana, errors="ignore")
-
- if chunk[:chunk_partial_size_chk] in decoded_payload:
- break
-
- yield chunk
diff --git a/release_env/lib/python3.12/site-packages/charset_normalizer/version.py b/release_env/lib/python3.12/site-packages/charset_normalizer/version.py
deleted file mode 100644
index 5a4da4ff4..000000000
--- a/release_env/lib/python3.12/site-packages/charset_normalizer/version.py
+++ /dev/null
@@ -1,6 +0,0 @@
-"""
-Expose version
-"""
-
-__version__ = "3.3.2"
-VERSION = __version__.split(".")
diff --git a/release_env/lib/python3.12/site-packages/distutils-precedence.pth b/release_env/lib/python3.12/site-packages/distutils-precedence.pth
deleted file mode 100644
index 7f009fe9b..000000000
--- a/release_env/lib/python3.12/site-packages/distutils-precedence.pth
+++ /dev/null
@@ -1 +0,0 @@
-import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim();
diff --git a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/COPYING.txt b/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/COPYING.txt
deleted file mode 100644
index 333583c7d..000000000
--- a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/COPYING.txt
+++ /dev/null
@@ -1,159 +0,0 @@
-.. include:: docs/header0.txt
-
-==================
- Copying Docutils
-==================
-
-:Author: David Goodger
-:Contact: goodger@python.org
-:Date: $Date: 2023-06-22 17:34:37 +0200 (Do, 22. Jun 2023) $
-:Web site: https://docutils.sourceforge.io/
-:Copyright: This document has been placed in the public domain.
-
-Most of the files included in this project have been placed in the
-public domain, and therefore have no license requirements and no
-restrictions on copying or usage; see the `Public Domain Dedication`_
-below. There are exceptions_, listed below.
-Files in the Sandbox_ are not distributed with Docutils releases and
-may have different license terms.
-
-
-Public Domain Dedication
-========================
-
-The persons who have associated their work with this project (the
-"Dedicator": David Goodger and the many contributors to the Docutils
-project) hereby dedicate the entire copyright, less the exceptions_
-listed below, in the work of authorship known as "Docutils" identified
-below (the "Work") to the public domain.
-
-The primary repository for the Work is the Internet World Wide Web
-site . The Work consists of the
-files within the "docutils" module of the Docutils project Subversion
-repository (http://svn.code.sf.net/p/docutils/code/),
-whose Internet web interface is located at
-. Files dedicated to the
-public domain may be identified by the inclusion, near the beginning
-of each file, of a declaration of the form::
-
- Copyright: This document/module/DTD/stylesheet/file/etc. has been
- placed in the public domain.
-
-Dedicator makes this dedication for the benefit of the public at large
-and to the detriment of Dedicator's heirs and successors. Dedicator
-intends this dedication to be an overt act of relinquishment in
-perpetuity of all present and future rights under copyright law,
-whether vested or contingent, in the Work. Dedicator understands that
-such relinquishment of all rights includes the relinquishment of all
-rights to enforce (by lawsuit or otherwise) those copyrights in the
-Work.
-
-Dedicator recognizes that, once placed in the public domain, the Work
-may be freely reproduced, distributed, transmitted, used, modified,
-built upon, or otherwise exploited by anyone for any purpose,
-commercial or non-commercial, and in any way, including by methods
-that have not yet been invented or conceived.
-
-(This dedication is derived from the text of the `Creative Commons
-Public Domain Dedication`. [#]_)
-
-.. [#] Creative Commons has `retired this legal tool`__ and does not
- recommend that it be applied to works: This tool is based on United
- States law and may not be applicable outside the US. For dedicating new
- works to the public domain, Creative Commons recommend the replacement
- Public Domain Dedication CC0_ (CC zero, "No Rights Reserved"). So does
- the Free Software Foundation in its license-list_.
-
- __ http://creativecommons.org/retiredlicenses
- .. _CC0: http://creativecommons.org/about/cc0
-
-Exceptions
-==========
-
-The exceptions to the `Public Domain Dedication`_ above are:
-
-* docutils/utils/smartquotes.py
-
- Copyright © 2011 Günter Milde,
- based on `SmartyPants`_ © 2003 John Gruber
- (released under a "revised" `BSD 3-Clause License`_ included in the file)
- and smartypants.py © 2004, 2007 Chad Miller.
- Released under the terms of the `BSD 2-Clause License`_
- (`local copy `__).
-
- .. _SmartyPants: http://daringfireball.net/projects/smartypants/
-
-* docutils/utils/math/latex2mathml.py
-
- Copyright © Jens Jørgen Mortensen, Günter Milde.
- Released under the terms of the `BSD 2-Clause License`_
- (`local copy `__).
-
-* | docutils/utils/math/math2html.py,
- | docutils/writers/html5_polyglot/math.css
-
- Copyright © 2009,2010 Alex Fernández; 2021 Günter Milde
-
- These files were part of eLyXer_, released under the `GNU
- General Public License`_ version 3 or later. The author relicensed
- them for Docutils under the terms of the `BSD 2-Clause License`_
- (`local copy `__).
-
- .. _eLyXer: https://github.com/alexfernandez/elyxer
-
-* | docutils/__main__.py,
- | docutils/parsers/commonmark_wrapper.py,
- | docutils/parsers/recommonmark_wrapper.py,
- | docutils/utils/error_reporting.py,
- | docutils/utils/math/__init__.py,
- | docutils/utils/math/latex2mathml.py,
- | docutils/utils/math/tex2mathml_extern.py,
- | docutils/utils/punctuation_chars.py,
- | docutils/utils/smartquotes.py,
- | docutils/writers/html5_polyglot/__init__.py,
- | docutils/writers/html5_polyglot/\*.css,
- | docutils/writers/latex2e/docutils.sty,
- | docutils/writers/xetex/__init__.py,
- | test/test_parsers/test_recommonmark/\*.py,
- | test/test_parsers/test_rst/test_directives/test__init__.py,
- | test/test_parsers/test_rst/test_directives/test_code_parsing.py,
- | test/test_parsers/test_rst/test_line_length_limit_default.py,
- | test/test_parsers/test_rst/test_line_length_limit.py,
- | test/test_writers/test_latex2e_misc.py,
- | test/transforms/test_smartquotes.py,
- | tools/docutils-cli.py,
- | tools/rst2html5.py
-
- Copyright © Günter Milde.
- Released under the terms of the `BSD 2-Clause License`_
- (`local copy `__).
-
-* docutils/utils/roman.py
-
- copyright by Mark Pilgrim, released under the
- `Zope Public License Version 2.1`_ (`local copy`__).
-
- __ licenses/ZPL-2-1.txt
-
-* tools/editors/emacs/rst.el
-
- copyright by Free Software Foundation, Inc.,
- released under the `GNU General Public License`_ version 3 or later
- (`local copy`__).
-
- __ licenses/gpl-3-0.txt
-
-All used licenses are OSI-approved_ and GPL-compatible_.
-
-Plaintext versions of all the linked-to licenses are provided in the
-licenses_ directory.
-
-.. _sandbox: https://docutils.sourceforge.io/sandbox/README.html
-.. _licenses: licenses/
-.. _GNU General Public License: https://www.gnu.org/copyleft/gpl.html
-.. _BSD 2-Clause License: http://opensource.org/licenses/BSD-2-Clause
-.. _BSD 3-Clause License: https://opensource.org/licenses/BSD-3-Clause
-.. _Zope Public License Version 2.1: https://opensource.org/license/zpl-2-1/
-.. _OSI-approved: http://opensource.org/licenses/
-.. _license-list:
-.. _GPL-compatible: https://www.gnu.org/licenses/license-list.html
diff --git a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/INSTALLER b/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/INSTALLER
deleted file mode 100644
index a1b589e38..000000000
--- a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/METADATA b/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/METADATA
deleted file mode 100644
index bec0da08c..000000000
--- a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/METADATA
+++ /dev/null
@@ -1,63 +0,0 @@
-Metadata-Version: 2.1
-Name: docutils
-Version: 0.21.2
-Summary: Docutils -- Python Documentation Utilities
-Author-email: David Goodger
-Maintainer-email: docutils-develop list
-Requires-Python: >=3.9
-Description-Content-Type: text/plain
-Classifier: Development Status :: 4 - Beta
-Classifier: Environment :: Console
-Classifier: Intended Audience :: End Users/Desktop
-Classifier: Intended Audience :: Other Audience
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: System Administrators
-Classifier: License :: Public Domain
-Classifier: License :: OSI Approved :: Python Software Foundation License
-Classifier: License :: OSI Approved :: BSD License
-Classifier: License :: OSI Approved :: GNU General Public License (GPL)
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: 3.11
-Classifier: Topic :: Documentation
-Classifier: Topic :: Software Development :: Documentation
-Classifier: Topic :: Text Processing
-Classifier: Natural Language :: English
-Classifier: Natural Language :: Afrikaans
-Classifier: Natural Language :: Arabic
-Classifier: Natural Language :: Catalan
-Classifier: Natural Language :: Catalan (Valencian)
-Classifier: Natural Language :: Chinese (Simplified)
-Classifier: Natural Language :: Chinese (Traditional)
-Classifier: Natural Language :: Czech
-Classifier: Natural Language :: Danish
-Classifier: Natural Language :: Dutch
-Classifier: Natural Language :: Esperanto
-Classifier: Natural Language :: Finnish
-Classifier: Natural Language :: French
-Classifier: Natural Language :: Galician
-Classifier: Natural Language :: Georgian
-Classifier: Natural Language :: German
-Classifier: Natural Language :: Hebrew
-Classifier: Natural Language :: Italian
-Classifier: Natural Language :: Japanese
-Classifier: Natural Language :: Korean
-Classifier: Natural Language :: Latvian
-Classifier: Natural Language :: Lithuanian
-Classifier: Natural Language :: Persian
-Classifier: Natural Language :: Polish
-Classifier: Natural Language :: Portuguese (Brazilian)
-Classifier: Natural Language :: Russian
-Classifier: Natural Language :: Slovak
-Classifier: Natural Language :: Spanish
-Classifier: Natural Language :: Swedish
-Classifier: Natural Language :: Ukrainian
-Project-URL: Homepage, https://docutils.sourceforge.io
-
-Docutils is a modular system for processing documentation
-into useful formats, such as HTML, XML, and LaTeX. For
-input Docutils supports reStructuredText, an easy-to-read,
-what-you-see-is-what-you-get plaintext markup syntax.
diff --git a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/RECORD b/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/RECORD
deleted file mode 100644
index 3d98cbe41..000000000
--- a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/RECORD
+++ /dev/null
@@ -1,347 +0,0 @@
-../../../bin/docutils,sha256=reHMeW28vZBPhMsq8vRjiMGG_JjOocPCAWuXGpw420Q,286
-../../../bin/rst2html,sha256=qL1J_27zacIDHkPzUiZraBzY4IKpX4wOZ-_4gEGDxvs,290
-../../../bin/rst2html4,sha256=05EN7JEFshTOgNbaP37LacbHNlMCOyHZAGAmujQkWfw,292
-../../../bin/rst2html5,sha256=Ga-dh9RUxb9iULemG84hJRUjiRqmSrpeC0tDaJchRvA,292
-../../../bin/rst2latex,sha256=gGr2h9VdY3pLuV3Y4Z_MY64PRoluA9ncYqiwPcoN0ww,292
-../../../bin/rst2man,sha256=UnlgrnAlxoWDNtIxtvjZVEduXF8Y6uS9Nt8-lEfCf10,288
-../../../bin/rst2odt,sha256=DgMcCgdlg7KV3Wzg7UfsUiWa1-7uWH6_F82sQ7Kndag,288
-../../../bin/rst2pseudoxml,sha256=r-1HnyJK-IENwLa21hOsuI02CK2rrtPTFDqHQ-GxlG0,300
-../../../bin/rst2s5,sha256=Z6fvCMMJiLwwhGCDH-F5Q9hRYkAZ98rbuNcesx9SQK0,286
-../../../bin/rst2xetex,sha256=OqrAag-A0aicYGC7ONBmWTT6kRpofzj_pgOF_7T7fYw,292
-../../../bin/rst2xml,sha256=z_llNetKsT6br52q-mChsEZ0yFEyecAdHz9F92qic0w,288
-docutils-0.21.2.dist-info/COPYING.txt,sha256=U07fdkGr3mn8UA8ijAl1GBLAWJgV7vDAgrxroxfWRqw,6310
-docutils-0.21.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-docutils-0.21.2.dist-info/METADATA,sha256=3oOygKJQ4otFhgmtONEmLPiLjUgZUQ5Fu1ZFHxTP4C8,2776
-docutils-0.21.2.dist-info/RECORD,,
-docutils-0.21.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
-docutils-0.21.2.dist-info/entry_points.txt,sha256=9xC35dFk4tSRrSMOKqq6kYlAZDEERdBM7fmwDLBMifY,379
-docutils/__init__.py,sha256=gmP9fnbribb7oZWoe4PTw8Obh_B_bt3e_CXKi45Xzus,10293
-docutils/__main__.py,sha256=HviLRJb_t90M1fOQ8s8J2A4XZXSvw4cYHkrAtZjR2XA,3625
-docutils/__pycache__/__init__.cpython-312.pyc,,
-docutils/__pycache__/__main__.cpython-312.pyc,,
-docutils/__pycache__/core.cpython-312.pyc,,
-docutils/__pycache__/examples.cpython-312.pyc,,
-docutils/__pycache__/frontend.cpython-312.pyc,,
-docutils/__pycache__/io.cpython-312.pyc,,
-docutils/__pycache__/nodes.cpython-312.pyc,,
-docutils/__pycache__/statemachine.cpython-312.pyc,,
-docutils/core.py,sha256=Lm2qwSppidgDBjoZQpOLiodDKtEbkT_CsLH93Iq4M6U,33045
-docutils/docutils.conf,sha256=F2yH40kC3N5nnjGIRdT7DHHGXbDKbd5YsbhmQxF2CNY,151
-docutils/examples.py,sha256=nP7S8EnZk4w3PYi2Ymeu9_UUcDIi39lP049Pe6iBECU,3961
-docutils/frontend.py,sha256=2oRkks_lIJHhlk537ejUki5dyHodR0SMuoZLXYRcUtI,44396
-docutils/io.py,sha256=VrAIuTlsf93O3wAYMK_PC0DqINMvRxuZZC5W_-6NEOg,22583
-docutils/languages/__init__.py,sha256=I8j0eJD3Jj3Q1C5ALqhYa-f8kCCQDPxmgn2VdPeTusI,2921
-docutils/languages/__pycache__/__init__.cpython-312.pyc,,
-docutils/languages/__pycache__/af.cpython-312.pyc,,
-docutils/languages/__pycache__/ar.cpython-312.pyc,,
-docutils/languages/__pycache__/ca.cpython-312.pyc,,
-docutils/languages/__pycache__/cs.cpython-312.pyc,,
-docutils/languages/__pycache__/da.cpython-312.pyc,,
-docutils/languages/__pycache__/de.cpython-312.pyc,,
-docutils/languages/__pycache__/en.cpython-312.pyc,,
-docutils/languages/__pycache__/eo.cpython-312.pyc,,
-docutils/languages/__pycache__/es.cpython-312.pyc,,
-docutils/languages/__pycache__/fa.cpython-312.pyc,,
-docutils/languages/__pycache__/fi.cpython-312.pyc,,
-docutils/languages/__pycache__/fr.cpython-312.pyc,,
-docutils/languages/__pycache__/gl.cpython-312.pyc,,
-docutils/languages/__pycache__/he.cpython-312.pyc,,
-docutils/languages/__pycache__/it.cpython-312.pyc,,
-docutils/languages/__pycache__/ja.cpython-312.pyc,,
-docutils/languages/__pycache__/ka.cpython-312.pyc,,
-docutils/languages/__pycache__/ko.cpython-312.pyc,,
-docutils/languages/__pycache__/lt.cpython-312.pyc,,
-docutils/languages/__pycache__/lv.cpython-312.pyc,,
-docutils/languages/__pycache__/nl.cpython-312.pyc,,
-docutils/languages/__pycache__/pl.cpython-312.pyc,,
-docutils/languages/__pycache__/pt_br.cpython-312.pyc,,
-docutils/languages/__pycache__/ru.cpython-312.pyc,,
-docutils/languages/__pycache__/sk.cpython-312.pyc,,
-docutils/languages/__pycache__/sv.cpython-312.pyc,,
-docutils/languages/__pycache__/uk.cpython-312.pyc,,
-docutils/languages/__pycache__/zh_cn.cpython-312.pyc,,
-docutils/languages/__pycache__/zh_tw.cpython-312.pyc,,
-docutils/languages/af.py,sha256=bjIWD_cNZAyZ9XIqqEoQaSljWlvP0vrQi8p8Fu9Nj2o,1831
-docutils/languages/ar.py,sha256=3FRbb0CSpXPHSQru96bqPDGGEdcnWhQIUG_ndpmacfg,1943
-docutils/languages/ca.py,sha256=b98Y79DEl88Jt2IZsKaH1OaJlC9W5khQcOV71Tvwpj0,2085
-docutils/languages/cs.py,sha256=qkEwPMKaPgw3D4qKCJoGXfDczIA3Wju8joBobn5hMvg,1832
-docutils/languages/da.py,sha256=1db0GiWS2YYOIqWru9BGeun7E3c-lwAgCWA6epn6KH4,1856
-docutils/languages/de.py,sha256=oaGzlhKsE4yFKTnCKrZt8nMnwZGqQ-PDT92UgUwRYzs,1728
-docutils/languages/en.py,sha256=MOTXOluYEnUwSHRlkINnBXMI8sbIfGahXF8RLws4NSk,1854
-docutils/languages/eo.py,sha256=p-wQOrAdL9tQ-89OT8A1VS8sO0OjogmPXRBAoihaAc0,1895
-docutils/languages/es.py,sha256=Jf81tKn_FJ7Kieozten6hn8WjVnYpZ9vsu4N6ER4O1s,1854
-docutils/languages/fa.py,sha256=dXhN7qZnzv1ksnR0Yb5LrSgNLwXy387ILj90v5iHHHM,1958
-docutils/languages/fi.py,sha256=34cPWxDFZXBnOw5LWENSIKaFqFLxZOc6vIioLLnS2do,1892
-docutils/languages/fr.py,sha256=zIPQD7UdOx3FPIBgIAT_mWNk4dped04jK8No2kI1Zic,1799
-docutils/languages/gl.py,sha256=Hz30Wfc-CMuGxKoHzPtY2Wdn-A6tFyvirnnFGZdZ_04,1958
-docutils/languages/he.py,sha256=eHyDSLwp6Y55GyHlgr8yMOkR-gxSgk7Ge8gfsm5n_Io,1878
-docutils/languages/it.py,sha256=aqmXdit3DYMhnke5MmyQIAVfCcrFuKzWmv0L5H06AI8,1814
-docutils/languages/ja.py,sha256=8C-hjqB7fa_Asa-uKKKkHRqT6NTjO3IJiiks6JADJNU,1890
-docutils/languages/ka.py,sha256=aqqIgkJyhLg3FOYWuhBhYDgzAj_nos9WwEQqI-eUcwg,2429
-docutils/languages/ko.py,sha256=eqKib7kW6h8DKg6inoXAtJa3f8FygdT37eGqiMifzZU,1832
-docutils/languages/lt.py,sha256=ixPG61Q2xB6J0uk0TXTXDwfKcEQgqIYC9Tc4VrBMQEY,1919
-docutils/languages/lv.py,sha256=pSZ7y94j6YWKLz4U16uBVwZsgKpd4jWkvcAgwmkDjv0,1851
-docutils/languages/nl.py,sha256=LKV2Hkuh0kH17w_ukZoAtTIlvWSo5iC3g7nPFDHoDDY,1871
-docutils/languages/pl.py,sha256=zyW9iwwriTX8YIGbT54DKgvkdyfiPxm49R0e2eIBxKE,1830
-docutils/languages/pt_br.py,sha256=navcDOoMajIE3yqibn7NPEIf-_oF15ECBWk4beMY3Zw,1865
-docutils/languages/ru.py,sha256=BAQA-1TZEeHpK44L_Os9V-WKUBt9lPApRl1nFM1zOhw,2070
-docutils/languages/sk.py,sha256=r-vrXCNGbDqFXAxM9WpRaH-ws1KumaIb1yramTTlmlI,1788
-docutils/languages/sv.py,sha256=bmJkUSdVn_j8s_P_Nu4KGBM2F42Og7sFzMNH238eKtQ,1908
-docutils/languages/uk.py,sha256=abLYoA0w2pJWlGLBglvUvEnGrhAVgbRyDEmlwV5ntxQ,2062
-docutils/languages/zh_cn.py,sha256=7nOmSfLgrb3Zq-xImQEN4-My6NqHZVat7GoMbpijVn4,1852
-docutils/languages/zh_tw.py,sha256=KJS8-gHwJVUdW7NOjgJQPb6iWkXtBWTT0JrRBV7BYTU,2112
-docutils/nodes.py,sha256=psy0zIro734Gsk7PGIqWqx0Ax_5AB0mBHC0J4KYduHo,80628
-docutils/parsers/__init__.py,sha256=NenSsWynQ-HU858BTDg0dMIX7ErS_qrAJot8KdtHyiU,3724
-docutils/parsers/__pycache__/__init__.cpython-312.pyc,,
-docutils/parsers/__pycache__/commonmark_wrapper.cpython-312.pyc,,
-docutils/parsers/__pycache__/null.cpython-312.pyc,,
-docutils/parsers/__pycache__/recommonmark_wrapper.cpython-312.pyc,,
-docutils/parsers/commonmark_wrapper.py,sha256=UcBtp5AcOSQRq-0-UsSZcnFMWa14TULD8kayhp4A0eY,1762
-docutils/parsers/null.py,sha256=LtO7n-E6lNOs4mLXZ2SiShB3C630SoJ80ugd9fh1vXI,445
-docutils/parsers/recommonmark_wrapper.py,sha256=SbFSCvBeQRH-fDQczHgK2qF_HwZ3gQsJx_CY2txX43s,5426
-docutils/parsers/rst/__init__.py,sha256=EydGQTcJeAmJQbCwPEFk77kA7Nio-Vqs7R0NMNkcb_s,15954
-docutils/parsers/rst/__pycache__/__init__.cpython-312.pyc,,
-docutils/parsers/rst/__pycache__/roles.cpython-312.pyc,,
-docutils/parsers/rst/__pycache__/states.cpython-312.pyc,,
-docutils/parsers/rst/__pycache__/tableparser.cpython-312.pyc,,
-docutils/parsers/rst/directives/__init__.py,sha256=82wwJQW7spmBVtko7E-a62LUXYfATJg3hSl6CZNrUus,14812
-docutils/parsers/rst/directives/__pycache__/__init__.cpython-312.pyc,,
-docutils/parsers/rst/directives/__pycache__/admonitions.cpython-312.pyc,,
-docutils/parsers/rst/directives/__pycache__/body.cpython-312.pyc,,
-docutils/parsers/rst/directives/__pycache__/html.cpython-312.pyc,,
-docutils/parsers/rst/directives/__pycache__/images.cpython-312.pyc,,
-docutils/parsers/rst/directives/__pycache__/misc.cpython-312.pyc,,
-docutils/parsers/rst/directives/__pycache__/parts.cpython-312.pyc,,
-docutils/parsers/rst/directives/__pycache__/references.cpython-312.pyc,,
-docutils/parsers/rst/directives/__pycache__/tables.cpython-312.pyc,,
-docutils/parsers/rst/directives/admonitions.py,sha256=44OwQdPrDKD5VnCd-pPFtEzJs3U1uF-MeS3iWMmCWwU,2526
-docutils/parsers/rst/directives/body.py,sha256=lRClR4ljNiXntJfojN0HcaNpqH1m2GpwsOMS3JVNJK8,9939
-docutils/parsers/rst/directives/html.py,sha256=adxIFdnOHpqH0QSeXT7utBSy7FKWV0x18zbnXtmmuhs,695
-docutils/parsers/rst/directives/images.py,sha256=amQeXFb31hHlyjf15vgF2Sfe3OGCGzLaZAHxfsWSmOw,7265
-docutils/parsers/rst/directives/misc.py,sha256=9mc7erT0KvKHWR4_i5Uz2FhBk2pLd36fMCabyF2ClLA,26700
-docutils/parsers/rst/directives/parts.py,sha256=m5YOwZoPawR6I-Y3Q7CN9wGUzWmXa9v-Hvglh2E5ffQ,4247
-docutils/parsers/rst/directives/references.py,sha256=1Y1yhe_O2PqLtQUSly-ny291nrQKJgQiO4Hu7Xew9Zo,831
-docutils/parsers/rst/directives/tables.py,sha256=PRwO-lA1I93JAXR7qGDQ6n2cT5UYA8JQHdymHOdLFdg,23470
-docutils/parsers/rst/include/README.txt,sha256=R3Y-9wDzYQ0jOhj9FAlwG6hRRhHcEWOZcn2hMF1DeVg,670
-docutils/parsers/rst/include/isoamsa.txt,sha256=ZqGuK-R-yIxa2YDSREt48DFxc8fpF-HX51eiCKXCPp4,10925
-docutils/parsers/rst/include/isoamsb.txt,sha256=3CK8um9WjhPMVgEAbeI16rk91IzWqWXFbRJC44InP3A,7242
-docutils/parsers/rst/include/isoamsc.txt,sha256=XCI2ubAKaO-eOQj87hbBMeYpkqHvc2b2daUCS9ekUzU,1723
-docutils/parsers/rst/include/isoamsn.txt,sha256=Wx54SjZGeYVEB3oNnRi7eGYHEjROZiBUFhQAQDxcVMQ,6721
-docutils/parsers/rst/include/isoamso.txt,sha256=RFxHs5s8DtMgvDaeArmwnSZP_QN20KssvW5f6KMohYA,3825
-docutils/parsers/rst/include/isoamsr.txt,sha256=TLH3gNugqSX3-tH6gDNcgIgbGiKe_GukwZ8U1MIeJCQ,11763
-docutils/parsers/rst/include/isobox.txt,sha256=NORZqqDIewr0-CPoVWqVfTbCVrGZOqY87Crn8O4OUoo,3101
-docutils/parsers/rst/include/isocyr1.txt,sha256=B2DWWIEZ8aJ-scOBP9pbrsKYEmnNF8VZ9e9Mut2MZzU,4241
-docutils/parsers/rst/include/isocyr2.txt,sha256=t52cY0R-9bnkWiQPXW1NYDzO4ueE6ogUF9Ho4ARHg7Q,1882
-docutils/parsers/rst/include/isodia.txt,sha256=VMg8jI2IQogISrpiTS3L88TntxiMfS0cElsrpxZ1FAI,869
-docutils/parsers/rst/include/isogrk1.txt,sha256=DkJc-K_nTh-WDhfOQIRMdQ4aUnsYKb_etyEEJfU8SG4,3010
-docutils/parsers/rst/include/isogrk2.txt,sha256=0x8w_DgroVISgsTLUOuyLZNzDLThcnti27T7T7DxL7g,1705
-docutils/parsers/rst/include/isogrk3.txt,sha256=8b7gQSKtw4yhLEVMZ6vH8VaToiZMM2_kD2snlqfeIQE,2880
-docutils/parsers/rst/include/isogrk4-wide.txt,sha256=RAdw43c5ZAUBWu8MO_lJDmXVV0cGHhVrky0H_bq1eEs,3035
-docutils/parsers/rst/include/isogrk4.txt,sha256=FQxEZAJu2d_RX3G3PfHm6JlC_1osHQoheFA886MLeQk,372
-docutils/parsers/rst/include/isolat1.txt,sha256=d4dBGSPosghudIhZfMPNzsBJKvH1nyVyi6m5p0oW_HY,4397
-docutils/parsers/rst/include/isolat2.txt,sha256=2RMWwHB9djHvsdnKSv2dSNHlBc50P0JYF1DRcK3HW8s,8466
-docutils/parsers/rst/include/isomfrk-wide.txt,sha256=RsYrcq3mX-CMuV6oijCIfUTnUe8Z6w0PG0ephU9isBM,3334
-docutils/parsers/rst/include/isomfrk.txt,sha256=Y40ZXO1GLLzHezKEJJ8w8OBFtHGwtdjErI_062abwC4,519
-docutils/parsers/rst/include/isomopf-wide.txt,sha256=nrhNkzw15HdEA-Gf8T7yatCbs5b7z7q7T6SCTNLByJw,1931
-docutils/parsers/rst/include/isomopf.txt,sha256=l9rTXrdZWf2RchhPr4Oi2M-4yZYLtVH-7kdOmCPzY_M,639
-docutils/parsers/rst/include/isomscr-wide.txt,sha256=VNfKzET1n08k2PUeK9UeDamgP0j8iKpaorregQbaP3w,3231
-docutils/parsers/rst/include/isomscr.txt,sha256=EBWiVvLZYhm9e2c5i7T4Ur6i1WODl_BLiHjcWA_C45g,776
-docutils/parsers/rst/include/isonum.txt,sha256=yg4P9UxBM-72JRGkB4KVdjmRPyBWLvkOlkelh8quDzc,4066
-docutils/parsers/rst/include/isopub.txt,sha256=BFkr5rRRFuYM7a19WPP7lfBpUKftkYKZjnM2SHLtzwY,4613
-docutils/parsers/rst/include/isotech.txt,sha256=2WGt7TSBeRMr2m2DBlY-xiVjxeiNXdTZJb1DJdtgYKg,9726
-docutils/parsers/rst/include/mmlalias.txt,sha256=jQ4IbZwZAJ9rXmb7De77DYgdIlMsWA-s8uZf42EYtFU,45428
-docutils/parsers/rst/include/mmlextra-wide.txt,sha256=Myj4APWltVYohIK7f1v8urJuDVT2_I_U7rasnBCTsYY,9010
-docutils/parsers/rst/include/mmlextra.txt,sha256=DfWtgBA6Bn4TzlZokxTu5vp7zIf1hqUeaeGpYbfHSAg,6800
-docutils/parsers/rst/include/s5defs.txt,sha256=_5JOMpDtaufiZbdxh6QKpICqLvGpB9cypHM-SEt3sKA,1036
-docutils/parsers/rst/include/xhtml1-lat1.txt,sha256=ht_IZrejaCfgG95sfLNfCu1WAzU4LwpkWgzRbZ_6OA4,6112
-docutils/parsers/rst/include/xhtml1-special.txt,sha256=u4YARKjTrICRTtqlMDDOmpYR8xe-DKDRiNjzmXQs7gc,1945
-docutils/parsers/rst/include/xhtml1-symbol.txt,sha256=e6GP5rkmSNcXusRBJkKf2LSbSEyd1oFXJG_WBCYBKE8,7028
-docutils/parsers/rst/languages/__init__.py,sha256=bAE-YQUQ95QwYJVPnWcjz5bw6LOfW5Pgbhwmwp01-OY,1222
-docutils/parsers/rst/languages/__pycache__/__init__.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/af.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/ar.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/ca.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/cs.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/da.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/de.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/en.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/eo.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/es.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/fa.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/fi.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/fr.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/gl.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/he.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/it.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/ja.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/ka.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/ko.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/lt.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/lv.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/nl.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/pl.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/pt_br.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/ru.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/sk.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/sv.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/uk.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/zh_cn.cpython-312.pyc,,
-docutils/parsers/rst/languages/__pycache__/zh_tw.cpython-312.pyc,,
-docutils/parsers/rst/languages/af.py,sha256=MYGuM5yX_bx83imYLMJreUelpx3c1fcMmLhEu5tyQQI,3760
-docutils/parsers/rst/languages/ar.py,sha256=XpIY3SM10ccvFrO_j__REi_ITvLxSmGuf_y0Dc-Z_-g,3051
-docutils/parsers/rst/languages/ca.py,sha256=atmy4uqx3eVNvnKJwD0HuY0JSRG7uJfo7-AXrRgWg9g,4318
-docutils/parsers/rst/languages/cs.py,sha256=UXKr7zpl6UY31mBtCaNF-FBSsGVvWC59dx7KkwnIbTk,4760
-docutils/parsers/rst/languages/da.py,sha256=tQfxUwhlJohtnfKscjY0PUnwDYF2M-6Tu08EcXy7c6Q,3752
-docutils/parsers/rst/languages/de.py,sha256=nTIYDpKgOf28OJkcJbnuRvTOeLG6nDkfXDwW-MJV3Ls,3564
-docutils/parsers/rst/languages/en.py,sha256=9dmxPb_sYYsY4vEg8B_IBGQhEytcRvXtp5iOrzwmaHI,3516
-docutils/parsers/rst/languages/eo.py,sha256=ozUCNH5zKhnmYXxd5nZRu3TmF_aVeCAVzSLleRJWDf8,3751
-docutils/parsers/rst/languages/es.py,sha256=gFFm2EwAtAZOJUQLk03QUQdV0E7DKnct0amy6gpaNs4,4034
-docutils/parsers/rst/languages/fa.py,sha256=fap5ifAVKvqHGo3S2_G4mMrA8fvOiQ3BPi4z8Zlf94M,3171
-docutils/parsers/rst/languages/fi.py,sha256=xsxxUTOqVj1P1XkCQsPPkI-p1-ELE0QwMA9Oy-QPDHg,3536
-docutils/parsers/rst/languages/fr.py,sha256=V9_k_lbLkBSWuAbNeW2l4_Bv4EzaK4Dbwih0fJYIi0U,3816
-docutils/parsers/rst/languages/gl.py,sha256=v-zXIwcRYxgu8mZJmlexv73pMtwWlSB4yGVcYeENQP4,3389
-docutils/parsers/rst/languages/he.py,sha256=_UHQHJQx7EAGvMlURHJ8kDk_tcG1uv-7eTl7a4XEGgU,3293
-docutils/parsers/rst/languages/it.py,sha256=ZR4TsyM3611ASRQelyA7rx0zjUgMVM6gzrym6Bqrj40,3353
-docutils/parsers/rst/languages/ja.py,sha256=_PlI9H5u300_VlYvW52UvSy_MJ5OLlMmoNo1Pc6Pib8,3776
-docutils/parsers/rst/languages/ka.py,sha256=Xxv37fZnLqIbo1vmT1--Kj7etRxlKPgHcgfgiBvn9Xk,4141
-docutils/parsers/rst/languages/ko.py,sha256=IpSyXjTkoij0C7859i1p0iSgz9BQYpdF3fNTS6qcQ1A,3377
-docutils/parsers/rst/languages/lt.py,sha256=PHzrQAP-ZAcboCyc1jvHI5l0CMQnrbBEZ285MWJVy9w,3519
-docutils/parsers/rst/languages/lv.py,sha256=pfTCSDtQkOWYVTnTFjWhUZpnJJW7yuNzVW9xvBgP_u4,3376
-docutils/parsers/rst/languages/nl.py,sha256=dQ2Hex8oQS8f075B6nWZjeSQ0Rzjnl87oS8LauqBe1Y,3794
-docutils/parsers/rst/languages/pl.py,sha256=TRNum6wVR2XQY_Y_uhKqXNHdTBeaYgXwWaqokBaO-N0,3240
-docutils/parsers/rst/languages/pt_br.py,sha256=-cFMXIp8_6cryE7Q7smlElf4QegPqjmDRya8VxM1CQQ,3870
-docutils/parsers/rst/languages/ru.py,sha256=t5K4rlNKIcoOchVeC68sjJ8mr0Cox_BeyCvb1MDm9tQ,3398
-docutils/parsers/rst/languages/sk.py,sha256=HSdFwU6j9rZShkXyGPBc749TrUUB7tBSz-aw0f4UAzs,3943
-docutils/parsers/rst/languages/sv.py,sha256=HxyE3k93qgJw-aD6Ea3Tmfqz3QX1Q7AJIaU65MrkJxc,3261
-docutils/parsers/rst/languages/uk.py,sha256=LBUHWeKwFdEjfif4CG7LtMhBidl4ln6u4oStJ2omVsQ,3441
-docutils/parsers/rst/languages/zh_cn.py,sha256=YEC3UmY43NaI7s_6DatL_VQugiHvSUbBrHubgnMfYbI,3925
-docutils/parsers/rst/languages/zh_tw.py,sha256=icmm58W9wO69L6p5dwTQwjj45uxer2ZrJCqvBbERnkQ,5160
-docutils/parsers/rst/roles.py,sha256=GLJVffa-S_Fn3u6RTxdXJm1MXd1AQ7IxbCq99MmxIzQ,16119
-docutils/parsers/rst/states.py,sha256=ziKtByqhX2TAjRg4cOgGyQ6729W6gmVuaUUMKwKtf1k,133123
-docutils/parsers/rst/tableparser.py,sha256=D2jtx00mTdHsn20TKk9GJmCilwISeKHe9VoSy8PYELs,20912
-docutils/readers/__init__.py,sha256=rgBQZvedeYA8UZb2pYKoKqYWAjvUi8ZrzG1kANjnwC4,3520
-docutils/readers/__pycache__/__init__.cpython-312.pyc,,
-docutils/readers/__pycache__/doctree.cpython-312.pyc,,
-docutils/readers/__pycache__/pep.cpython-312.pyc,,
-docutils/readers/__pycache__/standalone.cpython-312.pyc,,
-docutils/readers/doctree.py,sha256=9QNTk_8x46sDkcSjzQiyFZxN-m9CBO3XA5bLar7OA0Q,1607
-docutils/readers/pep.py,sha256=m5RnOjKfMnmwHXU8vsr0HfZlqcqH2Yn4MXspjLO0GYE,1523
-docutils/readers/standalone.py,sha256=qwVRPiBto5CvE3m-2sZ2a2btlVl8aSbT4J_z7uIr3yM,2334
-docutils/statemachine.py,sha256=fKzVodfw6BEZQf4HquXfpBfNR8N5E8uzVeDoJA5eFRw,56956
-docutils/transforms/__init__.py,sha256=LTftDJ01XJReLdKMyuJrB_ImFr0fHOaZGqzE1VnXg9c,6968
-docutils/transforms/__pycache__/__init__.cpython-312.pyc,,
-docutils/transforms/__pycache__/components.cpython-312.pyc,,
-docutils/transforms/__pycache__/frontmatter.cpython-312.pyc,,
-docutils/transforms/__pycache__/misc.cpython-312.pyc,,
-docutils/transforms/__pycache__/parts.cpython-312.pyc,,
-docutils/transforms/__pycache__/peps.cpython-312.pyc,,
-docutils/transforms/__pycache__/references.cpython-312.pyc,,
-docutils/transforms/__pycache__/universal.cpython-312.pyc,,
-docutils/transforms/__pycache__/writer_aux.cpython-312.pyc,,
-docutils/transforms/components.py,sha256=4qO1txFE98PJa4tqKCpnlnQi_UIEQDU4mMVuzwgqizY,2151
-docutils/transforms/frontmatter.py,sha256=zgWHDRBnv1Flv1Ddq5xEK6KmmGSgRyBwOzOHT8TfOAk,20809
-docutils/transforms/misc.py,sha256=BhyjLyE8j5QRELg7CcT0hEwdvnUJugUqQYyckzXDlh0,4873
-docutils/transforms/parts.py,sha256=Z_72Wf2oqchCcTIPTOgBVS1auAtA7POwJww1EaoeQPk,6912
-docutils/transforms/peps.py,sha256=7TMhgwqyopkuUetITpsByN-t0ZT8bXJOqaClUwliF0U,11111
-docutils/transforms/references.py,sha256=fhgJ6KDifnAFtPZHw6srdH76A5cepjfejzSKNF_2McA,36821
-docutils/transforms/universal.py,sha256=mhJkmCIhYQFqBAzitGyskSjGTYCwAyvSQzld6p5aLEE,12381
-docutils/transforms/writer_aux.py,sha256=G_XXqiAcSqWnFJKWRhQ8oE0jWcZPjLjyW2QBThE1Xes,3057
-docutils/utils/__init__.py,sha256=8G-da95eq3Ka72X1U0vAgNR4UZJYzS2t4o_MpfnN5c0,30381
-docutils/utils/__pycache__/__init__.cpython-312.pyc,,
-docutils/utils/__pycache__/code_analyzer.cpython-312.pyc,,
-docutils/utils/__pycache__/error_reporting.cpython-312.pyc,,
-docutils/utils/__pycache__/punctuation_chars.cpython-312.pyc,,
-docutils/utils/__pycache__/roman.cpython-312.pyc,,
-docutils/utils/__pycache__/smartquotes.cpython-312.pyc,,
-docutils/utils/__pycache__/urischemes.cpython-312.pyc,,
-docutils/utils/code_analyzer.py,sha256=O6eUnWPYyZFXtTtk-NuNVv4k7L9sb5BJGIjacSZT4Tw,4920
-docutils/utils/error_reporting.py,sha256=vjHvpHu0BSoE2Ltm4FyYfLUsV5VWAjBbRoniWrJ7CR8,8105
-docutils/utils/math/__init__.py,sha256=DgTt07qT_uN2-9Tz8HNKkRqw5P3KIj81VurrJ2J_Omw,2553
-docutils/utils/math/__pycache__/__init__.cpython-312.pyc,,
-docutils/utils/math/__pycache__/latex2mathml.cpython-312.pyc,,
-docutils/utils/math/__pycache__/math2html.cpython-312.pyc,,
-docutils/utils/math/__pycache__/mathalphabet2unichar.cpython-312.pyc,,
-docutils/utils/math/__pycache__/mathml_elements.cpython-312.pyc,,
-docutils/utils/math/__pycache__/tex2mathml_extern.cpython-312.pyc,,
-docutils/utils/math/__pycache__/tex2unichar.cpython-312.pyc,,
-docutils/utils/math/__pycache__/unichar2tex.cpython-312.pyc,,
-docutils/utils/math/latex2mathml.py,sha256=ELwAGaYg4kx2E7_AE_rSSSZFID4QMIV8sPAIQ2PsdVE,46961
-docutils/utils/math/math2html.py,sha256=VfZ1ceFmNKu4yvF72j4xsgH_cjtOkeCevPC3UYw4enQ,107808
-docutils/utils/math/mathalphabet2unichar.py,sha256=bsgWbE09bIyXfME-TyCms-0fesWVoxXMErQVVeYOoSo,56217
-docutils/utils/math/mathml_elements.py,sha256=zMoCC2KnjAxmSGu4ZUtCZAEuyWme80pCPTn66E44gcY,14564
-docutils/utils/math/tex2mathml_extern.py,sha256=lo4n8GFXWcpe-yw8TPPahzHfhXU9_jv2oo-Sm_TasE4,9436
-docutils/utils/math/tex2unichar.py,sha256=_A2K7ap6o6cb1LY9qCYtsfP-zk5eeu_Hu6LIl6j7LnA,37497
-docutils/utils/math/unichar2tex.py,sha256=Q1gvqUGWprAjMfpGfujAu4ldjJevoFG2moM46SWy6WU,18393
-docutils/utils/punctuation_chars.py,sha256=OMY7gEwy_TIo1MnjZ9cnT3wA9LmSApldJ3lSJZbEtuE,5747
-docutils/utils/roman.py,sha256=JCF_zBcbauEuVvDPuNTR1ZBxFgyNEUr6jZ2JwZwnQ9A,4280
-docutils/utils/smartquotes.py,sha256=KW27gHCkAhgDCdKisPbAu85yJjc0j2FcssSwzvPlCCI,39136
-docutils/utils/urischemes.py,sha256=5dcLKn-Xo5ldDCcdTtO7l8UM_Y3KZrcjyR3A8RWp91U,6260
-docutils/writers/__init__.py,sha256=sJuZewwKkiJHl0VkAtx-geKluXhd_34H9o3sg4Yp4AU,4945
-docutils/writers/__pycache__/__init__.cpython-312.pyc,,
-docutils/writers/__pycache__/_html_base.cpython-312.pyc,,
-docutils/writers/__pycache__/docutils_xml.cpython-312.pyc,,
-docutils/writers/__pycache__/manpage.cpython-312.pyc,,
-docutils/writers/__pycache__/null.cpython-312.pyc,,
-docutils/writers/__pycache__/pseudoxml.cpython-312.pyc,,
-docutils/writers/_html_base.py,sha256=pQqROc1bBMw_ozqT7T8jNtkHh7F7EWcxZUAbLDIvMrY,75401
-docutils/writers/docutils_xml.py,sha256=wi786IvTZqbojdiIxx-vZWS76BE0cUYJQ5RSqfJnkXc,6851
-docutils/writers/html4css1/__init__.py,sha256=KkCwD339fBkAsvUpO448_i2YcSyZ04bloCTr932wTJ8,38125
-docutils/writers/html4css1/__pycache__/__init__.cpython-312.pyc,,
-docutils/writers/html4css1/html4css1.css,sha256=-Uk0s5gu8-k8f4f34R-bSIpcSzqkVGa5JN6FGSh7QbY,7300
-docutils/writers/html4css1/template.txt,sha256=HDzUUyAv7gT4ewGQTqfOE2_9HOVyGu9-wCRgsmoCmjQ,114
-docutils/writers/html5_polyglot/__init__.py,sha256=9wqpd5R89Ewug52mD3g_9tGhyIr5dSEv0vLC0oA8ZOw,15635
-docutils/writers/html5_polyglot/__pycache__/__init__.cpython-312.pyc,,
-docutils/writers/html5_polyglot/italic-field-names.css,sha256=R9vxBFOn5NiQXWOLpghskCrn0RzMQEXy6w4EDDSNPXs,1145
-docutils/writers/html5_polyglot/math.css,sha256=eKRtxtJvYDzuQybRk6Ln_k9tr6TCoFhNqek40C9ErdM,6219
-docutils/writers/html5_polyglot/minimal.css,sha256=w78WllgDmLFNc-PwZRiD5_fhYB0zxAq7mGSh3c94TNM,8213
-docutils/writers/html5_polyglot/plain.css,sha256=-UeuH9qUxiAlETSiNjEm4Q1vAtpxD0QWwtN81pVo31Y,7552
-docutils/writers/html5_polyglot/responsive.css,sha256=PYhXgdnYR9hfGobvUMxi8OSPGr-KQUd2ucubuBRm5qg,11739
-docutils/writers/html5_polyglot/template.txt,sha256=HDzUUyAv7gT4ewGQTqfOE2_9HOVyGu9-wCRgsmoCmjQ,114
-docutils/writers/html5_polyglot/tuftig.css,sha256=ACotB-KbCWzGsanW1GncNwgMxa21vapRaAtv-NKdh8M,12023
-docutils/writers/latex2e/__init__.py,sha256=xs566hs7lq1MEteKh3PhCVj7jGdW3ivB_WNlrQ5pHVY,138165
-docutils/writers/latex2e/__pycache__/__init__.cpython-312.pyc,,
-docutils/writers/latex2e/default.tex,sha256=JcaJnrdmKE9vqwATl9dSHOsnGnjF2dLX4vsiu7kvWEI,422
-docutils/writers/latex2e/docutils.sty,sha256=dgnu97-E5w_rOrdaKBYAw_PwnMKASOFLXV08k17DABQ,5472
-docutils/writers/latex2e/titlepage.tex,sha256=ampRiXY22vtJ22UPMv61mmPubJPItdrSkl9MSAOftpQ,480
-docutils/writers/latex2e/titlingpage.tex,sha256=Pa9ixIf9Yy6RLljbTPUEgmrQwRzYsyzrxl4KSrHA37E,424
-docutils/writers/latex2e/xelatex.tex,sha256=NbrtTphygnEaTmyJEz5HwkNuWCbV1ijlh_1M7_TXLu0,672
-docutils/writers/manpage.py,sha256=REpVzDREXjLJ8ChcBpzbk3Wv8MJ45QWJuPRLB7s5nt8,38128
-docutils/writers/null.py,sha256=Ue7kizk6_1GGrCmYiltg9MrYNetMyHM-yvQvNRrclN8,568
-docutils/writers/odf_odt/__init__.py,sha256=uW_W6F_zMdbcqEmo4swfou2elk4XG-ShZusngP1acS4,132081
-docutils/writers/odf_odt/__pycache__/__init__.cpython-312.pyc,,
-docutils/writers/odf_odt/__pycache__/prepstyles.cpython-312.pyc,,
-docutils/writers/odf_odt/__pycache__/pygmentsformatter.cpython-312.pyc,,
-docutils/writers/odf_odt/prepstyles.py,sha256=XwC29yEYGKpNATr5yuGJH_WYkPBBUAkVr8fLaMEo6Yo,2142
-docutils/writers/odf_odt/pygmentsformatter.py,sha256=j1fMQPdv5fdczPkSKbyYjoh66G8Z_MZhTN52_XfRhHc,4681
-docutils/writers/odf_odt/styles.odt,sha256=xKv9z2sd1qNxAH28X-5st5JuDZeTw6jyDOxXohsFrKY,16500
-docutils/writers/pep_html/__init__.py,sha256=mrApLw1JROL32XM-eXrDjYnQq_DTS3_KqTNOEoiD55k,3503
-docutils/writers/pep_html/__pycache__/__init__.cpython-312.pyc,,
-docutils/writers/pep_html/pep.css,sha256=AyHZfudmKKTu-ZmyoLaihM_e5bD3_gCO51hG_NPEDA8,6367
-docutils/writers/pep_html/template.txt,sha256=SPc44ICSNgps08fDtVaRlu6glPPwcCcx9mqybx5u6W4,1001
-docutils/writers/pseudoxml.py,sha256=gjnBxBIXYNdnQYt_XTXljV3fcp9dW1Ek0LE5VkGIvJk,1032
-docutils/writers/s5_html/__init__.py,sha256=UahNZB0U6WSRb3jR6x1MXy4A4ud2bd8lduqG9Nn5Vao,14712
-docutils/writers/s5_html/__pycache__/__init__.cpython-312.pyc,,
-docutils/writers/s5_html/themes/README.txt,sha256=wYnu3iomgGD6odpZOtWTzOynI1dfIGE6AVF1MDR0FVY,278
-docutils/writers/s5_html/themes/big-black/__base__,sha256=WeKnChXCPkrXDs7Xr-Qnf1i-bgFjkeaKJ-ilXV0R5lM,38
-docutils/writers/s5_html/themes/big-black/framing.css,sha256=DtEo7Fti9JARMLmcCx0NIfir7QRR24_WN3UbG-EyH64,910
-docutils/writers/s5_html/themes/big-black/pretty.css,sha256=UP9r7eGX0qEFCIDyKcT5bcazMxCw43O2KSrs2ebBPwI,3605
-docutils/writers/s5_html/themes/big-white/framing.css,sha256=meBByeaKIduudfFCDxVw4uzSOj8q_ZJArnwp8oZ1S8g,905
-docutils/writers/s5_html/themes/big-white/pretty.css,sha256=RlQ7CZuN-WMrR8CmCeQ-U8WVmZj769z2zx2FfLwTS48,3565
-docutils/writers/s5_html/themes/default/framing.css,sha256=Sbh5wryeioxDMZ-kJFwzKNziO-3CRvLBMG7rcJjTLmU,1002
-docutils/writers/s5_html/themes/default/opera.css,sha256=guPZOg_BINv-LjV9_IAM7ILFQ-fKALNjlP1i06e5dmA,261
-docutils/writers/s5_html/themes/default/outline.css,sha256=z3ACJiW3_gnG8XFvX602PMTYvKhbRybqCeoWl3O_pA0,648
-docutils/writers/s5_html/themes/default/pretty.css,sha256=iT_51bIPLTk1hFFs3hCarnyJqtbB4I86BNrxlT1r3eo,4383
-docutils/writers/s5_html/themes/default/print.css,sha256=INhYRMsY7y2wd9p7tqjcDWBREXHUMO-2ApAWvITyetI,818
-docutils/writers/s5_html/themes/default/s5-core.css,sha256=D4WDPb581O-_G5jhzpAIwI88B1Zi8y3nWBB8rCxgzlg,450
-docutils/writers/s5_html/themes/default/slides.css,sha256=VKYQ1Oe8lZ8LHxzPqJiU79J0z295nkmIbzsXL-N_dfQ,283
-docutils/writers/s5_html/themes/default/slides.js,sha256=5BXUM5jSWu9hUQSVhGZhMTEvkdCYgqrOJO3ljwDgxWI,15801
-docutils/writers/s5_html/themes/medium-black/__base__,sha256=822LJG-LrdBZY6CA7wsLFCFzsYfxbyz2mr1j6rpb1UA,41
-docutils/writers/s5_html/themes/medium-black/pretty.css,sha256=OdL1xJ9f_FE1pmS7X0s0yxyIl1n2vUBQaGOcJrT2svg,4029
-docutils/writers/s5_html/themes/medium-white/framing.css,sha256=BF5YnRLGRhobO06xDet-0KZYpR10IgRjRbULPVm3PMM,943
-docutils/writers/s5_html/themes/medium-white/pretty.css,sha256=Zm-Pgk3SLAGmGTRF27nrqvpBb_LH2yQ5FIpDPM3p0Y0,3989
-docutils/writers/s5_html/themes/small-black/__base__,sha256=WmiB80z49RfMsy_7tFI042AfUgyztL5OXI3tap9EfQM,40
-docutils/writers/s5_html/themes/small-black/pretty.css,sha256=fmc73kx-zOp0jbiy4GAmpw2Xdz9Q_-WzebsgDJWUJos,4028
-docutils/writers/s5_html/themes/small-white/framing.css,sha256=qwNUgzqnrXgoX47SddbVIKEZwQDjGnTGA468jHHIXqc,940
-docutils/writers/s5_html/themes/small-white/pretty.css,sha256=qU8WOhY8TT6ZY6cXKXABb7T7JgpJQORzTZJhuAm0gGg,3999
-docutils/writers/xetex/__init__.py,sha256=o25hpaSPL9erEUe18GIzaVbP2QuYtjZ0SwSkDeXfZ6k,5736
-docutils/writers/xetex/__pycache__/__init__.cpython-312.pyc,,
diff --git a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/WHEEL b/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/WHEEL
deleted file mode 100644
index 3b5e64b5e..000000000
--- a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/WHEEL
+++ /dev/null
@@ -1,4 +0,0 @@
-Wheel-Version: 1.0
-Generator: flit 3.9.0
-Root-Is-Purelib: true
-Tag: py3-none-any
diff --git a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/entry_points.txt b/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/entry_points.txt
deleted file mode 100644
index 3e32d4e5a..000000000
--- a/release_env/lib/python3.12/site-packages/docutils-0.21.2.dist-info/entry_points.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-[console_scripts]
-docutils=docutils.__main__:main
-rst2html=docutils.core:rst2html
-rst2html4=docutils.core:rst2html4
-rst2html5=docutils.core:rst2html5
-rst2latex=docutils.core:rst2latex
-rst2man=docutils.core:rst2man
-rst2odt=docutils.core:rst2odt
-rst2pseudoxml=docutils.core:rst2pseudoxml
-rst2s5=docutils.core:rst2s5
-rst2xetex=docutils.core:rst2xetex
-rst2xml=docutils.core:rst2xml
-
diff --git a/release_env/lib/python3.12/site-packages/docutils/__init__.py b/release_env/lib/python3.12/site-packages/docutils/__init__.py
deleted file mode 100644
index 16af4108e..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/__init__.py
+++ /dev/null
@@ -1,291 +0,0 @@
-# $Id: __init__.py 9649 2024-04-23 18:54:26Z grubert $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-This is the Docutils (Python Documentation Utilities) package.
-
-Package Structure
-=================
-
-Modules:
-
-- __init__.py: Contains component base classes, exception classes, and
- Docutils version information.
-
-- core.py: Contains the ``Publisher`` class and ``publish_*()`` convenience
- functions.
-
-- frontend.py: Runtime settings (command-line interface, configuration files)
- processing, for Docutils front-ends.
-
-- io.py: Provides a uniform API for low-level input and output.
-
-- nodes.py: Docutils document tree (doctree) node class library.
-
-- statemachine.py: A finite state machine specialized for
- regular-expression-based text filters.
-
-Subpackages:
-
-- languages: Language-specific mappings of terms.
-
-- parsers: Syntax-specific input parser modules or packages.
-
-- readers: Context-specific input handlers which understand the data
- source and manage a parser.
-
-- transforms: Modules used by readers and writers to modify
- the Docutils document tree.
-
-- utils: Contains the ``Reporter`` system warning class and miscellaneous
- utilities used by readers, writers, and transforms.
-
- utils/urischemes.py: Contains a complete mapping of known URI addressing
- scheme names to descriptions.
-
-- utils/math: Contains functions for conversion of mathematical notation
- between different formats (LaTeX, MathML, text, ...).
-
-- writers: Format-specific output translators.
-"""
-
-from collections import namedtuple
-
-__docformat__ = 'reStructuredText'
-
-__version__ = '0.21.2'
-"""Docutils version identifier (complies with PEP 440)::
-
- major.minor[.micro][releaselevel[serial]][.dev]
-
-For version comparison operations, use `__version_info__` (see, below)
-rather than parsing the text of `__version__`.
-
-https://docutils.sourceforge.io/docs/dev/policies.html#version-identification
-"""
-
-__version_details__ = ''
-"""Optional extra version details (e.g. 'snapshot 2005-05-29, r3410').
-
-For development and release status, use `__version__ and `__version_info__`.
-"""
-
-
-class VersionInfo(namedtuple('VersionInfo',
- 'major minor micro releaselevel serial release')):
-
- def __new__(cls, major=0, minor=0, micro=0,
- releaselevel='final', serial=0, release=True):
- releaselevels = ('alpha', 'beta', 'candidate', 'final')
- if releaselevel not in releaselevels:
- raise ValueError('releaselevel must be one of %r.'
- % (releaselevels, ))
- if releaselevel == 'final':
- if not release:
- raise ValueError('releaselevel "final" must not be used '
- 'with development versions (leads to wrong '
- 'version ordering of the related __version__')
- # cf. https://peps.python.org/pep-0440/#summary-of-permitted-suffixes-and-relative-ordering # noqa
- if serial != 0:
- raise ValueError('"serial" must be 0 for final releases')
-
- return super().__new__(cls, major, minor, micro,
- releaselevel, serial, release)
-
- def __lt__(self, other):
- if isinstance(other, tuple):
- other = VersionInfo(*other)
- return tuple.__lt__(self, other)
-
- def __gt__(self, other):
- if isinstance(other, tuple):
- other = VersionInfo(*other)
- return tuple.__gt__(self, other)
-
- def __le__(self, other):
- if isinstance(other, tuple):
- other = VersionInfo(*other)
- return tuple.__le__(self, other)
-
- def __ge__(self, other):
- if isinstance(other, tuple):
- other = VersionInfo(*other)
- return tuple.__ge__(self, other)
-
-
-__version_info__ = VersionInfo(
- major=0,
- minor=21,
- micro=2,
- releaselevel='final', # one of 'alpha', 'beta', 'candidate', 'final'
- serial=0, # pre-release number (0 for final releases and snapshots)
- release=True # True for official releases and pre-releases
- )
-"""Comprehensive version information tuple.
-
-https://docutils.sourceforge.io/docs/dev/policies.html#version-identification
-"""
-
-
-class ApplicationError(Exception): pass
-class DataError(ApplicationError): pass
-
-
-class SettingsSpec:
-
- """
- Runtime setting specification base class.
-
- SettingsSpec subclass objects used by `docutils.frontend.OptionParser`.
- """
-
- # TODO: replace settings_specs with a new data structure
- # Backwards compatiblity:
- # Drop-in components:
- # Sphinx supplies settings_spec in the current format in some places
- # Myst parser provides a settings_spec tuple
- #
- # Sphinx reads a settings_spec in order to set a default value
- # in writers/html.py:59
- # https://github.com/sphinx-doc/sphinx/blob/4.x/sphinx/writers/html.py
- # This should be changed (before retiring the old format)
- # to use `settings_default_overrides` instead.
- settings_spec = ()
- """Runtime settings specification. Override in subclasses.
-
- Defines runtime settings and associated command-line options, as used by
- `docutils.frontend.OptionParser`. This is a tuple of:
-
- - Option group title (string or `None` which implies no group, just a list
- of single options).
-
- - Description (string or `None`).
-
- - A sequence of option tuples. Each consists of:
-
- - Help text (string)
-
- - List of option strings (e.g. ``['-Q', '--quux']``).
-
- - Dictionary of keyword arguments sent to the OptionParser/OptionGroup
- ``add_option`` method.
-
- Runtime setting names are derived implicitly from long option names
- ('--a-setting' becomes ``settings.a_setting``) or explicitly from the
- 'dest' keyword argument.
-
- Most settings will also have a 'validator' keyword & function. The
- validator function validates setting values (from configuration files
- and command-line option arguments) and converts them to appropriate
- types. For example, the ``docutils.frontend.validate_boolean``
- function, **required by all boolean settings**, converts true values
- ('1', 'on', 'yes', and 'true') to 1 and false values ('0', 'off',
- 'no', 'false', and '') to 0. Validators need only be set once per
- setting. See the `docutils.frontend.validate_*` functions.
-
- See the optparse docs for more details.
-
- - More triples of group title, description, options, as many times as
- needed. Thus, `settings_spec` tuples can be simply concatenated.
- """
-
- settings_defaults = None
- """A dictionary of defaults for settings not in `settings_spec` (internal
- settings, intended to be inaccessible by command-line and config file).
- Override in subclasses."""
-
- settings_default_overrides = None
- """A dictionary of auxiliary defaults, to override defaults for settings
- defined in other components' `setting_specs`. Override in subclasses."""
-
- relative_path_settings = ()
- """Settings containing filesystem paths. Override in subclasses.
- Settings listed here are to be interpreted relative to the current working
- directory."""
-
- config_section = None
- """The name of the config file section specific to this component
- (lowercase, no brackets). Override in subclasses."""
-
- config_section_dependencies = None
- """A list of names of config file sections that are to be applied before
- `config_section`, in order (from general to specific). In other words,
- the settings in `config_section` are to be overlaid on top of the settings
- from these sections. The "general" section is assumed implicitly.
- Override in subclasses."""
-
-
-class TransformSpec:
- """
- Runtime transform specification base class.
-
- Provides the interface to register "transforms" and helper functions
- to resolve references with a `docutils.transforms.Transformer`.
-
- https://docutils.sourceforge.io/docs/ref/transforms.html
- """
-
- def get_transforms(self):
- """Transforms required by this class. Override in subclasses."""
- if self.default_transforms != ():
- import warnings
- warnings.warn('TransformSpec: the "default_transforms" attribute '
- 'will be removed in Docutils 2.0.\n'
- 'Use get_transforms() method instead.',
- DeprecationWarning)
- return list(self.default_transforms)
- return []
-
- # Deprecated; for compatibility.
- default_transforms = ()
-
- unknown_reference_resolvers = ()
- """List of functions to try to resolve unknown references.
-
- Unknown references have a 'refname' attribute which doesn't correspond
- to any target in the document. Called when the transforms in
- `docutils.transforms.references` are unable to find a correct target.
-
- The list should contain functions which will try to resolve unknown
- references, with the following signature::
-
- def reference_resolver(node):
- '''Returns boolean: true if resolved, false if not.'''
-
- If the function is able to resolve the reference, it should also remove
- the 'refname' attribute and mark the node as resolved::
-
- del node['refname']
- node.resolved = 1
-
- Each function must have a "priority" attribute which will affect the order
- the unknown_reference_resolvers are run::
-
- reference_resolver.priority = 100
-
- This hook is provided for 3rd party extensions.
- Example use case: the `MoinMoin - ReStructured Text Parser`
- in ``sandbox/mmgilbe/rst.py``.
- """
-
-
-class Component(SettingsSpec, TransformSpec):
-
- """Base class for Docutils components."""
-
- component_type = None
- """Name of the component type ('reader', 'parser', 'writer'). Override in
- subclasses."""
-
- supported = ()
- """Name and aliases for this component. Override in subclasses."""
-
- def supports(self, format):
- """
- Is `format` supported by this component?
-
- To be used by transforms to ask the dependent component if it supports
- a certain input context or output format.
- """
- return format in self.supported
diff --git a/release_env/lib/python3.12/site-packages/docutils/__main__.py b/release_env/lib/python3.12/site-packages/docutils/__main__.py
deleted file mode 100755
index ce614891f..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/__main__.py
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/usr/bin/env python3
-# :Copyright: © 2020, 2022 Günter Milde.
-# :License: Released under the terms of the `2-Clause BSD license`_, in short:
-#
-# Copying and distribution of this file, with or without modification,
-# are permitted in any medium without royalty provided the copyright
-# notice and this notice are preserved.
-# This file is offered as-is, without any warranty.
-#
-# .. _2-Clause BSD license: https://opensource.org/licenses/BSD-2-Clause
-#
-# Revision: $Revision: 9107 $
-# Date: $Date: 2022-07-06 15:59:57 +0200 (Mi, 06. Jul 2022) $
-
-"""Generic command line interface for the `docutils` package.
-
-See also
-https://docs.python.org/3/library/__main__.html#main-py-in-python-packages
-"""
-
-import argparse
-import locale
-import sys
-
-import docutils
-from docutils.core import Publisher, publish_cmdline, default_description
-
-
-class CliSettingsSpec(docutils.SettingsSpec):
- """Runtime settings & command-line options for the generic CLI.
-
- Configurable reader, parser, and writer components.
-
- The "--writer" default will change to 'html' in Docutils 2.0
- when 'html' becomes an alias for the current value 'html5'.
- """
-
- settings_spec = (
- 'Docutils Application Options',
- 'Reader, writer, and parser settings influence the available options. '
- ' Example: use `--help --writer=latex` to see LaTeX writer options. ',
- # options: ('help text', [], {})
- (('Reader name (currently: "%default").',
- ['--reader'], {'default': 'standalone', 'metavar': ''}),
- ('Parser name (currently: "%default").',
- ['--parser'], {'default': 'rst', 'metavar': ''}),
- ('Writer name (currently: "%default").',
- ['--writer'], {'default': 'html5', 'metavar': ''}),
- )
- )
- config_section = 'docutils application'
- config_section_dependencies = ('docutils-cli application', # back-compat
- 'applications')
-
-
-def main():
- """Generic command line interface for the Docutils Publisher.
- """
- locale.setlocale(locale.LC_ALL, '')
-
- description = ('Convert documents into useful formats. '
- + default_description)
-
- # Update component selection from config file(s)
- components = Publisher().get_settings(settings_spec=CliSettingsSpec)
-
- # Update component selection from command-line
- argparser = argparse.ArgumentParser(add_help=False, allow_abbrev=False)
- argparser.add_argument('--reader', default=components.reader)
- argparser.add_argument('--parser', default=components.parser)
- argparser.add_argument('--writer', default=components.writer)
- # other options are parsed in a second pass via `publish_cmdline()`
- (args, remainder) = argparser.parse_known_args()
- # Ensure the current component selections are shown in help:
- CliSettingsSpec.settings_default_overrides = args.__dict__
-
- try:
- publish_cmdline(reader_name=args.reader,
- parser_name=args.parser,
- writer_name=args.writer,
- settings_spec=CliSettingsSpec,
- description=description,
- argv=remainder)
- except ImportError as error:
- print('%s.' % error, file=sys.stderr)
- if '--traceback' in remainder:
- raise
- else:
- print('Use "--traceback" to show details.')
-
-
-if __name__ == '__main__':
- if sys.argv[0].endswith('__main__.py'):
- # fix "usage" message
- sys.argv[0] = '%s -m docutils' % sys.executable
- main()
diff --git a/release_env/lib/python3.12/site-packages/docutils/core.py b/release_env/lib/python3.12/site-packages/docutils/core.py
deleted file mode 100644
index adf807592..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/core.py
+++ /dev/null
@@ -1,780 +0,0 @@
-# $Id: core.py 9369 2023-05-02 23:04:27Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-Calling the ``publish_*`` convenience functions (or instantiating a
-`Publisher` object) with component names will result in default
-behavior. For custom behavior (setting component options), create
-custom component objects first, and pass *them* to
-``publish_*``/`Publisher`. See `The Docutils Publisher`_.
-
-.. _The Docutils Publisher:
- https://docutils.sourceforge.io/docs/api/publisher.html
-"""
-
-__docformat__ = 'reStructuredText'
-
-import locale
-import pprint
-import os
-import sys
-import warnings
-
-from docutils import (__version__, __version_details__, SettingsSpec,
- io, utils, readers, writers)
-from docutils.frontend import OptionParser
-from docutils.readers import doctree
-
-
-class Publisher:
-
- """
- A facade encapsulating the high-level logic of a Docutils system.
- """
-
- def __init__(self, reader=None, parser=None, writer=None,
- source=None, source_class=io.FileInput,
- destination=None, destination_class=io.FileOutput,
- settings=None):
- """
- Initial setup. If any of `reader`, `parser`, or `writer` are not
- specified, ``set_components()`` or the corresponding ``set_...()``
- method should be called with component names
- (`set_reader` sets the parser as well).
- """
-
- self.document = None
- """The document tree (`docutils.nodes` objects)."""
-
- self.reader = reader
- """A `docutils.readers.Reader` instance."""
-
- self.parser = parser
- """A `docutils.parsers.Parser` instance."""
-
- self.writer = writer
- """A `docutils.writers.Writer` instance."""
-
- for component in 'reader', 'parser', 'writer':
- assert not isinstance(getattr(self, component), str), (
- 'passed string "%s" as "%s" parameter; pass an instance, '
- 'or use the "%s_name" parameter instead (in '
- 'docutils.core.publish_* convenience functions).'
- % (getattr(self, component), component, component))
-
- self.source = source
- """The source of input data, a `docutils.io.Input` instance."""
-
- self.source_class = source_class
- """The class for dynamically created source objects."""
-
- self.destination = destination
- """The destination for docutils output, a `docutils.io.Output`
- instance."""
-
- self.destination_class = destination_class
- """The class for dynamically created destination objects."""
-
- self.settings = settings
- """An object containing Docutils settings as instance attributes.
- Set by `self.process_command_line()` or `self.get_settings()`."""
-
- self._stderr = io.ErrorOutput()
-
- def set_reader(self, reader_name, parser, parser_name):
- """Set `self.reader` by name."""
- reader_class = readers.get_reader_class(reader_name)
- self.reader = reader_class(parser, parser_name)
- self.parser = self.reader.parser
-
- def set_writer(self, writer_name):
- """Set `self.writer` by name."""
- writer_class = writers.get_writer_class(writer_name)
- self.writer = writer_class()
-
- def set_components(self, reader_name, parser_name, writer_name):
- if self.reader is None:
- self.set_reader(reader_name, self.parser, parser_name)
- if self.parser is None:
- if self.reader.parser is None:
- self.reader.set_parser(parser_name)
- self.parser = self.reader.parser
- if self.writer is None:
- self.set_writer(writer_name)
-
- def setup_option_parser(self, usage=None, description=None,
- settings_spec=None, config_section=None,
- **defaults):
- warnings.warn('Publisher.setup_option_parser is deprecated, '
- 'and will be removed in Docutils 0.21.',
- DeprecationWarning, stacklevel=2)
- if config_section:
- if not settings_spec:
- settings_spec = SettingsSpec()
- settings_spec.config_section = config_section
- parts = config_section.split()
- if len(parts) > 1 and parts[-1] == 'application':
- settings_spec.config_section_dependencies = ['applications']
- # @@@ Add self.source & self.destination to components in future?
- return OptionParser(
- components=(self.parser, self.reader, self.writer, settings_spec),
- defaults=defaults, read_config_files=True,
- usage=usage, description=description)
-
- def _setup_settings_parser(self, *args, **kwargs):
- # Provisional: will change (docutils.frontend.OptionParser will
- # be replaced by a parser based on arparse.ArgumentParser)
- # and may be removed later.
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore', category=DeprecationWarning)
- return self.setup_option_parser(*args, **kwargs)
-
- def get_settings(self, usage=None, description=None,
- settings_spec=None, config_section=None, **defaults):
- """
- Return settings from components and config files.
-
- Please set components first (`self.set_reader` & `self.set_writer`).
- Use keyword arguments to override component defaults
- (before updating from configuration files).
-
- Calling this function also sets `self.settings` which makes
- `self.publish()` skip parsing command line options.
- """
- option_parser = self._setup_settings_parser(
- usage, description, settings_spec, config_section, **defaults)
- self.settings = option_parser.get_default_values()
- return self.settings
-
- def process_programmatic_settings(self, settings_spec,
- settings_overrides,
- config_section):
- if self.settings is None:
- defaults = settings_overrides.copy() if settings_overrides else {}
- # Propagate exceptions by default when used programmatically:
- defaults.setdefault('traceback', True)
- self.get_settings(settings_spec=settings_spec,
- config_section=config_section,
- **defaults)
-
- def process_command_line(self, argv=None, usage=None, description=None,
- settings_spec=None, config_section=None,
- **defaults):
- """
- Parse command line arguments and set ``self.settings``.
-
- Pass an empty sequence to `argv` to avoid reading `sys.argv`
- (the default behaviour).
-
- Set components first (`self.set_reader` & `self.set_writer`).
- """
- option_parser = self._setup_settings_parser(
- usage, description, settings_spec, config_section, **defaults)
- if argv is None:
- argv = sys.argv[1:]
- self.settings = option_parser.parse_args(argv)
-
- def set_io(self, source_path=None, destination_path=None):
- if self.source is None:
- self.set_source(source_path=source_path)
- if self.destination is None:
- self.set_destination(destination_path=destination_path)
-
- def set_source(self, source=None, source_path=None):
- if source_path is None:
- source_path = self.settings._source
- else:
- self.settings._source = source_path
- self.source = self.source_class(
- source=source, source_path=source_path,
- encoding=self.settings.input_encoding,
- error_handler=self.settings.input_encoding_error_handler)
-
- def set_destination(self, destination=None, destination_path=None):
- if destination_path is None:
- if (self.settings.output and self.settings._destination
- and self.settings.output != self.settings._destination):
- raise SystemExit('The positional argument is '
- 'obsoleted by the --output option. '
- 'You cannot use them together.')
- if self.settings.output == '-': # means stdout
- self.settings.output = None
- destination_path = (self.settings.output
- or self.settings._destination)
- self.settings._destination = destination_path
- self.destination = self.destination_class(
- destination=destination,
- destination_path=destination_path,
- encoding=self.settings.output_encoding,
- error_handler=self.settings.output_encoding_error_handler)
-
- def apply_transforms(self):
- self.document.transformer.populate_from_components(
- (self.source, self.reader, self.reader.parser, self.writer,
- self.destination))
- self.document.transformer.apply_transforms()
-
- def publish(self, argv=None, usage=None, description=None,
- settings_spec=None, settings_overrides=None,
- config_section=None, enable_exit_status=False):
- """
- Process command line options and arguments (if `self.settings` not
- already set), run `self.reader` and then `self.writer`. Return
- `self.writer`'s output.
- """
- exit = None
- try:
- if self.settings is None:
- self.process_command_line(
- argv, usage, description, settings_spec, config_section,
- **(settings_overrides or {}))
- self.set_io()
- self.prompt()
- self.document = self.reader.read(self.source, self.parser,
- self.settings)
- self.apply_transforms()
- output = self.writer.write(self.document, self.destination)
- self.writer.assemble_parts()
- except SystemExit as error:
- exit = True
- exit_status = error.code
- except Exception as error:
- if not self.settings: # exception too early to report nicely
- raise
- if self.settings.traceback: # Propagate exceptions?
- self.debugging_dumps()
- raise
- self.report_Exception(error)
- exit = True
- exit_status = 1
- self.debugging_dumps()
- if (enable_exit_status and self.document
- and (self.document.reporter.max_level
- >= self.settings.exit_status_level)):
- sys.exit(self.document.reporter.max_level + 10)
- elif exit:
- sys.exit(exit_status)
- return output
-
- def debugging_dumps(self):
- if not self.document:
- return
- if self.settings.dump_settings:
- print('\n::: Runtime settings:', file=self._stderr)
- print(pprint.pformat(self.settings.__dict__), file=self._stderr)
- if self.settings.dump_internals:
- print('\n::: Document internals:', file=self._stderr)
- print(pprint.pformat(self.document.__dict__), file=self._stderr)
- if self.settings.dump_transforms:
- print('\n::: Transforms applied:', file=self._stderr)
- print(' (priority, transform class, pending node details, '
- 'keyword args)', file=self._stderr)
- print(pprint.pformat(
- [(priority, '%s.%s' % (xclass.__module__, xclass.__name__),
- pending and pending.details, kwargs)
- for priority, xclass, pending, kwargs
- in self.document.transformer.applied]), file=self._stderr)
- if self.settings.dump_pseudo_xml:
- print('\n::: Pseudo-XML:', file=self._stderr)
- print(self.document.pformat().encode(
- 'raw_unicode_escape'), file=self._stderr)
-
- def prompt(self):
- """Print info and prompt when waiting for input from a terminal."""
- try:
- if not (self.source.isatty() and self._stderr.isatty()):
- return
- except AttributeError:
- return
- eot_key = 'Ctrl+Z' if os.name == 'nt' else 'Ctrl+D'
- in_format = ''
- out_format = 'useful formats'
- try:
- in_format = self.parser.supported[0]
- out_format = self.writer.supported[0]
- except (AttributeError, IndexError):
- pass
- print(f'Docutils {__version__} \n'
- f'converting "{in_format}" into "{out_format}".\n'
- f'Call with option "--help" for more info.\n'
- f'.. Waiting for source text (finish with {eot_key} '
- 'on an empty line):',
- file=self._stderr)
-
- def report_Exception(self, error):
- if isinstance(error, utils.SystemMessage):
- self.report_SystemMessage(error)
- elif isinstance(error, UnicodeEncodeError):
- self.report_UnicodeError(error)
- elif isinstance(error, io.InputError):
- self._stderr.write('Unable to open source file for reading:\n'
- ' %s\n' % io.error_string(error))
- elif isinstance(error, io.OutputError):
- self._stderr.write(
- 'Unable to open destination file for writing:\n'
- ' %s\n' % io.error_string(error))
- else:
- print('%s' % io.error_string(error), file=self._stderr)
- print(f"""\
-Exiting due to error. Use "--traceback" to diagnose.
-Please report errors to .
-Include "--traceback" output, Docutils version ({__version__}\
-{f' [{__version_details__}]' if __version_details__ else ''}),
-Python version ({sys.version.split()[0]}), your OS type & version, \
-and the command line used.""", file=self._stderr)
-
- def report_SystemMessage(self, error):
- print('Exiting due to level-%s (%s) system message.' % (
- error.level, utils.Reporter.levels[error.level]),
- file=self._stderr)
-
- def report_UnicodeError(self, error):
- data = error.object[error.start:error.end]
- self._stderr.write(
- '%s\n'
- '\n'
- 'The specified output encoding (%s) cannot\n'
- 'handle all of the output.\n'
- 'Try setting "--output-encoding-error-handler" to\n'
- '\n'
- '* "xmlcharrefreplace" (for HTML & XML output);\n'
- ' the output will contain "%s" and should be usable.\n'
- '* "backslashreplace" (for other output formats);\n'
- ' look for "%s" in the output.\n'
- '* "replace"; look for "?" in the output.\n'
- '\n'
- '"--output-encoding-error-handler" is currently set to "%s".\n'
- '\n'
- 'Exiting due to error. Use "--traceback" to diagnose.\n'
- 'If the advice above doesn\'t eliminate the error,\n'
- 'please report it to .\n'
- 'Include "--traceback" output, Docutils version (%s),\n'
- 'Python version (%s), your OS type & version, and the\n'
- 'command line used.\n'
- % (io.error_string(error),
- self.settings.output_encoding,
- data.encode('ascii', 'xmlcharrefreplace'),
- data.encode('ascii', 'backslashreplace'),
- self.settings.output_encoding_error_handler,
- __version__, sys.version.split()[0]))
-
-
-default_usage = '%prog [options] [ []]'
-default_description = (
- 'Reads from (default is stdin) '
- 'and writes to (default is stdout). '
- 'See https://docutils.sourceforge.io/docs/user/config.html '
- 'for a detailed settings reference.')
-
-
-# TODO: or not to do? cf. https://clig.dev/#help
-#
-# Display output on success, but keep it brief.
-# Provide a -q option to suppress all non-essential output.
-#
-# Chain several args as input and use --output or redirection for output:
-# argparser.add_argument('source', nargs='+')
-#
-def publish_cmdline(reader=None, reader_name='standalone',
- parser=None, parser_name='restructuredtext',
- writer=None, writer_name='pseudoxml',
- settings=None, settings_spec=None,
- settings_overrides=None, config_section=None,
- enable_exit_status=True, argv=None,
- usage=default_usage, description=default_description):
- """
- Set up & run a `Publisher` for command-line-based file I/O (input and
- output file paths taken automatically from the command line).
- Also return the output as `str` or `bytes` (for binary output document
- formats).
-
- Parameters: see `publish_programmatically()` for the remainder.
-
- - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``.
- - `usage`: Usage string, output if there's a problem parsing the command
- line.
- - `description`: Program description, output for the "--help" option
- (along with command-line option descriptions).
- """
- publisher = Publisher(reader, parser, writer, settings=settings)
- publisher.set_components(reader_name, parser_name, writer_name)
- output = publisher.publish(
- argv, usage, description, settings_spec, settings_overrides,
- config_section=config_section, enable_exit_status=enable_exit_status)
- return output
-
-
-def publish_file(source=None, source_path=None,
- destination=None, destination_path=None,
- reader=None, reader_name='standalone',
- parser=None, parser_name='restructuredtext',
- writer=None, writer_name='pseudoxml',
- settings=None, settings_spec=None, settings_overrides=None,
- config_section=None, enable_exit_status=False):
- """
- Set up & run a `Publisher` for programmatic use with file-like I/O.
- Also return the output as `str` or `bytes` (for binary output document
- formats).
-
- Parameters: see `publish_programmatically()`.
- """
- output, publisher = publish_programmatically(
- source_class=io.FileInput, source=source, source_path=source_path,
- destination_class=io.FileOutput,
- destination=destination, destination_path=destination_path,
- reader=reader, reader_name=reader_name,
- parser=parser, parser_name=parser_name,
- writer=writer, writer_name=writer_name,
- settings=settings, settings_spec=settings_spec,
- settings_overrides=settings_overrides,
- config_section=config_section,
- enable_exit_status=enable_exit_status)
- return output
-
-
-def publish_string(source, source_path=None, destination_path=None,
- reader=None, reader_name='standalone',
- parser=None, parser_name='restructuredtext',
- writer=None, writer_name='pseudoxml',
- settings=None, settings_spec=None,
- settings_overrides=None, config_section=None,
- enable_exit_status=False):
- """
- Set up & run a `Publisher` for programmatic use with string I/O.
-
- Accepts a `bytes` or `str` instance as `source`.
-
- The output is encoded according to the `output_encoding`_ setting;
- the return value is a `bytes` instance (unless `output_encoding`_ is
- "unicode", cf. `docutils.io.StringOutput.write()`).
-
- Parameters: see `publish_programmatically()`.
-
- This function is provisional because in Python 3 name and behaviour
- no longer match.
-
- .. _output_encoding:
- https://docutils.sourceforge.io/docs/user/config.html#output-encoding
- """
- output, publisher = publish_programmatically(
- source_class=io.StringInput, source=source, source_path=source_path,
- destination_class=io.StringOutput,
- destination=None, destination_path=destination_path,
- reader=reader, reader_name=reader_name,
- parser=parser, parser_name=parser_name,
- writer=writer, writer_name=writer_name,
- settings=settings, settings_spec=settings_spec,
- settings_overrides=settings_overrides,
- config_section=config_section,
- enable_exit_status=enable_exit_status)
- return output
-
-
-def publish_parts(source, source_path=None, source_class=io.StringInput,
- destination_path=None,
- reader=None, reader_name='standalone',
- parser=None, parser_name='restructuredtext',
- writer=None, writer_name='pseudoxml',
- settings=None, settings_spec=None,
- settings_overrides=None, config_section=None,
- enable_exit_status=False):
- """
- Set up & run a `Publisher`, and return a dictionary of document parts.
-
- Dictionary keys are the names of parts.
- Dictionary values are `str` instances; encoding is up to the client,
- e.g.::
-
- parts = publish_parts(...)
- body = parts['body'].encode(parts['encoding'], parts['errors'])
-
- See the `API documentation`__ for details on the provided parts.
-
- Parameters: see `publish_programmatically()`.
-
- __ https://docutils.sourceforge.io/docs/api/publisher.html#publish-parts
- """
- output, publisher = publish_programmatically(
- source=source, source_path=source_path, source_class=source_class,
- destination_class=io.StringOutput,
- destination=None, destination_path=destination_path,
- reader=reader, reader_name=reader_name,
- parser=parser, parser_name=parser_name,
- writer=writer, writer_name=writer_name,
- settings=settings, settings_spec=settings_spec,
- settings_overrides=settings_overrides,
- config_section=config_section,
- enable_exit_status=enable_exit_status)
- return publisher.writer.parts
-
-
-def publish_doctree(source, source_path=None,
- source_class=io.StringInput,
- reader=None, reader_name='standalone',
- parser=None, parser_name='restructuredtext',
- settings=None, settings_spec=None,
- settings_overrides=None, config_section=None,
- enable_exit_status=False):
- """
- Set up & run a `Publisher` for programmatic use. Return a document tree.
-
- Parameters: see `publish_programmatically()`.
- """
- _output, publisher = publish_programmatically(
- source=source, source_path=source_path,
- source_class=source_class,
- destination=None, destination_path=None,
- destination_class=io.NullOutput,
- reader=reader, reader_name=reader_name,
- parser=parser, parser_name=parser_name,
- writer=None, writer_name='null',
- settings=settings, settings_spec=settings_spec,
- settings_overrides=settings_overrides, config_section=config_section,
- enable_exit_status=enable_exit_status)
- return publisher.document
-
-
-def publish_from_doctree(document, destination_path=None,
- writer=None, writer_name='pseudoxml',
- settings=None, settings_spec=None,
- settings_overrides=None, config_section=None,
- enable_exit_status=False):
- """
- Set up & run a `Publisher` to render from an existing document tree
- data structure. For programmatic use with string output
- (`bytes` or `str`, cf. `publish_string()`).
-
- Note that ``document.settings`` is overridden; if you want to use the
- settings of the original `document`, pass ``settings=document.settings``.
-
- Also, new `document.transformer` and `document.reporter` objects are
- generated.
-
- Parameters: `document` is a `docutils.nodes.document` object, an existing
- document tree.
-
- Other parameters: see `publish_programmatically()`.
-
- This function is provisional because in Python 3 name and behaviour
- of the `io.StringOutput` class no longer match.
- """
- reader = doctree.Reader(parser_name='null')
- publisher = Publisher(reader, None, writer,
- source=io.DocTreeInput(document),
- destination_class=io.StringOutput,
- settings=settings)
- if not writer and writer_name:
- publisher.set_writer(writer_name)
- publisher.process_programmatic_settings(
- settings_spec, settings_overrides, config_section)
- publisher.set_destination(None, destination_path)
- return publisher.publish(enable_exit_status=enable_exit_status)
-
-
-def publish_cmdline_to_binary(reader=None, reader_name='standalone',
- parser=None, parser_name='restructuredtext',
- writer=None, writer_name='pseudoxml',
- settings=None,
- settings_spec=None,
- settings_overrides=None,
- config_section=None,
- enable_exit_status=True,
- argv=None,
- usage=default_usage,
- description=default_description,
- destination=None,
- destination_class=io.BinaryFileOutput):
- """
- Set up & run a `Publisher` for command-line-based file I/O (input and
- output file paths taken automatically from the command line).
- Also return the output as `bytes`.
-
- This is just like publish_cmdline, except that it uses
- io.BinaryFileOutput instead of io.FileOutput.
-
- Parameters: see `publish_programmatically()` for the remainder.
-
- - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``.
- - `usage`: Usage string, output if there's a problem parsing the command
- line.
- - `description`: Program description, output for the "--help" option
- (along with command-line option descriptions).
- """
- publisher = Publisher(reader, parser, writer, settings=settings,
- destination_class=destination_class)
- publisher.set_components(reader_name, parser_name, writer_name)
- output = publisher.publish(
- argv, usage, description, settings_spec, settings_overrides,
- config_section=config_section, enable_exit_status=enable_exit_status)
- return output
-
-
-def publish_programmatically(source_class, source, source_path,
- destination_class, destination, destination_path,
- reader, reader_name,
- parser, parser_name,
- writer, writer_name,
- settings, settings_spec,
- settings_overrides, config_section,
- enable_exit_status):
- """
- Set up & run a `Publisher` for custom programmatic use.
-
- Return the output (as `str` or `bytes`, depending on `destination_class`,
- writer, and the "output_encoding" setting) and the Publisher object.
-
- Applications should not need to call this function directly. If it does
- seem to be necessary to call this function directly, please write to the
- Docutils-develop mailing list
- .
-
- Parameters:
-
- * `source_class` **required**: The class for dynamically created source
- objects. Typically `io.FileInput` or `io.StringInput`.
-
- * `source`: Type depends on `source_class`:
-
- - If `source_class` is `io.FileInput`: Either a file-like object
- (must have 'read' and 'close' methods), or ``None``
- (`source_path` is opened). If neither `source` nor
- `source_path` are supplied, `sys.stdin` is used.
-
- - If `source_class` is `io.StringInput` **required**:
- The input as either a `bytes` object (ensure the 'input_encoding'
- setting matches its encoding) or a `str` object.
-
- * `source_path`: Type depends on `source_class`:
-
- - `io.FileInput`: Path to the input file, opened if no `source`
- supplied.
-
- - `io.StringInput`: Optional. Path to the file or name of the
- object that produced `source`. Only used for diagnostic output.
-
- * `destination_class` **required**: The class for dynamically created
- destination objects. Typically `io.FileOutput` or `io.StringOutput`.
-
- * `destination`: Type depends on `destination_class`:
-
- - `io.FileOutput`: Either a file-like object (must have 'write' and
- 'close' methods), or ``None`` (`destination_path` is opened). If
- neither `destination` nor `destination_path` are supplied,
- `sys.stdout` is used.
-
- - `io.StringOutput`: Not used; pass ``None``.
-
- * `destination_path`: Type depends on `destination_class`:
-
- - `io.FileOutput`: Path to the output file. Opened if no `destination`
- supplied.
-
- - `io.StringOutput`: Path to the file or object which will receive the
- output; optional. Used for determining relative paths (stylesheets,
- source links, etc.).
-
- * `reader`: A `docutils.readers.Reader` object.
-
- * `reader_name`: Name or alias of the Reader class to be instantiated if
- no `reader` supplied.
-
- * `parser`: A `docutils.parsers.Parser` object.
-
- * `parser_name`: Name or alias of the Parser class to be instantiated if
- no `parser` supplied.
-
- * `writer`: A `docutils.writers.Writer` object.
-
- * `writer_name`: Name or alias of the Writer class to be instantiated if
- no `writer` supplied.
-
- * `settings`: A runtime settings (`docutils.frontend.Values`) object, for
- dotted-attribute access to runtime settings. It's the end result of the
- `SettingsSpec`, config file, and option processing. If `settings` is
- passed, it's assumed to be complete and no further setting/config/option
- processing is done.
-
- * `settings_spec`: A `docutils.SettingsSpec` subclass or object. Provides
- extra application-specific settings definitions independently of
- components. In other words, the application becomes a component, and
- its settings data is processed along with that of the other components.
- Used only if no `settings` specified.
-
- * `settings_overrides`: A dictionary containing application-specific
- settings defaults that override the defaults of other components.
- Used only if no `settings` specified.
-
- * `config_section`: A string, the name of the configuration file section
- for this application. Overrides the ``config_section`` attribute
- defined by `settings_spec`. Used only if no `settings` specified.
-
- * `enable_exit_status`: Boolean; enable exit status at end of processing?
- """
- publisher = Publisher(reader, parser, writer, settings=settings,
- source_class=source_class,
- destination_class=destination_class)
- publisher.set_components(reader_name, parser_name, writer_name)
- publisher.process_programmatic_settings(
- settings_spec, settings_overrides, config_section)
- publisher.set_source(source, source_path)
- publisher.set_destination(destination, destination_path)
- output = publisher.publish(enable_exit_status=enable_exit_status)
- return output, publisher
-
-
-# "Entry points" with functionality of the "tools/rst2*.py" scripts
-# cf. https://packaging.python.org/en/latest/specifications/entry-points/
-
-def rst2something(writer, documenttype, doc_path=''):
- # Helper function for the common parts of rst2...
- # writer: writer name
- # documenttype: output document type
- # doc_path: documentation path (relative to the documentation root)
- description = (
- f'Generate {documenttype} documents '
- 'from standalone reStructuredText sources '
- f'. '
- + default_description)
- locale.setlocale(locale.LC_ALL, '')
- publish_cmdline(writer_name=writer, description=description)
-
-
-def rst2html():
- rst2something('html', 'HTML', 'user/html.html#html')
-
-
-def rst2html4():
- rst2something('html4', 'XHTML 1.1', 'user/html.html#html4css1')
-
-
-def rst2html5():
- rst2something('html5', 'HTML5', 'user/html.html#html5-polyglot')
-
-
-def rst2latex():
- rst2something('latex', 'LaTeX', 'user/latex.html')
-
-
-def rst2man():
- rst2something('manpage', 'Unix manual (troff)', 'user/manpage.html')
-
-
-def rst2odt():
- rst2something('odt', 'OpenDocument text (ODT)', 'user/odt.html')
-
-
-def rst2pseudoxml():
- rst2something('pseudoxml', 'pseudo-XML (test)', 'ref/doctree.html')
-
-
-def rst2s5():
- rst2something('s5', 'S5 HTML slideshow', 'user/slide-shows.html')
-
-
-def rst2xetex():
- rst2something('xetex', 'LaTeX (XeLaTeX/LuaLaTeX)', 'user/latex.html')
-
-
-def rst2xml():
- rst2something('xml', 'Docutils-native XML', 'ref/doctree.html')
diff --git a/release_env/lib/python3.12/site-packages/docutils/docutils.conf b/release_env/lib/python3.12/site-packages/docutils/docutils.conf
deleted file mode 100644
index cdce8d629..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/docutils.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# This configuration file is to prevent tools/buildhtml.py from
-# processing text files in and below this directory.
-
-[buildhtml application]
-prune: .
diff --git a/release_env/lib/python3.12/site-packages/docutils/examples.py b/release_env/lib/python3.12/site-packages/docutils/examples.py
deleted file mode 100644
index c27ab70d9..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/examples.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# $Id: examples.py 9026 2022-03-04 15:57:13Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-This module contains practical examples of Docutils client code.
-
-Importing this module from client code is not recommended; its contents are
-subject to change in future Docutils releases. Instead, it is recommended
-that you copy and paste the parts you need into your own code, modifying as
-necessary.
-"""
-
-from docutils import core, io
-
-
-def html_parts(input_string, source_path=None, destination_path=None,
- input_encoding='unicode', doctitle=True,
- initial_header_level=1):
- """
- Given an input string, returns a dictionary of HTML document parts.
-
- Dictionary keys are the names of parts, and values are Unicode strings;
- encoding is up to the client.
-
- Parameters:
-
- - `input_string`: A multi-line text string; required.
- - `source_path`: Path to the source file or object. Optional, but useful
- for diagnostic output (system messages).
- - `destination_path`: Path to the file or object which will receive the
- output; optional. Used for determining relative paths (stylesheets,
- source links, etc.).
- - `input_encoding`: The encoding of `input_string`. If it is an encoded
- 8-bit string, provide the correct encoding. If it is a Unicode string,
- use "unicode", the default.
- - `doctitle`: Disable the promotion of a lone top-level section title to
- document title (and subsequent section title to document subtitle
- promotion); enabled by default.
- - `initial_header_level`: The initial level for header elements (e.g. 1
- for "").
- """
- overrides = {'input_encoding': input_encoding,
- 'doctitle_xform': doctitle,
- 'initial_header_level': initial_header_level}
- parts = core.publish_parts(
- source=input_string, source_path=source_path,
- destination_path=destination_path,
- writer_name='html', settings_overrides=overrides)
- return parts
-
-
-def html_body(input_string, source_path=None, destination_path=None,
- input_encoding='unicode', output_encoding='unicode',
- doctitle=True, initial_header_level=1):
- """
- Given an input string, returns an HTML fragment as a string.
-
- The return value is the contents of the element.
-
- Parameters (see `html_parts()` for the remainder):
-
- - `output_encoding`: The desired encoding of the output. If a Unicode
- string is desired, use the default value of "unicode" .
- """
- parts = html_parts(
- input_string=input_string, source_path=source_path,
- destination_path=destination_path,
- input_encoding=input_encoding, doctitle=doctitle,
- initial_header_level=initial_header_level)
- fragment = parts['html_body']
- if output_encoding != 'unicode':
- fragment = fragment.encode(output_encoding)
- return fragment
-
-
-def internals(input_string, source_path=None, destination_path=None,
- input_encoding='unicode', settings_overrides=None):
- """
- Return the document tree and publisher, for exploring Docutils internals.
-
- Parameters: see `html_parts()`.
- """
- if settings_overrides:
- overrides = settings_overrides.copy()
- else:
- overrides = {}
- overrides['input_encoding'] = input_encoding
- output, pub = core.publish_programmatically(
- source_class=io.StringInput, source=input_string,
- source_path=source_path,
- destination_class=io.NullOutput, destination=None,
- destination_path=destination_path,
- reader=None, reader_name='standalone',
- parser=None, parser_name='restructuredtext',
- writer=None, writer_name='null',
- settings=None, settings_spec=None, settings_overrides=overrides,
- config_section=None, enable_exit_status=None)
- return pub.writer.document, pub
diff --git a/release_env/lib/python3.12/site-packages/docutils/frontend.py b/release_env/lib/python3.12/site-packages/docutils/frontend.py
deleted file mode 100644
index 2499c628c..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/frontend.py
+++ /dev/null
@@ -1,1065 +0,0 @@
-# $Id: frontend.py 9540 2024-02-17 10:36:59Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-Command-line and common processing for Docutils front-end tools.
-
-This module is provisional.
-Major changes will happen with the switch from the deprecated
-"optparse" module to "arparse".
-
-Applications should use the high-level API provided by `docutils.core`.
-See https://docutils.sourceforge.io/docs/api/runtime-settings.html.
-
-Exports the following classes:
-
-* `OptionParser`: Standard Docutils command-line processing.
- Deprecated. Will be replaced by an ArgumentParser.
-* `Option`: Customized version of `optparse.Option`; validation support.
- Deprecated. Will be removed.
-* `Values`: Runtime settings; objects are simple structs
- (``object.attribute``). Supports cumulative list settings (attributes).
- Deprecated. Will be removed.
-* `ConfigParser`: Standard Docutils config file processing.
- Provisional. Details will change.
-
-Also exports the following functions:
-
-Interface function:
- `get_default_settings()`. New in 0.19.
-
-Option callbacks:
- `store_multiple()`, `read_config_file()`. Deprecated.
-
-Setting validators:
- `validate_encoding()`, `validate_encoding_error_handler()`,
- `validate_encoding_and_error_handler()`,
- `validate_boolean()`, `validate_ternary()`,
- `validate_nonnegative_int()`, `validate_threshold()`,
- `validate_colon_separated_string_list()`,
- `validate_comma_separated_list()`,
- `validate_url_trailing_slash()`,
- `validate_dependency_file()`,
- `validate_strip_class()`
- `validate_smartquotes_locales()`.
-
- Provisional.
-
-Misc:
- `make_paths_absolute()`, `filter_settings_spec()`. Provisional.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import codecs
-import configparser
-import optparse
-from optparse import SUPPRESS_HELP
-import os
-import os.path
-from pathlib import Path
-import sys
-import warnings
-
-import docutils
-from docutils import io, utils
-
-
-def store_multiple(option, opt, value, parser, *args, **kwargs):
- """
- Store multiple values in `parser.values`. (Option callback.)
-
- Store `None` for each attribute named in `args`, and store the value for
- each key (attribute name) in `kwargs`.
- """
- for attribute in args:
- setattr(parser.values, attribute, None)
- for key, value in kwargs.items():
- setattr(parser.values, key, value)
-
-
-def read_config_file(option, opt, value, parser):
- """
- Read a configuration file during option processing. (Option callback.)
- """
- try:
- new_settings = parser.get_config_file_settings(value)
- except ValueError as err:
- parser.error(err)
- parser.values.update(new_settings, parser)
-
-
-def validate_encoding(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- # All arguments except `value` are ignored
- # (kept for compatibility with "optparse" module).
- # If there is only one positional argument, it is interpreted as `value`.
- if value is None:
- value = setting
- if value == '':
- return None # allow overwriting a config file value
- try:
- codecs.lookup(value)
- except LookupError:
- raise LookupError('setting "%s": unknown encoding: "%s"'
- % (setting, value))
- return value
-
-
-def validate_encoding_error_handler(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- # All arguments except `value` are ignored
- # (kept for compatibility with "optparse" module).
- # If there is only one positional argument, it is interpreted as `value`.
- if value is None:
- value = setting
- try:
- codecs.lookup_error(value)
- except LookupError:
- raise LookupError(
- 'unknown encoding error handler: "%s" (choices: '
- '"strict", "ignore", "replace", "backslashreplace", '
- '"xmlcharrefreplace", and possibly others; see documentation for '
- 'the Python ``codecs`` module)' % value)
- return value
-
-
-def validate_encoding_and_error_handler(
- setting, value, option_parser, config_parser=None, config_section=None):
- """
- Side-effect: if an error handler is included in the value, it is inserted
- into the appropriate place as if it were a separate setting/option.
- """
- if ':' in value:
- encoding, handler = value.split(':')
- validate_encoding_error_handler(handler)
- if config_parser:
- config_parser.set(config_section, setting + '_error_handler',
- handler)
- else:
- setattr(option_parser.values, setting + '_error_handler', handler)
- else:
- encoding = value
- return validate_encoding(encoding)
-
-
-def validate_boolean(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- """Check/normalize boolean settings:
- True: '1', 'on', 'yes', 'true'
- False: '0', 'off', 'no','false', ''
-
- All arguments except `value` are ignored
- (kept for compatibility with "optparse" module).
- If there is only one positional argument, it is interpreted as `value`.
- """
- if value is None:
- value = setting
- if isinstance(value, bool):
- return value
- try:
- return OptionParser.booleans[value.strip().lower()]
- except KeyError:
- raise LookupError('unknown boolean value: "%s"' % value)
-
-
-def validate_ternary(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- """Check/normalize three-value settings:
- True: '1', 'on', 'yes', 'true'
- False: '0', 'off', 'no','false', ''
- any other value: returned as-is.
-
- All arguments except `value` are ignored
- (kept for compatibility with "optparse" module).
- If there is only one positional argument, it is interpreted as `value`.
- """
- if value is None:
- value = setting
- if isinstance(value, bool) or value is None:
- return value
- try:
- return OptionParser.booleans[value.strip().lower()]
- except KeyError:
- return value
-
-
-def validate_nonnegative_int(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- # All arguments except `value` are ignored
- # (kept for compatibility with "optparse" module).
- # If there is only one positional argument, it is interpreted as `value`.
- if value is None:
- value = setting
- value = int(value)
- if value < 0:
- raise ValueError('negative value; must be positive or zero')
- return value
-
-
-def validate_threshold(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- # All arguments except `value` are ignored
- # (kept for compatibility with "optparse" module).
- # If there is only one positional argument, it is interpreted as `value`.
- if value is None:
- value = setting
- try:
- return int(value)
- except ValueError:
- try:
- return OptionParser.thresholds[value.lower()]
- except (KeyError, AttributeError):
- raise LookupError('unknown threshold: %r.' % value)
-
-
-def validate_colon_separated_string_list(
- setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- # All arguments except `value` are ignored
- # (kept for compatibility with "optparse" module).
- # If there is only one positional argument, it is interpreted as `value`.
- if value is None:
- value = setting
- if not isinstance(value, list):
- value = value.split(':')
- else:
- last = value.pop()
- value.extend(last.split(':'))
- return value
-
-
-def validate_comma_separated_list(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- """Check/normalize list arguments (split at "," and strip whitespace).
-
- All arguments except `value` are ignored
- (kept for compatibility with "optparse" module).
- If there is only one positional argument, it is interpreted as `value`.
- """
- if value is None:
- value = setting
- # `value` may be ``bytes``, ``str``, or a ``list`` (when given as
- # command line option and "action" is "append").
- if not isinstance(value, list):
- value = [value]
- # this function is called for every option added to `value`
- # -> split the last item and append the result:
- last = value.pop()
- items = [i.strip(' \t\n') for i in last.split(',') if i.strip(' \t\n')]
- value.extend(items)
- return value
-
-
-def validate_math_output(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- """Check "math-output" setting, return list with "format" and "options".
-
- See also https://docutils.sourceforge.io/docs/user/config.html#math-output
-
- Argument list for compatibility with "optparse" module.
- All arguments except `value` are ignored.
- If there is only one positional argument, it is interpreted as `value`.
- """
- if value is None:
- value = setting
-
- formats = ('html', 'latex', 'mathml', 'mathjax')
- tex2mathml_converters = ('', 'latexml', 'ttm', 'blahtexml', 'pandoc')
-
- if not value:
- return []
- values = value.split(maxsplit=1)
- format = values[0].lower()
- try:
- options = values[1]
- except IndexError:
- options = ''
- if format not in formats:
- raise LookupError(f'Unknown math output format: "{value}",\n'
- f' choose from {formats}.')
- if format == 'mathml':
- converter = options.lower()
- if converter not in tex2mathml_converters:
- raise LookupError(f'MathML converter "{options}" not supported,\n'
- f' choose from {tex2mathml_converters}.')
- options = converter
- return [format, options]
-
-
-def validate_url_trailing_slash(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- # All arguments except `value` are ignored
- # (kept for compatibility with "optparse" module).
- # If there is only one positional argument, it is interpreted as `value`.
- if value is None:
- value = setting
- if not value:
- return './'
- elif value.endswith('/'):
- return value
- else:
- return value + '/'
-
-
-def validate_dependency_file(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- # All arguments except `value` are ignored
- # (kept for compatibility with "optparse" module).
- # If there is only one positional argument, it is interpreted as `value`.
- if value is None:
- value = setting
- try:
- return utils.DependencyList(value)
- except OSError:
- # TODO: warn/info?
- return utils.DependencyList(None)
-
-
-def validate_strip_class(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- # All arguments except `value` are ignored
- # (kept for compatibility with "optparse" module).
- # If there is only one positional argument, it is interpreted as `value`.
- if value is None:
- value = setting
- # value is a comma separated string list:
- value = validate_comma_separated_list(value)
- # validate list elements:
- for cls in value:
- normalized = docutils.nodes.make_id(cls)
- if cls != normalized:
- raise ValueError('Invalid class value %r (perhaps %r?)'
- % (cls, normalized))
- return value
-
-
-def validate_smartquotes_locales(setting, value=None, option_parser=None,
- config_parser=None, config_section=None):
- """Check/normalize a comma separated list of smart quote definitions.
-
- Return a list of (language-tag, quotes) string tuples.
-
- All arguments except `value` are ignored
- (kept for compatibility with "optparse" module).
- If there is only one positional argument, it is interpreted as `value`.
- """
- if value is None:
- value = setting
- # value is a comma separated string list:
- value = validate_comma_separated_list(value)
- # validate list elements
- lc_quotes = []
- for item in value:
- try:
- lang, quotes = item.split(':', 1)
- except AttributeError:
- # this function is called for every option added to `value`
- # -> ignore if already a tuple:
- lc_quotes.append(item)
- continue
- except ValueError:
- raise ValueError('Invalid value "%s".'
- ' Format is ":".'
- % item.encode('ascii', 'backslashreplace'))
- # parse colon separated string list:
- quotes = quotes.strip()
- multichar_quotes = quotes.split(':')
- if len(multichar_quotes) == 4:
- quotes = multichar_quotes
- elif len(quotes) != 4:
- raise ValueError('Invalid value "%s". Please specify 4 quotes\n'
- ' (primary open/close; secondary open/close).'
- % item.encode('ascii', 'backslashreplace'))
- lc_quotes.append((lang, quotes))
- return lc_quotes
-
-
-def make_paths_absolute(pathdict, keys, base_path=None):
- """
- Interpret filesystem path settings relative to the `base_path` given.
-
- Paths are values in `pathdict` whose keys are in `keys`. Get `keys` from
- `OptionParser.relative_path_settings`.
- """
- if base_path is None:
- base_path = Path.cwd()
- else:
- base_path = Path(base_path)
- for key in keys:
- if key in pathdict:
- value = pathdict[key]
- if isinstance(value, list):
- value = [str((base_path/path).resolve()) for path in value]
- elif value:
- value = str((base_path/value).resolve())
- pathdict[key] = value
-
-
-def make_one_path_absolute(base_path, path):
- # deprecated, will be removed
- warnings.warn('frontend.make_one_path_absolute() will be removed '
- 'in Docutils 0.23.', DeprecationWarning, stacklevel=2)
- return os.path.abspath(os.path.join(base_path, path))
-
-
-def filter_settings_spec(settings_spec, *exclude, **replace):
- """Return a copy of `settings_spec` excluding/replacing some settings.
-
- `settings_spec` is a tuple of configuration settings
- (cf. `docutils.SettingsSpec.settings_spec`).
-
- Optional positional arguments are names of to-be-excluded settings.
- Keyword arguments are option specification replacements.
- (See the html4strict writer for an example.)
- """
- settings = list(settings_spec)
- # every third item is a sequence of option tuples
- for i in range(2, len(settings), 3):
- newopts = []
- for opt_spec in settings[i]:
- # opt_spec is ("", [], {})
- opt_name = [opt_string[2:].replace('-', '_')
- for opt_string in opt_spec[1]
- if opt_string.startswith('--')][0]
- if opt_name in exclude:
- continue
- if opt_name in replace.keys():
- newopts.append(replace[opt_name])
- else:
- newopts.append(opt_spec)
- settings[i] = tuple(newopts)
- return tuple(settings)
-
-
-class Values(optparse.Values):
- """Storage for option values.
-
- Updates list attributes by extension rather than by replacement.
- Works in conjunction with the `OptionParser.lists` instance attribute.
-
- Deprecated. Will be removed.
- """
-
- def __init__(self, *args, **kwargs):
- warnings.warn('frontend.Values class will be removed '
- 'in Docutils 0.21 or later.',
- DeprecationWarning, stacklevel=2)
- super().__init__(*args, **kwargs)
- if getattr(self, 'record_dependencies', None) is None:
- # Set up dummy dependency list.
- self.record_dependencies = utils.DependencyList()
-
- def update(self, other_dict, option_parser):
- if isinstance(other_dict, Values):
- other_dict = other_dict.__dict__
- other_dict = dict(other_dict) # also works with ConfigParser sections
- for setting in option_parser.lists.keys():
- if hasattr(self, setting) and setting in other_dict:
- value = getattr(self, setting)
- if value:
- value += other_dict[setting]
- del other_dict[setting]
- self._update_loose(other_dict)
-
- def copy(self):
- """Return a shallow copy of `self`."""
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore', category=DeprecationWarning)
- return self.__class__(defaults=self.__dict__)
-
- def setdefault(self, name, default):
- """Return ``self.name`` or ``default``.
-
- If ``self.name`` is unset, set ``self.name = default``.
- """
- if getattr(self, name, None) is None:
- setattr(self, name, default)
- return getattr(self, name)
-
-
-class Option(optparse.Option):
- """Add validation and override support to `optparse.Option`.
-
- Deprecated. Will be removed.
- """
-
- ATTRS = optparse.Option.ATTRS + ['validator', 'overrides']
-
- def __init__(self, *args, **kwargs):
- warnings.warn('The frontend.Option class will be removed '
- 'in Docutils 0.21 or later.',
- DeprecationWarning, stacklevel=2)
- super().__init__(*args, **kwargs)
-
- def process(self, opt, value, values, parser):
- """
- Call the validator function on applicable settings and
- evaluate the 'overrides' option.
- Extends `optparse.Option.process`.
- """
- result = super().process(opt, value, values, parser)
- setting = self.dest
- if setting:
- if self.validator:
- value = getattr(values, setting)
- try:
- new_value = self.validator(setting, value, parser)
- except Exception as err:
- raise optparse.OptionValueError(
- 'Error in option "%s":\n %s'
- % (opt, io.error_string(err)))
- setattr(values, setting, new_value)
- if self.overrides:
- setattr(values, self.overrides, None)
- return result
-
-
-class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
- """
- Settings parser for command-line and library use.
-
- The `settings_spec` specification here and in other Docutils components
- are merged to build the set of command-line options and runtime settings
- for this process.
-
- Common settings (defined below) and component-specific settings must not
- conflict. Short options are reserved for common settings, and components
- are restricted to using long options.
-
- Deprecated.
- Will be replaced by a subclass of `argparse.ArgumentParser`.
- """
-
- standard_config_files = [
- '/etc/docutils.conf', # system-wide
- './docutils.conf', # project-specific
- '~/.docutils'] # user-specific
- """Docutils configuration files, using ConfigParser syntax.
-
- Filenames will be tilde-expanded later. Later files override earlier ones.
- """
-
- threshold_choices = 'info 1 warning 2 error 3 severe 4 none 5'.split()
- """Possible inputs for for --report and --halt threshold values."""
-
- thresholds = {'info': 1, 'warning': 2, 'error': 3, 'severe': 4, 'none': 5}
- """Lookup table for --report and --halt threshold values."""
-
- booleans = {'1': True, 'on': True, 'yes': True, 'true': True, '0': False,
- 'off': False, 'no': False, 'false': False, '': False}
- """Lookup table for boolean configuration file settings."""
-
- default_error_encoding = (getattr(sys.stderr, 'encoding', None)
- or io._locale_encoding # noqa
- or 'ascii')
-
- default_error_encoding_error_handler = 'backslashreplace'
-
- settings_spec = (
- 'General Docutils Options',
- None,
- (('Output destination name. Obsoletes the '
- 'positional argument. Default: None (stdout).',
- ['--output'], {'metavar': ''}),
- ('Specify the document title as metadata.',
- ['--title'], {'metavar': ''}),
- ('Include a "Generated by Docutils" credit and link.',
- ['--generator', '-g'], {'action': 'store_true',
- 'validator': validate_boolean}),
- ('Do not include a generator credit.',
- ['--no-generator'], {'action': 'store_false', 'dest': 'generator'}),
- ('Include the date at the end of the document (UTC).',
- ['--date', '-d'], {'action': 'store_const', 'const': '%Y-%m-%d',
- 'dest': 'datestamp'}),
- ('Include the time & date (UTC).',
- ['--time', '-t'], {'action': 'store_const',
- 'const': '%Y-%m-%d %H:%M UTC',
- 'dest': 'datestamp'}),
- ('Do not include a datestamp of any kind.',
- ['--no-datestamp'], {'action': 'store_const', 'const': None,
- 'dest': 'datestamp'}),
- ('Base directory for absolute paths when reading '
- 'from the local filesystem. Default "/".',
- ['--root-prefix'],
- {'default': '/', 'metavar': ''}),
- ('Include a "View document source" link.',
- ['--source-link', '-s'], {'action': 'store_true',
- 'validator': validate_boolean}),
- ('Use for a source link; implies --source-link.',
- ['--source-url'], {'metavar': ''}),
- ('Do not include a "View document source" link.',
- ['--no-source-link'],
- {'action': 'callback', 'callback': store_multiple,
- 'callback_args': ('source_link', 'source_url')}),
- ('Link from section headers to TOC entries. (default)',
- ['--toc-entry-backlinks'],
- {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'entry',
- 'default': 'entry'}),
- ('Link from section headers to the top of the TOC.',
- ['--toc-top-backlinks'],
- {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'top'}),
- ('Disable backlinks to the table of contents.',
- ['--no-toc-backlinks'],
- {'dest': 'toc_backlinks', 'action': 'store_false'}),
- ('Link from footnotes/citations to references. (default)',
- ['--footnote-backlinks'],
- {'action': 'store_true', 'default': True,
- 'validator': validate_boolean}),
- ('Disable backlinks from footnotes and citations.',
- ['--no-footnote-backlinks'],
- {'dest': 'footnote_backlinks', 'action': 'store_false'}),
- ('Enable section numbering by Docutils. (default)',
- ['--section-numbering'],
- {'action': 'store_true', 'dest': 'sectnum_xform',
- 'default': True, 'validator': validate_boolean}),
- ('Disable section numbering by Docutils.',
- ['--no-section-numbering'],
- {'action': 'store_false', 'dest': 'sectnum_xform'}),
- ('Remove comment elements from the document tree.',
- ['--strip-comments'],
- {'action': 'store_true', 'validator': validate_boolean}),
- ('Leave comment elements in the document tree. (default)',
- ['--leave-comments'],
- {'action': 'store_false', 'dest': 'strip_comments'}),
- ('Remove all elements with classes="" from the document tree. '
- 'Warning: potentially dangerous; use with caution. '
- '(Multiple-use option.)',
- ['--strip-elements-with-class'],
- {'action': 'append', 'dest': 'strip_elements_with_classes',
- 'metavar': '', 'validator': validate_strip_class}),
- ('Remove all classes="" attributes from elements in the '
- 'document tree. Warning: potentially dangerous; use with caution. '
- '(Multiple-use option.)',
- ['--strip-class'],
- {'action': 'append', 'dest': 'strip_classes',
- 'metavar': '', 'validator': validate_strip_class}),
- ('Report system messages at or higher than : "info" or "1", '
- '"warning"/"2" (default), "error"/"3", "severe"/"4", "none"/"5"',
- ['--report', '-r'], {'choices': threshold_choices, 'default': 2,
- 'dest': 'report_level', 'metavar': '',
- 'validator': validate_threshold}),
- ('Report all system messages. (Same as "--report=1".)',
- ['--verbose', '-v'], {'action': 'store_const', 'const': 1,
- 'dest': 'report_level'}),
- ('Report no system messages. (Same as "--report=5".)',
- ['--quiet', '-q'], {'action': 'store_const', 'const': 5,
- 'dest': 'report_level'}),
- ('Halt execution at system messages at or above . '
- 'Levels as in --report. Default: 4 (severe).',
- ['--halt'], {'choices': threshold_choices, 'dest': 'halt_level',
- 'default': 4, 'metavar': '',
- 'validator': validate_threshold}),
- ('Halt at the slightest problem. Same as "--halt=info".',
- ['--strict'], {'action': 'store_const', 'const': 1,
- 'dest': 'halt_level'}),
- ('Enable a non-zero exit status for non-halting system messages at '
- 'or above . Default: 5 (disabled).',
- ['--exit-status'], {'choices': threshold_choices,
- 'dest': 'exit_status_level',
- 'default': 5, 'metavar': '',
- 'validator': validate_threshold}),
- ('Enable debug-level system messages and diagnostics.',
- ['--debug'], {'action': 'store_true',
- 'validator': validate_boolean}),
- ('Disable debug output. (default)',
- ['--no-debug'], {'action': 'store_false', 'dest': 'debug'}),
- ('Send the output of system messages to .',
- ['--warnings'], {'dest': 'warning_stream', 'metavar': ''}),
- ('Enable Python tracebacks when Docutils is halted.',
- ['--traceback'], {'action': 'store_true', 'default': None,
- 'validator': validate_boolean}),
- ('Disable Python tracebacks. (default)',
- ['--no-traceback'], {'dest': 'traceback', 'action': 'store_false'}),
- ('Specify the encoding and optionally the '
- 'error handler of input text. Default: :strict.',
- ['--input-encoding', '-i'],
- {'metavar': '',
- 'validator': validate_encoding_and_error_handler}),
- ('Specify the error handler for undecodable characters. '
- 'Choices: "strict" (default), "ignore", and "replace".',
- ['--input-encoding-error-handler'],
- {'default': 'strict', 'validator': validate_encoding_error_handler}),
- ('Specify the text encoding and optionally the error handler for '
- 'output. Default: utf-8:strict.',
- ['--output-encoding', '-o'],
- {'metavar': '', 'default': 'utf-8',
- 'validator': validate_encoding_and_error_handler}),
- ('Specify error handler for unencodable output characters; '
- '"strict" (default), "ignore", "replace", '
- '"xmlcharrefreplace", "backslashreplace".',
- ['--output-encoding-error-handler'],
- {'default': 'strict', 'validator': validate_encoding_error_handler}),
- ('Specify text encoding and optionally error handler '
- 'for error output. Default: %s:%s.'
- % (default_error_encoding, default_error_encoding_error_handler),
- ['--error-encoding', '-e'],
- {'metavar': '', 'default': default_error_encoding,
- 'validator': validate_encoding_and_error_handler}),
- ('Specify the error handler for unencodable characters in '
- 'error output. Default: %s.'
- % default_error_encoding_error_handler,
- ['--error-encoding-error-handler'],
- {'default': default_error_encoding_error_handler,
- 'validator': validate_encoding_error_handler}),
- ('Specify the language (as BCP 47 language tag). Default: en.',
- ['--language', '-l'], {'dest': 'language_code', 'default': 'en',
- 'metavar': ''}),
- ('Write output file dependencies to .',
- ['--record-dependencies'],
- {'metavar': '', 'validator': validate_dependency_file,
- 'default': None}), # default set in Values class
- ('Read configuration settings from , if it exists.',
- ['--config'], {'metavar': '', 'type': 'string',
- 'action': 'callback', 'callback': read_config_file}),
- ("Show this program's version number and exit.",
- ['--version', '-V'], {'action': 'version'}),
- ('Show this help message and exit.',
- ['--help', '-h'], {'action': 'help'}),
- # Typically not useful for non-programmatical use:
- (SUPPRESS_HELP, ['--id-prefix'], {'default': ''}),
- (SUPPRESS_HELP, ['--auto-id-prefix'], {'default': '%'}),
- # Hidden options, for development use only:
- (SUPPRESS_HELP, ['--dump-settings'], {'action': 'store_true'}),
- (SUPPRESS_HELP, ['--dump-internals'], {'action': 'store_true'}),
- (SUPPRESS_HELP, ['--dump-transforms'], {'action': 'store_true'}),
- (SUPPRESS_HELP, ['--dump-pseudo-xml'], {'action': 'store_true'}),
- (SUPPRESS_HELP, ['--expose-internal-attribute'],
- {'action': 'append', 'dest': 'expose_internals',
- 'validator': validate_colon_separated_string_list}),
- (SUPPRESS_HELP, ['--strict-visitor'], {'action': 'store_true'}),
- ))
- """Runtime settings and command-line options common to all Docutils front
- ends. Setting specs specific to individual Docutils components are also
- used (see `populate_from_components()`)."""
-
- settings_defaults = {'_disable_config': None,
- '_source': None,
- '_destination': None,
- '_config_files': None}
- """Defaults for settings without command-line option equivalents.
-
- See https://docutils.sourceforge.io/docs/user/config.html#internal-settings
- """
-
- config_section = 'general'
-
- version_template = ('%%prog (Docutils %s%s, Python %s, on %s)'
- % (docutils.__version__,
- docutils.__version_details__
- and ' [%s]'%docutils.__version_details__ or '',
- sys.version.split()[0], sys.platform))
- """Default version message."""
-
- def __init__(self, components=(), defaults=None, read_config_files=False,
- *args, **kwargs):
- """Set up OptionParser instance.
-
- `components` is a list of Docutils components each containing a
- ``.settings_spec`` attribute.
- `defaults` is a mapping of setting default overrides.
- """
-
- self.lists = {}
- """Set of list-type settings."""
-
- self.config_files = []
- """List of paths of applied configuration files."""
-
- self.relative_path_settings = ['warning_stream'] # will be modified
-
- warnings.warn('The frontend.OptionParser class will be replaced '
- 'by a subclass of argparse.ArgumentParser '
- 'in Docutils 0.21 or later.',
- DeprecationWarning, stacklevel=2)
- super().__init__(option_class=Option, add_help_option=None,
- formatter=optparse.TitledHelpFormatter(width=78),
- *args, **kwargs)
- if not self.version:
- self.version = self.version_template
- self.components = (self, *components)
- self.populate_from_components(self.components)
- self.defaults.update(defaults or {})
- if read_config_files and not self.defaults['_disable_config']:
- try:
- config_settings = self.get_standard_config_settings()
- except ValueError as err:
- self.error(err)
- self.defaults.update(config_settings.__dict__)
-
- def populate_from_components(self, components):
- """Collect settings specification from components.
-
- For each component, populate from the `SettingsSpec.settings_spec`
- structure, then from the `SettingsSpec.settings_defaults` dictionary.
- After all components have been processed, check for and populate from
- each component's `SettingsSpec.settings_default_overrides` dictionary.
- """
- for component in components:
- if component is None:
- continue
- settings_spec = component.settings_spec
- self.relative_path_settings.extend(
- component.relative_path_settings)
- for i in range(0, len(settings_spec), 3):
- title, description, option_spec = settings_spec[i:i+3]
- if title:
- group = optparse.OptionGroup(self, title, description)
- self.add_option_group(group)
- else:
- group = self # single options
- for (help_text, option_strings, kwargs) in option_spec:
- option = group.add_option(help=help_text, *option_strings,
- **kwargs)
- if kwargs.get('action') == 'append':
- self.lists[option.dest] = True
- if component.settings_defaults:
- self.defaults.update(component.settings_defaults)
- for component in components:
- if component and component.settings_default_overrides:
- self.defaults.update(component.settings_default_overrides)
-
- @classmethod
- def get_standard_config_files(cls):
- """Return list of config files, from environment or standard."""
- if 'DOCUTILSCONFIG' in os.environ:
- config_files = os.environ['DOCUTILSCONFIG'].split(os.pathsep)
- else:
- config_files = cls.standard_config_files
- return [os.path.expanduser(f) for f in config_files if f.strip()]
-
- def get_standard_config_settings(self):
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore', category=DeprecationWarning)
- settings = Values()
- for filename in self.get_standard_config_files():
- settings.update(self.get_config_file_settings(filename), self)
- return settings
-
- def get_config_file_settings(self, config_file):
- """Returns a dictionary containing appropriate config file settings."""
- config_parser = ConfigParser()
- # parse config file, add filename if found and successfully read.
- applied = set()
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore', category=DeprecationWarning)
- self.config_files += config_parser.read(config_file, self)
- settings = Values()
- for component in self.components:
- if not component:
- continue
- for section in (tuple(component.config_section_dependencies or ())
- + (component.config_section,)):
- if section in applied:
- continue
- applied.add(section)
- if config_parser.has_section(section):
- settings.update(config_parser[section], self)
- make_paths_absolute(settings.__dict__,
- self.relative_path_settings,
- os.path.dirname(config_file))
- return settings.__dict__
-
- def check_values(self, values, args):
- """Store positional arguments as runtime settings."""
- values._source, values._destination = self.check_args(args)
- make_paths_absolute(values.__dict__, self.relative_path_settings)
- values._config_files = self.config_files
- return values
-
- def check_args(self, args):
- source = destination = None
- if args:
- source = args.pop(0)
- if source == '-': # means stdin
- source = None
- if args:
- destination = args.pop(0)
- if destination == '-': # means stdout
- destination = None
- if args:
- self.error('Maximum 2 arguments allowed.')
- if source and source == destination:
- self.error('Do not specify the same file for both source and '
- 'destination. It will clobber the source file.')
- return source, destination
-
- def set_defaults_from_dict(self, defaults):
- # deprecated, will be removed
- warnings.warn('OptionParser.set_defaults_from_dict() will be removed '
- 'in Docutils 0.22 or with the switch to ArgumentParser.',
- DeprecationWarning, stacklevel=2)
- self.defaults.update(defaults)
-
- def get_default_values(self):
- """Needed to get custom `Values` instances."""
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore', category=DeprecationWarning)
- defaults = Values(self.defaults)
- defaults._config_files = self.config_files
- return defaults
-
- def get_option_by_dest(self, dest):
- """
- Get an option by its dest.
-
- If you're supplying a dest which is shared by several options,
- it is undefined which option of those is returned.
-
- A KeyError is raised if there is no option with the supplied
- dest.
- """
- for group in self.option_groups + [self]:
- for option in group.option_list:
- if option.dest == dest:
- return option
- raise KeyError('No option with dest == %r.' % dest)
-
-
-class ConfigParser(configparser.RawConfigParser):
- """Parser for Docutils configuration files.
-
- See https://docutils.sourceforge.io/docs/user/config.html.
-
- Option key normalization includes conversion of '-' to '_'.
-
- Config file encoding is "utf-8". Encoding errors are reported
- and the affected file(s) skipped.
-
- This class is provisional and will change in future versions.
- """
-
- old_settings = {
- 'pep_stylesheet': ('pep_html writer', 'stylesheet'),
- 'pep_stylesheet_path': ('pep_html writer', 'stylesheet_path'),
- 'pep_template': ('pep_html writer', 'template')}
- """{old setting: (new section, new setting)} mapping, used by
- `handle_old_config`, to convert settings from the old [options] section.
- """
-
- old_warning = (
- 'The "[option]" section is deprecated.\n'
- 'Support for old-format configuration files will be removed in '
- 'Docutils 2.0. Please revise your configuration files. '
- 'See , '
- 'section "Old-Format Configuration Files".')
-
- not_utf8_error = """\
-Unable to read configuration file "%s": content not encoded as UTF-8.
-Skipping "%s" configuration file.
-"""
-
- def read(self, filenames, option_parser=None):
- # Currently, if a `docutils.frontend.OptionParser` instance is
- # supplied, setting values are validated.
- if option_parser is not None:
- warnings.warn('frontend.ConfigParser.read(): parameter '
- '"option_parser" will be removed '
- 'in Docutils 0.21 or later.',
- DeprecationWarning, stacklevel=2)
- read_ok = []
- if isinstance(filenames, str):
- filenames = [filenames]
- for filename in filenames:
- # Config files are UTF-8-encoded:
- try:
- read_ok += super().read(filename, encoding='utf-8')
- except UnicodeDecodeError:
- sys.stderr.write(self.not_utf8_error % (filename, filename))
- continue
- if 'options' in self:
- self.handle_old_config(filename)
- if option_parser is not None:
- self.validate_settings(filename, option_parser)
- return read_ok
-
- def handle_old_config(self, filename):
- warnings.warn_explicit(self.old_warning, ConfigDeprecationWarning,
- filename, 0)
- options = self.get_section('options')
- if not self.has_section('general'):
- self.add_section('general')
- for key, value in options.items():
- if key in self.old_settings:
- section, setting = self.old_settings[key]
- if not self.has_section(section):
- self.add_section(section)
- else:
- section = 'general'
- setting = key
- if not self.has_option(section, setting):
- self.set(section, setting, value)
- self.remove_section('options')
-
- def validate_settings(self, filename, option_parser):
- """
- Call the validator function and implement overrides on all applicable
- settings.
- """
- for section in self.sections():
- for setting in self.options(section):
- try:
- option = option_parser.get_option_by_dest(setting)
- except KeyError:
- continue
- if option.validator:
- value = self.get(section, setting)
- try:
- new_value = option.validator(
- setting, value, option_parser,
- config_parser=self, config_section=section)
- except Exception as err:
- raise ValueError(f'Error in config file "{filename}", '
- f'section "[{section}]":\n'
- f' {io.error_string(err)}\n'
- f' {setting} = {value}')
- self.set(section, setting, new_value)
- if option.overrides:
- self.set(section, option.overrides, None)
-
- def optionxform(self, optionstr):
- """
- Lowercase and transform '-' to '_'.
-
- So the cmdline form of option names can be used in config files.
- """
- return optionstr.lower().replace('-', '_')
-
- def get_section(self, section):
- """
- Return a given section as a dictionary.
-
- Return empty dictionary if the section doesn't exist.
-
- Deprecated. Use the configparser "Mapping Protocol Access" and
- catch KeyError.
- """
- warnings.warn('frontend.OptionParser.get_section() '
- 'will be removed in Docutils 0.21 or later.',
- DeprecationWarning, stacklevel=2)
- try:
- return dict(self[section])
- except KeyError:
- return {}
-
-
-class ConfigDeprecationWarning(FutureWarning):
- """Warning for deprecated configuration file features."""
-
-
-def get_default_settings(*components):
- """Return default runtime settings for `components`.
-
- Return a `frontend.Values` instance with defaults for generic Docutils
- settings and settings from the `components` (`SettingsSpec` instances).
-
- This corresponds to steps 1 and 2 in the `runtime settings priority`__.
-
- __ https://docutils.sourceforge.io/docs/api/runtime-settings.html
- #settings-priority
- """
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore', category=DeprecationWarning)
- return OptionParser(components).get_default_values()
diff --git a/release_env/lib/python3.12/site-packages/docutils/io.py b/release_env/lib/python3.12/site-packages/docutils/io.py
deleted file mode 100644
index 6237c66ae..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/io.py
+++ /dev/null
@@ -1,637 +0,0 @@
-# $Id: io.py 9427 2023-07-07 06:50:09Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-I/O classes provide a uniform API for low-level input and output. Subclasses
-exist for a variety of input/output mechanisms.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import codecs
-import locale
-import os
-import re
-import sys
-import warnings
-
-from docutils import TransformSpec
-
-
-# Guess the locale's preferred encoding.
-# If no valid guess can be made, _locale_encoding is set to `None`:
-#
-# TODO: check whether this is set correctly with every OS and Python version
-# or whether front-end tools need to call `locale.setlocale()`
-# before importing this module
-try:
- # Return locale encoding also in UTF-8 mode
- with warnings.catch_warnings():
- warnings.simplefilter("ignore")
- _locale_encoding = (locale.getlocale()[1]
- or locale.getdefaultlocale()[1])
- _locale_encoding = _locale_encoding.lower()
-except: # noqa any other problems determining the locale -> use None
- _locale_encoding = None
-try:
- codecs.lookup(_locale_encoding)
-except (LookupError, TypeError):
- _locale_encoding = None
-
-
-class InputError(OSError): pass
-class OutputError(OSError): pass
-
-
-def check_encoding(stream, encoding):
- """Test, whether the encoding of `stream` matches `encoding`.
-
- Returns
-
- :None: if `encoding` or `stream.encoding` are not a valid encoding
- argument (e.g. ``None``) or `stream.encoding is missing.
- :True: if the encoding argument resolves to the same value as `encoding`,
- :False: if the encodings differ.
- """
- try:
- return codecs.lookup(stream.encoding) == codecs.lookup(encoding)
- except (LookupError, AttributeError, TypeError):
- return None
-
-
-def error_string(err):
- """Return string representation of Exception `err`.
- """
- return f'{err.__class__.__name__}: {err}'
-
-
-class Input(TransformSpec):
- """
- Abstract base class for input wrappers.
-
- Docutils input objects must provide a `read()` method that
- returns the source, typically as `str` instance.
-
- Inheriting `TransformSpec` allows input objects to add
- "transforms" and "unknown_reference_resolvers" to the "Transformer".
- (Optional for custom input objects since Docutils 0.19.)
- """
-
- component_type = 'input'
-
- default_source_path = None
-
- def __init__(self, source=None, source_path=None, encoding=None,
- error_handler='strict'):
- self.encoding = encoding
- """Text encoding for the input source."""
-
- self.error_handler = error_handler
- """Text decoding error handler."""
-
- self.source = source
- """The source of input data."""
-
- self.source_path = source_path
- """A text reference to the source."""
-
- if not source_path:
- self.source_path = self.default_source_path
-
- self.successful_encoding = None
- """The encoding that successfully decoded the source data."""
-
- def __repr__(self):
- return '%s: source=%r, source_path=%r' % (self.__class__, self.source,
- self.source_path)
-
- def read(self):
- """Return input as `str`. Define in subclasses."""
- raise NotImplementedError
-
- def decode(self, data):
- """
- Decode `data` if required.
-
- Return Unicode `str` instances unchanged (nothing to decode).
-
- If `self.encoding` is None, determine encoding from data
- or try UTF-8 and the locale's preferred encoding.
- The client application should call ``locale.setlocale()`` at the
- beginning of processing::
-
- locale.setlocale(locale.LC_ALL, '')
-
- Raise UnicodeError if unsuccessful.
-
- Provisional: encoding detection will be removed in Docutils 1.0.
- """
- if self.encoding and self.encoding.lower() == 'unicode':
- assert isinstance(data, str), ('input encoding is "unicode" '
- 'but `data` is no `str` instance')
- if isinstance(data, str):
- # nothing to decode
- return data
- if self.encoding:
- # We believe the user/application when the encoding is
- # explicitly given.
- encoding_candidates = [self.encoding]
- else:
- data_encoding = self.determine_encoding_from_data(data)
- if data_encoding:
- # `data` declares its encoding with "magic comment" or BOM,
- encoding_candidates = [data_encoding]
- else:
- # Apply heuristics if the encoding is not specified.
- # Start with UTF-8, because that only matches
- # data that *IS* UTF-8:
- encoding_candidates = ['utf-8']
- # If UTF-8 fails, fall back to the locale's preferred encoding:
- fallback = locale.getpreferredencoding(do_setlocale=False)
- if fallback and fallback.lower() != 'utf-8':
- encoding_candidates.append(fallback)
- for enc in encoding_candidates:
- try:
- decoded = str(data, enc, self.error_handler)
- self.successful_encoding = enc
- return decoded
- except (UnicodeError, LookupError) as err:
- # keep exception instance for use outside of the "for" loop.
- error = err
- raise UnicodeError(
- 'Unable to decode input data. Tried the following encodings: '
- f'{", ".join(repr(enc) for enc in encoding_candidates)}.\n'
- f'({error_string(error)})')
-
- coding_slug = re.compile(br"coding[:=]\s*([-\w.]+)")
- """Encoding declaration pattern."""
-
- byte_order_marks = ((codecs.BOM_UTF32_BE, 'utf-32'),
- (codecs.BOM_UTF32_LE, 'utf-32'),
- (codecs.BOM_UTF8, 'utf-8-sig'),
- (codecs.BOM_UTF16_BE, 'utf-16'),
- (codecs.BOM_UTF16_LE, 'utf-16'),
- )
- """Sequence of (start_bytes, encoding) tuples for encoding detection.
- The first bytes of input data are checked against the start_bytes strings.
- A match indicates the given encoding."""
-
- def determine_encoding_from_data(self, data):
- """
- Try to determine the encoding of `data` by looking *in* `data`.
- Check for a byte order mark (BOM) or an encoding declaration.
- """
- # check for a byte order mark:
- for start_bytes, encoding in self.byte_order_marks:
- if data.startswith(start_bytes):
- return encoding
- # check for an encoding declaration pattern in first 2 lines of file:
- for line in data.splitlines()[:2]:
- match = self.coding_slug.search(line)
- if match:
- return match.group(1).decode('ascii')
- return None
-
- def isatty(self):
- """Return True, if the input source is connected to a TTY device."""
- try:
- return self.source.isatty()
- except AttributeError:
- return False
-
-
-class Output(TransformSpec):
- """
- Abstract base class for output wrappers.
-
- Docutils output objects must provide a `write()` method that
- expects and handles one argument (the output).
-
- Inheriting `TransformSpec` allows output objects to add
- "transforms" and "unknown_reference_resolvers" to the "Transformer".
- (Optional for custom output objects since Docutils 0.19.)
- """
-
- component_type = 'output'
-
- default_destination_path = None
-
- def __init__(self, destination=None, destination_path=None,
- encoding=None, error_handler='strict'):
- self.encoding = encoding
- """Text encoding for the output destination."""
-
- self.error_handler = error_handler or 'strict'
- """Text encoding error handler."""
-
- self.destination = destination
- """The destination for output data."""
-
- self.destination_path = destination_path
- """A text reference to the destination."""
-
- if not destination_path:
- self.destination_path = self.default_destination_path
-
- def __repr__(self):
- return ('%s: destination=%r, destination_path=%r'
- % (self.__class__, self.destination, self.destination_path))
-
- def write(self, data):
- """Write `data`. Define in subclasses."""
- raise NotImplementedError
-
- def encode(self, data):
- """
- Encode and return `data`.
-
- If `data` is a `bytes` instance, it is returned unchanged.
- Otherwise it is encoded with `self.encoding`.
-
- Provisional: If `self.encoding` is set to the pseudo encoding name
- "unicode", `data` must be a `str` instance and is returned unchanged.
- """
- if self.encoding and self.encoding.lower() == 'unicode':
- assert isinstance(data, str), ('output encoding is "unicode" '
- 'but `data` is no `str` instance')
- return data
- if not isinstance(data, str):
- # Non-unicode (e.g. bytes) output.
- return data
- else:
- return data.encode(self.encoding, self.error_handler)
-
-
-class ErrorOutput:
- """
- Wrapper class for file-like error streams with
- failsafe de- and encoding of `str`, `bytes`, `unicode` and
- `Exception` instances.
- """
-
- def __init__(self, destination=None, encoding=None,
- encoding_errors='backslashreplace',
- decoding_errors='replace'):
- """
- :Parameters:
- - `destination`: a file-like object,
- a string (path to a file),
- `None` (write to `sys.stderr`, default), or
- evaluating to `False` (write() requests are ignored).
- - `encoding`: `destination` text encoding. Guessed if None.
- - `encoding_errors`: how to treat encoding errors.
- """
- if destination is None:
- destination = sys.stderr
- elif not destination:
- destination = False
- # if `destination` is a file name, open it
- elif isinstance(destination, str):
- destination = open(destination, 'w')
-
- self.destination = destination
- """Where warning output is sent."""
-
- self.encoding = (encoding or getattr(destination, 'encoding', None)
- or _locale_encoding or 'ascii')
- """The output character encoding."""
-
- self.encoding_errors = encoding_errors
- """Encoding error handler."""
-
- self.decoding_errors = decoding_errors
- """Decoding error handler."""
-
- def write(self, data):
- """
- Write `data` to self.destination. Ignore, if self.destination is False.
-
- `data` can be a `bytes`, `str`, or `Exception` instance.
- """
- if not self.destination:
- return
- if isinstance(data, Exception):
- data = str(data)
- try:
- self.destination.write(data)
- except UnicodeEncodeError:
- self.destination.write(data.encode(self.encoding,
- self.encoding_errors))
- except TypeError:
- if isinstance(data, str): # destination may expect bytes
- self.destination.write(data.encode(self.encoding,
- self.encoding_errors))
- elif self.destination in (sys.stderr, sys.stdout):
- # write bytes to raw stream
- self.destination.buffer.write(data)
- else:
- self.destination.write(str(data, self.encoding,
- self.decoding_errors))
-
- def close(self):
- """
- Close the error-output stream.
-
- Ignored if the destination is` sys.stderr` or `sys.stdout` or has no
- close() method.
- """
- if self.destination in (sys.stdout, sys.stderr):
- return
- try:
- self.destination.close()
- except AttributeError:
- pass
-
- def isatty(self):
- """Return True, if the destination is connected to a TTY device."""
- try:
- return self.destination.isatty()
- except AttributeError:
- return False
-
-
-class FileInput(Input):
-
- """
- Input for single, simple file-like objects.
- """
- def __init__(self, source=None, source_path=None,
- encoding=None, error_handler='strict',
- autoclose=True, mode='r'):
- """
- :Parameters:
- - `source`: either a file-like object (which is read directly), or
- `None` (which implies `sys.stdin` if no `source_path` given).
- - `source_path`: a path to a file, which is opened for reading.
- - `encoding`: the expected text encoding of the input file.
- - `error_handler`: the encoding error handler to use.
- - `autoclose`: close automatically after read (except when
- `sys.stdin` is the source).
- - `mode`: how the file is to be opened (see standard function
- `open`). The default is read only ('r').
- """
- Input.__init__(self, source, source_path, encoding, error_handler)
- self.autoclose = autoclose
- self._stderr = ErrorOutput()
-
- if source is None:
- if source_path:
- try:
- self.source = open(source_path, mode,
- encoding=self.encoding,
- errors=self.error_handler)
- except OSError as error:
- raise InputError(error.errno, error.strerror, source_path)
- else:
- self.source = sys.stdin
- elif check_encoding(self.source, self.encoding) is False:
- # TODO: re-open, warn or raise error?
- raise UnicodeError('Encoding clash: encoding given is "%s" '
- 'but source is opened with encoding "%s".' %
- (self.encoding, self.source.encoding))
- if not source_path:
- try:
- self.source_path = self.source.name
- except AttributeError:
- pass
-
- def read(self):
- """
- Read and decode a single file, return as `str`.
- """
- try:
- if not self.encoding and hasattr(self.source, 'buffer'):
- # read as binary data
- data = self.source.buffer.read()
- # decode with heuristics
- data = self.decode(data)
- # normalize newlines
- data = '\n'.join(data.splitlines()+[''])
- else:
- data = self.source.read()
- finally:
- if self.autoclose:
- self.close()
- return data
-
- def readlines(self):
- """
- Return lines of a single file as list of strings.
- """
- return self.read().splitlines(True)
-
- def close(self):
- if self.source is not sys.stdin:
- self.source.close()
-
-
-class FileOutput(Output):
-
- """Output for single, simple file-like objects."""
-
- default_destination_path = ''
-
- mode = 'w'
- """The mode argument for `open()`."""
- # 'wb' for binary (e.g. OpenOffice) files (see also `BinaryFileOutput`).
- # (Do not use binary mode ('wb') for text files, as this prevents the
- # conversion of newlines to the system specific default.)
-
- def __init__(self, destination=None, destination_path=None,
- encoding=None, error_handler='strict', autoclose=True,
- handle_io_errors=None, mode=None):
- """
- :Parameters:
- - `destination`: either a file-like object (which is written
- directly) or `None` (which implies `sys.stdout` if no
- `destination_path` given).
- - `destination_path`: a path to a file, which is opened and then
- written.
- - `encoding`: the text encoding of the output file.
- - `error_handler`: the encoding error handler to use.
- - `autoclose`: close automatically after write (except when
- `sys.stdout` or `sys.stderr` is the destination).
- - `handle_io_errors`: ignored, deprecated, will be removed.
- - `mode`: how the file is to be opened (see standard function
- `open`). The default is 'w', providing universal newline
- support for text files.
- """
- Output.__init__(self, destination, destination_path,
- encoding, error_handler)
- self.opened = True
- self.autoclose = autoclose
- if handle_io_errors is not None:
- warnings.warn('io.FileOutput: init argument "handle_io_errors" '
- 'is ignored and will be removed in '
- 'Docutils 2.0.', DeprecationWarning, stacklevel=2)
- if mode is not None:
- self.mode = mode
- self._stderr = ErrorOutput()
- if destination is None:
- if destination_path:
- self.opened = False
- else:
- self.destination = sys.stdout
- elif ( # destination is file-type object -> check mode:
- mode and hasattr(self.destination, 'mode')
- and mode != self.destination.mode):
- print('Warning: Destination mode "%s" differs from specified '
- 'mode "%s"' % (self.destination.mode, mode),
- file=self._stderr)
- if not destination_path:
- try:
- self.destination_path = self.destination.name
- except AttributeError:
- pass
-
- def open(self):
- # Specify encoding
- if 'b' not in self.mode:
- kwargs = {'encoding': self.encoding,
- 'errors': self.error_handler}
- else:
- kwargs = {}
- try:
- self.destination = open(self.destination_path, self.mode, **kwargs)
- except OSError as error:
- raise OutputError(error.errno, error.strerror,
- self.destination_path)
- self.opened = True
-
- def write(self, data):
- """Write `data` to a single file, also return it.
-
- `data` can be a `str` or `bytes` instance.
- If writing `bytes` fails, an attempt is made to write to
- the low-level interface ``self.destination.buffer``.
-
- If `data` is a `str` instance and `self.encoding` and
- `self.destination.encoding` are set to different values, `data`
- is encoded to a `bytes` instance using `self.encoding`.
-
- Provisional: future versions may raise an error if `self.encoding`
- and `self.destination.encoding` are set to different values.
- """
- if not self.opened:
- self.open()
- if (isinstance(data, str)
- and check_encoding(self.destination, self.encoding) is False):
- if os.linesep != '\n':
- data = data.replace('\n', os.linesep) # fix endings
- data = self.encode(data)
-
- try:
- self.destination.write(data)
- except TypeError as err:
- if isinstance(data, bytes):
- try:
- self.destination.buffer.write(data)
- except AttributeError:
- if check_encoding(self.destination,
- self.encoding) is False:
- raise ValueError(
- f'Encoding of {self.destination_path} '
- f'({self.destination.encoding}) differs \n'
- f' from specified encoding ({self.encoding})')
- else:
- raise err
- except (UnicodeError, LookupError) as err:
- raise UnicodeError(
- 'Unable to encode output data. output-encoding is: '
- f'{self.encoding}.\n({error_string(err)})')
- finally:
- if self.autoclose:
- self.close()
- return data
-
- def close(self):
- if self.destination not in (sys.stdout, sys.stderr):
- self.destination.close()
- self.opened = False
-
-
-class BinaryFileOutput(FileOutput):
- """
- A version of docutils.io.FileOutput which writes to a binary file.
- """
- # Used by core.publish_cmdline_to_binary() which in turn is used by
- # tools/rst2odt.py but not by core.rst2odt().
- mode = 'wb'
-
-
-class StringInput(Input):
- """Input from a `str` or `bytes` instance."""
-
- default_source_path = ''
-
- def read(self):
- """Return the source as `str` instance.
-
- Decode, if required (see `Input.decode`).
- """
- return self.decode(self.source)
-
-
-class StringOutput(Output):
- """Output to a `bytes` or `str` instance.
-
- Provisional.
- """
-
- default_destination_path = ''
-
- def write(self, data):
- """Store `data` in `self.destination`, and return it.
-
- If `self.encoding` is set to the pseudo encoding name "unicode",
- `data` must be a `str` instance and is stored/returned unchanged
- (cf. `Output.encode`).
-
- Otherwise, `data` can be a `bytes` or `str` instance and is
- stored/returned as a `bytes` instance
- (`str` data is encoded with `self.encode()`).
-
- Attention: the `output_encoding`_ setting may affect the content
- of the output (e.g. an encoding declaration in HTML or XML or the
- representation of characters as LaTeX macro vs. literal character).
- """
- self.destination = self.encode(data)
- return self.destination
-
-
-class NullInput(Input):
-
- """Degenerate input: read nothing."""
-
- default_source_path = 'null input'
-
- def read(self):
- """Return an empty string."""
- return ''
-
-
-class NullOutput(Output):
-
- """Degenerate output: write nothing."""
-
- default_destination_path = 'null output'
-
- def write(self, data):
- """Do nothing, return None."""
- pass
-
-
-class DocTreeInput(Input):
-
- """
- Adapter for document tree input.
-
- The document tree must be passed in the ``source`` parameter.
- """
-
- default_source_path = 'doctree input'
-
- def read(self):
- """Return the document tree."""
- return self.source
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/__init__.py b/release_env/lib/python3.12/site-packages/docutils/languages/__init__.py
deleted file mode 100644
index 1bf431290..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/__init__.py
+++ /dev/null
@@ -1,83 +0,0 @@
-# $Id: __init__.py 9030 2022-03-05 23:28:32Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-# Internationalization details are documented in
-# .
-
-"""
-This package contains modules for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-from importlib import import_module
-
-from docutils.utils import normalize_language_tag
-
-
-class LanguageImporter:
- """Import language modules.
-
- When called with a BCP 47 language tag, instances return a module
- with localisations from `docutils.languages` or the PYTHONPATH.
-
- If there is no matching module, warn (if a `reporter` is passed)
- and fall back to English.
- """
- packages = ('docutils.languages.', '')
- warn_msg = ('Language "%s" not supported: '
- 'Docutils-generated text will be in English.')
- fallback = 'en'
- # TODO: use a dummy module returning empty strings?, configurable?
-
- def __init__(self):
- self.cache = {}
-
- def import_from_packages(self, name, reporter=None):
- """Try loading module `name` from `self.packages`."""
- module = None
- for package in self.packages:
- try:
- module = import_module(package+name)
- self.check_content(module)
- except (ImportError, AttributeError):
- if reporter and module:
- reporter.info(f'{module} is no complete '
- 'Docutils language module.')
- elif reporter:
- reporter.info(f'Module "{package+name}" not found.')
- continue
- break
- return module
-
- def check_content(self, module):
- """Check if we got a Docutils language module."""
- if not (isinstance(module.labels, dict)
- and isinstance(module.bibliographic_fields, dict)
- and isinstance(module.author_separators, list)):
- raise ImportError
-
- def __call__(self, language_code, reporter=None):
- try:
- return self.cache[language_code]
- except KeyError:
- pass
- for tag in normalize_language_tag(language_code):
- tag = tag.replace('-', '_') # '-' not valid in module names
- module = self.import_from_packages(tag, reporter)
- if module is not None:
- break
- else:
- if reporter:
- reporter.warning(self.warn_msg % language_code)
- if self.fallback:
- module = self.import_from_packages(self.fallback)
- if reporter and (language_code != 'en'):
- reporter.info('Using %s for language "%s".'
- % (module, language_code))
- self.cache[language_code] = module
- return module
-
-
-get_language = LanguageImporter()
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/af.py b/release_env/lib/python3.12/site-packages/docutils/languages/af.py
deleted file mode 100644
index b78f3f7d9..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/af.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# $Id: af.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Jannie Hofmeyr
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Afrikaans-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'author': 'Auteur',
- 'authors': 'Auteurs',
- 'organization': 'Organisasie',
- 'address': 'Adres',
- 'contact': 'Kontak',
- 'version': 'Weergawe',
- 'revision': 'Revisie',
- 'status': 'Status',
- 'date': 'Datum',
- 'copyright': 'Kopiereg',
- 'dedication': 'Opdrag',
- 'abstract': 'Opsomming',
- 'attention': 'Aandag!',
- 'caution': 'Wees versigtig!',
- 'danger': '!GEVAAR!',
- 'error': 'Fout',
- 'hint': 'Wenk',
- 'important': 'Belangrik',
- 'note': 'Nota',
- 'tip': 'Tip', # hint and tip both have the same translation: wenk
- 'warning': 'Waarskuwing',
- 'contents': 'Inhoud'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- 'auteur': 'author',
- 'auteurs': 'authors',
- 'organisasie': 'organization',
- 'adres': 'address',
- 'kontak': 'contact',
- 'weergawe': 'version',
- 'revisie': 'revision',
- 'status': 'status',
- 'datum': 'date',
- 'kopiereg': 'copyright',
- 'opdrag': 'dedication',
- 'opsomming': 'abstract'}
-"""Afrikaans (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/ar.py b/release_env/lib/python3.12/site-packages/docutils/languages/ar.py
deleted file mode 100644
index d6aebd0b1..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/ar.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: fa.py 4564 2016-08-10 11:48:42Z
-# Author: Shahin
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Arabic-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'المؤلف',
- 'authors': 'المؤلفون',
- 'organization': 'التنظيم',
- 'address': 'العنوان',
- 'contact': 'اتصل',
- 'version': 'نسخة',
- 'revision': 'مراجعة',
- 'status': 'الحالة',
- 'date': 'تاریخ',
- 'copyright': 'الحقوق',
- 'dedication': 'إهداء',
- 'abstract': 'ملخص',
- 'attention': 'تنبيه',
- 'caution': 'احتیاط',
- 'danger': 'خطر',
- 'error': 'خطأ',
- 'hint': 'تلميح',
- 'important': 'مهم',
- 'note': 'ملاحظة',
- 'tip': 'نصيحة',
- 'warning': 'تحذير',
- 'contents': 'المحتوى'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'مؤلف': 'author',
- 'مؤلفون': 'authors',
- 'التنظيم': 'organization',
- 'العنوان': 'address',
- 'اتصل': 'contact',
- 'نسخة': 'version',
- 'مراجعة': 'revision',
- 'الحالة': 'status',
- 'تاریخ': 'date',
- 'الحقوق': 'copyright',
- 'إهداء': 'dedication',
- 'ملخص': 'abstract'}
-"""Arabic (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = ['؛', '،']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/ca.py b/release_env/lib/python3.12/site-packages/docutils/languages/ca.py
deleted file mode 100644
index d5faf39aa..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/ca.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# $Id: ca.py 9457 2023-10-02 16:25:50Z milde $
-# Authors: Ivan Vilata i Balaguer ;
-# Antoni Bella Pérez
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation,
-# please read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-# These translations can be used without changes for
-# Valencian variant of Catalan (use language tag "ca-valencia").
-# Checked by a native speaker of Valentian.
-
-"""
-Catalan-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Autor',
- 'authors': 'Autors',
- 'organization': 'Organització',
- 'address': 'Adreça',
- 'contact': 'Contacte',
- 'version': 'Versió',
- 'revision': 'Revisió',
- 'status': 'Estat',
- 'date': 'Data',
- 'copyright': 'Copyright',
- 'dedication': 'Dedicatòria',
- 'abstract': 'Resum',
- 'attention': 'Atenció!',
- 'caution': 'Compte!',
- 'danger': 'PERILL!',
- 'error': 'Error',
- 'hint': 'Suggeriment',
- 'important': 'Important',
- 'note': 'Nota',
- 'tip': 'Consell',
- 'warning': 'Avís',
- 'contents': 'Contingut'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'autor': 'author',
- 'autors': 'authors',
- 'organització': 'organization',
- 'adreça': 'address',
- 'contacte': 'contact',
- 'versió': 'version',
- 'revisió': 'revision',
- 'estat': 'status',
- 'data': 'date',
- 'copyright': 'copyright',
- 'dedicatòria': 'dedication',
- 'resum': 'abstract'}
-"""Catalan (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/cs.py b/release_env/lib/python3.12/site-packages/docutils/languages/cs.py
deleted file mode 100644
index 7ca0ff583..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/cs.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: cs.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Marek Blaha
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Czech-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Autor',
- 'authors': 'Autoři',
- 'organization': 'Organizace',
- 'address': 'Adresa',
- 'contact': 'Kontakt',
- 'version': 'Verze',
- 'revision': 'Revize',
- 'status': 'Stav',
- 'date': 'Datum',
- 'copyright': 'Copyright',
- 'dedication': 'Věnování',
- 'abstract': 'Abstrakt',
- 'attention': 'Pozor!',
- 'caution': 'Opatrně!',
- 'danger': '!NEBEZPEČÍ!',
- 'error': 'Chyba',
- 'hint': 'Rada',
- 'important': 'Důležité',
- 'note': 'Poznámka',
- 'tip': 'Tip',
- 'warning': 'Varování',
- 'contents': 'Obsah'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'autor': 'author',
- 'autoři': 'authors',
- 'organizace': 'organization',
- 'adresa': 'address',
- 'kontakt': 'contact',
- 'verze': 'version',
- 'revize': 'revision',
- 'stav': 'status',
- 'datum': 'date',
- 'copyright': 'copyright',
- 'věnování': 'dedication',
- 'abstrakt': 'abstract'}
-"""Czech (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/da.py b/release_env/lib/python3.12/site-packages/docutils/languages/da.py
deleted file mode 100644
index d683b7323..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/da.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# $Id: da.py 9030 2022-03-05 23:28:32Z milde $
-# Author: E D
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Danish-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Forfatter',
- 'authors': 'Forfattere',
- 'organization': 'Organisation',
- 'address': 'Adresse',
- 'contact': 'Kontakt',
- 'version': 'Version',
- 'revision': 'Revision',
- 'status': 'Status',
- 'date': 'Dato',
- 'copyright': 'Copyright',
- 'dedication': 'Dedikation',
- 'abstract': 'Resumé',
- 'attention': 'Giv agt!',
- 'caution': 'Pas på!',
- 'danger': '!FARE!',
- 'error': 'Fejl',
- 'hint': 'Vink',
- 'important': 'Vigtigt',
- 'note': 'Bemærk',
- 'tip': 'Tips',
- 'warning': 'Advarsel',
- 'contents': 'Indhold'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'forfatter': 'author',
- 'forfattere': 'authors',
- 'organisation': 'organization',
- 'adresse': 'address',
- 'kontakt': 'contact',
- 'version': 'version',
- 'revision': 'revision',
- 'status': 'status',
- 'dato': 'date',
- 'copyright': 'copyright',
- 'dedikation': 'dedication',
- 'resume': 'abstract',
- 'resumé': 'abstract'}
-"""Danish (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/de.py b/release_env/lib/python3.12/site-packages/docutils/languages/de.py
deleted file mode 100644
index 0d6c82e7b..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/de.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# $Id: de.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Gunnar Schwant
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-German language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'author': 'Autor',
- 'authors': 'Autoren',
- 'organization': 'Organisation',
- 'address': 'Adresse',
- 'contact': 'Kontakt',
- 'version': 'Version',
- 'revision': 'Revision',
- 'status': 'Status',
- 'date': 'Datum',
- 'dedication': 'Widmung',
- 'copyright': 'Copyright',
- 'abstract': 'Zusammenfassung',
- 'attention': 'Achtung!',
- 'caution': 'Vorsicht!',
- 'danger': '!GEFAHR!',
- 'error': 'Fehler',
- 'hint': 'Hinweis',
- 'important': 'Wichtig',
- 'note': 'Bemerkung',
- 'tip': 'Tipp',
- 'warning': 'Warnung',
- 'contents': 'Inhalt'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- 'autor': 'author',
- 'autoren': 'authors',
- 'organisation': 'organization',
- 'adresse': 'address',
- 'kontakt': 'contact',
- 'version': 'version',
- 'revision': 'revision',
- 'status': 'status',
- 'datum': 'date',
- 'copyright': 'copyright',
- 'widmung': 'dedication',
- 'zusammenfassung': 'abstract'}
-"""German (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/en.py b/release_env/lib/python3.12/site-packages/docutils/languages/en.py
deleted file mode 100644
index 683411d1f..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/en.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: en.py 9030 2022-03-05 23:28:32Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-English-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Author',
- 'authors': 'Authors',
- 'organization': 'Organization',
- 'address': 'Address',
- 'contact': 'Contact',
- 'version': 'Version',
- 'revision': 'Revision',
- 'status': 'Status',
- 'date': 'Date',
- 'copyright': 'Copyright',
- 'dedication': 'Dedication',
- 'abstract': 'Abstract',
- 'attention': 'Attention!',
- 'caution': 'Caution!',
- 'danger': '!DANGER!',
- 'error': 'Error',
- 'hint': 'Hint',
- 'important': 'Important',
- 'note': 'Note',
- 'tip': 'Tip',
- 'warning': 'Warning',
- 'contents': 'Contents'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'author': 'author',
- 'authors': 'authors',
- 'organization': 'organization',
- 'address': 'address',
- 'contact': 'contact',
- 'version': 'version',
- 'revision': 'revision',
- 'status': 'status',
- 'date': 'date',
- 'copyright': 'copyright',
- 'dedication': 'dedication',
- 'abstract': 'abstract'}
-"""English (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/eo.py b/release_env/lib/python3.12/site-packages/docutils/languages/eo.py
deleted file mode 100644
index 32ea482e9..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/eo.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# $Id: eo.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Marcelo Huerta San Martin
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Esperanto-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Aŭtoro',
- 'authors': 'Aŭtoroj',
- 'organization': 'Organizo',
- 'address': 'Adreso',
- 'contact': 'Kontakto',
- 'version': 'Versio',
- 'revision': 'Revido',
- 'status': 'Stato',
- 'date': 'Dato',
- # 'copyright': 'Kopirajto',
- 'copyright': 'Aŭtorrajto',
- 'dedication': 'Dediĉo',
- 'abstract': 'Resumo',
- 'attention': 'Atentu!',
- 'caution': 'Zorgu!',
- 'danger': 'DANĜERO!',
- 'error': 'Eraro',
- 'hint': 'Spuro',
- 'important': 'Grava',
- 'note': 'Noto',
- 'tip': 'Helpeto',
- 'warning': 'Averto',
- 'contents': 'Enhavo'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'aŭtoro': 'author',
- 'aŭtoroj': 'authors',
- 'organizo': 'organization',
- 'adreso': 'address',
- 'kontakto': 'contact',
- 'versio': 'version',
- 'revido': 'revision',
- 'stato': 'status',
- 'dato': 'date',
- 'aŭtorrajto': 'copyright',
- 'dediĉo': 'dedication',
- 'resumo': 'abstract'}
-"""Esperanto (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/es.py b/release_env/lib/python3.12/site-packages/docutils/languages/es.py
deleted file mode 100644
index 2b66e7cd3..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/es.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# $Id: es.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Marcelo Huerta San Martín
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Spanish-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'author': 'Autor',
- 'authors': 'Autores',
- 'organization': 'Organización',
- 'address': 'Dirección',
- 'contact': 'Contacto',
- 'version': 'Versión',
- 'revision': 'Revisión',
- 'status': 'Estado',
- 'date': 'Fecha',
- 'copyright': 'Copyright',
- 'dedication': 'Dedicatoria',
- 'abstract': 'Resumen',
- 'attention': '¡Atención!',
- 'caution': '¡Precaución!',
- 'danger': '¡PELIGRO!',
- 'error': 'Error',
- 'hint': 'Sugerencia',
- 'important': 'Importante',
- 'note': 'Nota',
- 'tip': 'Consejo',
- 'warning': 'Advertencia',
- 'contents': 'Contenido'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- 'autor': 'author',
- 'autores': 'authors',
- 'organización': 'organization',
- 'dirección': 'address',
- 'contacto': 'contact',
- 'versión': 'version',
- 'revisión': 'revision',
- 'estado': 'status',
- 'fecha': 'date',
- 'copyright': 'copyright',
- 'dedicatoria': 'dedication',
- 'resumen': 'abstract'}
-"""Spanish (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/fa.py b/release_env/lib/python3.12/site-packages/docutils/languages/fa.py
deleted file mode 100644
index f25814d22..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/fa.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: fa.py 4564 2016-08-10 11:48:42Z
-# Author: Shahin
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Persian-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'نویسنده',
- 'authors': 'نویسندگان',
- 'organization': 'سازمان',
- 'address': 'آدرس',
- 'contact': 'تماس',
- 'version': 'نسخه',
- 'revision': 'بازبینی',
- 'status': 'وضعیت',
- 'date': 'تاریخ',
- 'copyright': 'کپیرایت',
- 'dedication': 'تخصیص',
- 'abstract': 'چکیده',
- 'attention': 'توجه!',
- 'caution': 'احتیاط!',
- 'danger': 'خطر!',
- 'error': 'خطا',
- 'hint': 'راهنما',
- 'important': 'مهم',
- 'note': 'یادداشت',
- 'tip': 'نکته',
- 'warning': 'اخطار',
- 'contents': 'محتوا'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'نویسنده': 'author',
- 'نویسندگان': 'authors',
- 'سازمان': 'organization',
- 'آدرس': 'address',
- 'تماس': 'contact',
- 'نسخه': 'version',
- 'بازبینی': 'revision',
- 'وضعیت': 'status',
- 'تاریخ': 'date',
- 'کپیرایت': 'copyright',
- 'تخصیص': 'dedication',
- 'چکیده': 'abstract'}
-"""Persian (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = ['؛', '،']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/fi.py b/release_env/lib/python3.12/site-packages/docutils/languages/fi.py
deleted file mode 100644
index 2b401dbae..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/fi.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: fi.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Asko Soukka
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Finnish-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Tekijä',
- 'authors': 'Tekijät',
- 'organization': 'Yhteisö',
- 'address': 'Osoite',
- 'contact': 'Yhteystiedot',
- 'version': 'Versio',
- 'revision': 'Vedos',
- 'status': 'Tila',
- 'date': 'Päiväys',
- 'copyright': 'Tekijänoikeudet',
- 'dedication': 'Omistuskirjoitus',
- 'abstract': 'Tiivistelmä',
- 'attention': 'Huomio!',
- 'caution': 'Varo!',
- 'danger': '!VAARA!',
- 'error': 'Virhe',
- 'hint': 'Vihje',
- 'important': 'Tärkeää',
- 'note': 'Huomautus',
- 'tip': 'Neuvo',
- 'warning': 'Varoitus',
- 'contents': 'Sisällys'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'tekijä': 'author',
- 'tekijät': 'authors',
- 'yhteisö': 'organization',
- 'osoite': 'address',
- 'yhteystiedot': 'contact',
- 'versio': 'version',
- 'vedos': 'revision',
- 'tila': 'status',
- 'päiväys': 'date',
- 'tekijänoikeudet': 'copyright',
- 'omistuskirjoitus': 'dedication',
- 'tiivistelmä': 'abstract'}
-"""Finnish (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/fr.py b/release_env/lib/python3.12/site-packages/docutils/languages/fr.py
deleted file mode 100644
index 926455bcb..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/fr.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# $Id: fr.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Stefane Fermigier
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-French-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'author': 'Auteur',
- 'authors': 'Auteurs',
- 'organization': 'Organisation',
- 'address': 'Adresse',
- 'contact': 'Contact',
- 'version': 'Version',
- 'revision': 'Révision',
- 'status': 'Statut',
- 'date': 'Date',
- 'copyright': 'Copyright',
- 'dedication': 'Dédicace',
- 'abstract': 'Résumé',
- 'attention': 'Attention!',
- 'caution': 'Avertissement!',
- 'danger': '!DANGER!',
- 'error': 'Erreur',
- 'hint': 'Indication',
- 'important': 'Important',
- 'note': 'Note',
- 'tip': 'Astuce',
- 'warning': 'Avis',
- 'contents': 'Sommaire'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- 'auteur': 'author',
- 'auteurs': 'authors',
- 'organisation': 'organization',
- 'adresse': 'address',
- 'contact': 'contact',
- 'version': 'version',
- 'révision': 'revision',
- 'statut': 'status',
- 'date': 'date',
- 'copyright': 'copyright',
- 'dédicace': 'dedication',
- 'résumé': 'abstract'}
-"""French (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/gl.py b/release_env/lib/python3.12/site-packages/docutils/languages/gl.py
deleted file mode 100644
index f3864abfd..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/gl.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# Author: David Goodger
-# Contact: goodger@users.sourceforge.net
-# Revision: $Revision: 2224 $
-# Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Galician-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Autor',
- 'authors': 'Autores',
- 'organization': 'Organización',
- 'address': 'Enderezo',
- 'contact': 'Contacto',
- 'version': 'Versión',
- 'revision': 'Revisión',
- 'status': 'Estado',
- 'date': 'Data',
- 'copyright': 'Dereitos de copia',
- 'dedication': 'Dedicatoria',
- 'abstract': 'Abstract',
- 'attention': 'Atención!',
- 'caution': 'Advertencia!',
- 'danger': 'PERIGO!',
- 'error': 'Erro',
- 'hint': 'Consello',
- 'important': 'Importante',
- 'note': 'Nota',
- 'tip': 'Suxestión',
- 'warning': 'Aviso',
- 'contents': 'Contido'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'autor': 'author',
- 'autores': 'authors',
- 'organización': 'organization',
- 'enderezo': 'address',
- 'contacto': 'contact',
- 'versión': 'version',
- 'revisión': 'revision',
- 'estado': 'status',
- 'data': 'date',
- 'dereitos de copia': 'copyright',
- 'dedicatoria': 'dedication',
- 'abstract': 'abstract'}
-"""Galician (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/he.py b/release_env/lib/python3.12/site-packages/docutils/languages/he.py
deleted file mode 100644
index 018cc01aa..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/he.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# Author: Meir Kriheli
-# Id: $Id: he.py 9452 2023-09-27 00:11:54Z milde $
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Hebrew-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'מחבר',
- 'authors': 'מחברי',
- 'organization': 'ארגון',
- 'address': 'כתובת',
- 'contact': 'איש קשר',
- 'version': 'גרסה',
- 'revision': 'מהדורה',
- 'status': 'סטטוס',
- 'date': 'תאריך',
- 'copyright': 'זכויות שמורות',
- 'dedication': 'הקדשה',
- 'abstract': 'תקציר',
- 'attention': 'תשומת לב',
- 'caution': 'זהירות',
- 'danger': 'סכנה',
- 'error': 'שגיאה',
- 'hint': 'רמז',
- 'important': 'חשוב',
- 'note': 'הערה',
- 'tip': 'טיפ',
- 'warning': 'אזהרה',
- 'contents': 'תוכן',
- }
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'מחבר': 'author',
- 'מחברי': 'authors',
- 'ארגון': 'organization',
- 'כתובת': 'address',
- 'איש קשר': 'contact',
- 'גרסה': 'version',
- 'מהדורה': 'revision',
- 'סטטוס': 'status',
- 'תאריך': 'date',
- 'זכויות שמורות': 'copyright',
- 'הקדשה': 'dedication',
- 'תקציר': 'abstract',
- }
-"""Hebrew to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/it.py b/release_env/lib/python3.12/site-packages/docutils/languages/it.py
deleted file mode 100644
index 798ccf959..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/it.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# $Id: it.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Nicola Larosa
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Italian-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'author': 'Autore',
- 'authors': 'Autori',
- 'organization': 'Organizzazione',
- 'address': 'Indirizzo',
- 'contact': 'Contatti',
- 'version': 'Versione',
- 'revision': 'Revisione',
- 'status': 'Status',
- 'date': 'Data',
- 'copyright': 'Copyright',
- 'dedication': 'Dedica',
- 'abstract': 'Riassunto',
- 'attention': 'Attenzione!',
- 'caution': 'Cautela!',
- 'danger': '!PERICOLO!',
- 'error': 'Errore',
- 'hint': 'Suggerimento',
- 'important': 'Importante',
- 'note': 'Nota',
- 'tip': 'Consiglio',
- 'warning': 'Avvertenza',
- 'contents': 'Indice'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- 'autore': 'author',
- 'autori': 'authors',
- 'organizzazione': 'organization',
- 'indirizzo': 'address',
- 'contatto': 'contact',
- 'versione': 'version',
- 'revisione': 'revision',
- 'status': 'status',
- 'data': 'date',
- 'copyright': 'copyright',
- 'dedica': 'dedication',
- 'riassunto': 'abstract'}
-"""Italian (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/ja.py b/release_env/lib/python3.12/site-packages/docutils/languages/ja.py
deleted file mode 100644
index b936e220c..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/ja.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: ja.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Hisashi Morita
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Japanese-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': '著者',
- 'authors': '著者',
- 'organization': '組織',
- 'address': '住所',
- 'contact': '連絡先',
- 'version': 'バージョン',
- 'revision': 'リビジョン',
- 'status': 'ステータス',
- 'date': '日付',
- 'copyright': '著作権',
- 'dedication': '献辞',
- 'abstract': '概要',
- 'attention': '注目!',
- 'caution': '注意!',
- 'danger': '!危険!',
- 'error': 'エラー',
- 'hint': 'ヒント',
- 'important': '重要',
- 'note': '備考',
- 'tip': '通報',
- 'warning': '警告',
- 'contents': '目次'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- '著者': 'author',
- ' n/a': 'authors',
- '組織': 'organization',
- '住所': 'address',
- '連絡先': 'contact',
- 'バージョン': 'version',
- 'リビジョン': 'revision',
- 'ステータス': 'status',
- '日付': 'date',
- '著作権': 'copyright',
- '献辞': 'dedication',
- '概要': 'abstract'}
-"""Japanese (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/ka.py b/release_env/lib/python3.12/site-packages/docutils/languages/ka.py
deleted file mode 100644
index 352388d9c..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/ka.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# $Id: ka.py 9444 2023-08-23 12:02:41Z grubert $
-# Author: Temuri Doghonadze
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Georgian-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'abstract': 'ანოტაცია',
- 'address': 'მისამართი',
- 'attention': 'ყურადღება!',
- 'author': 'ავტორი',
- 'authors': 'ავტორები',
- 'caution': 'ფრთხილად!',
- 'contact': 'კონტაქტი',
- 'contents': 'შემცველობა',
- 'copyright': 'საავტორო უფლებები',
- 'danger': 'საშიშია!',
- 'date': 'თარიღი',
- 'dedication': 'მიძღვნა',
- 'error': 'შეცდომა',
- 'hint': 'რჩევა',
- 'important': 'მნიშვნელოვანია',
- 'note': 'შენიშვნა',
- 'organization': 'ორგანიზაცია',
- 'revision': 'რევიზია',
- 'status': 'სტატუსი',
- 'tip': 'მინიშნება',
- 'version': 'ვერსია',
- 'warning': 'გაფრთხილება'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- 'ანოტაცია': 'abstract',
- 'მისამართი': 'address',
- 'ავტორი': 'author',
- 'ავტორები': 'authors',
- 'კონტაქტი': 'contact',
- 'საავტორო უფლებები': 'copyright',
- 'თარიღი': 'date',
- 'მიძღვნა': 'dedication',
- 'ორგანიზაცია': 'organization',
- 'რევიზია': 'revision',
- 'სტატუსი': 'status',
- 'ვერსია': 'version'}
-"""Georgian (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/ko.py b/release_env/lib/python3.12/site-packages/docutils/languages/ko.py
deleted file mode 100644
index c7521d1ff..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/ko.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: ko.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Thomas SJ Kang
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Korean-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': '저자',
- 'authors': '저자들',
- 'organization': '조직',
- 'address': '주소',
- 'contact': '연락처',
- 'version': '버전',
- 'revision': '리비전',
- 'status': '상태',
- 'date': '날짜',
- 'copyright': '저작권',
- 'dedication': '헌정',
- 'abstract': '요약',
- 'attention': '집중!',
- 'caution': '주의!',
- 'danger': '!위험!',
- 'error': '오류',
- 'hint': '실마리',
- 'important': '중요한',
- 'note': '비고',
- 'tip': '팁',
- 'warning': '경고',
- 'contents': '목차'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- '저자': 'author',
- '저자들': 'authors',
- '조직': 'organization',
- '주소': 'address',
- '연락처': 'contact',
- '버전': 'version',
- '리비전': 'revision',
- '상태': 'status',
- '날짜': 'date',
- '저작권': 'copyright',
- '헌정': 'dedication',
- '요약': 'abstract'}
-"""Korean to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/lt.py b/release_env/lib/python3.12/site-packages/docutils/languages/lt.py
deleted file mode 100644
index 14c90f26d..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/lt.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: lt.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Dalius Dobravolskas
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Lithuanian language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Autorius',
- 'authors': 'Autoriai',
- 'organization': 'Organizacija',
- 'address': 'Adresas',
- 'contact': 'Kontaktas',
- 'version': 'Versija',
- 'revision': 'Revizija',
- 'status': 'Būsena',
- 'date': 'Data',
- 'copyright': 'Autoriaus teisės',
- 'dedication': 'Dedikacija',
- 'abstract': 'Santrauka',
- 'attention': 'Dėmesio!',
- 'caution': 'Atsargiai!',
- 'danger': '!PAVOJINGA!',
- 'error': 'Klaida',
- 'hint': 'Užuomina',
- 'important': 'Svarbu',
- 'note': 'Pastaba',
- 'tip': 'Patarimas',
- 'warning': 'Įspėjimas',
- 'contents': 'Turinys'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'autorius': 'author',
- 'autoriai': 'authors',
- 'organizacija': 'organization',
- 'adresas': 'address',
- 'kontaktas': 'contact',
- 'versija': 'version',
- 'revizija': 'revision',
- 'būsena': 'status',
- 'data': 'date',
- 'autoriaus teisės': 'copyright',
- 'dedikacija': 'dedication',
- 'santrauka': 'abstract'}
-"""Lithuanian (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/lv.py b/release_env/lib/python3.12/site-packages/docutils/languages/lv.py
deleted file mode 100644
index 812e95af4..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/lv.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# $Id: lv.py 9030 2022-03-05 23:28:32Z milde $
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Latvian-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Autors',
- 'authors': 'Autori',
- 'organization': 'Organizācija',
- 'address': 'Adrese',
- 'contact': 'Kontakti',
- 'version': 'Versija',
- 'revision': 'Revīzija',
- 'status': 'Statuss',
- 'date': 'Datums',
- 'copyright': 'Copyright',
- 'dedication': 'Veltījums',
- 'abstract': 'Atreferējums',
- 'attention': 'Uzmanību!',
- 'caution': 'Piesardzību!',
- 'danger': '!BĪSTAMI!',
- 'error': 'Kļūda',
- 'hint': 'Ieteikums',
- 'important': 'Svarīgi',
- 'note': 'Piezīme',
- 'tip': 'Padoms',
- 'warning': 'Brīdinājums',
- 'contents': 'Saturs'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'autors': 'author',
- 'autori': 'authors',
- 'organizācija': 'organization',
- 'adrese': 'address',
- 'kontakti': 'contact',
- 'versija': 'version',
- 'revīzija': 'revision',
- 'statuss': 'status',
- 'datums': 'date',
- 'copyright': 'copyright',
- 'veltījums': 'dedication',
- 'atreferējums': 'abstract'}
-"""English (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/nl.py b/release_env/lib/python3.12/site-packages/docutils/languages/nl.py
deleted file mode 100644
index 53540e024..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/nl.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: nl.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Martijn Pieters
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Dutch-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Auteur',
- 'authors': 'Auteurs',
- 'organization': 'Organisatie',
- 'address': 'Adres',
- 'contact': 'Contact',
- 'version': 'Versie',
- 'revision': 'Revisie',
- 'status': 'Status',
- 'date': 'Datum',
- 'copyright': 'Copyright',
- 'dedication': 'Toewijding',
- 'abstract': 'Samenvatting',
- 'attention': 'Attentie!',
- 'caution': 'Let op!',
- 'danger': '!GEVAAR!',
- 'error': 'Fout',
- 'hint': 'Hint',
- 'important': 'Belangrijk',
- 'note': 'Opmerking',
- 'tip': 'Tip',
- 'warning': 'Waarschuwing',
- 'contents': 'Inhoud'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'auteur': 'author',
- 'auteurs': 'authors',
- 'organisatie': 'organization',
- 'adres': 'address',
- 'contact': 'contact',
- 'versie': 'version',
- 'revisie': 'revision',
- 'status': 'status',
- 'datum': 'date',
- 'copyright': 'copyright',
- 'toewijding': 'dedication',
- 'samenvatting': 'abstract'}
-"""Dutch (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/pl.py b/release_env/lib/python3.12/site-packages/docutils/languages/pl.py
deleted file mode 100644
index 606a40149..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/pl.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id$
-# Author: Robert Wojciechowicz
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Polish-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Autor',
- 'authors': 'Autorzy',
- 'organization': 'Organizacja',
- 'address': 'Adres',
- 'contact': 'Kontakt',
- 'version': 'Wersja',
- 'revision': 'Korekta',
- 'status': 'Status',
- 'date': 'Data',
- 'copyright': 'Copyright',
- 'dedication': 'Dedykacja',
- 'abstract': 'Streszczenie',
- 'attention': 'Uwaga!',
- 'caution': 'Ostrożnie!',
- 'danger': '!Niebezpieczeństwo!',
- 'error': 'Błąd',
- 'hint': 'Wskazówka',
- 'important': 'Ważne',
- 'note': 'Przypis',
- 'tip': 'Rada',
- 'warning': 'Ostrzeżenie',
- 'contents': 'Treść'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'autor': 'author',
- 'autorzy': 'authors',
- 'organizacja': 'organization',
- 'adres': 'address',
- 'kontakt': 'contact',
- 'wersja': 'version',
- 'korekta': 'revision',
- 'status': 'status',
- 'data': 'date',
- 'copyright': 'copyright',
- 'dedykacja': 'dedication',
- 'streszczenie': 'abstract'}
-"""Polish (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/pt_br.py b/release_env/lib/python3.12/site-packages/docutils/languages/pt_br.py
deleted file mode 100644
index 195a671bb..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/pt_br.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id: pt_br.py 9452 2023-09-27 00:11:54Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Brazilian Portuguese-language mappings for language-dependent features.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': 'Autor',
- 'authors': 'Autores',
- 'organization': 'Organização',
- 'address': 'Endereço',
- 'contact': 'Contato',
- 'version': 'Versão',
- 'revision': 'Revisão',
- 'status': 'Estado',
- 'date': 'Data',
- 'copyright': 'Copyright',
- 'dedication': 'Dedicatória',
- 'abstract': 'Resumo',
- 'attention': 'Atenção!',
- 'caution': 'Cuidado!',
- 'danger': 'PERIGO!',
- 'error': 'Erro',
- 'hint': 'Sugestão',
- 'important': 'Importante',
- 'note': 'Nota',
- 'tip': 'Dica',
- 'warning': 'Aviso',
- 'contents': 'Sumário'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'autor': 'author',
- 'autores': 'authors',
- 'organização': 'organization',
- 'endereço': 'address',
- 'contato': 'contact',
- 'versão': 'version',
- 'revisão': 'revision',
- 'estado': 'status',
- 'data': 'date',
- 'copyright': 'copyright',
- 'dedicatória': 'dedication',
- 'resumo': 'abstract'}
-"""Brazilian Portuguese (lowcased) name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/ru.py b/release_env/lib/python3.12/site-packages/docutils/languages/ru.py
deleted file mode 100644
index 3741bd866..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/ru.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# $Id: ru.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Roman Suzi
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Russian-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'abstract': 'Аннотация',
- 'address': 'Адрес',
- 'attention': 'Внимание!',
- 'author': 'Автор',
- 'authors': 'Авторы',
- 'caution': 'Осторожно!',
- 'contact': 'Контакт',
- 'contents': 'Содержание',
- 'copyright': 'Права копирования',
- 'danger': 'ОПАСНО!',
- 'date': 'Дата',
- 'dedication': 'Посвящение',
- 'error': 'Ошибка',
- 'hint': 'Совет',
- 'important': 'Важно',
- 'note': 'Примечание',
- 'organization': 'Организация',
- 'revision': 'Редакция',
- 'status': 'Статус',
- 'tip': 'Подсказка',
- 'version': 'Версия',
- 'warning': 'Предупреждение'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- 'аннотация': 'abstract',
- 'адрес': 'address',
- 'автор': 'author',
- 'авторы': 'authors',
- 'контакт': 'contact',
- 'права копирования': 'copyright',
- 'дата': 'date',
- 'посвящение': 'dedication',
- 'организация': 'organization',
- 'редакция': 'revision',
- 'статус': 'status',
- 'версия': 'version'}
-"""Russian (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/sk.py b/release_env/lib/python3.12/site-packages/docutils/languages/sk.py
deleted file mode 100644
index bb8c8109c..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/sk.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# $Id: sk.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Miroslav Vasko
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Slovak-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'author': 'Autor',
- 'authors': 'Autori',
- 'organization': 'Organizácia',
- 'address': 'Adresa',
- 'contact': 'Kontakt',
- 'version': 'Verzia',
- 'revision': 'Revízia',
- 'status': 'Stav',
- 'date': 'Dátum',
- 'copyright': 'Copyright',
- 'dedication': 'Venovanie',
- 'abstract': 'Abstraktne',
- 'attention': 'Pozor!',
- 'caution': 'Opatrne!',
- 'danger': '!NEBEZPEČENSTVO!',
- 'error': 'Chyba',
- 'hint': 'Rada',
- 'important': 'Dôležité',
- 'note': 'Poznámka',
- 'tip': 'Tip',
- 'warning': 'Varovanie',
- 'contents': 'Obsah'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- 'autor': 'author',
- 'autori': 'authors',
- 'organizácia': 'organization',
- 'adresa': 'address',
- 'kontakt': 'contact',
- 'verzia': 'version',
- 'revízia': 'revision',
- 'stav': 'status',
- 'dátum': 'date',
- 'copyright': 'copyright',
- 'venovanie': 'dedication',
- 'abstraktne': 'abstract'}
-"""Slovak (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/sv.py b/release_env/lib/python3.12/site-packages/docutils/languages/sv.py
deleted file mode 100644
index a47ede58f..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/sv.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# $Id: sv.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Adam Chodorowski
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Swedish language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'author': 'Författare',
- 'authors': 'Författare',
- 'organization': 'Organisation',
- 'address': 'Adress',
- 'contact': 'Kontakt',
- 'version': 'Version',
- 'revision': 'Revision',
- 'status': 'Status',
- 'date': 'Datum',
- 'copyright': 'Copyright',
- 'dedication': 'Dedikation',
- 'abstract': 'Sammanfattning',
- 'attention': 'Observera!',
- 'caution': 'Akta!', # 'Varning' already used for 'warning'
- 'danger': 'FARA!',
- 'error': 'Fel',
- 'hint': 'Vink',
- 'important': 'Viktigt',
- 'note': 'Notera',
- 'tip': 'Tips',
- 'warning': 'Varning',
- 'contents': 'Innehåll'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # 'Author' and 'Authors' identical in Swedish; assume the plural:
- 'författare': 'authors',
- ' n/a': 'author', # removing leads to (spurious) test failure
- 'organisation': 'organization',
- 'adress': 'address',
- 'kontakt': 'contact',
- 'version': 'version',
- 'revision': 'revision',
- 'status': 'status',
- 'datum': 'date',
- 'copyright': 'copyright',
- 'dedikation': 'dedication',
- 'sammanfattning': 'abstract'}
-"""Swedish (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/uk.py b/release_env/lib/python3.12/site-packages/docutils/languages/uk.py
deleted file mode 100644
index b591dacb8..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/uk.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# $Id: uk.py 9114 2022-07-28 17:06:10Z milde $
-# Author: Dmytro Kazanzhy
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read . Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Ukrainian-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- 'abstract': 'Анотація',
- 'address': 'Адреса',
- 'attention': 'Увага!',
- 'author': 'Автор',
- 'authors': 'Автори',
- 'caution': 'Обережно!',
- 'contact': 'Контакт',
- 'contents': 'Зміст',
- 'copyright': 'Права копіювання',
- 'danger': 'НЕБЕЗПЕЧНО!',
- 'date': 'Дата',
- 'dedication': 'Посвячення',
- 'error': 'Помилка',
- 'hint': 'Порада',
- 'important': 'Важливо',
- 'note': 'Примітка',
- 'organization': 'Організація',
- 'revision': 'Редакція',
- 'status': 'Статус',
- 'tip': 'Підказка',
- 'version': 'Версія',
- 'warning': 'Попередження'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- 'анотація': 'abstract',
- 'адреса': 'address',
- 'автор': 'author',
- 'автори': 'authors',
- 'контакт': 'contact',
- 'права копіювання': 'copyright',
- 'дата': 'date',
- 'посвячення': 'dedication',
- 'організація': 'organization',
- 'редакція': 'revision',
- 'статус': 'status',
- 'версія': 'version'}
-"""Ukrainian (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/zh_cn.py b/release_env/lib/python3.12/site-packages/docutils/languages/zh_cn.py
deleted file mode 100644
index c2ff2e6ab..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/zh_cn.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# $Id: zh_cn.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Pan Junyong
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Simplified Chinese language mappings for language-dependent features
-of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': '作者',
- 'authors': '作者群',
- 'organization': '组织',
- 'address': '地址',
- 'contact': '联系',
- 'version': '版本',
- 'revision': '修订',
- 'status': '状态',
- 'date': '日期',
- 'copyright': '版权',
- 'dedication': '献辞',
- 'abstract': '摘要',
- 'attention': '注意',
- 'caution': '小心',
- 'danger': '危险',
- 'error': '错误',
- 'hint': '提示',
- 'important': '重要',
- 'note': '注解',
- 'tip': '技巧',
- 'warning': '警告',
- 'contents': '目录',
-}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- '作者': 'author',
- '作者群': 'authors',
- '组织': 'organization',
- '地址': 'address',
- '联系': 'contact',
- '版本': 'version',
- '修订': 'revision',
- '状态': 'status',
- '时间': 'date',
- '版权': 'copyright',
- '献辞': 'dedication',
- '摘要': 'abstract'}
-"""Simplified Chinese to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',', ';', ',', '、']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/languages/zh_tw.py b/release_env/lib/python3.12/site-packages/docutils/languages/zh_tw.py
deleted file mode 100644
index cb59c50bd..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/languages/zh_tw.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# $Id: zh_tw.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Joe YS Jaw
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Traditional Chinese language mappings for language-dependent features.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
- # fixed: language-dependent
- 'author': '作者',
- 'authors': '作者群',
- 'organization': '組織',
- 'address': '地址',
- 'contact': '連絡',
- 'version': '版本',
- 'revision': '修訂',
- 'status': '狀態',
- 'date': '日期',
- 'copyright': '版權',
- 'dedication': '題獻',
- 'abstract': '摘要',
- 'attention': '注意!',
- 'caution': '小心!',
- 'danger': '!危險!',
- 'error': '錯誤',
- 'hint': '提示',
- 'important': '重要',
- 'note': '註釋',
- 'tip': '秘訣',
- 'warning': '警告',
- 'contents': '目錄',
- }
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
- # language-dependent: fixed
- 'author (translation required)': 'author',
- 'authors (translation required)': 'authors',
- 'organization (translation required)': 'organization',
- 'address (translation required)': 'address',
- 'contact (translation required)': 'contact',
- 'version (translation required)': 'version',
- 'revision (translation required)': 'revision',
- 'status (translation required)': 'status',
- 'date (translation required)': 'date',
- 'copyright (translation required)': 'copyright',
- 'dedication (translation required)': 'dedication',
- 'abstract (translation required)': 'abstract'}
-"""Traditional Chinese to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',', ';', ',', '、']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/nodes.py b/release_env/lib/python3.12/site-packages/docutils/nodes.py
deleted file mode 100644
index 63a389815..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/nodes.py
+++ /dev/null
@@ -1,2301 +0,0 @@
-# $Id: nodes.py 9612 2024-04-05 23:07:13Z milde $
-# Author: David Goodger
-# Maintainer: docutils-develop@lists.sourceforge.net
-# Copyright: This module has been placed in the public domain.
-
-"""
-Docutils document tree element class library.
-
-Classes in CamelCase are abstract base classes or auxiliary classes. The one
-exception is `Text`, for a text (PCDATA) node; uppercase is used to
-differentiate from element classes. Classes in lower_case_with_underscores
-are element classes, matching the XML element generic identifiers in the DTD_.
-
-The position of each node (the level at which it can occur) is significant and
-is represented by abstract base classes (`Root`, `Structural`, `Body`,
-`Inline`, etc.). Certain transformations will be easier because we can use
-``isinstance(node, base_class)`` to determine the position of the node in the
-hierarchy.
-
-.. _DTD: https://docutils.sourceforge.io/docs/ref/docutils.dtd
-"""
-
-__docformat__ = 'reStructuredText'
-
-from collections import Counter
-import re
-import sys
-import warnings
-import unicodedata
-# import xml.dom.minidom as dom # -> conditional import in Node.asdom()
-# and document.asdom()
-
-# import docutils.transforms # -> conditional import in document.__init__()
-
-
-# ==============================
-# Functional Node Base Classes
-# ==============================
-
-class Node:
- """Abstract base class of nodes in a document tree."""
-
- parent = None
- """Back-reference to the Node immediately containing this Node."""
-
- source = None
- """Path or description of the input source which generated this Node."""
-
- line = None
- """The line number (1-based) of the beginning of this Node in `source`."""
-
- _document = None
-
- @property
- def document(self):
- """Return the `document` root node of the tree containing this Node.
- """
- try:
- return self._document or self.parent.document
- except AttributeError:
- return None
-
- @document.setter
- def document(self, value):
- self._document = value
-
- def __bool__(self):
- """
- Node instances are always true, even if they're empty. A node is more
- than a simple container. Its boolean "truth" does not depend on
- having one or more subnodes in the doctree.
-
- Use `len()` to check node length.
- """
- return True
-
- def asdom(self, dom=None):
- """Return a DOM **fragment** representation of this Node."""
- if dom is None:
- import xml.dom.minidom as dom
- domroot = dom.Document()
- return self._dom_node(domroot)
-
- def pformat(self, indent=' ', level=0):
- """
- Return an indented pseudo-XML representation, for test purposes.
-
- Override in subclasses.
- """
- raise NotImplementedError
-
- def copy(self):
- """Return a copy of self."""
- raise NotImplementedError
-
- def deepcopy(self):
- """Return a deep copy of self (also copying children)."""
- raise NotImplementedError
-
- def astext(self):
- """Return a string representation of this Node."""
- raise NotImplementedError
-
- def setup_child(self, child):
- child.parent = self
- if self.document:
- child.document = self.document
- if child.source is None:
- child.source = self.document.current_source
- if child.line is None:
- child.line = self.document.current_line
-
- def walk(self, visitor):
- """
- Traverse a tree of `Node` objects, calling the
- `dispatch_visit()` method of `visitor` when entering each
- node. (The `walkabout()` method is similar, except it also
- calls the `dispatch_departure()` method before exiting each
- node.)
-
- This tree traversal supports limited in-place tree
- modifications. Replacing one node with one or more nodes is
- OK, as is removing an element. However, if the node removed
- or replaced occurs after the current node, the old node will
- still be traversed, and any new nodes will not.
-
- Within ``visit`` methods (and ``depart`` methods for
- `walkabout()`), `TreePruningException` subclasses may be raised
- (`SkipChildren`, `SkipSiblings`, `SkipNode`, `SkipDeparture`).
-
- Parameter `visitor`: A `NodeVisitor` object, containing a
- ``visit`` implementation for each `Node` subclass encountered.
-
- Return true if we should stop the traversal.
- """
- stop = False
- visitor.document.reporter.debug(
- 'docutils.nodes.Node.walk calling dispatch_visit for %s'
- % self.__class__.__name__)
- try:
- try:
- visitor.dispatch_visit(self)
- except (SkipChildren, SkipNode):
- return stop
- except SkipDeparture: # not applicable; ignore
- pass
- children = self.children
- try:
- for child in children[:]:
- if child.walk(visitor):
- stop = True
- break
- except SkipSiblings:
- pass
- except StopTraversal:
- stop = True
- return stop
-
- def walkabout(self, visitor):
- """
- Perform a tree traversal similarly to `Node.walk()` (which
- see), except also call the `dispatch_departure()` method
- before exiting each node.
-
- Parameter `visitor`: A `NodeVisitor` object, containing a
- ``visit`` and ``depart`` implementation for each `Node`
- subclass encountered.
-
- Return true if we should stop the traversal.
- """
- call_depart = True
- stop = False
- visitor.document.reporter.debug(
- 'docutils.nodes.Node.walkabout calling dispatch_visit for %s'
- % self.__class__.__name__)
- try:
- try:
- visitor.dispatch_visit(self)
- except SkipNode:
- return stop
- except SkipDeparture:
- call_depart = False
- children = self.children
- try:
- for child in children[:]:
- if child.walkabout(visitor):
- stop = True
- break
- except SkipSiblings:
- pass
- except SkipChildren:
- pass
- except StopTraversal:
- stop = True
- if call_depart:
- visitor.document.reporter.debug(
- 'docutils.nodes.Node.walkabout calling dispatch_departure '
- 'for %s' % self.__class__.__name__)
- visitor.dispatch_departure(self)
- return stop
-
- def _fast_findall(self, cls):
- """Return iterator that only supports instance checks."""
- if isinstance(self, cls):
- yield self
- for child in self.children:
- yield from child._fast_findall(cls)
-
- def _superfast_findall(self):
- """Return iterator that doesn't check for a condition."""
- # This is different from ``iter(self)`` implemented via
- # __getitem__() and __len__() in the Element subclass,
- # which yields only the direct children.
- yield self
- for child in self.children:
- yield from child._superfast_findall()
-
- def traverse(self, condition=None, include_self=True, descend=True,
- siblings=False, ascend=False):
- """Return list of nodes following `self`.
-
- For looping, Node.findall() is faster and more memory efficient.
- """
- # traverse() may be eventually removed:
- warnings.warn('nodes.Node.traverse() is obsoleted by Node.findall().',
- PendingDeprecationWarning, stacklevel=2)
- return list(self.findall(condition, include_self, descend,
- siblings, ascend))
-
- def findall(self, condition=None, include_self=True, descend=True,
- siblings=False, ascend=False):
- """
- Return an iterator yielding nodes following `self`:
-
- * self (if `include_self` is true)
- * all descendants in tree traversal order (if `descend` is true)
- * the following siblings (if `siblings` is true) and their
- descendants (if also `descend` is true)
- * the following siblings of the parent (if `ascend` is true) and
- their descendants (if also `descend` is true), and so on.
-
- If `condition` is not None, the iterator yields only nodes
- for which ``condition(node)`` is true. If `condition` is a
- node class ``cls``, it is equivalent to a function consisting
- of ``return isinstance(node, cls)``.
-
- If `ascend` is true, assume `siblings` to be true as well.
-
- If the tree structure is modified during iteration, the result
- is undefined.
-
- For example, given the following tree::
-
-
- <--- emphasis.traverse() and
- <--- strong.traverse() are called.
- Foo
- Bar
-
- Baz
-
- Then tuple(emphasis.traverse()) equals ::
-
- (, , <#text: Foo>, <#text: Bar>)
-
- and list(strong.traverse(ascend=True) equals ::
-
- [, <#text: Foo>, <#text: Bar>, , <#text: Baz>]
- """
- if ascend:
- siblings = True
- # Check for special argument combinations that allow using an
- # optimized version of traverse()
- if include_self and descend and not siblings:
- if condition is None:
- yield from self._superfast_findall()
- return
- elif isinstance(condition, type):
- yield from self._fast_findall(condition)
- return
- # Check if `condition` is a class (check for TypeType for Python
- # implementations that use only new-style classes, like PyPy).
- if isinstance(condition, type):
- node_class = condition
-
- def condition(node, node_class=node_class):
- return isinstance(node, node_class)
-
- if include_self and (condition is None or condition(self)):
- yield self
- if descend and len(self.children):
- for child in self:
- yield from child.findall(condition=condition,
- include_self=True, descend=True,
- siblings=False, ascend=False)
- if siblings or ascend:
- node = self
- while node.parent:
- index = node.parent.index(node)
- # extra check since Text nodes have value-equality
- while node.parent[index] is not node:
- index = node.parent.index(node, index + 1)
- for sibling in node.parent[index+1:]:
- yield from sibling.findall(
- condition=condition,
- include_self=True, descend=descend,
- siblings=False, ascend=False)
- if not ascend:
- break
- else:
- node = node.parent
-
- def next_node(self, condition=None, include_self=False, descend=True,
- siblings=False, ascend=False):
- """
- Return the first node in the iterator returned by findall(),
- or None if the iterable is empty.
-
- Parameter list is the same as of `findall()`. Note that `include_self`
- defaults to False, though.
- """
- try:
- return next(self.findall(condition, include_self,
- descend, siblings, ascend))
- except StopIteration:
- return None
-
-
-# definition moved here from `utils` to avoid circular import dependency
-def unescape(text, restore_backslashes=False, respect_whitespace=False):
- """
- Return a string with nulls removed or restored to backslashes.
- Backslash-escaped spaces are also removed.
- """
- # `respect_whitespace` is ignored (since introduction 2016-12-16)
- if restore_backslashes:
- return text.replace('\x00', '\\')
- else:
- for sep in ['\x00 ', '\x00\n', '\x00']:
- text = ''.join(text.split(sep))
- return text
-
-
-class Text(Node, str):
-
- """
- Instances are terminal nodes (leaves) containing text only; no child
- nodes or attributes. Initialize by passing a string to the constructor.
-
- Access the raw (null-escaped) text with ``str()``
- and unescaped text with ``.astext()``.
- """
-
- tagname = '#text'
-
- children = ()
- """Text nodes have no children, and cannot have children."""
-
- def __new__(cls, data, rawsource=None):
- """Assert that `data` is not an array of bytes
- and warn if the deprecated `rawsource` argument is used.
- """
- if isinstance(data, bytes):
- raise TypeError('expecting str data, not bytes')
- if rawsource is not None:
- warnings.warn('nodes.Text: initialization argument "rawsource" '
- 'is ignored and will be removed in Docutils 2.0.',
- DeprecationWarning, stacklevel=2)
- return str.__new__(cls, data)
-
- def shortrepr(self, maxlen=18):
- data = self
- if len(data) > maxlen:
- data = data[:maxlen-4] + ' ...'
- return '<%s: %r>' % (self.tagname, str(data))
-
- def __repr__(self):
- return self.shortrepr(maxlen=68)
-
- def _dom_node(self, domroot):
- return domroot.createTextNode(str(self))
-
- def astext(self):
- return str(unescape(self))
-
- def copy(self):
- return self.__class__(str(self))
-
- def deepcopy(self):
- return self.copy()
-
- def pformat(self, indent=' ', level=0):
- try:
- if self.document.settings.detailed:
- tag = '%s%s' % (indent*level, '<#text>')
- lines = (indent*(level+1) + repr(line)
- for line in self.splitlines(True))
- return '\n'.join((tag, *lines)) + '\n'
- except AttributeError:
- pass
- indent = indent * level
- lines = [indent+line for line in self.astext().splitlines()]
- if not lines:
- return ''
- return '\n'.join(lines) + '\n'
-
- # rstrip and lstrip are used by substitution definitions where
- # they are expected to return a Text instance, this was formerly
- # taken care of by UserString.
-
- def rstrip(self, chars=None):
- return self.__class__(str.rstrip(self, chars))
-
- def lstrip(self, chars=None):
- return self.__class__(str.lstrip(self, chars))
-
-
-class Element(Node):
-
- """
- `Element` is the superclass to all specific elements.
-
- Elements contain attributes and child nodes.
- They can be described as a cross between a list and a dictionary.
-
- Elements emulate dictionaries for external [#]_ attributes, indexing by
- attribute name (a string). To set the attribute 'att' to 'value', do::
-
- element['att'] = 'value'
-
- .. [#] External attributes correspond to the XML element attributes.
- From its `Node` superclass, Element also inherits "internal"
- class attributes that are accessed using the standard syntax, e.g.
- ``element.parent``.
-
- There are two special attributes: 'ids' and 'names'. Both are
- lists of unique identifiers: 'ids' conform to the regular expression
- ``[a-z](-?[a-z0-9]+)*`` (see the make_id() function for rationale and
- details). 'names' serve as user-friendly interfaces to IDs; they are
- case- and whitespace-normalized (see the fully_normalize_name() function).
-
- Elements emulate lists for child nodes (element nodes and/or text
- nodes), indexing by integer. To get the first child node, use::
-
- element[0]
-
- to iterate over the child nodes (without descending), use::
-
- for child in element:
- ...
-
- Elements may be constructed using the ``+=`` operator. To add one new
- child node to element, do::
-
- element += node
-
- This is equivalent to ``element.append(node)``.
-
- To add a list of multiple child nodes at once, use the same ``+=``
- operator::
-
- element += [node1, node2]
-
- This is equivalent to ``element.extend([node1, node2])``.
- """
-
- basic_attributes = ('ids', 'classes', 'names', 'dupnames')
- """Tuple of attributes which are defined for every Element-derived class
- instance and can be safely transferred to a different node."""
-
- local_attributes = ('backrefs',)
- """Tuple of class-specific attributes that should not be copied with the
- standard attributes when replacing a node.
-
- NOTE: Derived classes should override this value to prevent any of its
- attributes being copied by adding to the value in its parent class."""
-
- list_attributes = basic_attributes + local_attributes
- """Tuple of attributes that are automatically initialized to empty lists
- for all nodes."""
-
- known_attributes = list_attributes + ('source',)
- """Tuple of attributes that are known to the Element base class."""
-
- tagname = None
- """The element generic identifier. If None, it is set as an instance
- attribute to the name of the class."""
-
- child_text_separator = '\n\n'
- """Separator for child nodes, used by `astext()` method."""
-
- def __init__(self, rawsource='', *children, **attributes):
- self.rawsource = rawsource
- """The raw text from which this element was constructed.
-
- NOTE: some elements do not set this value (default '').
- """
-
- self.children = []
- """List of child nodes (elements and/or `Text`)."""
-
- self.extend(children) # maintain parent info
-
- self.attributes = {}
- """Dictionary of attribute {name: value}."""
-
- # Initialize list attributes.
- for att in self.list_attributes:
- self.attributes[att] = []
-
- for att, value in attributes.items():
- att = att.lower()
- if att in self.list_attributes:
- # mutable list; make a copy for this node
- self.attributes[att] = value[:]
- else:
- self.attributes[att] = value
-
- if self.tagname is None:
- self.tagname = self.__class__.__name__
-
- def _dom_node(self, domroot):
- element = domroot.createElement(self.tagname)
- for attribute, value in self.attlist():
- if isinstance(value, list):
- value = ' '.join(serial_escape('%s' % (v,)) for v in value)
- element.setAttribute(attribute, '%s' % value)
- for child in self.children:
- element.appendChild(child._dom_node(domroot))
- return element
-
- def __repr__(self):
- data = ''
- for c in self.children:
- data += c.shortrepr()
- if len(data) > 60:
- data = data[:56] + ' ...'
- break
- if self['names']:
- return '<%s "%s": %s>' % (self.__class__.__name__,
- '; '.join(self['names']), data)
- else:
- return '<%s: %s>' % (self.__class__.__name__, data)
-
- def shortrepr(self):
- if self['names']:
- return '<%s "%s"...>' % (self.__class__.__name__,
- '; '.join(self['names']))
- else:
- return '<%s...>' % self.tagname
-
- def __str__(self):
- if self.children:
- return '%s%s%s' % (self.starttag(),
- ''.join(str(c) for c in self.children),
- self.endtag())
- else:
- return self.emptytag()
-
- def starttag(self, quoteattr=None):
- # the optional arg is used by the docutils_xml writer
- if quoteattr is None:
- quoteattr = pseudo_quoteattr
- parts = [self.tagname]
- for name, value in self.attlist():
- if value is None: # boolean attribute
- parts.append('%s="True"' % name)
- continue
- if isinstance(value, list):
- values = [serial_escape('%s' % (v,)) for v in value]
- value = ' '.join(values)
- else:
- value = str(value)
- value = quoteattr(value)
- parts.append('%s=%s' % (name, value))
- return '<%s>' % ' '.join(parts)
-
- def endtag(self):
- return '%s>' % self.tagname
-
- def emptytag(self):
- attributes = ('%s="%s"' % (n, v) for n, v in self.attlist())
- return '<%s/>' % ' '.join((self.tagname, *attributes))
-
- def __len__(self):
- return len(self.children)
-
- def __contains__(self, key):
- # Test for both, children and attributes with operator ``in``.
- if isinstance(key, str):
- return key in self.attributes
- return key in self.children
-
- def __getitem__(self, key):
- if isinstance(key, str):
- return self.attributes[key]
- elif isinstance(key, int):
- return self.children[key]
- elif isinstance(key, slice):
- assert key.step in (None, 1), 'cannot handle slice with stride'
- return self.children[key.start:key.stop]
- else:
- raise TypeError('element index must be an integer, a slice, or '
- 'an attribute name string')
-
- def __setitem__(self, key, item):
- if isinstance(key, str):
- self.attributes[str(key)] = item
- elif isinstance(key, int):
- self.setup_child(item)
- self.children[key] = item
- elif isinstance(key, slice):
- assert key.step in (None, 1), 'cannot handle slice with stride'
- for node in item:
- self.setup_child(node)
- self.children[key.start:key.stop] = item
- else:
- raise TypeError('element index must be an integer, a slice, or '
- 'an attribute name string')
-
- def __delitem__(self, key):
- if isinstance(key, str):
- del self.attributes[key]
- elif isinstance(key, int):
- del self.children[key]
- elif isinstance(key, slice):
- assert key.step in (None, 1), 'cannot handle slice with stride'
- del self.children[key.start:key.stop]
- else:
- raise TypeError('element index must be an integer, a simple '
- 'slice, or an attribute name string')
-
- def __add__(self, other):
- return self.children + other
-
- def __radd__(self, other):
- return other + self.children
-
- def __iadd__(self, other):
- """Append a node or a list of nodes to `self.children`."""
- if isinstance(other, Node):
- self.append(other)
- elif other is not None:
- self.extend(other)
- return self
-
- def astext(self):
- return self.child_text_separator.join(
- [child.astext() for child in self.children])
-
- def non_default_attributes(self):
- atts = {}
- for key, value in self.attributes.items():
- if self.is_not_default(key):
- atts[key] = value
- return atts
-
- def attlist(self):
- return sorted(self.non_default_attributes().items())
-
- def get(self, key, failobj=None):
- return self.attributes.get(key, failobj)
-
- def hasattr(self, attr):
- return attr in self.attributes
-
- def delattr(self, attr):
- if attr in self.attributes:
- del self.attributes[attr]
-
- def setdefault(self, key, failobj=None):
- return self.attributes.setdefault(key, failobj)
-
- has_key = hasattr
-
- def get_language_code(self, fallback=''):
- """Return node's language tag.
-
- Look iteratively in self and parents for a class argument
- starting with ``language-`` and return the remainder of it
- (which should be a `BCP49` language tag) or the `fallback`.
- """
- for cls in self.get('classes', []):
- if cls.startswith('language-'):
- return cls[9:]
- try:
- return self.parent.get_language(fallback)
- except AttributeError:
- return fallback
-
- def append(self, item):
- self.setup_child(item)
- self.children.append(item)
-
- def extend(self, item):
- for node in item:
- self.append(node)
-
- def insert(self, index, item):
- if isinstance(item, Node):
- self.setup_child(item)
- self.children.insert(index, item)
- elif item is not None:
- self[index:index] = item
-
- def pop(self, i=-1):
- return self.children.pop(i)
-
- def remove(self, item):
- self.children.remove(item)
-
- def index(self, item, start=0, stop=sys.maxsize):
- return self.children.index(item, start, stop)
-
- def previous_sibling(self):
- """Return preceding sibling node or ``None``."""
- try:
- i = self.parent.index(self)
- except (AttributeError):
- return None
- return self.parent[i-1] if i > 0 else None
-
- def is_not_default(self, key):
- if self[key] == [] and key in self.list_attributes:
- return 0
- else:
- return 1
-
- def update_basic_atts(self, dict_):
- """
- Update basic attributes ('ids', 'names', 'classes',
- 'dupnames', but not 'source') from node or dictionary `dict_`.
- """
- if isinstance(dict_, Node):
- dict_ = dict_.attributes
- for att in self.basic_attributes:
- self.append_attr_list(att, dict_.get(att, []))
-
- def append_attr_list(self, attr, values):
- """
- For each element in values, if it does not exist in self[attr], append
- it.
-
- NOTE: Requires self[attr] and values to be sequence type and the
- former should specifically be a list.
- """
- # List Concatenation
- for value in values:
- if value not in self[attr]:
- self[attr].append(value)
-
- def coerce_append_attr_list(self, attr, value):
- """
- First, convert both self[attr] and value to a non-string sequence
- type; if either is not already a sequence, convert it to a list of one
- element. Then call append_attr_list.
-
- NOTE: self[attr] and value both must not be None.
- """
- # List Concatenation
- if not isinstance(self.get(attr), list):
- self[attr] = [self[attr]]
- if not isinstance(value, list):
- value = [value]
- self.append_attr_list(attr, value)
-
- def replace_attr(self, attr, value, force=True):
- """
- If self[attr] does not exist or force is True or omitted, set
- self[attr] to value, otherwise do nothing.
- """
- # One or the other
- if force or self.get(attr) is None:
- self[attr] = value
-
- def copy_attr_convert(self, attr, value, replace=True):
- """
- If attr is an attribute of self, set self[attr] to
- [self[attr], value], otherwise set self[attr] to value.
-
- NOTE: replace is not used by this function and is kept only for
- compatibility with the other copy functions.
- """
- if self.get(attr) is not value:
- self.coerce_append_attr_list(attr, value)
-
- def copy_attr_coerce(self, attr, value, replace):
- """
- If attr is an attribute of self and either self[attr] or value is a
- list, convert all non-sequence values to a sequence of 1 element and
- then concatenate the two sequence, setting the result to self[attr].
- If both self[attr] and value are non-sequences and replace is True or
- self[attr] is None, replace self[attr] with value. Otherwise, do
- nothing.
- """
- if self.get(attr) is not value:
- if isinstance(self.get(attr), list) or \
- isinstance(value, list):
- self.coerce_append_attr_list(attr, value)
- else:
- self.replace_attr(attr, value, replace)
-
- def copy_attr_concatenate(self, attr, value, replace):
- """
- If attr is an attribute of self and both self[attr] and value are
- lists, concatenate the two sequences, setting the result to
- self[attr]. If either self[attr] or value are non-sequences and
- replace is True or self[attr] is None, replace self[attr] with value.
- Otherwise, do nothing.
- """
- if self.get(attr) is not value:
- if isinstance(self.get(attr), list) and \
- isinstance(value, list):
- self.append_attr_list(attr, value)
- else:
- self.replace_attr(attr, value, replace)
-
- def copy_attr_consistent(self, attr, value, replace):
- """
- If replace is True or self[attr] is None, replace self[attr] with
- value. Otherwise, do nothing.
- """
- if self.get(attr) is not value:
- self.replace_attr(attr, value, replace)
-
- def update_all_atts(self, dict_, update_fun=copy_attr_consistent,
- replace=True, and_source=False):
- """
- Updates all attributes from node or dictionary `dict_`.
-
- Appends the basic attributes ('ids', 'names', 'classes',
- 'dupnames', but not 'source') and then, for all other attributes in
- dict_, updates the same attribute in self. When attributes with the
- same identifier appear in both self and dict_, the two values are
- merged based on the value of update_fun. Generally, when replace is
- True, the values in self are replaced or merged with the values in
- dict_; otherwise, the values in self may be preserved or merged. When
- and_source is True, the 'source' attribute is included in the copy.
-
- NOTE: When replace is False, and self contains a 'source' attribute,
- 'source' is not replaced even when dict_ has a 'source'
- attribute, though it may still be merged into a list depending
- on the value of update_fun.
- NOTE: It is easier to call the update-specific methods then to pass
- the update_fun method to this function.
- """
- if isinstance(dict_, Node):
- dict_ = dict_.attributes
-
- # Include the source attribute when copying?
- if and_source:
- filter_fun = self.is_not_list_attribute
- else:
- filter_fun = self.is_not_known_attribute
-
- # Copy the basic attributes
- self.update_basic_atts(dict_)
-
- # Grab other attributes in dict_ not in self except the
- # (All basic attributes should be copied already)
- for att in filter(filter_fun, dict_):
- update_fun(self, att, dict_[att], replace)
-
- def update_all_atts_consistantly(self, dict_, replace=True,
- and_source=False):
- """
- Updates all attributes from node or dictionary `dict_`.
-
- Appends the basic attributes ('ids', 'names', 'classes',
- 'dupnames', but not 'source') and then, for all other attributes in
- dict_, updates the same attribute in self. When attributes with the
- same identifier appear in both self and dict_ and replace is True, the
- values in self are replaced with the values in dict_; otherwise, the
- values in self are preserved. When and_source is True, the 'source'
- attribute is included in the copy.
-
- NOTE: When replace is False, and self contains a 'source' attribute,
- 'source' is not replaced even when dict_ has a 'source'
- attribute, though it may still be merged into a list depending
- on the value of update_fun.
- """
- self.update_all_atts(dict_, Element.copy_attr_consistent, replace,
- and_source)
-
- def update_all_atts_concatenating(self, dict_, replace=True,
- and_source=False):
- """
- Updates all attributes from node or dictionary `dict_`.
-
- Appends the basic attributes ('ids', 'names', 'classes',
- 'dupnames', but not 'source') and then, for all other attributes in
- dict_, updates the same attribute in self. When attributes with the
- same identifier appear in both self and dict_ whose values aren't each
- lists and replace is True, the values in self are replaced with the
- values in dict_; if the values from self and dict_ for the given
- identifier are both of list type, then the two lists are concatenated
- and the result stored in self; otherwise, the values in self are
- preserved. When and_source is True, the 'source' attribute is
- included in the copy.
-
- NOTE: When replace is False, and self contains a 'source' attribute,
- 'source' is not replaced even when dict_ has a 'source'
- attribute, though it may still be merged into a list depending
- on the value of update_fun.
- """
- self.update_all_atts(dict_, Element.copy_attr_concatenate, replace,
- and_source)
-
- def update_all_atts_coercion(self, dict_, replace=True,
- and_source=False):
- """
- Updates all attributes from node or dictionary `dict_`.
-
- Appends the basic attributes ('ids', 'names', 'classes',
- 'dupnames', but not 'source') and then, for all other attributes in
- dict_, updates the same attribute in self. When attributes with the
- same identifier appear in both self and dict_ whose values are both
- not lists and replace is True, the values in self are replaced with
- the values in dict_; if either of the values from self and dict_ for
- the given identifier are of list type, then first any non-lists are
- converted to 1-element lists and then the two lists are concatenated
- and the result stored in self; otherwise, the values in self are
- preserved. When and_source is True, the 'source' attribute is
- included in the copy.
-
- NOTE: When replace is False, and self contains a 'source' attribute,
- 'source' is not replaced even when dict_ has a 'source'
- attribute, though it may still be merged into a list depending
- on the value of update_fun.
- """
- self.update_all_atts(dict_, Element.copy_attr_coerce, replace,
- and_source)
-
- def update_all_atts_convert(self, dict_, and_source=False):
- """
- Updates all attributes from node or dictionary `dict_`.
-
- Appends the basic attributes ('ids', 'names', 'classes',
- 'dupnames', but not 'source') and then, for all other attributes in
- dict_, updates the same attribute in self. When attributes with the
- same identifier appear in both self and dict_ then first any non-lists
- are converted to 1-element lists and then the two lists are
- concatenated and the result stored in self; otherwise, the values in
- self are preserved. When and_source is True, the 'source' attribute
- is included in the copy.
-
- NOTE: When replace is False, and self contains a 'source' attribute,
- 'source' is not replaced even when dict_ has a 'source'
- attribute, though it may still be merged into a list depending
- on the value of update_fun.
- """
- self.update_all_atts(dict_, Element.copy_attr_convert,
- and_source=and_source)
-
- def clear(self):
- self.children = []
-
- def replace(self, old, new):
- """Replace one child `Node` with another child or children."""
- index = self.index(old)
- if isinstance(new, Node):
- self.setup_child(new)
- self[index] = new
- elif new is not None:
- self[index:index+1] = new
-
- def replace_self(self, new):
- """
- Replace `self` node with `new`, where `new` is a node or a
- list of nodes.
- """
- update = new
- if not isinstance(new, Node):
- # `new` is a list; update first child.
- try:
- update = new[0]
- except IndexError:
- update = None
- if isinstance(update, Element):
- update.update_basic_atts(self)
- else:
- # `update` is a Text node or `new` is an empty list.
- # Assert that we aren't losing any attributes.
- for att in self.basic_attributes:
- assert not self[att], \
- 'Losing "%s" attribute: %s' % (att, self[att])
- self.parent.replace(self, new)
-
- def first_child_matching_class(self, childclass, start=0, end=sys.maxsize):
- """
- Return the index of the first child whose class exactly matches.
-
- Parameters:
-
- - `childclass`: A `Node` subclass to search for, or a tuple of `Node`
- classes. If a tuple, any of the classes may match.
- - `start`: Initial index to check.
- - `end`: Initial index to *not* check.
- """
- if not isinstance(childclass, tuple):
- childclass = (childclass,)
- for index in range(start, min(len(self), end)):
- for c in childclass:
- if isinstance(self[index], c):
- return index
- return None
-
- def first_child_not_matching_class(self, childclass, start=0,
- end=sys.maxsize):
- """
- Return the index of the first child whose class does *not* match.
-
- Parameters:
-
- - `childclass`: A `Node` subclass to skip, or a tuple of `Node`
- classes. If a tuple, none of the classes may match.
- - `start`: Initial index to check.
- - `end`: Initial index to *not* check.
- """
- if not isinstance(childclass, tuple):
- childclass = (childclass,)
- for index in range(start, min(len(self), end)):
- for c in childclass:
- if isinstance(self.children[index], c):
- break
- else:
- return index
- return None
-
- def pformat(self, indent=' ', level=0):
- tagline = '%s%s\n' % (indent*level, self.starttag())
- childreps = (c.pformat(indent, level+1) for c in self.children)
- return ''.join((tagline, *childreps))
-
- def copy(self):
- obj = self.__class__(rawsource=self.rawsource, **self.attributes)
- obj._document = self._document
- obj.source = self.source
- obj.line = self.line
- return obj
-
- def deepcopy(self):
- copy = self.copy()
- copy.extend([child.deepcopy() for child in self.children])
- return copy
-
- def set_class(self, name):
- """Add a new class to the "classes" attribute."""
- warnings.warn('docutils.nodes.Element.set_class() is deprecated; '
- ' and will be removed in Docutils 0.21 or later.'
- "Append to Element['classes'] list attribute directly",
- DeprecationWarning, stacklevel=2)
- assert ' ' not in name
- self['classes'].append(name.lower())
-
- def note_referenced_by(self, name=None, id=None):
- """Note that this Element has been referenced by its name
- `name` or id `id`."""
- self.referenced = True
- # Element.expect_referenced_by_* dictionaries map names or ids
- # to nodes whose ``referenced`` attribute is set to true as
- # soon as this node is referenced by the given name or id.
- # Needed for target propagation.
- by_name = getattr(self, 'expect_referenced_by_name', {}).get(name)
- by_id = getattr(self, 'expect_referenced_by_id', {}).get(id)
- if by_name:
- assert name is not None
- by_name.referenced = True
- if by_id:
- assert id is not None
- by_id.referenced = True
-
- @classmethod
- def is_not_list_attribute(cls, attr):
- """
- Returns True if and only if the given attribute is NOT one of the
- basic list attributes defined for all Elements.
- """
- return attr not in cls.list_attributes
-
- @classmethod
- def is_not_known_attribute(cls, attr):
- """
- Returns True if and only if the given attribute is NOT recognized by
- this class.
- """
- return attr not in cls.known_attributes
-
-
-class TextElement(Element):
-
- """
- An element which directly contains text.
-
- Its children are all `Text` or `Inline` subclass nodes. You can
- check whether an element's context is inline simply by checking whether
- its immediate parent is a `TextElement` instance (including subclasses).
- This is handy for nodes like `image` that can appear both inline and as
- standalone body elements.
-
- If passing children to `__init__()`, make sure to set `text` to
- ``''`` or some other suitable value.
- """
-
- child_text_separator = ''
- """Separator for child nodes, used by `astext()` method."""
-
- def __init__(self, rawsource='', text='', *children, **attributes):
- if text != '':
- textnode = Text(text)
- Element.__init__(self, rawsource, textnode, *children,
- **attributes)
- else:
- Element.__init__(self, rawsource, *children, **attributes)
-
-
-class FixedTextElement(TextElement):
-
- """An element which directly contains preformatted text."""
-
- def __init__(self, rawsource='', text='', *children, **attributes):
- super().__init__(rawsource, text, *children, **attributes)
- self.attributes['xml:space'] = 'preserve'
-
-
-# TODO: PureTextElement(TextElement):
-# """An element which only contains text, no children."""
-# For elements in the DTD that directly employ #PCDATA in their definition:
-# citation_reference, comment, footnote_reference, label, math, math_block,
-# option_argument, option_string, raw,
-
-
-# ========
-# Mixins
-# ========
-
-class Resolvable:
-
- resolved = 0
-
-
-class BackLinkable:
-
- def add_backref(self, refid):
- self['backrefs'].append(refid)
-
-
-# ====================
-# Element Categories
-# ====================
-
-class Root:
- pass
-
-
-class Titular:
- pass
-
-
-class PreBibliographic:
- """Category of Node which may occur before Bibliographic Nodes."""
-
-
-class Bibliographic:
- pass
-
-
-class Decorative(PreBibliographic):
- pass
-
-
-class Structural:
- pass
-
-
-class Body:
- pass
-
-
-class General(Body):
- pass
-
-
-class Sequential(Body):
- """List-like elements."""
-
-
-class Admonition(Body): pass
-
-
-class Special(Body):
- """Special internal body elements."""
-
-
-class Invisible(PreBibliographic):
- """Internal elements that don't appear in output."""
-
-
-class Part:
- pass
-
-
-class Inline:
- pass
-
-
-class Referential(Resolvable):
- pass
-
-
-class Targetable(Resolvable):
-
- referenced = 0
-
- indirect_reference_name = None
- """Holds the whitespace_normalized_name (contains mixed case) of a target.
- Required for MoinMoin/reST compatibility."""
-
-
-class Labeled:
- """Contains a `label` as its first element."""
-
-
-# ==============
-# Root Element
-# ==============
-
-class document(Root, Structural, Element):
-
- """
- The document root element.
-
- Do not instantiate this class directly; use
- `docutils.utils.new_document()` instead.
- """
-
- def __init__(self, settings, reporter, *args, **kwargs):
- Element.__init__(self, *args, **kwargs)
-
- self.current_source = None
- """Path to or description of the input source being processed."""
-
- self.current_line = None
- """Line number (1-based) of `current_source`."""
-
- self.settings = settings
- """Runtime settings data record."""
-
- self.reporter = reporter
- """System message generator."""
-
- self.indirect_targets = []
- """List of indirect target nodes."""
-
- self.substitution_defs = {}
- """Mapping of substitution names to substitution_definition nodes."""
-
- self.substitution_names = {}
- """Mapping of case-normalized substitution names to case-sensitive
- names."""
-
- self.refnames = {}
- """Mapping of names to lists of referencing nodes."""
-
- self.refids = {}
- """Mapping of ids to lists of referencing nodes."""
-
- self.nameids = {}
- """Mapping of names to unique id's."""
-
- self.nametypes = {}
- """Mapping of names to hyperlink type (boolean: True => explicit,
- False => implicit."""
-
- self.ids = {}
- """Mapping of ids to nodes."""
-
- self.footnote_refs = {}
- """Mapping of footnote labels to lists of footnote_reference nodes."""
-
- self.citation_refs = {}
- """Mapping of citation labels to lists of citation_reference nodes."""
-
- self.autofootnotes = []
- """List of auto-numbered footnote nodes."""
-
- self.autofootnote_refs = []
- """List of auto-numbered footnote_reference nodes."""
-
- self.symbol_footnotes = []
- """List of symbol footnote nodes."""
-
- self.symbol_footnote_refs = []
- """List of symbol footnote_reference nodes."""
-
- self.footnotes = []
- """List of manually-numbered footnote nodes."""
-
- self.citations = []
- """List of citation nodes."""
-
- self.autofootnote_start = 1
- """Initial auto-numbered footnote number."""
-
- self.symbol_footnote_start = 0
- """Initial symbol footnote symbol index."""
-
- self.id_counter = Counter()
- """Numbers added to otherwise identical IDs."""
-
- self.parse_messages = []
- """System messages generated while parsing."""
-
- self.transform_messages = []
- """System messages generated while applying transforms."""
-
- import docutils.transforms
- self.transformer = docutils.transforms.Transformer(self)
- """Storage for transforms to be applied to this document."""
-
- self.include_log = []
- """The current source's parents (to detect inclusion loops)."""
-
- self.decoration = None
- """Document's `decoration` node."""
-
- self._document = self
-
- def __getstate__(self):
- """
- Return dict with unpicklable references removed.
- """
- state = self.__dict__.copy()
- state['reporter'] = None
- state['transformer'] = None
- return state
-
- def asdom(self, dom=None):
- """Return a DOM representation of this document."""
- if dom is None:
- import xml.dom.minidom as dom
- domroot = dom.Document()
- domroot.appendChild(self._dom_node(domroot))
- return domroot
-
- def set_id(self, node, msgnode=None, suggested_prefix=''):
- if node['ids']:
- # register and check for duplicates
- for id in node['ids']:
- self.ids.setdefault(id, node)
- if self.ids[id] is not node:
- msg = self.reporter.severe('Duplicate ID: "%s".' % id)
- if msgnode is not None:
- msgnode += msg
- return id
- # generate and set id
- id_prefix = self.settings.id_prefix
- auto_id_prefix = self.settings.auto_id_prefix
- base_id = ''
- id = ''
- for name in node['names']:
- if id_prefix:
- # allow names starting with numbers if `id_prefix`
- base_id = make_id('x'+name)[1:]
- else:
- base_id = make_id(name)
- # TODO: normalize id-prefix? (would make code simpler)
- id = id_prefix + base_id
- if base_id and id not in self.ids:
- break
- else:
- if base_id and auto_id_prefix.endswith('%'):
- # disambiguate name-derived ID
- # TODO: remove second condition after announcing change
- prefix = id + '-'
- else:
- prefix = id_prefix + auto_id_prefix
- if prefix.endswith('%'):
- prefix = '%s%s-' % (prefix[:-1],
- suggested_prefix
- or make_id(node.tagname))
- while True:
- self.id_counter[prefix] += 1
- id = '%s%d' % (prefix, self.id_counter[prefix])
- if id not in self.ids:
- break
- node['ids'].append(id)
- self.ids[id] = node
- return id
-
- def set_name_id_map(self, node, id, msgnode=None, explicit=None):
- """
- `self.nameids` maps names to IDs, while `self.nametypes` maps names to
- booleans representing hyperlink type (True==explicit,
- False==implicit). This method updates the mappings.
-
- The following state transition table shows how `self.nameids` items
- ("id") and `self.nametypes` items ("type") change with new input
- (a call to this method), and what actions are performed
- ("implicit"-type system messages are INFO/1, and
- "explicit"-type system messages are ERROR/3):
-
- ==== ===== ======== ======== ======= ==== ===== =====
- Old State Input Action New State Notes
- ----------- -------- ----------------- ----------- -----
- id type new type sys.msg. dupname id type
- ==== ===== ======== ======== ======= ==== ===== =====
- - - explicit - - new True
- - - implicit - - new False
- - False explicit - - new True
- old False explicit implicit old new True
- - True explicit explicit new - True
- old True explicit explicit new,old - True [#]_
- - False implicit implicit new - False
- old False implicit implicit new,old - False
- - True implicit implicit new - True
- old True implicit implicit new old True
- ==== ===== ======== ======== ======= ==== ===== =====
-
- .. [#] Do not clear the name-to-id map or invalidate the old target if
- both old and new targets are external and refer to identical URIs.
- The new target is invalidated regardless.
- """
- for name in tuple(node['names']):
- if name in self.nameids:
- self.set_duplicate_name_id(node, id, name, msgnode, explicit)
- # attention: modifies node['names']
- else:
- self.nameids[name] = id
- self.nametypes[name] = explicit
-
- def set_duplicate_name_id(self, node, id, name, msgnode, explicit):
- old_id = self.nameids[name]
- old_explicit = self.nametypes[name]
- self.nametypes[name] = old_explicit or explicit
- if explicit:
- if old_explicit:
- level = 2
- if old_id is not None:
- old_node = self.ids[old_id]
- if 'refuri' in node:
- refuri = node['refuri']
- if (old_node['names']
- and 'refuri' in old_node
- and old_node['refuri'] == refuri):
- level = 1 # just inform if refuri's identical
- if level > 1:
- dupname(old_node, name)
- self.nameids[name] = None
- msg = self.reporter.system_message(
- level, 'Duplicate explicit target name: "%s".' % name,
- backrefs=[id], base_node=node)
- if msgnode is not None:
- msgnode += msg
- dupname(node, name)
- else:
- self.nameids[name] = id
- if old_id is not None:
- old_node = self.ids[old_id]
- dupname(old_node, name)
- else:
- if old_id is not None and not old_explicit:
- self.nameids[name] = None
- old_node = self.ids[old_id]
- dupname(old_node, name)
- dupname(node, name)
- if not explicit or (not old_explicit and old_id is not None):
- msg = self.reporter.info(
- 'Duplicate implicit target name: "%s".' % name,
- backrefs=[id], base_node=node)
- if msgnode is not None:
- msgnode += msg
-
- def has_name(self, name):
- return name in self.nameids
-
- # "note" here is an imperative verb: "take note of".
- def note_implicit_target(self, target, msgnode=None):
- id = self.set_id(target, msgnode)
- self.set_name_id_map(target, id, msgnode, explicit=False)
-
- def note_explicit_target(self, target, msgnode=None):
- id = self.set_id(target, msgnode)
- self.set_name_id_map(target, id, msgnode, explicit=True)
-
- def note_refname(self, node):
- self.refnames.setdefault(node['refname'], []).append(node)
-
- def note_refid(self, node):
- self.refids.setdefault(node['refid'], []).append(node)
-
- def note_indirect_target(self, target):
- self.indirect_targets.append(target)
- if target['names']:
- self.note_refname(target)
-
- def note_anonymous_target(self, target):
- self.set_id(target)
-
- def note_autofootnote(self, footnote):
- self.set_id(footnote)
- self.autofootnotes.append(footnote)
-
- def note_autofootnote_ref(self, ref):
- self.set_id(ref)
- self.autofootnote_refs.append(ref)
-
- def note_symbol_footnote(self, footnote):
- self.set_id(footnote)
- self.symbol_footnotes.append(footnote)
-
- def note_symbol_footnote_ref(self, ref):
- self.set_id(ref)
- self.symbol_footnote_refs.append(ref)
-
- def note_footnote(self, footnote):
- self.set_id(footnote)
- self.footnotes.append(footnote)
-
- def note_footnote_ref(self, ref):
- self.set_id(ref)
- self.footnote_refs.setdefault(ref['refname'], []).append(ref)
- self.note_refname(ref)
-
- def note_citation(self, citation):
- self.citations.append(citation)
-
- def note_citation_ref(self, ref):
- self.set_id(ref)
- self.citation_refs.setdefault(ref['refname'], []).append(ref)
- self.note_refname(ref)
-
- def note_substitution_def(self, subdef, def_name, msgnode=None):
- name = whitespace_normalize_name(def_name)
- if name in self.substitution_defs:
- msg = self.reporter.error(
- 'Duplicate substitution definition name: "%s".' % name,
- base_node=subdef)
- if msgnode is not None:
- msgnode += msg
- oldnode = self.substitution_defs[name]
- dupname(oldnode, name)
- # keep only the last definition:
- self.substitution_defs[name] = subdef
- # case-insensitive mapping:
- self.substitution_names[fully_normalize_name(name)] = name
-
- def note_substitution_ref(self, subref, refname):
- subref['refname'] = whitespace_normalize_name(refname)
-
- def note_pending(self, pending, priority=None):
- self.transformer.add_pending(pending, priority)
-
- def note_parse_message(self, message):
- self.parse_messages.append(message)
-
- def note_transform_message(self, message):
- self.transform_messages.append(message)
-
- def note_source(self, source, offset):
- self.current_source = source
- if offset is None:
- self.current_line = offset
- else:
- self.current_line = offset + 1
-
- def copy(self):
- obj = self.__class__(self.settings, self.reporter,
- **self.attributes)
- obj.source = self.source
- obj.line = self.line
- return obj
-
- def get_decoration(self):
- if not self.decoration:
- self.decoration = decoration()
- index = self.first_child_not_matching_class((Titular, meta))
- if index is None:
- self.append(self.decoration)
- else:
- self.insert(index, self.decoration)
- return self.decoration
-
-
-# ================
-# Title Elements
-# ================
-
-class title(Titular, PreBibliographic, TextElement): pass
-class subtitle(Titular, PreBibliographic, TextElement): pass
-class rubric(Titular, TextElement): pass
-
-
-# ==================
-# Meta-Data Element
-# ==================
-
-class meta(PreBibliographic, Element):
- """Container for "invisible" bibliographic data, or meta-data."""
-
-
-# ========================
-# Bibliographic Elements
-# ========================
-
-class docinfo(Bibliographic, Element): pass
-class author(Bibliographic, TextElement): pass
-class authors(Bibliographic, Element): pass
-class organization(Bibliographic, TextElement): pass
-class address(Bibliographic, FixedTextElement): pass
-class contact(Bibliographic, TextElement): pass
-class version(Bibliographic, TextElement): pass
-class revision(Bibliographic, TextElement): pass
-class status(Bibliographic, TextElement): pass
-class date(Bibliographic, TextElement): pass
-class copyright(Bibliographic, TextElement): pass
-
-
-# =====================
-# Decorative Elements
-# =====================
-
-class decoration(Decorative, Element):
-
- def get_header(self):
- if not len(self.children) or not isinstance(self.children[0], header):
- self.insert(0, header())
- return self.children[0]
-
- def get_footer(self):
- if not len(self.children) or not isinstance(self.children[-1], footer):
- self.append(footer())
- return self.children[-1]
-
-
-class header(Decorative, Element): pass
-class footer(Decorative, Element): pass
-
-
-# =====================
-# Structural Elements
-# =====================
-
-class section(Structural, Element): pass
-
-
-class topic(Structural, Element):
-
- """
- Topics are terminal, "leaf" mini-sections, like block quotes with titles,
- or textual figures. A topic is just like a section, except that it has no
- subsections, and it doesn't have to conform to section placement rules.
-
- Topics are allowed wherever body elements (list, table, etc.) are allowed,
- but only at the top level of a section or document. Topics cannot nest
- inside topics, sidebars, or body elements; you can't have a topic inside a
- table, list, block quote, etc.
- """
-
-
-class sidebar(Structural, Element):
-
- """
- Sidebars are like miniature, parallel documents that occur inside other
- documents, providing related or reference material. A sidebar is
- typically offset by a border and "floats" to the side of the page; the
- document's main text may flow around it. Sidebars can also be likened to
- super-footnotes; their content is outside of the flow of the document's
- main text.
-
- Sidebars are allowed wherever body elements (list, table, etc.) are
- allowed, but only at the top level of a section or document. Sidebars
- cannot nest inside sidebars, topics, or body elements; you can't have a
- sidebar inside a table, list, block quote, etc.
- """
-
-
-class transition(Structural, Element): pass
-
-
-# ===============
-# Body Elements
-# ===============
-
-class paragraph(General, TextElement): pass
-class compound(General, Element): pass
-class container(General, Element): pass
-class bullet_list(Sequential, Element): pass
-class enumerated_list(Sequential, Element): pass
-class list_item(Part, Element): pass
-class definition_list(Sequential, Element): pass
-class definition_list_item(Part, Element): pass
-class term(Part, TextElement): pass
-class classifier(Part, TextElement): pass
-class definition(Part, Element): pass
-class field_list(Sequential, Element): pass
-class field(Part, Element): pass
-class field_name(Part, TextElement): pass
-class field_body(Part, Element): pass
-
-
-class option(Part, Element):
-
- child_text_separator = ''
-
-
-class option_argument(Part, TextElement):
-
- def astext(self):
- return self.get('delimiter', ' ') + TextElement.astext(self)
-
-
-class option_group(Part, Element):
-
- child_text_separator = ', '
-
-
-class option_list(Sequential, Element): pass
-
-
-class option_list_item(Part, Element):
-
- child_text_separator = ' '
-
-
-class option_string(Part, TextElement): pass
-class description(Part, Element): pass
-class literal_block(General, FixedTextElement): pass
-class doctest_block(General, FixedTextElement): pass
-class math_block(General, FixedTextElement): pass
-class line_block(General, Element): pass
-
-
-class line(Part, TextElement):
-
- indent = None
-
-
-class block_quote(General, Element): pass
-class attribution(Part, TextElement): pass
-class attention(Admonition, Element): pass
-class caution(Admonition, Element): pass
-class danger(Admonition, Element): pass
-class error(Admonition, Element): pass
-class important(Admonition, Element): pass
-class note(Admonition, Element): pass
-class tip(Admonition, Element): pass
-class hint(Admonition, Element): pass
-class warning(Admonition, Element): pass
-class admonition(Admonition, Element): pass
-class comment(Special, Invisible, FixedTextElement): pass
-class substitution_definition(Special, Invisible, TextElement): pass
-class target(Special, Invisible, Inline, TextElement, Targetable): pass
-class footnote(General, BackLinkable, Element, Labeled, Targetable): pass
-class citation(General, BackLinkable, Element, Labeled, Targetable): pass
-class label(Part, TextElement): pass
-class figure(General, Element): pass
-class caption(Part, TextElement): pass
-class legend(Part, Element): pass
-class table(General, Element): pass
-class tgroup(Part, Element): pass
-class colspec(Part, Element): pass
-class thead(Part, Element): pass
-class tbody(Part, Element): pass
-class row(Part, Element): pass
-class entry(Part, Element): pass
-
-
-class system_message(Special, BackLinkable, PreBibliographic, Element):
-
- """
- System message element.
-
- Do not instantiate this class directly; use
- ``document.reporter.info/warning/error/severe()`` instead.
- """
-
- def __init__(self, message=None, *children, **attributes):
- rawsource = attributes.pop('rawsource', '')
- if message:
- p = paragraph('', message)
- children = (p,) + children
- try:
- Element.__init__(self, rawsource, *children, **attributes)
- except: # noqa catchall
- print('system_message: children=%r' % (children,))
- raise
-
- def astext(self):
- line = self.get('line', '')
- return '%s:%s: (%s/%s) %s' % (self['source'], line, self['type'],
- self['level'], Element.astext(self))
-
-
-class pending(Special, Invisible, Element):
-
- """
- The "pending" element is used to encapsulate a pending operation: the
- operation (transform), the point at which to apply it, and any data it
- requires. Only the pending operation's location within the document is
- stored in the public document tree (by the "pending" object itself); the
- operation and its data are stored in the "pending" object's internal
- instance attributes.
-
- For example, say you want a table of contents in your reStructuredText
- document. The easiest way to specify where to put it is from within the
- document, with a directive::
-
- .. contents::
-
- But the "contents" directive can't do its work until the entire document
- has been parsed and possibly transformed to some extent. So the directive
- code leaves a placeholder behind that will trigger the second phase of its
- processing, something like this::
-
- + internal attributes
-
- Use `document.note_pending()` so that the
- `docutils.transforms.Transformer` stage of processing can run all pending
- transforms.
- """
-
- def __init__(self, transform, details=None,
- rawsource='', *children, **attributes):
- Element.__init__(self, rawsource, *children, **attributes)
-
- self.transform = transform
- """The `docutils.transforms.Transform` class implementing the pending
- operation."""
-
- self.details = details or {}
- """Detail data (dictionary) required by the pending operation."""
-
- def pformat(self, indent=' ', level=0):
- internals = ['.. internal attributes:',
- ' .transform: %s.%s' % (self.transform.__module__,
- self.transform.__name__),
- ' .details:']
- details = sorted(self.details.items())
- for key, value in details:
- if isinstance(value, Node):
- internals.append('%7s%s:' % ('', key))
- internals.extend(['%9s%s' % ('', line)
- for line in value.pformat().splitlines()])
- elif (value
- and isinstance(value, list)
- and isinstance(value[0], Node)):
- internals.append('%7s%s:' % ('', key))
- for v in value:
- internals.extend(['%9s%s' % ('', line)
- for line in v.pformat().splitlines()])
- else:
- internals.append('%7s%s: %r' % ('', key, value))
- return (Element.pformat(self, indent, level)
- + ''.join((' %s%s\n' % (indent * level, line))
- for line in internals))
-
- def copy(self):
- obj = self.__class__(self.transform, self.details, self.rawsource,
- **self.attributes)
- obj._document = self._document
- obj.source = self.source
- obj.line = self.line
- return obj
-
-
-class raw(Special, Inline, PreBibliographic, FixedTextElement):
-
- """
- Raw data that is to be passed untouched to the Writer.
- """
-
-
-# =================
-# Inline Elements
-# =================
-
-class emphasis(Inline, TextElement): pass
-class strong(Inline, TextElement): pass
-class literal(Inline, TextElement): pass
-class reference(General, Inline, Referential, TextElement): pass
-class footnote_reference(Inline, Referential, TextElement): pass
-class citation_reference(Inline, Referential, TextElement): pass
-class substitution_reference(Inline, TextElement): pass
-class title_reference(Inline, TextElement): pass
-class abbreviation(Inline, TextElement): pass
-class acronym(Inline, TextElement): pass
-class superscript(Inline, TextElement): pass
-class subscript(Inline, TextElement): pass
-class math(Inline, TextElement): pass
-
-
-class image(General, Inline, Element):
-
- def astext(self):
- return self.get('alt', '')
-
-
-class inline(Inline, TextElement): pass
-class problematic(Inline, TextElement): pass
-class generated(Inline, TextElement): pass
-
-
-# ========================================
-# Auxiliary Classes, Functions, and Data
-# ========================================
-
-node_class_names = """
- Text
- abbreviation acronym address admonition attention attribution author
- authors
- block_quote bullet_list
- caption caution citation citation_reference classifier colspec comment
- compound contact container copyright
- danger date decoration definition definition_list definition_list_item
- description docinfo doctest_block document
- emphasis entry enumerated_list error
- field field_body field_list field_name figure footer
- footnote footnote_reference
- generated
- header hint
- image important inline
- label legend line line_block list_item literal literal_block
- math math_block meta
- note
- option option_argument option_group option_list option_list_item
- option_string organization
- paragraph pending problematic
- raw reference revision row rubric
- section sidebar status strong subscript substitution_definition
- substitution_reference subtitle superscript system_message
- table target tbody term tgroup thead tip title title_reference topic
- transition
- version
- warning""".split()
-"""A list of names of all concrete Node subclasses."""
-
-
-class NodeVisitor:
-
- """
- "Visitor" pattern [GoF95]_ abstract superclass implementation for
- document tree traversals.
-
- Each node class has corresponding methods, doing nothing by
- default; override individual methods for specific and useful
- behaviour. The `dispatch_visit()` method is called by
- `Node.walk()` upon entering a node. `Node.walkabout()` also calls
- the `dispatch_departure()` method before exiting a node.
-
- The dispatch methods call "``visit_`` + node class name" or
- "``depart_`` + node class name", resp.
-
- This is a base class for visitors whose ``visit_...`` & ``depart_...``
- methods must be implemented for *all* compulsory node types encountered
- (such as for `docutils.writers.Writer` subclasses).
- Unimplemented methods will raise exceptions (except for optional nodes).
-
- For sparse traversals, where only certain node types are of interest, use
- subclass `SparseNodeVisitor` instead. When (mostly or entirely) uniform
- processing is desired, subclass `GenericNodeVisitor`.
-
- .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
- Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
- 1995.
- """
-
- optional = ('meta',)
- """
- Tuple containing node class names (as strings).
-
- No exception will be raised if writers do not implement visit
- or departure functions for these node classes.
-
- Used to ensure transitional compatibility with existing 3rd-party writers.
- """
-
- def __init__(self, document):
- self.document = document
-
- def dispatch_visit(self, node):
- """
- Call self."``visit_`` + node class name" with `node` as
- parameter. If the ``visit_...`` method does not exist, call
- self.unknown_visit.
- """
- node_name = node.__class__.__name__
- method = getattr(self, 'visit_' + node_name, self.unknown_visit)
- self.document.reporter.debug(
- 'docutils.nodes.NodeVisitor.dispatch_visit calling %s for %s'
- % (method.__name__, node_name))
- return method(node)
-
- def dispatch_departure(self, node):
- """
- Call self."``depart_`` + node class name" with `node` as
- parameter. If the ``depart_...`` method does not exist, call
- self.unknown_departure.
- """
- node_name = node.__class__.__name__
- method = getattr(self, 'depart_' + node_name, self.unknown_departure)
- self.document.reporter.debug(
- 'docutils.nodes.NodeVisitor.dispatch_departure calling %s for %s'
- % (method.__name__, node_name))
- return method(node)
-
- def unknown_visit(self, node):
- """
- Called when entering unknown `Node` types.
-
- Raise an exception unless overridden.
- """
- if (self.document.settings.strict_visitor
- or node.__class__.__name__ not in self.optional):
- raise NotImplementedError(
- '%s visiting unknown node type: %s'
- % (self.__class__, node.__class__.__name__))
-
- def unknown_departure(self, node):
- """
- Called before exiting unknown `Node` types.
-
- Raise exception unless overridden.
- """
- if (self.document.settings.strict_visitor
- or node.__class__.__name__ not in self.optional):
- raise NotImplementedError(
- '%s departing unknown node type: %s'
- % (self.__class__, node.__class__.__name__))
-
-
-class SparseNodeVisitor(NodeVisitor):
-
- """
- Base class for sparse traversals, where only certain node types are of
- interest. When ``visit_...`` & ``depart_...`` methods should be
- implemented for *all* node types (such as for `docutils.writers.Writer`
- subclasses), subclass `NodeVisitor` instead.
- """
-
-
-class GenericNodeVisitor(NodeVisitor):
-
- """
- Generic "Visitor" abstract superclass, for simple traversals.
-
- Unless overridden, each ``visit_...`` method calls `default_visit()`, and
- each ``depart_...`` method (when using `Node.walkabout()`) calls
- `default_departure()`. `default_visit()` (and `default_departure()`) must
- be overridden in subclasses.
-
- Define fully generic visitors by overriding `default_visit()` (and
- `default_departure()`) only. Define semi-generic visitors by overriding
- individual ``visit_...()`` (and ``depart_...()``) methods also.
-
- `NodeVisitor.unknown_visit()` (`NodeVisitor.unknown_departure()`) should
- be overridden for default behavior.
- """
-
- def default_visit(self, node):
- """Override for generic, uniform traversals."""
- raise NotImplementedError
-
- def default_departure(self, node):
- """Override for generic, uniform traversals."""
- raise NotImplementedError
-
-
-def _call_default_visit(self, node):
- self.default_visit(node)
-
-
-def _call_default_departure(self, node):
- self.default_departure(node)
-
-
-def _nop(self, node):
- pass
-
-
-def _add_node_class_names(names):
- """Save typing with dynamic assignments:"""
- for _name in names:
- setattr(GenericNodeVisitor, "visit_" + _name, _call_default_visit)
- setattr(GenericNodeVisitor, "depart_" + _name, _call_default_departure)
- setattr(SparseNodeVisitor, 'visit_' + _name, _nop)
- setattr(SparseNodeVisitor, 'depart_' + _name, _nop)
-
-
-_add_node_class_names(node_class_names)
-
-
-class TreeCopyVisitor(GenericNodeVisitor):
-
- """
- Make a complete copy of a tree or branch, including element attributes.
- """
-
- def __init__(self, document):
- GenericNodeVisitor.__init__(self, document)
- self.parent_stack = []
- self.parent = []
-
- def get_tree_copy(self):
- return self.parent[0]
-
- def default_visit(self, node):
- """Copy the current node, and make it the new acting parent."""
- newnode = node.copy()
- self.parent.append(newnode)
- self.parent_stack.append(self.parent)
- self.parent = newnode
-
- def default_departure(self, node):
- """Restore the previous acting parent."""
- self.parent = self.parent_stack.pop()
-
-
-class TreePruningException(Exception):
-
- """
- Base class for `NodeVisitor`-related tree pruning exceptions.
-
- Raise subclasses from within ``visit_...`` or ``depart_...`` methods
- called from `Node.walk()` and `Node.walkabout()` tree traversals to prune
- the tree traversed.
- """
-
-
-class SkipChildren(TreePruningException):
-
- """
- Do not visit any children of the current node. The current node's
- siblings and ``depart_...`` method are not affected.
- """
-
-
-class SkipSiblings(TreePruningException):
-
- """
- Do not visit any more siblings (to the right) of the current node. The
- current node's children and its ``depart_...`` method are not affected.
- """
-
-
-class SkipNode(TreePruningException):
-
- """
- Do not visit the current node's children, and do not call the current
- node's ``depart_...`` method.
- """
-
-
-class SkipDeparture(TreePruningException):
-
- """
- Do not call the current node's ``depart_...`` method. The current node's
- children and siblings are not affected.
- """
-
-
-class NodeFound(TreePruningException):
-
- """
- Raise to indicate that the target of a search has been found. This
- exception must be caught by the client; it is not caught by the traversal
- code.
- """
-
-
-class StopTraversal(TreePruningException):
-
- """
- Stop the traversal altogether. The current node's ``depart_...`` method
- is not affected. The parent nodes ``depart_...`` methods are also called
- as usual. No other nodes are visited. This is an alternative to
- NodeFound that does not cause exception handling to trickle up to the
- caller.
- """
-
-
-def make_id(string):
- """
- Convert `string` into an identifier and return it.
-
- Docutils identifiers will conform to the regular expression
- ``[a-z](-?[a-z0-9]+)*``. For CSS compatibility, identifiers (the "class"
- and "id" attributes) should have no underscores, colons, or periods.
- Hyphens may be used.
-
- - The `HTML 4.01 spec`_ defines identifiers based on SGML tokens:
-
- ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
- followed by any number of letters, digits ([0-9]), hyphens ("-"),
- underscores ("_"), colons (":"), and periods (".").
-
- - However the `CSS1 spec`_ defines identifiers based on the "name" token,
- a tighter interpretation ("flex" tokenizer notation; "latin1" and
- "escape" 8-bit characters have been replaced with entities)::
-
- unicode \\[0-9a-f]{1,4}
- latin1 [¡-ÿ]
- escape {unicode}|\\[ -~¡-ÿ]
- nmchar [-a-z0-9]|{latin1}|{escape}
- name {nmchar}+
-
- The CSS1 "nmchar" rule does not include underscores ("_"), colons (":"),
- or periods ("."), therefore "class" and "id" attributes should not contain
- these characters. They should be replaced with hyphens ("-"). Combined
- with HTML's requirements (the first character must be a letter; no
- "unicode", "latin1", or "escape" characters), this results in the
- ``[a-z](-?[a-z0-9]+)*`` pattern.
-
- .. _HTML 4.01 spec: https://www.w3.org/TR/html401
- .. _CSS1 spec: https://www.w3.org/TR/REC-CSS1
- """
- id = string.lower()
- id = id.translate(_non_id_translate_digraphs)
- id = id.translate(_non_id_translate)
- # get rid of non-ascii characters.
- # 'ascii' lowercase to prevent problems with turkish locale.
- id = unicodedata.normalize(
- 'NFKD', id).encode('ascii', 'ignore').decode('ascii')
- # shrink runs of whitespace and replace by hyphen
- id = _non_id_chars.sub('-', ' '.join(id.split()))
- id = _non_id_at_ends.sub('', id)
- return str(id)
-
-
-_non_id_chars = re.compile('[^a-z0-9]+')
-_non_id_at_ends = re.compile('^[-0-9]+|-+$')
-_non_id_translate = {
- 0x00f8: 'o', # o with stroke
- 0x0111: 'd', # d with stroke
- 0x0127: 'h', # h with stroke
- 0x0131: 'i', # dotless i
- 0x0142: 'l', # l with stroke
- 0x0167: 't', # t with stroke
- 0x0180: 'b', # b with stroke
- 0x0183: 'b', # b with topbar
- 0x0188: 'c', # c with hook
- 0x018c: 'd', # d with topbar
- 0x0192: 'f', # f with hook
- 0x0199: 'k', # k with hook
- 0x019a: 'l', # l with bar
- 0x019e: 'n', # n with long right leg
- 0x01a5: 'p', # p with hook
- 0x01ab: 't', # t with palatal hook
- 0x01ad: 't', # t with hook
- 0x01b4: 'y', # y with hook
- 0x01b6: 'z', # z with stroke
- 0x01e5: 'g', # g with stroke
- 0x0225: 'z', # z with hook
- 0x0234: 'l', # l with curl
- 0x0235: 'n', # n with curl
- 0x0236: 't', # t with curl
- 0x0237: 'j', # dotless j
- 0x023c: 'c', # c with stroke
- 0x023f: 's', # s with swash tail
- 0x0240: 'z', # z with swash tail
- 0x0247: 'e', # e with stroke
- 0x0249: 'j', # j with stroke
- 0x024b: 'q', # q with hook tail
- 0x024d: 'r', # r with stroke
- 0x024f: 'y', # y with stroke
-}
-_non_id_translate_digraphs = {
- 0x00df: 'sz', # ligature sz
- 0x00e6: 'ae', # ae
- 0x0153: 'oe', # ligature oe
- 0x0238: 'db', # db digraph
- 0x0239: 'qp', # qp digraph
-}
-
-
-def dupname(node, name):
- node['dupnames'].append(name)
- node['names'].remove(name)
- # Assume that `node` is referenced, even though it isn't;
- # we don't want to throw unnecessary system_messages.
- node.referenced = True
-
-
-def fully_normalize_name(name):
- """Return a case- and whitespace-normalized name."""
- return ' '.join(name.lower().split())
-
-
-def whitespace_normalize_name(name):
- """Return a whitespace-normalized name."""
- return ' '.join(name.split())
-
-
-def serial_escape(value):
- """Escape string values that are elements of a list, for serialization."""
- return value.replace('\\', r'\\').replace(' ', r'\ ')
-
-
-def pseudo_quoteattr(value):
- """Quote attributes for pseudo-xml"""
- return '"%s"' % value
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/__init__.py b/release_env/lib/python3.12/site-packages/docutils/parsers/__init__.py
deleted file mode 100644
index f1bb268ea..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/__init__.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# $Id: __init__.py 9048 2022-03-29 21:50:15Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-This package contains Docutils parser modules.
-"""
-
-__docformat__ = 'reStructuredText'
-
-from importlib import import_module
-
-from docutils import Component, frontend
-
-
-class Parser(Component):
- settings_spec = (
- 'Generic Parser Options',
- None,
- (('Disable directives that insert the contents of an external file; '
- 'replaced with a "warning" system message.',
- ['--no-file-insertion'],
- {'action': 'store_false', 'default': 1,
- 'dest': 'file_insertion_enabled',
- 'validator': frontend.validate_boolean}),
- ('Enable directives that insert the contents '
- 'of an external file. (default)',
- ['--file-insertion-enabled'],
- {'action': 'store_true'}),
- ('Disable the "raw" directive; '
- 'replaced with a "warning" system message.',
- ['--no-raw'],
- {'action': 'store_false', 'default': 1, 'dest': 'raw_enabled',
- 'validator': frontend.validate_boolean}),
- ('Enable the "raw" directive. (default)',
- ['--raw-enabled'],
- {'action': 'store_true'}),
- ('Maximal number of characters in an input line. Default 10 000.',
- ['--line-length-limit'],
- {'metavar': '', 'type': 'int', 'default': 10000,
- 'validator': frontend.validate_nonnegative_int}),
- )
- )
- component_type = 'parser'
- config_section = 'parsers'
-
- def parse(self, inputstring, document):
- """Override to parse `inputstring` into document tree `document`."""
- raise NotImplementedError('subclass must override this method')
-
- def setup_parse(self, inputstring, document):
- """Initial parse setup. Call at start of `self.parse()`."""
- self.inputstring = inputstring
- # provide fallbacks in case the document has only generic settings
- document.settings.setdefault('file_insertion_enabled', False)
- document.settings.setdefault('raw_enabled', False)
- document.settings.setdefault('line_length_limit', 10000)
- self.document = document
- document.reporter.attach_observer(document.note_parse_message)
-
- def finish_parse(self):
- """Finalize parse details. Call at end of `self.parse()`."""
- self.document.reporter.detach_observer(
- self.document.note_parse_message)
-
-
-_parser_aliases = { # short names for known parsers
- 'null': 'docutils.parsers.null',
- # reStructuredText
- 'rst': 'docutils.parsers.rst',
- 'restructuredtext': 'docutils.parsers.rst',
- 'rest': 'docutils.parsers.rst',
- 'restx': 'docutils.parsers.rst',
- 'rtxt': 'docutils.parsers.rst',
- # 3rd-party Markdown parsers
- 'recommonmark': 'docutils.parsers.recommonmark_wrapper',
- 'myst': 'myst_parser.docutils_',
- # 'pycmark': works out of the box
- # dispatcher for 3rd-party Markdown parsers
- 'commonmark': 'docutils.parsers.commonmark_wrapper',
- 'markdown': 'docutils.parsers.commonmark_wrapper',
- }
-
-
-def get_parser_class(parser_name):
- """Return the Parser class from the `parser_name` module."""
- name = parser_name.lower()
- try:
- module = import_module(_parser_aliases.get(name, name))
- except ImportError as err:
- raise ImportError(f'Parser "{parser_name}" not found. {err}')
- return module.Parser
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/commonmark_wrapper.py b/release_env/lib/python3.12/site-packages/docutils/parsers/commonmark_wrapper.py
deleted file mode 100644
index ea538a6b8..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/commonmark_wrapper.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#! /usr/bin/env python3
-# :Copyright: © 2022 Günter Milde.
-# :License: Released under the terms of the `2-Clause BSD license`_, in short:
-#
-# Copying and distribution of this file, with or without modification,
-# are permitted in any medium without royalty provided the copyright
-# notice and this notice are preserved.
-# This file is offered as-is, without any warranty.
-#
-# .. _2-Clause BSD license: https://opensource.org/licenses/BSD-2-Clause
-#
-# Revision: $Revision: 9561 $
-# Date: $Date: 2024-03-14 17:34:48 +0100 (Do, 14. Mär 2024) $
-"""
-An interface for parsing CommonMark input.
-
-Select a locally installed parser from the following 3rd-party
-parser packages:
-
-:pycmark: https://pypi.org/project/pycmark/
-:myst: https://pypi.org/project/myst-docutils/
-:recommonmark: https://pypi.org/project/recommonmark/ (deprecated)
-
-The first parser class that can be successfully imported is mapped to
-`commonmark_wrapper.Parser`.
-
-This module is provisional:
-the API is not settled and may change with any minor Docutils version.
-"""
-
-import docutils.parsers
-
-
-commonmark_parser_names = ('pycmark', 'myst', 'recommonmark')
-"""Names of compatible drop-in CommonMark parsers"""
-
-Parser = None
-parser_name = ''
-
-for name in commonmark_parser_names:
- try:
- Parser = docutils.parsers.get_parser_class(name)
- except ImportError:
- continue
- parser_name = name
- break
-
-if Parser is None:
- raise ImportError(
- 'Parsing "CommonMark" requires one of the packages\n'
- f'{commonmark_parser_names} available at https://pypi.org')
-
-if parser_name == 'myst':
- if not Parser.settings_defaults:
- Parser.settings_defaults = {}
- Parser.settings_defaults['myst_commonmark_only'] = True
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/null.py b/release_env/lib/python3.12/site-packages/docutils/parsers/null.py
deleted file mode 100644
index 238c45025..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/null.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Martin Blais
-# Copyright: This module has been placed in the public domain.
-
-"""A do-nothing parser."""
-
-from docutils import parsers
-
-
-class Parser(parsers.Parser):
-
- """A do-nothing parser."""
-
- supported = ('null',)
-
- config_section = 'null parser'
- config_section_dependencies = ('parsers',)
-
- def parse(self, inputstring, document):
- pass
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/recommonmark_wrapper.py b/release_env/lib/python3.12/site-packages/docutils/parsers/recommonmark_wrapper.py
deleted file mode 100644
index 151a8bde4..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/recommonmark_wrapper.py
+++ /dev/null
@@ -1,147 +0,0 @@
-#!/usr/bin/env python3
-# :Copyright: © 2020 Günter Milde.
-# :License: Released under the terms of the `2-Clause BSD license`_, in short:
-#
-# Copying and distribution of this file, with or without modification,
-# are permitted in any medium without royalty provided the copyright
-# notice and this notice are preserved.
-# This file is offered as-is, without any warranty.
-#
-# .. _2-Clause BSD license: https://opensource.org/licenses/BSD-2-Clause
-#
-# Revision: $Revision: 9302 $
-# Date: $Date: 2022-12-02 18:14:05 +0100 (Fr, 02. Dez 2022) $
-"""
-A parser for CommonMark Markdown text using `recommonmark`__.
-
-__ https://pypi.org/project/recommonmark/
-
-.. important:: This module is provisional
-
- * The "recommonmark" package is unmaintained and deprecated.
- This wrapper module will be removed in a future Docutils version.
-
- * The API is not settled and may change with any minor Docutils version.
-"""
-
-from docutils import Component
-from docutils import nodes
-
-try:
- # If possible, import Sphinx's 'addnodes'
- from sphinx import addnodes
-except ImportError:
- # stub to prevent errors if Sphinx isn't installed
- import sys
- import types
-
- class pending_xref(nodes.Inline, nodes.Element): ... # NoQA
-
- sys.modules['sphinx'] = sphinx = types.ModuleType('sphinx')
- sphinx.addnodes = addnodes = types.SimpleNamespace()
- addnodes.pending_xref = pending_xref
-try:
- import recommonmark
- from recommonmark.parser import CommonMarkParser
-except ImportError as err:
- raise ImportError(
- 'Parsing "recommonmark" Markdown flavour requires the\n'
- ' package https://pypi.org/project/recommonmark.'
- ) from err
-else:
- if recommonmark.__version__ < '0.6.0':
- raise ImportError('The installed version of "recommonmark" is too old.'
- ' Update with "pip install -U recommonmark".')
-
-
-# auxiliary function for `document.findall()`
-def is_literal(node):
- return isinstance(node, (nodes.literal, nodes.literal_block))
-
-
-class Parser(CommonMarkParser):
- """MarkDown parser based on recommonmark.
-
- This parser is provisional:
- the API is not settled and may change with any minor Docutils version.
- """
- supported = ('recommonmark', 'commonmark', 'markdown', 'md')
- """Formats this parser supports."""
-
- config_section = 'recommonmark parser'
- config_section_dependencies = ('parsers',)
-
- def get_transforms(self):
- return Component.get_transforms(self) # + [AutoStructify]
-
- def parse(self, inputstring, document):
- """Use the upstream parser and clean up afterwards.
- """
- # check for exorbitantly long lines
- for i, line in enumerate(inputstring.split('\n')):
- if len(line) > document.settings.line_length_limit:
- error = document.reporter.error(
- 'Line %d exceeds the line-length-limit.'%(i+1))
- document.append(error)
- return
-
- # pass to upstream parser
- try:
- CommonMarkParser.parse(self, inputstring, document)
- except Exception as err:
- if document.settings.traceback:
- raise err
- error = document.reporter.error('Parsing with "recommonmark" '
- 'returned the error:\n%s'%err)
- document.append(error)
-
- # Post-Processing
- # ---------------
-
- # merge adjoining Text nodes:
- for node in document.findall(nodes.TextElement):
- children = node.children
- i = 0
- while i+1 < len(children):
- if (isinstance(children[i], nodes.Text)
- and isinstance(children[i+1], nodes.Text)):
- children[i] = nodes.Text(children[i]+children.pop(i+1))
- children[i].parent = node
- else:
- i += 1
-
- # add "code" class argument to literal elements (inline and block)
- for node in document.findall(is_literal):
- if 'code' not in node['classes']:
- node['classes'].append('code')
- # move "language" argument to classes
- for node in document.findall(nodes.literal_block):
- if 'language' in node.attributes:
- node['classes'].append(node['language'])
- del node['language']
-
- # replace raw nodes if raw is not allowed
- if not document.settings.raw_enabled:
- for node in document.findall(nodes.raw):
- warning = document.reporter.warning('Raw content disabled.')
- node.parent.replace(node, warning)
-
- # drop pending_xref (Sphinx cross reference extension)
- for node in document.findall(addnodes.pending_xref):
- reference = node.children[0]
- if 'name' not in reference:
- reference['name'] = nodes.fully_normalize_name(
- reference.astext())
- node.parent.replace(node, reference)
-
- def visit_document(self, node):
- """Dummy function to prevent spurious warnings.
-
- cf. https://github.com/readthedocs/recommonmark/issues/177
- """
- pass
-
- # Overwrite parent method with version that
- # doesn't pass deprecated `rawsource` argument to nodes.Text:
- def visit_text(self, mdnode):
- self.current_node.append(nodes.Text(mdnode.literal))
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/__init__.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/__init__.py
deleted file mode 100644
index 460a2e95d..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/__init__.py
+++ /dev/null
@@ -1,413 +0,0 @@
-# $Id: __init__.py 9258 2022-11-21 14:51:43Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-This is ``docutils.parsers.rst`` package. It exports a single class, `Parser`,
-the reStructuredText parser.
-
-
-Usage
-=====
-
-1. Create a parser::
-
- parser = docutils.parsers.rst.Parser()
-
- Several optional arguments may be passed to modify the parser's behavior.
- Please see `Customizing the Parser`_ below for details.
-
-2. Gather input (a multi-line string), by reading a file or the standard
- input::
-
- input = sys.stdin.read()
-
-3. Create a new empty `docutils.nodes.document` tree::
-
- document = docutils.utils.new_document(source, settings)
-
- See `docutils.utils.new_document()` for parameter details.
-
-4. Run the parser, populating the document tree::
-
- parser.parse(input, document)
-
-
-Parser Overview
-===============
-
-The reStructuredText parser is implemented as a state machine, examining its
-input one line at a time. To understand how the parser works, please first
-become familiar with the `docutils.statemachine` module, then see the
-`states` module.
-
-
-Customizing the Parser
-----------------------
-
-Anything that isn't already customizable is that way simply because that type
-of customizability hasn't been implemented yet. Patches welcome!
-
-When instantiating an object of the `Parser` class, two parameters may be
-passed: ``rfc2822`` and ``inliner``. Pass ``rfc2822=True`` to enable an
-initial RFC-2822 style header block, parsed as a "field_list" element (with
-"class" attribute set to "rfc2822"). Currently this is the only body-level
-element which is customizable without subclassing. (Tip: subclass `Parser`
-and change its "state_classes" and "initial_state" attributes to refer to new
-classes. Contact the author if you need more details.)
-
-The ``inliner`` parameter takes an instance of `states.Inliner` or a subclass.
-It handles inline markup recognition. A common extension is the addition of
-further implicit hyperlinks, like "RFC 2822". This can be done by subclassing
-`states.Inliner`, adding a new method for the implicit markup, and adding a
-``(pattern, method)`` pair to the "implicit_dispatch" attribute of the
-subclass. See `states.Inliner.implicit_inline()` for details. Explicit
-inline markup can be customized in a `states.Inliner` subclass via the
-``patterns.initial`` and ``dispatch`` attributes (and new methods as
-appropriate).
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import docutils.parsers
-import docutils.statemachine
-from docutils.parsers.rst import roles, states
-from docutils import frontend, nodes
-from docutils.transforms import universal
-
-
-class Parser(docutils.parsers.Parser):
-
- """The reStructuredText parser."""
-
- supported = ('rst', 'restructuredtext', 'rest', 'restx', 'rtxt', 'rstx')
- """Aliases this parser supports."""
-
- settings_spec = docutils.parsers.Parser.settings_spec + (
- 'reStructuredText Parser Options',
- None,
- (('Recognize and link to standalone PEP references (like "PEP 258").',
- ['--pep-references'],
- {'action': 'store_true', 'validator': frontend.validate_boolean}),
- ('Base URL for PEP references '
- '(default "https://peps.python.org/").',
- ['--pep-base-url'],
- {'metavar': '', 'default': 'https://peps.python.org/',
- 'validator': frontend.validate_url_trailing_slash}),
- ('Template for PEP file part of URL. (default "pep-%04d")',
- ['--pep-file-url-template'],
- {'metavar': '', 'default': 'pep-%04d'}),
- ('Recognize and link to standalone RFC references (like "RFC 822").',
- ['--rfc-references'],
- {'action': 'store_true', 'validator': frontend.validate_boolean}),
- ('Base URL for RFC references '
- '(default "https://tools.ietf.org/html/").',
- ['--rfc-base-url'],
- {'metavar': '', 'default': 'https://tools.ietf.org/html/',
- 'validator': frontend.validate_url_trailing_slash}),
- ('Set number of spaces for tab expansion (default 8).',
- ['--tab-width'],
- {'metavar': '', 'type': 'int', 'default': 8,
- 'validator': frontend.validate_nonnegative_int}),
- ('Remove spaces before footnote references.',
- ['--trim-footnote-reference-space'],
- {'action': 'store_true', 'validator': frontend.validate_boolean}),
- ('Leave spaces before footnote references.',
- ['--leave-footnote-reference-space'],
- {'action': 'store_false', 'dest': 'trim_footnote_reference_space'}),
- ('Token name set for parsing code with Pygments: one of '
- '"long", "short", or "none" (no parsing). Default is "long".',
- ['--syntax-highlight'],
- {'choices': ['long', 'short', 'none'],
- 'default': 'long', 'metavar': ''}),
- ('Change straight quotation marks to typographic form: '
- 'one of "yes", "no", "alt[ernative]" (default "no").',
- ['--smart-quotes'],
- {'default': False, 'metavar': '',
- 'validator': frontend.validate_ternary}),
- ('Characters to use as "smart quotes" for . ',
- ['--smartquotes-locales'],
- {'metavar': '',
- 'action': 'append',
- 'validator': frontend.validate_smartquotes_locales}),
- ('Inline markup recognized at word boundaries only '
- '(adjacent to punctuation or whitespace). '
- 'Force character-level inline markup recognition with '
- '"\\ " (backslash + space). Default.',
- ['--word-level-inline-markup'],
- {'action': 'store_false', 'dest': 'character_level_inline_markup'}),
- ('Inline markup recognized anywhere, regardless of surrounding '
- 'characters. Backslash-escapes must be used to avoid unwanted '
- 'markup recognition. Useful for East Asian languages. '
- 'Experimental.',
- ['--character-level-inline-markup'],
- {'action': 'store_true', 'default': False,
- 'dest': 'character_level_inline_markup'}),
- )
- )
-
- config_section = 'restructuredtext parser'
- config_section_dependencies = ('parsers',)
-
- def __init__(self, rfc2822=False, inliner=None):
- if rfc2822:
- self.initial_state = 'RFC2822Body'
- else:
- self.initial_state = 'Body'
- self.state_classes = states.state_classes
- self.inliner = inliner
-
- def get_transforms(self):
- return super().get_transforms() + [universal.SmartQuotes]
-
- def parse(self, inputstring, document):
- """Parse `inputstring` and populate `document`, a document tree."""
- self.setup_parse(inputstring, document)
- # provide fallbacks in case the document has only generic settings
- self.document.settings.setdefault('tab_width', 8)
- self.document.settings.setdefault('syntax_highlight', 'long')
- self.statemachine = states.RSTStateMachine(
- state_classes=self.state_classes,
- initial_state=self.initial_state,
- debug=document.reporter.debug_flag)
- inputlines = docutils.statemachine.string2lines(
- inputstring, tab_width=document.settings.tab_width,
- convert_whitespace=True)
- for i, line in enumerate(inputlines):
- if len(line) > self.document.settings.line_length_limit:
- error = self.document.reporter.error(
- 'Line %d exceeds the line-length-limit.'%(i+1))
- self.document.append(error)
- break
- else:
- self.statemachine.run(inputlines, document, inliner=self.inliner)
- # restore the "default" default role after parsing a document
- if '' in roles._roles:
- del roles._roles['']
- self.finish_parse()
-
-
-class DirectiveError(Exception):
-
- """
- Store a message and a system message level.
-
- To be thrown from inside directive code.
-
- Do not instantiate directly -- use `Directive.directive_error()`
- instead!
- """
-
- def __init__(self, level, message):
- """Set error `message` and `level`"""
- Exception.__init__(self)
- self.level = level
- self.msg = message
-
-
-class Directive:
-
- """
- Base class for reStructuredText directives.
-
- The following attributes may be set by subclasses. They are
- interpreted by the directive parser (which runs the directive
- class):
-
- - `required_arguments`: The number of required arguments (default:
- 0).
-
- - `optional_arguments`: The number of optional arguments (default:
- 0).
-
- - `final_argument_whitespace`: A boolean, indicating if the final
- argument may contain whitespace (default: False).
-
- - `option_spec`: A dictionary, mapping known option names to
- conversion functions such as `int` or `float` (default: {}, no
- options). Several conversion functions are defined in the
- directives/__init__.py module.
-
- Option conversion functions take a single parameter, the option
- argument (a string or ``None``), validate it and/or convert it
- to the appropriate form. Conversion functions may raise
- `ValueError` and `TypeError` exceptions.
-
- - `has_content`: A boolean; True if content is allowed. Client
- code must handle the case where content is required but not
- supplied (an empty content list will be supplied).
-
- Arguments are normally single whitespace-separated words. The
- final argument may contain whitespace and/or newlines if
- `final_argument_whitespace` is True.
-
- If the form of the arguments is more complex, specify only one
- argument (either required or optional) and set
- `final_argument_whitespace` to True; the client code must do any
- context-sensitive parsing.
-
- When a directive implementation is being run, the directive class
- is instantiated, and the `run()` method is executed. During
- instantiation, the following instance variables are set:
-
- - ``name`` is the directive type or name (string).
-
- - ``arguments`` is the list of positional arguments (strings).
-
- - ``options`` is a dictionary mapping option names (strings) to
- values (type depends on option conversion functions; see
- `option_spec` above).
-
- - ``content`` is a list of strings, the directive content line by line.
-
- - ``lineno`` is the absolute line number of the first line
- of the directive.
-
- - ``content_offset`` is the line offset of the first line
- of the content from the beginning of the current input.
- Used when initiating a nested parse.
-
- - ``block_text`` is a string containing the entire directive.
-
- - ``state`` is the state which called the directive function.
-
- - ``state_machine`` is the state machine which controls the state
- which called the directive function.
-
- - ``reporter`` is the state machine's `reporter` instance.
-
- Directive functions return a list of nodes which will be inserted
- into the document tree at the point where the directive was
- encountered. This can be an empty list if there is nothing to
- insert.
-
- For ordinary directives, the list must contain body elements or
- structural elements. Some directives are intended specifically
- for substitution definitions, and must return a list of `Text`
- nodes and/or inline elements (suitable for inline insertion, in
- place of the substitution reference). Such directives must verify
- substitution definition context, typically using code like this::
-
- if not isinstance(state, states.SubstitutionDef):
- error = self.reporter.error(
- 'Invalid context: the "%s" directive can only be used '
- 'within a substitution definition.' % (name),
- nodes.literal_block(block_text, block_text), line=lineno)
- return [error]
- """
-
- # There is a "Creating reStructuredText Directives" how-to at
- # . If you
- # update this docstring, please update the how-to as well.
-
- required_arguments = 0
- """Number of required directive arguments."""
-
- optional_arguments = 0
- """Number of optional arguments after the required arguments."""
-
- final_argument_whitespace = False
- """May the final argument contain whitespace?"""
-
- option_spec = None
- """Mapping of option names to validator functions."""
-
- has_content = False
- """May the directive have content?"""
-
- def __init__(self, name, arguments, options, content, lineno,
- content_offset, block_text, state, state_machine):
- self.name = name
- self.arguments = arguments
- self.options = options
- self.content = content
- self.lineno = lineno
- self.content_offset = content_offset
- self.block_text = block_text
- self.state = state
- self.state_machine = state_machine
- self.reporter = state_machine.reporter
-
- def run(self):
- raise NotImplementedError('Must override run() in subclass.')
-
- # Directive errors:
-
- def directive_error(self, level, message):
- """
- Return a DirectiveError suitable for being thrown as an exception.
-
- Call "raise self.directive_error(level, message)" from within
- a directive implementation to return one single system message
- at level `level`, which automatically gets the directive block
- and the line number added.
-
- Preferably use the `debug`, `info`, `warning`, `error`, or `severe`
- wrapper methods, e.g. ``self.error(message)`` to generate an
- ERROR-level directive error.
- """
- return DirectiveError(level, message)
-
- def debug(self, message):
- return self.directive_error(0, message)
-
- def info(self, message):
- return self.directive_error(1, message)
-
- def warning(self, message):
- return self.directive_error(2, message)
-
- def error(self, message):
- return self.directive_error(3, message)
-
- def severe(self, message):
- return self.directive_error(4, message)
-
- # Convenience methods:
-
- def assert_has_content(self):
- """
- Throw an ERROR-level DirectiveError if the directive doesn't
- have contents.
- """
- if not self.content:
- raise self.error('Content block expected for the "%s" directive; '
- 'none found.' % self.name)
-
- def add_name(self, node):
- """Append self.options['name'] to node['names'] if it exists.
-
- Also normalize the name string and register it as explicit target.
- """
- if 'name' in self.options:
- name = nodes.fully_normalize_name(self.options.pop('name'))
- if 'name' in node:
- del node['name']
- node['names'].append(name)
- self.state.document.note_explicit_target(node, node)
-
-
-def convert_directive_function(directive_fn):
- """
- Define & return a directive class generated from `directive_fn`.
-
- `directive_fn` uses the old-style, functional interface.
- """
-
- class FunctionalDirective(Directive):
-
- option_spec = getattr(directive_fn, 'options', None)
- has_content = getattr(directive_fn, 'content', False)
- _argument_spec = getattr(directive_fn, 'arguments', (0, 0, False))
- required_arguments, optional_arguments, final_argument_whitespace \
- = _argument_spec
-
- def run(self):
- return directive_fn(
- self.name, self.arguments, self.options, self.content,
- self.lineno, self.content_offset, self.block_text,
- self.state, self.state_machine)
-
- # Return new-style directive.
- return FunctionalDirective
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/__init__.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/__init__.py
deleted file mode 100644
index ebbdfe3b4..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/__init__.py
+++ /dev/null
@@ -1,466 +0,0 @@
-# $Id: __init__.py 9426 2023-07-03 12:38:54Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-This package contains directive implementation modules.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import re
-import codecs
-from importlib import import_module
-
-from docutils import nodes, parsers
-from docutils.utils import split_escaped_whitespace, escape2null
-from docutils.parsers.rst.languages import en as _fallback_language_module
-
-
-_directive_registry = {
- 'attention': ('admonitions', 'Attention'),
- 'caution': ('admonitions', 'Caution'),
- 'code': ('body', 'CodeBlock'),
- 'danger': ('admonitions', 'Danger'),
- 'error': ('admonitions', 'Error'),
- 'important': ('admonitions', 'Important'),
- 'note': ('admonitions', 'Note'),
- 'tip': ('admonitions', 'Tip'),
- 'hint': ('admonitions', 'Hint'),
- 'warning': ('admonitions', 'Warning'),
- 'admonition': ('admonitions', 'Admonition'),
- 'sidebar': ('body', 'Sidebar'),
- 'topic': ('body', 'Topic'),
- 'line-block': ('body', 'LineBlock'),
- 'parsed-literal': ('body', 'ParsedLiteral'),
- 'math': ('body', 'MathBlock'),
- 'rubric': ('body', 'Rubric'),
- 'epigraph': ('body', 'Epigraph'),
- 'highlights': ('body', 'Highlights'),
- 'pull-quote': ('body', 'PullQuote'),
- 'compound': ('body', 'Compound'),
- 'container': ('body', 'Container'),
- # 'questions': ('body', 'question_list'),
- 'table': ('tables', 'RSTTable'),
- 'csv-table': ('tables', 'CSVTable'),
- 'list-table': ('tables', 'ListTable'),
- 'image': ('images', 'Image'),
- 'figure': ('images', 'Figure'),
- 'contents': ('parts', 'Contents'),
- 'sectnum': ('parts', 'Sectnum'),
- 'header': ('parts', 'Header'),
- 'footer': ('parts', 'Footer'),
- # 'footnotes': ('parts', 'footnotes'),
- # 'citations': ('parts', 'citations'),
- 'target-notes': ('references', 'TargetNotes'),
- 'meta': ('misc', 'Meta'),
- # 'imagemap': ('html', 'imagemap'),
- 'raw': ('misc', 'Raw'),
- 'include': ('misc', 'Include'),
- 'replace': ('misc', 'Replace'),
- 'unicode': ('misc', 'Unicode'),
- 'class': ('misc', 'Class'),
- 'role': ('misc', 'Role'),
- 'default-role': ('misc', 'DefaultRole'),
- 'title': ('misc', 'Title'),
- 'date': ('misc', 'Date'),
- 'restructuredtext-test-directive': ('misc', 'TestDirective'),
- }
-"""Mapping of directive name to (module name, class name). The
-directive name is canonical & must be lowercase. Language-dependent
-names are defined in the ``language`` subpackage."""
-
-_directives = {}
-"""Cache of imported directives."""
-
-
-def directive(directive_name, language_module, document):
- """
- Locate and return a directive function from its language-dependent name.
- If not found in the current language, check English. Return None if the
- named directive cannot be found.
- """
- normname = directive_name.lower()
- messages = []
- msg_text = []
- if normname in _directives:
- return _directives[normname], messages
- canonicalname = None
- try:
- canonicalname = language_module.directives[normname]
- except AttributeError as error:
- msg_text.append('Problem retrieving directive entry from language '
- 'module %r: %s.' % (language_module, error))
- except KeyError:
- msg_text.append('No directive entry for "%s" in module "%s".'
- % (directive_name, language_module.__name__))
- if not canonicalname:
- try:
- canonicalname = _fallback_language_module.directives[normname]
- msg_text.append('Using English fallback for directive "%s".'
- % directive_name)
- except KeyError:
- msg_text.append('Trying "%s" as canonical directive name.'
- % directive_name)
- # The canonical name should be an English name, but just in case:
- canonicalname = normname
- if msg_text:
- message = document.reporter.info(
- '\n'.join(msg_text), line=document.current_line)
- messages.append(message)
- try:
- modulename, classname = _directive_registry[canonicalname]
- except KeyError:
- # Error handling done by caller.
- return None, messages
- try:
- module = import_module('docutils.parsers.rst.directives.'+modulename)
- except ImportError as detail:
- messages.append(document.reporter.error(
- 'Error importing directive module "%s" (directive "%s"):\n%s'
- % (modulename, directive_name, detail),
- line=document.current_line))
- return None, messages
- try:
- directive = getattr(module, classname)
- _directives[normname] = directive
- except AttributeError:
- messages.append(document.reporter.error(
- 'No directive class "%s" in module "%s" (directive "%s").'
- % (classname, modulename, directive_name),
- line=document.current_line))
- return None, messages
- return directive, messages
-
-
-def register_directive(name, directive):
- """
- Register a nonstandard application-defined directive function.
- Language lookups are not needed for such functions.
- """
- _directives[name] = directive
-
-
-# conversion functions for `Directive.option_spec`
-# ------------------------------------------------
-#
-# see also `parsers.rst.Directive` in ../__init__.py.
-
-
-def flag(argument):
- """
- Check for a valid flag option (no argument) and return ``None``.
- (Directive option conversion function.)
-
- Raise ``ValueError`` if an argument is found.
- """
- if argument and argument.strip():
- raise ValueError('no argument is allowed; "%s" supplied' % argument)
- else:
- return None
-
-
-def unchanged_required(argument):
- """
- Return the argument text, unchanged.
- (Directive option conversion function.)
-
- Raise ``ValueError`` if no argument is found.
- """
- if argument is None:
- raise ValueError('argument required but none supplied')
- else:
- return argument # unchanged!
-
-
-def unchanged(argument):
- """
- Return the argument text, unchanged.
- (Directive option conversion function.)
-
- No argument implies empty string ("").
- """
- if argument is None:
- return ''
- else:
- return argument # unchanged!
-
-
-def path(argument):
- """
- Return the path argument unwrapped (with newlines removed).
- (Directive option conversion function.)
-
- Raise ``ValueError`` if no argument is found.
- """
- if argument is None:
- raise ValueError('argument required but none supplied')
- else:
- return ''.join(s.strip() for s in argument.splitlines())
-
-
-def uri(argument):
- """
- Return the URI argument with unescaped whitespace removed.
- (Directive option conversion function.)
-
- Raise ``ValueError`` if no argument is found.
- """
- if argument is None:
- raise ValueError('argument required but none supplied')
- else:
- parts = split_escaped_whitespace(escape2null(argument))
- return ' '.join(''.join(nodes.unescape(part).split())
- for part in parts)
-
-
-def nonnegative_int(argument):
- """
- Check for a nonnegative integer argument; raise ``ValueError`` if not.
- (Directive option conversion function.)
- """
- value = int(argument)
- if value < 0:
- raise ValueError('negative value; must be positive or zero')
- return value
-
-
-def percentage(argument):
- """
- Check for an integer percentage value with optional percent sign.
- (Directive option conversion function.)
- """
- try:
- argument = argument.rstrip(' %')
- except AttributeError:
- pass
- return nonnegative_int(argument)
-
-
-length_units = ['em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc']
-
-
-def get_measure(argument, units):
- """
- Check for a positive argument of one of the units and return a
- normalized string of the form "" (without space in
- between).
- (Directive option conversion function.)
-
- To be called from directive option conversion functions.
- """
- match = re.match(r'^([0-9.]+) *(%s)$' % '|'.join(units), argument)
- try:
- float(match.group(1))
- except (AttributeError, ValueError):
- raise ValueError(
- 'not a positive measure of one of the following units:\n%s'
- % ' '.join('"%s"' % i for i in units))
- return match.group(1) + match.group(2)
-
-
-def length_or_unitless(argument):
- return get_measure(argument, length_units + [''])
-
-
-def length_or_percentage_or_unitless(argument, default=''):
- """
- Return normalized string of a length or percentage unit.
- (Directive option conversion function.)
-
- Add if there is no unit. Raise ValueError if the argument is not
- a positive measure of one of the valid CSS units (or without unit).
-
- >>> length_or_percentage_or_unitless('3 pt')
- '3pt'
- >>> length_or_percentage_or_unitless('3%', 'em')
- '3%'
- >>> length_or_percentage_or_unitless('3')
- '3'
- >>> length_or_percentage_or_unitless('3', 'px')
- '3px'
- """
- try:
- return get_measure(argument, length_units + ['%'])
- except ValueError:
- try:
- return get_measure(argument, ['']) + default
- except ValueError:
- # raise ValueError with list of valid units:
- return get_measure(argument, length_units + ['%'])
-
-
-def class_option(argument):
- """
- Convert the argument into a list of ID-compatible strings and return it.
- (Directive option conversion function.)
-
- Raise ``ValueError`` if no argument is found.
- """
- if argument is None:
- raise ValueError('argument required but none supplied')
- names = argument.split()
- class_names = []
- for name in names:
- class_name = nodes.make_id(name)
- if not class_name:
- raise ValueError('cannot make "%s" into a class name' % name)
- class_names.append(class_name)
- return class_names
-
-
-unicode_pattern = re.compile(
- r'(?:0x|x|\\x|U\+?|\\u)([0-9a-f]+)$|([0-9a-f]+);$', re.IGNORECASE)
-
-
-def unicode_code(code):
- r"""
- Convert a Unicode character code to a Unicode character.
- (Directive option conversion function.)
-
- Codes may be decimal numbers, hexadecimal numbers (prefixed by ``0x``,
- ``x``, ``\x``, ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style
- numeric character entities (e.g. ``☮``). Other text remains as-is.
-
- Raise ValueError for illegal Unicode code values.
- """
- try:
- if code.isdigit(): # decimal number
- return chr(int(code))
- else:
- match = unicode_pattern.match(code)
- if match: # hex number
- value = match.group(1) or match.group(2)
- return chr(int(value, 16))
- else: # other text
- return code
- except OverflowError as detail:
- raise ValueError('code too large (%s)' % detail)
-
-
-def single_char_or_unicode(argument):
- """
- A single character is returned as-is. Unicode character codes are
- converted as in `unicode_code`. (Directive option conversion function.)
- """
- char = unicode_code(argument)
- if len(char) > 1:
- raise ValueError('%r invalid; must be a single character or '
- 'a Unicode code' % char)
- return char
-
-
-def single_char_or_whitespace_or_unicode(argument):
- """
- As with `single_char_or_unicode`, but "tab" and "space" are also supported.
- (Directive option conversion function.)
- """
- if argument == 'tab':
- char = '\t'
- elif argument == 'space':
- char = ' '
- else:
- char = single_char_or_unicode(argument)
- return char
-
-
-def positive_int(argument):
- """
- Converts the argument into an integer. Raises ValueError for negative,
- zero, or non-integer values. (Directive option conversion function.)
- """
- value = int(argument)
- if value < 1:
- raise ValueError('negative or zero value; must be positive')
- return value
-
-
-def positive_int_list(argument):
- """
- Converts a space- or comma-separated list of values into a Python list
- of integers.
- (Directive option conversion function.)
-
- Raises ValueError for non-positive-integer values.
- """
- if ',' in argument:
- entries = argument.split(',')
- else:
- entries = argument.split()
- return [positive_int(entry) for entry in entries]
-
-
-def encoding(argument):
- """
- Verifies the encoding argument by lookup.
- (Directive option conversion function.)
-
- Raises ValueError for unknown encodings.
- """
- try:
- codecs.lookup(argument)
- except LookupError:
- raise ValueError('unknown encoding: "%s"' % argument)
- return argument
-
-
-def choice(argument, values):
- """
- Directive option utility function, supplied to enable options whose
- argument must be a member of a finite set of possible values (must be
- lower case). A custom conversion function must be written to use it. For
- example::
-
- from docutils.parsers.rst import directives
-
- def yesno(argument):
- return directives.choice(argument, ('yes', 'no'))
-
- Raise ``ValueError`` if no argument is found or if the argument's value is
- not valid (not an entry in the supplied list).
- """
- try:
- value = argument.lower().strip()
- except AttributeError:
- raise ValueError('must supply an argument; choose from %s'
- % format_values(values))
- if value in values:
- return value
- else:
- raise ValueError('"%s" unknown; choose from %s'
- % (argument, format_values(values)))
-
-
-def format_values(values):
- return '%s, or "%s"' % (', '.join('"%s"' % s for s in values[:-1]),
- values[-1])
-
-
-def value_or(values, other):
- """
- Directive option conversion function.
-
- The argument can be any of `values` or `argument_type`.
- """
- def auto_or_other(argument):
- if argument in values:
- return argument
- else:
- return other(argument)
- return auto_or_other
-
-
-def parser_name(argument):
- """
- Return a docutils parser whose name matches the argument.
- (Directive option conversion function.)
-
- Return `None`, if the argument evaluates to `False`.
- Raise `ValueError` if importing the parser module fails.
- """
- if not argument:
- return None
- try:
- return parsers.get_parser_class(argument)
- except ImportError as err:
- raise ValueError(str(err))
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/admonitions.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/admonitions.py
deleted file mode 100644
index 1990099e3..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/admonitions.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# $Id: admonitions.py 9475 2023-11-13 22:30:00Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-Admonition directives.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.roles import set_classes
-from docutils import nodes
-
-
-class BaseAdmonition(Directive):
-
- final_argument_whitespace = True
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged}
- has_content = True
-
- node_class = None
- """Subclasses must set this to the appropriate admonition node class."""
-
- def run(self):
- set_classes(self.options)
- self.assert_has_content()
- text = '\n'.join(self.content)
- admonition_node = self.node_class(text, **self.options)
- self.add_name(admonition_node)
- admonition_node.source, admonition_node.line = \
- self.state_machine.get_source_and_line(self.lineno)
- if self.node_class is nodes.admonition:
- title_text = self.arguments[0]
- textnodes, messages = self.state.inline_text(title_text,
- self.lineno)
- title = nodes.title(title_text, '', *textnodes)
- title.source, title.line = (
- self.state_machine.get_source_and_line(self.lineno))
- admonition_node += title
- admonition_node += messages
- if 'classes' not in self.options:
- admonition_node['classes'] += ['admonition-'
- + nodes.make_id(title_text)]
- self.state.nested_parse(self.content, self.content_offset,
- admonition_node)
- return [admonition_node]
-
-
-class Admonition(BaseAdmonition):
-
- required_arguments = 1
- node_class = nodes.admonition
-
-
-class Attention(BaseAdmonition):
-
- node_class = nodes.attention
-
-
-class Caution(BaseAdmonition):
-
- node_class = nodes.caution
-
-
-class Danger(BaseAdmonition):
-
- node_class = nodes.danger
-
-
-class Error(BaseAdmonition):
-
- node_class = nodes.error
-
-
-class Hint(BaseAdmonition):
-
- node_class = nodes.hint
-
-
-class Important(BaseAdmonition):
-
- node_class = nodes.important
-
-
-class Note(BaseAdmonition):
-
- node_class = nodes.note
-
-
-class Tip(BaseAdmonition):
-
- node_class = nodes.tip
-
-
-class Warning(BaseAdmonition):
-
- node_class = nodes.warning
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/body.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/body.py
deleted file mode 100644
index 5cb904163..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/body.py
+++ /dev/null
@@ -1,305 +0,0 @@
-# $Id: body.py 9500 2023-12-14 22:38:49Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for additional body elements.
-
-See `docutils.parsers.rst.directives` for API details.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-from docutils import nodes
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.roles import set_classes
-from docutils.utils.code_analyzer import Lexer, LexerError, NumberLines
-
-
-class BasePseudoSection(Directive):
-
- required_arguments = 1
- optional_arguments = 0
- final_argument_whitespace = True
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged}
- has_content = True
-
- node_class = None
- """Node class to be used (must be set in subclasses)."""
-
- def run(self):
- if not (self.state_machine.match_titles
- or isinstance(self.state_machine.node, nodes.sidebar)):
- raise self.error('The "%s" directive may not be used within '
- 'topics or body elements.' % self.name)
- self.assert_has_content()
- if self.arguments: # title (in sidebars optional)
- title_text = self.arguments[0]
- textnodes, messages = self.state.inline_text(
- title_text, self.lineno)
- titles = [nodes.title(title_text, '', *textnodes)]
- # Sidebar uses this code.
- if 'subtitle' in self.options:
- textnodes, more_messages = self.state.inline_text(
- self.options['subtitle'], self.lineno)
- titles.append(nodes.subtitle(self.options['subtitle'], '',
- *textnodes))
- messages.extend(more_messages)
- else:
- titles = []
- messages = []
- text = '\n'.join(self.content)
- node = self.node_class(text, *(titles + messages))
- node['classes'] += self.options.get('class', [])
- self.add_name(node)
- if text:
- self.state.nested_parse(self.content, self.content_offset, node)
- return [node]
-
-
-class Topic(BasePseudoSection):
-
- node_class = nodes.topic
-
-
-class Sidebar(BasePseudoSection):
-
- node_class = nodes.sidebar
-
- required_arguments = 0
- optional_arguments = 1
- option_spec = BasePseudoSection.option_spec.copy()
- option_spec['subtitle'] = directives.unchanged_required
-
- def run(self):
- if isinstance(self.state_machine.node, nodes.sidebar):
- raise self.error('The "%s" directive may not be used within a '
- 'sidebar element.' % self.name)
- if 'subtitle' in self.options and not self.arguments:
- raise self.error('The "subtitle" option may not be used '
- 'without a title.')
-
- return BasePseudoSection.run(self)
-
-
-class LineBlock(Directive):
-
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged}
- has_content = True
-
- def run(self):
- self.assert_has_content()
- block = nodes.line_block(classes=self.options.get('class', []))
- self.add_name(block)
- node_list = [block]
- for line_text in self.content:
- text_nodes, messages = self.state.inline_text(
- line_text.strip(), self.lineno + self.content_offset)
- line = nodes.line(line_text, '', *text_nodes)
- if line_text.strip():
- line.indent = len(line_text) - len(line_text.lstrip())
- block += line
- node_list.extend(messages)
- self.content_offset += 1
- self.state.nest_line_block_lines(block)
- return node_list
-
-
-class ParsedLiteral(Directive):
-
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged}
- has_content = True
-
- def run(self):
- set_classes(self.options)
- self.assert_has_content()
- text = '\n'.join(self.content)
- text_nodes, messages = self.state.inline_text(text, self.lineno)
- node = nodes.literal_block(text, '', *text_nodes, **self.options)
- node.line = self.content_offset + 1
- self.add_name(node)
- return [node] + messages
-
-
-class CodeBlock(Directive):
- """Parse and mark up content of a code block.
-
- Configuration setting: syntax_highlight
- Highlight Code content with Pygments?
- Possible values: ('long', 'short', 'none')
-
- """
- optional_arguments = 1
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged,
- 'number-lines': directives.unchanged # integer or None
- }
- has_content = True
-
- def run(self):
- self.assert_has_content()
- if self.arguments:
- language = self.arguments[0]
- else:
- language = ''
- set_classes(self.options)
- classes = ['code']
- if language:
- classes.append(language)
- if 'classes' in self.options:
- classes.extend(self.options['classes'])
-
- # set up lexical analyzer
- try:
- tokens = Lexer('\n'.join(self.content), language,
- self.state.document.settings.syntax_highlight)
- except LexerError as error:
- if self.state.document.settings.report_level > 2:
- # don't report warnings -> insert without syntax highlight
- tokens = Lexer('\n'.join(self.content), language, 'none')
- else:
- raise self.warning(error)
-
- if 'number-lines' in self.options:
- # optional argument `startline`, defaults to 1
- try:
- startline = int(self.options['number-lines'] or 1)
- except ValueError:
- raise self.error(':number-lines: with non-integer start value')
- endline = startline + len(self.content)
- # add linenumber filter:
- tokens = NumberLines(tokens, startline, endline)
-
- node = nodes.literal_block('\n'.join(self.content), classes=classes)
- self.add_name(node)
- # if called from "include", set the source
- if 'source' in self.options:
- node.attributes['source'] = self.options['source']
- # analyze content and add nodes for every token
- for classes, value in tokens:
- if classes:
- node += nodes.inline(value, value, classes=classes)
- else:
- # insert as Text to decrease the verbosity of the output
- node += nodes.Text(value)
-
- return [node]
-
-
-class MathBlock(Directive):
-
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged,
- # TODO: Add Sphinx' ``mathbase.py`` option 'nowrap'?
- # 'nowrap': directives.flag,
- }
- has_content = True
-
- def run(self):
- set_classes(self.options)
- self.assert_has_content()
- # join lines, separate blocks
- content = '\n'.join(self.content).split('\n\n')
- _nodes = []
- for block in content:
- if not block:
- continue
- node = nodes.math_block(self.block_text, block, **self.options)
- (node.source,
- node.line) = self.state_machine.get_source_and_line(self.lineno)
- self.add_name(node)
- _nodes.append(node)
- return _nodes
-
-
-class Rubric(Directive):
-
- required_arguments = 1
- optional_arguments = 0
- final_argument_whitespace = True
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged}
-
- def run(self):
- set_classes(self.options)
- rubric_text = self.arguments[0]
- textnodes, messages = self.state.inline_text(rubric_text, self.lineno)
- rubric = nodes.rubric(rubric_text, '', *textnodes, **self.options)
- self.add_name(rubric)
- return [rubric] + messages
-
-
-class BlockQuote(Directive):
-
- has_content = True
- classes = []
-
- def run(self):
- self.assert_has_content()
- elements = self.state.block_quote(self.content, self.content_offset)
- for element in elements:
- if isinstance(element, nodes.block_quote):
- element['classes'] += self.classes
- return elements
-
-
-class Epigraph(BlockQuote):
-
- classes = ['epigraph']
-
-
-class Highlights(BlockQuote):
-
- classes = ['highlights']
-
-
-class PullQuote(BlockQuote):
-
- classes = ['pull-quote']
-
-
-class Compound(Directive):
-
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged}
- has_content = True
-
- def run(self):
- self.assert_has_content()
- text = '\n'.join(self.content)
- node = nodes.compound(text)
- node['classes'] += self.options.get('class', [])
- self.add_name(node)
- self.state.nested_parse(self.content, self.content_offset, node)
- return [node]
-
-
-class Container(Directive):
-
- optional_arguments = 1
- final_argument_whitespace = True
- option_spec = {'name': directives.unchanged}
- has_content = True
-
- def run(self):
- self.assert_has_content()
- text = '\n'.join(self.content)
- try:
- if self.arguments:
- classes = directives.class_option(self.arguments[0])
- else:
- classes = []
- except ValueError:
- raise self.error(
- 'Invalid class attribute value for "%s" directive: "%s".'
- % (self.name, self.arguments[0]))
- node = nodes.container(text)
- node['classes'].extend(classes)
- self.add_name(node)
- self.state.nested_parse(self.content, self.content_offset, node)
- return [node]
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/html.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/html.py
deleted file mode 100644
index c22a26f2d..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/html.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# $Id: html.py 9062 2022-05-30 21:09:09Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-Dummy module for backwards compatibility.
-
-This module is provisional: it will be removed in Docutils 2.0.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import warnings
-
-from docutils.parsers.rst.directives.misc import MetaBody, Meta # noqa: F401
-
-warnings.warn('The `docutils.parsers.rst.directive.html` module'
- ' will be removed in Docutils 2.0.'
- ' Since Docutils 0.18, the "Meta" node is defined in'
- ' `docutils.parsers.rst.directives.misc`.',
- DeprecationWarning, stacklevel=2)
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/images.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/images.py
deleted file mode 100644
index bcde3a398..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/images.py
+++ /dev/null
@@ -1,173 +0,0 @@
-# $Id: images.py 9500 2023-12-14 22:38:49Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for figures and simple images.
-"""
-
-__docformat__ = 'reStructuredText'
-
-from urllib.request import url2pathname
-
-try: # check for the Python Imaging Library
- import PIL.Image
-except ImportError:
- try: # sometimes PIL modules are put in PYTHONPATH's root
- import Image
- class PIL: pass # noqa:E701 dummy wrapper
- PIL.Image = Image
- except ImportError:
- PIL = None
-
-from docutils import nodes
-from docutils.nodes import fully_normalize_name, whitespace_normalize_name
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives, states
-from docutils.parsers.rst.roles import set_classes
-
-
-class Image(Directive):
-
- align_h_values = ('left', 'center', 'right')
- align_v_values = ('top', 'middle', 'bottom')
- align_values = align_v_values + align_h_values
- loading_values = ('embed', 'link', 'lazy')
-
- def align(argument):
- # This is not callable as `self.align()`. We cannot make it a
- # staticmethod because we're saving an unbound method in
- # option_spec below.
- return directives.choice(argument, Image.align_values)
-
- def loading(argument):
- # This is not callable as `self.loading()` (see above).
- return directives.choice(argument, Image.loading_values)
-
- required_arguments = 1
- optional_arguments = 0
- final_argument_whitespace = True
- option_spec = {'alt': directives.unchanged,
- 'height': directives.length_or_unitless,
- 'width': directives.length_or_percentage_or_unitless,
- 'scale': directives.percentage,
- 'align': align,
- 'target': directives.unchanged_required,
- 'loading': loading,
- 'class': directives.class_option,
- 'name': directives.unchanged}
-
- def run(self):
- if 'align' in self.options:
- if isinstance(self.state, states.SubstitutionDef):
- # Check for align_v_values.
- if self.options['align'] not in self.align_v_values:
- raise self.error(
- 'Error in "%s" directive: "%s" is not a valid value '
- 'for the "align" option within a substitution '
- 'definition. Valid values for "align" are: "%s".'
- % (self.name, self.options['align'],
- '", "'.join(self.align_v_values)))
- elif self.options['align'] not in self.align_h_values:
- raise self.error(
- 'Error in "%s" directive: "%s" is not a valid value for '
- 'the "align" option. Valid values for "align" are: "%s".'
- % (self.name, self.options['align'],
- '", "'.join(self.align_h_values)))
- messages = []
- reference = directives.uri(self.arguments[0])
- self.options['uri'] = reference
- reference_node = None
- if 'target' in self.options:
- block = states.escape2null(
- self.options['target']).splitlines()
- block = [line for line in block]
- target_type, data = self.state.parse_target(
- block, self.block_text, self.lineno)
- if target_type == 'refuri':
- reference_node = nodes.reference(refuri=data)
- elif target_type == 'refname':
- reference_node = nodes.reference(
- refname=fully_normalize_name(data),
- name=whitespace_normalize_name(data))
- reference_node.indirect_reference_name = data
- self.state.document.note_refname(reference_node)
- else: # malformed target
- messages.append(data) # data is a system message
- del self.options['target']
- set_classes(self.options)
- image_node = nodes.image(self.block_text, **self.options)
- (image_node.source,
- image_node.line) = self.state_machine.get_source_and_line(self.lineno)
- self.add_name(image_node)
- if reference_node:
- reference_node += image_node
- return messages + [reference_node]
- else:
- return messages + [image_node]
-
-
-class Figure(Image):
-
- def align(argument):
- return directives.choice(argument, Figure.align_h_values)
-
- def figwidth_value(argument):
- if argument.lower() == 'image':
- return 'image'
- else:
- return directives.length_or_percentage_or_unitless(argument, 'px')
-
- option_spec = Image.option_spec.copy()
- option_spec['figwidth'] = figwidth_value
- option_spec['figclass'] = directives.class_option
- option_spec['align'] = align
- has_content = True
-
- def run(self):
- figwidth = self.options.pop('figwidth', None)
- figclasses = self.options.pop('figclass', None)
- align = self.options.pop('align', None)
- (image_node,) = Image.run(self)
- if isinstance(image_node, nodes.system_message):
- return [image_node]
- figure_node = nodes.figure('', image_node)
- (figure_node.source, figure_node.line
- ) = self.state_machine.get_source_and_line(self.lineno)
- if figwidth == 'image':
- if PIL and self.state.document.settings.file_insertion_enabled:
- imagepath = url2pathname(image_node['uri'])
- try:
- with PIL.Image.open(imagepath) as img:
- figure_node['width'] = '%dpx' % img.size[0]
- except (OSError, UnicodeEncodeError):
- pass # TODO: warn/info?
- else:
- self.state.document.settings.record_dependencies.add(
- imagepath.replace('\\', '/'))
- elif figwidth is not None:
- figure_node['width'] = figwidth
- if figclasses:
- figure_node['classes'] += figclasses
- if align:
- figure_node['align'] = align
- if self.content:
- node = nodes.Element() # anonymous container for parsing
- self.state.nested_parse(self.content, self.content_offset, node)
- first_node = node[0]
- if isinstance(first_node, nodes.paragraph):
- caption = nodes.caption(first_node.rawsource, '',
- *first_node.children)
- caption.source = first_node.source
- caption.line = first_node.line
- figure_node += caption
- elif not (isinstance(first_node, nodes.comment)
- and len(first_node) == 0):
- error = self.reporter.error(
- 'Figure caption must be a paragraph or empty comment.',
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return [figure_node, error]
- if len(node) > 1:
- figure_node += nodes.legend('', *node[1:])
- return [figure_node]
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/misc.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/misc.py
deleted file mode 100644
index c16e94304..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/misc.py
+++ /dev/null
@@ -1,642 +0,0 @@
-# $Id: misc.py 9492 2023-11-29 16:58:13Z milde $
-# Authors: David Goodger ; Dethe Elza
-# Copyright: This module has been placed in the public domain.
-
-"""Miscellaneous directives."""
-
-__docformat__ = 'reStructuredText'
-
-from pathlib import Path
-import re
-import time
-from urllib.request import urlopen
-from urllib.error import URLError
-
-from docutils import io, nodes, statemachine, utils
-from docutils.parsers.rst import Directive, convert_directive_function
-from docutils.parsers.rst import directives, roles, states
-from docutils.parsers.rst.directives.body import CodeBlock, NumberLines
-from docutils.transforms import misc
-
-
-def adapt_path(path, source='', root_prefix='/'):
- # Adapt path to files to include or embed.
- # `root_prefix` is prepended to absolute paths (cf. root_prefix setting),
- # `source` is the `current_source` of the including directive (which may
- # be a file included by the main document).
- if path.startswith('/'):
- base = Path(root_prefix)
- path = path[1:]
- else:
- base = Path(source).parent
- # pepend "base" and convert to relative path for shorter system messages
- return utils.relative_path(None, base/path)
-
-
-class Include(Directive):
-
- """
- Include content read from a separate source file.
-
- Content may be parsed by the parser, or included as a literal
- block. The encoding of the included file can be specified. Only
- a part of the given file argument may be included by specifying
- start and end line or text to match before and/or after the text
- to be used.
-
- https://docutils.sourceforge.io/docs/ref/rst/directives.html#including-an-external-document-fragment
- """
-
- required_arguments = 1
- optional_arguments = 0
- final_argument_whitespace = True
- option_spec = {'literal': directives.flag,
- 'code': directives.unchanged,
- 'encoding': directives.encoding,
- 'parser': directives.parser_name,
- 'tab-width': int,
- 'start-line': int,
- 'end-line': int,
- 'start-after': directives.unchanged_required,
- 'end-before': directives.unchanged_required,
- # ignored except for 'literal' or 'code':
- 'number-lines': directives.unchanged, # integer or None
- 'class': directives.class_option,
- 'name': directives.unchanged}
-
- standard_include_path = Path(states.__file__).parent / 'include'
-
- def run(self):
- """Include a file as part of the content of this reST file.
-
- Depending on the options, the file (or a clipping) is
- converted to nodes and returned or inserted into the input stream.
- """
- settings = self.state.document.settings
- if not settings.file_insertion_enabled:
- raise self.warning('"%s" directive disabled.' % self.name)
- tab_width = self.options.get('tab-width', settings.tab_width)
- current_source = self.state.document.current_source
- path = directives.path(self.arguments[0])
- if path.startswith('<') and path.endswith('>'):
- path = '/' + path[1:-1]
- root_prefix = self.standard_include_path
- else:
- root_prefix = settings.root_prefix
- path = adapt_path(path, current_source, root_prefix)
- encoding = self.options.get('encoding', settings.input_encoding)
- error_handler = settings.input_encoding_error_handler
- try:
- include_file = io.FileInput(source_path=path,
- encoding=encoding,
- error_handler=error_handler)
- except UnicodeEncodeError:
- raise self.severe(f'Problems with "{self.name}" directive path:\n'
- f'Cannot encode input file path "{path}" '
- '(wrong locale?).')
- except OSError as error:
- raise self.severe(f'Problems with "{self.name}" directive '
- f'path:\n{io.error_string(error)}.')
- else:
- settings.record_dependencies.add(path)
-
- # Get to-be-included content
- startline = self.options.get('start-line', None)
- endline = self.options.get('end-line', None)
- try:
- if startline or (endline is not None):
- lines = include_file.readlines()
- rawtext = ''.join(lines[startline:endline])
- else:
- rawtext = include_file.read()
- except UnicodeError as error:
- raise self.severe(f'Problem with "{self.name}" directive:\n'
- + io.error_string(error))
- # start-after/end-before: no restrictions on newlines in match-text,
- # and no restrictions on matching inside lines vs. line boundaries
- after_text = self.options.get('start-after', None)
- if after_text:
- # skip content in rawtext before *and incl.* a matching text
- after_index = rawtext.find(after_text)
- if after_index < 0:
- raise self.severe('Problem with "start-after" option of "%s" '
- 'directive:\nText not found.' % self.name)
- rawtext = rawtext[after_index + len(after_text):]
- before_text = self.options.get('end-before', None)
- if before_text:
- # skip content in rawtext after *and incl.* a matching text
- before_index = rawtext.find(before_text)
- if before_index < 0:
- raise self.severe('Problem with "end-before" option of "%s" '
- 'directive:\nText not found.' % self.name)
- rawtext = rawtext[:before_index]
-
- include_lines = statemachine.string2lines(rawtext, tab_width,
- convert_whitespace=True)
- for i, line in enumerate(include_lines):
- if len(line) > settings.line_length_limit:
- raise self.warning('"%s": line %d exceeds the'
- ' line-length-limit.' % (path, i+1))
-
- if 'literal' in self.options:
- # Don't convert tabs to spaces, if `tab_width` is negative.
- if tab_width >= 0:
- text = rawtext.expandtabs(tab_width)
- else:
- text = rawtext
- literal_block = nodes.literal_block(
- rawtext, source=path,
- classes=self.options.get('class', []))
- literal_block.line = 1
- self.add_name(literal_block)
- if 'number-lines' in self.options:
- try:
- startline = int(self.options['number-lines'] or 1)
- except ValueError:
- raise self.error(':number-lines: with non-integer '
- 'start value')
- endline = startline + len(include_lines)
- if text.endswith('\n'):
- text = text[:-1]
- tokens = NumberLines([([], text)], startline, endline)
- for classes, value in tokens:
- if classes:
- literal_block += nodes.inline(value, value,
- classes=classes)
- else:
- literal_block += nodes.Text(value)
- else:
- literal_block += nodes.Text(text)
- return [literal_block]
-
- if 'code' in self.options:
- self.options['source'] = path
- # Don't convert tabs to spaces, if `tab_width` is negative:
- if tab_width < 0:
- include_lines = rawtext.splitlines()
- codeblock = CodeBlock(self.name,
- [self.options.pop('code')], # arguments
- self.options,
- include_lines, # content
- self.lineno,
- self.content_offset,
- self.block_text,
- self.state,
- self.state_machine)
- return codeblock.run()
-
- # Prevent circular inclusion:
- clip_options = (startline, endline, before_text, after_text)
- include_log = self.state.document.include_log
- # log entries are tuples (, )
- if not include_log: # new document, initialize with document source
- include_log.append((utils.relative_path(None, current_source),
- (None, None, None, None)))
- if (path, clip_options) in include_log:
- master_paths = (pth for (pth, opt) in reversed(include_log))
- inclusion_chain = '\n> '.join((path, *master_paths))
- raise self.warning('circular inclusion in "%s" directive:\n%s'
- % (self.name, inclusion_chain))
-
- if 'parser' in self.options:
- # parse into a dummy document and return created nodes
- document = utils.new_document(path, settings)
- document.include_log = include_log + [(path, clip_options)]
- parser = self.options['parser']()
- parser.parse('\n'.join(include_lines), document)
- # clean up doctree and complete parsing
- document.transformer.populate_from_components((parser,))
- document.transformer.apply_transforms()
- return document.children
-
- # Include as rST source:
- #
- # mark end (cf. parsers.rst.states.Body.comment())
- include_lines += ['', '.. end of inclusion from "%s"' % path]
- self.state_machine.insert_input(include_lines, path)
- # update include-log
- include_log.append((path, clip_options))
- return []
-
-
-class Raw(Directive):
-
- """
- Pass through content unchanged
-
- Content is included in output based on type argument
-
- Content may be included inline (content section of directive) or
- imported from a file or url.
- """
-
- required_arguments = 1
- optional_arguments = 0
- final_argument_whitespace = True
- option_spec = {'file': directives.path,
- 'url': directives.uri,
- 'encoding': directives.encoding,
- 'class': directives.class_option}
- has_content = True
-
- def run(self):
- settings = self.state.document.settings
- if (not settings.raw_enabled
- or (not settings.file_insertion_enabled
- and ('file' in self.options or 'url' in self.options))):
- raise self.warning('"%s" directive disabled.' % self.name)
- attributes = {'format': ' '.join(self.arguments[0].lower().split())}
- encoding = self.options.get('encoding', settings.input_encoding)
- error_handler = settings.input_encoding_error_handler
- if self.content:
- if 'file' in self.options or 'url' in self.options:
- raise self.error(
- '"%s" directive may not both specify an external file '
- 'and have content.' % self.name)
- text = '\n'.join(self.content)
- elif 'file' in self.options:
- if 'url' in self.options:
- raise self.error(
- 'The "file" and "url" options may not be simultaneously '
- 'specified for the "%s" directive.' % self.name)
- path = adapt_path(self.options['file'],
- self.state.document.current_source,
- settings.root_prefix)
- try:
- raw_file = io.FileInput(source_path=path,
- encoding=encoding,
- error_handler=error_handler)
- except OSError as error:
- raise self.severe(f'Problems with "{self.name}" directive '
- f'path:\n{io.error_string(error)}.')
- else:
- # TODO: currently, raw input files are recorded as
- # dependencies even if not used for the chosen output format.
- settings.record_dependencies.add(path)
- try:
- text = raw_file.read()
- except UnicodeError as error:
- raise self.severe(f'Problem with "{self.name}" directive:\n'
- + io.error_string(error))
- attributes['source'] = path
- elif 'url' in self.options:
- source = self.options['url']
- try:
- raw_text = urlopen(source).read()
- except (URLError, OSError) as error:
- raise self.severe(f'Problems with "{self.name}" directive URL '
- f'"{self.options["url"]}":\n'
- f'{io.error_string(error)}.')
- raw_file = io.StringInput(source=raw_text, source_path=source,
- encoding=encoding,
- error_handler=error_handler)
- try:
- text = raw_file.read()
- except UnicodeError as error:
- raise self.severe(f'Problem with "{self.name}" directive:\n'
- + io.error_string(error))
- attributes['source'] = source
- else:
- # This will always fail because there is no content.
- self.assert_has_content()
- raw_node = nodes.raw('', text, classes=self.options.get('class', []),
- **attributes)
- (raw_node.source,
- raw_node.line) = self.state_machine.get_source_and_line(self.lineno)
- return [raw_node]
-
-
-class Replace(Directive):
-
- has_content = True
-
- def run(self):
- if not isinstance(self.state, states.SubstitutionDef):
- raise self.error(
- 'Invalid context: the "%s" directive can only be used within '
- 'a substitution definition.' % self.name)
- self.assert_has_content()
- text = '\n'.join(self.content)
- element = nodes.Element(text)
- self.state.nested_parse(self.content, self.content_offset,
- element)
- # element might contain [paragraph] + system_message(s)
- node = None
- messages = []
- for elem in element:
- if not node and isinstance(elem, nodes.paragraph):
- node = elem
- elif isinstance(elem, nodes.system_message):
- elem['backrefs'] = []
- messages.append(elem)
- else:
- return [
- self.reporter.error(
- f'Error in "{self.name}" directive: may contain '
- 'a single paragraph only.', line=self.lineno)]
- if node:
- return messages + node.children
- return messages
-
-
-class Unicode(Directive):
-
- r"""
- Convert Unicode character codes (numbers) to characters. Codes may be
- decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``,
- ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character
- entities (e.g. ``☮``). Text following ".." is a comment and is
- ignored. Spaces are ignored, and any other text remains as-is.
- """
-
- required_arguments = 1
- optional_arguments = 0
- final_argument_whitespace = True
- option_spec = {'trim': directives.flag,
- 'ltrim': directives.flag,
- 'rtrim': directives.flag}
-
- comment_pattern = re.compile(r'( |\n|^)\.\. ')
-
- def run(self):
- if not isinstance(self.state, states.SubstitutionDef):
- raise self.error(
- 'Invalid context: the "%s" directive can only be used within '
- 'a substitution definition.' % self.name)
- substitution_definition = self.state_machine.node
- if 'trim' in self.options:
- substitution_definition.attributes['ltrim'] = 1
- substitution_definition.attributes['rtrim'] = 1
- if 'ltrim' in self.options:
- substitution_definition.attributes['ltrim'] = 1
- if 'rtrim' in self.options:
- substitution_definition.attributes['rtrim'] = 1
- codes = self.comment_pattern.split(self.arguments[0])[0].split()
- element = nodes.Element()
- for code in codes:
- try:
- decoded = directives.unicode_code(code)
- except ValueError as error:
- raise self.error('Invalid character code: %s\n%s'
- % (code, io.error_string(error)))
- element += nodes.Text(decoded)
- return element.children
-
-
-class Class(Directive):
-
- """
- Set a "class" attribute on the directive content or the next element.
- When applied to the next element, a "pending" element is inserted, and a
- transform does the work later.
- """
-
- required_arguments = 1
- optional_arguments = 0
- final_argument_whitespace = True
- has_content = True
-
- def run(self):
- try:
- class_value = directives.class_option(self.arguments[0])
- except ValueError:
- raise self.error(
- 'Invalid class attribute value for "%s" directive: "%s".'
- % (self.name, self.arguments[0]))
- node_list = []
- if self.content:
- container = nodes.Element()
- self.state.nested_parse(self.content, self.content_offset,
- container)
- for node in container:
- node['classes'].extend(class_value)
- node_list.extend(container.children)
- else:
- pending = nodes.pending(
- misc.ClassAttribute,
- {'class': class_value, 'directive': self.name},
- self.block_text)
- self.state_machine.document.note_pending(pending)
- node_list.append(pending)
- return node_list
-
-
-class Role(Directive):
-
- has_content = True
-
- argument_pattern = re.compile(r'(%s)\s*(\(\s*(%s)\s*\)\s*)?$'
- % ((states.Inliner.simplename,) * 2))
-
- def run(self):
- """Dynamically create and register a custom interpreted text role."""
- if self.content_offset > self.lineno or not self.content:
- raise self.error('"%s" directive requires arguments on the first '
- 'line.' % self.name)
- args = self.content[0]
- match = self.argument_pattern.match(args)
- if not match:
- raise self.error('"%s" directive arguments not valid role names: '
- '"%s".' % (self.name, args))
- new_role_name = match.group(1)
- base_role_name = match.group(3)
- messages = []
- if base_role_name:
- base_role, messages = roles.role(
- base_role_name, self.state_machine.language, self.lineno,
- self.state.reporter)
- if base_role is None:
- error = self.state.reporter.error(
- 'Unknown interpreted text role "%s".' % base_role_name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return messages + [error]
- else:
- base_role = roles.generic_custom_role
- assert not hasattr(base_role, 'arguments'), (
- 'Supplemental directive arguments for "%s" directive not '
- 'supported (specified by "%r" role).' % (self.name, base_role))
- try:
- converted_role = convert_directive_function(base_role)
- (arguments, options, content, content_offset
- ) = self.state.parse_directive_block(
- self.content[1:], self.content_offset,
- converted_role, option_presets={})
- except states.MarkupError as detail:
- error = self.reporter.error(
- 'Error in "%s" directive:\n%s.' % (self.name, detail),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return messages + [error]
- if 'class' not in options:
- try:
- options['class'] = directives.class_option(new_role_name)
- except ValueError as detail:
- error = self.reporter.error(
- 'Invalid argument for "%s" directive:\n%s.'
- % (self.name, detail),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return messages + [error]
- role = roles.CustomRole(new_role_name, base_role, options, content)
- roles.register_local_role(new_role_name, role)
- return messages
-
-
-class DefaultRole(Directive):
-
- """Set the default interpreted text role."""
-
- optional_arguments = 1
- final_argument_whitespace = False
-
- def run(self):
- if not self.arguments:
- if '' in roles._roles:
- # restore the "default" default role
- del roles._roles['']
- return []
- role_name = self.arguments[0]
- role, messages = roles.role(role_name, self.state_machine.language,
- self.lineno, self.state.reporter)
- if role is None:
- error = self.state.reporter.error(
- 'Unknown interpreted text role "%s".' % role_name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return messages + [error]
- roles._roles[''] = role
- return messages
-
-
-class Title(Directive):
-
- required_arguments = 1
- optional_arguments = 0
- final_argument_whitespace = True
-
- def run(self):
- self.state_machine.document['title'] = self.arguments[0]
- return []
-
-
-class MetaBody(states.SpecializedBody):
-
- def field_marker(self, match, context, next_state):
- """Meta element."""
- node, blank_finish = self.parsemeta(match)
- self.parent += node
- return [], next_state, []
-
- def parsemeta(self, match):
- name = self.parse_field_marker(match)
- name = nodes.unescape(utils.escape2null(name))
- (indented, indent, line_offset, blank_finish
- ) = self.state_machine.get_first_known_indented(match.end())
- node = nodes.meta()
- node['content'] = nodes.unescape(utils.escape2null(
- ' '.join(indented)))
- if not indented:
- line = self.state_machine.line
- msg = self.reporter.info(
- 'No content for meta tag "%s".' % name,
- nodes.literal_block(line, line))
- return msg, blank_finish
- tokens = name.split()
- try:
- attname, val = utils.extract_name_value(tokens[0])[0]
- node[attname.lower()] = val
- except utils.NameValueError:
- node['name'] = tokens[0]
- for token in tokens[1:]:
- try:
- attname, val = utils.extract_name_value(token)[0]
- node[attname.lower()] = val
- except utils.NameValueError as detail:
- line = self.state_machine.line
- msg = self.reporter.error(
- 'Error parsing meta tag attribute "%s": %s.'
- % (token, detail), nodes.literal_block(line, line))
- return msg, blank_finish
- return node, blank_finish
-
-
-class Meta(Directive):
-
- has_content = True
-
- SMkwargs = {'state_classes': (MetaBody,)}
-
- def run(self):
- self.assert_has_content()
- node = nodes.Element()
- new_line_offset, blank_finish = self.state.nested_list_parse(
- self.content, self.content_offset, node,
- initial_state='MetaBody', blank_finish=True,
- state_machine_kwargs=self.SMkwargs)
- if (new_line_offset - self.content_offset) != len(self.content):
- # incomplete parse of block?
- error = self.reporter.error(
- 'Invalid meta directive.',
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- node += error
- # insert at begin of document
- index = self.state.document.first_child_not_matching_class(
- (nodes.Titular, nodes.meta)) or 0
- self.state.document[index:index] = node.children
- return []
-
-
-class Date(Directive):
-
- has_content = True
-
- def run(self):
- if not isinstance(self.state, states.SubstitutionDef):
- raise self.error(
- 'Invalid context: the "%s" directive can only be used within '
- 'a substitution definition.' % self.name)
- format_str = '\n'.join(self.content) or '%Y-%m-%d'
- # @@@
- # Use timestamp from the `SOURCE_DATE_EPOCH`_ environment variable?
- # Pro: Docutils-generated documentation
- # can easily be part of `reproducible software builds`__
- #
- # __ https://reproducible-builds.org/
- #
- # Con: Changes the specs, hard to predict behaviour,
- #
- # See also the discussion about \date \time \year in TeX
- # http://tug.org/pipermail/tex-k/2016-May/002704.html
- # source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH')
- # if (source_date_epoch):
- # text = time.strftime(format_str,
- # time.gmtime(int(source_date_epoch)))
- # else:
- text = time.strftime(format_str)
- return [nodes.Text(text)]
-
-
-class TestDirective(Directive):
-
- """This directive is useful only for testing purposes."""
-
- optional_arguments = 1
- final_argument_whitespace = True
- option_spec = {'option': directives.unchanged_required}
- has_content = True
-
- def run(self):
- if self.content:
- text = '\n'.join(self.content)
- info = self.reporter.info(
- 'Directive processed. Type="%s", arguments=%r, options=%r, '
- 'content:' % (self.name, self.arguments, self.options),
- nodes.literal_block(text, text), line=self.lineno)
- else:
- info = self.reporter.info(
- 'Directive processed. Type="%s", arguments=%r, options=%r, '
- 'content: None' % (self.name, self.arguments, self.options),
- line=self.lineno)
- return [info]
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/parts.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/parts.py
deleted file mode 100644
index adb01d036..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/parts.py
+++ /dev/null
@@ -1,126 +0,0 @@
-# $Id: parts.py 8993 2022-01-29 13:20:04Z milde $
-# Authors: David Goodger ; Dmitry Jemerov
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for document parts.
-"""
-
-__docformat__ = 'reStructuredText'
-
-from docutils import nodes, languages
-from docutils.transforms import parts
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives
-
-
-class Contents(Directive):
-
- """
- Table of contents.
-
- The table of contents is generated in two passes: initial parse and
- transform. During the initial parse, a 'pending' element is generated
- which acts as a placeholder, storing the TOC title and any options
- internally. At a later stage in the processing, the 'pending' element is
- replaced by a 'topic' element, a title and the table of contents proper.
- """
-
- backlinks_values = ('top', 'entry', 'none')
-
- def backlinks(arg):
- value = directives.choice(arg, Contents.backlinks_values)
- if value == 'none':
- return None
- else:
- return value
-
- optional_arguments = 1
- final_argument_whitespace = True
- option_spec = {'depth': directives.nonnegative_int,
- 'local': directives.flag,
- 'backlinks': backlinks,
- 'class': directives.class_option}
-
- def run(self):
- if not (self.state_machine.match_titles
- or isinstance(self.state_machine.node, nodes.sidebar)):
- raise self.error('The "%s" directive may not be used within '
- 'topics or body elements.' % self.name)
- document = self.state_machine.document
- language = languages.get_language(document.settings.language_code,
- document.reporter)
- if self.arguments:
- title_text = self.arguments[0]
- text_nodes, messages = self.state.inline_text(title_text,
- self.lineno)
- title = nodes.title(title_text, '', *text_nodes)
- else:
- messages = []
- if 'local' in self.options:
- title = None
- else:
- title = nodes.title('', language.labels['contents'])
- topic = nodes.topic(classes=['contents'])
- topic['classes'] += self.options.get('class', [])
- # the latex2e writer needs source and line for a warning:
- topic.source, topic.line = self.state_machine.get_source_and_line()
- topic.line -= 1
- if 'local' in self.options:
- topic['classes'].append('local')
- if title:
- name = title.astext()
- topic += title
- else:
- name = language.labels['contents']
- name = nodes.fully_normalize_name(name)
- if not document.has_name(name):
- topic['names'].append(name)
- document.note_implicit_target(topic)
- pending = nodes.pending(parts.Contents, rawsource=self.block_text)
- pending.details.update(self.options)
- document.note_pending(pending)
- topic += pending
- return [topic] + messages
-
-
-class Sectnum(Directive):
-
- """Automatic section numbering."""
-
- option_spec = {'depth': int,
- 'start': int,
- 'prefix': directives.unchanged_required,
- 'suffix': directives.unchanged_required}
-
- def run(self):
- pending = nodes.pending(parts.SectNum)
- pending.details.update(self.options)
- self.state_machine.document.note_pending(pending)
- return [pending]
-
-
-class Header(Directive):
-
- """Contents of document header."""
-
- has_content = True
-
- def run(self):
- self.assert_has_content()
- header = self.state_machine.document.get_decoration().get_header()
- self.state.nested_parse(self.content, self.content_offset, header)
- return []
-
-
-class Footer(Directive):
-
- """Contents of document footer."""
-
- has_content = True
-
- def run(self):
- self.assert_has_content()
- footer = self.state_machine.document.get_decoration().get_footer()
- self.state.nested_parse(self.content, self.content_offset, footer)
- return []
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/references.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/references.py
deleted file mode 100644
index 96921f9dc..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/references.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# $Id: references.py 7062 2011-06-30 22:14:29Z milde $
-# Authors: David Goodger ; Dmitry Jemerov
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for references and targets.
-"""
-
-__docformat__ = 'reStructuredText'
-
-from docutils import nodes
-from docutils.transforms import references
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives
-
-
-class TargetNotes(Directive):
-
- """Target footnote generation."""
-
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged}
-
- def run(self):
- pending = nodes.pending(references.TargetNotes)
- self.add_name(pending)
- pending.details.update(self.options)
- self.state_machine.document.note_pending(pending)
- return [pending]
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/tables.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/tables.py
deleted file mode 100644
index 2cc266ffd..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/directives/tables.py
+++ /dev/null
@@ -1,538 +0,0 @@
-# $Id: tables.py 9492 2023-11-29 16:58:13Z milde $
-# Authors: David Goodger ; David Priest
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for table elements.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import csv
-from urllib.request import urlopen
-from urllib.error import URLError
-import warnings
-
-from docutils import nodes, statemachine
-from docutils.io import FileInput, StringInput
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.directives.misc import adapt_path
-from docutils.utils import SystemMessagePropagation
-
-
-def align(argument):
- return directives.choice(argument, ('left', 'center', 'right'))
-
-
-class Table(Directive):
-
- """
- Generic table base class.
- """
-
- optional_arguments = 1
- final_argument_whitespace = True
- option_spec = {'class': directives.class_option,
- 'name': directives.unchanged,
- 'align': align,
- 'width': directives.length_or_percentage_or_unitless,
- 'widths': directives.value_or(('auto', 'grid'),
- directives.positive_int_list)}
- has_content = True
-
- def make_title(self):
- if self.arguments:
- title_text = self.arguments[0]
- text_nodes, messages = self.state.inline_text(title_text,
- self.lineno)
- title = nodes.title(title_text, '', *text_nodes)
- (title.source,
- title.line) = self.state_machine.get_source_and_line(self.lineno)
- else:
- title = None
- messages = []
- return title, messages
-
- def check_table_dimensions(self, rows, header_rows, stub_columns):
- if len(rows) < header_rows:
- error = self.reporter.error('%s header row(s) specified but '
- 'only %s row(s) of data supplied ("%s" directive).'
- % (header_rows, len(rows), self.name),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- if len(rows) == header_rows > 0:
- error = self.reporter.error(
- f'Insufficient data supplied ({len(rows)} row(s)); '
- 'no data remaining for table body, '
- f'required by "{self.name}" directive.',
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- for row in rows:
- if len(row) < stub_columns:
- error = self.reporter.error(
- f'{stub_columns} stub column(s) specified '
- f'but only {len(row)} columns(s) of data supplied '
- f'("{self.name}" directive).',
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- if len(row) == stub_columns > 0:
- error = self.reporter.error(
- 'Insufficient data supplied (%s columns(s)); '
- 'no data remaining for table body, required '
- 'by "%s" directive.' % (len(row), self.name),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
-
- def set_table_width(self, table_node):
- if 'width' in self.options:
- table_node['width'] = self.options.get('width')
-
- @property
- def widths(self):
- return self.options.get('widths', '')
-
- def get_column_widths(self, n_cols):
- if isinstance(self.widths, list):
- if len(self.widths) != n_cols:
- # TODO: use last value for missing columns?
- error = self.reporter.error('"%s" widths do not match the '
- 'number of columns in table (%s).' % (self.name, n_cols),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- col_widths = self.widths
- elif n_cols:
- col_widths = [100 // n_cols] * n_cols
- else:
- error = self.reporter.error('No table data detected in CSV file.',
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- return col_widths
-
- def extend_short_rows_with_empty_cells(self, columns, parts):
- for part in parts:
- for row in part:
- if len(row) < columns:
- row.extend([(0, 0, 0, [])] * (columns - len(row)))
-
-
-class RSTTable(Table):
- """
- Class for the `"table" directive`__ for formal tables using rST syntax.
-
- __ https://docutils.sourceforge.io/docs/ref/rst/directives.html
- """
-
- def run(self):
- if not self.content:
- warning = self.reporter.warning('Content block expected '
- 'for the "%s" directive; none found.' % self.name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return [warning]
- title, messages = self.make_title()
- node = nodes.Element() # anonymous container for parsing
- self.state.nested_parse(self.content, self.content_offset, node)
- if len(node) != 1 or not isinstance(node[0], nodes.table):
- error = self.reporter.error('Error parsing content block for the '
- '"%s" directive: exactly one table expected.' % self.name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return [error]
- table_node = node[0]
- table_node['classes'] += self.options.get('class', [])
- self.set_table_width(table_node)
- if 'align' in self.options:
- table_node['align'] = self.options.get('align')
- if isinstance(self.widths, list):
- tgroup = table_node[0]
- try:
- col_widths = self.get_column_widths(tgroup["cols"])
- except SystemMessagePropagation as detail:
- return [detail.args[0]]
- colspecs = [child for child in tgroup.children
- if child.tagname == 'colspec']
- for colspec, col_width in zip(colspecs, col_widths):
- colspec['colwidth'] = col_width
- if self.widths == 'auto':
- table_node['classes'] += ['colwidths-auto']
- elif self.widths: # "grid" or list of integers
- table_node['classes'] += ['colwidths-given']
- self.add_name(table_node)
- if title:
- table_node.insert(0, title)
- return [table_node] + messages
-
-
-class CSVTable(Table):
-
- option_spec = {'header-rows': directives.nonnegative_int,
- 'stub-columns': directives.nonnegative_int,
- 'header': directives.unchanged,
- 'width': directives.length_or_percentage_or_unitless,
- 'widths': directives.value_or(('auto', ),
- directives.positive_int_list),
- 'file': directives.path,
- 'url': directives.uri,
- 'encoding': directives.encoding,
- 'class': directives.class_option,
- 'name': directives.unchanged,
- 'align': align,
- # field delimiter char
- 'delim': directives.single_char_or_whitespace_or_unicode,
- # treat whitespace after delimiter as significant
- 'keepspace': directives.flag,
- # text field quote/unquote char:
- 'quote': directives.single_char_or_unicode,
- # char used to escape delim & quote as-needed:
- 'escape': directives.single_char_or_unicode}
-
- class DocutilsDialect(csv.Dialect):
-
- """CSV dialect for `csv_table` directive."""
-
- delimiter = ','
- quotechar = '"'
- doublequote = True
- skipinitialspace = True
- strict = True
- lineterminator = '\n'
- quoting = csv.QUOTE_MINIMAL
-
- def __init__(self, options):
- if 'delim' in options:
- self.delimiter = options['delim']
- if 'keepspace' in options:
- self.skipinitialspace = False
- if 'quote' in options:
- self.quotechar = options['quote']
- if 'escape' in options:
- self.doublequote = False
- self.escapechar = options['escape']
- super().__init__()
-
- class HeaderDialect(csv.Dialect):
- """
- CSV dialect used for the "header" option data.
-
- Deprecated. Will be removed in Docutils 0.22.
- """
- # The separate HeaderDialect was introduced in revision 2294
- # (2004-06-17) in the sandbox before the "csv-table" directive moved
- # to the trunk in r2309. Discussion in docutils-devel around this time
- # did not mention a rationale (part of the discussion was in private
- # mail).
- # This is in conflict with the documentation, which always said:
- # "Must use the same CSV format as the main CSV data."
- # and did not change in this aspect.
- #
- # Maybe it was intended to have similar escape rules for rST and CSV,
- # however with the current implementation this means we need
- # `\\` for rST markup and ``\\\\`` for a literal backslash
- # in the "option" header but ``\`` and ``\\`` in the header-lines and
- # table cells of the main CSV data.
- delimiter = ','
- quotechar = '"'
- escapechar = '\\'
- doublequote = False
- skipinitialspace = True
- strict = True
- lineterminator = '\n'
- quoting = csv.QUOTE_MINIMAL
-
- def __init__(self):
- warnings.warn('CSVTable.HeaderDialect will be removed '
- 'in Docutils 0.22.',
- PendingDeprecationWarning, stacklevel=2)
- super().__init__()
-
- @staticmethod
- def check_requirements():
- warnings.warn('CSVTable.check_requirements()'
- ' is not required with Python 3'
- ' and will be removed in Docutils 0.22.',
- DeprecationWarning, stacklevel=2)
-
- def process_header_option(self):
- source = self.state_machine.get_source(self.lineno - 1)
- table_head = []
- max_header_cols = 0
- if 'header' in self.options: # separate table header in option
- rows, max_header_cols = self.parse_csv_data_into_rows(
- self.options['header'].split('\n'),
- self.DocutilsDialect(self.options),
- source)
- table_head.extend(rows)
- return table_head, max_header_cols
-
- def run(self):
- try:
- if (not self.state.document.settings.file_insertion_enabled
- and ('file' in self.options
- or 'url' in self.options)):
- warning = self.reporter.warning('File and URL access '
- 'deactivated; ignoring "%s" directive.' % self.name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return [warning]
- title, messages = self.make_title()
- csv_data, source = self.get_csv_data()
- table_head, max_header_cols = self.process_header_option()
- rows, max_cols = self.parse_csv_data_into_rows(
- csv_data, self.DocutilsDialect(self.options), source)
- max_cols = max(max_cols, max_header_cols)
- header_rows = self.options.get('header-rows', 0)
- stub_columns = self.options.get('stub-columns', 0)
- self.check_table_dimensions(rows, header_rows, stub_columns)
- table_head.extend(rows[:header_rows])
- table_body = rows[header_rows:]
- col_widths = self.get_column_widths(max_cols)
- self.extend_short_rows_with_empty_cells(max_cols,
- (table_head, table_body))
- except SystemMessagePropagation as detail:
- return [detail.args[0]]
- except csv.Error as detail:
- message = str(detail)
- error = self.reporter.error('Error with CSV data'
- ' in "%s" directive:\n%s' % (self.name, message),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return [error]
- table = (col_widths, table_head, table_body)
- table_node = self.state.build_table(table, self.content_offset,
- stub_columns, widths=self.widths)
- table_node['classes'] += self.options.get('class', [])
- if 'align' in self.options:
- table_node['align'] = self.options.get('align')
- self.set_table_width(table_node)
- self.add_name(table_node)
- if title:
- table_node.insert(0, title)
- return [table_node] + messages
-
- def get_csv_data(self):
- """
- Get CSV data from the directive content, from an external
- file, or from a URL reference.
- """
- settings = self.state.document.settings
- encoding = self.options.get('encoding', settings.input_encoding)
- error_handler = settings.input_encoding_error_handler
- if self.content:
- # CSV data is from directive content.
- if 'file' in self.options or 'url' in self.options:
- error = self.reporter.error('"%s" directive may not both '
- 'specify an external file and have content.' % self.name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- source = self.content.source(0)
- csv_data = self.content
- elif 'file' in self.options:
- # CSV data is from an external file.
- if 'url' in self.options:
- error = self.reporter.error('The "file" and "url" options '
- 'may not be simultaneously specified '
- 'for the "%s" directive.' % self.name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- source = adapt_path(self.options['file'],
- self.state.document.current_source,
- settings.root_prefix)
- try:
- csv_file = FileInput(source_path=source,
- encoding=encoding,
- error_handler=error_handler)
- csv_data = csv_file.read().splitlines()
- except OSError as error:
- severe = self.reporter.severe(
- 'Problems with "%s" directive path:\n%s.'
- % (self.name, error),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(severe)
- else:
- settings.record_dependencies.add(source)
- elif 'url' in self.options:
- source = self.options['url']
- try:
- with urlopen(source) as response:
- csv_text = response.read()
- except (URLError, OSError, ValueError) as error:
- severe = self.reporter.severe(
- 'Problems with "%s" directive URL "%s":\n%s.'
- % (self.name, self.options['url'], error),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(severe)
- csv_file = StringInput(source=csv_text, source_path=source,
- encoding=encoding,
- error_handler=error_handler)
- csv_data = csv_file.read().splitlines()
- else:
- error = self.reporter.warning(
- 'The "%s" directive requires content; none supplied.'
- % self.name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- return csv_data, source
-
- @staticmethod
- def decode_from_csv(s):
- warnings.warn('CSVTable.decode_from_csv()'
- ' is not required with Python 3'
- ' and will be removed in Docutils 0.21 or later.',
- DeprecationWarning, stacklevel=2)
- return s
-
- @staticmethod
- def encode_for_csv(s):
- warnings.warn('CSVTable.encode_from_csv()'
- ' is not required with Python 3'
- ' and will be removed in Docutils 0.21 or later.',
- DeprecationWarning, stacklevel=2)
- return s
-
- def parse_csv_data_into_rows(self, csv_data, dialect, source):
- csv_reader = csv.reader((line + '\n' for line in csv_data),
- dialect=dialect)
- rows = []
- max_cols = 0
- for row in csv_reader:
- row_data = []
- for cell in row:
- cell_data = (0, 0, 0, statemachine.StringList(
- cell.splitlines(), source=source))
- row_data.append(cell_data)
- rows.append(row_data)
- max_cols = max(max_cols, len(row))
- return rows, max_cols
-
-
-class ListTable(Table):
-
- """
- Implement tables whose data is encoded as a uniform two-level bullet list.
- For further ideas, see
- https://docutils.sourceforge.io/docs/dev/rst/alternatives.html#list-driven-tables
- """
-
- option_spec = {'header-rows': directives.nonnegative_int,
- 'stub-columns': directives.nonnegative_int,
- 'width': directives.length_or_percentage_or_unitless,
- 'widths': directives.value_or(('auto', ),
- directives.positive_int_list),
- 'class': directives.class_option,
- 'name': directives.unchanged,
- 'align': align}
-
- def run(self):
- if not self.content:
- error = self.reporter.error('The "%s" directive is empty; '
- 'content required.' % self.name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- return [error]
- title, messages = self.make_title()
- node = nodes.Element() # anonymous container for parsing
- self.state.nested_parse(self.content, self.content_offset, node)
- try:
- num_cols, col_widths = self.check_list_content(node)
- table_data = [[item.children for item in row_list[0]]
- for row_list in node[0]]
- header_rows = self.options.get('header-rows', 0)
- stub_columns = self.options.get('stub-columns', 0)
- self.check_table_dimensions(table_data, header_rows, stub_columns)
- except SystemMessagePropagation as detail:
- return [detail.args[0]]
- table_node = self.build_table_from_list(table_data, col_widths,
- header_rows, stub_columns)
- if 'align' in self.options:
- table_node['align'] = self.options.get('align')
- table_node['classes'] += self.options.get('class', [])
- self.set_table_width(table_node)
- self.add_name(table_node)
- if title:
- table_node.insert(0, title)
- return [table_node] + messages
-
- def check_list_content(self, node):
- if len(node) != 1 or not isinstance(node[0], nodes.bullet_list):
- error = self.reporter.error(
- 'Error parsing content block for the "%s" directive: '
- 'exactly one bullet list expected.' % self.name,
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- list_node = node[0]
- num_cols = 0
- # Check for a uniform two-level bullet list:
- for item_index in range(len(list_node)):
- item = list_node[item_index]
- if len(item) != 1 or not isinstance(item[0], nodes.bullet_list):
- error = self.reporter.error(
- 'Error parsing content block for the "%s" directive: '
- 'two-level bullet list expected, but row %s does not '
- 'contain a second-level bullet list.'
- % (self.name, item_index + 1),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- elif item_index:
- if len(item[0]) != num_cols:
- error = self.reporter.error(
- 'Error parsing content block for the "%s" directive: '
- 'uniform two-level bullet list expected, but row %s '
- 'does not contain the same number of items as row 1 '
- '(%s vs %s).'
- % (self.name, item_index + 1, len(item[0]), num_cols),
- nodes.literal_block(self.block_text, self.block_text),
- line=self.lineno)
- raise SystemMessagePropagation(error)
- else:
- num_cols = len(item[0])
- col_widths = self.get_column_widths(num_cols)
- return num_cols, col_widths
-
- def build_table_from_list(self, table_data,
- col_widths, header_rows, stub_columns):
- table = nodes.table()
- if self.widths == 'auto':
- table['classes'] += ['colwidths-auto']
- elif self.widths: # explicitly set column widths
- table['classes'] += ['colwidths-given']
- tgroup = nodes.tgroup(cols=len(col_widths))
- table += tgroup
- for col_width in col_widths:
- colspec = nodes.colspec()
- if col_width is not None:
- colspec.attributes['colwidth'] = col_width
- if stub_columns:
- colspec.attributes['stub'] = 1
- stub_columns -= 1
- tgroup += colspec
- rows = []
- for row in table_data:
- row_node = nodes.row()
- for cell in row:
- entry = nodes.entry()
- entry += cell
- row_node += entry
- rows.append(row_node)
- if header_rows:
- thead = nodes.thead()
- thead.extend(rows[:header_rows])
- tgroup += thead
- tbody = nodes.tbody()
- tbody.extend(rows[header_rows:])
- tgroup += tbody
- return table
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/README.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/README.txt
deleted file mode 100644
index a51328fb3..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/README.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-============================================
- ``docutils/parsers/rst/include`` Directory
-============================================
-
-This directory contains standard data files intended for inclusion in
-reStructuredText documents. To access these files, use the "include"
-directive with the special syntax for standard "include" data files,
-angle brackets around the file name::
-
- .. include::
-
-See the documentation for the `"include" directive`__ and
-`reStructuredText Standard Definition Files`__ for
-details.
-
-__ https://docutils.sourceforge.io/docs/ref/rst/directives.html#include
-__ https://docutils.sourceforge.io/docs/ref/rst/definitions.html
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsa.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsa.txt
deleted file mode 100644
index a13b1d66e..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsa.txt
+++ /dev/null
@@ -1,162 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |angzarr| unicode:: U+0237C .. RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
-.. |cirmid| unicode:: U+02AEF .. VERTICAL LINE WITH CIRCLE ABOVE
-.. |cudarrl| unicode:: U+02938 .. RIGHT-SIDE ARC CLOCKWISE ARROW
-.. |cudarrr| unicode:: U+02935 .. ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
-.. |cularr| unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
-.. |cularrp| unicode:: U+0293D .. TOP ARC ANTICLOCKWISE ARROW WITH PLUS
-.. |curarr| unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
-.. |curarrm| unicode:: U+0293C .. TOP ARC CLOCKWISE ARROW WITH MINUS
-.. |Darr| unicode:: U+021A1 .. DOWNWARDS TWO HEADED ARROW
-.. |dArr| unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
-.. |darr2| unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
-.. |ddarr| unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
-.. |DDotrahd| unicode:: U+02911 .. RIGHTWARDS ARROW WITH DOTTED STEM
-.. |dfisht| unicode:: U+0297F .. DOWN FISH TAIL
-.. |dHar| unicode:: U+02965 .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
-.. |dharl| unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
-.. |dharr| unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
-.. |dlarr| unicode:: U+02199 .. SOUTH WEST ARROW
-.. |drarr| unicode:: U+02198 .. SOUTH EAST ARROW
-.. |duarr| unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
-.. |duhar| unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
-.. |dzigrarr| unicode:: U+027FF .. LONG RIGHTWARDS SQUIGGLE ARROW
-.. |erarr| unicode:: U+02971 .. EQUALS SIGN ABOVE RIGHTWARDS ARROW
-.. |hArr| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |harr| unicode:: U+02194 .. LEFT RIGHT ARROW
-.. |harrcir| unicode:: U+02948 .. LEFT RIGHT ARROW THROUGH SMALL CIRCLE
-.. |harrw| unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
-.. |hoarr| unicode:: U+021FF .. LEFT RIGHT OPEN-HEADED ARROW
-.. |imof| unicode:: U+022B7 .. IMAGE OF
-.. |lAarr| unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
-.. |Larr| unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
-.. |larr2| unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
-.. |larrbfs| unicode:: U+0291F .. LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
-.. |larrfs| unicode:: U+0291D .. LEFTWARDS ARROW TO BLACK DIAMOND
-.. |larrhk| unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
-.. |larrlp| unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
-.. |larrpl| unicode:: U+02939 .. LEFT-SIDE ARC ANTICLOCKWISE ARROW
-.. |larrsim| unicode:: U+02973 .. LEFTWARDS ARROW ABOVE TILDE OPERATOR
-.. |larrtl| unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
-.. |lAtail| unicode:: U+0291B .. LEFTWARDS DOUBLE ARROW-TAIL
-.. |latail| unicode:: U+02919 .. LEFTWARDS ARROW-TAIL
-.. |lBarr| unicode:: U+0290E .. LEFTWARDS TRIPLE DASH ARROW
-.. |lbarr| unicode:: U+0290C .. LEFTWARDS DOUBLE DASH ARROW
-.. |ldca| unicode:: U+02936 .. ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
-.. |ldrdhar| unicode:: U+02967 .. LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
-.. |ldrushar| unicode:: U+0294B .. LEFT BARB DOWN RIGHT BARB UP HARPOON
-.. |ldsh| unicode:: U+021B2 .. DOWNWARDS ARROW WITH TIP LEFTWARDS
-.. |lfisht| unicode:: U+0297C .. LEFT FISH TAIL
-.. |lHar| unicode:: U+02962 .. LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
-.. |lhard| unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
-.. |lharu| unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
-.. |lharul| unicode:: U+0296A .. LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
-.. |llarr| unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
-.. |llhard| unicode:: U+0296B .. LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
-.. |loarr| unicode:: U+021FD .. LEFTWARDS OPEN-HEADED ARROW
-.. |lrarr| unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
-.. |lrarr2| unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
-.. |lrhar| unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
-.. |lrhar2| unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
-.. |lrhard| unicode:: U+0296D .. RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
-.. |lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
-.. |lurdshar| unicode:: U+0294A .. LEFT BARB UP RIGHT BARB DOWN HARPOON
-.. |luruhar| unicode:: U+02966 .. LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
-.. |Map| unicode:: U+02905 .. RIGHTWARDS TWO-HEADED ARROW FROM BAR
-.. |map| unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
-.. |midcir| unicode:: U+02AF0 .. VERTICAL LINE WITH CIRCLE BELOW
-.. |mumap| unicode:: U+022B8 .. MULTIMAP
-.. |nearhk| unicode:: U+02924 .. NORTH EAST ARROW WITH HOOK
-.. |neArr| unicode:: U+021D7 .. NORTH EAST DOUBLE ARROW
-.. |nearr| unicode:: U+02197 .. NORTH EAST ARROW
-.. |nesear| unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
-.. |nhArr| unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
-.. |nharr| unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
-.. |nlArr| unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
-.. |nlarr| unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
-.. |nrArr| unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
-.. |nrarr| unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
-.. |nrarrc| unicode:: U+02933 U+00338 .. WAVE ARROW POINTING DIRECTLY RIGHT with slash
-.. |nrarrw| unicode:: U+0219D U+00338 .. RIGHTWARDS WAVE ARROW with slash
-.. |nvHarr| unicode:: U+02904 .. LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
-.. |nvlArr| unicode:: U+02902 .. LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
-.. |nvrArr| unicode:: U+02903 .. RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
-.. |nwarhk| unicode:: U+02923 .. NORTH WEST ARROW WITH HOOK
-.. |nwArr| unicode:: U+021D6 .. NORTH WEST DOUBLE ARROW
-.. |nwarr| unicode:: U+02196 .. NORTH WEST ARROW
-.. |nwnear| unicode:: U+02927 .. NORTH WEST ARROW AND NORTH EAST ARROW
-.. |olarr| unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
-.. |orarr| unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
-.. |origof| unicode:: U+022B6 .. ORIGINAL OF
-.. |rAarr| unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
-.. |Rarr| unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
-.. |rarr2| unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
-.. |rarrap| unicode:: U+02975 .. RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
-.. |rarrbfs| unicode:: U+02920 .. RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
-.. |rarrc| unicode:: U+02933 .. WAVE ARROW POINTING DIRECTLY RIGHT
-.. |rarrfs| unicode:: U+0291E .. RIGHTWARDS ARROW TO BLACK DIAMOND
-.. |rarrhk| unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
-.. |rarrlp| unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
-.. |rarrpl| unicode:: U+02945 .. RIGHTWARDS ARROW WITH PLUS BELOW
-.. |rarrsim| unicode:: U+02974 .. RIGHTWARDS ARROW ABOVE TILDE OPERATOR
-.. |Rarrtl| unicode:: U+02916 .. RIGHTWARDS TWO-HEADED ARROW WITH TAIL
-.. |rarrtl| unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
-.. |rarrw| unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
-.. |rAtail| unicode:: U+0291C .. RIGHTWARDS DOUBLE ARROW-TAIL
-.. |ratail| unicode:: U+0291A .. RIGHTWARDS ARROW-TAIL
-.. |RBarr| unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
-.. |rBarr| unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
-.. |rbarr| unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
-.. |rdca| unicode:: U+02937 .. ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
-.. |rdldhar| unicode:: U+02969 .. RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
-.. |rdsh| unicode:: U+021B3 .. DOWNWARDS ARROW WITH TIP RIGHTWARDS
-.. |rfisht| unicode:: U+0297D .. RIGHT FISH TAIL
-.. |rHar| unicode:: U+02964 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
-.. |rhard| unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
-.. |rharu| unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
-.. |rharul| unicode:: U+0296C .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
-.. |rlarr| unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
-.. |rlarr2| unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
-.. |rlhar| unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
-.. |rlhar2| unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
-.. |roarr| unicode:: U+021FE .. RIGHTWARDS OPEN-HEADED ARROW
-.. |rrarr| unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
-.. |rsh| unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
-.. |ruluhar| unicode:: U+02968 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
-.. |searhk| unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
-.. |seArr| unicode:: U+021D8 .. SOUTH EAST DOUBLE ARROW
-.. |searr| unicode:: U+02198 .. SOUTH EAST ARROW
-.. |seswar| unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
-.. |simrarr| unicode:: U+02972 .. TILDE OPERATOR ABOVE RIGHTWARDS ARROW
-.. |slarr| unicode:: U+02190 .. LEFTWARDS ARROW
-.. |srarr| unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |swarhk| unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
-.. |swArr| unicode:: U+021D9 .. SOUTH WEST DOUBLE ARROW
-.. |swarr| unicode:: U+02199 .. SOUTH WEST ARROW
-.. |swnwar| unicode:: U+0292A .. SOUTH WEST ARROW AND NORTH WEST ARROW
-.. |Uarr| unicode:: U+0219F .. UPWARDS TWO HEADED ARROW
-.. |uArr| unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
-.. |uarr2| unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
-.. |Uarrocir| unicode:: U+02949 .. UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
-.. |udarr| unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
-.. |udhar| unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
-.. |ufisht| unicode:: U+0297E .. UP FISH TAIL
-.. |uHar| unicode:: U+02963 .. UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
-.. |uharl| unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
-.. |uharr| unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
-.. |uuarr| unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
-.. |vArr| unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
-.. |varr| unicode:: U+02195 .. UP DOWN ARROW
-.. |xhArr| unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
-.. |xharr| unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
-.. |xlArr| unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
-.. |xlarr| unicode:: U+027F5 .. LONG LEFTWARDS ARROW
-.. |xmap| unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
-.. |xrArr| unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
-.. |xrarr| unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
-.. |zigrarr| unicode:: U+021DD .. RIGHTWARDS SQUIGGLE ARROW
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsb.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsb.txt
deleted file mode 100644
index d66fd4dde..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsb.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |ac| unicode:: U+0223E .. INVERTED LAZY S
-.. |acE| unicode:: U+0223E U+00333 .. INVERTED LAZY S with double underline
-.. |amalg| unicode:: U+02A3F .. AMALGAMATION OR COPRODUCT
-.. |barvee| unicode:: U+022BD .. NOR
-.. |Barwed| unicode:: U+02306 .. PERSPECTIVE
-.. |barwed| unicode:: U+02305 .. PROJECTIVE
-.. |bsolb| unicode:: U+029C5 .. SQUARED FALLING DIAGONAL SLASH
-.. |Cap| unicode:: U+022D2 .. DOUBLE INTERSECTION
-.. |capand| unicode:: U+02A44 .. INTERSECTION WITH LOGICAL AND
-.. |capbrcup| unicode:: U+02A49 .. INTERSECTION ABOVE BAR ABOVE UNION
-.. |capcap| unicode:: U+02A4B .. INTERSECTION BESIDE AND JOINED WITH INTERSECTION
-.. |capcup| unicode:: U+02A47 .. INTERSECTION ABOVE UNION
-.. |capdot| unicode:: U+02A40 .. INTERSECTION WITH DOT
-.. |caps| unicode:: U+02229 U+0FE00 .. INTERSECTION with serifs
-.. |ccaps| unicode:: U+02A4D .. CLOSED INTERSECTION WITH SERIFS
-.. |ccups| unicode:: U+02A4C .. CLOSED UNION WITH SERIFS
-.. |ccupssm| unicode:: U+02A50 .. CLOSED UNION WITH SERIFS AND SMASH PRODUCT
-.. |coprod| unicode:: U+02210 .. N-ARY COPRODUCT
-.. |Cup| unicode:: U+022D3 .. DOUBLE UNION
-.. |cupbrcap| unicode:: U+02A48 .. UNION ABOVE BAR ABOVE INTERSECTION
-.. |cupcap| unicode:: U+02A46 .. UNION ABOVE INTERSECTION
-.. |cupcup| unicode:: U+02A4A .. UNION BESIDE AND JOINED WITH UNION
-.. |cupdot| unicode:: U+0228D .. MULTISET MULTIPLICATION
-.. |cupor| unicode:: U+02A45 .. UNION WITH LOGICAL OR
-.. |cups| unicode:: U+0222A U+0FE00 .. UNION with serifs
-.. |cuvee| unicode:: U+022CE .. CURLY LOGICAL OR
-.. |cuwed| unicode:: U+022CF .. CURLY LOGICAL AND
-.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
-.. |dagger| unicode:: U+02020 .. DAGGER
-.. |diam| unicode:: U+022C4 .. DIAMOND OPERATOR
-.. |divonx| unicode:: U+022C7 .. DIVISION TIMES
-.. |eplus| unicode:: U+02A71 .. EQUALS SIGN ABOVE PLUS SIGN
-.. |hercon| unicode:: U+022B9 .. HERMITIAN CONJUGATE MATRIX
-.. |intcal| unicode:: U+022BA .. INTERCALATE
-.. |iprod| unicode:: U+02A3C .. INTERIOR PRODUCT
-.. |loplus| unicode:: U+02A2D .. PLUS SIGN IN LEFT HALF CIRCLE
-.. |lotimes| unicode:: U+02A34 .. MULTIPLICATION SIGN IN LEFT HALF CIRCLE
-.. |lthree| unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
-.. |ltimes| unicode:: U+022C9 .. LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
-.. |midast| unicode:: U+0002A .. ASTERISK
-.. |minusb| unicode:: U+0229F .. SQUARED MINUS
-.. |minusd| unicode:: U+02238 .. DOT MINUS
-.. |minusdu| unicode:: U+02A2A .. MINUS SIGN WITH DOT BELOW
-.. |ncap| unicode:: U+02A43 .. INTERSECTION WITH OVERBAR
-.. |ncup| unicode:: U+02A42 .. UNION WITH OVERBAR
-.. |oast| unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
-.. |ocir| unicode:: U+0229A .. CIRCLED RING OPERATOR
-.. |odash| unicode:: U+0229D .. CIRCLED DASH
-.. |odiv| unicode:: U+02A38 .. CIRCLED DIVISION SIGN
-.. |odot| unicode:: U+02299 .. CIRCLED DOT OPERATOR
-.. |odsold| unicode:: U+029BC .. CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
-.. |ofcir| unicode:: U+029BF .. CIRCLED BULLET
-.. |ogt| unicode:: U+029C1 .. CIRCLED GREATER-THAN
-.. |ohbar| unicode:: U+029B5 .. CIRCLE WITH HORIZONTAL BAR
-.. |olcir| unicode:: U+029BE .. CIRCLED WHITE BULLET
-.. |olt| unicode:: U+029C0 .. CIRCLED LESS-THAN
-.. |omid| unicode:: U+029B6 .. CIRCLED VERTICAL BAR
-.. |ominus| unicode:: U+02296 .. CIRCLED MINUS
-.. |opar| unicode:: U+029B7 .. CIRCLED PARALLEL
-.. |operp| unicode:: U+029B9 .. CIRCLED PERPENDICULAR
-.. |oplus| unicode:: U+02295 .. CIRCLED PLUS
-.. |osol| unicode:: U+02298 .. CIRCLED DIVISION SLASH
-.. |Otimes| unicode:: U+02A37 .. MULTIPLICATION SIGN IN DOUBLE CIRCLE
-.. |otimes| unicode:: U+02297 .. CIRCLED TIMES
-.. |otimesas| unicode:: U+02A36 .. CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
-.. |ovbar| unicode:: U+0233D .. APL FUNCTIONAL SYMBOL CIRCLE STILE
-.. |plusacir| unicode:: U+02A23 .. PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
-.. |plusb| unicode:: U+0229E .. SQUARED PLUS
-.. |pluscir| unicode:: U+02A22 .. PLUS SIGN WITH SMALL CIRCLE ABOVE
-.. |plusdo| unicode:: U+02214 .. DOT PLUS
-.. |plusdu| unicode:: U+02A25 .. PLUS SIGN WITH DOT BELOW
-.. |pluse| unicode:: U+02A72 .. PLUS SIGN ABOVE EQUALS SIGN
-.. |plussim| unicode:: U+02A26 .. PLUS SIGN WITH TILDE BELOW
-.. |plustwo| unicode:: U+02A27 .. PLUS SIGN WITH SUBSCRIPT TWO
-.. |prod| unicode:: U+0220F .. N-ARY PRODUCT
-.. |race| unicode:: U+029DA .. LEFT DOUBLE WIGGLY FENCE
-.. |roplus| unicode:: U+02A2E .. PLUS SIGN IN RIGHT HALF CIRCLE
-.. |rotimes| unicode:: U+02A35 .. MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
-.. |rthree| unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
-.. |rtimes| unicode:: U+022CA .. RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
-.. |sdot| unicode:: U+022C5 .. DOT OPERATOR
-.. |sdotb| unicode:: U+022A1 .. SQUARED DOT OPERATOR
-.. |setmn| unicode:: U+02216 .. SET MINUS
-.. |simplus| unicode:: U+02A24 .. PLUS SIGN WITH TILDE ABOVE
-.. |smashp| unicode:: U+02A33 .. SMASH PRODUCT
-.. |solb| unicode:: U+029C4 .. SQUARED RISING DIAGONAL SLASH
-.. |sqcap| unicode:: U+02293 .. SQUARE CAP
-.. |sqcaps| unicode:: U+02293 U+0FE00 .. SQUARE CAP with serifs
-.. |sqcup| unicode:: U+02294 .. SQUARE CUP
-.. |sqcups| unicode:: U+02294 U+0FE00 .. SQUARE CUP with serifs
-.. |ssetmn| unicode:: U+02216 .. SET MINUS
-.. |sstarf| unicode:: U+022C6 .. STAR OPERATOR
-.. |subdot| unicode:: U+02ABD .. SUBSET WITH DOT
-.. |sum| unicode:: U+02211 .. N-ARY SUMMATION
-.. |supdot| unicode:: U+02ABE .. SUPERSET WITH DOT
-.. |timesb| unicode:: U+022A0 .. SQUARED TIMES
-.. |timesbar| unicode:: U+02A31 .. MULTIPLICATION SIGN WITH UNDERBAR
-.. |timesd| unicode:: U+02A30 .. MULTIPLICATION SIGN WITH DOT ABOVE
-.. |top| unicode:: U+022A4 .. DOWN TACK
-.. |tridot| unicode:: U+025EC .. WHITE UP-POINTING TRIANGLE WITH DOT
-.. |triminus| unicode:: U+02A3A .. MINUS SIGN IN TRIANGLE
-.. |triplus| unicode:: U+02A39 .. PLUS SIGN IN TRIANGLE
-.. |trisb| unicode:: U+029CD .. TRIANGLE WITH SERIFS AT BOTTOM
-.. |tritime| unicode:: U+02A3B .. MULTIPLICATION SIGN IN TRIANGLE
-.. |uplus| unicode:: U+0228E .. MULTISET UNION
-.. |veebar| unicode:: U+022BB .. XOR
-.. |wedbar| unicode:: U+02A5F .. LOGICAL AND WITH UNDERBAR
-.. |wreath| unicode:: U+02240 .. WREATH PRODUCT
-.. |xcap| unicode:: U+022C2 .. N-ARY INTERSECTION
-.. |xcirc| unicode:: U+025EF .. LARGE CIRCLE
-.. |xcup| unicode:: U+022C3 .. N-ARY UNION
-.. |xdtri| unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
-.. |xodot| unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
-.. |xoplus| unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
-.. |xotime| unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
-.. |xsqcup| unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
-.. |xuplus| unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
-.. |xutri| unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
-.. |xvee| unicode:: U+022C1 .. N-ARY LOGICAL OR
-.. |xwedge| unicode:: U+022C0 .. N-ARY LOGICAL AND
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsc.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsc.txt
deleted file mode 100644
index bef4c3e78..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsc.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |dlcorn| unicode:: U+0231E .. BOTTOM LEFT CORNER
-.. |drcorn| unicode:: U+0231F .. BOTTOM RIGHT CORNER
-.. |gtlPar| unicode:: U+02995 .. DOUBLE LEFT ARC GREATER-THAN BRACKET
-.. |langd| unicode:: U+02991 .. LEFT ANGLE BRACKET WITH DOT
-.. |lbrke| unicode:: U+0298B .. LEFT SQUARE BRACKET WITH UNDERBAR
-.. |lbrksld| unicode:: U+0298F .. LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
-.. |lbrkslu| unicode:: U+0298D .. LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
-.. |lceil| unicode:: U+02308 .. LEFT CEILING
-.. |lfloor| unicode:: U+0230A .. LEFT FLOOR
-.. |lmoust| unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
-.. |lpargt| unicode:: U+029A0 .. SPHERICAL ANGLE OPENING LEFT
-.. |lparlt| unicode:: U+02993 .. LEFT ARC LESS-THAN BRACKET
-.. |ltrPar| unicode:: U+02996 .. DOUBLE RIGHT ARC LESS-THAN BRACKET
-.. |rangd| unicode:: U+02992 .. RIGHT ANGLE BRACKET WITH DOT
-.. |rbrke| unicode:: U+0298C .. RIGHT SQUARE BRACKET WITH UNDERBAR
-.. |rbrksld| unicode:: U+0298E .. RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
-.. |rbrkslu| unicode:: U+02990 .. RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
-.. |rceil| unicode:: U+02309 .. RIGHT CEILING
-.. |rfloor| unicode:: U+0230B .. RIGHT FLOOR
-.. |rmoust| unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
-.. |rpargt| unicode:: U+02994 .. RIGHT ARC GREATER-THAN BRACKET
-.. |ulcorn| unicode:: U+0231C .. TOP LEFT CORNER
-.. |urcorn| unicode:: U+0231D .. TOP RIGHT CORNER
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsn.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsn.txt
deleted file mode 100644
index 65389e8d5..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsn.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |gnap| unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
-.. |gnE| unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
-.. |gne| unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
-.. |gnsim| unicode:: U+022E7 .. GREATER-THAN BUT NOT EQUIVALENT TO
-.. |gvnE| unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
-.. |lnap| unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
-.. |lnE| unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
-.. |lne| unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
-.. |lnsim| unicode:: U+022E6 .. LESS-THAN BUT NOT EQUIVALENT TO
-.. |lvnE| unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
-.. |nap| unicode:: U+02249 .. NOT ALMOST EQUAL TO
-.. |napE| unicode:: U+02A70 U+00338 .. APPROXIMATELY EQUAL OR EQUAL TO with slash
-.. |napid| unicode:: U+0224B U+00338 .. TRIPLE TILDE with slash
-.. |ncong| unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
-.. |ncongdot| unicode:: U+02A6D U+00338 .. CONGRUENT WITH DOT ABOVE with slash
-.. |nequiv| unicode:: U+02262 .. NOT IDENTICAL TO
-.. |ngE| unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
-.. |nge| unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
-.. |nges| unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
-.. |nGg| unicode:: U+022D9 U+00338 .. VERY MUCH GREATER-THAN with slash
-.. |ngsim| unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
-.. |nGt| unicode:: U+0226B U+020D2 .. MUCH GREATER THAN with vertical line
-.. |ngt| unicode:: U+0226F .. NOT GREATER-THAN
-.. |nGtv| unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
-.. |nlE| unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
-.. |nle| unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
-.. |nles| unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
-.. |nLl| unicode:: U+022D8 U+00338 .. VERY MUCH LESS-THAN with slash
-.. |nlsim| unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
-.. |nLt| unicode:: U+0226A U+020D2 .. MUCH LESS THAN with vertical line
-.. |nlt| unicode:: U+0226E .. NOT LESS-THAN
-.. |nltri| unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
-.. |nltrie| unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
-.. |nLtv| unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
-.. |nmid| unicode:: U+02224 .. DOES NOT DIVIDE
-.. |npar| unicode:: U+02226 .. NOT PARALLEL TO
-.. |npr| unicode:: U+02280 .. DOES NOT PRECEDE
-.. |nprcue| unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
-.. |npre| unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |nrtri| unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
-.. |nrtrie| unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
-.. |nsc| unicode:: U+02281 .. DOES NOT SUCCEED
-.. |nsccue| unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
-.. |nsce| unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |nsim| unicode:: U+02241 .. NOT TILDE
-.. |nsime| unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
-.. |nsmid| unicode:: U+02224 .. DOES NOT DIVIDE
-.. |nspar| unicode:: U+02226 .. NOT PARALLEL TO
-.. |nsqsube| unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
-.. |nsqsupe| unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
-.. |nsub| unicode:: U+02284 .. NOT A SUBSET OF
-.. |nsubE| unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
-.. |nsube| unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
-.. |nsup| unicode:: U+02285 .. NOT A SUPERSET OF
-.. |nsupE| unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
-.. |nsupe| unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
-.. |ntgl| unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
-.. |ntlg| unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
-.. |nvap| unicode:: U+0224D U+020D2 .. EQUIVALENT TO with vertical line
-.. |nVDash| unicode:: U+022AF .. NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
-.. |nVdash| unicode:: U+022AE .. DOES NOT FORCE
-.. |nvDash| unicode:: U+022AD .. NOT TRUE
-.. |nvdash| unicode:: U+022AC .. DOES NOT PROVE
-.. |nvge| unicode:: U+02265 U+020D2 .. GREATER-THAN OR EQUAL TO with vertical line
-.. |nvgt| unicode:: U+0003E U+020D2 .. GREATER-THAN SIGN with vertical line
-.. |nvle| unicode:: U+02264 U+020D2 .. LESS-THAN OR EQUAL TO with vertical line
-.. |nvlt| unicode:: U+0003C U+020D2 .. LESS-THAN SIGN with vertical line
-.. |nvltrie| unicode:: U+022B4 U+020D2 .. NORMAL SUBGROUP OF OR EQUAL TO with vertical line
-.. |nvrtrie| unicode:: U+022B5 U+020D2 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line
-.. |nvsim| unicode:: U+0223C U+020D2 .. TILDE OPERATOR with vertical line
-.. |parsim| unicode:: U+02AF3 .. PARALLEL WITH TILDE OPERATOR
-.. |prnap| unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
-.. |prnE| unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
-.. |prnsim| unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
-.. |rnmid| unicode:: U+02AEE .. DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
-.. |scnap| unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
-.. |scnE| unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
-.. |scnsim| unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
-.. |simne| unicode:: U+02246 .. APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
-.. |solbar| unicode:: U+0233F .. APL FUNCTIONAL SYMBOL SLASH BAR
-.. |subnE| unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
-.. |subne| unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
-.. |supnE| unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
-.. |supne| unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
-.. |vnsub| unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
-.. |vnsup| unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
-.. |vsubnE| unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
-.. |vsubne| unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
-.. |vsupnE| unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
-.. |vsupne| unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamso.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamso.txt
deleted file mode 100644
index f17e16bc6..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamso.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |ang| unicode:: U+02220 .. ANGLE
-.. |ange| unicode:: U+029A4 .. ANGLE WITH UNDERBAR
-.. |angmsd| unicode:: U+02221 .. MEASURED ANGLE
-.. |angmsdaa| unicode:: U+029A8 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
-.. |angmsdab| unicode:: U+029A9 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
-.. |angmsdac| unicode:: U+029AA .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
-.. |angmsdad| unicode:: U+029AB .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
-.. |angmsdae| unicode:: U+029AC .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
-.. |angmsdaf| unicode:: U+029AD .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
-.. |angmsdag| unicode:: U+029AE .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
-.. |angmsdah| unicode:: U+029AF .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
-.. |angrtvb| unicode:: U+022BE .. RIGHT ANGLE WITH ARC
-.. |angrtvbd| unicode:: U+0299D .. MEASURED RIGHT ANGLE WITH DOT
-.. |bbrk| unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
-.. |bbrktbrk| unicode:: U+023B6 .. BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
-.. |bemptyv| unicode:: U+029B0 .. REVERSED EMPTY SET
-.. |beth| unicode:: U+02136 .. BET SYMBOL
-.. |boxbox| unicode:: U+029C9 .. TWO JOINED SQUARES
-.. |bprime| unicode:: U+02035 .. REVERSED PRIME
-.. |bsemi| unicode:: U+0204F .. REVERSED SEMICOLON
-.. |cemptyv| unicode:: U+029B2 .. EMPTY SET WITH SMALL CIRCLE ABOVE
-.. |cirE| unicode:: U+029C3 .. CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
-.. |cirscir| unicode:: U+029C2 .. CIRCLE WITH SMALL CIRCLE TO THE RIGHT
-.. |comp| unicode:: U+02201 .. COMPLEMENT
-.. |daleth| unicode:: U+02138 .. DALET SYMBOL
-.. |demptyv| unicode:: U+029B1 .. EMPTY SET WITH OVERBAR
-.. |ell| unicode:: U+02113 .. SCRIPT SMALL L
-.. |empty| unicode:: U+02205 .. EMPTY SET
-.. |emptyv| unicode:: U+02205 .. EMPTY SET
-.. |gimel| unicode:: U+02137 .. GIMEL SYMBOL
-.. |iiota| unicode:: U+02129 .. TURNED GREEK SMALL LETTER IOTA
-.. |image| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |imath| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
-.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
-.. |jmath| unicode:: U+0006A .. LATIN SMALL LETTER J
-.. |jnodot| unicode:: U+0006A .. LATIN SMALL LETTER J
-.. |laemptyv| unicode:: U+029B4 .. EMPTY SET WITH LEFT ARROW ABOVE
-.. |lltri| unicode:: U+025FA .. LOWER LEFT TRIANGLE
-.. |lrtri| unicode:: U+022BF .. RIGHT TRIANGLE
-.. |mho| unicode:: U+02127 .. INVERTED OHM SIGN
-.. |nang| unicode:: U+02220 U+020D2 .. ANGLE with vertical line
-.. |nexist| unicode:: U+02204 .. THERE DOES NOT EXIST
-.. |oS| unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
-.. |planck| unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
-.. |plankv| unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
-.. |raemptyv| unicode:: U+029B3 .. EMPTY SET WITH RIGHT ARROW ABOVE
-.. |range| unicode:: U+029A5 .. REVERSED ANGLE WITH UNDERBAR
-.. |real| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |sbsol| unicode:: U+0FE68 .. SMALL REVERSE SOLIDUS
-.. |tbrk| unicode:: U+023B4 .. TOP SQUARE BRACKET
-.. |trpezium| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
-.. |ultri| unicode:: U+025F8 .. UPPER LEFT TRIANGLE
-.. |urtri| unicode:: U+025F9 .. UPPER RIGHT TRIANGLE
-.. |vprime| unicode:: U+02032 .. PRIME
-.. |vzigzag| unicode:: U+0299A .. VERTICAL ZIGZAG LINE
-.. |weierp| unicode:: U+02118 .. SCRIPT CAPITAL P
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsr.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsr.txt
deleted file mode 100644
index 7d3c1aace..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isoamsr.txt
+++ /dev/null
@@ -1,191 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |apE| unicode:: U+02A70 .. APPROXIMATELY EQUAL OR EQUAL TO
-.. |ape| unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
-.. |apid| unicode:: U+0224B .. TRIPLE TILDE
-.. |asymp| unicode:: U+02248 .. ALMOST EQUAL TO
-.. |Barv| unicode:: U+02AE7 .. SHORT DOWN TACK WITH OVERBAR
-.. |bcong| unicode:: U+0224C .. ALL EQUAL TO
-.. |bepsi| unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
-.. |bowtie| unicode:: U+022C8 .. BOWTIE
-.. |bsim| unicode:: U+0223D .. REVERSED TILDE
-.. |bsime| unicode:: U+022CD .. REVERSED TILDE EQUALS
-.. |bsolhsub| unicode:: U+0005C U+02282 .. REVERSE SOLIDUS, SUBSET OF
-.. |bump| unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
-.. |bumpE| unicode:: U+02AAE .. EQUALS SIGN WITH BUMPY ABOVE
-.. |bumpe| unicode:: U+0224F .. DIFFERENCE BETWEEN
-.. |cire| unicode:: U+02257 .. RING EQUAL TO
-.. |Colon| unicode:: U+02237 .. PROPORTION
-.. |Colone| unicode:: U+02A74 .. DOUBLE COLON EQUAL
-.. |colone| unicode:: U+02254 .. COLON EQUALS
-.. |congdot| unicode:: U+02A6D .. CONGRUENT WITH DOT ABOVE
-.. |csub| unicode:: U+02ACF .. CLOSED SUBSET
-.. |csube| unicode:: U+02AD1 .. CLOSED SUBSET OR EQUAL TO
-.. |csup| unicode:: U+02AD0 .. CLOSED SUPERSET
-.. |csupe| unicode:: U+02AD2 .. CLOSED SUPERSET OR EQUAL TO
-.. |cuepr| unicode:: U+022DE .. EQUAL TO OR PRECEDES
-.. |cuesc| unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
-.. |cupre| unicode:: U+0227C .. PRECEDES OR EQUAL TO
-.. |Dashv| unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
-.. |dashv| unicode:: U+022A3 .. LEFT TACK
-.. |easter| unicode:: U+02A6E .. EQUALS WITH ASTERISK
-.. |ecir| unicode:: U+02256 .. RING IN EQUAL TO
-.. |ecolon| unicode:: U+02255 .. EQUALS COLON
-.. |eDDot| unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
-.. |eDot| unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
-.. |efDot| unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
-.. |eg| unicode:: U+02A9A .. DOUBLE-LINE EQUAL TO OR GREATER-THAN
-.. |egs| unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
-.. |egsdot| unicode:: U+02A98 .. SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
-.. |el| unicode:: U+02A99 .. DOUBLE-LINE EQUAL TO OR LESS-THAN
-.. |els| unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
-.. |elsdot| unicode:: U+02A97 .. SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
-.. |equest| unicode:: U+0225F .. QUESTIONED EQUAL TO
-.. |equivDD| unicode:: U+02A78 .. EQUIVALENT WITH FOUR DOTS ABOVE
-.. |erDot| unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
-.. |esdot| unicode:: U+02250 .. APPROACHES THE LIMIT
-.. |Esim| unicode:: U+02A73 .. EQUALS SIGN ABOVE TILDE OPERATOR
-.. |esim| unicode:: U+02242 .. MINUS TILDE
-.. |fork| unicode:: U+022D4 .. PITCHFORK
-.. |forkv| unicode:: U+02AD9 .. ELEMENT OF OPENING DOWNWARDS
-.. |frown| unicode:: U+02322 .. FROWN
-.. |gap| unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
-.. |gE| unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
-.. |gEl| unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
-.. |gel| unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
-.. |ges| unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
-.. |gescc| unicode:: U+02AA9 .. GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
-.. |gesdot| unicode:: U+02A80 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
-.. |gesdoto| unicode:: U+02A82 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
-.. |gesdotol| unicode:: U+02A84 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
-.. |gesl| unicode:: U+022DB U+0FE00 .. GREATER-THAN slanted EQUAL TO OR LESS-THAN
-.. |gesles| unicode:: U+02A94 .. GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
-.. |Gg| unicode:: U+022D9 .. VERY MUCH GREATER-THAN
-.. |gl| unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
-.. |gla| unicode:: U+02AA5 .. GREATER-THAN BESIDE LESS-THAN
-.. |glE| unicode:: U+02A92 .. GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
-.. |glj| unicode:: U+02AA4 .. GREATER-THAN OVERLAPPING LESS-THAN
-.. |gsdot| unicode:: U+022D7 .. GREATER-THAN WITH DOT
-.. |gsim| unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
-.. |gsime| unicode:: U+02A8E .. GREATER-THAN ABOVE SIMILAR OR EQUAL
-.. |gsiml| unicode:: U+02A90 .. GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
-.. |Gt| unicode:: U+0226B .. MUCH GREATER-THAN
-.. |gtcc| unicode:: U+02AA7 .. GREATER-THAN CLOSED BY CURVE
-.. |gtcir| unicode:: U+02A7A .. GREATER-THAN WITH CIRCLE INSIDE
-.. |gtdot| unicode:: U+022D7 .. GREATER-THAN WITH DOT
-.. |gtquest| unicode:: U+02A7C .. GREATER-THAN WITH QUESTION MARK ABOVE
-.. |gtrarr| unicode:: U+02978 .. GREATER-THAN ABOVE RIGHTWARDS ARROW
-.. |homtht| unicode:: U+0223B .. HOMOTHETIC
-.. |lap| unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
-.. |lat| unicode:: U+02AAB .. LARGER THAN
-.. |late| unicode:: U+02AAD .. LARGER THAN OR EQUAL TO
-.. |lates| unicode:: U+02AAD U+0FE00 .. LARGER THAN OR slanted EQUAL
-.. |ldot| unicode:: U+022D6 .. LESS-THAN WITH DOT
-.. |lE| unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
-.. |lEg| unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
-.. |leg| unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
-.. |les| unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
-.. |lescc| unicode:: U+02AA8 .. LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
-.. |lesdot| unicode:: U+02A7F .. LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
-.. |lesdoto| unicode:: U+02A81 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
-.. |lesdotor| unicode:: U+02A83 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
-.. |lesg| unicode:: U+022DA U+0FE00 .. LESS-THAN slanted EQUAL TO OR GREATER-THAN
-.. |lesges| unicode:: U+02A93 .. LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
-.. |lg| unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
-.. |lgE| unicode:: U+02A91 .. LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
-.. |Ll| unicode:: U+022D8 .. VERY MUCH LESS-THAN
-.. |lsim| unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
-.. |lsime| unicode:: U+02A8D .. LESS-THAN ABOVE SIMILAR OR EQUAL
-.. |lsimg| unicode:: U+02A8F .. LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
-.. |Lt| unicode:: U+0226A .. MUCH LESS-THAN
-.. |ltcc| unicode:: U+02AA6 .. LESS-THAN CLOSED BY CURVE
-.. |ltcir| unicode:: U+02A79 .. LESS-THAN WITH CIRCLE INSIDE
-.. |ltdot| unicode:: U+022D6 .. LESS-THAN WITH DOT
-.. |ltlarr| unicode:: U+02976 .. LESS-THAN ABOVE LEFTWARDS ARROW
-.. |ltquest| unicode:: U+02A7B .. LESS-THAN WITH QUESTION MARK ABOVE
-.. |ltrie| unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
-.. |mcomma| unicode:: U+02A29 .. MINUS SIGN WITH COMMA ABOVE
-.. |mDDot| unicode:: U+0223A .. GEOMETRIC PROPORTION
-.. |mid| unicode:: U+02223 .. DIVIDES
-.. |mlcp| unicode:: U+02ADB .. TRANSVERSAL INTERSECTION
-.. |models| unicode:: U+022A7 .. MODELS
-.. |mstpos| unicode:: U+0223E .. INVERTED LAZY S
-.. |Pr| unicode:: U+02ABB .. DOUBLE PRECEDES
-.. |pr| unicode:: U+0227A .. PRECEDES
-.. |prap| unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
-.. |prcue| unicode:: U+0227C .. PRECEDES OR EQUAL TO
-.. |prE| unicode:: U+02AB3 .. PRECEDES ABOVE EQUALS SIGN
-.. |pre| unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
-.. |prsim| unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
-.. |prurel| unicode:: U+022B0 .. PRECEDES UNDER RELATION
-.. |ratio| unicode:: U+02236 .. RATIO
-.. |rtrie| unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
-.. |rtriltri| unicode:: U+029CE .. RIGHT TRIANGLE ABOVE LEFT TRIANGLE
-.. |samalg| unicode:: U+02210 .. N-ARY COPRODUCT
-.. |Sc| unicode:: U+02ABC .. DOUBLE SUCCEEDS
-.. |sc| unicode:: U+0227B .. SUCCEEDS
-.. |scap| unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
-.. |sccue| unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
-.. |scE| unicode:: U+02AB4 .. SUCCEEDS ABOVE EQUALS SIGN
-.. |sce| unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
-.. |scsim| unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
-.. |sdote| unicode:: U+02A66 .. EQUALS SIGN WITH DOT BELOW
-.. |sfrown| unicode:: U+02322 .. FROWN
-.. |simg| unicode:: U+02A9E .. SIMILAR OR GREATER-THAN
-.. |simgE| unicode:: U+02AA0 .. SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
-.. |siml| unicode:: U+02A9D .. SIMILAR OR LESS-THAN
-.. |simlE| unicode:: U+02A9F .. SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
-.. |smid| unicode:: U+02223 .. DIVIDES
-.. |smile| unicode:: U+02323 .. SMILE
-.. |smt| unicode:: U+02AAA .. SMALLER THAN
-.. |smte| unicode:: U+02AAC .. SMALLER THAN OR EQUAL TO
-.. |smtes| unicode:: U+02AAC U+0FE00 .. SMALLER THAN OR slanted EQUAL
-.. |spar| unicode:: U+02225 .. PARALLEL TO
-.. |sqsub| unicode:: U+0228F .. SQUARE IMAGE OF
-.. |sqsube| unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
-.. |sqsup| unicode:: U+02290 .. SQUARE ORIGINAL OF
-.. |sqsupe| unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
-.. |ssmile| unicode:: U+02323 .. SMILE
-.. |Sub| unicode:: U+022D0 .. DOUBLE SUBSET
-.. |subE| unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
-.. |subedot| unicode:: U+02AC3 .. SUBSET OF OR EQUAL TO WITH DOT ABOVE
-.. |submult| unicode:: U+02AC1 .. SUBSET WITH MULTIPLICATION SIGN BELOW
-.. |subplus| unicode:: U+02ABF .. SUBSET WITH PLUS SIGN BELOW
-.. |subrarr| unicode:: U+02979 .. SUBSET ABOVE RIGHTWARDS ARROW
-.. |subsim| unicode:: U+02AC7 .. SUBSET OF ABOVE TILDE OPERATOR
-.. |subsub| unicode:: U+02AD5 .. SUBSET ABOVE SUBSET
-.. |subsup| unicode:: U+02AD3 .. SUBSET ABOVE SUPERSET
-.. |Sup| unicode:: U+022D1 .. DOUBLE SUPERSET
-.. |supdsub| unicode:: U+02AD8 .. SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
-.. |supE| unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
-.. |supedot| unicode:: U+02AC4 .. SUPERSET OF OR EQUAL TO WITH DOT ABOVE
-.. |suphsol| unicode:: U+02283 U+0002F .. SUPERSET OF, SOLIDUS
-.. |suphsub| unicode:: U+02AD7 .. SUPERSET BESIDE SUBSET
-.. |suplarr| unicode:: U+0297B .. SUPERSET ABOVE LEFTWARDS ARROW
-.. |supmult| unicode:: U+02AC2 .. SUPERSET WITH MULTIPLICATION SIGN BELOW
-.. |supplus| unicode:: U+02AC0 .. SUPERSET WITH PLUS SIGN BELOW
-.. |supsim| unicode:: U+02AC8 .. SUPERSET OF ABOVE TILDE OPERATOR
-.. |supsub| unicode:: U+02AD4 .. SUPERSET ABOVE SUBSET
-.. |supsup| unicode:: U+02AD6 .. SUPERSET ABOVE SUPERSET
-.. |thkap| unicode:: U+02248 .. ALMOST EQUAL TO
-.. |thksim| unicode:: U+0223C .. TILDE OPERATOR
-.. |topfork| unicode:: U+02ADA .. PITCHFORK WITH TEE TOP
-.. |trie| unicode:: U+0225C .. DELTA EQUAL TO
-.. |twixt| unicode:: U+0226C .. BETWEEN
-.. |Vbar| unicode:: U+02AEB .. DOUBLE UP TACK
-.. |vBar| unicode:: U+02AE8 .. SHORT UP TACK WITH UNDERBAR
-.. |vBarv| unicode:: U+02AE9 .. SHORT UP TACK ABOVE SHORT DOWN TACK
-.. |VDash| unicode:: U+022AB .. DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
-.. |Vdash| unicode:: U+022A9 .. FORCES
-.. |vDash| unicode:: U+022A8 .. TRUE
-.. |vdash| unicode:: U+022A2 .. RIGHT TACK
-.. |Vdashl| unicode:: U+02AE6 .. LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
-.. |veebar| unicode:: U+022BB .. XOR
-.. |vltri| unicode:: U+022B2 .. NORMAL SUBGROUP OF
-.. |vprop| unicode:: U+0221D .. PROPORTIONAL TO
-.. |vrtri| unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
-.. |Vvdash| unicode:: U+022AA .. TRIPLE VERTICAL BAR RIGHT TURNSTILE
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isobox.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isobox.txt
deleted file mode 100644
index 17d45bc67..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isobox.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |boxDL| unicode:: U+02557 .. BOX DRAWINGS DOUBLE DOWN AND LEFT
-.. |boxDl| unicode:: U+02556 .. BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
-.. |boxdL| unicode:: U+02555 .. BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
-.. |boxdl| unicode:: U+02510 .. BOX DRAWINGS LIGHT DOWN AND LEFT
-.. |boxDR| unicode:: U+02554 .. BOX DRAWINGS DOUBLE DOWN AND RIGHT
-.. |boxDr| unicode:: U+02553 .. BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
-.. |boxdR| unicode:: U+02552 .. BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
-.. |boxdr| unicode:: U+0250C .. BOX DRAWINGS LIGHT DOWN AND RIGHT
-.. |boxH| unicode:: U+02550 .. BOX DRAWINGS DOUBLE HORIZONTAL
-.. |boxh| unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
-.. |boxHD| unicode:: U+02566 .. BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
-.. |boxHd| unicode:: U+02564 .. BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
-.. |boxhD| unicode:: U+02565 .. BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
-.. |boxhd| unicode:: U+0252C .. BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
-.. |boxHU| unicode:: U+02569 .. BOX DRAWINGS DOUBLE UP AND HORIZONTAL
-.. |boxHu| unicode:: U+02567 .. BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
-.. |boxhU| unicode:: U+02568 .. BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
-.. |boxhu| unicode:: U+02534 .. BOX DRAWINGS LIGHT UP AND HORIZONTAL
-.. |boxUL| unicode:: U+0255D .. BOX DRAWINGS DOUBLE UP AND LEFT
-.. |boxUl| unicode:: U+0255C .. BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
-.. |boxuL| unicode:: U+0255B .. BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
-.. |boxul| unicode:: U+02518 .. BOX DRAWINGS LIGHT UP AND LEFT
-.. |boxUR| unicode:: U+0255A .. BOX DRAWINGS DOUBLE UP AND RIGHT
-.. |boxUr| unicode:: U+02559 .. BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
-.. |boxuR| unicode:: U+02558 .. BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
-.. |boxur| unicode:: U+02514 .. BOX DRAWINGS LIGHT UP AND RIGHT
-.. |boxV| unicode:: U+02551 .. BOX DRAWINGS DOUBLE VERTICAL
-.. |boxv| unicode:: U+02502 .. BOX DRAWINGS LIGHT VERTICAL
-.. |boxVH| unicode:: U+0256C .. BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
-.. |boxVh| unicode:: U+0256B .. BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
-.. |boxvH| unicode:: U+0256A .. BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
-.. |boxvh| unicode:: U+0253C .. BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
-.. |boxVL| unicode:: U+02563 .. BOX DRAWINGS DOUBLE VERTICAL AND LEFT
-.. |boxVl| unicode:: U+02562 .. BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
-.. |boxvL| unicode:: U+02561 .. BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
-.. |boxvl| unicode:: U+02524 .. BOX DRAWINGS LIGHT VERTICAL AND LEFT
-.. |boxVR| unicode:: U+02560 .. BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
-.. |boxVr| unicode:: U+0255F .. BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
-.. |boxvR| unicode:: U+0255E .. BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
-.. |boxvr| unicode:: U+0251C .. BOX DRAWINGS LIGHT VERTICAL AND RIGHT
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isocyr1.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isocyr1.txt
deleted file mode 100644
index 5e0a18f53..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isocyr1.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Acy| unicode:: U+00410 .. CYRILLIC CAPITAL LETTER A
-.. |acy| unicode:: U+00430 .. CYRILLIC SMALL LETTER A
-.. |Bcy| unicode:: U+00411 .. CYRILLIC CAPITAL LETTER BE
-.. |bcy| unicode:: U+00431 .. CYRILLIC SMALL LETTER BE
-.. |CHcy| unicode:: U+00427 .. CYRILLIC CAPITAL LETTER CHE
-.. |chcy| unicode:: U+00447 .. CYRILLIC SMALL LETTER CHE
-.. |Dcy| unicode:: U+00414 .. CYRILLIC CAPITAL LETTER DE
-.. |dcy| unicode:: U+00434 .. CYRILLIC SMALL LETTER DE
-.. |Ecy| unicode:: U+0042D .. CYRILLIC CAPITAL LETTER E
-.. |ecy| unicode:: U+0044D .. CYRILLIC SMALL LETTER E
-.. |Fcy| unicode:: U+00424 .. CYRILLIC CAPITAL LETTER EF
-.. |fcy| unicode:: U+00444 .. CYRILLIC SMALL LETTER EF
-.. |Gcy| unicode:: U+00413 .. CYRILLIC CAPITAL LETTER GHE
-.. |gcy| unicode:: U+00433 .. CYRILLIC SMALL LETTER GHE
-.. |HARDcy| unicode:: U+0042A .. CYRILLIC CAPITAL LETTER HARD SIGN
-.. |hardcy| unicode:: U+0044A .. CYRILLIC SMALL LETTER HARD SIGN
-.. |Icy| unicode:: U+00418 .. CYRILLIC CAPITAL LETTER I
-.. |icy| unicode:: U+00438 .. CYRILLIC SMALL LETTER I
-.. |IEcy| unicode:: U+00415 .. CYRILLIC CAPITAL LETTER IE
-.. |iecy| unicode:: U+00435 .. CYRILLIC SMALL LETTER IE
-.. |IOcy| unicode:: U+00401 .. CYRILLIC CAPITAL LETTER IO
-.. |iocy| unicode:: U+00451 .. CYRILLIC SMALL LETTER IO
-.. |Jcy| unicode:: U+00419 .. CYRILLIC CAPITAL LETTER SHORT I
-.. |jcy| unicode:: U+00439 .. CYRILLIC SMALL LETTER SHORT I
-.. |Kcy| unicode:: U+0041A .. CYRILLIC CAPITAL LETTER KA
-.. |kcy| unicode:: U+0043A .. CYRILLIC SMALL LETTER KA
-.. |KHcy| unicode:: U+00425 .. CYRILLIC CAPITAL LETTER HA
-.. |khcy| unicode:: U+00445 .. CYRILLIC SMALL LETTER HA
-.. |Lcy| unicode:: U+0041B .. CYRILLIC CAPITAL LETTER EL
-.. |lcy| unicode:: U+0043B .. CYRILLIC SMALL LETTER EL
-.. |Mcy| unicode:: U+0041C .. CYRILLIC CAPITAL LETTER EM
-.. |mcy| unicode:: U+0043C .. CYRILLIC SMALL LETTER EM
-.. |Ncy| unicode:: U+0041D .. CYRILLIC CAPITAL LETTER EN
-.. |ncy| unicode:: U+0043D .. CYRILLIC SMALL LETTER EN
-.. |numero| unicode:: U+02116 .. NUMERO SIGN
-.. |Ocy| unicode:: U+0041E .. CYRILLIC CAPITAL LETTER O
-.. |ocy| unicode:: U+0043E .. CYRILLIC SMALL LETTER O
-.. |Pcy| unicode:: U+0041F .. CYRILLIC CAPITAL LETTER PE
-.. |pcy| unicode:: U+0043F .. CYRILLIC SMALL LETTER PE
-.. |Rcy| unicode:: U+00420 .. CYRILLIC CAPITAL LETTER ER
-.. |rcy| unicode:: U+00440 .. CYRILLIC SMALL LETTER ER
-.. |Scy| unicode:: U+00421 .. CYRILLIC CAPITAL LETTER ES
-.. |scy| unicode:: U+00441 .. CYRILLIC SMALL LETTER ES
-.. |SHCHcy| unicode:: U+00429 .. CYRILLIC CAPITAL LETTER SHCHA
-.. |shchcy| unicode:: U+00449 .. CYRILLIC SMALL LETTER SHCHA
-.. |SHcy| unicode:: U+00428 .. CYRILLIC CAPITAL LETTER SHA
-.. |shcy| unicode:: U+00448 .. CYRILLIC SMALL LETTER SHA
-.. |SOFTcy| unicode:: U+0042C .. CYRILLIC CAPITAL LETTER SOFT SIGN
-.. |softcy| unicode:: U+0044C .. CYRILLIC SMALL LETTER SOFT SIGN
-.. |Tcy| unicode:: U+00422 .. CYRILLIC CAPITAL LETTER TE
-.. |tcy| unicode:: U+00442 .. CYRILLIC SMALL LETTER TE
-.. |TScy| unicode:: U+00426 .. CYRILLIC CAPITAL LETTER TSE
-.. |tscy| unicode:: U+00446 .. CYRILLIC SMALL LETTER TSE
-.. |Ucy| unicode:: U+00423 .. CYRILLIC CAPITAL LETTER U
-.. |ucy| unicode:: U+00443 .. CYRILLIC SMALL LETTER U
-.. |Vcy| unicode:: U+00412 .. CYRILLIC CAPITAL LETTER VE
-.. |vcy| unicode:: U+00432 .. CYRILLIC SMALL LETTER VE
-.. |YAcy| unicode:: U+0042F .. CYRILLIC CAPITAL LETTER YA
-.. |yacy| unicode:: U+0044F .. CYRILLIC SMALL LETTER YA
-.. |Ycy| unicode:: U+0042B .. CYRILLIC CAPITAL LETTER YERU
-.. |ycy| unicode:: U+0044B .. CYRILLIC SMALL LETTER YERU
-.. |YUcy| unicode:: U+0042E .. CYRILLIC CAPITAL LETTER YU
-.. |yucy| unicode:: U+0044E .. CYRILLIC SMALL LETTER YU
-.. |Zcy| unicode:: U+00417 .. CYRILLIC CAPITAL LETTER ZE
-.. |zcy| unicode:: U+00437 .. CYRILLIC SMALL LETTER ZE
-.. |ZHcy| unicode:: U+00416 .. CYRILLIC CAPITAL LETTER ZHE
-.. |zhcy| unicode:: U+00436 .. CYRILLIC SMALL LETTER ZHE
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isocyr2.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isocyr2.txt
deleted file mode 100644
index a78190c03..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isocyr2.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |DJcy| unicode:: U+00402 .. CYRILLIC CAPITAL LETTER DJE
-.. |djcy| unicode:: U+00452 .. CYRILLIC SMALL LETTER DJE
-.. |DScy| unicode:: U+00405 .. CYRILLIC CAPITAL LETTER DZE
-.. |dscy| unicode:: U+00455 .. CYRILLIC SMALL LETTER DZE
-.. |DZcy| unicode:: U+0040F .. CYRILLIC CAPITAL LETTER DZHE
-.. |dzcy| unicode:: U+0045F .. CYRILLIC SMALL LETTER DZHE
-.. |GJcy| unicode:: U+00403 .. CYRILLIC CAPITAL LETTER GJE
-.. |gjcy| unicode:: U+00453 .. CYRILLIC SMALL LETTER GJE
-.. |Iukcy| unicode:: U+00406 .. CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
-.. |iukcy| unicode:: U+00456 .. CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-.. |Jsercy| unicode:: U+00408 .. CYRILLIC CAPITAL LETTER JE
-.. |jsercy| unicode:: U+00458 .. CYRILLIC SMALL LETTER JE
-.. |Jukcy| unicode:: U+00404 .. CYRILLIC CAPITAL LETTER UKRAINIAN IE
-.. |jukcy| unicode:: U+00454 .. CYRILLIC SMALL LETTER UKRAINIAN IE
-.. |KJcy| unicode:: U+0040C .. CYRILLIC CAPITAL LETTER KJE
-.. |kjcy| unicode:: U+0045C .. CYRILLIC SMALL LETTER KJE
-.. |LJcy| unicode:: U+00409 .. CYRILLIC CAPITAL LETTER LJE
-.. |ljcy| unicode:: U+00459 .. CYRILLIC SMALL LETTER LJE
-.. |NJcy| unicode:: U+0040A .. CYRILLIC CAPITAL LETTER NJE
-.. |njcy| unicode:: U+0045A .. CYRILLIC SMALL LETTER NJE
-.. |TSHcy| unicode:: U+0040B .. CYRILLIC CAPITAL LETTER TSHE
-.. |tshcy| unicode:: U+0045B .. CYRILLIC SMALL LETTER TSHE
-.. |Ubrcy| unicode:: U+0040E .. CYRILLIC CAPITAL LETTER SHORT U
-.. |ubrcy| unicode:: U+0045E .. CYRILLIC SMALL LETTER SHORT U
-.. |YIcy| unicode:: U+00407 .. CYRILLIC CAPITAL LETTER YI
-.. |yicy| unicode:: U+00457 .. CYRILLIC SMALL LETTER YI
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isodia.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isodia.txt
deleted file mode 100644
index cfe403abf..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isodia.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |acute| unicode:: U+000B4 .. ACUTE ACCENT
-.. |breve| unicode:: U+002D8 .. BREVE
-.. |caron| unicode:: U+002C7 .. CARON
-.. |cedil| unicode:: U+000B8 .. CEDILLA
-.. |circ| unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
-.. |dblac| unicode:: U+002DD .. DOUBLE ACUTE ACCENT
-.. |die| unicode:: U+000A8 .. DIAERESIS
-.. |dot| unicode:: U+002D9 .. DOT ABOVE
-.. |grave| unicode:: U+00060 .. GRAVE ACCENT
-.. |macr| unicode:: U+000AF .. MACRON
-.. |ogon| unicode:: U+002DB .. OGONEK
-.. |ring| unicode:: U+002DA .. RING ABOVE
-.. |tilde| unicode:: U+002DC .. SMALL TILDE
-.. |uml| unicode:: U+000A8 .. DIAERESIS
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk1.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk1.txt
deleted file mode 100644
index 22a414bb4..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk1.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Agr| unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
-.. |agr| unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
-.. |Bgr| unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
-.. |bgr| unicode:: U+003B2 .. GREEK SMALL LETTER BETA
-.. |Dgr| unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
-.. |dgr| unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
-.. |EEgr| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
-.. |eegr| unicode:: U+003B7 .. GREEK SMALL LETTER ETA
-.. |Egr| unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
-.. |egr| unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
-.. |Ggr| unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
-.. |ggr| unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
-.. |Igr| unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
-.. |igr| unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
-.. |Kgr| unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
-.. |kgr| unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
-.. |KHgr| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
-.. |khgr| unicode:: U+003C7 .. GREEK SMALL LETTER CHI
-.. |Lgr| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
-.. |lgr| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
-.. |Mgr| unicode:: U+0039C .. GREEK CAPITAL LETTER MU
-.. |mgr| unicode:: U+003BC .. GREEK SMALL LETTER MU
-.. |Ngr| unicode:: U+0039D .. GREEK CAPITAL LETTER NU
-.. |ngr| unicode:: U+003BD .. GREEK SMALL LETTER NU
-.. |Ogr| unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
-.. |ogr| unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
-.. |OHgr| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
-.. |ohgr| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
-.. |Pgr| unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
-.. |pgr| unicode:: U+003C0 .. GREEK SMALL LETTER PI
-.. |PHgr| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
-.. |phgr| unicode:: U+003C6 .. GREEK SMALL LETTER PHI
-.. |PSgr| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
-.. |psgr| unicode:: U+003C8 .. GREEK SMALL LETTER PSI
-.. |Rgr| unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
-.. |rgr| unicode:: U+003C1 .. GREEK SMALL LETTER RHO
-.. |sfgr| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
-.. |Sgr| unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
-.. |sgr| unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
-.. |Tgr| unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
-.. |tgr| unicode:: U+003C4 .. GREEK SMALL LETTER TAU
-.. |THgr| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
-.. |thgr| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
-.. |Ugr| unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
-.. |ugr| unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
-.. |Xgr| unicode:: U+0039E .. GREEK CAPITAL LETTER XI
-.. |xgr| unicode:: U+003BE .. GREEK SMALL LETTER XI
-.. |Zgr| unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
-.. |zgr| unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk2.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk2.txt
deleted file mode 100644
index 4b4090ecd..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk2.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Aacgr| unicode:: U+00386 .. GREEK CAPITAL LETTER ALPHA WITH TONOS
-.. |aacgr| unicode:: U+003AC .. GREEK SMALL LETTER ALPHA WITH TONOS
-.. |Eacgr| unicode:: U+00388 .. GREEK CAPITAL LETTER EPSILON WITH TONOS
-.. |eacgr| unicode:: U+003AD .. GREEK SMALL LETTER EPSILON WITH TONOS
-.. |EEacgr| unicode:: U+00389 .. GREEK CAPITAL LETTER ETA WITH TONOS
-.. |eeacgr| unicode:: U+003AE .. GREEK SMALL LETTER ETA WITH TONOS
-.. |Iacgr| unicode:: U+0038A .. GREEK CAPITAL LETTER IOTA WITH TONOS
-.. |iacgr| unicode:: U+003AF .. GREEK SMALL LETTER IOTA WITH TONOS
-.. |idiagr| unicode:: U+00390 .. GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
-.. |Idigr| unicode:: U+003AA .. GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
-.. |idigr| unicode:: U+003CA .. GREEK SMALL LETTER IOTA WITH DIALYTIKA
-.. |Oacgr| unicode:: U+0038C .. GREEK CAPITAL LETTER OMICRON WITH TONOS
-.. |oacgr| unicode:: U+003CC .. GREEK SMALL LETTER OMICRON WITH TONOS
-.. |OHacgr| unicode:: U+0038F .. GREEK CAPITAL LETTER OMEGA WITH TONOS
-.. |ohacgr| unicode:: U+003CE .. GREEK SMALL LETTER OMEGA WITH TONOS
-.. |Uacgr| unicode:: U+0038E .. GREEK CAPITAL LETTER UPSILON WITH TONOS
-.. |uacgr| unicode:: U+003CD .. GREEK SMALL LETTER UPSILON WITH TONOS
-.. |udiagr| unicode:: U+003B0 .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
-.. |Udigr| unicode:: U+003AB .. GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
-.. |udigr| unicode:: U+003CB .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk3.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk3.txt
deleted file mode 100644
index 54d212f2c..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk3.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |alpha| unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
-.. |beta| unicode:: U+003B2 .. GREEK SMALL LETTER BETA
-.. |chi| unicode:: U+003C7 .. GREEK SMALL LETTER CHI
-.. |Delta| unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
-.. |delta| unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
-.. |epsi| unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
-.. |epsis| unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
-.. |epsiv| unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
-.. |eta| unicode:: U+003B7 .. GREEK SMALL LETTER ETA
-.. |Gamma| unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
-.. |gamma| unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
-.. |Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
-.. |gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
-.. |iota| unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
-.. |kappa| unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
-.. |kappav| unicode:: U+003F0 .. GREEK KAPPA SYMBOL
-.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
-.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
-.. |mu| unicode:: U+003BC .. GREEK SMALL LETTER MU
-.. |nu| unicode:: U+003BD .. GREEK SMALL LETTER NU
-.. |Omega| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
-.. |omega| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
-.. |Phi| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
-.. |phi| unicode:: U+003D5 .. GREEK PHI SYMBOL
-.. |phis| unicode:: U+003D5 .. GREEK PHI SYMBOL
-.. |phiv| unicode:: U+003C6 .. GREEK SMALL LETTER PHI
-.. |Pi| unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
-.. |pi| unicode:: U+003C0 .. GREEK SMALL LETTER PI
-.. |piv| unicode:: U+003D6 .. GREEK PI SYMBOL
-.. |Psi| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
-.. |psi| unicode:: U+003C8 .. GREEK SMALL LETTER PSI
-.. |rho| unicode:: U+003C1 .. GREEK SMALL LETTER RHO
-.. |rhov| unicode:: U+003F1 .. GREEK RHO SYMBOL
-.. |Sigma| unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
-.. |sigma| unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
-.. |sigmav| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
-.. |tau| unicode:: U+003C4 .. GREEK SMALL LETTER TAU
-.. |Theta| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
-.. |theta| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
-.. |thetas| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
-.. |thetav| unicode:: U+003D1 .. GREEK THETA SYMBOL
-.. |Upsi| unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
-.. |upsi| unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
-.. |Xi| unicode:: U+0039E .. GREEK CAPITAL LETTER XI
-.. |xi| unicode:: U+003BE .. GREEK SMALL LETTER XI
-.. |zeta| unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt
deleted file mode 100644
index c0e0238df..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |b.alpha| unicode:: U+1D6C2 .. MATHEMATICAL BOLD SMALL ALPHA
-.. |b.beta| unicode:: U+1D6C3 .. MATHEMATICAL BOLD SMALL BETA
-.. |b.chi| unicode:: U+1D6D8 .. MATHEMATICAL BOLD SMALL CHI
-.. |b.Delta| unicode:: U+1D6AB .. MATHEMATICAL BOLD CAPITAL DELTA
-.. |b.delta| unicode:: U+1D6C5 .. MATHEMATICAL BOLD SMALL DELTA
-.. |b.epsi| unicode:: U+1D6C6 .. MATHEMATICAL BOLD SMALL EPSILON
-.. |b.epsiv| unicode:: U+1D6DC .. MATHEMATICAL BOLD EPSILON SYMBOL
-.. |b.eta| unicode:: U+1D6C8 .. MATHEMATICAL BOLD SMALL ETA
-.. |b.Gamma| unicode:: U+1D6AA .. MATHEMATICAL BOLD CAPITAL GAMMA
-.. |b.gamma| unicode:: U+1D6C4 .. MATHEMATICAL BOLD SMALL GAMMA
-.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
-.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
-.. |b.iota| unicode:: U+1D6CA .. MATHEMATICAL BOLD SMALL IOTA
-.. |b.kappa| unicode:: U+1D6CB .. MATHEMATICAL BOLD SMALL KAPPA
-.. |b.kappav| unicode:: U+1D6DE .. MATHEMATICAL BOLD KAPPA SYMBOL
-.. |b.Lambda| unicode:: U+1D6B2 .. MATHEMATICAL BOLD CAPITAL LAMDA
-.. |b.lambda| unicode:: U+1D6CC .. MATHEMATICAL BOLD SMALL LAMDA
-.. |b.mu| unicode:: U+1D6CD .. MATHEMATICAL BOLD SMALL MU
-.. |b.nu| unicode:: U+1D6CE .. MATHEMATICAL BOLD SMALL NU
-.. |b.Omega| unicode:: U+1D6C0 .. MATHEMATICAL BOLD CAPITAL OMEGA
-.. |b.omega| unicode:: U+1D6DA .. MATHEMATICAL BOLD SMALL OMEGA
-.. |b.Phi| unicode:: U+1D6BD .. MATHEMATICAL BOLD CAPITAL PHI
-.. |b.phi| unicode:: U+1D6D7 .. MATHEMATICAL BOLD SMALL PHI
-.. |b.phiv| unicode:: U+1D6DF .. MATHEMATICAL BOLD PHI SYMBOL
-.. |b.Pi| unicode:: U+1D6B7 .. MATHEMATICAL BOLD CAPITAL PI
-.. |b.pi| unicode:: U+1D6D1 .. MATHEMATICAL BOLD SMALL PI
-.. |b.piv| unicode:: U+1D6E1 .. MATHEMATICAL BOLD PI SYMBOL
-.. |b.Psi| unicode:: U+1D6BF .. MATHEMATICAL BOLD CAPITAL PSI
-.. |b.psi| unicode:: U+1D6D9 .. MATHEMATICAL BOLD SMALL PSI
-.. |b.rho| unicode:: U+1D6D2 .. MATHEMATICAL BOLD SMALL RHO
-.. |b.rhov| unicode:: U+1D6E0 .. MATHEMATICAL BOLD RHO SYMBOL
-.. |b.Sigma| unicode:: U+1D6BA .. MATHEMATICAL BOLD CAPITAL SIGMA
-.. |b.sigma| unicode:: U+1D6D4 .. MATHEMATICAL BOLD SMALL SIGMA
-.. |b.sigmav| unicode:: U+1D6D3 .. MATHEMATICAL BOLD SMALL FINAL SIGMA
-.. |b.tau| unicode:: U+1D6D5 .. MATHEMATICAL BOLD SMALL TAU
-.. |b.Theta| unicode:: U+1D6AF .. MATHEMATICAL BOLD CAPITAL THETA
-.. |b.thetas| unicode:: U+1D6C9 .. MATHEMATICAL BOLD SMALL THETA
-.. |b.thetav| unicode:: U+1D6DD .. MATHEMATICAL BOLD THETA SYMBOL
-.. |b.Upsi| unicode:: U+1D6BC .. MATHEMATICAL BOLD CAPITAL UPSILON
-.. |b.upsi| unicode:: U+1D6D6 .. MATHEMATICAL BOLD SMALL UPSILON
-.. |b.Xi| unicode:: U+1D6B5 .. MATHEMATICAL BOLD CAPITAL XI
-.. |b.xi| unicode:: U+1D6CF .. MATHEMATICAL BOLD SMALL XI
-.. |b.zeta| unicode:: U+1D6C7 .. MATHEMATICAL BOLD SMALL ZETA
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk4.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk4.txt
deleted file mode 100644
index 836b6bd77..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isogrk4.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
-.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isolat1.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isolat1.txt
deleted file mode 100644
index 4e4202b7a..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isolat1.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
-.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
-.. |Acirc| unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
-.. |acirc| unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
-.. |AElig| unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
-.. |aelig| unicode:: U+000E6 .. LATIN SMALL LETTER AE
-.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
-.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
-.. |Aring| unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
-.. |aring| unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
-.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
-.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
-.. |Auml| unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
-.. |auml| unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
-.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
-.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
-.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
-.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
-.. |Ecirc| unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
-.. |ecirc| unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
-.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
-.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
-.. |ETH| unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
-.. |eth| unicode:: U+000F0 .. LATIN SMALL LETTER ETH
-.. |Euml| unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
-.. |euml| unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
-.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
-.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
-.. |Icirc| unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
-.. |icirc| unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
-.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
-.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
-.. |Iuml| unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
-.. |iuml| unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
-.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
-.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
-.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
-.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
-.. |Ocirc| unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
-.. |ocirc| unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
-.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
-.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
-.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
-.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
-.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
-.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
-.. |Ouml| unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
-.. |ouml| unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
-.. |szlig| unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
-.. |THORN| unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
-.. |thorn| unicode:: U+000FE .. LATIN SMALL LETTER THORN
-.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
-.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
-.. |Ucirc| unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
-.. |ucirc| unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
-.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
-.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
-.. |Uuml| unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
-.. |uuml| unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
-.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
-.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
-.. |yuml| unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isolat2.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isolat2.txt
deleted file mode 100644
index 808ef9376..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isolat2.txt
+++ /dev/null
@@ -1,128 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Abreve| unicode:: U+00102 .. LATIN CAPITAL LETTER A WITH BREVE
-.. |abreve| unicode:: U+00103 .. LATIN SMALL LETTER A WITH BREVE
-.. |Amacr| unicode:: U+00100 .. LATIN CAPITAL LETTER A WITH MACRON
-.. |amacr| unicode:: U+00101 .. LATIN SMALL LETTER A WITH MACRON
-.. |Aogon| unicode:: U+00104 .. LATIN CAPITAL LETTER A WITH OGONEK
-.. |aogon| unicode:: U+00105 .. LATIN SMALL LETTER A WITH OGONEK
-.. |Cacute| unicode:: U+00106 .. LATIN CAPITAL LETTER C WITH ACUTE
-.. |cacute| unicode:: U+00107 .. LATIN SMALL LETTER C WITH ACUTE
-.. |Ccaron| unicode:: U+0010C .. LATIN CAPITAL LETTER C WITH CARON
-.. |ccaron| unicode:: U+0010D .. LATIN SMALL LETTER C WITH CARON
-.. |Ccirc| unicode:: U+00108 .. LATIN CAPITAL LETTER C WITH CIRCUMFLEX
-.. |ccirc| unicode:: U+00109 .. LATIN SMALL LETTER C WITH CIRCUMFLEX
-.. |Cdot| unicode:: U+0010A .. LATIN CAPITAL LETTER C WITH DOT ABOVE
-.. |cdot| unicode:: U+0010B .. LATIN SMALL LETTER C WITH DOT ABOVE
-.. |Dcaron| unicode:: U+0010E .. LATIN CAPITAL LETTER D WITH CARON
-.. |dcaron| unicode:: U+0010F .. LATIN SMALL LETTER D WITH CARON
-.. |Dstrok| unicode:: U+00110 .. LATIN CAPITAL LETTER D WITH STROKE
-.. |dstrok| unicode:: U+00111 .. LATIN SMALL LETTER D WITH STROKE
-.. |Ecaron| unicode:: U+0011A .. LATIN CAPITAL LETTER E WITH CARON
-.. |ecaron| unicode:: U+0011B .. LATIN SMALL LETTER E WITH CARON
-.. |Edot| unicode:: U+00116 .. LATIN CAPITAL LETTER E WITH DOT ABOVE
-.. |edot| unicode:: U+00117 .. LATIN SMALL LETTER E WITH DOT ABOVE
-.. |Emacr| unicode:: U+00112 .. LATIN CAPITAL LETTER E WITH MACRON
-.. |emacr| unicode:: U+00113 .. LATIN SMALL LETTER E WITH MACRON
-.. |ENG| unicode:: U+0014A .. LATIN CAPITAL LETTER ENG
-.. |eng| unicode:: U+0014B .. LATIN SMALL LETTER ENG
-.. |Eogon| unicode:: U+00118 .. LATIN CAPITAL LETTER E WITH OGONEK
-.. |eogon| unicode:: U+00119 .. LATIN SMALL LETTER E WITH OGONEK
-.. |gacute| unicode:: U+001F5 .. LATIN SMALL LETTER G WITH ACUTE
-.. |Gbreve| unicode:: U+0011E .. LATIN CAPITAL LETTER G WITH BREVE
-.. |gbreve| unicode:: U+0011F .. LATIN SMALL LETTER G WITH BREVE
-.. |Gcedil| unicode:: U+00122 .. LATIN CAPITAL LETTER G WITH CEDILLA
-.. |gcedil| unicode:: U+00123 .. LATIN SMALL LETTER G WITH CEDILLA
-.. |Gcirc| unicode:: U+0011C .. LATIN CAPITAL LETTER G WITH CIRCUMFLEX
-.. |gcirc| unicode:: U+0011D .. LATIN SMALL LETTER G WITH CIRCUMFLEX
-.. |Gdot| unicode:: U+00120 .. LATIN CAPITAL LETTER G WITH DOT ABOVE
-.. |gdot| unicode:: U+00121 .. LATIN SMALL LETTER G WITH DOT ABOVE
-.. |Hcirc| unicode:: U+00124 .. LATIN CAPITAL LETTER H WITH CIRCUMFLEX
-.. |hcirc| unicode:: U+00125 .. LATIN SMALL LETTER H WITH CIRCUMFLEX
-.. |Hstrok| unicode:: U+00126 .. LATIN CAPITAL LETTER H WITH STROKE
-.. |hstrok| unicode:: U+00127 .. LATIN SMALL LETTER H WITH STROKE
-.. |Idot| unicode:: U+00130 .. LATIN CAPITAL LETTER I WITH DOT ABOVE
-.. |IJlig| unicode:: U+00132 .. LATIN CAPITAL LIGATURE IJ
-.. |ijlig| unicode:: U+00133 .. LATIN SMALL LIGATURE IJ
-.. |Imacr| unicode:: U+0012A .. LATIN CAPITAL LETTER I WITH MACRON
-.. |imacr| unicode:: U+0012B .. LATIN SMALL LETTER I WITH MACRON
-.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
-.. |Iogon| unicode:: U+0012E .. LATIN CAPITAL LETTER I WITH OGONEK
-.. |iogon| unicode:: U+0012F .. LATIN SMALL LETTER I WITH OGONEK
-.. |Itilde| unicode:: U+00128 .. LATIN CAPITAL LETTER I WITH TILDE
-.. |itilde| unicode:: U+00129 .. LATIN SMALL LETTER I WITH TILDE
-.. |Jcirc| unicode:: U+00134 .. LATIN CAPITAL LETTER J WITH CIRCUMFLEX
-.. |jcirc| unicode:: U+00135 .. LATIN SMALL LETTER J WITH CIRCUMFLEX
-.. |Kcedil| unicode:: U+00136 .. LATIN CAPITAL LETTER K WITH CEDILLA
-.. |kcedil| unicode:: U+00137 .. LATIN SMALL LETTER K WITH CEDILLA
-.. |kgreen| unicode:: U+00138 .. LATIN SMALL LETTER KRA
-.. |Lacute| unicode:: U+00139 .. LATIN CAPITAL LETTER L WITH ACUTE
-.. |lacute| unicode:: U+0013A .. LATIN SMALL LETTER L WITH ACUTE
-.. |Lcaron| unicode:: U+0013D .. LATIN CAPITAL LETTER L WITH CARON
-.. |lcaron| unicode:: U+0013E .. LATIN SMALL LETTER L WITH CARON
-.. |Lcedil| unicode:: U+0013B .. LATIN CAPITAL LETTER L WITH CEDILLA
-.. |lcedil| unicode:: U+0013C .. LATIN SMALL LETTER L WITH CEDILLA
-.. |Lmidot| unicode:: U+0013F .. LATIN CAPITAL LETTER L WITH MIDDLE DOT
-.. |lmidot| unicode:: U+00140 .. LATIN SMALL LETTER L WITH MIDDLE DOT
-.. |Lstrok| unicode:: U+00141 .. LATIN CAPITAL LETTER L WITH STROKE
-.. |lstrok| unicode:: U+00142 .. LATIN SMALL LETTER L WITH STROKE
-.. |Nacute| unicode:: U+00143 .. LATIN CAPITAL LETTER N WITH ACUTE
-.. |nacute| unicode:: U+00144 .. LATIN SMALL LETTER N WITH ACUTE
-.. |napos| unicode:: U+00149 .. LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
-.. |Ncaron| unicode:: U+00147 .. LATIN CAPITAL LETTER N WITH CARON
-.. |ncaron| unicode:: U+00148 .. LATIN SMALL LETTER N WITH CARON
-.. |Ncedil| unicode:: U+00145 .. LATIN CAPITAL LETTER N WITH CEDILLA
-.. |ncedil| unicode:: U+00146 .. LATIN SMALL LETTER N WITH CEDILLA
-.. |Odblac| unicode:: U+00150 .. LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
-.. |odblac| unicode:: U+00151 .. LATIN SMALL LETTER O WITH DOUBLE ACUTE
-.. |OElig| unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
-.. |oelig| unicode:: U+00153 .. LATIN SMALL LIGATURE OE
-.. |Omacr| unicode:: U+0014C .. LATIN CAPITAL LETTER O WITH MACRON
-.. |omacr| unicode:: U+0014D .. LATIN SMALL LETTER O WITH MACRON
-.. |Racute| unicode:: U+00154 .. LATIN CAPITAL LETTER R WITH ACUTE
-.. |racute| unicode:: U+00155 .. LATIN SMALL LETTER R WITH ACUTE
-.. |Rcaron| unicode:: U+00158 .. LATIN CAPITAL LETTER R WITH CARON
-.. |rcaron| unicode:: U+00159 .. LATIN SMALL LETTER R WITH CARON
-.. |Rcedil| unicode:: U+00156 .. LATIN CAPITAL LETTER R WITH CEDILLA
-.. |rcedil| unicode:: U+00157 .. LATIN SMALL LETTER R WITH CEDILLA
-.. |Sacute| unicode:: U+0015A .. LATIN CAPITAL LETTER S WITH ACUTE
-.. |sacute| unicode:: U+0015B .. LATIN SMALL LETTER S WITH ACUTE
-.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
-.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
-.. |Scedil| unicode:: U+0015E .. LATIN CAPITAL LETTER S WITH CEDILLA
-.. |scedil| unicode:: U+0015F .. LATIN SMALL LETTER S WITH CEDILLA
-.. |Scirc| unicode:: U+0015C .. LATIN CAPITAL LETTER S WITH CIRCUMFLEX
-.. |scirc| unicode:: U+0015D .. LATIN SMALL LETTER S WITH CIRCUMFLEX
-.. |Tcaron| unicode:: U+00164 .. LATIN CAPITAL LETTER T WITH CARON
-.. |tcaron| unicode:: U+00165 .. LATIN SMALL LETTER T WITH CARON
-.. |Tcedil| unicode:: U+00162 .. LATIN CAPITAL LETTER T WITH CEDILLA
-.. |tcedil| unicode:: U+00163 .. LATIN SMALL LETTER T WITH CEDILLA
-.. |Tstrok| unicode:: U+00166 .. LATIN CAPITAL LETTER T WITH STROKE
-.. |tstrok| unicode:: U+00167 .. LATIN SMALL LETTER T WITH STROKE
-.. |Ubreve| unicode:: U+0016C .. LATIN CAPITAL LETTER U WITH BREVE
-.. |ubreve| unicode:: U+0016D .. LATIN SMALL LETTER U WITH BREVE
-.. |Udblac| unicode:: U+00170 .. LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
-.. |udblac| unicode:: U+00171 .. LATIN SMALL LETTER U WITH DOUBLE ACUTE
-.. |Umacr| unicode:: U+0016A .. LATIN CAPITAL LETTER U WITH MACRON
-.. |umacr| unicode:: U+0016B .. LATIN SMALL LETTER U WITH MACRON
-.. |Uogon| unicode:: U+00172 .. LATIN CAPITAL LETTER U WITH OGONEK
-.. |uogon| unicode:: U+00173 .. LATIN SMALL LETTER U WITH OGONEK
-.. |Uring| unicode:: U+0016E .. LATIN CAPITAL LETTER U WITH RING ABOVE
-.. |uring| unicode:: U+0016F .. LATIN SMALL LETTER U WITH RING ABOVE
-.. |Utilde| unicode:: U+00168 .. LATIN CAPITAL LETTER U WITH TILDE
-.. |utilde| unicode:: U+00169 .. LATIN SMALL LETTER U WITH TILDE
-.. |Wcirc| unicode:: U+00174 .. LATIN CAPITAL LETTER W WITH CIRCUMFLEX
-.. |wcirc| unicode:: U+00175 .. LATIN SMALL LETTER W WITH CIRCUMFLEX
-.. |Ycirc| unicode:: U+00176 .. LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
-.. |ycirc| unicode:: U+00177 .. LATIN SMALL LETTER Y WITH CIRCUMFLEX
-.. |Yuml| unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
-.. |Zacute| unicode:: U+00179 .. LATIN CAPITAL LETTER Z WITH ACUTE
-.. |zacute| unicode:: U+0017A .. LATIN SMALL LETTER Z WITH ACUTE
-.. |Zcaron| unicode:: U+0017D .. LATIN CAPITAL LETTER Z WITH CARON
-.. |zcaron| unicode:: U+0017E .. LATIN SMALL LETTER Z WITH CARON
-.. |Zdot| unicode:: U+0017B .. LATIN CAPITAL LETTER Z WITH DOT ABOVE
-.. |zdot| unicode:: U+0017C .. LATIN SMALL LETTER Z WITH DOT ABOVE
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt
deleted file mode 100644
index 73768bccd..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Afr| unicode:: U+1D504 .. MATHEMATICAL FRAKTUR CAPITAL A
-.. |afr| unicode:: U+1D51E .. MATHEMATICAL FRAKTUR SMALL A
-.. |Bfr| unicode:: U+1D505 .. MATHEMATICAL FRAKTUR CAPITAL B
-.. |bfr| unicode:: U+1D51F .. MATHEMATICAL FRAKTUR SMALL B
-.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
-.. |cfr| unicode:: U+1D520 .. MATHEMATICAL FRAKTUR SMALL C
-.. |Dfr| unicode:: U+1D507 .. MATHEMATICAL FRAKTUR CAPITAL D
-.. |dfr| unicode:: U+1D521 .. MATHEMATICAL FRAKTUR SMALL D
-.. |Efr| unicode:: U+1D508 .. MATHEMATICAL FRAKTUR CAPITAL E
-.. |efr| unicode:: U+1D522 .. MATHEMATICAL FRAKTUR SMALL E
-.. |Ffr| unicode:: U+1D509 .. MATHEMATICAL FRAKTUR CAPITAL F
-.. |ffr| unicode:: U+1D523 .. MATHEMATICAL FRAKTUR SMALL F
-.. |Gfr| unicode:: U+1D50A .. MATHEMATICAL FRAKTUR CAPITAL G
-.. |gfr| unicode:: U+1D524 .. MATHEMATICAL FRAKTUR SMALL G
-.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
-.. |hfr| unicode:: U+1D525 .. MATHEMATICAL FRAKTUR SMALL H
-.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |ifr| unicode:: U+1D526 .. MATHEMATICAL FRAKTUR SMALL I
-.. |Jfr| unicode:: U+1D50D .. MATHEMATICAL FRAKTUR CAPITAL J
-.. |jfr| unicode:: U+1D527 .. MATHEMATICAL FRAKTUR SMALL J
-.. |Kfr| unicode:: U+1D50E .. MATHEMATICAL FRAKTUR CAPITAL K
-.. |kfr| unicode:: U+1D528 .. MATHEMATICAL FRAKTUR SMALL K
-.. |Lfr| unicode:: U+1D50F .. MATHEMATICAL FRAKTUR CAPITAL L
-.. |lfr| unicode:: U+1D529 .. MATHEMATICAL FRAKTUR SMALL L
-.. |Mfr| unicode:: U+1D510 .. MATHEMATICAL FRAKTUR CAPITAL M
-.. |mfr| unicode:: U+1D52A .. MATHEMATICAL FRAKTUR SMALL M
-.. |Nfr| unicode:: U+1D511 .. MATHEMATICAL FRAKTUR CAPITAL N
-.. |nfr| unicode:: U+1D52B .. MATHEMATICAL FRAKTUR SMALL N
-.. |Ofr| unicode:: U+1D512 .. MATHEMATICAL FRAKTUR CAPITAL O
-.. |ofr| unicode:: U+1D52C .. MATHEMATICAL FRAKTUR SMALL O
-.. |Pfr| unicode:: U+1D513 .. MATHEMATICAL FRAKTUR CAPITAL P
-.. |pfr| unicode:: U+1D52D .. MATHEMATICAL FRAKTUR SMALL P
-.. |Qfr| unicode:: U+1D514 .. MATHEMATICAL FRAKTUR CAPITAL Q
-.. |qfr| unicode:: U+1D52E .. MATHEMATICAL FRAKTUR SMALL Q
-.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |rfr| unicode:: U+1D52F .. MATHEMATICAL FRAKTUR SMALL R
-.. |Sfr| unicode:: U+1D516 .. MATHEMATICAL FRAKTUR CAPITAL S
-.. |sfr| unicode:: U+1D530 .. MATHEMATICAL FRAKTUR SMALL S
-.. |Tfr| unicode:: U+1D517 .. MATHEMATICAL FRAKTUR CAPITAL T
-.. |tfr| unicode:: U+1D531 .. MATHEMATICAL FRAKTUR SMALL T
-.. |Ufr| unicode:: U+1D518 .. MATHEMATICAL FRAKTUR CAPITAL U
-.. |ufr| unicode:: U+1D532 .. MATHEMATICAL FRAKTUR SMALL U
-.. |Vfr| unicode:: U+1D519 .. MATHEMATICAL FRAKTUR CAPITAL V
-.. |vfr| unicode:: U+1D533 .. MATHEMATICAL FRAKTUR SMALL V
-.. |Wfr| unicode:: U+1D51A .. MATHEMATICAL FRAKTUR CAPITAL W
-.. |wfr| unicode:: U+1D534 .. MATHEMATICAL FRAKTUR SMALL W
-.. |Xfr| unicode:: U+1D51B .. MATHEMATICAL FRAKTUR CAPITAL X
-.. |xfr| unicode:: U+1D535 .. MATHEMATICAL FRAKTUR SMALL X
-.. |Yfr| unicode:: U+1D51C .. MATHEMATICAL FRAKTUR CAPITAL Y
-.. |yfr| unicode:: U+1D536 .. MATHEMATICAL FRAKTUR SMALL Y
-.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
-.. |zfr| unicode:: U+1D537 .. MATHEMATICAL FRAKTUR SMALL Z
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomfrk.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomfrk.txt
deleted file mode 100644
index 81dd4b6e0..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomfrk.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
-.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
-.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomopf-wide.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomopf-wide.txt
deleted file mode 100644
index 2c16866ea..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomopf-wide.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Aopf| unicode:: U+1D538 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL A
-.. |Bopf| unicode:: U+1D539 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
-.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
-.. |Dopf| unicode:: U+1D53B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL D
-.. |Eopf| unicode:: U+1D53C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL E
-.. |Fopf| unicode:: U+1D53D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL F
-.. |Gopf| unicode:: U+1D53E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
-.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
-.. |Iopf| unicode:: U+1D540 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL I
-.. |Jopf| unicode:: U+1D541 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL J
-.. |Kopf| unicode:: U+1D542 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL K
-.. |Lopf| unicode:: U+1D543 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL L
-.. |Mopf| unicode:: U+1D544 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
-.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
-.. |Oopf| unicode:: U+1D546 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
-.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
-.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
-.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
-.. |Sopf| unicode:: U+1D54A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL S
-.. |Topf| unicode:: U+1D54B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL T
-.. |Uopf| unicode:: U+1D54C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL U
-.. |Vopf| unicode:: U+1D54D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL V
-.. |Wopf| unicode:: U+1D54E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL W
-.. |Xopf| unicode:: U+1D54F .. MATHEMATICAL DOUBLE-STRUCK CAPITAL X
-.. |Yopf| unicode:: U+1D550 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
-.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomopf.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomopf.txt
deleted file mode 100644
index 03c6a0d24..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomopf.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
-.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
-.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
-.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
-.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
-.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
-.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomscr-wide.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomscr-wide.txt
deleted file mode 100644
index acfe7a008..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomscr-wide.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Ascr| unicode:: U+1D49C .. MATHEMATICAL SCRIPT CAPITAL A
-.. |ascr| unicode:: U+1D4B6 .. MATHEMATICAL SCRIPT SMALL A
-.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
-.. |bscr| unicode:: U+1D4B7 .. MATHEMATICAL SCRIPT SMALL B
-.. |Cscr| unicode:: U+1D49E .. MATHEMATICAL SCRIPT CAPITAL C
-.. |cscr| unicode:: U+1D4B8 .. MATHEMATICAL SCRIPT SMALL C
-.. |Dscr| unicode:: U+1D49F .. MATHEMATICAL SCRIPT CAPITAL D
-.. |dscr| unicode:: U+1D4B9 .. MATHEMATICAL SCRIPT SMALL D
-.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
-.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
-.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
-.. |fscr| unicode:: U+1D4BB .. MATHEMATICAL SCRIPT SMALL F
-.. |Gscr| unicode:: U+1D4A2 .. MATHEMATICAL SCRIPT CAPITAL G
-.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
-.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
-.. |hscr| unicode:: U+1D4BD .. MATHEMATICAL SCRIPT SMALL H
-.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
-.. |iscr| unicode:: U+1D4BE .. MATHEMATICAL SCRIPT SMALL I
-.. |Jscr| unicode:: U+1D4A5 .. MATHEMATICAL SCRIPT CAPITAL J
-.. |jscr| unicode:: U+1D4BF .. MATHEMATICAL SCRIPT SMALL J
-.. |Kscr| unicode:: U+1D4A6 .. MATHEMATICAL SCRIPT CAPITAL K
-.. |kscr| unicode:: U+1D4C0 .. MATHEMATICAL SCRIPT SMALL K
-.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
-.. |lscr| unicode:: U+1D4C1 .. MATHEMATICAL SCRIPT SMALL L
-.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
-.. |mscr| unicode:: U+1D4C2 .. MATHEMATICAL SCRIPT SMALL M
-.. |Nscr| unicode:: U+1D4A9 .. MATHEMATICAL SCRIPT CAPITAL N
-.. |nscr| unicode:: U+1D4C3 .. MATHEMATICAL SCRIPT SMALL N
-.. |Oscr| unicode:: U+1D4AA .. MATHEMATICAL SCRIPT CAPITAL O
-.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
-.. |Pscr| unicode:: U+1D4AB .. MATHEMATICAL SCRIPT CAPITAL P
-.. |pscr| unicode:: U+1D4C5 .. MATHEMATICAL SCRIPT SMALL P
-.. |Qscr| unicode:: U+1D4AC .. MATHEMATICAL SCRIPT CAPITAL Q
-.. |qscr| unicode:: U+1D4C6 .. MATHEMATICAL SCRIPT SMALL Q
-.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
-.. |rscr| unicode:: U+1D4C7 .. MATHEMATICAL SCRIPT SMALL R
-.. |Sscr| unicode:: U+1D4AE .. MATHEMATICAL SCRIPT CAPITAL S
-.. |sscr| unicode:: U+1D4C8 .. MATHEMATICAL SCRIPT SMALL S
-.. |Tscr| unicode:: U+1D4AF .. MATHEMATICAL SCRIPT CAPITAL T
-.. |tscr| unicode:: U+1D4C9 .. MATHEMATICAL SCRIPT SMALL T
-.. |Uscr| unicode:: U+1D4B0 .. MATHEMATICAL SCRIPT CAPITAL U
-.. |uscr| unicode:: U+1D4CA .. MATHEMATICAL SCRIPT SMALL U
-.. |Vscr| unicode:: U+1D4B1 .. MATHEMATICAL SCRIPT CAPITAL V
-.. |vscr| unicode:: U+1D4CB .. MATHEMATICAL SCRIPT SMALL V
-.. |Wscr| unicode:: U+1D4B2 .. MATHEMATICAL SCRIPT CAPITAL W
-.. |wscr| unicode:: U+1D4CC .. MATHEMATICAL SCRIPT SMALL W
-.. |Xscr| unicode:: U+1D4B3 .. MATHEMATICAL SCRIPT CAPITAL X
-.. |xscr| unicode:: U+1D4CD .. MATHEMATICAL SCRIPT SMALL X
-.. |Yscr| unicode:: U+1D4B4 .. MATHEMATICAL SCRIPT CAPITAL Y
-.. |yscr| unicode:: U+1D4CE .. MATHEMATICAL SCRIPT SMALL Y
-.. |Zscr| unicode:: U+1D4B5 .. MATHEMATICAL SCRIPT CAPITAL Z
-.. |zscr| unicode:: U+1D4CF .. MATHEMATICAL SCRIPT SMALL Z
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomscr.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomscr.txt
deleted file mode 100644
index 951577e8f..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isomscr.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
-.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
-.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
-.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
-.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
-.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
-.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
-.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
-.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
-.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
-.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isonum.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isonum.txt
deleted file mode 100644
index 0d280c980..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isonum.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |amp| unicode:: U+00026 .. AMPERSAND
-.. |apos| unicode:: U+00027 .. APOSTROPHE
-.. |ast| unicode:: U+0002A .. ASTERISK
-.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
-.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUS
-.. |cent| unicode:: U+000A2 .. CENT SIGN
-.. |colon| unicode:: U+0003A .. COLON
-.. |comma| unicode:: U+0002C .. COMMA
-.. |commat| unicode:: U+00040 .. COMMERCIAL AT
-.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN
-.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
-.. |darr| unicode:: U+02193 .. DOWNWARDS ARROW
-.. |deg| unicode:: U+000B0 .. DEGREE SIGN
-.. |divide| unicode:: U+000F7 .. DIVISION SIGN
-.. |dollar| unicode:: U+00024 .. DOLLAR SIGN
-.. |equals| unicode:: U+0003D .. EQUALS SIGN
-.. |excl| unicode:: U+00021 .. EXCLAMATION MARK
-.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
-.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
-.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH
-.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
-.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS
-.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS
-.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS
-.. |gt| unicode:: U+0003E .. GREATER-THAN SIGN
-.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
-.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR
-.. |hyphen| unicode:: U+02010 .. HYPHEN
-.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
-.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
-.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-.. |larr| unicode:: U+02190 .. LEFTWARDS ARROW
-.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKET
-.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
-.. |lowbar| unicode:: U+0005F .. LOW LINE
-.. |lpar| unicode:: U+00028 .. LEFT PARENTHESIS
-.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKET
-.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
-.. |lt| unicode:: U+0003C .. LESS-THAN SIGN
-.. |micro| unicode:: U+000B5 .. MICRO SIGN
-.. |middot| unicode:: U+000B7 .. MIDDLE DOT
-.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACE
-.. |not| unicode:: U+000AC .. NOT SIGN
-.. |num| unicode:: U+00023 .. NUMBER SIGN
-.. |ohm| unicode:: U+02126 .. OHM SIGN
-.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
-.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
-.. |para| unicode:: U+000B6 .. PILCROW SIGN
-.. |percnt| unicode:: U+00025 .. PERCENT SIGN
-.. |period| unicode:: U+0002E .. FULL STOP
-.. |plus| unicode:: U+0002B .. PLUS SIGN
-.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
-.. |pound| unicode:: U+000A3 .. POUND SIGN
-.. |quest| unicode:: U+0003F .. QUESTION MARK
-.. |quot| unicode:: U+00022 .. QUOTATION MARK
-.. |raquo| unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKET
-.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
-.. |reg| unicode:: U+000AE .. REGISTERED SIGN
-.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESIS
-.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKET
-.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
-.. |sect| unicode:: U+000A7 .. SECTION SIGN
-.. |semi| unicode:: U+0003B .. SEMICOLON
-.. |shy| unicode:: U+000AD .. SOFT HYPHEN
-.. |sol| unicode:: U+0002F .. SOLIDUS
-.. |sung| unicode:: U+0266A .. EIGHTH NOTE
-.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONE
-.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWO
-.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREE
-.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGN
-.. |trade| unicode:: U+02122 .. TRADE MARK SIGN
-.. |uarr| unicode:: U+02191 .. UPWARDS ARROW
-.. |verbar| unicode:: U+0007C .. VERTICAL LINE
-.. |yen| unicode:: U+000A5 .. YEN SIGN
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isopub.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isopub.txt
deleted file mode 100644
index 78e12513e..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isopub.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |blank| unicode:: U+02423 .. OPEN BOX
-.. |blk12| unicode:: U+02592 .. MEDIUM SHADE
-.. |blk14| unicode:: U+02591 .. LIGHT SHADE
-.. |blk34| unicode:: U+02593 .. DARK SHADE
-.. |block| unicode:: U+02588 .. FULL BLOCK
-.. |bull| unicode:: U+02022 .. BULLET
-.. |caret| unicode:: U+02041 .. CARET INSERTION POINT
-.. |check| unicode:: U+02713 .. CHECK MARK
-.. |cir| unicode:: U+025CB .. WHITE CIRCLE
-.. |clubs| unicode:: U+02663 .. BLACK CLUB SUIT
-.. |copysr| unicode:: U+02117 .. SOUND RECORDING COPYRIGHT
-.. |cross| unicode:: U+02717 .. BALLOT X
-.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
-.. |dagger| unicode:: U+02020 .. DAGGER
-.. |dash| unicode:: U+02010 .. HYPHEN
-.. |diams| unicode:: U+02666 .. BLACK DIAMOND SUIT
-.. |dlcrop| unicode:: U+0230D .. BOTTOM LEFT CROP
-.. |drcrop| unicode:: U+0230C .. BOTTOM RIGHT CROP
-.. |dtri| unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
-.. |dtrif| unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
-.. |emsp| unicode:: U+02003 .. EM SPACE
-.. |emsp13| unicode:: U+02004 .. THREE-PER-EM SPACE
-.. |emsp14| unicode:: U+02005 .. FOUR-PER-EM SPACE
-.. |ensp| unicode:: U+02002 .. EN SPACE
-.. |female| unicode:: U+02640 .. FEMALE SIGN
-.. |ffilig| unicode:: U+0FB03 .. LATIN SMALL LIGATURE FFI
-.. |fflig| unicode:: U+0FB00 .. LATIN SMALL LIGATURE FF
-.. |ffllig| unicode:: U+0FB04 .. LATIN SMALL LIGATURE FFL
-.. |filig| unicode:: U+0FB01 .. LATIN SMALL LIGATURE FI
-.. |flat| unicode:: U+0266D .. MUSIC FLAT SIGN
-.. |fllig| unicode:: U+0FB02 .. LATIN SMALL LIGATURE FL
-.. |frac13| unicode:: U+02153 .. VULGAR FRACTION ONE THIRD
-.. |frac15| unicode:: U+02155 .. VULGAR FRACTION ONE FIFTH
-.. |frac16| unicode:: U+02159 .. VULGAR FRACTION ONE SIXTH
-.. |frac23| unicode:: U+02154 .. VULGAR FRACTION TWO THIRDS
-.. |frac25| unicode:: U+02156 .. VULGAR FRACTION TWO FIFTHS
-.. |frac35| unicode:: U+02157 .. VULGAR FRACTION THREE FIFTHS
-.. |frac45| unicode:: U+02158 .. VULGAR FRACTION FOUR FIFTHS
-.. |frac56| unicode:: U+0215A .. VULGAR FRACTION FIVE SIXTHS
-.. |hairsp| unicode:: U+0200A .. HAIR SPACE
-.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT
-.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS
-.. |hybull| unicode:: U+02043 .. HYPHEN BULLET
-.. |incare| unicode:: U+02105 .. CARE OF
-.. |ldquor| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
-.. |lhblk| unicode:: U+02584 .. LOWER HALF BLOCK
-.. |loz| unicode:: U+025CA .. LOZENGE
-.. |lozf| unicode:: U+029EB .. BLACK LOZENGE
-.. |lsquor| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
-.. |ltri| unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
-.. |ltrif| unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
-.. |male| unicode:: U+02642 .. MALE SIGN
-.. |malt| unicode:: U+02720 .. MALTESE CROSS
-.. |marker| unicode:: U+025AE .. BLACK VERTICAL RECTANGLE
-.. |mdash| unicode:: U+02014 .. EM DASH
-.. |mldr| unicode:: U+02026 .. HORIZONTAL ELLIPSIS
-.. |natur| unicode:: U+0266E .. MUSIC NATURAL SIGN
-.. |ndash| unicode:: U+02013 .. EN DASH
-.. |nldr| unicode:: U+02025 .. TWO DOT LEADER
-.. |numsp| unicode:: U+02007 .. FIGURE SPACE
-.. |phone| unicode:: U+0260E .. BLACK TELEPHONE
-.. |puncsp| unicode:: U+02008 .. PUNCTUATION SPACE
-.. |rdquor| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
-.. |rect| unicode:: U+025AD .. WHITE RECTANGLE
-.. |rsquor| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
-.. |rtri| unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
-.. |rtrif| unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
-.. |rx| unicode:: U+0211E .. PRESCRIPTION TAKE
-.. |sext| unicode:: U+02736 .. SIX POINTED BLACK STAR
-.. |sharp| unicode:: U+0266F .. MUSIC SHARP SIGN
-.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT
-.. |squ| unicode:: U+025A1 .. WHITE SQUARE
-.. |squf| unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |star| unicode:: U+02606 .. WHITE STAR
-.. |starf| unicode:: U+02605 .. BLACK STAR
-.. |target| unicode:: U+02316 .. POSITION INDICATOR
-.. |telrec| unicode:: U+02315 .. TELEPHONE RECORDER
-.. |thinsp| unicode:: U+02009 .. THIN SPACE
-.. |uhblk| unicode:: U+02580 .. UPPER HALF BLOCK
-.. |ulcrop| unicode:: U+0230F .. TOP LEFT CROP
-.. |urcrop| unicode:: U+0230E .. TOP RIGHT CROP
-.. |utri| unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
-.. |utrif| unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
-.. |vellip| unicode:: U+022EE .. VERTICAL ELLIPSIS
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isotech.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isotech.txt
deleted file mode 100644
index 9b01eaad2..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/isotech.txt
+++ /dev/null
@@ -1,168 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |acd| unicode:: U+0223F .. SINE WAVE
-.. |aleph| unicode:: U+02135 .. ALEF SYMBOL
-.. |And| unicode:: U+02A53 .. DOUBLE LOGICAL AND
-.. |and| unicode:: U+02227 .. LOGICAL AND
-.. |andand| unicode:: U+02A55 .. TWO INTERSECTING LOGICAL AND
-.. |andd| unicode:: U+02A5C .. LOGICAL AND WITH HORIZONTAL DASH
-.. |andslope| unicode:: U+02A58 .. SLOPING LARGE AND
-.. |andv| unicode:: U+02A5A .. LOGICAL AND WITH MIDDLE STEM
-.. |ang90| unicode:: U+0221F .. RIGHT ANGLE
-.. |angrt| unicode:: U+0221F .. RIGHT ANGLE
-.. |angsph| unicode:: U+02222 .. SPHERICAL ANGLE
-.. |angst| unicode:: U+0212B .. ANGSTROM SIGN
-.. |ap| unicode:: U+02248 .. ALMOST EQUAL TO
-.. |apacir| unicode:: U+02A6F .. ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
-.. |awconint| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
-.. |awint| unicode:: U+02A11 .. ANTICLOCKWISE INTEGRATION
-.. |becaus| unicode:: U+02235 .. BECAUSE
-.. |bernou| unicode:: U+0212C .. SCRIPT CAPITAL B
-.. |bne| unicode:: U+0003D U+020E5 .. EQUALS SIGN with reverse slash
-.. |bnequiv| unicode:: U+02261 U+020E5 .. IDENTICAL TO with reverse slash
-.. |bNot| unicode:: U+02AED .. REVERSED DOUBLE STROKE NOT SIGN
-.. |bnot| unicode:: U+02310 .. REVERSED NOT SIGN
-.. |bottom| unicode:: U+022A5 .. UP TACK
-.. |cap| unicode:: U+02229 .. INTERSECTION
-.. |Cconint| unicode:: U+02230 .. VOLUME INTEGRAL
-.. |cirfnint| unicode:: U+02A10 .. CIRCULATION FUNCTION
-.. |compfn| unicode:: U+02218 .. RING OPERATOR
-.. |cong| unicode:: U+02245 .. APPROXIMATELY EQUAL TO
-.. |Conint| unicode:: U+0222F .. SURFACE INTEGRAL
-.. |conint| unicode:: U+0222E .. CONTOUR INTEGRAL
-.. |ctdot| unicode:: U+022EF .. MIDLINE HORIZONTAL ELLIPSIS
-.. |cup| unicode:: U+0222A .. UNION
-.. |cwconint| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
-.. |cwint| unicode:: U+02231 .. CLOCKWISE INTEGRAL
-.. |cylcty| unicode:: U+0232D .. CYLINDRICITY
-.. |disin| unicode:: U+022F2 .. ELEMENT OF WITH LONG HORIZONTAL STROKE
-.. |Dot| unicode:: U+000A8 .. DIAERESIS
-.. |DotDot| unicode:: U+020DC .. COMBINING FOUR DOTS ABOVE
-.. |dsol| unicode:: U+029F6 .. SOLIDUS WITH OVERBAR
-.. |dtdot| unicode:: U+022F1 .. DOWN RIGHT DIAGONAL ELLIPSIS
-.. |dwangle| unicode:: U+029A6 .. OBLIQUE ANGLE OPENING UP
-.. |elinters| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
-.. |epar| unicode:: U+022D5 .. EQUAL AND PARALLEL TO
-.. |eparsl| unicode:: U+029E3 .. EQUALS SIGN AND SLANTED PARALLEL
-.. |equiv| unicode:: U+02261 .. IDENTICAL TO
-.. |eqvparsl| unicode:: U+029E5 .. IDENTICAL TO AND SLANTED PARALLEL
-.. |exist| unicode:: U+02203 .. THERE EXISTS
-.. |fltns| unicode:: U+025B1 .. WHITE PARALLELOGRAM
-.. |fnof| unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
-.. |forall| unicode:: U+02200 .. FOR ALL
-.. |fpartint| unicode:: U+02A0D .. FINITE PART INTEGRAL
-.. |ge| unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
-.. |hamilt| unicode:: U+0210B .. SCRIPT CAPITAL H
-.. |iff| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |iinfin| unicode:: U+029DC .. INCOMPLETE INFINITY
-.. |imped| unicode:: U+001B5 .. LATIN CAPITAL LETTER Z WITH STROKE
-.. |infin| unicode:: U+0221E .. INFINITY
-.. |infintie| unicode:: U+029DD .. TIE OVER INFINITY
-.. |Int| unicode:: U+0222C .. DOUBLE INTEGRAL
-.. |int| unicode:: U+0222B .. INTEGRAL
-.. |intlarhk| unicode:: U+02A17 .. INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
-.. |isin| unicode:: U+02208 .. ELEMENT OF
-.. |isindot| unicode:: U+022F5 .. ELEMENT OF WITH DOT ABOVE
-.. |isinE| unicode:: U+022F9 .. ELEMENT OF WITH TWO HORIZONTAL STROKES
-.. |isins| unicode:: U+022F4 .. SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
-.. |isinsv| unicode:: U+022F3 .. ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
-.. |isinv| unicode:: U+02208 .. ELEMENT OF
-.. |lagran| unicode:: U+02112 .. SCRIPT CAPITAL L
-.. |Lang| unicode:: U+0300A .. LEFT DOUBLE ANGLE BRACKET
-.. |lang| unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
-.. |lArr| unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
-.. |lbbrk| unicode:: U+03014 .. LEFT TORTOISE SHELL BRACKET
-.. |le| unicode:: U+02264 .. LESS-THAN OR EQUAL TO
-.. |loang| unicode:: U+03018 .. LEFT WHITE TORTOISE SHELL BRACKET
-.. |lobrk| unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
-.. |lopar| unicode:: U+02985 .. LEFT WHITE PARENTHESIS
-.. |lowast| unicode:: U+02217 .. ASTERISK OPERATOR
-.. |minus| unicode:: U+02212 .. MINUS SIGN
-.. |mnplus| unicode:: U+02213 .. MINUS-OR-PLUS SIGN
-.. |nabla| unicode:: U+02207 .. NABLA
-.. |ne| unicode:: U+02260 .. NOT EQUAL TO
-.. |nedot| unicode:: U+02250 U+00338 .. APPROACHES THE LIMIT with slash
-.. |nhpar| unicode:: U+02AF2 .. PARALLEL WITH HORIZONTAL STROKE
-.. |ni| unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |nis| unicode:: U+022FC .. SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
-.. |nisd| unicode:: U+022FA .. CONTAINS WITH LONG HORIZONTAL STROKE
-.. |niv| unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |Not| unicode:: U+02AEC .. DOUBLE STROKE NOT SIGN
-.. |notin| unicode:: U+02209 .. NOT AN ELEMENT OF
-.. |notindot| unicode:: U+022F5 U+00338 .. ELEMENT OF WITH DOT ABOVE with slash
-.. |notinE| unicode:: U+022F9 U+00338 .. ELEMENT OF WITH TWO HORIZONTAL STROKES with slash
-.. |notinva| unicode:: U+02209 .. NOT AN ELEMENT OF
-.. |notinvb| unicode:: U+022F7 .. SMALL ELEMENT OF WITH OVERBAR
-.. |notinvc| unicode:: U+022F6 .. ELEMENT OF WITH OVERBAR
-.. |notni| unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
-.. |notniva| unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
-.. |notnivb| unicode:: U+022FE .. SMALL CONTAINS WITH OVERBAR
-.. |notnivc| unicode:: U+022FD .. CONTAINS WITH OVERBAR
-.. |nparsl| unicode:: U+02AFD U+020E5 .. DOUBLE SOLIDUS OPERATOR with reverse slash
-.. |npart| unicode:: U+02202 U+00338 .. PARTIAL DIFFERENTIAL with slash
-.. |npolint| unicode:: U+02A14 .. LINE INTEGRATION NOT INCLUDING THE POLE
-.. |nvinfin| unicode:: U+029DE .. INFINITY NEGATED WITH VERTICAL BAR
-.. |olcross| unicode:: U+029BB .. CIRCLE WITH SUPERIMPOSED X
-.. |Or| unicode:: U+02A54 .. DOUBLE LOGICAL OR
-.. |or| unicode:: U+02228 .. LOGICAL OR
-.. |ord| unicode:: U+02A5D .. LOGICAL OR WITH HORIZONTAL DASH
-.. |order| unicode:: U+02134 .. SCRIPT SMALL O
-.. |oror| unicode:: U+02A56 .. TWO INTERSECTING LOGICAL OR
-.. |orslope| unicode:: U+02A57 .. SLOPING LARGE OR
-.. |orv| unicode:: U+02A5B .. LOGICAL OR WITH MIDDLE STEM
-.. |par| unicode:: U+02225 .. PARALLEL TO
-.. |parsl| unicode:: U+02AFD .. DOUBLE SOLIDUS OPERATOR
-.. |part| unicode:: U+02202 .. PARTIAL DIFFERENTIAL
-.. |permil| unicode:: U+02030 .. PER MILLE SIGN
-.. |perp| unicode:: U+022A5 .. UP TACK
-.. |pertenk| unicode:: U+02031 .. PER TEN THOUSAND SIGN
-.. |phmmat| unicode:: U+02133 .. SCRIPT CAPITAL M
-.. |pointint| unicode:: U+02A15 .. INTEGRAL AROUND A POINT OPERATOR
-.. |Prime| unicode:: U+02033 .. DOUBLE PRIME
-.. |prime| unicode:: U+02032 .. PRIME
-.. |profalar| unicode:: U+0232E .. ALL AROUND-PROFILE
-.. |profline| unicode:: U+02312 .. ARC
-.. |profsurf| unicode:: U+02313 .. SEGMENT
-.. |prop| unicode:: U+0221D .. PROPORTIONAL TO
-.. |qint| unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
-.. |qprime| unicode:: U+02057 .. QUADRUPLE PRIME
-.. |quatint| unicode:: U+02A16 .. QUATERNION INTEGRAL OPERATOR
-.. |radic| unicode:: U+0221A .. SQUARE ROOT
-.. |Rang| unicode:: U+0300B .. RIGHT DOUBLE ANGLE BRACKET
-.. |rang| unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
-.. |rArr| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |rbbrk| unicode:: U+03015 .. RIGHT TORTOISE SHELL BRACKET
-.. |roang| unicode:: U+03019 .. RIGHT WHITE TORTOISE SHELL BRACKET
-.. |robrk| unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
-.. |ropar| unicode:: U+02986 .. RIGHT WHITE PARENTHESIS
-.. |rppolint| unicode:: U+02A12 .. LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
-.. |scpolint| unicode:: U+02A13 .. LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
-.. |sim| unicode:: U+0223C .. TILDE OPERATOR
-.. |simdot| unicode:: U+02A6A .. TILDE OPERATOR WITH DOT ABOVE
-.. |sime| unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
-.. |smeparsl| unicode:: U+029E4 .. EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
-.. |square| unicode:: U+025A1 .. WHITE SQUARE
-.. |squarf| unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |strns| unicode:: U+000AF .. MACRON
-.. |sub| unicode:: U+02282 .. SUBSET OF
-.. |sube| unicode:: U+02286 .. SUBSET OF OR EQUAL TO
-.. |sup| unicode:: U+02283 .. SUPERSET OF
-.. |supe| unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
-.. |tdot| unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
-.. |there4| unicode:: U+02234 .. THEREFORE
-.. |tint| unicode:: U+0222D .. TRIPLE INTEGRAL
-.. |top| unicode:: U+022A4 .. DOWN TACK
-.. |topbot| unicode:: U+02336 .. APL FUNCTIONAL SYMBOL I-BEAM
-.. |topcir| unicode:: U+02AF1 .. DOWN TACK WITH CIRCLE BELOW
-.. |tprime| unicode:: U+02034 .. TRIPLE PRIME
-.. |utdot| unicode:: U+022F0 .. UP RIGHT DIAGONAL ELLIPSIS
-.. |uwangle| unicode:: U+029A7 .. OBLIQUE ANGLE OPENING DOWN
-.. |vangrt| unicode:: U+0299C .. RIGHT ANGLE VARIANT WITH SQUARE
-.. |veeeq| unicode:: U+0225A .. EQUIANGULAR TO
-.. |Verbar| unicode:: U+02016 .. DOUBLE VERTICAL LINE
-.. |wedgeq| unicode:: U+02259 .. ESTIMATES
-.. |xnis| unicode:: U+022FB .. CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/mmlalias.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/mmlalias.txt
deleted file mode 100644
index 49c23ca7d..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/mmlalias.txt
+++ /dev/null
@@ -1,554 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |angle| unicode:: U+02220 .. ANGLE
-.. |ApplyFunction| unicode:: U+02061 .. FUNCTION APPLICATION
-.. |approx| unicode:: U+02248 .. ALMOST EQUAL TO
-.. |approxeq| unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
-.. |Assign| unicode:: U+02254 .. COLON EQUALS
-.. |backcong| unicode:: U+0224C .. ALL EQUAL TO
-.. |backepsilon| unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
-.. |backprime| unicode:: U+02035 .. REVERSED PRIME
-.. |backsim| unicode:: U+0223D .. REVERSED TILDE
-.. |backsimeq| unicode:: U+022CD .. REVERSED TILDE EQUALS
-.. |Backslash| unicode:: U+02216 .. SET MINUS
-.. |barwedge| unicode:: U+02305 .. PROJECTIVE
-.. |Because| unicode:: U+02235 .. BECAUSE
-.. |because| unicode:: U+02235 .. BECAUSE
-.. |Bernoullis| unicode:: U+0212C .. SCRIPT CAPITAL B
-.. |between| unicode:: U+0226C .. BETWEEN
-.. |bigcap| unicode:: U+022C2 .. N-ARY INTERSECTION
-.. |bigcirc| unicode:: U+025EF .. LARGE CIRCLE
-.. |bigcup| unicode:: U+022C3 .. N-ARY UNION
-.. |bigodot| unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
-.. |bigoplus| unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
-.. |bigotimes| unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
-.. |bigsqcup| unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
-.. |bigstar| unicode:: U+02605 .. BLACK STAR
-.. |bigtriangledown| unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
-.. |bigtriangleup| unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
-.. |biguplus| unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
-.. |bigvee| unicode:: U+022C1 .. N-ARY LOGICAL OR
-.. |bigwedge| unicode:: U+022C0 .. N-ARY LOGICAL AND
-.. |bkarow| unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
-.. |blacklozenge| unicode:: U+029EB .. BLACK LOZENGE
-.. |blacksquare| unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |blacktriangle| unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
-.. |blacktriangledown| unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
-.. |blacktriangleleft| unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
-.. |blacktriangleright| unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
-.. |bot| unicode:: U+022A5 .. UP TACK
-.. |boxminus| unicode:: U+0229F .. SQUARED MINUS
-.. |boxplus| unicode:: U+0229E .. SQUARED PLUS
-.. |boxtimes| unicode:: U+022A0 .. SQUARED TIMES
-.. |Breve| unicode:: U+002D8 .. BREVE
-.. |bullet| unicode:: U+02022 .. BULLET
-.. |Bumpeq| unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
-.. |bumpeq| unicode:: U+0224F .. DIFFERENCE BETWEEN
-.. |CapitalDifferentialD| unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
-.. |Cayleys| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
-.. |Cedilla| unicode:: U+000B8 .. CEDILLA
-.. |CenterDot| unicode:: U+000B7 .. MIDDLE DOT
-.. |centerdot| unicode:: U+000B7 .. MIDDLE DOT
-.. |checkmark| unicode:: U+02713 .. CHECK MARK
-.. |circeq| unicode:: U+02257 .. RING EQUAL TO
-.. |circlearrowleft| unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
-.. |circlearrowright| unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
-.. |circledast| unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
-.. |circledcirc| unicode:: U+0229A .. CIRCLED RING OPERATOR
-.. |circleddash| unicode:: U+0229D .. CIRCLED DASH
-.. |CircleDot| unicode:: U+02299 .. CIRCLED DOT OPERATOR
-.. |circledR| unicode:: U+000AE .. REGISTERED SIGN
-.. |circledS| unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
-.. |CircleMinus| unicode:: U+02296 .. CIRCLED MINUS
-.. |CirclePlus| unicode:: U+02295 .. CIRCLED PLUS
-.. |CircleTimes| unicode:: U+02297 .. CIRCLED TIMES
-.. |ClockwiseContourIntegral| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
-.. |CloseCurlyDoubleQuote| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
-.. |CloseCurlyQuote| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
-.. |clubsuit| unicode:: U+02663 .. BLACK CLUB SUIT
-.. |coloneq| unicode:: U+02254 .. COLON EQUALS
-.. |complement| unicode:: U+02201 .. COMPLEMENT
-.. |complexes| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
-.. |Congruent| unicode:: U+02261 .. IDENTICAL TO
-.. |ContourIntegral| unicode:: U+0222E .. CONTOUR INTEGRAL
-.. |Coproduct| unicode:: U+02210 .. N-ARY COPRODUCT
-.. |CounterClockwiseContourIntegral| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
-.. |CupCap| unicode:: U+0224D .. EQUIVALENT TO
-.. |curlyeqprec| unicode:: U+022DE .. EQUAL TO OR PRECEDES
-.. |curlyeqsucc| unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
-.. |curlyvee| unicode:: U+022CE .. CURLY LOGICAL OR
-.. |curlywedge| unicode:: U+022CF .. CURLY LOGICAL AND
-.. |curvearrowleft| unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
-.. |curvearrowright| unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
-.. |dbkarow| unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
-.. |ddagger| unicode:: U+02021 .. DOUBLE DAGGER
-.. |ddotseq| unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
-.. |Del| unicode:: U+02207 .. NABLA
-.. |DiacriticalAcute| unicode:: U+000B4 .. ACUTE ACCENT
-.. |DiacriticalDot| unicode:: U+002D9 .. DOT ABOVE
-.. |DiacriticalDoubleAcute| unicode:: U+002DD .. DOUBLE ACUTE ACCENT
-.. |DiacriticalGrave| unicode:: U+00060 .. GRAVE ACCENT
-.. |DiacriticalTilde| unicode:: U+002DC .. SMALL TILDE
-.. |Diamond| unicode:: U+022C4 .. DIAMOND OPERATOR
-.. |diamond| unicode:: U+022C4 .. DIAMOND OPERATOR
-.. |diamondsuit| unicode:: U+02666 .. BLACK DIAMOND SUIT
-.. |DifferentialD| unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
-.. |digamma| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
-.. |div| unicode:: U+000F7 .. DIVISION SIGN
-.. |divideontimes| unicode:: U+022C7 .. DIVISION TIMES
-.. |doteq| unicode:: U+02250 .. APPROACHES THE LIMIT
-.. |doteqdot| unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
-.. |DotEqual| unicode:: U+02250 .. APPROACHES THE LIMIT
-.. |dotminus| unicode:: U+02238 .. DOT MINUS
-.. |dotplus| unicode:: U+02214 .. DOT PLUS
-.. |dotsquare| unicode:: U+022A1 .. SQUARED DOT OPERATOR
-.. |doublebarwedge| unicode:: U+02306 .. PERSPECTIVE
-.. |DoubleContourIntegral| unicode:: U+0222F .. SURFACE INTEGRAL
-.. |DoubleDot| unicode:: U+000A8 .. DIAERESIS
-.. |DoubleDownArrow| unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
-.. |DoubleLeftArrow| unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
-.. |DoubleLeftRightArrow| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |DoubleLeftTee| unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
-.. |DoubleLongLeftArrow| unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
-.. |DoubleLongLeftRightArrow| unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
-.. |DoubleLongRightArrow| unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
-.. |DoubleRightArrow| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |DoubleRightTee| unicode:: U+022A8 .. TRUE
-.. |DoubleUpArrow| unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
-.. |DoubleUpDownArrow| unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
-.. |DoubleVerticalBar| unicode:: U+02225 .. PARALLEL TO
-.. |DownArrow| unicode:: U+02193 .. DOWNWARDS ARROW
-.. |Downarrow| unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
-.. |downarrow| unicode:: U+02193 .. DOWNWARDS ARROW
-.. |DownArrowUpArrow| unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
-.. |downdownarrows| unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
-.. |downharpoonleft| unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
-.. |downharpoonright| unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
-.. |DownLeftVector| unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
-.. |DownRightVector| unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
-.. |DownTee| unicode:: U+022A4 .. DOWN TACK
-.. |DownTeeArrow| unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
-.. |drbkarow| unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
-.. |Element| unicode:: U+02208 .. ELEMENT OF
-.. |emptyset| unicode:: U+02205 .. EMPTY SET
-.. |eqcirc| unicode:: U+02256 .. RING IN EQUAL TO
-.. |eqcolon| unicode:: U+02255 .. EQUALS COLON
-.. |eqsim| unicode:: U+02242 .. MINUS TILDE
-.. |eqslantgtr| unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
-.. |eqslantless| unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
-.. |EqualTilde| unicode:: U+02242 .. MINUS TILDE
-.. |Equilibrium| unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
-.. |Exists| unicode:: U+02203 .. THERE EXISTS
-.. |expectation| unicode:: U+02130 .. SCRIPT CAPITAL E
-.. |ExponentialE| unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
-.. |exponentiale| unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
-.. |fallingdotseq| unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
-.. |ForAll| unicode:: U+02200 .. FOR ALL
-.. |Fouriertrf| unicode:: U+02131 .. SCRIPT CAPITAL F
-.. |geq| unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
-.. |geqq| unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
-.. |geqslant| unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
-.. |gg| unicode:: U+0226B .. MUCH GREATER-THAN
-.. |ggg| unicode:: U+022D9 .. VERY MUCH GREATER-THAN
-.. |gnapprox| unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
-.. |gneq| unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
-.. |gneqq| unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
-.. |GreaterEqual| unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
-.. |GreaterEqualLess| unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
-.. |GreaterFullEqual| unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
-.. |GreaterLess| unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
-.. |GreaterSlantEqual| unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
-.. |GreaterTilde| unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
-.. |gtrapprox| unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
-.. |gtrdot| unicode:: U+022D7 .. GREATER-THAN WITH DOT
-.. |gtreqless| unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
-.. |gtreqqless| unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
-.. |gtrless| unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
-.. |gtrsim| unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
-.. |gvertneqq| unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
-.. |Hacek| unicode:: U+002C7 .. CARON
-.. |hbar| unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
-.. |heartsuit| unicode:: U+02665 .. BLACK HEART SUIT
-.. |HilbertSpace| unicode:: U+0210B .. SCRIPT CAPITAL H
-.. |hksearow| unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
-.. |hkswarow| unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
-.. |hookleftarrow| unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
-.. |hookrightarrow| unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
-.. |hslash| unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
-.. |HumpDownHump| unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
-.. |HumpEqual| unicode:: U+0224F .. DIFFERENCE BETWEEN
-.. |iiiint| unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
-.. |iiint| unicode:: U+0222D .. TRIPLE INTEGRAL
-.. |Im| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |ImaginaryI| unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
-.. |imagline| unicode:: U+02110 .. SCRIPT CAPITAL I
-.. |imagpart| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |Implies| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |in| unicode:: U+02208 .. ELEMENT OF
-.. |integers| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
-.. |Integral| unicode:: U+0222B .. INTEGRAL
-.. |intercal| unicode:: U+022BA .. INTERCALATE
-.. |Intersection| unicode:: U+022C2 .. N-ARY INTERSECTION
-.. |intprod| unicode:: U+02A3C .. INTERIOR PRODUCT
-.. |InvisibleComma| unicode:: U+02063 .. INVISIBLE SEPARATOR
-.. |InvisibleTimes| unicode:: U+02062 .. INVISIBLE TIMES
-.. |langle| unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
-.. |Laplacetrf| unicode:: U+02112 .. SCRIPT CAPITAL L
-.. |lbrace| unicode:: U+0007B .. LEFT CURLY BRACKET
-.. |lbrack| unicode:: U+0005B .. LEFT SQUARE BRACKET
-.. |LeftAngleBracket| unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
-.. |LeftArrow| unicode:: U+02190 .. LEFTWARDS ARROW
-.. |Leftarrow| unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
-.. |leftarrow| unicode:: U+02190 .. LEFTWARDS ARROW
-.. |LeftArrowBar| unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
-.. |LeftArrowRightArrow| unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
-.. |leftarrowtail| unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
-.. |LeftCeiling| unicode:: U+02308 .. LEFT CEILING
-.. |LeftDoubleBracket| unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
-.. |LeftDownVector| unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
-.. |LeftFloor| unicode:: U+0230A .. LEFT FLOOR
-.. |leftharpoondown| unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
-.. |leftharpoonup| unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
-.. |leftleftarrows| unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
-.. |LeftRightArrow| unicode:: U+02194 .. LEFT RIGHT ARROW
-.. |Leftrightarrow| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |leftrightarrow| unicode:: U+02194 .. LEFT RIGHT ARROW
-.. |leftrightarrows| unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
-.. |leftrightharpoons| unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
-.. |leftrightsquigarrow| unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
-.. |LeftTee| unicode:: U+022A3 .. LEFT TACK
-.. |LeftTeeArrow| unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
-.. |leftthreetimes| unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
-.. |LeftTriangle| unicode:: U+022B2 .. NORMAL SUBGROUP OF
-.. |LeftTriangleEqual| unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
-.. |LeftUpVector| unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
-.. |LeftVector| unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
-.. |leq| unicode:: U+02264 .. LESS-THAN OR EQUAL TO
-.. |leqq| unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
-.. |leqslant| unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
-.. |lessapprox| unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
-.. |lessdot| unicode:: U+022D6 .. LESS-THAN WITH DOT
-.. |lesseqgtr| unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
-.. |lesseqqgtr| unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
-.. |LessEqualGreater| unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
-.. |LessFullEqual| unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
-.. |LessGreater| unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
-.. |lessgtr| unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
-.. |lesssim| unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
-.. |LessSlantEqual| unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
-.. |LessTilde| unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
-.. |ll| unicode:: U+0226A .. MUCH LESS-THAN
-.. |llcorner| unicode:: U+0231E .. BOTTOM LEFT CORNER
-.. |Lleftarrow| unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
-.. |lmoustache| unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
-.. |lnapprox| unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
-.. |lneq| unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
-.. |lneqq| unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
-.. |LongLeftArrow| unicode:: U+027F5 .. LONG LEFTWARDS ARROW
-.. |Longleftarrow| unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
-.. |longleftarrow| unicode:: U+027F5 .. LONG LEFTWARDS ARROW
-.. |LongLeftRightArrow| unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
-.. |Longleftrightarrow| unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
-.. |longleftrightarrow| unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
-.. |longmapsto| unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
-.. |LongRightArrow| unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
-.. |Longrightarrow| unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
-.. |longrightarrow| unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
-.. |looparrowleft| unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
-.. |looparrowright| unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
-.. |LowerLeftArrow| unicode:: U+02199 .. SOUTH WEST ARROW
-.. |LowerRightArrow| unicode:: U+02198 .. SOUTH EAST ARROW
-.. |lozenge| unicode:: U+025CA .. LOZENGE
-.. |lrcorner| unicode:: U+0231F .. BOTTOM RIGHT CORNER
-.. |Lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
-.. |lvertneqq| unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
-.. |maltese| unicode:: U+02720 .. MALTESE CROSS
-.. |mapsto| unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
-.. |measuredangle| unicode:: U+02221 .. MEASURED ANGLE
-.. |Mellintrf| unicode:: U+02133 .. SCRIPT CAPITAL M
-.. |MinusPlus| unicode:: U+02213 .. MINUS-OR-PLUS SIGN
-.. |mp| unicode:: U+02213 .. MINUS-OR-PLUS SIGN
-.. |multimap| unicode:: U+022B8 .. MULTIMAP
-.. |napprox| unicode:: U+02249 .. NOT ALMOST EQUAL TO
-.. |natural| unicode:: U+0266E .. MUSIC NATURAL SIGN
-.. |naturals| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
-.. |nearrow| unicode:: U+02197 .. NORTH EAST ARROW
-.. |NegativeMediumSpace| unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |NegativeThickSpace| unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |NegativeThinSpace| unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |NegativeVeryThinSpace| unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |NestedGreaterGreater| unicode:: U+0226B .. MUCH GREATER-THAN
-.. |NestedLessLess| unicode:: U+0226A .. MUCH LESS-THAN
-.. |nexists| unicode:: U+02204 .. THERE DOES NOT EXIST
-.. |ngeq| unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
-.. |ngeqq| unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
-.. |ngeqslant| unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
-.. |ngtr| unicode:: U+0226F .. NOT GREATER-THAN
-.. |nLeftarrow| unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
-.. |nleftarrow| unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
-.. |nLeftrightarrow| unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
-.. |nleftrightarrow| unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
-.. |nleq| unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
-.. |nleqq| unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
-.. |nleqslant| unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
-.. |nless| unicode:: U+0226E .. NOT LESS-THAN
-.. |NonBreakingSpace| unicode:: U+000A0 .. NO-BREAK SPACE
-.. |NotCongruent| unicode:: U+02262 .. NOT IDENTICAL TO
-.. |NotDoubleVerticalBar| unicode:: U+02226 .. NOT PARALLEL TO
-.. |NotElement| unicode:: U+02209 .. NOT AN ELEMENT OF
-.. |NotEqual| unicode:: U+02260 .. NOT EQUAL TO
-.. |NotEqualTilde| unicode:: U+02242 U+00338 .. MINUS TILDE with slash
-.. |NotExists| unicode:: U+02204 .. THERE DOES NOT EXIST
-.. |NotGreater| unicode:: U+0226F .. NOT GREATER-THAN
-.. |NotGreaterEqual| unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
-.. |NotGreaterFullEqual| unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
-.. |NotGreaterGreater| unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
-.. |NotGreaterLess| unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
-.. |NotGreaterSlantEqual| unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
-.. |NotGreaterTilde| unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
-.. |NotHumpDownHump| unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
-.. |NotLeftTriangle| unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
-.. |NotLeftTriangleEqual| unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
-.. |NotLess| unicode:: U+0226E .. NOT LESS-THAN
-.. |NotLessEqual| unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
-.. |NotLessGreater| unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
-.. |NotLessLess| unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
-.. |NotLessSlantEqual| unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
-.. |NotLessTilde| unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
-.. |NotPrecedes| unicode:: U+02280 .. DOES NOT PRECEDE
-.. |NotPrecedesEqual| unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |NotPrecedesSlantEqual| unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
-.. |NotReverseElement| unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
-.. |NotRightTriangle| unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
-.. |NotRightTriangleEqual| unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
-.. |NotSquareSubsetEqual| unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
-.. |NotSquareSupersetEqual| unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
-.. |NotSubset| unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
-.. |NotSubsetEqual| unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
-.. |NotSucceeds| unicode:: U+02281 .. DOES NOT SUCCEED
-.. |NotSucceedsEqual| unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |NotSucceedsSlantEqual| unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
-.. |NotSuperset| unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
-.. |NotSupersetEqual| unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
-.. |NotTilde| unicode:: U+02241 .. NOT TILDE
-.. |NotTildeEqual| unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
-.. |NotTildeFullEqual| unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
-.. |NotTildeTilde| unicode:: U+02249 .. NOT ALMOST EQUAL TO
-.. |NotVerticalBar| unicode:: U+02224 .. DOES NOT DIVIDE
-.. |nparallel| unicode:: U+02226 .. NOT PARALLEL TO
-.. |nprec| unicode:: U+02280 .. DOES NOT PRECEDE
-.. |npreceq| unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |nRightarrow| unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
-.. |nrightarrow| unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
-.. |nshortmid| unicode:: U+02224 .. DOES NOT DIVIDE
-.. |nshortparallel| unicode:: U+02226 .. NOT PARALLEL TO
-.. |nsimeq| unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
-.. |nsubset| unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
-.. |nsubseteq| unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
-.. |nsubseteqq| unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
-.. |nsucc| unicode:: U+02281 .. DOES NOT SUCCEED
-.. |nsucceq| unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |nsupset| unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
-.. |nsupseteq| unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
-.. |nsupseteqq| unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
-.. |ntriangleleft| unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
-.. |ntrianglelefteq| unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
-.. |ntriangleright| unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
-.. |ntrianglerighteq| unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
-.. |nwarrow| unicode:: U+02196 .. NORTH WEST ARROW
-.. |oint| unicode:: U+0222E .. CONTOUR INTEGRAL
-.. |OpenCurlyDoubleQuote| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
-.. |OpenCurlyQuote| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
-.. |orderof| unicode:: U+02134 .. SCRIPT SMALL O
-.. |parallel| unicode:: U+02225 .. PARALLEL TO
-.. |PartialD| unicode:: U+02202 .. PARTIAL DIFFERENTIAL
-.. |pitchfork| unicode:: U+022D4 .. PITCHFORK
-.. |PlusMinus| unicode:: U+000B1 .. PLUS-MINUS SIGN
-.. |pm| unicode:: U+000B1 .. PLUS-MINUS SIGN
-.. |Poincareplane| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
-.. |prec| unicode:: U+0227A .. PRECEDES
-.. |precapprox| unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
-.. |preccurlyeq| unicode:: U+0227C .. PRECEDES OR EQUAL TO
-.. |Precedes| unicode:: U+0227A .. PRECEDES
-.. |PrecedesEqual| unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
-.. |PrecedesSlantEqual| unicode:: U+0227C .. PRECEDES OR EQUAL TO
-.. |PrecedesTilde| unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
-.. |preceq| unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
-.. |precnapprox| unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
-.. |precneqq| unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
-.. |precnsim| unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
-.. |precsim| unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
-.. |primes| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
-.. |Proportion| unicode:: U+02237 .. PROPORTION
-.. |Proportional| unicode:: U+0221D .. PROPORTIONAL TO
-.. |propto| unicode:: U+0221D .. PROPORTIONAL TO
-.. |quaternions| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
-.. |questeq| unicode:: U+0225F .. QUESTIONED EQUAL TO
-.. |rangle| unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
-.. |rationals| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
-.. |rbrace| unicode:: U+0007D .. RIGHT CURLY BRACKET
-.. |rbrack| unicode:: U+0005D .. RIGHT SQUARE BRACKET
-.. |Re| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |realine| unicode:: U+0211B .. SCRIPT CAPITAL R
-.. |realpart| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |reals| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
-.. |ReverseElement| unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |ReverseEquilibrium| unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
-.. |ReverseUpEquilibrium| unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
-.. |RightAngleBracket| unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
-.. |RightArrow| unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |Rightarrow| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |rightarrow| unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |RightArrowBar| unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
-.. |RightArrowLeftArrow| unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
-.. |rightarrowtail| unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
-.. |RightCeiling| unicode:: U+02309 .. RIGHT CEILING
-.. |RightDoubleBracket| unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
-.. |RightDownVector| unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
-.. |RightFloor| unicode:: U+0230B .. RIGHT FLOOR
-.. |rightharpoondown| unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
-.. |rightharpoonup| unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
-.. |rightleftarrows| unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
-.. |rightleftharpoons| unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
-.. |rightrightarrows| unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
-.. |rightsquigarrow| unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
-.. |RightTee| unicode:: U+022A2 .. RIGHT TACK
-.. |RightTeeArrow| unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
-.. |rightthreetimes| unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
-.. |RightTriangle| unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
-.. |RightTriangleEqual| unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
-.. |RightUpVector| unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
-.. |RightVector| unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
-.. |risingdotseq| unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
-.. |rmoustache| unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
-.. |Rrightarrow| unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
-.. |Rsh| unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
-.. |searrow| unicode:: U+02198 .. SOUTH EAST ARROW
-.. |setminus| unicode:: U+02216 .. SET MINUS
-.. |ShortDownArrow| unicode:: U+02193 .. DOWNWARDS ARROW
-.. |ShortLeftArrow| unicode:: U+02190 .. LEFTWARDS ARROW
-.. |shortmid| unicode:: U+02223 .. DIVIDES
-.. |shortparallel| unicode:: U+02225 .. PARALLEL TO
-.. |ShortRightArrow| unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |ShortUpArrow| unicode:: U+02191 .. UPWARDS ARROW
-.. |simeq| unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
-.. |SmallCircle| unicode:: U+02218 .. RING OPERATOR
-.. |smallsetminus| unicode:: U+02216 .. SET MINUS
-.. |spadesuit| unicode:: U+02660 .. BLACK SPADE SUIT
-.. |Sqrt| unicode:: U+0221A .. SQUARE ROOT
-.. |sqsubset| unicode:: U+0228F .. SQUARE IMAGE OF
-.. |sqsubseteq| unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
-.. |sqsupset| unicode:: U+02290 .. SQUARE ORIGINAL OF
-.. |sqsupseteq| unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
-.. |Square| unicode:: U+025A1 .. WHITE SQUARE
-.. |SquareIntersection| unicode:: U+02293 .. SQUARE CAP
-.. |SquareSubset| unicode:: U+0228F .. SQUARE IMAGE OF
-.. |SquareSubsetEqual| unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
-.. |SquareSuperset| unicode:: U+02290 .. SQUARE ORIGINAL OF
-.. |SquareSupersetEqual| unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
-.. |SquareUnion| unicode:: U+02294 .. SQUARE CUP
-.. |Star| unicode:: U+022C6 .. STAR OPERATOR
-.. |straightepsilon| unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
-.. |straightphi| unicode:: U+003D5 .. GREEK PHI SYMBOL
-.. |Subset| unicode:: U+022D0 .. DOUBLE SUBSET
-.. |subset| unicode:: U+02282 .. SUBSET OF
-.. |subseteq| unicode:: U+02286 .. SUBSET OF OR EQUAL TO
-.. |subseteqq| unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
-.. |SubsetEqual| unicode:: U+02286 .. SUBSET OF OR EQUAL TO
-.. |subsetneq| unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
-.. |subsetneqq| unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
-.. |succ| unicode:: U+0227B .. SUCCEEDS
-.. |succapprox| unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
-.. |succcurlyeq| unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
-.. |Succeeds| unicode:: U+0227B .. SUCCEEDS
-.. |SucceedsEqual| unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
-.. |SucceedsSlantEqual| unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
-.. |SucceedsTilde| unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
-.. |succeq| unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
-.. |succnapprox| unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
-.. |succneqq| unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
-.. |succnsim| unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
-.. |succsim| unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
-.. |SuchThat| unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |Sum| unicode:: U+02211 .. N-ARY SUMMATION
-.. |Superset| unicode:: U+02283 .. SUPERSET OF
-.. |SupersetEqual| unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
-.. |Supset| unicode:: U+022D1 .. DOUBLE SUPERSET
-.. |supset| unicode:: U+02283 .. SUPERSET OF
-.. |supseteq| unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
-.. |supseteqq| unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
-.. |supsetneq| unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
-.. |supsetneqq| unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
-.. |swarrow| unicode:: U+02199 .. SOUTH WEST ARROW
-.. |Therefore| unicode:: U+02234 .. THEREFORE
-.. |therefore| unicode:: U+02234 .. THEREFORE
-.. |thickapprox| unicode:: U+02248 .. ALMOST EQUAL TO
-.. |thicksim| unicode:: U+0223C .. TILDE OPERATOR
-.. |ThinSpace| unicode:: U+02009 .. THIN SPACE
-.. |Tilde| unicode:: U+0223C .. TILDE OPERATOR
-.. |TildeEqual| unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
-.. |TildeFullEqual| unicode:: U+02245 .. APPROXIMATELY EQUAL TO
-.. |TildeTilde| unicode:: U+02248 .. ALMOST EQUAL TO
-.. |toea| unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
-.. |tosa| unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
-.. |triangle| unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
-.. |triangledown| unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
-.. |triangleleft| unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
-.. |trianglelefteq| unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
-.. |triangleq| unicode:: U+0225C .. DELTA EQUAL TO
-.. |triangleright| unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
-.. |trianglerighteq| unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
-.. |TripleDot| unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
-.. |twoheadleftarrow| unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
-.. |twoheadrightarrow| unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
-.. |ulcorner| unicode:: U+0231C .. TOP LEFT CORNER
-.. |Union| unicode:: U+022C3 .. N-ARY UNION
-.. |UnionPlus| unicode:: U+0228E .. MULTISET UNION
-.. |UpArrow| unicode:: U+02191 .. UPWARDS ARROW
-.. |Uparrow| unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
-.. |uparrow| unicode:: U+02191 .. UPWARDS ARROW
-.. |UpArrowDownArrow| unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
-.. |UpDownArrow| unicode:: U+02195 .. UP DOWN ARROW
-.. |Updownarrow| unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
-.. |updownarrow| unicode:: U+02195 .. UP DOWN ARROW
-.. |UpEquilibrium| unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
-.. |upharpoonleft| unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
-.. |upharpoonright| unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
-.. |UpperLeftArrow| unicode:: U+02196 .. NORTH WEST ARROW
-.. |UpperRightArrow| unicode:: U+02197 .. NORTH EAST ARROW
-.. |upsilon| unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
-.. |UpTee| unicode:: U+022A5 .. UP TACK
-.. |UpTeeArrow| unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
-.. |upuparrows| unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
-.. |urcorner| unicode:: U+0231D .. TOP RIGHT CORNER
-.. |varepsilon| unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
-.. |varkappa| unicode:: U+003F0 .. GREEK KAPPA SYMBOL
-.. |varnothing| unicode:: U+02205 .. EMPTY SET
-.. |varphi| unicode:: U+003C6 .. GREEK SMALL LETTER PHI
-.. |varpi| unicode:: U+003D6 .. GREEK PI SYMBOL
-.. |varpropto| unicode:: U+0221D .. PROPORTIONAL TO
-.. |varrho| unicode:: U+003F1 .. GREEK RHO SYMBOL
-.. |varsigma| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
-.. |varsubsetneq| unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
-.. |varsubsetneqq| unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
-.. |varsupsetneq| unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
-.. |varsupsetneqq| unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
-.. |vartheta| unicode:: U+003D1 .. GREEK THETA SYMBOL
-.. |vartriangleleft| unicode:: U+022B2 .. NORMAL SUBGROUP OF
-.. |vartriangleright| unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
-.. |Vee| unicode:: U+022C1 .. N-ARY LOGICAL OR
-.. |vee| unicode:: U+02228 .. LOGICAL OR
-.. |Vert| unicode:: U+02016 .. DOUBLE VERTICAL LINE
-.. |vert| unicode:: U+0007C .. VERTICAL LINE
-.. |VerticalBar| unicode:: U+02223 .. DIVIDES
-.. |VerticalTilde| unicode:: U+02240 .. WREATH PRODUCT
-.. |VeryThinSpace| unicode:: U+0200A .. HAIR SPACE
-.. |Wedge| unicode:: U+022C0 .. N-ARY LOGICAL AND
-.. |wedge| unicode:: U+02227 .. LOGICAL AND
-.. |wp| unicode:: U+02118 .. SCRIPT CAPITAL P
-.. |wr| unicode:: U+02240 .. WREATH PRODUCT
-.. |zeetrf| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt
deleted file mode 100644
index f45fc8cbe..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt
+++ /dev/null
@@ -1,113 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |af| unicode:: U+02061 .. FUNCTION APPLICATION
-.. |aopf| unicode:: U+1D552 .. MATHEMATICAL DOUBLE-STRUCK SMALL A
-.. |asympeq| unicode:: U+0224D .. EQUIVALENT TO
-.. |bopf| unicode:: U+1D553 .. MATHEMATICAL DOUBLE-STRUCK SMALL B
-.. |copf| unicode:: U+1D554 .. MATHEMATICAL DOUBLE-STRUCK SMALL C
-.. |Cross| unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
-.. |DD| unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
-.. |dd| unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
-.. |dopf| unicode:: U+1D555 .. MATHEMATICAL DOUBLE-STRUCK SMALL D
-.. |DownArrowBar| unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
-.. |DownBreve| unicode:: U+00311 .. COMBINING INVERTED BREVE
-.. |DownLeftRightVector| unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
-.. |DownLeftTeeVector| unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
-.. |DownLeftVectorBar| unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
-.. |DownRightTeeVector| unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
-.. |DownRightVectorBar| unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
-.. |ee| unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
-.. |EmptySmallSquare| unicode:: U+025FB .. WHITE MEDIUM SQUARE
-.. |EmptyVerySmallSquare| unicode:: U+025AB .. WHITE SMALL SQUARE
-.. |eopf| unicode:: U+1D556 .. MATHEMATICAL DOUBLE-STRUCK SMALL E
-.. |Equal| unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
-.. |FilledSmallSquare| unicode:: U+025FC .. BLACK MEDIUM SQUARE
-.. |FilledVerySmallSquare| unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |fopf| unicode:: U+1D557 .. MATHEMATICAL DOUBLE-STRUCK SMALL F
-.. |gopf| unicode:: U+1D558 .. MATHEMATICAL DOUBLE-STRUCK SMALL G
-.. |GreaterGreater| unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
-.. |Hat| unicode:: U+0005E .. CIRCUMFLEX ACCENT
-.. |hopf| unicode:: U+1D559 .. MATHEMATICAL DOUBLE-STRUCK SMALL H
-.. |HorizontalLine| unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
-.. |ic| unicode:: U+02063 .. INVISIBLE SEPARATOR
-.. |ii| unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
-.. |iopf| unicode:: U+1D55A .. MATHEMATICAL DOUBLE-STRUCK SMALL I
-.. |it| unicode:: U+02062 .. INVISIBLE TIMES
-.. |jopf| unicode:: U+1D55B .. MATHEMATICAL DOUBLE-STRUCK SMALL J
-.. |kopf| unicode:: U+1D55C .. MATHEMATICAL DOUBLE-STRUCK SMALL K
-.. |larrb| unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
-.. |LeftDownTeeVector| unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
-.. |LeftDownVectorBar| unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
-.. |LeftRightVector| unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
-.. |LeftTeeVector| unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
-.. |LeftTriangleBar| unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
-.. |LeftUpDownVector| unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
-.. |LeftUpTeeVector| unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
-.. |LeftUpVectorBar| unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
-.. |LeftVectorBar| unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
-.. |LessLess| unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
-.. |lopf| unicode:: U+1D55D .. MATHEMATICAL DOUBLE-STRUCK SMALL L
-.. |mapstodown| unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
-.. |mapstoleft| unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
-.. |mapstoup| unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
-.. |MediumSpace| unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
-.. |mopf| unicode:: U+1D55E .. MATHEMATICAL DOUBLE-STRUCK SMALL M
-.. |nbump| unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
-.. |nbumpe| unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
-.. |nesim| unicode:: U+02242 U+00338 .. MINUS TILDE with slash
-.. |NewLine| unicode:: U+0000A .. LINE FEED (LF)
-.. |NoBreak| unicode:: U+02060 .. WORD JOINER
-.. |nopf| unicode:: U+1D55F .. MATHEMATICAL DOUBLE-STRUCK SMALL N
-.. |NotCupCap| unicode:: U+0226D .. NOT EQUIVALENT TO
-.. |NotHumpEqual| unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
-.. |NotLeftTriangleBar| unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
-.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
-.. |NotNestedLessLess| unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
-.. |NotRightTriangleBar| unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
-.. |NotSquareSubset| unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
-.. |NotSquareSuperset| unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
-.. |NotSucceedsTilde| unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
-.. |oopf| unicode:: U+1D560 .. MATHEMATICAL DOUBLE-STRUCK SMALL O
-.. |OverBar| unicode:: U+000AF .. MACRON
-.. |OverBrace| unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
-.. |OverBracket| unicode:: U+023B4 .. TOP SQUARE BRACKET
-.. |OverParenthesis| unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
-.. |planckh| unicode:: U+0210E .. PLANCK CONSTANT
-.. |popf| unicode:: U+1D561 .. MATHEMATICAL DOUBLE-STRUCK SMALL P
-.. |Product| unicode:: U+0220F .. N-ARY PRODUCT
-.. |qopf| unicode:: U+1D562 .. MATHEMATICAL DOUBLE-STRUCK SMALL Q
-.. |rarrb| unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
-.. |RightDownTeeVector| unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
-.. |RightDownVectorBar| unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
-.. |RightTeeVector| unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
-.. |RightTriangleBar| unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
-.. |RightUpDownVector| unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
-.. |RightUpTeeVector| unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
-.. |RightUpVectorBar| unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
-.. |RightVectorBar| unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
-.. |ropf| unicode:: U+1D563 .. MATHEMATICAL DOUBLE-STRUCK SMALL R
-.. |RoundImplies| unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
-.. |RuleDelayed| unicode:: U+029F4 .. RULE-DELAYED
-.. |sopf| unicode:: U+1D564 .. MATHEMATICAL DOUBLE-STRUCK SMALL S
-.. |Tab| unicode:: U+00009 .. CHARACTER TABULATION
-.. |ThickSpace| unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
-.. |topf| unicode:: U+1D565 .. MATHEMATICAL DOUBLE-STRUCK SMALL T
-.. |UnderBar| unicode:: U+00332 .. COMBINING LOW LINE
-.. |UnderBrace| unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
-.. |UnderBracket| unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
-.. |UnderParenthesis| unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
-.. |uopf| unicode:: U+1D566 .. MATHEMATICAL DOUBLE-STRUCK SMALL U
-.. |UpArrowBar| unicode:: U+02912 .. UPWARDS ARROW TO BAR
-.. |Upsilon| unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
-.. |VerticalLine| unicode:: U+0007C .. VERTICAL LINE
-.. |VerticalSeparator| unicode:: U+02758 .. LIGHT VERTICAL BAR
-.. |vopf| unicode:: U+1D567 .. MATHEMATICAL DOUBLE-STRUCK SMALL V
-.. |wopf| unicode:: U+1D568 .. MATHEMATICAL DOUBLE-STRUCK SMALL W
-.. |xopf| unicode:: U+1D569 .. MATHEMATICAL DOUBLE-STRUCK SMALL X
-.. |yopf| unicode:: U+1D56A .. MATHEMATICAL DOUBLE-STRUCK SMALL Y
-.. |ZeroWidthSpace| unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |zopf| unicode:: U+1D56B .. MATHEMATICAL DOUBLE-STRUCK SMALL Z
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/mmlextra.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/mmlextra.txt
deleted file mode 100644
index 272624739..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/mmlextra.txt
+++ /dev/null
@@ -1,87 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |af| unicode:: U+02061 .. FUNCTION APPLICATION
-.. |asympeq| unicode:: U+0224D .. EQUIVALENT TO
-.. |Cross| unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
-.. |DD| unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
-.. |dd| unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
-.. |DownArrowBar| unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
-.. |DownBreve| unicode:: U+00311 .. COMBINING INVERTED BREVE
-.. |DownLeftRightVector| unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
-.. |DownLeftTeeVector| unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
-.. |DownLeftVectorBar| unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
-.. |DownRightTeeVector| unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
-.. |DownRightVectorBar| unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
-.. |ee| unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
-.. |EmptySmallSquare| unicode:: U+025FB .. WHITE MEDIUM SQUARE
-.. |EmptyVerySmallSquare| unicode:: U+025AB .. WHITE SMALL SQUARE
-.. |Equal| unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
-.. |FilledSmallSquare| unicode:: U+025FC .. BLACK MEDIUM SQUARE
-.. |FilledVerySmallSquare| unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |GreaterGreater| unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
-.. |Hat| unicode:: U+0005E .. CIRCUMFLEX ACCENT
-.. |HorizontalLine| unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
-.. |ic| unicode:: U+02063 .. INVISIBLE SEPARATOR
-.. |ii| unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
-.. |it| unicode:: U+02062 .. INVISIBLE TIMES
-.. |larrb| unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
-.. |LeftDownTeeVector| unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
-.. |LeftDownVectorBar| unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
-.. |LeftRightVector| unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
-.. |LeftTeeVector| unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
-.. |LeftTriangleBar| unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
-.. |LeftUpDownVector| unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
-.. |LeftUpTeeVector| unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
-.. |LeftUpVectorBar| unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
-.. |LeftVectorBar| unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
-.. |LessLess| unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
-.. |mapstodown| unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
-.. |mapstoleft| unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
-.. |mapstoup| unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
-.. |MediumSpace| unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
-.. |nbump| unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
-.. |nbumpe| unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
-.. |nesim| unicode:: U+02242 U+00338 .. MINUS TILDE with slash
-.. |NewLine| unicode:: U+0000A .. LINE FEED (LF)
-.. |NoBreak| unicode:: U+02060 .. WORD JOINER
-.. |NotCupCap| unicode:: U+0226D .. NOT EQUIVALENT TO
-.. |NotHumpEqual| unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
-.. |NotLeftTriangleBar| unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
-.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
-.. |NotNestedLessLess| unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
-.. |NotRightTriangleBar| unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
-.. |NotSquareSubset| unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
-.. |NotSquareSuperset| unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
-.. |NotSucceedsTilde| unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
-.. |OverBar| unicode:: U+000AF .. MACRON
-.. |OverBrace| unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
-.. |OverBracket| unicode:: U+023B4 .. TOP SQUARE BRACKET
-.. |OverParenthesis| unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
-.. |planckh| unicode:: U+0210E .. PLANCK CONSTANT
-.. |Product| unicode:: U+0220F .. N-ARY PRODUCT
-.. |rarrb| unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
-.. |RightDownTeeVector| unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
-.. |RightDownVectorBar| unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
-.. |RightTeeVector| unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
-.. |RightTriangleBar| unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
-.. |RightUpDownVector| unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
-.. |RightUpTeeVector| unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
-.. |RightUpVectorBar| unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
-.. |RightVectorBar| unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
-.. |RoundImplies| unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
-.. |RuleDelayed| unicode:: U+029F4 .. RULE-DELAYED
-.. |Tab| unicode:: U+00009 .. CHARACTER TABULATION
-.. |ThickSpace| unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
-.. |UnderBar| unicode:: U+00332 .. COMBINING LOW LINE
-.. |UnderBrace| unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
-.. |UnderBracket| unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
-.. |UnderParenthesis| unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
-.. |UpArrowBar| unicode:: U+02912 .. UPWARDS ARROW TO BAR
-.. |Upsilon| unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
-.. |VerticalLine| unicode:: U+0007C .. VERTICAL LINE
-.. |VerticalSeparator| unicode:: U+02758 .. LIGHT VERTICAL BAR
-.. |ZeroWidthSpace| unicode:: U+0200B .. ZERO WIDTH SPACE
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/s5defs.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/s5defs.txt
deleted file mode 100644
index 8aceeac0b..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/s5defs.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-.. Definitions of interpreted text roles (classes) for S5/HTML data.
-.. This data file has been placed in the public domain.
-
-.. Colours
- =======
-
-.. role:: black
-.. role:: gray
-.. role:: silver
-.. role:: white
-
-.. role:: maroon
-.. role:: red
-.. role:: magenta
-.. role:: fuchsia
-.. role:: pink
-.. role:: orange
-.. role:: yellow
-.. role:: lime
-.. role:: green
-.. role:: olive
-.. role:: teal
-.. role:: cyan
-.. role:: aqua
-.. role:: blue
-.. role:: navy
-.. role:: purple
-
-
-.. Text Sizes
- ==========
-
-.. role:: huge
-.. role:: big
-.. role:: small
-.. role:: tiny
-
-
-.. Display in Slides (Presentation Mode) Only
- ==========================================
-
-.. role:: slide
- :class: slide-display
-
-
-.. Display in Outline Mode Only
- ============================
-
-.. role:: outline
-
-
-.. Display in Print Only
- =====================
-
-.. role:: print
-
-
-.. Display in Handout Mode Only
- ============================
-
-.. role:: handout
-
-
-.. Incremental Display
- ===================
-
-.. role:: incremental
-.. default-role:: incremental
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt
deleted file mode 100644
index 1cae194e0..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt
+++ /dev/null
@@ -1,102 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
-.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
-.. |Acirc| unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
-.. |acirc| unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
-.. |acute| unicode:: U+000B4 .. ACUTE ACCENT
-.. |AElig| unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
-.. |aelig| unicode:: U+000E6 .. LATIN SMALL LETTER AE
-.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
-.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
-.. |Aring| unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
-.. |aring| unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
-.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
-.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
-.. |Auml| unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
-.. |auml| unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
-.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
-.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
-.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
-.. |cedil| unicode:: U+000B8 .. CEDILLA
-.. |cent| unicode:: U+000A2 .. CENT SIGN
-.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN
-.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
-.. |deg| unicode:: U+000B0 .. DEGREE SIGN
-.. |divide| unicode:: U+000F7 .. DIVISION SIGN
-.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
-.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
-.. |Ecirc| unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
-.. |ecirc| unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
-.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
-.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
-.. |ETH| unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
-.. |eth| unicode:: U+000F0 .. LATIN SMALL LETTER ETH
-.. |Euml| unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
-.. |euml| unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
-.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
-.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
-.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
-.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
-.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
-.. |Icirc| unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
-.. |icirc| unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
-.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
-.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
-.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
-.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
-.. |Iuml| unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
-.. |iuml| unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
-.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-.. |macr| unicode:: U+000AF .. MACRON
-.. |micro| unicode:: U+000B5 .. MICRO SIGN
-.. |middot| unicode:: U+000B7 .. MIDDLE DOT
-.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACE
-.. |not| unicode:: U+000AC .. NOT SIGN
-.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
-.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
-.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
-.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
-.. |Ocirc| unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
-.. |ocirc| unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
-.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
-.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
-.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
-.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
-.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
-.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
-.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
-.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
-.. |Ouml| unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
-.. |ouml| unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
-.. |para| unicode:: U+000B6 .. PILCROW SIGN
-.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
-.. |pound| unicode:: U+000A3 .. POUND SIGN
-.. |raquo| unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-.. |reg| unicode:: U+000AE .. REGISTERED SIGN
-.. |sect| unicode:: U+000A7 .. SECTION SIGN
-.. |shy| unicode:: U+000AD .. SOFT HYPHEN
-.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONE
-.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWO
-.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREE
-.. |szlig| unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
-.. |THORN| unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
-.. |thorn| unicode:: U+000FE .. LATIN SMALL LETTER THORN
-.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGN
-.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
-.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
-.. |Ucirc| unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
-.. |ucirc| unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
-.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
-.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
-.. |uml| unicode:: U+000A8 .. DIAERESIS
-.. |Uuml| unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
-.. |uuml| unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
-.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
-.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
-.. |yen| unicode:: U+000A5 .. YEN SIGN
-.. |yuml| unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/xhtml1-special.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/xhtml1-special.txt
deleted file mode 100644
index b19c0b511..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/xhtml1-special.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |bdquo| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
-.. |circ| unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
-.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
-.. |dagger| unicode:: U+02020 .. DAGGER
-.. |emsp| unicode:: U+02003 .. EM SPACE
-.. |ensp| unicode:: U+02002 .. EN SPACE
-.. |euro| unicode:: U+020AC .. EURO SIGN
-.. |gt| unicode:: U+0003E .. GREATER-THAN SIGN
-.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
-.. |lrm| unicode:: U+0200E .. LEFT-TO-RIGHT MARK
-.. |lsaquo| unicode:: U+02039 .. SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
-.. |lt| unicode:: U+0003C .. LESS-THAN SIGN
-.. |mdash| unicode:: U+02014 .. EM DASH
-.. |ndash| unicode:: U+02013 .. EN DASH
-.. |OElig| unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
-.. |oelig| unicode:: U+00153 .. LATIN SMALL LIGATURE OE
-.. |permil| unicode:: U+02030 .. PER MILLE SIGN
-.. |quot| unicode:: U+00022 .. QUOTATION MARK
-.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
-.. |rlm| unicode:: U+0200F .. RIGHT-TO-LEFT MARK
-.. |rsaquo| unicode:: U+0203A .. SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
-.. |sbquo| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
-.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
-.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
-.. |thinsp| unicode:: U+02009 .. THIN SPACE
-.. |tilde| unicode:: U+002DC .. SMALL TILDE
-.. |Yuml| unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
-.. |zwj| unicode:: U+0200D .. ZERO WIDTH JOINER
-.. |zwnj| unicode:: U+0200C .. ZERO WIDTH NON-JOINER
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt
deleted file mode 100644
index 1f9359056..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt
+++ /dev/null
@@ -1,130 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
- .
- Processed by unicode2rstsubs.py, part of Docutils:
- .
-
-.. |alefsym| unicode:: U+02135 .. ALEF SYMBOL
-.. |Alpha| unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
-.. |alpha| unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
-.. |and| unicode:: U+02227 .. LOGICAL AND
-.. |ang| unicode:: U+02220 .. ANGLE
-.. |asymp| unicode:: U+02248 .. ALMOST EQUAL TO
-.. |Beta| unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
-.. |beta| unicode:: U+003B2 .. GREEK SMALL LETTER BETA
-.. |bull| unicode:: U+02022 .. BULLET
-.. |cap| unicode:: U+02229 .. INTERSECTION
-.. |Chi| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
-.. |chi| unicode:: U+003C7 .. GREEK SMALL LETTER CHI
-.. |clubs| unicode:: U+02663 .. BLACK CLUB SUIT
-.. |cong| unicode:: U+02245 .. APPROXIMATELY EQUAL TO
-.. |crarr| unicode:: U+021B5 .. DOWNWARDS ARROW WITH CORNER LEFTWARDS
-.. |cup| unicode:: U+0222A .. UNION
-.. |dArr| unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
-.. |darr| unicode:: U+02193 .. DOWNWARDS ARROW
-.. |Delta| unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
-.. |delta| unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
-.. |diams| unicode:: U+02666 .. BLACK DIAMOND SUIT
-.. |empty| unicode:: U+02205 .. EMPTY SET
-.. |Epsilon| unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
-.. |epsilon| unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
-.. |equiv| unicode:: U+02261 .. IDENTICAL TO
-.. |Eta| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
-.. |eta| unicode:: U+003B7 .. GREEK SMALL LETTER ETA
-.. |exist| unicode:: U+02203 .. THERE EXISTS
-.. |fnof| unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
-.. |forall| unicode:: U+02200 .. FOR ALL
-.. |frasl| unicode:: U+02044 .. FRACTION SLASH
-.. |Gamma| unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
-.. |gamma| unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
-.. |ge| unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
-.. |hArr| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |harr| unicode:: U+02194 .. LEFT RIGHT ARROW
-.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT
-.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS
-.. |image| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |infin| unicode:: U+0221E .. INFINITY
-.. |int| unicode:: U+0222B .. INTEGRAL
-.. |Iota| unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
-.. |iota| unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
-.. |isin| unicode:: U+02208 .. ELEMENT OF
-.. |Kappa| unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
-.. |kappa| unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
-.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
-.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
-.. |lang| unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
-.. |lArr| unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
-.. |larr| unicode:: U+02190 .. LEFTWARDS ARROW
-.. |lceil| unicode:: U+02308 .. LEFT CEILING
-.. |le| unicode:: U+02264 .. LESS-THAN OR EQUAL TO
-.. |lfloor| unicode:: U+0230A .. LEFT FLOOR
-.. |lowast| unicode:: U+02217 .. ASTERISK OPERATOR
-.. |loz| unicode:: U+025CA .. LOZENGE
-.. |minus| unicode:: U+02212 .. MINUS SIGN
-.. |Mu| unicode:: U+0039C .. GREEK CAPITAL LETTER MU
-.. |mu| unicode:: U+003BC .. GREEK SMALL LETTER MU
-.. |nabla| unicode:: U+02207 .. NABLA
-.. |ne| unicode:: U+02260 .. NOT EQUAL TO
-.. |ni| unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |notin| unicode:: U+02209 .. NOT AN ELEMENT OF
-.. |nsub| unicode:: U+02284 .. NOT A SUBSET OF
-.. |Nu| unicode:: U+0039D .. GREEK CAPITAL LETTER NU
-.. |nu| unicode:: U+003BD .. GREEK SMALL LETTER NU
-.. |oline| unicode:: U+0203E .. OVERLINE
-.. |Omega| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
-.. |omega| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
-.. |Omicron| unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
-.. |omicron| unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
-.. |oplus| unicode:: U+02295 .. CIRCLED PLUS
-.. |or| unicode:: U+02228 .. LOGICAL OR
-.. |otimes| unicode:: U+02297 .. CIRCLED TIMES
-.. |part| unicode:: U+02202 .. PARTIAL DIFFERENTIAL
-.. |perp| unicode:: U+022A5 .. UP TACK
-.. |Phi| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
-.. |phi| unicode:: U+003D5 .. GREEK PHI SYMBOL
-.. |Pi| unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
-.. |pi| unicode:: U+003C0 .. GREEK SMALL LETTER PI
-.. |piv| unicode:: U+003D6 .. GREEK PI SYMBOL
-.. |Prime| unicode:: U+02033 .. DOUBLE PRIME
-.. |prime| unicode:: U+02032 .. PRIME
-.. |prod| unicode:: U+0220F .. N-ARY PRODUCT
-.. |prop| unicode:: U+0221D .. PROPORTIONAL TO
-.. |Psi| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
-.. |psi| unicode:: U+003C8 .. GREEK SMALL LETTER PSI
-.. |radic| unicode:: U+0221A .. SQUARE ROOT
-.. |rang| unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
-.. |rArr| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |rceil| unicode:: U+02309 .. RIGHT CEILING
-.. |real| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |rfloor| unicode:: U+0230B .. RIGHT FLOOR
-.. |Rho| unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
-.. |rho| unicode:: U+003C1 .. GREEK SMALL LETTER RHO
-.. |sdot| unicode:: U+022C5 .. DOT OPERATOR
-.. |Sigma| unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
-.. |sigma| unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
-.. |sigmaf| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
-.. |sim| unicode:: U+0223C .. TILDE OPERATOR
-.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT
-.. |sub| unicode:: U+02282 .. SUBSET OF
-.. |sube| unicode:: U+02286 .. SUBSET OF OR EQUAL TO
-.. |sum| unicode:: U+02211 .. N-ARY SUMMATION
-.. |sup| unicode:: U+02283 .. SUPERSET OF
-.. |supe| unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
-.. |Tau| unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
-.. |tau| unicode:: U+003C4 .. GREEK SMALL LETTER TAU
-.. |there4| unicode:: U+02234 .. THEREFORE
-.. |Theta| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
-.. |theta| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
-.. |thetasym| unicode:: U+003D1 .. GREEK THETA SYMBOL
-.. |trade| unicode:: U+02122 .. TRADE MARK SIGN
-.. |uArr| unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
-.. |uarr| unicode:: U+02191 .. UPWARDS ARROW
-.. |upsih| unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
-.. |Upsilon| unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
-.. |upsilon| unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
-.. |weierp| unicode:: U+02118 .. SCRIPT CAPITAL P
-.. |Xi| unicode:: U+0039E .. GREEK CAPITAL LETTER XI
-.. |xi| unicode:: U+003BE .. GREEK SMALL LETTER XI
-.. |Zeta| unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
-.. |zeta| unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/__init__.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/__init__.py
deleted file mode 100644
index a8bfd231a..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/__init__.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# $Id: __init__.py 9026 2022-03-04 15:57:13Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-# Internationalization details are documented in
-# .
-
-"""
-This package contains modules for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-from docutils.languages import LanguageImporter
-
-
-class RstLanguageImporter(LanguageImporter):
- """Import language modules.
-
- When called with a BCP 47 language tag, instances return a module
- with localisations for "directive" and "role" names for from
- `docutils.parsers.rst.languages` or the PYTHONPATH.
-
- If there is no matching module, warn (if a `reporter` is passed)
- and return None.
- """
- packages = ('docutils.parsers.rst.languages.', '')
- warn_msg = 'rST localisation for language "%s" not found.'
- fallback = None
-
- def check_content(self, module):
- """Check if we got an rST language module."""
- if not (isinstance(module.directives, dict)
- and isinstance(module.roles, dict)):
- raise ImportError
-
-
-get_language = RstLanguageImporter()
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/af.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/af.py
deleted file mode 100644
index 31cb4ebf2..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/af.py
+++ /dev/null
@@ -1,108 +0,0 @@
-# $Id: af.py 9417 2023-06-27 20:04:54Z milde $
-# Author: Jannie Hofmeyr
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Afrikaans-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- 'aandag': 'attention',
- 'versigtig': 'caution',
- 'code (translation required)': 'code',
- 'gevaar': 'danger',
- 'fout': 'error',
- 'wenk': 'hint',
- 'belangrik': 'important',
- 'nota': 'note',
- 'tip': 'tip', # hint and tip both have the same translation: wenk
- 'waarskuwing': 'warning',
- 'advies': 'admonition',
- 'vermaning': 'admonition', # sic! kept for backwards compatibiltity
- 'kantstreep': 'sidebar',
- 'onderwerp': 'topic',
- 'lynblok': 'line-block',
- 'math (translation required)': 'math',
- 'parsed-literal (translation required)': 'parsed-literal',
- 'rubriek': 'rubric',
- 'epigraaf': 'epigraph',
- 'hoogtepunte': 'highlights',
- 'pull-quote (translation required)': 'pull-quote',
- 'compound (translation required)': 'compound',
- 'container (translation required)': 'container',
- # 'vrae': 'questions',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'table (translation required)': 'table',
- 'csv-table (translation required)': 'csv-table',
- 'list-table (translation required)': 'list-table',
- 'meta': 'meta',
- # 'beeldkaart': 'imagemap',
- 'beeld': 'image',
- 'figuur': 'figure',
- 'insluiting': 'include',
- 'rou': 'raw',
- 'vervang': 'replace',
- 'unicode': 'unicode', # should this be translated? unikode
- 'datum': 'date',
- 'klas': 'class',
- 'role (translation required)': 'role',
- 'default-role (translation required)': 'default-role',
- 'title (translation required)': 'title',
- 'inhoud': 'contents',
- 'sectnum': 'sectnum',
- 'section-numbering': 'sectnum',
- 'header (translation required)': 'header',
- 'footer (translation required)': 'footer',
- # 'voetnote': 'footnotes',
- # 'aanhalings': 'citations',
- 'teikennotas': 'target-notes',
- 'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Afrikaans name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- 'afkorting': 'abbreviation',
- 'ab': 'abbreviation',
- 'akroniem': 'acronym',
- 'ac': 'acronym',
- 'code (translation required)': 'code',
- 'indeks': 'index',
- 'i': 'index',
- 'voetskrif': 'subscript',
- 'sub': 'subscript',
- 'boskrif': 'superscript',
- 'sup': 'superscript',
- 'titelverwysing': 'title-reference',
- 'titel': 'title-reference',
- 't': 'title-reference',
- 'pep-verwysing': 'pep-reference',
- 'pep': 'pep-reference',
- 'rfc-verwysing': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'nadruk': 'emphasis',
- 'sterk': 'strong',
- 'literal (translation required)': 'literal',
- 'math (translation required)': 'math',
- 'benoemde verwysing': 'named-reference',
- 'anonieme verwysing': 'anonymous-reference',
- 'voetnootverwysing': 'footnote-reference',
- 'aanhalingverwysing': 'citation-reference',
- 'vervangingsverwysing': 'substitution-reference',
- 'teiken': 'target',
- 'uri-verwysing': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'rou': 'raw',
- }
-"""Mapping of Afrikaans role names to canonical names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ar.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ar.py
deleted file mode 100644
index 71be92a5e..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ar.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# $Id: fa.py 4564 2016-08-10 11:48:42Z
-# Author: Shahin
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Arabic-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-directives = {
- # language-dependent: fixed
- 'تنبيه': 'attention',
- 'احتیاط': 'caution',
- 'كود': 'code',
- 'خطر': 'danger',
- 'خطأ': 'error',
- 'تلميح': 'hint',
- 'مهم': 'important',
- 'ملاحظة': 'note',
- 'نصيحة': 'tip',
- 'تحذير': 'warning',
- 'تذكير': 'admonition',
- 'شريط-جانبي': 'sidebar',
- 'موضوع': 'topic',
- 'قالب-سطري': 'line-block',
- 'لفظ-حرفي': 'parsed-literal',
- 'معيار': 'rubric',
- 'فكرة-الكتاب': 'epigraph',
- 'تمييز': 'highlights',
- 'نقل-قول': 'pull-quote',
- 'ترکیب': 'compound',
- 'وعاء': 'container',
- # 'questions': 'questions',
- 'جدول': 'table',
- 'جدول-csv': 'csv-table',
- 'جدول-قوائم': 'list-table',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'ميتا': 'meta',
- 'رياضيات': 'math',
- # 'imagemap': 'imagemap',
- 'صورة': 'image',
- 'رسم-توضيحي': 'figure',
- 'تضمين': 'include',
- 'خام': 'raw',
- 'تبديل': 'replace',
- 'یونیکد': 'unicode',
- 'تاریخ': 'date',
- 'كائن': 'class',
- 'قانون': 'role',
- 'قانون-افتراضي': 'default-role',
- 'عنوان': 'title',
- 'المحتوى': 'contents',
- 'رقم-الفصل': 'sectnum',
- 'رقم-القسم': 'sectnum',
- 'رأس-الصفحة': 'header',
- 'هامش': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- '': 'target-notes',
-}
-"""Arabic name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'اختصار': 'abbreviation',
- 'اختزال': 'acronym',
- 'كود': 'code',
- 'فهرس': 'index',
- 'خفض': 'subscript',
- 'رفع': 'superscript',
- 'عنوان-مرجع': 'title-reference',
- 'مرجع-pep': 'pep-reference',
- 'rfc-مرجع': 'rfc-reference',
- 'تأكيد': 'emphasis',
- 'عريض': 'strong',
- 'لفظی': 'literal',
- 'رياضيات': 'math',
- 'مرجع-مسمى': 'named-reference',
- 'مرجع-مجهول': 'anonymous-reference',
- 'مرجع-هامشي': 'footnote-reference',
- 'مرجع-منقول': 'citation-reference',
- 'مرجع-معوض': 'substitution-reference',
- 'هدف': 'target',
- 'منبع-uri': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'خام': 'raw',
-}
-"""Mapping of Arabic role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ca.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ca.py
deleted file mode 100644
index 8c8eae405..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ca.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# $Id: ca.py 9457 2023-10-02 16:25:50Z milde $
-# Authors: Ivan Vilata i Balaguer ;
-# Antoni Bella Pérez
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation,
-# please read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-# These translations can be used without changes for
-# Valencian variant of Catalan (use language tag "ca-valencia").
-# Checked by a native speaker of Valentian.
-
-"""
-Catalan-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'atenció': 'attention',
- 'compte': 'caution',
- 'perill': 'danger',
- 'error': 'error',
- 'suggeriment': 'hint',
- 'important': 'important',
- 'nota': 'note',
- 'consell': 'tip',
- 'avís': 'warning',
- 'advertiment': 'admonition',
- 'nota-al-marge': 'sidebar',
- 'nota-marge': 'sidebar',
- 'tema': 'topic',
- 'bloc-de-línies': 'line-block',
- 'bloc-línies': 'line-block',
- 'literal-analitzat': 'parsed-literal',
- 'codi': 'code',
- 'bloc-de-codi': 'code',
- 'matemàtiques': 'math',
- 'rúbrica': 'rubric',
- 'epígraf': 'epigraph',
- 'sumari': 'highlights',
- 'cita-destacada': 'pull-quote',
- 'compost': 'compound',
- 'contenidor': 'container',
- 'taula': 'table',
- 'taula-csv': 'csv-table',
- 'taula-llista': 'list-table',
- 'meta': 'meta',
- # 'imagemap': 'imagemap',
- 'imatge': 'image',
- 'figura': 'figure',
- 'inclou': 'include',
- 'incloure': 'include',
- 'cru': 'raw',
- 'reemplaça': 'replace',
- 'reemplaçar': 'replace',
- 'unicode': 'unicode',
- 'data': 'date',
- 'classe': 'class',
- 'rol': 'role',
- 'rol-predeterminat': 'default-role',
- 'títol': 'title',
- 'contingut': 'contents',
- 'numsec': 'sectnum',
- 'numeració-de-seccions': 'sectnum',
- 'numeració-seccions': 'sectnum',
- 'capçalera': 'header',
- 'peu-de-pàgina': 'footer',
- 'peu-pàgina': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'notes-amb-destinacions': 'target-notes',
- 'notes-destinacions': 'target-notes',
- 'directiva-de-prova-de-restructuredtext': 'restructuredtext-test-directive'} # noqa:E501
-"""Catalan name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'abreviatura': 'abbreviation',
- 'abreviació': 'abbreviation',
- 'abrev': 'abbreviation',
- 'ab': 'abbreviation',
- 'acrònim': 'acronym',
- 'ac': 'acronym',
- 'codi': 'code',
- 'èmfasi': 'emphasis',
- 'literal': 'literal',
- 'matemàtiques': 'math',
- 'referència-a-pep': 'pep-reference',
- 'referència-pep': 'pep-reference',
- 'pep': 'pep-reference',
- 'referència-a-rfc': 'rfc-reference',
- 'referència-rfc': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'destacat': 'strong',
- 'subíndex': 'subscript',
- 'sub': 'subscript',
- 'superíndex': 'superscript',
- 'sup': 'superscript',
- 'referència-a-títol': 'title-reference',
- 'referència-títol': 'title-reference',
- 'títol': 'title-reference',
- 't': 'title-reference',
- 'cru': 'raw',
- # the following roles are not implemented in Docutils
- 'índex': 'index',
- 'i': 'index',
- 'referència-anònima': 'anonymous-reference',
- 'referència-a-cita': 'citation-reference',
- 'referència-cita': 'citation-reference',
- 'referència-a-nota-al-peu': 'footnote-reference',
- 'referència-nota-al-peu': 'footnote-reference',
- 'referència-amb-nom': 'named-reference',
- 'referència-nom': 'named-reference',
- 'referència-a-substitució': 'substitution-reference',
- 'referència-substitució': 'substitution-reference',
- 'referència-a-uri': 'uri-reference',
- 'referència-uri': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'destinació': 'target',
- }
-"""Mapping of Catalan role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/cs.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/cs.py
deleted file mode 100644
index 70274d28d..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/cs.py
+++ /dev/null
@@ -1,110 +0,0 @@
-# $Id: cs.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Marek Blaha
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Czech-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'pozor': 'attention',
- # jak rozlisit caution a warning?
- 'caution (translation required)': 'caution',
- 'code (translation required)': 'code',
- 'nebezpečí': 'danger',
- 'chyba': 'error',
- 'rada': 'hint',
- 'důležité': 'important',
- 'poznámka': 'note',
- 'tip (translation required)': 'tip',
- 'varování': 'warning',
- 'admonition (translation required)': 'admonition',
- 'sidebar (translation required)': 'sidebar',
- 'téma': 'topic',
- 'line-block (translation required)': 'line-block',
- 'parsed-literal (translation required)': 'parsed-literal',
- 'oddíl': 'rubric',
- 'moto': 'epigraph',
- 'highlights (translation required)': 'highlights',
- 'pull-quote (translation required)': 'pull-quote',
- 'compound (translation required)': 'compound',
- 'container (translation required)': 'container',
- # 'questions': 'questions',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'table (translation required)': 'table',
- 'csv-table (translation required)': 'csv-table',
- 'list-table (translation required)': 'list-table',
- 'math (translation required)': 'math',
- 'meta (translation required)': 'meta',
- # 'imagemap': 'imagemap',
- 'image (translation required)': 'image', # obrazek
- 'figure (translation required)': 'figure', # a tady?
- 'include (translation required)': 'include',
- 'raw (translation required)': 'raw',
- 'replace (translation required)': 'replace',
- 'unicode (translation required)': 'unicode',
- 'datum': 'date',
- 'třída': 'class',
- 'role (translation required)': 'role',
- 'default-role (translation required)': 'default-role',
- 'title (translation required)': 'title',
- 'obsah': 'contents',
- 'sectnum (translation required)': 'sectnum',
- 'section-numbering (translation required)': 'sectnum',
- 'header (translation required)': 'header',
- 'footer (translation required)': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'target-notes (translation required)': 'target-notes',
- 'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Czech name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'abbreviation (translation required)': 'abbreviation',
- 'ab (translation required)': 'abbreviation',
- 'acronym (translation required)': 'acronym',
- 'ac (translation required)': 'acronym',
- 'code (translation required)': 'code',
- 'index (translation required)': 'index',
- 'i (translation required)': 'index',
- 'subscript (translation required)': 'subscript',
- 'sub (translation required)': 'subscript',
- 'superscript (translation required)': 'superscript',
- 'sup (translation required)': 'superscript',
- 'title-reference (translation required)': 'title-reference',
- 'title (translation required)': 'title-reference',
- 't (translation required)': 'title-reference',
- 'pep-reference (translation required)': 'pep-reference',
- 'pep (translation required)': 'pep-reference',
- 'rfc-reference (translation required)': 'rfc-reference',
- 'rfc (translation required)': 'rfc-reference',
- 'emphasis (translation required)': 'emphasis',
- 'strong (translation required)': 'strong',
- 'literal (translation required)': 'literal',
- 'math (translation required)': 'math',
- 'named-reference (translation required)': 'named-reference',
- 'anonymous-reference (translation required)': 'anonymous-reference',
- 'footnote-reference (translation required)': 'footnote-reference',
- 'citation-reference (translation required)': 'citation-reference',
- 'substitution-reference (translation required)': 'substitution-reference',
- 'target (translation required)': 'target',
- 'uri-reference (translation required)': 'uri-reference',
- 'uri (translation required)': 'uri-reference',
- 'url (translation required)': 'uri-reference',
- 'raw (translation required)': 'raw',
- }
-"""Mapping of Czech role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/da.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/da.py
deleted file mode 100644
index 31a250e18..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/da.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# $Id: da.py 9417 2023-06-27 20:04:54Z milde $
-# Author: E D
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Danish-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'giv agt': 'attention',
- 'pas på': 'caution',
- 'kode': 'code',
- 'kode-blok': 'code',
- 'kildekode': 'code',
- 'fare': 'danger',
- 'fejl': 'error',
- 'vink': 'hint',
- 'vigtigt': 'important',
- 'bemærk': 'note',
- 'tips': 'tip',
- 'advarsel': 'warning',
- 'varsel': 'admonition',
- 'formaning': 'admonition', # sic! kept for backwards compatibiltity
- 'sidebjælke': 'sidebar',
- 'emne': 'topic',
- 'linje-blok': 'line-block',
- 'linie-blok': 'line-block',
- 'parset-literal': 'parsed-literal',
- 'rubrik': 'rubric',
- 'epigraf': 'epigraph',
- 'fremhævninger': 'highlights',
- 'pull-quote (translation required)': 'pull-quote',
- 'compound (translation required)': 'compound',
- 'container (translation required)': 'container',
- # 'questions': 'questions',
- 'tabel': 'table',
- 'csv-tabel': 'csv-table',
- 'liste-tabel': 'list-table',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- # 'imagemap': 'imagemap',
- 'billede': 'image',
- 'figur': 'figure',
- 'inkludér': 'include',
- 'inkluder': 'include',
- 'rå': 'raw',
- 'erstat': 'replace',
- 'unicode': 'unicode',
- 'dato': 'date',
- 'klasse': 'class',
- 'rolle': 'role',
- 'forvalgt-rolle': 'default-role',
- 'titel': 'title',
- 'indhold': 'contents',
- 'sektnum': 'sectnum',
- 'sektions-nummerering': 'sectnum',
- 'sidehovede': 'header',
- 'sidefod': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'target-notes (translation required)': 'target-notes',
- 'restructuredtext-test-direktiv': 'restructuredtext-test-directive'}
-"""Danish name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'forkortelse': 'abbreviation',
- 'fork': 'abbreviation',
- 'akronym': 'acronym',
- 'ac (translation required)': 'acronym',
- 'kode': 'code',
- 'indeks': 'index',
- 'i': 'index',
- 'subscript (translation required)': 'subscript',
- 'sub (translation required)': 'subscript',
- 'superscript (translation required)': 'superscript',
- 'sup (translation required)': 'superscript',
- 'titel-reference': 'title-reference',
- 'titel': 'title-reference',
- 't': 'title-reference',
- 'pep-reference': 'pep-reference',
- 'pep': 'pep-reference',
- 'rfc-reference': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'emfase': 'emphasis',
- 'kraftig': 'strong',
- 'literal': 'literal',
- 'math (translation required)': 'math',
- 'navngivet-reference': 'named-reference',
- 'anonym-reference': 'anonymous-reference',
- 'fodnote-reference': 'footnote-reference',
- 'citation-reference (translation required)': 'citation-reference',
- 'substitutions-reference': 'substitution-reference',
- 'target (translation required)': 'target',
- 'uri-reference': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'rå': 'raw',
- }
-"""Mapping of Danish role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/de.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/de.py
deleted file mode 100644
index 4b7ef8e00..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/de.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# $Id: de.py 9428 2023-07-07 06:50:26Z milde $
-# Authors: Engelbert Gruber ;
-# Lea Wiemann
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-German-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- 'warnhinweis': 'admonition', # or, more generally, 'anmerkung'?
- 'ermahnung': 'admonition', # sic! kept for backwards compatibiltity
- 'achtung': 'attention',
- 'vorsicht': 'caution',
- 'code': 'code',
- 'gefahr': 'danger',
- 'fehler': 'error',
- 'hinweis': 'hint', # Wink
- 'wichtig': 'important',
- 'notiz': 'note',
- 'tipp': 'tip',
- 'warnung': 'warning',
- 'kasten': 'sidebar',
- 'seitenkasten': 'sidebar', # kept for backwards compatibiltity
- 'seitenleiste': 'sidebar',
- 'thema': 'topic',
- 'zeilenblock': 'line-block',
- 'parsed-literal (translation required)': 'parsed-literal',
- 'rubrik': 'rubric',
- 'epigraph': 'epigraph',
- 'highlights': 'highlights',
- 'pull-quote': 'pull-quote', # commonly used in German too
- 'seitenansprache': 'pull-quote',
- # cf. http://www.typografie.info/2/wiki.php?title=Seitenansprache
- 'zusammengesetzt': 'compound',
- 'verbund': 'compound',
- 'container': 'container',
- # 'fragen': 'questions',
- 'tabelle': 'table',
- 'csv-tabelle': 'csv-table',
- 'listentabelle': 'list-table',
- 'mathe': 'math',
- 'formel': 'math',
- 'meta': 'meta',
- # 'imagemap': 'imagemap',
- 'bild': 'image',
- 'abbildung': 'figure',
- 'unverändert': 'raw',
- 'roh': 'raw',
- 'einfügen': 'include',
- 'ersetzung': 'replace',
- 'ersetzen': 'replace',
- 'ersetze': 'replace',
- 'unicode': 'unicode',
- 'datum': 'date',
- 'klasse': 'class',
- 'rolle': 'role',
- 'standardrolle': 'default-role',
- 'titel': 'title',
- 'inhalt': 'contents',
- 'kapitelnummerierung': 'sectnum',
- 'abschnittsnummerierung': 'sectnum',
- 'linkziel-fußnoten': 'target-notes',
- 'kopfzeilen': 'header',
- 'fußzeilen': 'footer',
- # 'fußnoten': 'footnotes',
- # 'zitate': 'citations',
- }
-"""German name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- 'abkürzung': 'abbreviation',
- 'akronym': 'acronym',
- 'code': 'code',
- 'index': 'index',
- 'tiefgestellt': 'subscript',
- 'hochgestellt': 'superscript',
- 'titel-referenz': 'title-reference',
- 'pep-referenz': 'pep-reference',
- 'rfc-referenz': 'rfc-reference',
- 'betonung': 'emphasis', # for backwards compatibility
- 'betont': 'emphasis',
- 'fett': 'strong',
- 'wörtlich': 'literal',
- 'mathe': 'math',
- 'benannte-referenz': 'named-reference',
- 'unbenannte-referenz': 'anonymous-reference',
- 'fußnoten-referenz': 'footnote-reference',
- 'zitat-referenz': 'citation-reference',
- 'ersetzungs-referenz': 'substitution-reference',
- 'ziel': 'target',
- 'uri-referenz': 'uri-reference',
- 'unverändert': 'raw',
- 'roh': 'raw',
- }
-"""Mapping of German role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/en.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/en.py
deleted file mode 100644
index 7b9319e62..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/en.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# $Id: en.py 9417 2023-06-27 20:04:54Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-English-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'attention': 'attention',
- 'caution': 'caution',
- 'danger': 'danger',
- 'error': 'error',
- 'hint': 'hint',
- 'important': 'important',
- 'note': 'note',
- 'tip': 'tip',
- 'warning': 'warning',
- 'admonition': 'admonition', # advice/advisory/remark, not reprimand
- 'sidebar': 'sidebar',
- 'topic': 'topic',
- 'line-block': 'line-block',
- 'parsed-literal': 'parsed-literal',
- 'code': 'code',
- 'code-block': 'code',
- 'sourcecode': 'code',
- 'math': 'math',
- 'rubric': 'rubric',
- 'epigraph': 'epigraph',
- 'highlights': 'highlights',
- 'pull-quote': 'pull-quote',
- 'compound': 'compound',
- 'container': 'container',
- 'table': 'table',
- 'csv-table': 'csv-table',
- 'list-table': 'list-table',
- 'meta': 'meta',
- # 'imagemap': 'imagemap',
- 'image': 'image',
- 'figure': 'figure',
- 'include': 'include',
- 'raw': 'raw',
- 'replace': 'replace',
- 'unicode': 'unicode',
- 'date': 'date',
- 'class': 'class',
- 'role': 'role',
- 'default-role': 'default-role',
- 'title': 'title',
- 'contents': 'contents',
- 'sectnum': 'sectnum',
- 'section-numbering': 'sectnum',
- 'header': 'header',
- 'footer': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'target-notes': 'target-notes',
- 'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Mapping of English directive name to registered directive names
-
-Cf. https://docutils.sourceforge.io/docs/ref/rst/directives.html
-and `_directive_registry` in ``directives/__init__.py``.
-"""
-
-roles = {
- # language-dependent: fixed
- 'abbreviation': 'abbreviation',
- 'ab': 'abbreviation',
- 'acronym': 'acronym',
- 'ac': 'acronym',
- 'code': 'code',
- 'emphasis': 'emphasis',
- 'literal': 'literal',
- 'math': 'math',
- 'pep-reference': 'pep-reference',
- 'pep': 'pep-reference',
- 'rfc-reference': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'strong': 'strong',
- 'subscript': 'subscript',
- 'sub': 'subscript',
- 'superscript': 'superscript',
- 'sup': 'superscript',
- 'title-reference': 'title-reference',
- 'title': 'title-reference',
- 't': 'title-reference',
- 'raw': 'raw',
- # the following roles are not implemented in Docutils
- 'index': 'index',
- 'i': 'index',
- 'anonymous-reference': 'anonymous-reference',
- 'citation-reference': 'citation-reference',
- 'footnote-reference': 'footnote-reference',
- 'named-reference': 'named-reference',
- 'substitution-reference': 'substitution-reference',
- 'uri-reference': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'target': 'target',
- }
-"""Mapping of English role names to canonical role names for interpreted text.
-
-Cf. https://docutils.sourceforge.io/docs/ref/rst/roles.html
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/eo.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/eo.py
deleted file mode 100644
index 1db6694fe..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/eo.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# $Id: eo.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Marcelo Huerta San Martin
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Esperanto-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'atentu': 'attention',
- 'zorgu': 'caution',
- 'code (translation required)': 'code',
- 'dangxero': 'danger',
- 'danĝero': 'danger',
- 'eraro': 'error',
- 'spuro': 'hint',
- 'grava': 'important',
- 'noto': 'note',
- 'helpeto': 'tip',
- 'averto': 'warning',
- 'sciigo': 'admonition',
- 'admono': 'admonition', # sic! kept for backwards compatibiltity
- 'flankteksto': 'sidebar',
- 'temo': 'topic',
- 'linea-bloko': 'line-block',
- 'analizota-literalo': 'parsed-literal',
- 'rubriko': 'rubric',
- 'epigrafo': 'epigraph',
- 'elstarajxoj': 'highlights',
- 'elstaraĵoj': 'highlights',
- 'ekstera-citajxo': 'pull-quote',
- 'ekstera-citaĵo': 'pull-quote',
- 'kombinajxo': 'compound',
- 'kombinaĵo': 'compound',
- 'tekstingo': 'container',
- 'enhavilo': 'container',
- # 'questions': 'questions',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'tabelo': 'table',
- 'tabelo-vdk': 'csv-table', # "valoroj disigitaj per komoj"
- 'tabelo-csv': 'csv-table',
- 'tabelo-lista': 'list-table',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- # 'imagemap': 'imagemap',
- 'bildo': 'image',
- 'figuro': 'figure',
- 'inkludi': 'include',
- 'senanaliza': 'raw',
- 'anstatauxi': 'replace',
- 'anstataŭi': 'replace',
- 'unicode': 'unicode',
- 'dato': 'date',
- 'klaso': 'class',
- 'rolo': 'role',
- 'preterlasita-rolo': 'default-role',
- 'titolo': 'title',
- 'enhavo': 'contents',
- 'seknum': 'sectnum',
- 'sekcia-numerado': 'sectnum',
- 'kapsekcio': 'header',
- 'piedsekcio': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'celaj-notoj': 'target-notes',
- 'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Esperanto name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'mallongigo': 'abbreviation',
- 'mall': 'abbreviation',
- 'komenclitero': 'acronym',
- 'kl': 'acronym',
- 'code (translation required)': 'code',
- 'indekso': 'index',
- 'i': 'index',
- 'subskribo': 'subscript',
- 'sub': 'subscript',
- 'supraskribo': 'superscript',
- 'sup': 'superscript',
- 'titola-referenco': 'title-reference',
- 'titolo': 'title-reference',
- 't': 'title-reference',
- 'pep-referenco': 'pep-reference',
- 'pep': 'pep-reference',
- 'rfc-referenco': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'emfazo': 'emphasis',
- 'forta': 'strong',
- 'litera': 'literal',
- 'math (translation required)': 'math',
- 'nomita-referenco': 'named-reference',
- 'nenomita-referenco': 'anonymous-reference',
- 'piednota-referenco': 'footnote-reference',
- 'citajxo-referenco': 'citation-reference',
- 'citaĵo-referenco': 'citation-reference',
- 'anstatauxa-referenco': 'substitution-reference',
- 'anstataŭa-referenco': 'substitution-reference',
- 'celo': 'target',
- 'uri-referenco': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'senanaliza': 'raw',
-}
-"""Mapping of Esperanto role names to canonical names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/es.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/es.py
deleted file mode 100644
index b7dda6c9f..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/es.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# $Id: es.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Marcelo Huerta San Martín
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Spanish-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-directives = {
- 'atención': 'attention',
- 'atencion': 'attention',
- 'precaución': 'caution',
- 'code (translation required)': 'code',
- 'precaucion': 'caution',
- 'peligro': 'danger',
- 'error': 'error',
- 'sugerencia': 'hint',
- 'importante': 'important',
- 'nota': 'note',
- 'consejo': 'tip',
- 'advertencia': 'warning',
- 'aviso': 'admonition',
- 'exhortacion': 'admonition', # sic! kept for backwards compatibiltity
- 'exhortación': 'admonition', # sic! kept for backwards compatibiltity
- 'nota-al-margen': 'sidebar',
- 'tema': 'topic',
- 'bloque-de-lineas': 'line-block',
- 'bloque-de-líneas': 'line-block',
- 'literal-evaluado': 'parsed-literal',
- 'firma': 'rubric',
- 'epígrafe': 'epigraph',
- 'epigrafe': 'epigraph',
- 'destacado': 'highlights',
- 'cita-destacada': 'pull-quote',
- 'combinacion': 'compound',
- 'combinación': 'compound',
- 'contenedor': 'container',
- # 'questions': 'questions',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'tabla': 'table',
- 'tabla-vsc': 'csv-table',
- 'tabla-csv': 'csv-table',
- 'tabla-lista': 'list-table',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- # 'imagemap': 'imagemap',
- 'imagen': 'image',
- 'figura': 'figure',
- 'incluir': 'include',
- 'sin-analisis': 'raw',
- 'sin-análisis': 'raw',
- 'reemplazar': 'replace',
- 'unicode': 'unicode',
- 'fecha': 'date',
- 'clase': 'class',
- 'rol': 'role',
- 'rol-por-omision': 'default-role',
- 'rol-por-omisión': 'default-role',
- 'titulo': 'title',
- 'título': 'title',
- 'contenido': 'contents',
- 'numseccion': 'sectnum',
- 'numsección': 'sectnum',
- 'numeracion-seccion': 'sectnum',
- 'numeración-sección': 'sectnum',
- 'notas-destino': 'target-notes',
- 'cabecera': 'header',
- 'pie': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Spanish name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- 'abreviatura': 'abbreviation',
- 'ab': 'abbreviation',
- 'acronimo': 'acronym',
- 'ac': 'acronym',
- 'code (translation required)': 'code',
- 'indice': 'index',
- 'i': 'index',
- 'subindice': 'subscript',
- 'subíndice': 'subscript',
- 'superindice': 'superscript',
- 'superíndice': 'superscript',
- 'referencia-titulo': 'title-reference',
- 'titulo': 'title-reference',
- 't': 'title-reference',
- 'referencia-pep': 'pep-reference',
- 'pep': 'pep-reference',
- 'referencia-rfc': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'enfasis': 'emphasis',
- 'énfasis': 'emphasis',
- 'destacado': 'strong',
- 'literal': 'literal', # "literal" is also a word in Spanish :-)
- 'math (translation required)': 'math',
- 'referencia-con-nombre': 'named-reference',
- 'referencia-anonima': 'anonymous-reference',
- 'referencia-anónima': 'anonymous-reference',
- 'referencia-nota-al-pie': 'footnote-reference',
- 'referencia-cita': 'citation-reference',
- 'referencia-sustitucion': 'substitution-reference',
- 'referencia-sustitución': 'substitution-reference',
- 'destino': 'target',
- 'referencia-uri': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'sin-analisis': 'raw',
- 'sin-análisis': 'raw',
-}
-"""Mapping of Spanish role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/fa.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/fa.py
deleted file mode 100644
index 420a315ef..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/fa.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# $Id: fa.py 4564 2016-08-10 11:48:42Z
-# Author: Shahin
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Persian-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'توجه': 'attention',
- 'احتیاط': 'caution',
- 'کد': 'code',
- 'بلوک-کد': 'code',
- 'کد-منبع': 'code',
- 'خطر': 'danger',
- 'خطا': 'error',
- 'راهنما': 'hint',
- 'مهم': 'important',
- 'یادداشت': 'note',
- 'نکته': 'tip',
- 'اخطار': 'warning',
- 'تذکر': 'admonition',
- 'نوار-کناری': 'sidebar',
- 'موضوع': 'topic',
- 'بلوک-خط': 'line-block',
- 'تلفظ-پردازش-شده': 'parsed-literal',
- 'سر-فصل': 'rubric',
- 'کتیبه': 'epigraph',
- 'نکات-برجسته': 'highlights',
- 'نقل-قول': 'pull-quote',
- 'ترکیب': 'compound',
- 'ظرف': 'container',
- # 'questions': 'questions',
- 'جدول': 'table',
- 'جدول-csv': 'csv-table',
- 'جدول-لیست': 'list-table',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'متا': 'meta',
- 'ریاضی': 'math',
- # 'imagemap': 'imagemap',
- 'تصویر': 'image',
- 'شکل': 'figure',
- 'شامل': 'include',
- 'خام': 'raw',
- 'جایگزین': 'replace',
- 'یونیکد': 'unicode',
- 'تاریخ': 'date',
- 'کلاس': 'class',
- 'قانون': 'role',
- 'قانون-پیشفرض': 'default-role',
- 'عنوان': 'title',
- 'محتوا': 'contents',
- 'شماره-فصل': 'sectnum',
- 'شمارهگذاری-فصل': 'sectnum',
- 'سرآیند': 'header',
- 'پاصفحه': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'یادداشت-هدف': 'target-notes',
-}
-"""Persian name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'مخفف': 'abbreviation',
- 'سرنام': 'acronym',
- 'کد': 'code',
- 'شاخص': 'index',
- 'زیرنویس': 'subscript',
- 'بالانویس': 'superscript',
- 'عنوان': 'title-reference',
- 'نیرو': 'pep-reference',
- 'rfc-reference (translation required)': 'rfc-reference',
- 'تاکید': 'emphasis',
- 'قوی': 'strong',
- 'لفظی': 'literal',
- 'ریاضی': 'math',
- 'منبع-نامگذاری': 'named-reference',
- 'منبع-ناشناس': 'anonymous-reference',
- 'منبع-پانویس': 'footnote-reference',
- 'منبع-نقلفول': 'citation-reference',
- 'منبع-جایگزینی': 'substitution-reference',
- 'هدف': 'target',
- 'منبع-uri': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'خام': 'raw',
-}
-"""Mapping of Persian role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/fi.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/fi.py
deleted file mode 100644
index 88653ac59..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/fi.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# $Id: fi.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Asko Soukka
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Finnish-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'huomio': 'attention',
- 'varo': 'caution',
- 'code (translation required)': 'code',
- 'vaara': 'danger',
- 'virhe': 'error',
- 'vihje': 'hint',
- 'tärkeää': 'important',
- 'huomautus': 'note',
- 'neuvo': 'tip',
- 'varoitus': 'warning',
- 'kehotus': 'admonition', # sic! advice/advisory/remark, not reprimand
- 'sivupalkki': 'sidebar',
- 'aihe': 'topic',
- 'rivi': 'line-block',
- 'tasalevyinen': 'parsed-literal',
- 'ohje': 'rubric',
- 'epigraafi': 'epigraph',
- 'kohokohdat': 'highlights',
- 'lainaus': 'pull-quote',
- 'taulukko': 'table',
- 'csv-taulukko': 'csv-table',
- 'list-table (translation required)': 'list-table',
- 'compound (translation required)': 'compound',
- 'container (translation required)': 'container',
- # 'kysymykset': 'questions',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- # 'kuvakartta': 'imagemap',
- 'kuva': 'image',
- 'kaavio': 'figure',
- 'sisällytä': 'include',
- 'raaka': 'raw',
- 'korvaa': 'replace',
- 'unicode': 'unicode',
- 'päiväys': 'date',
- 'luokka': 'class',
- 'rooli': 'role',
- 'default-role (translation required)': 'default-role',
- 'title (translation required)': 'title',
- 'sisällys': 'contents',
- 'kappale': 'sectnum',
- 'header (translation required)': 'header',
- 'footer (translation required)': 'footer',
- # 'alaviitteet': 'footnotes',
- # 'viitaukset': 'citations',
- 'target-notes (translation required)': 'target-notes'}
-"""Finnish name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'lyhennys': 'abbreviation',
- 'akronyymi': 'acronym',
- 'kirjainsana': 'acronym',
- 'code (translation required)': 'code',
- 'hakemisto': 'index',
- 'luettelo': 'index',
- 'alaindeksi': 'subscript',
- 'indeksi': 'subscript',
- 'yläindeksi': 'superscript',
- 'title-reference (translation required)': 'title-reference',
- 'title (translation required)': 'title-reference',
- 'pep-reference (translation required)': 'pep-reference',
- 'rfc-reference (translation required)': 'rfc-reference',
- 'korostus': 'emphasis',
- 'vahvistus': 'strong',
- 'tasalevyinen': 'literal',
- 'math (translation required)': 'math',
- 'named-reference (translation required)': 'named-reference',
- 'anonymous-reference (translation required)': 'anonymous-reference',
- 'footnote-reference (translation required)': 'footnote-reference',
- 'citation-reference (translation required)': 'citation-reference',
- 'substitution-reference (translation required)': 'substitution-reference',
- 'kohde': 'target',
- 'uri-reference (translation required)': 'uri-reference',
- 'raw (translation required)': 'raw',
- }
-"""Mapping of Finnish role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/fr.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/fr.py
deleted file mode 100644
index cd4ca9db8..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/fr.py
+++ /dev/null
@@ -1,108 +0,0 @@
-# $Id: fr.py 9417 2023-06-27 20:04:54Z milde $
-# Authors: David Goodger ; William Dode
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-French-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- 'attention': 'attention',
- 'précaution': 'caution',
- 'danger': 'danger',
- 'erreur': 'error',
- 'conseil': 'hint',
- 'important': 'important',
- 'note': 'note',
- 'astuce': 'tip',
- 'avertissement': 'warning',
- 'annonce': 'admonition',
- 'admonition': 'admonition', # sic! kept for backwards compatibiltity
- # suggestions: annonce, avis, indication, remarque, renseignement
- # see also https://sourceforge.net/p/docutils/bugs/453/
- 'encadré': 'sidebar',
- 'sujet': 'topic',
- 'bloc-textuel': 'line-block',
- 'bloc-interprété': 'parsed-literal',
- 'code-interprété': 'parsed-literal',
- 'code': 'code',
- 'math (translation required)': 'math',
- 'intertitre': 'rubric',
- 'exergue': 'epigraph',
- 'épigraphe': 'epigraph',
- 'chapeau': 'highlights',
- 'accroche': 'pull-quote',
- 'compound (translation required)': 'compound',
- 'container (translation required)': 'container',
- 'tableau': 'table',
- 'csv-table (translation required)': 'csv-table',
- 'list-table (translation required)': 'list-table',
- 'méta': 'meta',
- # 'imagemap (translation required)': 'imagemap',
- 'image': 'image',
- 'figure': 'figure',
- 'inclure': 'include',
- 'brut': 'raw',
- 'remplacer': 'replace',
- 'remplace': 'replace',
- 'unicode': 'unicode',
- 'date': 'date',
- 'classe': 'class',
- 'role (translation required)': 'role',
- 'default-role (translation required)': 'default-role',
- 'titre (translation required)': 'title',
- 'sommaire': 'contents',
- 'table-des-matières': 'contents',
- 'sectnum': 'sectnum',
- 'section-numérotée': 'sectnum',
- 'liens': 'target-notes',
- 'header (translation required)': 'header',
- 'footer (translation required)': 'footer',
- # 'footnotes (translation required)': 'footnotes',
- # 'citations (translation required)': 'citations',
- }
-"""Mapping of French directive names to registered directive names
-
-Cf. https://docutils.sourceforge.io/docs/ref/rst/directives.html
-and `_directive_registry` in ``directives/__init__.py``.
-"""
-
-roles = {
- 'abréviation': 'abbreviation',
- 'acronyme': 'acronym',
- 'sigle': 'acronym',
- 'code': 'code',
- 'emphase': 'emphasis',
- 'littéral': 'literal',
- 'math (translation required)': 'math',
- 'pep-référence': 'pep-reference',
- 'rfc-référence': 'rfc-reference',
- 'fort': 'strong',
- 'indice': 'subscript',
- 'ind': 'subscript',
- 'exposant': 'superscript',
- 'exp': 'superscript',
- 'titre-référence': 'title-reference',
- 'titre': 'title-reference',
- 'brut': 'raw',
- # the following roles are not implemented in Docutils
- 'index': 'index',
- 'nommée-référence': 'named-reference',
- 'anonyme-référence': 'anonymous-reference',
- 'note-référence': 'footnote-reference',
- 'citation-référence': 'citation-reference',
- 'substitution-référence': 'substitution-reference',
- 'lien': 'target',
- 'uri-référence': 'uri-reference',
- }
-"""Mapping of French role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/gl.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/gl.py
deleted file mode 100644
index 837c3f1f8..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/gl.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# Author: David Goodger
-# Contact: goodger@users.sourceforge.net
-# Revision: $Revision: 4229 $
-# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Galician-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'atención': 'attention',
- 'advertencia': 'caution',
- 'code (translation required)': 'code',
- 'perigo': 'danger',
- 'erro': 'error',
- 'pista': 'hint',
- 'importante': 'important',
- 'nota': 'note',
- 'consello': 'tip',
- 'aviso': 'warning',
- 'admonición': 'admonition', # sic! advice/advisory/remark, not reprimand
- 'barra lateral': 'sidebar',
- 'tópico': 'topic',
- 'bloque-liña': 'line-block',
- 'literal-analizado': 'parsed-literal',
- 'rúbrica': 'rubric',
- 'epígrafe': 'epigraph',
- 'realzados': 'highlights',
- 'coller-citación': 'pull-quote',
- 'compor': 'compound',
- 'recipiente': 'container',
- 'táboa': 'table',
- 'táboa-csv': 'csv-table',
- 'táboa-listaxe': 'list-table',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- 'imaxe': 'image',
- 'figura': 'figure',
- 'incluír': 'include',
- 'cru': 'raw',
- 'substituír': 'replace',
- 'unicode': 'unicode',
- 'data': 'date',
- 'clase': 'class',
- 'regra': 'role',
- 'regra-predeterminada': 'default-role',
- 'título': 'title',
- 'contido': 'contents',
- 'seccnum': 'sectnum',
- 'sección-numerar': 'sectnum',
- 'cabeceira': 'header',
- 'pé de páxina': 'footer',
- 'notas-destino': 'target-notes',
- 'texto restruturado-proba-directiva': 'restructuredtext-test-directive',
- }
-"""Galician name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'abreviatura': 'abbreviation',
- 'ab': 'abbreviation',
- 'acrónimo': 'acronym',
- 'ac': 'acronym',
- 'code (translation required)': 'code',
- 'índice': 'index',
- 'i': 'index',
- 'subíndice': 'subscript',
- 'sub': 'subscript',
- 'superíndice': 'superscript',
- 'sup': 'superscript',
- 'referencia título': 'title-reference',
- 'título': 'title-reference',
- 't': 'title-reference',
- 'referencia-pep': 'pep-reference',
- 'pep': 'pep-reference',
- 'referencia-rfc': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'énfase': 'emphasis',
- 'forte': 'strong',
- 'literal': 'literal',
- 'math (translation required)': 'math',
- 'referencia-nome': 'named-reference',
- 'referencia-anónimo': 'anonymous-reference',
- 'referencia-nota ao pé': 'footnote-reference',
- 'referencia-citación': 'citation-reference',
- 'referencia-substitución': 'substitution-reference',
- 'destino': 'target',
- 'referencia-uri': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'cru': 'raw',
- }
-"""Mapping of Galician role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/he.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/he.py
deleted file mode 100644
index 7a5f3baec..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/he.py
+++ /dev/null
@@ -1,110 +0,0 @@
-# Author: Meir Kriheli
-# Id: $Id: he.py 9452 2023-09-27 00:11:54Z milde $
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-English-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'תשומת לב': 'attention',
- 'זהירות': 'caution',
- 'code (translation required)': 'code',
- 'סכנה': 'danger',
- 'שגיאה': 'error',
- 'רמז': 'hint',
- 'חשוב': 'important',
- 'הערה': 'note',
- 'טיפ': 'tip',
- 'אזהרה': 'warning',
- 'admonition': 'admonition',
- 'sidebar': 'sidebar',
- 'topic': 'topic',
- 'line-block': 'line-block',
- 'parsed-literal': 'parsed-literal',
- 'rubric': 'rubric',
- 'epigraph': 'epigraph',
- 'highlights': 'highlights',
- 'pull-quote': 'pull-quote',
- 'compound': 'compound',
- 'container': 'container',
- 'table': 'table',
- 'csv-table': 'csv-table',
- 'list-table': 'list-table',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- 'תמונה': 'image',
- 'figure': 'figure',
- 'include': 'include',
- 'raw': 'raw',
- 'replace': 'replace',
- 'unicode': 'unicode',
- 'date': 'date',
- 'סגנון': 'class',
- 'role': 'role',
- 'default-role': 'default-role',
- 'title': 'title',
- 'תוכן': 'contents',
- 'sectnum': 'sectnum',
- 'section-numbering': 'sectnum',
- 'header': 'header',
- 'footer': 'footer',
- 'target-notes': 'target-notes',
- 'restructuredtext-test-directive': 'restructuredtext-test-directive',
- # 'questions': 'questions',
- # 'qa': 'questions',
- # 'faq': 'questions',
- # 'imagemap': 'imagemap',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- }
-"""English name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'abbreviation': 'abbreviation',
- 'ab': 'abbreviation',
- 'acronym': 'acronym',
- 'ac': 'acronym',
- 'code (translation required)': 'code',
- 'index': 'index',
- 'i': 'index',
- 'תחתי': 'subscript',
- 'sub': 'subscript',
- 'עילי': 'superscript',
- 'sup': 'superscript',
- 'title-reference': 'title-reference',
- 'title': 'title-reference',
- 't': 'title-reference',
- 'pep-reference': 'pep-reference',
- 'pep': 'pep-reference',
- 'rfc-reference': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'emphasis': 'emphasis',
- 'strong': 'strong',
- 'literal': 'literal',
- 'math (translation required)': 'math',
- 'named-reference': 'named-reference',
- 'anonymous-reference': 'anonymous-reference',
- 'footnote-reference': 'footnote-reference',
- 'citation-reference': 'citation-reference',
- 'substitution-reference': 'substitution-reference',
- 'target': 'target',
- 'uri-reference': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'raw': 'raw',
- }
-"""Mapping of English role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/it.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/it.py
deleted file mode 100644
index ee5ba829d..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/it.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# $Id: it.py 9417 2023-06-27 20:04:54Z milde $
-# Authors: Nicola Larosa ;
-# Lele Gaifax
-# Copyright: This module has been placed in the public domain.
-
-# Beware: the italian translation of the reStructuredText documentation
-# at http://docit.bice.dyndns.org/static/ReST, in particular
-# http://docit.bice.dyndns.org/static/ReST/ref/rst/directives.html, needs
-# to be synced with the content of this file.
-
-"""
-Italian-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- 'attenzione': 'attention',
- 'cautela': 'caution',
- 'code (translation required)': 'code',
- 'pericolo': 'danger',
- 'errore': 'error',
- 'suggerimento': 'hint',
- 'importante': 'important',
- 'nota': 'note',
- 'consiglio': 'tip',
- 'avvertenza': 'warning',
- 'avviso': 'admonition',
- 'ammonizione': 'admonition', # sic! kept for backards compatibility
- 'riquadro': 'sidebar',
- 'argomento': 'topic',
- 'blocco-di-righe': 'line-block',
- 'blocco-interpretato': 'parsed-literal',
- 'rubrica': 'rubric',
- 'epigrafe': 'epigraph',
- 'punti-salienti': 'highlights',
- 'estratto-evidenziato': 'pull-quote',
- 'composito': 'compound',
- 'container (translation required)': 'container',
- # 'questions': 'questions',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'tabella': 'table',
- 'tabella-csv': 'csv-table',
- 'tabella-elenco': 'list-table',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- # 'imagemap': 'imagemap',
- 'immagine': 'image',
- 'figura': 'figure',
- 'includi': 'include',
- 'grezzo': 'raw',
- 'sostituisci': 'replace',
- 'unicode': 'unicode',
- 'data': 'date',
- 'classe': 'class',
- 'ruolo': 'role',
- 'ruolo-predefinito': 'default-role',
- 'titolo': 'title',
- 'indice': 'contents',
- 'contenuti': 'contents',
- 'seznum': 'sectnum',
- 'sezioni-autonumerate': 'sectnum',
- 'annota-riferimenti-esterni': 'target-notes',
- 'intestazione': 'header',
- 'piede-pagina': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Italian name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- 'abbreviazione': 'abbreviation',
- 'acronimo': 'acronym',
- 'code (translation required)': 'code',
- 'indice': 'index',
- 'deponente': 'subscript',
- 'esponente': 'superscript',
- 'riferimento-titolo': 'title-reference',
- 'riferimento-pep': 'pep-reference',
- 'riferimento-rfc': 'rfc-reference',
- 'enfasi': 'emphasis',
- 'forte': 'strong',
- 'letterale': 'literal',
- 'math (translation required)': 'math',
- 'riferimento-con-nome': 'named-reference',
- 'riferimento-anonimo': 'anonymous-reference',
- 'riferimento-nota': 'footnote-reference',
- 'riferimento-citazione': 'citation-reference',
- 'riferimento-sostituzione': 'substitution-reference',
- 'destinazione': 'target',
- 'riferimento-uri': 'uri-reference',
- 'grezzo': 'raw',
- }
-"""Mapping of Italian role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ja.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ja.py
deleted file mode 100644
index eef1549d4..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ja.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# $Id: ja.py 9030 2022-03-05 23:28:32Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Japanese-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-# Corrections to these translations are welcome!
-# 間違いがあれば、どうぞ正しい翻訳を教えて下さい。
-
-directives = {
- # language-dependent: fixed
- '注目': 'attention',
- '注意': 'caution',
- 'code (translation required)': 'code',
- '危険': 'danger',
- 'エラー': 'error',
- 'ヒント': 'hint',
- '重要': 'important',
- '備考': 'note',
- '通報': 'tip',
- '警告': 'warning',
- '戒告': 'admonition',
- 'サイドバー': 'sidebar',
- 'トピック': 'topic',
- 'ラインブロック': 'line-block',
- 'パーズドリテラル': 'parsed-literal',
- 'ルブリック': 'rubric',
- 'エピグラフ': 'epigraph',
- '題言': 'epigraph',
- 'ハイライト': 'highlights',
- '見所': 'highlights',
- 'プルクオート': 'pull-quote',
- '合成': 'compound',
- 'コンテナー': 'container',
- '容器': 'container',
- '表': 'table',
- 'csv表': 'csv-table',
- 'リスト表': 'list-table',
- # '質問': 'questions',
- # '問答': 'questions',
- # 'faq': 'questions',
- 'math (translation required)': 'math',
- 'メタ': 'meta',
- # 'イメージマプ': 'imagemap',
- 'イメージ': 'image',
- '画像': 'image',
- 'フィグア': 'figure',
- '図版': 'figure',
- 'インクルード': 'include',
- '含む': 'include',
- '組み込み': 'include',
- '生': 'raw',
- '原': 'raw',
- '換える': 'replace',
- '取り換える': 'replace',
- '掛け替える': 'replace',
- 'ユニコード': 'unicode',
- '日付': 'date',
- 'クラス': 'class',
- 'ロール': 'role',
- '役': 'role',
- 'ディフォルトロール': 'default-role',
- '既定役': 'default-role',
- 'タイトル': 'title',
- '題': 'title', # 題名 件名
- '目次': 'contents',
- '節数': 'sectnum',
- 'ヘッダ': 'header',
- 'フッタ': 'footer',
- # '脚注': 'footnotes', # 脚註?
- # 'サイテーション': 'citations', # 出典 引証 引用
- 'ターゲットノート': 'target-notes', # 的注 的脚注
- }
-"""Japanese name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- '略': 'abbreviation',
- '頭字語': 'acronym',
- 'code (translation required)': 'code',
- 'インデックス': 'index',
- '索引': 'index',
- '添字': 'subscript',
- '下付': 'subscript',
- '下': 'subscript',
- '上付': 'superscript',
- '上': 'superscript',
- '題参照': 'title-reference',
- 'pep参照': 'pep-reference',
- 'rfc参照': 'rfc-reference',
- '強調': 'emphasis',
- '強い': 'strong',
- 'リテラル': 'literal',
- '整形済み': 'literal',
- 'math (translation required)': 'math',
- '名付参照': 'named-reference',
- '無名参照': 'anonymous-reference',
- '脚注参照': 'footnote-reference',
- '出典参照': 'citation-reference',
- '代入参照': 'substitution-reference',
- '的': 'target',
- 'uri参照': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- '生': 'raw',
- }
-"""Mapping of Japanese role names to canonical role names for interpreted
-text."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ka.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ka.py
deleted file mode 100644
index e7f18ab7f..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ka.py
+++ /dev/null
@@ -1,90 +0,0 @@
-# $Id: ka.py 9444 2023-08-23 12:02:41Z grubert $
-# Author: Temuri Doghonadze
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Georgian-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-directives = {
- 'ხაზების-ბლოკი': 'line-block',
- 'მეტა': 'meta',
- 'მათემატიკა': 'math',
- 'დამუშავებული-ლიტერალი': 'parsed-literal',
- 'გამოყოფილი-ციტატა': 'pull-quote',
- 'კოდი': 'code',
- 'შერეული': 'compound',
- 'კონტეინერი': 'container',
- 'ცხრილი': 'table',
- 'csv-ცხრილი': 'csv-table',
- 'ჩამონათვალი-ცხრილი': 'list-table',
- 'დაუმუშავებელი': 'raw',
- 'ჩანაცვლება': 'replace',
- 'restructuredtext-ის-სატესტო-დირექტივა': 'restructuredtext-test-directive',
- 'სამიზნე-შენიშვნები': 'target-notes',
- 'უნიკოდი': 'unicode',
- 'თარიღი': 'date',
- 'გვერდითი-პანელი': 'sidebar',
- 'მნიშვნელოვანი': 'important',
- 'ჩასმა': 'include',
- 'ყურადღება': 'attention',
- 'გამოკვეთა': 'highlights',
- 'შენიშვნა': 'admonition',
- 'გამოსახულება': 'image',
- 'კლასი': 'class',
- 'როლი': 'role',
- 'ნაგულისხმევი-როლი': 'default-role',
- 'სათაური': 'title',
- 'განყ-ნომერი': 'sectnum',
- 'განყ-ნომერი': 'sectnum',
- 'საფრთხე': 'danger',
- 'ფრთხილად': 'caution',
- 'შეცდომა': 'error',
- 'მინიშნება': 'tip',
- 'ყურადღებით': 'warning',
- 'აღნიშვნა': 'note',
- 'ფიგურა': 'figure',
- 'რუბრიკა': 'rubric',
- 'რჩევა': 'hint',
- 'შემცველობა': 'contents',
- 'თემა': 'topic',
- 'ეპიგრაფი': 'epigraph',
- 'თავსართი': 'header',
- 'ქვედა კოლონტიტული': 'footer',
- }
-"""Georgian name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- 'აკრონიმი': 'acronym',
- 'კოდი': 'code',
- 'ანონიმური-მიმართვა': 'anonymous-reference',
- 'სიტყვასიტყვითი': 'literal',
- 'მათემატიკა': 'math',
- 'ზედა-ინდექსი': 'superscript',
- 'მახვილი': 'emphasis',
- 'სახელიანი-მიმართვა': 'named-reference',
- 'ინდექსი': 'index',
- 'ქვედა-ინდექსი': 'subscript',
- 'სქელი-ფონტი': 'strong',
- 'აბრევიატურა': 'abbreviation',
- 'ჩანაცვლების-მიმართვა': 'substitution-reference',
- 'pep-მიმართვა': 'pep-reference',
- 'rfc-მიმართვა ': 'rfc-reference',
- 'uri-მიმართვა': 'uri-reference',
- 'title-მიმართვა': 'title-reference',
- 'ქვედა-კოლონტიტულზე-მიმართვა': 'footnote-reference',
- 'ციტატაზე-მიმართვა': 'citation-reference',
- 'სამიზნე': 'target',
- 'დაუმუშავებელი': 'raw',
- }
-"""Mapping of Georgian role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ko.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ko.py
deleted file mode 100644
index 434fea129..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ko.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# $Id: ko.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Thomas SJ Kang
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Korean-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- '집중': 'attention',
- '주의': 'caution',
- '코드': 'code',
- '코드-블록': 'code',
- '소스코드': 'code',
- '위험': 'danger',
- '오류': 'error',
- '실마리': 'hint',
- '중요한': 'important',
- '비고': 'note',
- '팁': 'tip',
- '경고': 'warning',
- '권고': 'admonition',
- '사이드바': 'sidebar',
- '주제': 'topic',
- '라인-블록': 'line-block',
- '파싱된-리터럴': 'parsed-literal',
- '지시문': 'rubric',
- '제명': 'epigraph',
- '하이라이트': 'highlights',
- '발췌문': 'pull-quote',
- '합성어': 'compound',
- '컨테이너': 'container',
- # '질문': 'questions',
- '표': 'table',
- 'csv-표': 'csv-table',
- 'list-표': 'list-table',
- # 'qa': 'questions',
- # 'faq': 'questions',
- '메타': 'meta',
- '수학': 'math',
- # '이미지맵': 'imagemap',
- '이미지': 'image',
- '도표': 'figure',
- '포함': 'include',
- 'raw': 'raw',
- '대신하다': 'replace',
- '유니코드': 'unicode',
- '날짜': 'date',
- '클래스': 'class',
- '역할': 'role',
- '기본-역할': 'default-role',
- '제목': 'title',
- '내용': 'contents',
- 'sectnum': 'sectnum',
- '섹션-번호-매기기': 'sectnum',
- '머리말': 'header',
- '꼬리말': 'footer',
- # '긱주': 'footnotes',
- # '인용구': 'citations',
- '목표-노트': 'target-notes',
- 'restructuredtext 테스트 지시어': 'restructuredtext-test-directive'}
-"""Korean name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- '약어': 'abbreviation',
- 'ab': 'abbreviation',
- '두음문자': 'acronym',
- 'ac': 'acronym',
- '코드': 'code',
- '색인': 'index',
- 'i': 'index',
- '다리-글자': 'subscript',
- 'sub': 'subscript',
- '어깨-글자': 'superscript',
- 'sup': 'superscript',
- '제목-참조': 'title-reference',
- '제목': 'title-reference',
- 't': 'title-reference',
- 'pep-참조': 'pep-reference',
- 'pep': 'pep-reference',
- 'rfc-참조': 'rfc-reference',
- 'rfc': 'rfc-reference',
- '강조': 'emphasis',
- '굵게': 'strong',
- '기울기': 'literal',
- '수학': 'math',
- '명명된-참조': 'named-reference',
- '익명-참조': 'anonymous-reference',
- '각주-참조': 'footnote-reference',
- '인용-참조': 'citation-reference',
- '대리-참조': 'substitution-reference',
- '대상': 'target',
- 'uri-참조': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'raw': 'raw',
- }
-"""Mapping of Korean role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/lt.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/lt.py
deleted file mode 100644
index 7d324d678..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/lt.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# $Id: lt.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Dalius Dobravolskas
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Lithuanian-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'dėmesio': 'attention',
- 'atsargiai': 'caution',
- 'code (translation required)': 'code',
- 'pavojinga': 'danger',
- 'klaida': 'error',
- 'užuomina': 'hint',
- 'svarbu': 'important',
- 'pastaba': 'note',
- 'patarimas': 'tip',
- 'įspėjimas': 'warning',
- 'perspėjimas': 'admonition',
- 'šoninė-juosta': 'sidebar',
- 'tema': 'topic',
- 'linijinis-blokas': 'line-block',
- 'išanalizuotas-literalas': 'parsed-literal',
- 'rubrika': 'rubric',
- 'epigrafas': 'epigraph',
- 'pagridiniai-momentai': 'highlights',
- 'atitraukta-citata': 'pull-quote',
- 'sudėtinis-darinys': 'compound',
- 'konteineris': 'container',
- # 'questions': 'questions',
- 'lentelė': 'table',
- 'csv-lentelė': 'csv-table',
- 'sąrašo-lentelė': 'list-table',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'meta': 'meta',
- 'matematika': 'math',
- # 'imagemap': 'imagemap',
- 'paveiksliukas': 'image',
- 'iliustracija': 'figure',
- 'pridėti': 'include',
- 'žalia': 'raw',
- 'pakeisti': 'replace',
- 'unikodas': 'unicode',
- 'data': 'date',
- 'klasė': 'class',
- 'rolė': 'role',
- 'numatytoji-rolė': 'default-role',
- 'titulas': 'title',
- 'turinys': 'contents',
- 'seknum': 'sectnum',
- 'sekcijos-numeravimas': 'sectnum',
- 'antraštė': 'header',
- 'poraštė': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'nutaikytos-pastaba': 'target-notes',
- 'restructuredtext-testinė-direktyva': 'restructuredtext-test-directive'}
-"""Lithuanian name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'santrumpa': 'abbreviation',
- 'sa': 'abbreviation',
- 'akronimas': 'acronym',
- 'ak': 'acronym',
- 'code (translation required)': 'code',
- 'indeksas': 'index',
- 'i': 'index',
- 'apatinis-indeksas': 'subscript',
- 'sub': 'subscript',
- 'viršutinis-indeksas': 'superscript',
- 'sup': 'superscript',
- 'antrašės-nuoroda': 'title-reference',
- 'antraštė': 'title-reference',
- 'a': 'title-reference',
- 'pep-nuoroda': 'pep-reference',
- 'pep': 'pep-reference',
- 'rfc-nuoroda': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'paryškinimas': 'emphasis',
- 'sustiprintas': 'strong',
- 'literalas': 'literal',
- 'matematika': 'math',
- 'vardinė-nuoroda': 'named-reference',
- 'anoniminė-nuoroda': 'anonymous-reference',
- 'išnašos-nuoroda': 'footnote-reference',
- 'citatos-nuoroda': 'citation-reference',
- 'pakeitimo-nuoroda': 'substitution-reference',
- 'taikinys': 'target',
- 'uri-nuoroda': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'žalia': 'raw',
- }
-"""Mapping of English role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/lv.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/lv.py
deleted file mode 100644
index 18e4dc499..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/lv.py
+++ /dev/null
@@ -1,108 +0,0 @@
-# $Id: lv.py 9030 2022-03-05 23:28:32Z milde $
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Latvian-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'uzmanību': 'attention',
- 'piesardzību': 'caution',
- 'kods': 'code',
- 'koda-bloks': 'code',
- 'pirmkods': 'code',
- 'bīstami': 'danger',
- 'kļūda': 'error',
- 'ieteikums': 'hint',
- 'svarīgi': 'important',
- 'piezīme': 'note',
- 'padoms': 'tip',
- 'brīdinājums': 'warning',
- 'aizrādījums': 'admonition',
- 'sānjosla': 'sidebar',
- 'tēma': 'topic',
- 'rindu-bloks': 'line-block',
- 'parsēts-literālis': 'parsed-literal',
- 'rubrika': 'rubric',
- 'epigrāfs': 'epigraph',
- 'apskats': 'highlights',
- 'izvilkuma-citāts': 'pull-quote',
- 'savienojums': 'compound',
- 'konteiners': 'container',
- # 'questions': 'questions',
- 'tabula': 'table',
- 'csv-tabula': 'csv-table',
- 'sarakstveida-tabula': 'list-table',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'meta': 'meta',
- 'matemātika': 'math',
- # 'imagemap': 'imagemap',
- 'attēls': 'image',
- 'figūra': 'figure',
- 'ietvert': 'include',
- 'burtiski': 'raw',
- 'aizvieto': 'replace',
- 'unicode': 'unicode',
- 'datums': 'date',
- 'klase': 'class',
- 'role': 'role',
- 'noklusējuma-role': 'default-role',
- 'virsraksts': 'title',
- 'saturs': 'contents',
- 'numurēt-sekcijas': 'sectnum',
- 'galvene': 'header',
- 'kājene': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'atsauces-apakšā': 'target-notes',
- 'restructuredtext-testa-direktīva': 'restructuredtext-test-directive'}
-"""English name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'saīsinājums': 'abbreviation',
- 'īsi': 'abbreviation',
- 'akronīms': 'acronym',
- 'kods': 'code',
- 'indekss': 'index',
- 'i': 'index',
- 'apakšraksts': 'subscript',
- 'apakšā': 'subscript',
- 'augšraksts': 'superscript',
- 'augšā': 'superscript',
- 'virsraksta-atsauce': 'title-reference',
- 'virsraksts': 'title-reference',
- 'v': 'title-reference',
- 'atsauce-uz-pep': 'pep-reference',
- 'pep': 'pep-reference',
- 'atsauce-uz-rfc': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'izcēlums': 'emphasis',
- 'blīvs': 'strong',
- 'literālis': 'literal',
- 'matemātika': 'math',
- 'nosaukta-atsauce': 'named-reference',
- 'nenosaukta-atsauce': 'anonymous-reference',
- 'kājenes-atsauce': 'footnote-reference',
- 'citātā-atsauce': 'citation-reference',
- 'aizvietojuma-atsauce': 'substitution-reference',
- 'mēr''kis': 'target',
- 'atsauce-uz-uri': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'burtiski': 'raw',
- }
-"""Mapping of English role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/nl.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/nl.py
deleted file mode 100644
index 762ddcf2d..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/nl.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# $Id: nl.py 9417 2023-06-27 20:04:54Z milde $
-# Author: Martijn Pieters
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Dutch-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'attentie': 'attention',
- 'let-op': 'caution',
- 'code (translation required)': 'code',
- 'gevaar': 'danger',
- 'fout': 'error',
- 'hint': 'hint',
- 'belangrijk': 'important',
- 'opmerking': 'note',
- 'tip': 'tip',
- 'waarschuwing': 'warning',
- 'advies': 'admonition',
- 'aanmaning': 'admonition', # sic! kept for backwards compatibiltity
- 'katern': 'sidebar',
- 'onderwerp': 'topic',
- 'lijn-blok': 'line-block',
- 'letterlijk-ontleed': 'parsed-literal',
- 'rubriek': 'rubric',
- 'opschrift': 'epigraph',
- 'hoogtepunten': 'highlights',
- 'pull-quote': 'pull-quote', # Dutch printers use the english term
- 'samenstelling': 'compound',
- 'verbinding': 'compound',
- 'container (translation required)': 'container',
- # 'vragen': 'questions',
- 'tabel': 'table',
- 'csv-tabel': 'csv-table',
- 'lijst-tabel': 'list-table',
- # 'veelgestelde-vragen': 'questions',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- # 'imagemap': 'imagemap',
- 'beeld': 'image',
- 'figuur': 'figure',
- 'opnemen': 'include',
- 'onbewerkt': 'raw',
- 'vervang': 'replace',
- 'vervanging': 'replace',
- 'unicode': 'unicode',
- 'datum': 'date',
- 'klasse': 'class',
- 'rol': 'role',
- 'default-role (translation required)': 'default-role',
- 'title (translation required)': 'title',
- 'inhoud': 'contents',
- 'sectnum': 'sectnum',
- 'sectie-nummering': 'sectnum',
- 'hoofdstuk-nummering': 'sectnum',
- 'header (translation required)': 'header',
- 'footer (translation required)': 'footer',
- # 'voetnoten': 'footnotes',
- # 'citaten': 'citations',
- 'verwijzing-voetnoten': 'target-notes',
- 'restructuredtext-test-instructie': 'restructuredtext-test-directive'}
-"""Dutch name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'afkorting': 'abbreviation',
- # 'ab': 'abbreviation',
- 'acroniem': 'acronym',
- 'ac': 'acronym',
- 'code (translation required)': 'code',
- 'index': 'index',
- 'i': 'index',
- 'inferieur': 'subscript',
- 'inf': 'subscript',
- 'superieur': 'superscript',
- 'sup': 'superscript',
- 'titel-referentie': 'title-reference',
- 'titel': 'title-reference',
- 't': 'title-reference',
- 'pep-referentie': 'pep-reference',
- 'pep': 'pep-reference',
- 'rfc-referentie': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'nadruk': 'emphasis',
- 'extra': 'strong',
- 'extra-nadruk': 'strong',
- 'vet': 'strong',
- 'letterlijk': 'literal',
- 'math (translation required)': 'math',
- 'benoemde-referentie': 'named-reference',
- 'anonieme-referentie': 'anonymous-reference',
- 'voetnoot-referentie': 'footnote-reference',
- 'citaat-referentie': 'citation-reference',
- 'substitie-reference': 'substitution-reference',
- 'verwijzing': 'target',
- 'uri-referentie': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'onbewerkt': 'raw',
- }
-"""Mapping of Dutch role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/pl.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/pl.py
deleted file mode 100644
index 9aac2d42b..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/pl.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# $Id$
-# Author: Robert Wojciechowicz
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Polish-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'uwaga': 'attention',
- 'ostrożnie': 'caution',
- 'code (translation required)': 'code',
- 'niebezpieczeństwo': 'danger',
- 'błąd': 'error',
- 'wskazówka': 'hint',
- 'ważne': 'important',
- 'przypis': 'note',
- 'rada': 'tip',
- 'ostrzeżenie': 'warning',
- 'zauważenie': 'admonition', # remark
- 'upomnienie': 'admonition', # sic! kept for backwards compatibiltity
- 'ramka': 'sidebar',
- 'temat': 'topic',
- 'blok-linii': 'line-block',
- 'sparsowany-literał': 'parsed-literal',
- 'rubryka': 'rubric',
- 'epigraf': 'epigraph',
- 'highlights': 'highlights', # FIXME no polish equivalent?
- 'pull-quote': 'pull-quote', # FIXME no polish equivalent?
- 'złożony': 'compound',
- 'kontener': 'container',
- # 'questions': 'questions',
- 'tabela': 'table',
- 'tabela-csv': 'csv-table',
- 'tabela-listowa': 'list-table',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- # 'imagemap': 'imagemap',
- 'obraz': 'image',
- 'rycina': 'figure',
- 'dołącz': 'include',
- 'surowe': 'raw',
- 'zastąp': 'replace',
- 'unikod': 'unicode',
- 'data': 'date',
- 'klasa': 'class',
- 'rola': 'role',
- 'rola-domyślna': 'default-role',
- 'tytuł': 'title',
- 'treść': 'contents',
- 'sectnum': 'sectnum',
- 'numeracja-sekcji': 'sectnum',
- 'nagłówek': 'header',
- 'stopka': 'footer',
- # 'footnotes': 'footnotes',
- # 'citations': 'citations',
- 'target-notes': 'target-notes', # FIXME no polish equivalent?
- 'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Polish name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- # language-dependent: fixed
- 'skrót': 'abbreviation',
- 'akronim': 'acronym',
- 'code (translation required)': 'code',
- 'indeks': 'index',
- 'indeks-dolny': 'subscript',
- 'indeks-górny': 'superscript',
- 'referencja-tytuł': 'title-reference',
- 'referencja-pep': 'pep-reference',
- 'referencja-rfc': 'rfc-reference',
- 'podkreślenie': 'emphasis',
- 'wytłuszczenie': 'strong',
- 'dosłownie': 'literal',
- 'math (translation required)': 'math',
- 'referencja-nazwana': 'named-reference',
- 'referencja-anonimowa': 'anonymous-reference',
- 'referencja-przypis': 'footnote-reference',
- 'referencja-cytat': 'citation-reference',
- 'referencja-podstawienie': 'substitution-reference',
- 'cel': 'target',
- 'referencja-uri': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'surowe': 'raw',
- }
-"""Mapping of Polish role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/pt_br.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/pt_br.py
deleted file mode 100644
index 45a670db8..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/pt_br.py
+++ /dev/null
@@ -1,110 +0,0 @@
-# $Id: pt_br.py 9452 2023-09-27 00:11:54Z milde $
-# Author: David Goodger
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Brazilian Portuguese-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
- # language-dependent: fixed
- 'atenção': 'attention',
- 'cuidado': 'caution',
- 'code (translation required)': 'code',
- 'perigo': 'danger',
- 'erro': 'error',
- 'sugestão': 'hint',
- 'importante': 'important',
- 'nota': 'note',
- 'dica': 'tip',
- 'aviso': 'warning',
- 'advertência': 'admonition',
- 'exortação': 'admonition', # sic! advice/advisory/remark, not reprimand
- 'barra-lateral': 'sidebar',
- 'tópico': 'topic',
- 'bloco-de-linhas': 'line-block',
- 'literal-interpretado': 'parsed-literal',
- 'rubrica': 'rubric',
- 'epígrafo': 'epigraph',
- 'destaques': 'highlights',
- 'citação-destacada': 'pull-quote',
- 'compound (translation required)': 'compound',
- 'container (translation required)': 'container',
- # 'perguntas': 'questions',
- # 'qa': 'questions',
- # 'faq': 'questions',
- 'table (translation required)': 'table',
- 'csv-table (translation required)': 'csv-table',
- 'list-table (translation required)': 'list-table',
- 'meta': 'meta',
- 'math (translation required)': 'math',
- # 'imagemap': 'imagemap',
- 'imagem': 'image',
- 'figura': 'figure',
- 'inclusão': 'include',
- 'cru': 'raw',
- 'substituição': 'replace',
- 'unicode': 'unicode',
- 'data': 'date',
- 'classe': 'class',
- 'role (translation required)': 'role',
- 'default-role (translation required)': 'default-role',
- 'title (translation required)': 'title',
- 'índice': 'contents',
- 'numsec': 'sectnum',
- 'numeração-de-seções': 'sectnum',
- 'header (translation required)': 'header',
- 'footer (translation required)': 'footer',
- # 'notas-de-rorapé': 'footnotes',
- # 'citações': 'citations',
- 'links-no-rodapé': 'target-notes',
- 'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Brazilian Portuguese name to registered (in directives/__init__.py)
-directive name mapping."""
-
-roles = {
- # language-dependent: fixed
- 'abbreviação': 'abbreviation',
- 'ab': 'abbreviation',
- 'acrônimo': 'acronym',
- 'ac': 'acronym',
- 'code (translation required)': 'code',
- 'índice-remissivo': 'index',
- 'i': 'index',
- 'subscrito': 'subscript',
- 'sub': 'subscript',
- 'sobrescrito': 'superscript',
- 'sob': 'superscript',
- 'referência-a-título': 'title-reference',
- 'título': 'title-reference',
- 't': 'title-reference',
- 'referência-a-pep': 'pep-reference',
- 'pep': 'pep-reference',
- 'referência-a-rfc': 'rfc-reference',
- 'rfc': 'rfc-reference',
- 'ênfase': 'emphasis',
- 'forte': 'strong',
- 'literal': 'literal',
- 'math (translation required)': 'math', # translation required?
- 'referência-por-nome': 'named-reference',
- 'referência-anônima': 'anonymous-reference',
- 'referência-a-nota-de-rodapé': 'footnote-reference',
- 'referência-a-citação': 'citation-reference',
- 'referência-a-substituição': 'substitution-reference',
- 'alvo': 'target',
- 'referência-a-uri': 'uri-reference',
- 'uri': 'uri-reference',
- 'url': 'uri-reference',
- 'cru': 'raw',
- }
-"""Mapping of Brazilian Portuguese role names to canonical role names
-for interpreted text."""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ru.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ru.py
deleted file mode 100644
index 7c84cd022..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/ru.py
+++ /dev/null
@@ -1,90 +0,0 @@
-# $Id: ru.py 9030 2022-03-05 23:28:32Z milde $
-# Author: Roman Suzi
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome. Before doing a new translation, please
-# read .
-# Two files must be translated for each language: one in docutils/languages,
-# the other in docutils/parsers/rst/languages.
-
-"""
-Russian-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-directives = {
- 'блок-строк': 'line-block',
- 'meta': 'meta',
- 'математика': 'math',
- 'обработанный-литерал': 'parsed-literal',
- 'выделенная-цитата': 'pull-quote',
- 'код': 'code',
- 'compound (translation required)': 'compound',
- 'контейнер': 'container',
- 'таблица': 'table',
- 'csv-table (translation required)': 'csv-table',
- 'list-table (translation required)': 'list-table',
- 'сырой': 'raw',
- 'замена': 'replace',
- 'тестовая-директива-restructuredtext': 'restructuredtext-test-directive',
- 'целевые-сноски': 'target-notes',
- 'unicode': 'unicode',
- 'дата': 'date',
- 'боковая-полоса': 'sidebar',
- 'важно': 'important',
- 'включать': 'include',
- 'внимание': 'attention',
- 'выделение': 'highlights',
- 'замечание': 'admonition',
- 'изображение': 'image',
- 'класс': 'class',
- 'роль': 'role',
- 'default-role (translation required)': 'default-role',
- 'титул': 'title',
- 'номер-раздела': 'sectnum',
- 'нумерация-разделов': 'sectnum',
- 'опасно': 'danger',
- 'осторожно': 'caution',
- 'ошибка': 'error',
- 'подсказка': 'tip',
- 'предупреждение': 'warning',
- 'примечание': 'note',
- 'рисунок': 'figure',
- 'рубрика': 'rubric',
- 'совет': 'hint',
- 'содержание': 'contents',
- 'тема': 'topic',
- 'эпиграф': 'epigraph',
- 'header (translation required)': 'header',
- 'footer (translation required)': 'footer',
- }
-"""Russian name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- 'акроним': 'acronym',
- 'код': 'code',
- 'анонимная-ссылка': 'anonymous-reference',
- 'буквально': 'literal',
- 'математика': 'math',
- 'верхний-индекс': 'superscript',
- 'выделение': 'emphasis',
- 'именованная-ссылка': 'named-reference',
- 'индекс': 'index',
- 'нижний-индекс': 'subscript',
- 'сильное-выделение': 'strong',
- 'сокращение': 'abbreviation',
- 'ссылка-замена': 'substitution-reference',
- 'ссылка-на-pep': 'pep-reference',
- 'ссылка-на-rfc': 'rfc-reference',
- 'ссылка-на-uri': 'uri-reference',
- 'ссылка-на-заглавие': 'title-reference',
- 'ссылка-на-сноску': 'footnote-reference',
- 'цитатная-ссылка': 'citation-reference',
- 'цель': 'target',
- 'сырой': 'raw',
- }
-"""Mapping of Russian role names to canonical role names for interpreted text.
-"""
diff --git a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/sk.py b/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/sk.py
deleted file mode 100644
index 7b1cef821..000000000
--- a/release_env/lib/python3.12/site-packages/docutils/parsers/rst/languages/sk.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# $Id: sk.py 9452 2023-09-27 00:11:54Z milde $
-# Author: Miroslav Vasko