"
+ for i in range(len(protein.sequence)):
+ inputs += "" + protein.sequence[i]
+ inputs += ""
+ output = self.tokenizer(
+ inputs,
+ truncation=True,
+ add_special_tokens=self.add_special_tokens,
+ )
+ return output
+
+ def decode(self, inputs: str) -> Protein:
+ inputs = inputs.lstrip("").rstrip("").replace("", "").replace(" ", "")
+ return Protein.from_fasta(inputs)
+
+class BioT5(TextBasedMoleculeEditingModel, MoleculeCaptioningModel, TextGuidedMoleculeGenerationModel, TextBasedProteinGenerationModel, ProteinQAModel, MoleculeQAModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(BioT5, self).__init__(model_cfg)
+ if not os.path.exists(model_cfg.hf_model_name_or_path):
+ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
+ logging.info("Repo not found. Try downloading from snapshot")
+ snapshot_download(repo_id="QizhiPei/biot5-base", local_dir=model_cfg.hf_model_name_or_path, force_download=True)
+ self.main_model = T5ForConditionalGeneration.from_pretrained(model_cfg.hf_model_name_or_path)
+ self.tokenizer = T5Tokenizer.from_pretrained(model_cfg.hf_model_name_or_path)
+ self.featurizers = {
+ "molecule": MoleculeTransformersFeaturizer(
+ tokenizer=self.tokenizer,
+ max_length=model_cfg.smiles_max_length,
+ base='SELFIES',
+ ),
+ "protein": BioT5ProteinFeaturizer(
+ model_name_or_path=model_cfg.hf_model_name_or_path,
+ max_length=model_cfg.protein_max_length,
+ add_special_tokens=True,
+ ),
+ "text": TextTransformersFeaturizer(
+ tokenizer=self.tokenizer,
+ max_length=model_cfg.text_max_length,
+ )
+ }
+ self.collators = {
+ "molecule": DataCollatorWithPadding(self.tokenizer, padding=True),
+ "protein": DataCollatorWithPadding(self.tokenizer, padding=True),
+ "text": DataCollatorWithPadding(self.tokenizer, padding=True),
+ }
+ for parent in reversed(type(self).__mro__[1:-1]):
+ if hasattr(parent, '_add_task'):
+ parent._add_task(self)
+
+ def _forward(self, input: BatchEncoding, label: BatchEncoding) -> torch.Tensor:
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**input).last_hidden_state)
+ return self.main_model(
+ encoder_outputs=encoder_outputs,
+ attention_mask=input.attention_mask,
+ decoder_attention_mask=label.attention_mask,
+ labels=label.input_ids
+ ).loss
+
+ def _predict(self, input: BatchEncoding) -> torch.Tensor:
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**input).last_hidden_state)
+ decoder_outputs = self.main_model.generate(
+ encoder_outputs=encoder_outputs,
+ attention_mask=input.attention_mask,
+ **self.config.predict.todict(),
+ )
+ return self.tokenizer.batch_decode(decoder_outputs, skip_special_tokens=True)
+
+ def forward_text_based_molecule_editing(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ label: Featurized[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ return {"loss": self._forward(concatenate_tokens([molecule, text]), label)}
+
+ @torch.no_grad()
+ def predict_text_based_molecule_editing(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ ) -> List[Molecule]:
+ preds = self._predict(concatenate_tokens([molecule, text]))
+ return [Molecule.from_smiles(sf.decoder("".join(sel.split(" ")))) for sel in preds]
+
+ def forward_molecule_captioning(self,
+ molecule: Featurized[Molecule],
+ label: Featurized[Text],
+ ) -> Dict[str, torch.Tensor]:
+ return {"loss": self._forward(molecule, label)}
+
+ @torch.no_grad()
+ def predict_molecule_captioning(self,
+ molecule: Featurized[Molecule],
+ ) -> List[Text]:
+ preds = self._predict(molecule)
+ return [Text.from_str(text) for text in preds]
+
+ def forward_text_guided_molecule_generation(self,
+ text: Featurized[Text],
+ label: Featurized[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ return {"loss": self._forward(text, label)}
+
+ @torch.no_grad()
+ def predict_text_guided_molecule_generation(self,
+ text: Featurized[Text],
+ ) -> List[Molecule]:
+ preds = self._predict(text)
+ return [Molecule.from_selfies("".join(sel.split(" "))) for sel in preds]
+
+ def forward_molecule_question_answering(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ label: Featurized[Text],
+ ) -> Dict[str, torch.Tensor]:
+ return {"loss": self._forward(concatenate_tokens([molecule, text]), label)}
+
+ @torch.no_grad()
+ def predict_molecule_question_answering(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text]
+ ) -> List[Text]:
+ preds = self._predict(concatenate_tokens([molecule, text]))
+ return [Text.from_str(text) for text in preds]
+
+ def forward_text_based_protein_generation(self,
+ text: Featurized[Text],
+ label: Featurized[Protein],
+ ) -> Dict[str, torch.Tensor]:
+ return {"loss": self._forward(text, label)}
+
+ @torch.no_grad()
+ def predict_text_based_protein_generation(self,
+ text: Featurized[Text]
+ ) -> List[Protein]:
+ preds = self._predict(text)
+ return [self.featurizers["protein"].decode(pred) for pred in preds]
+
+ def forward_protein_question_answering(self,
+ protein: Featurized[Protein],
+ text: Featurized[Text],
+ label: Featurized[Text]
+ ) -> Dict[str, torch.Tensor]:
+ return {"loss": self._forward(concatenate_tokens([protein, text]), label)}
+
+ @torch.no_grad()
+ def predict_protein_question_answering(self,
+ protein: Featurized[Protein],
+ text: Featurized[Text]
+ ) -> List[Text]:
+ preds = self._predict(concatenate_tokens([protein, text]))
+ return [Text.from_str(text) for text in preds]
\ No newline at end of file
diff --git a/open_biomed/models/foundation_models/biot5_plus.py b/open_biomed/models/foundation_models/biot5_plus.py
new file mode 100644
index 0000000000000000000000000000000000000000..57672a192ec95791f9ede89fac9a4698b50be176
--- /dev/null
+++ b/open_biomed/models/foundation_models/biot5_plus.py
@@ -0,0 +1,145 @@
+from typing import Dict, List
+from typing_extensions import Any
+
+from huggingface_hub import snapshot_download
+import logging
+import os
+import torch
+from transformers import T5Tokenizer, T5ForConditionalGeneration, DataCollatorWithPadding
+from transformers.modeling_outputs import BaseModelOutput
+import selfies as sf
+
+from open_biomed.data import Molecule, Text
+from open_biomed.models.task_models import TextBasedMoleculeEditingModel, MoleculeCaptioningModel, TextGuidedMoleculeGenerationModel
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import MoleculeTransformersFeaturizer, TextTransformersFeaturizer, Featurized
+from open_biomed.utils.misc import concatenate_tokens
+
+
+class BioT5_PLUS(TextBasedMoleculeEditingModel, MoleculeCaptioningModel, TextGuidedMoleculeGenerationModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(BioT5_PLUS, self).__init__(model_cfg)
+
+ if not os.path.exists(model_cfg.hf_model_name_or_path):
+ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
+ logging.info("Repo not found. Try downloading from snapshot")
+ snapshot_download(repo_id="QizhiPei/biot5-plus-base", local_dir=model_cfg.hf_model_name_or_path, force_download=True)
+ self.main_model = T5ForConditionalGeneration.from_pretrained(model_cfg.hf_model_name_or_path)
+ self.tokenizer = T5Tokenizer.from_pretrained(model_cfg.hf_model_name_or_path)
+ self.featurizers = {
+ "molecule": MoleculeTransformersFeaturizer(
+ tokenizer=self.tokenizer,
+ max_length=model_cfg.smiles_max_length,
+ base='SMILES',
+ ),
+ "text": TextTransformersFeaturizer(
+ tokenizer=self.tokenizer,
+ max_length=model_cfg.text_max_length,
+ )
+ }
+ self.collators = {
+ "molecule": DataCollatorWithPadding(self.tokenizer, padding=True),
+ "text": DataCollatorWithPadding(self.tokenizer, padding=True),
+ }
+ for parent in reversed(type(self).__mro__[1:-1]):
+ if hasattr(parent, '_add_task'):
+ parent._add_task(self)
+
+ def forward_text_based_molecule_editing(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ label: Featurized[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ concatenated = concatenate_tokens([molecule, text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ return {"loss": self.main_model(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ decoder_attention_mask=label.attention_mask,
+ labels=label.input_ids
+ ).loss}
+
+ @torch.no_grad()
+ def predict_text_based_molecule_editing(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ ) -> List[Molecule]:
+ concatenated = concatenate_tokens([molecule, text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ decoder_outputs = self.main_model.generate(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ **self.config.predict.todict(),
+ )
+ preds = self.tokenizer.batch_decode(decoder_outputs, skip_special_tokens=True)
+ return [Molecule.from_smiles(sf.decoder("".join(sel.split(" ")))) for sel in preds]
+
+ def forward_molecule_captioning(self,
+ molecule: Featurized[Molecule],
+ label: Featurized[Text],
+ ) -> Dict[str, torch.Tensor]:
+ concatenated = concatenate_tokens([molecule])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ return {"loss": self.main_model(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ decoder_attention_mask=label.attention_mask,
+ labels=label.input_ids
+ ).loss}
+
+ @torch.no_grad()
+ def predict_molecule_captioning(self,
+ molecule: Featurized[Molecule],
+ ) -> List[Text]:
+ concatenated = concatenate_tokens([molecule])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ decoder_outputs = self.main_model.generate(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ **self.config.predict.todict(),
+ )
+ preds = self.tokenizer.batch_decode(decoder_outputs, skip_special_tokens=True)
+ return [Text.from_str(text) for text in preds]
+
+ def forward_text_guided_molecule_generation(self,
+ text: Featurized[Text],
+ label: Featurized[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ task_definition = 'Definition: You are given a molecule description. Your job is to generate the molecule SELFIES that fits the description.\n\n'
+ featurizer = self.featurizers["text"]
+ text_ori = featurizer.tokenizer.batch_decode(text["input_ids"], truncation=True, add_special_tokens=featurizer.add_special_tokens)
+ text_input = [f"{task_definition}Now complete the following example -\nInput: {i}\nOutput: " for i in text_ori]
+ text_tmp = [featurizer(Text.from_str(i)) for i in text_input]
+ collator = DataCollatorWithPadding(featurizer.tokenizer, padding=True)
+ text = collator(text_tmp)
+
+ concatenated = concatenate_tokens([text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ return {"loss": self.main_model(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ decoder_attention_mask=label.attention_mask,
+ labels=label.input_ids
+ ).loss}
+
+ @torch.no_grad()
+ def predict_text_guided_molecule_generation(self,
+ text: Featurized[Text],
+ ) -> List[Molecule]:
+ task_definition = 'Definition: You are given a molecule description. Your job is to generate the molecule SELFIES that fits the description.\n\n'
+ featurizer = self.featurizers["text"]
+ text_ori = featurizer.tokenizer.batch_decode(text["input_ids"], truncation=True, add_special_tokens=featurizer.add_special_tokens)
+ text_input = [f"{task_definition}Now complete the following example -\nInput: {i}\nOutput: " for i in text_ori]
+ text_tmp = [featurizer(Text.from_str(i)) for i in text_input]
+ collator = DataCollatorWithPadding(featurizer.tokenizer, padding=True)
+ text = collator(text_tmp)
+
+ concatenated = concatenate_tokens([text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ decoder_outputs = self.main_model.generate(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ **self.config.predict.todict(),
+ )
+ preds = self.tokenizer.batch_decode(decoder_outputs, skip_special_tokens=True)
+ return [Molecule.from_smiles(sf.decoder("".join(sel.split(" ")))) for sel in preds]
\ No newline at end of file
diff --git a/open_biomed/models/foundation_models/molt5.py b/open_biomed/models/foundation_models/molt5.py
new file mode 100644
index 0000000000000000000000000000000000000000..a86009c0d8c4535e2296dc9e9b877cd5f4e56b17
--- /dev/null
+++ b/open_biomed/models/foundation_models/molt5.py
@@ -0,0 +1,180 @@
+from typing import Dict, List
+from typing_extensions import Any
+
+from huggingface_hub import snapshot_download
+import logging
+import os
+import torch
+from transformers import T5Tokenizer, T5ForConditionalGeneration, DataCollatorWithPadding
+from transformers.modeling_outputs import BaseModelOutput
+
+from open_biomed.data import Molecule, Text
+from open_biomed.models.task_models import TextBasedMoleculeEditingModel, MoleculeCaptioningModel, TextGuidedMoleculeGenerationModel, MoleculeQAModel, ProteinQAModel
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import MoleculeTransformersFeaturizer, TextTransformersFeaturizer, Featurized
+from open_biomed.utils.misc import concatenate_tokens
+
+class MolT5(TextBasedMoleculeEditingModel, MoleculeCaptioningModel, TextGuidedMoleculeGenerationModel, MoleculeQAModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(MolT5, self).__init__(model_cfg)
+ if not os.path.exists(model_cfg.hf_model_name_or_path):
+ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
+ logging.info("Repo not found. Try downloading from snapshot")
+ snapshot_download(repo_id="laituan245/molt5-base", local_dir=model_cfg.hf_model_name_or_path, force_download=True)
+ self.main_model = T5ForConditionalGeneration.from_pretrained(model_cfg.hf_model_name_or_path)
+ self.tokenizer = T5Tokenizer.from_pretrained(model_cfg.hf_model_name_or_path)
+ self.featurizers = {
+ "molecule": MoleculeTransformersFeaturizer(
+ tokenizer=self.tokenizer,
+ max_length=model_cfg.smiles_max_length,
+ base='SMILES',
+ ),
+ "text": TextTransformersFeaturizer(
+ tokenizer=self.tokenizer,
+ max_length=model_cfg.text_max_length,
+ )
+ }
+ self.collators = {
+ "molecule": DataCollatorWithPadding(self.tokenizer, padding=True),
+ "text": DataCollatorWithPadding(self.tokenizer, padding=True),
+ }
+ for parent in reversed(type(self).__mro__[1:-1]):
+ if hasattr(parent, '_add_task'):
+ parent._add_task(self)
+
+ def forward_text_based_molecule_editing(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ label: Featurized[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ concatenated = concatenate_tokens([molecule, text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ return {"loss": self.main_model(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ decoder_attention_mask=label.attention_mask,
+ labels=label.input_ids
+ ).loss}
+
+ @torch.no_grad()
+ def predict_text_based_molecule_editing(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ ) -> List[Molecule]:
+ concatenated = concatenate_tokens([molecule, text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ decoder_outputs = self.main_model.generate(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ **self.config.predict.todict(),
+ )
+ preds = self.tokenizer.batch_decode(decoder_outputs, skip_special_tokens=True)
+ return [Molecule.from_smiles(smi) for smi in preds]
+
+ def forward_molecule_captioning(self,
+ molecule: Featurized[Molecule],
+ label: Featurized[Text],
+ ) -> Dict[str, torch.Tensor]:
+ concatenated = concatenate_tokens([molecule])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ return {"loss": self.main_model(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ decoder_attention_mask=label.attention_mask,
+ labels=label.input_ids
+ ).loss}
+
+ @torch.no_grad()
+ def predict_molecule_captioning(self,
+ molecule: Featurized[Molecule],
+ ) -> List[Text]:
+ concatenated = concatenate_tokens([molecule])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ decoder_outputs = self.main_model.generate(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ **self.config.predict.todict(),
+ )
+ preds = self.tokenizer.batch_decode(decoder_outputs, skip_special_tokens=True)
+ return [Text.from_str(text) for text in preds]
+
+ def forward_text_guided_molecule_generation(self,
+ text: Featurized[Text],
+ label: Featurized[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ concatenated = concatenate_tokens([text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ return {"loss": self.main_model(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ decoder_attention_mask=label.attention_mask,
+ labels=label.input_ids
+ ).loss}
+
+ @torch.no_grad()
+ def predict_text_guided_molecule_generation(self,
+ text: Featurized[Text],
+ ) -> List[Molecule]:
+ concatenated = concatenate_tokens([text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ decoder_outputs = self.main_model.generate(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ **self.config.predict.todict(),
+ )
+ preds = self.tokenizer.batch_decode(decoder_outputs, skip_special_tokens=True)
+ return [Molecule.from_smiles(smi) for smi in preds]
+
+ def forward_molecule_question_answering(self,
+ text: Featurized[Text],
+ label: Featurized[Text],
+ ) -> Dict[str, torch.Tensor]:
+ concatenated = concatenate_tokens([text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ return {"loss": self.main_model(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ decoder_attention_mask=label.attention_mask,
+ labels=label.input_ids
+ ).loss}
+
+ @torch.no_grad()
+ def predict_molecule_question_answering(self,
+ text: Featurized[Text],
+ ) -> List[Text]:
+ concatenated = concatenate_tokens([text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ decoder_outputs = self.main_model.generate(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ **self.config.predict.todict(),
+ )
+ preds = self.tokenizer.batch_decode(decoder_outputs, skip_special_tokens=True)
+ return [Text.from_str(text) for text in preds]
+
+ def forward_protein_question_answering(self,
+ text: Featurized[Text],
+ label: Featurized[Text],
+ ) -> Dict[str, torch.Tensor]:
+ concatenated = concatenate_tokens([text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ return {"loss": self.main_model(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ decoder_attention_mask=label.attention_mask,
+ labels=label.input_ids
+ ).loss}
+
+ @torch.no_grad()
+ def predict_protein_question_answering(self,
+ text: Featurized[Text],
+ ) -> List[Text]:
+ concatenated = concatenate_tokens([text])
+ encoder_outputs = BaseModelOutput(last_hidden_state=self.main_model.encoder(**concatenated).last_hidden_state)
+ decoder_outputs = self.main_model.generate(
+ encoder_outputs=encoder_outputs,
+ attention_mask=concatenated.attention_mask,
+ **self.config.predict.todict(),
+ )
+ preds = self.tokenizer.batch_decode(decoder_outputs, skip_special_tokens=True)
+ return [Text.from_str(text) for text in preds]
\ No newline at end of file
diff --git a/open_biomed/models/foundation_models/pharmolix_fm.py b/open_biomed/models/foundation_models/pharmolix_fm.py
new file mode 100644
index 0000000000000000000000000000000000000000..014dcfaf96a9828923388ba7b57b288d967b079b
--- /dev/null
+++ b/open_biomed/models/foundation_models/pharmolix_fm.py
@@ -0,0 +1,1016 @@
+from typing import Any, Dict, List, Optional, Tuple
+
+import copy
+from contextlib import contextmanager
+import itertools
+import logging
+import numpy as np
+from rdkit import Chem, Geometry, RDLogger
+import re
+RDLogger.DisableLog("rdApp.*")
+import signal
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch_geometric.data import Data
+from torch_geometric.nn import knn, knn_graph
+from torch_scatter import scatter_mean, scatter_sum
+from tqdm import tqdm
+
+from open_biomed.data import Molecule, Pocket, estimate_ligand_atom_num
+from open_biomed.models.task_models import PocketMolDockModel, StructureBasedDrugDesignModel
+from open_biomed.utils.collator import PygCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import MoleculeFeaturizer, PocketFeaturizer, Featurized
+from open_biomed.utils.misc import safe_index
+
+@contextmanager
+def time_limit(seconds):
+ def signal_handler(signum, frame):
+ raise Exception("Timed out!")
+ signal.signal(signal.SIGALRM, signal_handler)
+ signal.alarm(seconds)
+ try:
+ yield
+ finally:
+ signal.alarm(0)
+
+def fix_valence(mol: Chem.RWMol) -> Tuple[Chem.RWMol, bool]:
+ # Fix valence erros in a molecule by adding electrons to N
+ mol = copy.deepcopy(mol)
+ fixed = False
+ cnt_loop = 0
+ while True:
+ try:
+ Chem.SanitizeMol(copy.deepcopy(mol))
+ fixed = True
+ Chem.SanitizeMol(mol)
+ break
+ except Chem.rdchem.AtomValenceException as e:
+ err = e
+ except Exception as e:
+ return mol, False # from HERE: rerun sample
+ cnt_loop += 1
+ if cnt_loop > 100:
+ break
+ N4_valence = re.compile(u"Explicit valence for atom # ([0-9]{1,}) N, 4, is greater than permitted")
+ index = N4_valence.findall(err.args[0])
+ if len(index) > 0:
+ mol.GetAtomWithIdx(int(index[0])).SetFormalCharge(1)
+ return mol, fixed
+
+def get_ring_sys(mol):
+ all_rings = Chem.GetSymmSSSR(mol)
+ if len(all_rings) == 0:
+ ring_sys_list = []
+ else:
+ ring_sys_list = [all_rings[0]]
+ for ring in all_rings[1:]:
+ form_prev = False
+ for prev_ring in ring_sys_list:
+ if set(ring).intersection(set(prev_ring)):
+ prev_ring.extend(ring)
+ form_prev = True
+ break
+ if not form_prev:
+ ring_sys_list.append(ring)
+ ring_sys_list = [list(set(x)) for x in ring_sys_list]
+ return ring_sys_list
+
+def get_all_subsets(ring_list):
+ all_sub_list = []
+ for n_sub in range(len(ring_list)+1):
+ all_sub_list.extend(itertools.combinations(ring_list, n_sub))
+ return all_sub_list
+
+def fix_aromatic(mol: Chem.RWMol, strict: bool=False) -> Tuple[Chem.RWMol, bool]:
+ mol_orig = mol
+ atomatic_list = [a.GetIdx() for a in mol.GetAromaticAtoms()]
+ N_ring_list = []
+ S_ring_list = []
+ for ring_sys in get_ring_sys(mol):
+ if set(ring_sys).intersection(set(atomatic_list)):
+ idx_N = [atom for atom in ring_sys if mol.GetAtomWithIdx(atom).GetSymbol() == 'N']
+ if len(idx_N) > 0:
+ idx_N.append(-1) # -1 for not add to this loop
+ N_ring_list.append(idx_N)
+ idx_S = [atom for atom in ring_sys if mol.GetAtomWithIdx(atom).GetSymbol() == 'S']
+ if len(idx_S) > 0:
+ idx_S.append(-1) # -1 for not add to this loop
+ S_ring_list.append(idx_S)
+ # enumerate S
+ fixed = False
+ if strict:
+ S_ring_list = [s for ring in S_ring_list for s in ring if s != -1]
+ permutation = get_all_subsets(S_ring_list)
+ else:
+ permutation = list(itertools.product(*S_ring_list))
+ for perm in permutation:
+ mol = copy.deepcopy(mol_orig)
+ perm = [x for x in perm if x != -1]
+ for idx in perm:
+ mol.GetAtomWithIdx(idx).SetFormalCharge(1)
+ try:
+ if strict:
+ mol, fixed = fix_valence(mol)
+ Chem.SanitizeMol(copy.deepcopy(mol))
+ fixed = True
+ Chem.SanitizeMol(mol)
+ break
+ except:
+ continue
+ # enumerate N
+ if not fixed:
+ if strict:
+ N_ring_list = [s for ring in N_ring_list for s in ring if s != -1]
+ permutation = get_all_subsets(N_ring_list)
+ else:
+ permutation = list(itertools.product(*N_ring_list))
+ for perm in permutation: # each ring select one atom
+ perm = [x for x in perm if x != -1]
+ actions = itertools.product([0, 1], repeat=len(perm))
+ for action in actions: # add H or charge
+ mol = copy.deepcopy(mol_orig)
+ for idx, act_atom in zip(perm, action):
+ if act_atom == 0:
+ mol.GetAtomWithIdx(idx).SetNumExplicitHs(1)
+ else:
+ mol.GetAtomWithIdx(idx).SetFormalCharge(1)
+ try:
+ if strict:
+ mol, fixed = fix_valence(mol)
+ Chem.SanitizeMol(copy.deepcopy(mol))
+ fixed = True
+ Chem.SanitizeMol(mol)
+ break
+ except:
+ continue
+ if fixed:
+ break
+ return mol, fixed
+
+# Featurizers
+class PharmolixFMMoleculeFeaturizer(MoleculeFeaturizer):
+ def __init__(self, pos_norm=1.0, num_node_types=12, num_edge_types=6) -> None:
+ super().__init__()
+ self.atomic_numbers = [6, 7, 8, 9, 15, 16, 17, 5, 35, 53, 34]
+ self.mol_bond_types = [
+ 'empty',
+ Chem.rdchem.BondType.SINGLE,
+ Chem.rdchem.BondType.DOUBLE,
+ Chem.rdchem.BondType.TRIPLE,
+ Chem.rdchem.BondType.AROMATIC,
+ ]
+ self.pos_norm = pos_norm
+ self.num_node_types = num_node_types
+ self.num_edge_types = num_edge_types
+
+ def __call__(self, molecule: Molecule) -> Dict[str, Any]:
+ molecule._add_rdmol()
+ rdmol = molecule.rdmol
+ node_type_list = []
+ for atom in rdmol.GetAtoms():
+ node_type_list.append(safe_index(self.atomic_numbers, atom.GetAtomicNum()))
+ node_type = F.one_hot(torch.LongTensor(node_type_list), num_classes=self.num_node_types).float()
+ num_nodes = node_type.shape[0]
+
+ if molecule.conformer is not None:
+ pos = torch.tensor(molecule.conformer).float()
+ else:
+ pos = torch.zeros(num_nodes, 3)
+ # Move to center
+ pos -= pos.mean(0)
+ pos /= self.pos_norm
+
+ # Build halfedge
+ if len(rdmol.GetBonds()) <= 0:
+ halfedge_index = torch.empty((2, 0), dtype=torch.long)
+ halfedge_type = torch.empty(0, dtype=torch.long)
+ else:
+ halfedge_matrix = torch.zeros([num_nodes, num_nodes], dtype=torch.long)
+ for bond in rdmol.GetBonds():
+ i = bond.GetBeginAtomIdx()
+ j = bond.GetEndAtomIdx()
+ bond_type = safe_index(self.mol_bond_types, bond.GetBondType())
+ halfedge_matrix[i, j] = bond_type
+ halfedge_matrix[j, i] = bond_type
+ halfedge_index = torch.triu_indices(num_nodes, num_nodes, offset=1)
+ halfedge_type = F.one_hot(halfedge_matrix[halfedge_index[0], halfedge_index[1]], num_classes=self.num_edge_types).float()
+
+ # Is peptide
+ if getattr(molecule, "is_peptide", False):
+ is_peptide = torch.ones(num_nodes, dtype=torch.long)
+ else:
+ is_peptide = torch.zeros(num_nodes, dtype=torch.long)
+
+ return Data(**{
+ "pos": pos,
+ "node_type": node_type,
+ "halfedge_type": halfedge_type,
+ "halfedge_index": halfedge_index,
+ "is_peptide": is_peptide,
+ })
+
+ def decode(self, preds: Dict[str, torch.Tensor], pocket_center: Optional[List[float]]) -> Optional[Molecule]:
+ pos = preds["pos"] * self.pos_norm
+ if pocket_center is not None:
+ pos += pocket_center
+ num_atoms = pos.shape[0]
+
+ for key in preds:
+ preds[key] = preds[key].cpu().numpy()
+
+ # Add atoms and coordinates
+ rdmol = Chem.RWMol()
+ conf = Chem.Conformer()
+ for i in range(num_atoms):
+ atom = Chem.Atom(self.atomic_numbers[preds["node_type"][i]])
+ rdmol.AddAtom(atom)
+ atom_pos = Geometry.Point3D(*pos[i].tolist())
+ conf.SetAtomPosition(i, atom_pos)
+ rdmol.AddConformer(conf)
+
+ # Add bonds
+ bond_index = torch.triu_indices(num_atoms, num_atoms, offset=1).numpy()
+ for i in range(bond_index.shape[1]):
+ st, ed = bond_index[0][i], bond_index[1][i]
+ if preds["halfedge_type"][i] > 0:
+ rdmol.AddBond(int(st), int(ed), self.mol_bond_types[preds["halfedge_type"][i]])
+
+ # Check validity and fix N valence
+ mol = rdmol.GetMol()
+ try:
+ Chem.SanitizeMol(copy.deepcopy(mol))
+ fixed = True
+ Chem.SanitizeMol(mol)
+ except Exception as e:
+ fixed = False
+
+ if not fixed:
+ try:
+ Chem.Kekulize(copy.deepcopy(mol))
+ except Chem.rdchem.KekulizeException as e:
+ err = e
+ if 'Unkekulized' in err.args[0]:
+ try:
+ with time_limit(300):
+ mol, fixed = fix_aromatic(mol)
+ except Exception as e:
+ logging.warn('Timeout for fixing aromatic rings')
+ return None
+
+ # valence error for N
+ if not fixed:
+ try:
+ with time_limit(300):
+ mol, fixed = fix_valence(mol)
+ except Exception as e:
+ logging.warn('Timeout for fixing valence')
+ return None
+
+ if not fixed:
+ try:
+ with time_limit(300):
+ mol, fixed = fix_aromatic(mol, True)
+ except Exception as e:
+ logging.warn('Timeout for fixing aromatic rings')
+ return None
+
+ try:
+ Chem.SanitizeMol(mol)
+ except Exception as e:
+ logging.warn('Failed generate a valid molecule')
+ return None
+ return Molecule.from_rdmol(mol)
+
+class PharmolixFMPocketFeaturizer(PocketFeaturizer):
+ def __init__(self, knn: int=32, pos_norm: float=1.0) -> None:
+ super().__init__()
+
+ self.knn = knn
+ self.pos_norm = pos_norm
+ self.atomic_numbers = torch.LongTensor([6, 7, 8, 16]) # C, N, O, S
+ self.max_num_aa = 20
+
+ def __call__(self, pocket: Pocket) -> Dict[str, Any]:
+ elements = torch.LongTensor([atom["atomic_number"] for atom in pocket.atoms])
+ elements_one_hot = (elements.view(-1, 1) == self.atomic_numbers.view(1, -1)).long()
+ aa_type = torch.LongTensor([atom["aa_type"] for atom in pocket.atoms])
+ aa_one_hot = F.one_hot(aa_type, num_classes=self.max_num_aa)
+ is_backbone = torch.LongTensor([atom["is_backbone"] for atom in pocket.atoms]).unsqueeze(-1)
+
+ x = torch.cat([elements_one_hot, aa_one_hot, is_backbone], dim=-1).float()
+ pos = torch.tensor(pocket.conformer, dtype=torch.float32)
+ knn_edge_index = knn_graph(pos, k=self.knn, flow='target_to_source')
+ pocket_center = pos.mean(dim=0)
+ pos -= pocket_center
+ pos /= self.pos_norm
+
+ return Data(**{
+ "atom_feature": x,
+ "knn_edge_index": knn_edge_index,
+ "pos": pos,
+ "pocket_center": pocket_center.unsqueeze(0),
+ "estimated_ligand_num_atoms": torch.tensor(estimate_ligand_atom_num(pocket)).unsqueeze(0),
+ })
+
+# Model Layers
+class MLP(nn.Module):
+ """MLP with the same hidden dim across all layers."""
+ NONLINEARITIES = {
+ "tanh": nn.Tanh(),
+ "relu": nn.ReLU(),
+ "softplus": nn.Softplus(),
+ "elu": nn.ELU(),
+ 'silu': nn.SiLU()
+ }
+
+ def __init__(self, in_dim, out_dim, hidden_dim, num_layer=2, norm=True, act_fn='relu', act_last=False):
+ super().__init__()
+ layers = []
+ for layer_idx in range(num_layer):
+ if layer_idx == 0:
+ layers.append(nn.Linear(in_dim, hidden_dim))
+ elif layer_idx == num_layer - 1:
+ layers.append(nn.Linear(hidden_dim, out_dim))
+ else:
+ layers.append(nn.Linear(hidden_dim, hidden_dim))
+ if layer_idx < num_layer - 1 or act_last:
+ if norm:
+ layers.append(nn.LayerNorm(hidden_dim))
+ layers.append(self.NONLINEARITIES[act_fn])
+ self.net = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.net(x)
+
+class GaussianSmearing(nn.Module):
+ def __init__(self, start=0.0, stop=10.0, num_gaussians=50, type_='exp'):
+ super().__init__()
+ self.start = start
+ self.stop = stop
+ if type_ == 'exp':
+ offset = torch.exp(torch.linspace(start=np.log(start+1), end=np.log(stop+1), steps=num_gaussians)) - 1
+ elif type_ == 'linear':
+ offset = torch.linspace(start=start, end=stop, steps=num_gaussians)
+ else:
+ raise NotImplementedError('type_ must be either exp or linear')
+ diff = torch.diff(offset)
+ diff = torch.cat([diff[:1], diff])
+ coeff = -0.5 / (diff**2)
+ self.register_buffer('coeff', coeff)
+ self.register_buffer('offset', offset)
+
+ def forward(self, dist):
+ dist = dist.clamp_min(self.start)
+ dist = dist.clamp_max(self.stop)
+ dist = dist.view(-1, 1) - self.offset.view(1, -1)
+ return torch.exp(self.coeff * torch.pow(dist, 2))
+
+class ContextNodeBlock(nn.Module):
+ def __init__(self, node_dim, edge_dim, hidden_dim, gate_dim,
+ context_dim=0, context_edge_dim=0, layernorm_before=False):
+ super().__init__()
+ self.node_dim = node_dim
+ self.edge_dim = edge_dim
+ self.gate_dim = gate_dim
+ self.context_dim = context_dim
+ self.context_edge_dim = context_edge_dim
+ self.layernorm_before = layernorm_before
+
+ self.node_net = MLP(node_dim, hidden_dim, hidden_dim)
+ self.edge_net = MLP(edge_dim, hidden_dim, hidden_dim)
+ self.msg_net = nn.Linear(hidden_dim, hidden_dim)
+
+ if self.gate_dim > 0:
+ self.gate = MLP(edge_dim+(node_dim+gate_dim)*2, hidden_dim, hidden_dim)
+
+ self.centroid_lin = nn.Linear(node_dim, hidden_dim)
+ self.layer_norm = nn.LayerNorm(hidden_dim)
+ # self.act = nn.ReLU()
+ # self.out_transform = Linear(hidden_dim, node_dim)
+ self.out_layer = MLP(hidden_dim, node_dim, hidden_dim)
+
+ if self.context_dim > 0:
+ self.ctx_node_net = MLP(context_dim, hidden_dim, hidden_dim)
+ self.ctx_edge_net = MLP(context_edge_dim, hidden_dim, hidden_dim)
+ self.ctx_msg_net = nn.Linear(hidden_dim, hidden_dim)
+ self.ctx_gate = MLP(context_dim+context_edge_dim+(node_dim+gate_dim), hidden_dim, hidden_dim)
+
+ def forward(self, x, edge_index, edge_attr, node_extra,
+ ctx_x=None, ctx_edge_index=None, ctx_edge_attr=None):
+ """
+ Args:
+ x: Node features, (N, H).
+ edge_index: (2, E).
+ edge_attr: (E, H)
+ """
+ N = x.size(0)
+ row, col = edge_index # (E,) , (E,)
+
+ h_node = self.node_net(x) # (N, H)
+
+ # Compose messages
+ h_edge = self.edge_net(edge_attr) # (E, H_per_head)
+ msg_j = self.msg_net(h_edge + h_node[col] + h_node[row])
+
+ if self.gate_dim > 0:
+ gate = self.gate(torch.cat([edge_attr, x[col], node_extra[col], x[row], node_extra[row]], dim=-1))
+ msg_j = msg_j * torch.sigmoid(gate)
+
+ # Aggregate messages
+ aggr_msg = scatter_sum(msg_j, row, dim=0, dim_size=N)
+ out = self.centroid_lin(x) + aggr_msg
+
+ # context messages
+ if ctx_x is not None:
+ row, col = ctx_edge_index
+ h_ctx = self.ctx_node_net(ctx_x)
+ h_ctx_edge = self.ctx_edge_net(ctx_edge_attr)
+ msg_ctx = self.ctx_msg_net(h_ctx_edge * h_ctx[col])
+ if self.gate_dim > 0:
+ gate = self.ctx_gate(torch.cat([ctx_edge_attr, ctx_x[col], x[row], node_extra[row]], dim=-1))
+ msg_ctx = msg_ctx * torch.sigmoid(gate)
+ aggred_ctx_msg = scatter_sum(msg_ctx, row, dim=0, dim_size=N)
+ out = out + aggred_ctx_msg
+
+ # output. skip connection
+ out = self.out_layer(out)
+ if not self.layernorm_before:
+ out = self.layer_norm(out + x)
+ else:
+ out = self.layer_norm(out) + x
+ return out
+
+class BondFFN(nn.Module):
+ def __init__(self, bond_dim, node_dim, inter_dim, gate_dim, out_dim=None):
+ super().__init__()
+ out_dim = bond_dim if out_dim is None else out_dim
+ self.gate_dim = gate_dim
+ self.bond_linear = nn.Linear(bond_dim, inter_dim, bias=False)
+ self.node_linear = nn.Linear(node_dim, inter_dim, bias=False)
+ self.inter_module = MLP(inter_dim, out_dim, inter_dim)
+ if self.gate_dim > 0:
+ self.gate = MLP(bond_dim+node_dim+gate_dim, out_dim, 32)
+
+ def forward(self, bond_feat_input, node_feat_input, extra):
+ bond_feat = self.bond_linear(bond_feat_input)
+ node_feat = self.node_linear(node_feat_input)
+ inter_feat = bond_feat + node_feat
+ inter_feat = self.inter_module(inter_feat)
+ if self.gate_dim > 0:
+ gate = self.gate(torch.cat([bond_feat_input, node_feat_input, extra], dim=-1))
+ inter_feat = inter_feat * torch.sigmoid(gate)
+ return inter_feat
+
+
+class EdgeBlock(nn.Module):
+ def __init__(self, edge_dim, node_dim, hidden_dim=None, gate_dim=0, layernorm_before=False):
+ super().__init__()
+ self.gate_dim = gate_dim
+ inter_dim = edge_dim * 2 if hidden_dim is None else hidden_dim
+ self.layernorm_before = layernorm_before
+
+ self.bond_ffn_left = BondFFN(edge_dim, node_dim, inter_dim=inter_dim, gate_dim=gate_dim)
+ self.bond_ffn_right = BondFFN(edge_dim, node_dim, inter_dim=inter_dim, gate_dim=gate_dim)
+
+ self.msg_left = nn.Linear(edge_dim, edge_dim)
+ self.msg_right = nn.Linear(edge_dim, edge_dim)
+
+ self.node_ffn_left = nn.Linear(node_dim, edge_dim)
+ self.node_ffn_right = nn.Linear(node_dim, edge_dim)
+
+ self.self_ffn = nn.Linear(edge_dim, edge_dim)
+ self.layer_norm = nn.LayerNorm(edge_dim)
+ self.out_layer = MLP(edge_dim, edge_dim, edge_dim)
+
+ def forward(self, h_bond, bond_index, h_node, bond_extra):
+ """
+ h_bond: (b, bond_dim)
+ bond_index: (2, b)
+ h_node: (n, node_dim)
+ """
+ N = h_node.size(0)
+ left_node, right_node = bond_index
+
+ # message from neighbor bonds
+ msg_bond_left = self.bond_ffn_left(h_bond, h_node[left_node], bond_extra)
+ msg_bond_left = scatter_sum(msg_bond_left, right_node, dim=0, dim_size=N)
+ msg_bond_left = msg_bond_left[left_node]
+
+ msg_bond_right = self.bond_ffn_right(h_bond, h_node[right_node], bond_extra)
+ msg_bond_right = scatter_sum(msg_bond_right, left_node, dim=0, dim_size=N)
+ msg_bond_right = msg_bond_right[right_node]
+
+ h_bond_update = (
+ self.msg_left(msg_bond_left)
+ + self.msg_right(msg_bond_right)
+ + self.node_ffn_left(h_node[left_node])
+ + self.node_ffn_right(h_node[right_node])
+ + self.self_ffn(h_bond)
+ )
+ h_bond_update = self.out_layer(h_bond_update)
+
+ # skip connection
+ if not self.layernorm_before:
+ h_bond = self.layer_norm(h_bond_update + h_bond)
+ else:
+ h_bond = self.layer_norm(h_bond_update) + h_bond
+ return h_bond
+
+class PosUpdate(nn.Module):
+ def __init__(self, node_dim, edge_dim, hidden_dim, gate_dim, node_dim_right=None):
+ super().__init__()
+ self.left_lin_edge = MLP(node_dim, node_dim, hidden_dim)
+ node_dim_right = node_dim if node_dim_right is None else node_dim_right
+ self.right_lin_edge = MLP(node_dim_right, node_dim, hidden_dim)
+ self.edge_lin = BondFFN(edge_dim, node_dim*2, node_dim, gate_dim, out_dim=1)
+ self.pos_scale_net = nn.Sequential(MLP(node_dim+1+2, 1, hidden_dim), nn.Sigmoid())
+
+ def forward(self, h_node, h_edge, edge_index, relative_vec, distance, node_extra, edge_extra=None, h_node_right=None):
+ edge_index_left, edge_index_right = edge_index
+
+ left_feat = self.left_lin_edge(h_node[edge_index_left])
+ h_node_right = h_node if h_node_right is None else h_node_right
+ right_feat = self.right_lin_edge(h_node_right[edge_index_right])
+ both_extra = node_extra[edge_index_left]
+ if edge_extra is not None:
+ both_extra = torch.cat([both_extra, edge_extra], dim=-1)
+ weight_edge = self.edge_lin(h_edge,
+ torch.cat([left_feat, right_feat], dim=-1),
+ both_extra)
+
+ force_edge = weight_edge * relative_vec / (distance.unsqueeze(-1) + 1e-6) / (distance.unsqueeze(-1) + 5.) * 5
+ delta_pos = scatter_sum(force_edge, edge_index_left, dim=0, dim_size=h_node.shape[0])
+ delta_pos = delta_pos * self.pos_scale_net(torch.cat([h_node, node_extra,
+ torch.norm(delta_pos, dim=-1, keepdim=True)], dim=-1))
+ return delta_pos
+
+class ContextNodeEdgeNet(nn.Module):
+ def __init__(self, node_dim, edge_dim, hidden_dim,
+ num_blocks, dist_cfg, gate_dim=0,
+ context_dim=0, context_cfg=None,
+ node_only=False, **kwargs):
+ super().__init__()
+ self.node_dim = node_dim
+ self.edge_dim = edge_dim
+ self.num_blocks = num_blocks
+ self.dist_cfg = dist_cfg
+ self.gate_dim = gate_dim
+ self.node_only = node_only
+ self.kwargs = kwargs
+ self.downsample_context = kwargs.get('downsample_context', False)
+ self.layernorm_before = kwargs.get("layernorm_before", False)
+
+ self.distance_expansion = GaussianSmearing(**dist_cfg)
+ num_gaussians = dist_cfg['num_gaussians']
+ input_edge_dim = num_gaussians + (0 if node_only else edge_dim)
+
+ # for context
+ self.context_cfg = context_cfg
+ if context_cfg is not None:
+ context_edge_dim = context_cfg['edge_dim']
+ self.knn = context_cfg['knn']
+ self.dist_exp_ctx = GaussianSmearing(**context_cfg['dist_cfg'])
+ input_context_edge_dim = context_cfg['dist_cfg']['num_gaussians']
+ assert context_dim > 0, 'context_dim should be larger than 0 if context_cfg is not None'
+ assert not node_only, 'not support node_only with context'
+ else:
+ context_edge_dim = 0
+
+ # node network
+ self.edge_embs = nn.ModuleList()
+ self.node_blocks_with_edge = nn.ModuleList()
+ if not node_only:
+ self.edge_blocks = nn.ModuleList()
+ self.pos_blocks = nn.ModuleList()
+ if self.context_cfg is not None:
+ self.ctx_edge_embs = nn.ModuleList()
+ self.ctx_pos_blocks = nn.ModuleList()
+ for _ in range(num_blocks):
+ # edge emb
+ self.edge_embs.append(nn.Linear(input_edge_dim, edge_dim))
+ # node update
+ self.node_blocks_with_edge.append(ContextNodeBlock(
+ node_dim, edge_dim, hidden_dim, gate_dim,
+ context_dim, context_edge_dim, layernorm_before=self.layernorm_before
+ ))
+ if node_only:
+ continue
+ # edge update
+ self.edge_blocks.append(EdgeBlock(
+ edge_dim=edge_dim, node_dim=node_dim, gate_dim=gate_dim, layernorm_before=self.layernorm_before
+ ))
+ # pos update
+ self.pos_blocks.append(PosUpdate(
+ node_dim, edge_dim, hidden_dim=edge_dim, gate_dim=gate_dim*2,
+ ))
+ if self.context_cfg is not None:
+ self.ctx_edge_embs.append(nn.Linear(input_context_edge_dim, context_edge_dim))
+ self.ctx_pos_blocks.append(PosUpdate(
+ node_dim, context_edge_dim, hidden_dim=edge_dim, gate_dim=gate_dim,
+ node_dim_right=context_dim,
+ ))
+
+ def forward(self, h_node, pos_node, h_edge, edge_index,
+ node_extra, edge_extra, batch_node=None,
+ h_ctx=None, pos_ctx=None, batch_ctx=None):
+ """
+ graph node/edge features
+ h_node: (n_node, node_dim)
+ pos_node: (n_node, 3)
+ h_edge: (n_edge, edge_dim)
+ edge_index: (2, n_edge)
+ node_extra: (n_node, node_extra_dim)
+ edge_extra: (n_edge, edge_extra_dim)
+ batch_node: (n_node, )
+ context node features
+ h_ctx: (n_ctx, ctx_dim)
+ pos_ctx: (n_ctx, 3)
+ batch_ctx: (n_ctx, )
+ Output:
+ h_node: (n_node, node_dim)
+ h_edge: (n_edge, edge_dim)
+ pos_node: (n_node, 3)
+ """
+
+ for i in range(self.num_blocks):
+ # # remake edge fetures (distance have been changed in each iteration)
+ if (i==0) or (not self.node_only):
+ h_dist, relative_vec, distance = self._build_edges_dist(pos_node, edge_index)
+ if not self.node_only:
+ h_edge = torch.cat([h_edge, h_dist], dim=-1)
+ else:
+ h_edge = h_dist
+ h_edge = self.edge_embs[i](h_edge)
+
+ # # edge with context
+ if h_ctx is not None:
+ h_ctx_edge, vec_ctx, dist_ctx, ctx_knn_edge_index = self._build_context_edges_dist(
+ pos_node, pos_ctx, batch_node, batch_ctx)
+ h_ctx_edge = self.ctx_edge_embs[i](h_ctx_edge)
+ else:
+ ctx_knn_edge_index = None
+ h_ctx_edge = None
+
+ # # node feature updates
+ h_node = self.node_blocks_with_edge[i](h_node, edge_index, h_edge, node_extra,
+ h_ctx, ctx_knn_edge_index, h_ctx_edge)
+ if self.node_only:
+ continue
+
+ # # edge feature updates
+ h_edge = self.edge_blocks[i](h_edge, edge_index, h_node, edge_extra)
+
+ # # pos updates
+ pos_node = pos_node + self.pos_blocks[i](h_node, h_edge, edge_index, relative_vec, distance, node_extra, edge_extra)
+ if h_ctx is not None:
+ pos_node = pos_node + self.ctx_pos_blocks[i](
+ h_node, h_ctx_edge, ctx_knn_edge_index, vec_ctx, dist_ctx, node_extra,
+ edge_extra=None, h_node_right=h_ctx)
+
+ if self.node_only:
+ return h_node
+ else:
+ return h_node, pos_node, h_edge
+
+ def _build_edges_dist(self, pos, edge_index):
+ # distance
+ relative_vec = pos[edge_index[0]] - pos[edge_index[1]]
+ distance = torch.norm(relative_vec, dim=-1, p=2)
+ h_dist = self.distance_expansion(distance)
+ return h_dist, relative_vec, distance
+
+ def _build_context_edges_dist(self, pos, pos_ctx, batch_node, batch_ctx):
+ # build knn edge index
+ if self.knn < 100:
+ if self.downsample_context:
+ pos_ctx_noised = pos_ctx + torch.randn_like(pos_ctx) * 5 # works like masked position information
+ else:
+ pos_ctx_noised = pos_ctx
+ ctx_knn_edge_index = knn(y=pos, x=pos_ctx_noised, k=self.knn,
+ batch_x=batch_ctx, batch_y=batch_node)
+ else: # fully connected x-yf
+ device = pos.device
+ ctx_knn_edge_index = []
+ cum_node = 0
+ cum_ctx = 0
+ for i_batch in range(batch_ctx.max()+1):
+ num_ctx = (batch_ctx==i_batch).sum()
+ num_node = (batch_node==i_batch).sum()
+ ctx_knn_edge_index_this = torch.stack(
+ torch.meshgrid(
+ torch.arange(num_node, device=device) + cum_node,
+ torch.arange(num_ctx, device=device) + cum_ctx,
+ )).view(2, -1)
+ cum_node += num_node
+ cum_ctx += num_ctx
+ ctx_knn_edge_index.append(ctx_knn_edge_index_this)
+ ctx_knn_edge_index = torch.cat(ctx_knn_edge_index, dim=-1)
+
+ relative_vec = pos[ctx_knn_edge_index[0]] - pos_ctx[ctx_knn_edge_index[1]]
+ distance = torch.norm(relative_vec, dim=-1, p=2)
+ h_dist = self.dist_exp_ctx(distance)
+ return h_dist, relative_vec, distance, ctx_knn_edge_index
+
+class PharmolixFM(PocketMolDockModel, StructureBasedDrugDesignModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(PharmolixFM, self).__init__(model_cfg)
+ self.config = model_cfg
+ self.num_node_types = model_cfg.num_node_types
+ self.num_edge_types = model_cfg.num_edge_types
+
+ # # pocket encoder
+ pocket_dim = model_cfg.pocket_dim
+ self.pocket_embedder = nn.Linear(model_cfg.pocket_in_dim, pocket_dim)
+ self.pocket_encoder = ContextNodeEdgeNet(pocket_dim, node_only=True, **model_cfg.pocket.todict())
+
+ # # mol embedding
+ self.addition_node_features = getattr(model_cfg, 'addition_node_features', [])
+ node_dim = model_cfg.node_dim
+ edge_dim = model_cfg.edge_dim
+ node_emb_dim = node_dim - len(self.addition_node_features)
+ edge_emb_dim = edge_dim
+ self.nodetype_embedder = nn.Linear(self.num_node_types + 2, node_emb_dim) # t_pos_in and t_node_in
+ self.edgetype_embedder = nn.Linear(self.num_edge_types + 2, edge_emb_dim) # t_halfedge_in and fixed_halfdist
+
+ # # bfn backbone
+ self.denoiser = ContextNodeEdgeNet(node_dim, edge_dim,
+ context_dim=pocket_dim, **model_cfg.denoiser.todict())
+
+ # # decoder for discrete variables
+ self.node_decoder = MLP(node_dim, self.num_node_types, node_dim)
+ self.edge_decoder = MLP(edge_dim, self.num_edge_types, edge_dim)
+
+ # additional output
+ self.add_output = getattr(model_cfg, 'add_output', [])
+ if 'confidence' in self.add_output: # condidence
+ self.node_cfd = MLP(node_dim, 1, node_dim // 2)
+ self.pos_cfd = MLP(node_dim, 1, node_dim // 2)
+ self.edge_cfd = MLP(edge_dim, 1, edge_dim // 2)
+
+ self.featurizers = {
+ "molecule": PharmolixFMMoleculeFeaturizer(model_cfg.pos_norm),
+ "pocket": PharmolixFMPocketFeaturizer(model_cfg.pocket_knn, model_cfg.pos_norm),
+ }
+ self.collators = {
+ "molecule": PygCollator(follow_batch=["pos", "node_type", "halfedge_type"]),
+ "pocket": PygCollator(follow_batch=["pos"])
+ }
+
+ for parent in reversed(type(self).__mro__[1:-1]):
+ if hasattr(parent, '_add_task'):
+ parent._add_task(self)
+
+ def continuous_var_bayesian_update(self, t: torch.Tensor, x: torch.Tensor, fixed_pos: torch.Tensor=None, orig_x: torch.Tensor=None) -> torch.Tensor:
+ # Eq.(77): p_F(θ|x;t) ~ N (μ | γ(t)x, γ(t)(1 − γ(t))I)
+ gamma = (1 - torch.pow(self.config.sigma1, 2 * t)).unsqueeze(1) # [B]
+ mu = gamma * x + torch.sqrt((gamma + 0.01) * (1 - gamma)) * torch.randn_like(x)
+ if fixed_pos is not None:
+ mu[torch.where(fixed_pos)] = orig_x[torch.where(fixed_pos)]
+ return mu, gamma
+
+ def discrete_var_bayesian_update(self, t: torch.Tensor, x: torch.Tensor, K: int, fixed_pos: torch.Tensor=None, orig_x: torch.Tensor=None) -> torch.Tensor:
+ # Eq.(182): β(t) = t**2 β(1)
+ beta = (self.config.beta1 * (t**2)).unsqueeze(1) # (B,)
+
+ # Eq.(185): p_F(θ|x;t) = E_{N(y | β(t)(Ke_x−1), β(t)KI)} δ (θ − softmax(y))
+ # can be sampled by first drawing y ~ N(y | β(t)(Ke_x−1), β(t)KI)
+ # then setting θ = softmax(y)
+ one_hot_x = x # (N, K)
+ mean = beta * (K * one_hot_x - 1)
+ std = (beta * K).sqrt()
+ eps = torch.randn_like(mean)
+ y = mean + std * eps
+ theta = F.softmax(y, dim=-1)
+ if fixed_pos is not None:
+ theta[torch.where(fixed_pos)] = orig_x[torch.where(fixed_pos)]
+ return theta
+
+ def create_dummy_molecule(self, pocket: Featurized[Pocket]) -> Featurized[Molecule]:
+ num_atoms = pocket["estimated_ligand_num_atoms"].cpu()
+ num_halfedge = (num_atoms ** 2 - num_atoms) // 2
+ batch_size = num_atoms.shape[0]
+ halfedge_index = []
+ cur_num = 0
+ for num in num_atoms:
+ halfedge_index.append(torch.triu_indices(num, num, offset=1) + cur_num)
+ cur_num += num
+
+ return Data(**{
+ "pos": torch.randn(num_atoms.sum().item(), 3) * 0.01,
+ "node_type": torch.ones(num_atoms.sum().item(), self.num_node_types) / self.num_node_types,
+ "halfedge_type": torch.ones(num_halfedge.sum().item(), self.num_edge_types) / self.num_edge_types,
+ "is_peptide": torch.zeros(num_atoms.sum().item(), dtype=torch.long),
+ "halfedge_index": torch.cat(halfedge_index, dim=1),
+ "pos_batch": torch.repeat_interleave(torch.arange(batch_size), num_atoms),
+ "node_type_batch": torch.repeat_interleave(torch.arange(batch_size), num_atoms),
+ "halfedge_type_batch": torch.repeat_interleave(torch.arange(batch_size), num_halfedge),
+ }).to(pocket["atom_feature"].device)
+
+ def model_forward(self,
+ molecule: Featurized[Molecule],
+ pocket: Optional[Featurized[Pocket]],
+ ) -> Dict[str, torch.Tensor]:
+ pos_in = molecule['pos']
+
+ if len(molecule['node_type'].shape) <= 1:
+ molecule['node_type'] = F.one_hot(molecule['node_type'], self.num_node_types).float()
+ molecule['halfedge_type'] = F.one_hot(molecule['halfedge_type'], self.num_edge_types).float()
+ if 't_node_type' not in molecule:
+ molecule['t_node_type'] = torch.ones(molecule['node_type'].shape[0], dtype=torch.float, device=molecule['node_type'].device)
+ molecule['t_halfedge_type'] = torch.ones(molecule['halfedge_type'].shape[0], dtype=torch.float, device=molecule['halfedge_type'].device)
+
+ h_node_in = molecule['node_type']
+ h_halfedge_in = molecule['halfedge_type']
+
+ # add t indicator as extra features
+ node_extra = torch.stack([molecule['t_node_type'], molecule['t_pos']], dim=1).to(pos_in.dtype)
+ halfedge_extra = torch.stack([molecule['t_halfedge_type'], molecule['fixed_halfdist']], dim=1).to(pos_in.dtype)
+ h_node_in = torch.cat([h_node_in, node_extra], dim=-1)
+ h_halfedge_in = torch.cat([h_halfedge_in, halfedge_extra], dim=-1)
+
+ # from 1/K \in [0,1] to 2/K-1 \in [-1,1]
+ h_node_in = self.nodetype_embedder(2 * h_node_in - 1)
+ h_halfedge_in = self.edgetype_embedder(2 * h_halfedge_in - 1)
+
+ # break symmetry
+ n_halfedges = h_halfedge_in.shape[0]
+ halfedge_index = molecule['halfedge_index']
+ edge_index = torch.cat([halfedge_index, halfedge_index.flip(0)], dim=1)
+ h_edge_in = torch.cat([h_halfedge_in, h_halfedge_in], dim=0)
+ edge_extra = torch.cat([halfedge_extra, halfedge_extra], dim=0)
+
+ # additonal node features
+ if 'is_peptide' in self.addition_node_features:
+ is_peptide = molecule['is_peptide'].unsqueeze(-1).to(pos_in.dtype)
+ h_node_in = torch.cat([h_node_in, is_peptide], dim=-1)
+
+ # # encode pocket
+ h_pocket = self.pocket_embedder(pocket['atom_feature'])
+ h_pocket = self.pocket_encoder(
+ h_node=h_pocket,
+ pos_node=pocket['pos'],
+ edge_index=pocket['knn_edge_index'],
+ h_edge=None,
+ node_extra=None,
+ edge_extra=None,
+ )
+
+ # # 2 interdependency modeling
+ h_node, pred_pos, h_edge = self.denoiser(
+ h_node=h_node_in,
+ pos_node=pos_in,
+ h_edge=h_edge_in,
+ edge_index=edge_index,
+ node_extra=node_extra,
+ edge_extra=edge_extra,
+ batch_node=molecule['node_type_batch'],
+ # pocket
+ h_ctx=h_pocket,
+ pos_ctx=pocket['pos'],
+ batch_ctx=pocket['pos_batch'],
+ )
+
+ # # 3 predict the variables
+ # for discrete, we take softmax
+ node_logits = self.node_decoder(h_node)
+ pred_node = F.softmax(node_logits, dim=-1)
+ halfedge_logits = self.edge_decoder(h_edge[:n_halfedges] + h_edge[n_halfedges:])
+ pred_halfedge = F.softmax(halfedge_logits, dim=-1)
+
+ additional_outputs = {}
+ if 'confidence' in self.add_output:
+ pred_node_cfd = self.node_cfd(h_node)
+ pred_pos_cfd = self.pos_cfd(h_node) # use the node hidden
+ pred_edge_cfd = self.edge_cfd(h_edge[:n_halfedges]+h_edge[n_halfedges:]) # NOTE why not divide by 2?
+ additional_outputs = {'confidence_node_type': pred_node_cfd, 'confidence_pos': pred_pos_cfd, 'confidence_halfedge_type': pred_edge_cfd}
+
+ return {
+ 'pos': pred_pos,
+ 'node_type': pred_node,
+ 'halfedge_type': pred_halfedge,
+ **additional_outputs,
+ }
+
+ @torch.no_grad()
+ def sample(self,
+ molecule: Featurized[Molecule],
+ pocket: Optional[Featurized[Pocket]]=None,
+ ) -> List[Molecule]:
+ # Initialization
+ device = molecule['pos'].device
+
+ molecule_in = {
+ "pos": torch.randn_like(molecule['pos']) * 0.01,
+ "node_type": torch.ones_like(molecule['node_type']) / self.config.num_node_types,
+ "halfedge_type": torch.ones_like(molecule['halfedge_type']) / self.config.num_edge_types,
+ }
+ in_traj, out_traj, cfd_traj = {}, {}, {}
+ for key in molecule_in:
+ fixed = molecule[f"fixed_{key}"]
+ if fixed is not None:
+ molecule_in[key][fixed] = molecule[key][fixed]
+ molecule[key] = molecule_in[key]
+ in_traj[key] = []
+ out_traj[key] = []
+ cfd_traj[key] = []
+
+ # BFN update
+ for step in tqdm(range(1, self.config.num_sample_steps + 1), desc="Sampling"):
+ t = torch.ones(1, dtype=torch.float, device=device) * (step - 1) / self.config.num_sample_steps
+ t_in = {
+ "pos": t.repeat(molecule["pos"].shape[0]),
+ "node_type": t.repeat(molecule["pos"].shape[0]),
+ "halfedge_type": t.repeat(molecule["halfedge_type"].shape[0]),
+ }
+ for key in t_in:
+ fixed = molecule[f"fixed_{key}"]
+ t_in[key][torch.where(fixed)] = 1
+ molecule[f"t_{key}"] = t_in[key]
+ outputs_step = self.model_forward(molecule, pocket)
+ for key in t_in:
+ in_traj[key].append(copy.deepcopy(molecule[key]))
+ out_traj[key].append(copy.deepcopy(outputs_step[key]))
+ cfd_traj[key].append(copy.deepcopy(outputs_step[f"confidence_{key}"]))
+
+ # Destination prediction
+ if step == self.config.num_sample_steps:
+ for key in t_in:
+ molecule[key] = outputs_step[key]
+ continue
+
+ molecule["pos"], _ = self.continuous_var_bayesian_update(
+ t_in["pos"], outputs_step["pos"],
+ fixed_pos=molecule["fixed_pos"], orig_x=molecule["pos"]
+ )
+ molecule["node_type"] = self.discrete_var_bayesian_update(
+ t_in["node_type"], outputs_step["node_type"], self.num_node_types,
+ fixed_pos=molecule["fixed_node_type"], orig_x=molecule["node_type"]
+ )
+ molecule["halfedge_type"] = self.discrete_var_bayesian_update(
+ t_in["halfedge_type"], outputs_step["halfedge_type"], self.num_edge_types,
+ fixed_pos=molecule["fixed_halfedge_type"], orig_x=molecule["halfedge_type"]
+ )
+
+ # Concat trajectories
+ for key in molecule_in:
+ in_traj[key] = torch.stack(in_traj[key], dim=0)
+ out_traj[key] = torch.stack(out_traj[key], dim=0)
+ cfd_traj[key] = torch.stack(cfd_traj[key], dim=0)
+
+ # Split and reconstruct molecule
+ num_mols = molecule["node_type_batch"].max() + 1
+ in_traj_split, out_traj_split, cfd_traj_split = [], [], []
+ out_molecules = []
+ for i in tqdm(range(num_mols), desc="Post processing molecules..."):
+ in_traj_split.append({})
+ out_traj_split.append({})
+ cfd_traj_split.append({})
+ cur_molecule = {}
+ for key in molecule_in:
+ idx = torch.where(molecule[f"{key}_batch"] == i)[0]
+ in_traj_split[i][key] = in_traj[key][:, idx, :]
+ out_traj_split[i][key] = out_traj[key][:, idx, :]
+ cfd_traj_split[i][key] = cfd_traj[key][:, idx, :]
+ cur_molecule[key] = out_traj_split[i][key][-1]
+ cur_molecule["node_type"] = torch.argmax(cur_molecule["node_type"], dim=-1)
+ cur_molecule["halfedge_type"] = torch.argmax(cur_molecule["halfedge_type"], dim=-1)
+ out_molecules.append(self.featurizers["molecule"].decode(cur_molecule, pocket["pocket_center"][i]))
+ """
+ import pickle
+ from datetime import datetime
+ pickle.dump({
+ "in_traj": in_traj_split[0],
+ "out_traj": out_traj_split[0],
+ "cfd_traj": cfd_traj_split[0],
+ }, open(f"./tmp/debug_traj_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pkl", "wb"))
+ """
+ return out_molecules
+
+ # TODO: implement training of PharMolixFM
+ def forward_pocket_molecule_docking(self, pocket: Featurized[Pocket], label: Featurized[Molecule]) -> Dict[str, torch.Tensor]:
+ pass
+
+ def forward_structure_based_drug_design(self, pocket: List[Pocket], label: List[Molecule]) -> Dict[str, torch.Tensor]:
+ pass
+
+ def predict_pocket_molecule_docking(self,
+ molecule: Featurized[Molecule],
+ pocket: Featurized[Pocket],
+ ) -> List[Molecule]:
+ molecule["fixed_pos"] = torch.zeros(molecule["pos"].shape[0], dtype=torch.bool, device=molecule["pos"].device)
+ molecule["fixed_node_type"] = torch.ones(molecule["node_type"].shape[0], dtype=torch.bool, device=molecule["node_type"].device)
+ molecule["fixed_halfedge_type"] = torch.ones(molecule["halfedge_type"].shape[0], dtype=torch.bool, device=molecule["halfedge_type"].device)
+ molecule["fixed_halfdist"] = torch.zeros(molecule["halfedge_type"].shape[0], device=molecule["halfedge_type"].device)
+ return self.sample(molecule, pocket)
+
+ def predict_structure_based_drug_design(self,
+ pocket: Featurized[Pocket]
+ ) -> List[Molecule]:
+ molecule = self.create_dummy_molecule(pocket)
+ molecule["fixed_pos"] = torch.zeros(molecule["pos"].shape[0], dtype=torch.bool, device=molecule["pos"].device)
+ molecule["fixed_node_type"] = torch.zeros(molecule["node_type"].shape[0], dtype=torch.bool, device=molecule["node_type"].device)
+ molecule["fixed_halfedge_type"] = torch.zeros(molecule["halfedge_type"].shape[0], dtype=torch.bool, device=molecule["halfedge_type"].device)
+ molecule["fixed_halfdist"] = torch.zeros(molecule["halfedge_type"].shape[0], device=molecule["halfedge_type"].device)
+ return self.sample(molecule, pocket)
\ No newline at end of file
diff --git a/open_biomed/models/functional_model.py b/open_biomed/models/functional_model.py
new file mode 100644
index 0000000000000000000000000000000000000000..4a17ea24a43cb75a6e83d5e771a5b1ac634043d4
--- /dev/null
+++ b/open_biomed/models/functional_model.py
@@ -0,0 +1,116 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Optional, Tuple, Union
+from enum import Enum, auto
+
+import torch
+
+from open_biomed.data import Molecule, Protein, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import MoleculeFeaturizer, ProteinFeaturizer, TextFeaturizer, Featurized
+
+class MoleculeModel(BaseModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(MoleculeModel, self).__init__(model_cfg)
+
+ @abstractmethod
+ def get_molecule_processor(self) -> Tuple[MoleculeFeaturizer, Collator]:
+ raise NotImplementedError
+
+class MoleculeEncoder(MoleculeModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(MoleculeEncoder, self).__init__(model_cfg)
+
+ @abstractmethod
+ def encode_loss(self, label: Featurized[Molecule], **kwargs) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def encode_molecule(self, molecule: Union[List[Molecule], Any]) -> torch.Tensor:
+ raise NotImplementedError
+
+class MoleculeDecoder(MoleculeModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(MoleculeDecoder, self).__init__(model_cfg)
+
+ @abstractmethod
+ def generate_loss(self, label: Featurized[Molecule], **kwargs) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def generate_molecule(self, **kwargs) -> List[Molecule]:
+ raise NotImplementedError
+
+class ProteinModel(BaseModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ @abstractmethod
+ def get_protein_processor(self) -> Tuple[ProteinFeaturizer, Collator]:
+ raise NotImplementedError
+
+class ProteinEncoder(ProteinModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ @abstractmethod
+ def encode_protein(self, protein: Union[Featurized[Protein], List[Protein]], **kwargs) -> torch.Tensor:
+ raise NotImplementedError
+
+class ProteinDecoder(ProteinModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ @abstractmethod
+ def generate_loss(self, label: Featurized[Protein], **kwargs) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def generate_protein(self, **kwargs) -> List[Protein]:
+ raise NotImplementedError
+
+class TextEncoder(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super(TextEncoder, self).__init__(model_cfg)
+
+ @abstractmethod
+ def get_text_processor(self) -> Tuple[TextFeaturizer, Collator]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def encode_text(self, text: Union[List[Text], Any]) -> torch.Tensor:
+ raise NotImplementedError
+
+class ChatModel(BaseModel, ABC):
+ class Role(Enum):
+ USER = auto()
+ ASSISTANT = auto()
+
+ role_dict = {
+ Role.USER: "USER",
+ Role.ASSISTANT: "ASSISTANT",
+ }
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+ self.messages = []
+
+ def add_message(self, role: Role, message: Optional[str]) -> None:
+ self.messages.append([role, message])
+
+ def compose_context(self):
+ ret = self.config.system_prompt + self.config.sep_tokens + " "
+ for role, message in self.messages:
+ if message:
+ ret += self.role_dict[role] + ": " + message + " " + self.config.sep_tokens + " "
+ else:
+ ret += self.role_dict[role] + ": "
+ return ret
+
+ @abstractmethod
+ def chat(self, user_prompt: Text) -> Text:
+ raise NotImplementedError
+
+ @abstractmethod
+ def reset(self) -> None:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/functional_model_registry.py b/open_biomed/models/functional_model_registry.py
new file mode 100644
index 0000000000000000000000000000000000000000..8d32eb0b83b1e7dab5df833f67ccef5117814334
--- /dev/null
+++ b/open_biomed/models/functional_model_registry.py
@@ -0,0 +1,13 @@
+from open_biomed.models.protein.progen.progen import ProGen
+from open_biomed.models.text.pretrained_lm import PretrainedLMForTextEncoding
+
+TEXT_ENCODER_REGISTRY = {
+ "pretrained_lm": PretrainedLMForTextEncoding,
+}
+TEXT_DECODER_REGISTRY = {}
+MOLECULE_ENCODER_REGISTRY = {}
+MOLECULE_DECODER_REGISTRY = {}
+PROTEIN_ENCODER_REGISTRY = {}
+PROTEIN_DECODER_REGISTRY = {
+ "progen": ProGen,
+}
\ No newline at end of file
diff --git a/open_biomed/models/misc.py b/open_biomed/models/misc.py
new file mode 100644
index 0000000000000000000000000000000000000000..d7c884e2604cf4537870f9deb72be79c3b6c170e
--- /dev/null
+++ b/open_biomed/models/misc.py
@@ -0,0 +1,42 @@
+from typing import List, Optional, Union
+
+import logging
+
+import torch
+import torch.nn as nn
+
+ACT_FN = {
+ "softmax": nn.Softmax(),
+ "tanh": nn.Tanh(),
+ "relu": nn.ReLU(),
+}
+
+class MLP(nn.Module):
+ def __init__(self,
+ input_dim: int=256,
+ hidden_dim: Union[List[int], int]=[],
+ output_dim: int=2,
+ num_layers: Optional[int]=None,
+ act_fn: str="relu",
+ layer_norm: bool=False,
+ act_last: bool=False,
+ ) -> None:
+ super().__init__()
+ layers = []
+ if isinstance(hidden_dim, int):
+ hidden_dim = [hidden_dim] * num_layers
+ else:
+ if num_layers is not None:
+ logging.warn("Hidden dim is specified, num_layers is ignored")
+ hidden_dim = [input_dim] + hidden_dim + [output_dim]
+ num_layers = len(hidden_dim) - 1
+ for i in range(num_layers):
+ layers.append(nn.Linear(hidden_dim[i], hidden_dim[i + 1]))
+ if i < num_layers - 1 or act_last:
+ if layer_norm:
+ layers.append(nn.LayerNorm(hidden_dim[i + 1]))
+ layers.append(ACT_FN[act_fn])
+ self.network = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.network(x)
\ No newline at end of file
diff --git a/open_biomed/models/molecule/graphmvp.py b/open_biomed/models/molecule/graphmvp.py
new file mode 100644
index 0000000000000000000000000000000000000000..0cabd47f264d91a9ff65b6ef26eb21aa15ac769b
--- /dev/null
+++ b/open_biomed/models/molecule/graphmvp.py
@@ -0,0 +1,531 @@
+# from https://github.com/chao1224/GraphMVP/tree/main/src_classification/models/molecule_gnn_model.py
+import logging
+logger = logging.getLogger(__name__)
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch_geometric.nn import (MessagePassing, global_add_pool, global_max_pool, global_mean_pool)
+from torch_geometric.nn.inits import glorot, zeros
+from torch_geometric.utils import add_self_loops, softmax
+from torch_scatter import scatter_add
+
+from open_biomed.data import Molecule, Text
+from open_biomed.models.task_models import MoleculePropertyPredictionModel
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import ClassLabelFeaturizer, Featurized
+from open_biomed.utils.mol_featurizer import MolGraphFeaturizer
+from open_biomed.utils.collator import DPCollator, ClassLabelCollator
+from open_biomed.utils.misc import concatenate_tokens
+import selfies as sf
+
+from typing import Any, Dict, Generic, List, TypeVar
+
+num_atom_type = 120 # including the extra mask tokens
+num_chirality_tag = 3
+
+num_bond_type = 6 # including aromatic and self-loop edge, and extra masked tokens
+num_bond_direction = 3
+
+
+class GINConv(MessagePassing):
+ def __init__(self, emb_dim, aggr="add"):
+ super(GINConv, self).__init__()
+ self.aggr = aggr
+ self.mlp = nn.Sequential(nn.Linear(emb_dim, 2 * emb_dim),
+ nn.ReLU(),
+ nn.Linear(2 * emb_dim, emb_dim))
+ self.edge_embedding1 = nn.Embedding(num_bond_type, emb_dim)
+ self.edge_embedding2 = nn.Embedding(num_bond_direction, emb_dim)
+
+ nn.init.xavier_uniform_(self.edge_embedding1.weight.data)
+ nn.init.xavier_uniform_(self.edge_embedding2.weight.data)
+
+ def forward(self, x, edge_index, edge_attr):
+ edge_index = add_self_loops(edge_index, num_nodes=x.size(0))
+
+ self_loop_attr = torch.zeros(x.size(0), 2)
+ self_loop_attr[:, 0] = 4 # bond type for self-loop edge
+ self_loop_attr = self_loop_attr.to(edge_attr.device).to(edge_attr.dtype)
+ edge_attr = torch.cat((edge_attr, self_loop_attr), dim=0)
+
+ edge_embeddings = self.edge_embedding1(edge_attr[:, 0]) + \
+ self.edge_embedding2(edge_attr[:, 1])
+
+ return self.propagate(edge_index[0], x=x, edge_attr=edge_embeddings)
+
+ def message(self, x_j, edge_attr):
+ return x_j + edge_attr
+
+ def update(self, aggr_out):
+ return self.mlp(aggr_out)
+
+
+class GCNConv(MessagePassing):
+ def __init__(self, emb_dim, aggr="add"):
+ super(GCNConv, self).__init__()
+ self.aggr = aggr
+ self.emb_dim = emb_dim
+ self.linear = nn.Linear(emb_dim, emb_dim)
+ self.edge_embedding1 = nn.Embedding(num_bond_type, emb_dim)
+ self.edge_embedding2 = nn.Embedding(num_bond_direction, emb_dim)
+
+ nn.init.xavier_uniform_(self.edge_embedding1.weight.data)
+ nn.init.xavier_uniform_(self.edge_embedding2.weight.data)
+
+ def norm(self, edge_index, num_nodes, dtype):
+ ### assuming that self-loops have been already added in edge_index
+ edge_weight = torch.ones((edge_index.size(1),), dtype=dtype, device=edge_index.device)
+ row, col = edge_index
+ deg = scatter_add(edge_weight, row, dim=0, dim_size=num_nodes)
+ deg_inv_sqrt = deg.pow(-0.5)
+ deg_inv_sqrt[deg_inv_sqrt == float('inf')] = 0
+
+ return deg_inv_sqrt[row] * edge_weight * deg_inv_sqrt[col]
+
+ def forward(self, x, edge_index, edge_attr):
+ # add self loops in the edge space
+ edge_index = add_self_loops(edge_index, num_nodes=x.size(0))
+
+ # add features corresponding to self-loop edges.
+ self_loop_attr = torch.zeros(x.size(0), 2)
+ self_loop_attr[:, 0] = 4 # bond type for self-loop edge
+ self_loop_attr = self_loop_attr.to(edge_attr.device).to(edge_attr.dtype)
+
+ edge_attr = torch.cat((edge_attr, self_loop_attr), dim=0)
+ edge_embeddings = self.edge_embedding1(edge_attr[:, 0]) + \
+ self.edge_embedding2(edge_attr[:, 1])
+
+ norm = self.norm(edge_index[0], x.size(0), x.dtype)
+
+ x = self.linear(x)
+
+ return self.propagate(edge_index[0], x=x, edge_attr=edge_embeddings, norm=norm)
+
+ def message(self, x_j, edge_attr, norm):
+ return norm.view(-1, 1) * (x_j + edge_attr)
+
+
+class GATConv(MessagePassing):
+ def __init__(self, emb_dim, heads=2, negative_slope=0.2, aggr="add"):
+ super(GATConv, self).__init__(node_dim=0)
+ self.aggr = aggr
+ self.heads = heads
+ self.emb_dim = emb_dim
+ self.negative_slope = negative_slope
+
+ self.weight_linear = nn.Linear(emb_dim, heads * emb_dim)
+ self.att = nn.Parameter(torch.Tensor(1, heads, 2 * emb_dim))
+
+ self.bias = nn.Parameter(torch.Tensor(emb_dim))
+
+ self.edge_embedding1 = nn.Embedding(num_bond_type, heads * emb_dim)
+ self.edge_embedding2 = nn.Embedding(num_bond_direction, heads * emb_dim)
+
+ nn.init.xavier_uniform_(self.edge_embedding1.weight.data)
+ nn.init.xavier_uniform_(self.edge_embedding2.weight.data)
+
+ self.reset_parameters()
+
+ def reset_parameters(self):
+ glorot(self.att)
+ zeros(self.bias)
+
+ def forward(self, x, edge_index, edge_attr):
+ # add self loops in the edge space
+ edge_index = add_self_loops(edge_index, num_nodes=x.size(0))
+
+ # add features corresponding to self-loop edges.
+ self_loop_attr = torch.zeros(x.size(0), 2)
+ self_loop_attr[:, 0] = 4 # bond type for self-loop edge
+ self_loop_attr = self_loop_attr.to(edge_attr.device).to(edge_attr.dtype)
+
+ edge_attr = torch.cat((edge_attr, self_loop_attr), dim=0)
+ edge_embeddings = self.edge_embedding1(edge_attr[:, 0]) + \
+ self.edge_embedding2(edge_attr[:, 1])
+
+ x = self.weight_linear(x)
+ return self.propagate(edge_index[0], x=x, edge_attr=edge_embeddings)
+
+ def message(self, edge_index, x_i, x_j, edge_attr):
+ x_i = x_i.view(-1, self.heads, self.emb_dim)
+ x_j = x_j.view(-1, self.heads, self.emb_dim)
+ edge_attr = edge_attr.view(-1, self.heads, self.emb_dim)
+ x_j += edge_attr
+
+ alpha = (torch.cat([x_i, x_j], dim=-1) * self.att).sum(dim=-1)
+ alpha = F.leaky_relu(alpha, self.negative_slope)
+ alpha = softmax(alpha, edge_index[0])
+
+ return x_j * alpha.view(-1, self.heads, 1)
+
+ def update(self, aggr_out):
+ aggr_out = aggr_out.mean(dim=1)
+ aggr_out += self.bias
+ return aggr_out
+
+
+class GraphSAGEConv(MessagePassing):
+ def __init__(self, emb_dim, aggr="mean"):
+ super(GraphSAGEConv, self).__init__()
+ self.aggr = aggr
+
+ self.emb_dim = emb_dim
+ self.linear = nn.Linear(emb_dim, emb_dim)
+ self.edge_embedding1 = nn.Embedding(num_bond_type, emb_dim)
+ self.edge_embedding2 = nn.Embedding(num_bond_direction, emb_dim)
+
+ nn.init.xavier_uniform_(self.edge_embedding1.weight.data)
+ nn.init.xavier_uniform_(self.edge_embedding2.weight.data)
+
+
+ def forward(self, x, edge_index, edge_attr):
+ # add self loops in the edge space
+ edge_index = add_self_loops(edge_index, num_nodes=x.size(0))
+
+ # add features corresponding to self-loop edges.
+ self_loop_attr = torch.zeros(x.size(0), 2)
+ self_loop_attr[:, 0] = 4 # bond type for self-loop edge
+ self_loop_attr = self_loop_attr.to(edge_attr.device).to(edge_attr.dtype)
+ edge_attr = torch.cat((edge_attr, self_loop_attr), dim=0)
+
+ edge_embeddings = self.edge_embedding1(edge_attr[:, 0]) + \
+ self.edge_embedding2(edge_attr[:, 1])
+
+ x = self.linear(x)
+
+ return self.propagate(edge_index[0], x=x, edge_attr=edge_embeddings)
+
+ def message(self, x_j, edge_attr):
+ return x_j + edge_attr
+
+ def update(self, aggr_out):
+ return F.normalize(aggr_out, p=2, dim=-1)
+
+# same with class GNN of GraphMVP
+class GNNGraphMVP(nn.Module):
+ def __init__(self, num_layer, emb_dim, JK="last", drop_ratio=0., gnn_type="gin"):
+ if num_layer < 2:
+ raise ValueError("Number of GNN layers must be greater than 1.")
+
+ super(GNNGraphMVP, self).__init__()
+ self.drop_ratio = drop_ratio
+ self.num_layer = num_layer
+ self.JK = JK
+
+ self.x_embedding1 = nn.Embedding(num_atom_type, emb_dim)
+ self.x_embedding2 = nn.Embedding(num_chirality_tag, emb_dim)
+
+ nn.init.xavier_uniform_(self.x_embedding1.weight.data)
+ nn.init.xavier_uniform_(self.x_embedding2.weight.data)
+
+ ###List of MLPs
+ self.gnns = nn.ModuleList()
+ for layer in range(num_layer):
+ if gnn_type == "gin":
+ self.gnns.append(GINConv(emb_dim, aggr="add"))
+ elif gnn_type == "gcn":
+ self.gnns.append(GCNConv(emb_dim))
+ elif gnn_type == "gat":
+ self.gnns.append(GATConv(emb_dim))
+ elif gnn_type == "graphsage":
+ self.gnns.append(GraphSAGEConv(emb_dim))
+
+ ###List of batchnorms
+ self.batch_norms = nn.ModuleList()
+ for layer in range(num_layer):
+ self.batch_norms.append(nn.BatchNorm1d(emb_dim))
+
+ # def forward(self, x, edge_index, edge_attr):
+ def forward(self, *argv):
+ if len(argv) == 3:
+ x, edge_index, edge_attr = argv[0], argv[1], argv[2]
+ elif len(argv) == 1:
+ data = argv[0]
+ x, edge_index, edge_attr = data.x, data.edge_index, data.edge_attr
+ else:
+ raise ValueError("unmatched number of arguments.")
+
+ x = self.x_embedding1(x[:, 0]) + self.x_embedding2(x[:, 1])
+
+ h_list = [x]
+ for layer in range(self.num_layer):
+ h = self.gnns[layer](h_list[layer], edge_index, edge_attr)
+ h = self.batch_norms[layer](h)
+ # h = F.dropout(F.relu(h), self.drop_ratio, training = self.training)
+ if layer == self.num_layer - 1:
+ # remove relu for the last layer
+ h = F.dropout(h, self.drop_ratio, training=self.training)
+ else:
+ h = F.dropout(F.relu(h), self.drop_ratio, training=self.training)
+ h_list.append(h)
+
+ ### Different implementations of Jk-concat
+ if self.JK == "concat":
+ node_representation = torch.cat(h_list, dim=1)
+ elif self.JK == "last":
+ node_representation = h_list[-1]
+ elif self.JK == "max":
+ h_list = [h.unsqueeze_(0) for h in h_list]
+ node_representation = torch.max(torch.cat(h_list, dim=0), dim=0)[0]
+ elif self.JK == "sum":
+ h_list = [h.unsqueeze_(0) for h in h_list]
+ node_representation = torch.sum(torch.cat(h_list, dim=0), dim=0)[0]
+ else:
+ raise ValueError("not implemented.")
+ return node_representation
+
+# same with class GNN_graphpred of GraphMVP
+class GraphMVP(MoleculePropertyPredictionModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(GraphMVP, self).__init__(model_cfg)
+ self.main_model = GNNGraphMVP(
+ num_layer=model_cfg["gin_num_layers"],
+ emb_dim=model_cfg["gin_hidden_dim"],
+ JK=model_cfg["JK"],
+ drop_ratio=model_cfg["drop_ratio"],
+ gnn_type=model_cfg["gnn_type"]
+ )
+
+ if model_cfg["gin_num_layers"] < 2:
+ raise ValueError("# layers must > 1.")
+
+ self.num_layer = model_cfg["gin_num_layers"]
+ self.emb_dim = model_cfg["gin_hidden_dim"]
+ self.JK = model_cfg["JK"]
+
+ # Different kind of graph pooling
+ if model_cfg["graph_pooling"] == "sum":
+ self.pool = global_add_pool
+ elif model_cfg["graph_pooling"] == "mean":
+ self.pool = global_mean_pool
+ elif model_cfg["graph_pooling"] == "max":
+ self.pool = global_max_pool
+ else:
+ raise ValueError("Invalid graph pooling type.")
+
+ # For graph-level binary classification
+ self.mult = 1
+
+ if self.JK == "concat":
+ self.graph_pred_linear = nn.Linear(self.mult * (self.num_layer + 1) * self.emb_dim,
+ self.num_tasks)
+ else:
+ self.graph_pred_linear = nn.Linear(self.mult * self.emb_dim, self.num_tasks)
+
+ self.criterion = nn.BCEWithLogitsLoss(reduction='none')
+
+ self.featurizers = {
+ "molecule": MolGraphFeaturizer(
+ {'name': 'BaseGNN'}
+ ),
+ "classlabel": ClassLabelFeaturizer()
+ }
+ self.collators = {
+ #"molecule": DPCollator({'modality': ['structure'], 'featurizer': {'structure': {'name': 'BaseGNN'}}}),
+ "molecule": DPCollator(),
+ "classlabel": ClassLabelCollator()
+ }
+
+ for parent in reversed(type(self).__mro__[1:-1]):
+ if hasattr(parent, '_add_task'):
+ parent._add_task(self)
+
+
+
+ def from_pretrained(self, model_file):
+ self.main_model.load_state_dict(torch.load(model_file))
+ return
+
+ def get_graph_representation(self, *argv):
+ if len(argv) == 4:
+ x, edge_index, edge_attr, batch = argv[0], argv[1], argv[2], argv[3]
+ elif len(argv) == 1:
+ data = argv[0]
+ x, edge_index, edge_attr, batch = data.x, data.edge_index, \
+ data.edge_attr, data.batch
+ else:
+ raise ValueError("unmatched number of arguments.")
+
+ node_representation = self.molecule_model(x, edge_index, edge_attr)
+ graph_representation = self.pool(node_representation, batch)
+ pred = self.graph_pred_linear(graph_representation)
+
+ return graph_representation, pred
+
+ def encode_mol(self, *argv):
+ if len(argv) == 4:
+ x, edge_index, edge_attr, batch = argv[0], argv[1], argv[2], argv[3]
+ elif len(argv) == 1:
+ data = argv[0]
+ x, edge_index, edge_attr, batch = data.x, data.edge_index, \
+ data.edge_attr, data.batch
+ else:
+ raise ValueError("unmatched number of arguments.")
+
+ node_representation = self.main_model(x, edge_index, edge_attr)
+ graph_representation = self.pool(node_representation, batch)
+ output = self.graph_pred_linear(graph_representation)
+
+ return output
+
+ def load_state_dict(self, state_dict, strict=True):
+ return self.main_model.load_state_dict(state_dict, strict)
+
+ def forward_molecule_property_prediction(self,
+ molecule,
+ label
+ ) -> Dict[str, torch.Tensor]:
+ pred = self.encode_mol(molecule)
+ y = label.view(pred.shape).to(torch.float64)
+ # Whether y is non-null or not.
+ is_valid = y ** 2 > 0
+ # Loss matrix
+ loss_mat = self.criterion(pred.double(), (y + 1) / 2) # -1变成0
+ # loss matrix after removing null target
+ loss_mat = torch.where(
+ is_valid, loss_mat,
+ torch.zeros(loss_mat.shape).to(loss_mat.device).to(loss_mat.dtype))
+ loss = torch.sum(loss_mat) / torch.sum(is_valid)
+ return {"loss":loss}
+
+ @torch.no_grad()
+ def predict_molecule_property_prediction(self,
+ molecule
+ ) -> Dict[str, torch.Tensor]:
+ pred = self.encode_mol(molecule)
+ pred = torch.sigmoid(pred)
+ result_list = [[round(x.item(), 4) for x in row] for row in pred.cpu()]
+ return result_list
+
+
+# just regression version of GraphMVP
+class GraphMVPRegression(MoleculePropertyPredictionModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(GraphMVPRegression, self).__init__(model_cfg)
+ self.main_model = GNNGraphMVP(
+ num_layer=model_cfg["gin_num_layers"],
+ emb_dim=model_cfg["gin_hidden_dim"],
+ JK=model_cfg["JK"],
+ drop_ratio=model_cfg["drop_ratio"],
+ gnn_type=model_cfg["gnn_type"]
+ )
+
+ if model_cfg["gin_num_layers"] < 2:
+ raise ValueError("# layers must > 1.")
+
+ self.num_layer = model_cfg["gin_num_layers"]
+ self.emb_dim = model_cfg["gin_hidden_dim"]
+ self.JK = model_cfg["JK"]
+
+ # Different kind of graph pooling
+ if model_cfg["graph_pooling"] == "sum":
+ self.pool = global_add_pool
+ elif model_cfg["graph_pooling"] == "mean":
+ self.pool = global_mean_pool
+ elif model_cfg["graph_pooling"] == "max":
+ self.pool = global_max_pool
+ else:
+ raise ValueError("Invalid graph pooling type.")
+
+ # For graph-level binary classification
+ self.mult = 1
+
+ if self.JK == "concat":
+ self.graph_pred_linear = nn.Linear(self.mult * (self.num_layer + 1) * self.emb_dim,
+ self.num_tasks)
+ else:
+ self.graph_pred_linear = nn.Linear(self.mult * self.emb_dim, self.num_tasks)
+
+ self.criterion = nn.MSELoss(reduction='none')
+ # self.criterion = nn.L1Loss(reduction='none')
+ # self.criterion = nn.HuberLoss(reduction='none', delta=10)
+
+ self.featurizers = {
+ "molecule": MolGraphFeaturizer(
+ {'name': 'BaseGNN'}
+ ),
+ "classlabel": ClassLabelFeaturizer()
+ }
+ self.collators = {
+ #"molecule": DPCollator({'modality': ['structure'], 'featurizer': {'structure': {'name': 'BaseGNN'}}}),
+ "molecule": DPCollator(),
+ "classlabel": ClassLabelCollator()
+ }
+
+ for parent in reversed(type(self).__mro__[1:-1]):
+ if hasattr(parent, '_add_task'):
+ parent._add_task(self)
+
+
+
+ def from_pretrained(self, model_file):
+ self.main_model.load_state_dict(torch.load(model_file))
+ return
+
+ def get_graph_representation(self, *argv):
+ if len(argv) == 4:
+ x, edge_index, edge_attr, batch = argv[0], argv[1], argv[2], argv[3]
+ elif len(argv) == 1:
+ data = argv[0]
+ x, edge_index, edge_attr, batch = data.x, data.edge_index, \
+ data.edge_attr, data.batch
+ else:
+ raise ValueError("unmatched number of arguments.")
+
+ node_representation = self.molecule_model(x, edge_index, edge_attr)
+ graph_representation = self.pool(node_representation, batch)
+ pred = self.graph_pred_linear(graph_representation)
+
+ return graph_representation, pred
+
+ def encode_mol(self, *argv):
+ if len(argv) == 4:
+ x, edge_index, edge_attr, batch = argv[0], argv[1], argv[2], argv[3]
+ elif len(argv) == 1:
+ data = argv[0]
+ x, edge_index, edge_attr, batch = data.x, data.edge_index, \
+ data.edge_attr, data.batch
+ else:
+ raise ValueError("unmatched number of arguments.")
+
+ node_representation = self.main_model(x, edge_index, edge_attr)
+ graph_representation = self.pool(node_representation, batch)
+ output = self.graph_pred_linear(graph_representation)
+
+ return output
+
+ def load_state_dict(self, state_dict, strict=True):
+ return self.main_model.load_state_dict(state_dict, strict)
+
+ def forward_molecule_property_prediction(self,
+ molecule,
+ label
+ ) -> Dict[str, torch.Tensor]:
+ # Whether y is non-null or not.
+ # Regression version
+ pred = self.encode_mol(molecule) # Get predictions from model
+ y = label.view(pred.shape).to(torch.double) # Ensure label matches prediction shape
+
+ # Whether y is non-null or not (if you still need to handle missing values)
+ is_valid = ~torch.isnan(y)
+
+ # Use MSE loss for regression
+ loss_mat = self.criterion(pred.double(), y)
+
+ # Handle invalid/missing targets if needed
+ loss_mat = torch.where(
+ is_valid, loss_mat,
+ torch.zeros(loss_mat.shape).to(loss_mat.device).to(loss_mat.dtype))
+ loss = torch.sum(loss_mat) / torch.sum(is_valid)
+
+ return {"loss": loss}
+
+
+ @torch.no_grad()
+ def predict_molecule_property_prediction(self,
+ molecule
+ ) -> Dict[str, torch.Tensor]:
+ pred = self.encode_mol(molecule)
+ result_list = [[round(x.item(), 4) for x in row] for row in pred.cpu()]
+ return result_list
\ No newline at end of file
diff --git a/open_biomed/models/molecule/molcraft.py b/open_biomed/models/molecule/molcraft.py
new file mode 100644
index 0000000000000000000000000000000000000000..16c2da1c748544f8b55acff17fd6eabed076efc0
--- /dev/null
+++ b/open_biomed/models/molecule/molcraft.py
@@ -0,0 +1,1187 @@
+from typing import Any, Dict, List, Optional
+
+import itertools
+import logging
+import numpy as np
+try:
+ from openbabel import openbabel as ob
+ ob.obErrorLog.SetOutputLevel(0)
+except ImportError:
+ logging.warning("OpenBabel is not installed. The MolCRAFT model will not be able to decode generated molecules.")
+from rdkit import Chem, Geometry
+from rdkit.Chem import AllChem
+from scipy.spatial.distance import pdist, squareform
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch_geometric.data import Data
+from torch_geometric.nn import radius_graph, knn_graph
+from torch_scatter import scatter_softmax, scatter_sum
+from tqdm import tqdm
+
+from open_biomed.data import Molecule, MoleculeConstructError, Pocket, estimate_ligand_atom_num
+from open_biomed.models.task_models.structure_based_drug_design import StructureBasedDrugDesignModel
+from open_biomed.utils.collator import PygCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import Featurized, MoleculeFeaturizer, PocketFeaturizer
+from open_biomed.utils.misc import safe_index
+
+### Borrowed from https://github.com/AlgoMole/MolCRAFT
+
+MAP_ATOM_TYPE_AROMATIC_TO_INDEX = {
+ (1, False): 0,
+ (6, False): 1,
+ (6, True): 2,
+ (7, False): 3,
+ (7, True): 4,
+ (8, False): 5,
+ (8, True): 6,
+ (9, False): 7,
+ (15, False): 8,
+ (15, True): 9,
+ (16, False): 10,
+ (16, True): 11,
+ (17, False): 12
+}
+MAP_INDEX_TO_ATOM_TYPE_AROMATIC = {v: k for k, v in MAP_ATOM_TYPE_AROMATIC_TO_INDEX.items()}
+
+# Featurizers
+class MolCRAFTMoleculeFeaturizer(MoleculeFeaturizer):
+ def __init__(self, pos_norm=1.0) -> None:
+ super().__init__()
+ self.pos_norm = pos_norm
+
+ def __call__(self, molecule: Molecule) -> Dict[str, Any]:
+ molecule._add_rdmol()
+ rdmol = molecule.rdmol
+ node_feat_list = []
+ for atom in rdmol.GetAtoms():
+ node_feat_list.append(safe_index(MAP_ATOM_TYPE_AROMATIC_TO_INDEX, (atom.GetAtomicNum(), atom.GetIsAromatic())))
+ node_feat = F.one_hot(torch.LongTensor(node_feat_list), num_classes=len(MAP_ATOM_TYPE_AROMATIC_TO_INDEX)).float()
+ pos = torch.tensor(molecule.conformer, dtype=torch.float32)
+ pocket_center = pos.mean(dim=0)
+ pos -= pocket_center
+ pos /= self.pos_norm
+
+ return Data(**{
+ "atom_feature": node_feat,
+ "pos": pos,
+ })
+
+ def reconstruct_from_generated(self, xyz: List[List[float]], atomic_nums: List[int], aromatic: List[bool], basic_mode: bool=True) -> Chem.RWMol:
+ def fixup(atoms: List[Any], mol: ob.OBMol, indicators: List[bool]) -> List[Chem.Atom]:
+ '''Set atom properties to match channel. Keep doing this
+ to beat openbabel over the head with what we want to happen.'''
+
+ """
+ for now, indicators only include 'is_aromatic'
+ """
+ mol.SetAromaticPerceived(True) # avoid perception
+ for i, atom in enumerate(atoms):
+ if indicators is not None:
+ if indicators[i]:
+ atom.SetAromatic(True)
+ atom.SetHyb(2)
+ else:
+ atom.SetAromatic(False)
+
+ if (atom.GetAtomicNum() in (7, 8)) and atom.IsInRing(): # Nitrogen, Oxygen
+ # this is a little iffy, ommitting until there is more evidence it is a net positive
+ # we don't have aromatic types for nitrogen, but if it
+ # is in a ring with aromatic carbon mark it aromatic as well
+ acnt = 0
+ for nbr in ob.OBAtomAtomIter(atom):
+ if nbr.IsAromatic():
+ acnt += 1
+ if acnt > 1:
+ atom.SetAromatic(True)
+
+ mol = ob.OBMol()
+ mol.BeginModify()
+ atoms = []
+ for xyz, t in zip(xyz, atomic_nums):
+ x, y, z = xyz
+ # ch = struct.channels[t]
+ atom = mol.NewAtom()
+ atom.SetAtomicNum(t)
+ atom.SetVector(x, y, z)
+ atoms.append(atom)
+ fixup(atoms, mol, aromatic)
+
+ # Connect the dots
+ '''Custom implementation of ConnectTheDots. This is similar to
+ OpenBabel's version, but is more willing to make long bonds
+ (up to maxbond long) to keep the molecule connected. It also
+ attempts to respect atom type information from struct.
+ atoms and struct need to correspond in their order
+ Assumes no hydrogens or existing bonds.
+ '''
+ pt = AllChem.GetPeriodicTable()
+ covalent_factor = 1.3
+
+ mol.BeginModify()
+
+ # just going to to do n^2 comparisons, can worry about efficiency later
+ coords = np.array([(a.GetX(), a.GetY(), a.GetZ()) for a in atoms])
+ dists = squareform(pdist(coords))
+ # types = [struct.channels[t].name for t in struct.c]
+
+ for i, j in itertools.combinations(range(len(atoms)), 2):
+ a = atoms[i]
+ b = atoms[j]
+ a_r = ob.GetCovalentRad(a.GetAtomicNum()) * covalent_factor
+ b_r = ob.GetCovalentRad(b.GetAtomicNum()) * covalent_factor
+ if dists[i, j] < a_r + b_r:
+ flag = 0
+ if aromatic[i] and aromatic[j]:
+ flag = ob.OB_AROMATIC_BOND
+ mol.AddBond(a.GetIdx(), b.GetIdx(), 1, flag)
+
+ atom_maxb = {}
+ for (i, a) in enumerate(atoms):
+ # set max valance to the smallest max allowed by openbabel or rdkit
+ # since we want the molecule to be valid for both (rdkit is usually lower)
+ maxb = min(ob.GetMaxBonds(a.GetAtomicNum()), pt.GetDefaultValence(a.GetAtomicNum()))
+
+ nbrs_of_elem = 0
+ for nbr in ob.OBAtomAtomIter(a):
+ if nbr.GetAtomicNum() == 8:
+ nbrs_of_elem += 1
+ if a.GetAtomicNum() == 16: # sulfone check
+ if nbrs_of_elem >= 2:
+ maxb = 6
+
+ atom_maxb[a.GetIdx()] = maxb
+
+ # remove any impossible bonds between halogens
+ for bond in ob.OBMolBondIter(mol):
+ a1 = bond.GetBeginAtom()
+ a2 = bond.GetEndAtom()
+ if atom_maxb[a1.GetIdx()] == 1 and atom_maxb[a2.GetIdx()] == 1:
+ mol.DeleteBond(bond)
+
+ def get_bond_info(biter):
+ '''Return bonds sorted by their distortion'''
+ bonds = [b for b in biter]
+ binfo = []
+ for bond in bonds:
+ bdist = bond.GetLength()
+ # compute how far away from optimal we are
+ a1 = bond.GetBeginAtom()
+ a2 = bond.GetEndAtom()
+ ideal = ob.GetCovalentRad(a1.GetAtomicNum()) + ob.GetCovalentRad(a2.GetAtomicNum())
+ stretch = bdist / ideal
+ binfo.append((stretch, bond))
+ binfo.sort(reverse=True, key=lambda t: t[0]) # most stretched bonds first
+ return binfo
+
+ def reachable_r(a, b, seenbonds):
+ '''Recursive helper.'''
+
+ for nbr in ob.OBAtomAtomIter(a):
+ bond = a.GetBond(nbr).GetIdx()
+ if bond not in seenbonds:
+ seenbonds.add(bond)
+ if nbr == b:
+ return True
+ elif reachable_r(nbr, b, seenbonds):
+ return True
+ return False
+
+ def reachable(a, b):
+ '''Return true if atom b is reachable from a without using the bond between them.'''
+ if a.GetExplicitDegree() == 1 or b.GetExplicitDegree() == 1:
+ return False # this is the _only_ bond for one atom
+ # otherwise do recursive traversal
+ seenbonds = set([a.GetBond(b).GetIdx()])
+ return reachable_r(a, b, seenbonds)
+
+
+ def forms_small_angle(a, b, cutoff=60):
+ '''Return true if bond between a and b is part of a small angle
+ with a neighbor of a only.'''
+
+ for nbr in ob.OBAtomAtomIter(a):
+ if nbr != b:
+ degrees = b.GetAngle(a, nbr)
+ if degrees < cutoff:
+ return True
+ return False
+
+ binfo = get_bond_info(ob.OBMolBondIter(mol))
+ # now eliminate geometrically poor bonds
+ for stretch, bond in binfo:
+
+ # can we remove this bond without disconnecting the molecule?
+ a1 = bond.GetBeginAtom()
+ a2 = bond.GetEndAtom()
+
+ # as long as we aren't disconnecting, let's remove things
+ # that are excessively far away (0.45 from ConnectTheDots)
+ # get bonds to be less than max allowed
+ # also remove tight angles, because that is what ConnectTheDots does
+ if stretch > 1.2 or forms_small_angle(a1, a2) or forms_small_angle(a2, a1):
+ # don't fragment the molecule
+ if not reachable(a1, a2):
+ continue
+ mol.DeleteBond(bond)
+
+ # prioritize removing hypervalency causing bonds, do more valent
+ # constrained atoms first since their bonds introduce the most problems
+ # with reachability (e.g. oxygen)
+ hypers = [(atom_maxb[a.GetIdx()], a.GetExplicitValence() - atom_maxb[a.GetIdx()], a) for a in atoms]
+ hypers = sorted(hypers, key=lambda aa: (aa[0], -aa[1]))
+ for mb, diff, a in hypers:
+ if a.GetExplicitValence() <= atom_maxb[a.GetIdx()]:
+ continue
+ binfo = get_bond_info(ob.OBAtomBondIter(a))
+ for stretch, bond in binfo:
+
+ if stretch < 0.9: # the two atoms are too closed to remove the bond
+ continue
+ # can we remove this bond without disconnecting the molecule?
+ a1 = bond.GetBeginAtom()
+ a2 = bond.GetEndAtom()
+
+ # get right valence
+ if a1.GetExplicitValence() > atom_maxb[a1.GetIdx()] or a2.GetExplicitValence() > atom_maxb[a2.GetIdx()]:
+ # don't fragment the molecule
+ if not reachable(a1, a2):
+ continue
+ mol.DeleteBond(bond)
+ if a.GetExplicitValence() <= atom_maxb[a.GetIdx()]:
+ break # let nbr atoms choose what bonds to throw out
+
+ mol.EndModify()
+ fixup(atoms, mol, aromatic)
+
+ mol.AddPolarHydrogens()
+ mol.PerceiveBondOrders()
+ fixup(atoms, mol, aromatic)
+
+ for (i, a) in enumerate(atoms):
+ ob.OBAtomAssignTypicalImplicitHydrogens(a)
+ fixup(atoms, mol, aromatic)
+
+ mol.AddHydrogens()
+ fixup(atoms, mol, aromatic)
+
+ # make rings all aromatic if majority of carbons are aromatic
+ for ring in ob.OBMolRingIter(mol):
+ if 5 <= ring.Size() <= 6:
+ carbon_cnt = 0
+ aromatic_ccnt = 0
+ for ai in ring._path:
+ a = mol.GetAtom(ai)
+ if a.GetAtomicNum() == 6:
+ carbon_cnt += 1
+ if a.IsAromatic():
+ aromatic_ccnt += 1
+ if aromatic_ccnt >= carbon_cnt / 2 and aromatic_ccnt != ring.Size():
+ # set all ring atoms to be aromatic
+ for ai in ring._path:
+ a = mol.GetAtom(ai)
+ a.SetAromatic(True)
+
+ # bonds must be marked aromatic for smiles to match
+ for bond in ob.OBMolBondIter(mol):
+ a1 = bond.GetBeginAtom()
+ a2 = bond.GetEndAtom()
+ if a1.IsAromatic() and a2.IsAromatic():
+ bond.SetAromatic(True)
+
+ mol.PerceiveBondOrders()
+
+ def calc_valence(rdatom):
+ '''Can call GetExplicitValence before sanitize, but need to
+ know this to fix up the molecule to prevent sanitization failures'''
+ cnt = 0.0
+ for bond in rdatom.GetBonds():
+ cnt += bond.GetBondTypeAsDouble()
+ return cnt
+
+ def convert_ob_mol_to_rd_mol(ob_mol, struct=None):
+ '''Convert OBMol to RDKit mol, fixing up issues'''
+ ob_mol.DeleteHydrogens()
+ n_atoms = ob_mol.NumAtoms()
+ rd_mol = AllChem.RWMol()
+ rd_conf = AllChem.Conformer(n_atoms)
+
+ for ob_atom in ob.OBMolAtomIter(ob_mol):
+ rd_atom = AllChem.Atom(ob_atom.GetAtomicNum())
+ # TODO copy format charge
+ if ob_atom.IsAromatic() and ob_atom.IsInRing() and ob_atom.MemberOfRingSize() <= 6:
+ # don't commit to being aromatic unless rdkit will be okay with the ring status
+ # (this can happen if the atoms aren't fit well enough)
+ rd_atom.SetIsAromatic(True)
+ i = rd_mol.AddAtom(rd_atom)
+ ob_coords = ob_atom.GetVector()
+ x = ob_coords.GetX()
+ y = ob_coords.GetY()
+ z = ob_coords.GetZ()
+ rd_coords = Geometry.Point3D(x, y, z)
+ rd_conf.SetAtomPosition(i, rd_coords)
+
+ rd_mol.AddConformer(rd_conf)
+
+ for ob_bond in ob.OBMolBondIter(ob_mol):
+ i = ob_bond.GetBeginAtomIdx() - 1
+ j = ob_bond.GetEndAtomIdx() - 1
+ bond_order = ob_bond.GetBondOrder()
+ if bond_order == 1:
+ rd_mol.AddBond(i, j, AllChem.BondType.SINGLE)
+ elif bond_order == 2:
+ rd_mol.AddBond(i, j, AllChem.BondType.DOUBLE)
+ elif bond_order == 3:
+ rd_mol.AddBond(i, j, AllChem.BondType.TRIPLE)
+ else:
+ raise Exception('unknown bond order {}'.format(bond_order))
+
+ if ob_bond.IsAromatic():
+ bond = rd_mol.GetBondBetweenAtoms(i, j)
+ bond.SetIsAromatic(True)
+
+ rd_mol = AllChem.RemoveHs(rd_mol, sanitize=False)
+
+ pt = AllChem.GetPeriodicTable()
+ # if double/triple bonds are connected to hypervalent atoms, decrement the order
+
+ # TODO: fix seg fault
+ # if struct is not None:
+ # positions = struct
+ positions = rd_mol.GetConformer().GetPositions()
+ nonsingles = []
+ for bond in rd_mol.GetBonds():
+ if bond.GetBondType() == AllChem.BondType.DOUBLE or bond.GetBondType() == AllChem.BondType.TRIPLE:
+ i = bond.GetBeginAtomIdx()
+ j = bond.GetEndAtomIdx()
+ # TODO: ugly fix
+ dist = np.linalg.norm(positions[i] - positions[j])
+ nonsingles.append((dist, bond))
+ nonsingles.sort(reverse=True, key=lambda t: t[0])
+
+ for (d, bond) in nonsingles:
+ a1 = bond.GetBeginAtom()
+ a2 = bond.GetEndAtom()
+
+ if calc_valence(a1) > pt.GetDefaultValence(a1.GetAtomicNum()) or \
+ calc_valence(a2) > pt.GetDefaultValence(a2.GetAtomicNum()):
+ btype = AllChem.BondType.SINGLE
+ if bond.GetBondType() == AllChem.BondType.TRIPLE:
+ btype = AllChem.BondType.DOUBLE
+ bond.SetBondType(btype)
+
+ # fix up special cases
+ for atom in rd_mol.GetAtoms():
+ # set nitrogens with 4 neighbors to have a charge
+ if atom.GetAtomicNum() == 7 and atom.GetDegree() == 4:
+ atom.SetFormalCharge(1)
+
+ # check if there are any carbon atoms with 2 double C-C bonds
+ # if so, convert one to a single bond
+ if atom.GetAtomicNum() == 6 and atom.GetDegree() == 4:
+ cnt = 0
+ i = atom.GetIdx()
+ for nbr in atom.GetNeighbors():
+ if nbr.GetAtomicNum() == 6:
+ j = nbr.GetIdx()
+ bond = rd_mol.GetBondBetweenAtoms(i, j)
+ if bond.GetBondType() == AllChem.BondType.DOUBLE:
+ cnt += 1
+ if cnt == 2:
+ for nbr in atom.GetNeighbors():
+ if nbr.GetAtomicNum() == 6:
+ j = nbr.GetIdx()
+ bond = rd_mol.GetBondBetweenAtoms(i, j)
+ if bond.GetBondType() == AllChem.BondType.DOUBLE:
+ bond.SetBondType(AllChem.BondType.SINGLE)
+ break
+
+ rd_mol = AllChem.AddHs(rd_mol, addCoords=True)
+ # TODO: fix seg fault
+ positions = rd_mol.GetConformer().GetPositions()
+ center = np.mean(positions[np.all(np.isfinite(positions), axis=1)], axis=0)
+ for atom in rd_mol.GetAtoms():
+ i = atom.GetIdx()
+ pos = positions[i]
+ if not np.all(np.isfinite(pos)):
+ # hydrogens on C fragment get set to nan (shouldn't, but they do)
+ rd_mol.GetConformer().SetAtomPosition(i, center)
+
+ try:
+ AllChem.SanitizeMol(rd_mol, AllChem.SANITIZE_ALL ^ AllChem.SANITIZE_KEKULIZE)
+ except:
+ raise MoleculeConstructError("Failed to construct molecule from generated coordinates and atoms.")
+
+ # but at some point stop trying to enforce our aromaticity -
+ # openbabel and rdkit have different aromaticity models so they
+ # won't always agree. Remove any aromatic bonds to non-aromatic atoms
+ for bond in rd_mol.GetBonds():
+ a1 = bond.GetBeginAtom()
+ a2 = bond.GetEndAtom()
+ if bond.GetIsAromatic():
+ if not a1.GetIsAromatic() or not a2.GetIsAromatic():
+ bond.SetIsAromatic(False)
+ elif a1.GetIsAromatic() and a2.GetIsAromatic():
+ bond.SetIsAromatic(True)
+
+ return rd_mol
+
+ def postprocess_rd_mol_1(rdmol):
+ UPGRADE_BOND_ORDER = {AllChem.BondType.SINGLE: AllChem.BondType.DOUBLE, AllChem.BondType.DOUBLE: AllChem.BondType.TRIPLE}
+ rdmol = AllChem.RemoveHs(rdmol)
+
+ # Construct bond nbh list
+ nbh_list = {}
+ for bond in rdmol.GetBonds():
+ begin, end = bond.GetBeginAtomIdx(), bond.GetEndAtomIdx()
+ if begin not in nbh_list:
+ nbh_list[begin] = [end]
+ else:
+ nbh_list[begin].append(end)
+
+ if end not in nbh_list:
+ nbh_list[end] = [begin]
+ else:
+ nbh_list[end].append(begin)
+
+ # Fix missing bond-order
+ for atom in rdmol.GetAtoms():
+ idx = atom.GetIdx()
+ num_radical = atom.GetNumRadicalElectrons()
+ if num_radical > 0:
+ for j in nbh_list[idx]:
+ if j <= idx: continue
+ nb_atom = rdmol.GetAtomWithIdx(j)
+ nb_radical = nb_atom.GetNumRadicalElectrons()
+ if nb_radical > 0:
+ bond = rdmol.GetBondBetweenAtoms(idx, j)
+ bond.SetBondType(UPGRADE_BOND_ORDER[bond.GetBondType()])
+ nb_atom.SetNumRadicalElectrons(nb_radical - 1)
+ num_radical -= 1
+ atom.SetNumRadicalElectrons(num_radical)
+
+ num_radical = atom.GetNumRadicalElectrons()
+ if num_radical > 0:
+ atom.SetNumRadicalElectrons(0)
+ num_hs = atom.GetNumExplicitHs()
+ atom.SetNumExplicitHs(num_hs + num_radical)
+
+ return rdmol
+
+
+ def postprocess_rd_mol_2(rdmol):
+ rdmol_edit = AllChem.RWMol(rdmol)
+
+ ring_info = rdmol.GetRingInfo()
+ ring_info.AtomRings()
+ rings = [set(r) for r in ring_info.AtomRings()]
+ for i, ring_a in enumerate(rings):
+ if len(ring_a) == 3:
+ non_carbon = []
+ atom_by_symb = {}
+ for atom_idx in ring_a:
+ symb = rdmol.GetAtomWithIdx(atom_idx).GetSymbol()
+ if symb != 'C':
+ non_carbon.append(atom_idx)
+ if symb not in atom_by_symb:
+ atom_by_symb[symb] = [atom_idx]
+ else:
+ atom_by_symb[symb].append(atom_idx)
+ if len(non_carbon) == 2:
+ rdmol_edit.RemoveBond(*non_carbon)
+ if 'O' in atom_by_symb and len(atom_by_symb['O']) == 2:
+ rdmol_edit.RemoveBond(*atom_by_symb['O'])
+ rdmol_edit.GetAtomWithIdx(atom_by_symb['O'][0]).SetNumExplicitHs(
+ rdmol_edit.GetAtomWithIdx(atom_by_symb['O'][0]).GetNumExplicitHs() + 1
+ )
+ rdmol_edit.GetAtomWithIdx(atom_by_symb['O'][1]).SetNumExplicitHs(
+ rdmol_edit.GetAtomWithIdx(atom_by_symb['O'][1]).GetNumExplicitHs() + 1
+ )
+ rdmol = rdmol_edit.GetMol()
+
+ for atom in rdmol.GetAtoms():
+ if atom.GetFormalCharge() > 0:
+ atom.SetFormalCharge(0)
+
+ return rdmol
+
+ rd_mol = convert_ob_mol_to_rd_mol(mol, struct=xyz)
+ try:
+ # Post-processing
+ rd_mol = postprocess_rd_mol_1(rd_mol)
+ rd_mol = postprocess_rd_mol_2(rd_mol)
+ except:
+ raise MoleculeConstructError("Failed to construct molecule from generated coordinates and atoms.")
+
+ return rd_mol
+
+ def decode(self, preds: Dict[str, torch.Tensor], pocket_center: Optional[List[float]]) -> Optional[Molecule]:
+ pos = preds["pos"] * self.pos_norm
+ if pocket_center is not None:
+ pos += pocket_center
+
+ preds["pos"] = pos.cpu().numpy().tolist()
+ preds["is_aromatic"] = [MAP_INDEX_TO_ATOM_TYPE_AROMATIC[x][1] for x in preds["atom_type"].cpu().numpy()]
+ preds["atom_type"] = [MAP_INDEX_TO_ATOM_TYPE_AROMATIC[x][0] for x in preds["atom_type"].cpu().numpy()]
+
+ try:
+ rdmol = self.reconstruct_from_generated(preds["pos"], preds["atom_type"], preds["is_aromatic"])
+ molecule = Molecule.from_rdmol(rdmol)
+ except Exception as e:
+ logging.warn(e)
+ molecule = None
+
+ return molecule
+
+class MolCRAFTPocketFeaturizer(PocketFeaturizer):
+ def __init__(self, pos_norm: float=1.0) -> None:
+ super().__init__()
+ self.atomic_numbers = torch.LongTensor([1, 6, 7, 8, 16, 34]) # H, C, N, O, S, Se
+ self.max_num_aa = 20
+ self.pos_norm = pos_norm
+
+ def __call__(self, pocket: Pocket) -> Dict[str, Any]:
+ elements = torch.LongTensor([atom["atomic_number"] for atom in pocket.atoms])
+ elements_one_hot = (elements.view(-1, 1) == self.atomic_numbers.view(1, -1)).long()
+ aa_type = torch.LongTensor([atom["aa_type"] for atom in pocket.atoms])
+ aa_one_hot = F.one_hot(aa_type, num_classes=self.max_num_aa)
+ is_backbone = torch.LongTensor([atom["is_backbone"] for atom in pocket.atoms]).unsqueeze(-1)
+ x = torch.cat([elements_one_hot, aa_one_hot, is_backbone], dim=-1).float()
+ pos = torch.tensor(pocket.conformer, dtype=torch.float32)
+ pocket_center = pos.mean(dim=0)
+ pos -= pocket_center
+ pos /= self.pos_norm
+
+ return Data(**{
+ "atom_feature": x,
+ "pos": pos,
+ "pocket_center": pocket_center.unsqueeze(0),
+ "estimated_ligand_num_atoms": torch.tensor(estimate_ligand_atom_num(pocket)).unsqueeze(0),
+ })
+
+NONLINEARITIES = {
+ "tanh": nn.Tanh(),
+ "relu": nn.ReLU(),
+ "softplus": nn.Softplus(),
+ "elu": nn.ELU(),
+ 'silu': nn.SiLU()
+}
+
+class GaussianSmearing(nn.Module):
+ def __init__(self, start=0.0, stop=5.0, num_gaussians=50, fixed_offset=True):
+ super(GaussianSmearing, self).__init__()
+ self.start = start
+ self.stop = stop
+ self.num_gaussians = num_gaussians
+ if fixed_offset:
+ # customized offset
+ offset = torch.tensor([0, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.5, 4, 4.5, 5, 5.5, 6, 7, 8, 9, 10])
+ else:
+ offset = torch.linspace(start, stop, num_gaussians)
+ self.coeff = -0.5 / (offset[1] - offset[0]).item() ** 2
+ self.register_buffer('offset', offset)
+
+ def __repr__(self):
+ return f'GaussianSmearing(start={self.start}, stop={self.stop}, num_gaussians={self.num_gaussians})'
+
+ def forward(self, dist):
+ dist = dist.view(-1, 1) - self.offset.view(1, -1)
+ return torch.exp(self.coeff * torch.pow(dist, 2))
+
+class MLP(nn.Module):
+ """MLP with the same hidden dim across all layers."""
+
+ def __init__(self, in_dim, out_dim, hidden_dim, num_layer=2, norm=True, act_fn='relu', act_last=False):
+ super().__init__()
+ layers = []
+ for layer_idx in range(num_layer):
+ if layer_idx == 0:
+ layers.append(nn.Linear(in_dim, hidden_dim))
+ elif layer_idx == num_layer - 1:
+ layers.append(nn.Linear(hidden_dim, out_dim))
+ else:
+ layers.append(nn.Linear(hidden_dim, hidden_dim))
+ if layer_idx < num_layer - 1 or act_last:
+ if norm:
+ layers.append(nn.LayerNorm(hidden_dim))
+ layers.append(NONLINEARITIES[act_fn])
+ self.net = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.net(x)
+
+class BaseX2HAttLayer(nn.Module):
+ def __init__(self, input_dim, hidden_dim, output_dim, n_heads, edge_feat_dim, r_feat_dim,
+ act_fn='relu', norm=True, ew_net_type='r', out_fc=True):
+ super().__init__()
+ self.input_dim = input_dim
+ self.hidden_dim = hidden_dim
+ self.output_dim = output_dim
+ self.n_heads = n_heads
+ self.act_fn = act_fn
+ self.edge_feat_dim = edge_feat_dim
+ self.r_feat_dim = r_feat_dim
+ self.ew_net_type = ew_net_type
+ self.out_fc = out_fc
+
+ # attention key func
+ kv_input_dim = input_dim * 2 + edge_feat_dim + r_feat_dim
+ self.hk_func = MLP(kv_input_dim, output_dim, hidden_dim, norm=norm, act_fn=act_fn)
+
+ # attention value func
+ self.hv_func = MLP(kv_input_dim, output_dim, hidden_dim, norm=norm, act_fn=act_fn)
+
+ # attention query func
+ self.hq_func = MLP(input_dim, output_dim, hidden_dim, norm=norm, act_fn=act_fn)
+ if ew_net_type == 'r':
+ self.ew_net = nn.Sequential(nn.Linear(r_feat_dim, 1), nn.Sigmoid())
+ elif ew_net_type == 'm':
+ self.ew_net = nn.Sequential(nn.Linear(output_dim, 1), nn.Sigmoid())
+
+ if self.out_fc:
+ self.node_output = MLP(2 * hidden_dim, hidden_dim, hidden_dim, norm=norm, act_fn=act_fn)
+
+ def forward(self, h, r_feat, edge_feat, edge_index, e_w=None):
+ N = h.size(0)
+ src, dst = edge_index
+ hi, hj = h[dst], h[src]
+
+ # multi-head attention
+ # decide inputs of k_func and v_func
+ kv_input = torch.cat([r_feat, hi, hj], -1)
+ if edge_feat is not None:
+ kv_input = torch.cat([edge_feat, kv_input], -1)
+
+ # compute k
+ k = self.hk_func(kv_input).view(-1, self.n_heads, self.output_dim // self.n_heads)
+ # compute v
+ v = self.hv_func(kv_input)
+
+ if self.ew_net_type == 'r':
+ e_w = self.ew_net(r_feat)
+ elif self.ew_net_type == 'm':
+ e_w = self.ew_net(v[..., :self.hidden_dim])
+ elif e_w is not None:
+ e_w = e_w.view(-1, 1)
+ else:
+ e_w = 1.
+ v = v * e_w
+ v = v.view(-1, self.n_heads, self.output_dim // self.n_heads)
+
+ # compute q
+ q = self.hq_func(h).view(-1, self.n_heads, self.output_dim // self.n_heads)
+
+ # compute attention weights
+ alpha = scatter_softmax((q[dst] * k / np.sqrt(k.shape[-1])).sum(-1), dst, dim=0,
+ dim_size=N) # [num_edges, n_heads]
+
+ # perform attention-weighted message-passing
+ m = alpha.unsqueeze(-1) * v # (E, heads, H_per_head)
+ output = scatter_sum(m, dst, dim=0, dim_size=N) # (N, heads, H_per_head)
+ output = output.view(-1, self.output_dim)
+ if self.out_fc:
+ output = self.node_output(torch.cat([output, h], -1))
+
+ output = output + h
+ return output
+
+
+class BaseH2XAttLayer(nn.Module):
+ def __init__(self, input_dim, hidden_dim, output_dim, n_heads, edge_feat_dim, r_feat_dim,
+ act_fn='relu', norm=True, ew_net_type='r'):
+ super().__init__()
+ self.input_dim = input_dim
+ self.hidden_dim = hidden_dim
+ self.output_dim = output_dim
+ self.n_heads = n_heads
+ self.edge_feat_dim = edge_feat_dim
+ self.r_feat_dim = r_feat_dim
+ self.act_fn = act_fn
+ self.ew_net_type = ew_net_type
+
+ kv_input_dim = input_dim * 2 + edge_feat_dim + r_feat_dim
+
+ self.xk_func = MLP(kv_input_dim, output_dim, hidden_dim, norm=norm, act_fn=act_fn)
+ self.xv_func = MLP(kv_input_dim, self.n_heads, hidden_dim, norm=norm, act_fn=act_fn)
+ self.xq_func = MLP(input_dim, output_dim, hidden_dim, norm=norm, act_fn=act_fn)
+ if ew_net_type == 'r':
+ self.ew_net = nn.Sequential(nn.Linear(r_feat_dim, 1), nn.Sigmoid())
+
+ def forward(self, h, rel_x, r_feat, edge_feat, edge_index, e_w=None):
+ N = h.size(0)
+ src, dst = edge_index
+ hi, hj = h[dst], h[src]
+
+ # multi-head attention
+ # decide inputs of k_func and v_func
+ kv_input = torch.cat([r_feat, hi, hj], -1)
+ if edge_feat is not None:
+ kv_input = torch.cat([edge_feat, kv_input], -1)
+
+ k = self.xk_func(kv_input).view(-1, self.n_heads, self.output_dim // self.n_heads)
+ v = self.xv_func(kv_input)
+ if self.ew_net_type == 'r':
+ e_w = self.ew_net(r_feat)
+ elif self.ew_net_type == 'm':
+ e_w = 1.
+ elif e_w is not None:
+ e_w = e_w.view(-1, 1)
+ else:
+ e_w = 1.
+ v = v * e_w
+
+ v = v.unsqueeze(-1) * rel_x.unsqueeze(1) # (xi - xj) [n_edges, n_heads, 3]
+ q = self.xq_func(h).view(-1, self.n_heads, self.output_dim // self.n_heads)
+
+ # Compute attention weights
+ alpha = scatter_softmax((q[dst] * k / np.sqrt(k.shape[-1])).sum(-1), dst, dim=0, dim_size=N) # (E, heads)
+
+ # Perform attention-weighted message-passing
+ m = alpha.unsqueeze(-1) * v # (E, heads, 3)
+ output = scatter_sum(m, dst, dim=0, dim_size=N) # (N, heads, 3)
+ return output.mean(1) # [num_nodes, 3]
+
+def outer_product(*vectors):
+ for index, vector in enumerate(vectors):
+ if index == 0:
+ out = vector.unsqueeze(-1)
+ else:
+ out = out * vector.unsqueeze(1)
+ out = out.view(out.shape[0], -1).unsqueeze(-1)
+ return out.squeeze()
+
+
+class AttentionLayerO2TwoUpdateNodeGeneral(nn.Module):
+ def __init__(self, hidden_dim, n_heads, num_r_gaussian, edge_feat_dim, act_fn='relu', norm=True,
+ num_x2h=1, num_h2x=1, r_min=0., r_max=10., num_node_types=8,
+ ew_net_type='r', x2h_out_fc=True, sync_twoup=False):
+ super().__init__()
+ self.hidden_dim = hidden_dim
+ self.n_heads = n_heads
+ self.edge_feat_dim = edge_feat_dim
+ self.num_r_gaussian = num_r_gaussian
+ self.norm = norm
+ self.act_fn = act_fn
+ self.num_x2h = num_x2h
+ self.num_h2x = num_h2x
+ self.r_min, self.r_max = r_min, r_max
+ self.num_node_types = num_node_types
+ self.ew_net_type = ew_net_type
+ self.x2h_out_fc = x2h_out_fc
+ self.sync_twoup = sync_twoup
+
+ self.distance_expansion = GaussianSmearing(self.r_min, self.r_max, num_gaussians=num_r_gaussian)
+
+ self.x2h_layers = nn.ModuleList()
+ for i in range(self.num_x2h):
+ self.x2h_layers.append(
+ BaseX2HAttLayer(hidden_dim, hidden_dim, hidden_dim, n_heads, edge_feat_dim,
+ r_feat_dim=num_r_gaussian * 4,
+ act_fn=act_fn, norm=norm,
+ ew_net_type=self.ew_net_type, out_fc=self.x2h_out_fc)
+ )
+ self.h2x_layers = nn.ModuleList()
+ for i in range(self.num_h2x):
+ self.h2x_layers.append(
+ BaseH2XAttLayer(hidden_dim, hidden_dim, hidden_dim, n_heads, edge_feat_dim,
+ r_feat_dim=num_r_gaussian * 4,
+ act_fn=act_fn, norm=norm,
+ ew_net_type=self.ew_net_type)
+ )
+
+ def forward(self, h, x, edge_attr, edge_index, mask_ligand, e_w=None, fix_x=False):
+ src, dst = edge_index
+ if self.edge_feat_dim > 0:
+ edge_feat = edge_attr # shape: [#edges_in_batch, #bond_types]
+ else:
+ edge_feat = None
+
+ rel_x = x[dst] - x[src]
+ dist = torch.norm(rel_x, p=2, dim=-1, keepdim=True)
+
+ h_in = h
+ # 4 separate distance embedding for p-p, p-l, l-p, l-l
+ for i in range(self.num_x2h):
+ dist_feat = self.distance_expansion(dist)
+ dist_feat = outer_product(edge_attr, dist_feat)
+ h_out = self.x2h_layers[i](h_in, dist_feat, edge_feat, edge_index, e_w=e_w)
+ h_in = h_out
+ x2h_out = h_in
+
+ new_h = h if self.sync_twoup else x2h_out
+ for i in range(self.num_h2x):
+ dist_feat = self.distance_expansion(dist)
+ dist_feat = outer_product(edge_attr, dist_feat)
+ delta_x = self.h2x_layers[i](new_h, rel_x, dist_feat, edge_feat, edge_index, e_w=e_w)
+ if not fix_x:
+ x = x + delta_x * mask_ligand[:, None] # only ligand positions will be updated
+ rel_x = x[dst] - x[src]
+ dist = torch.norm(rel_x, p=2, dim=-1, keepdim=True)
+
+ return x2h_out, x
+
+
+class UniTransformerO2TwoUpdateGeneral(nn.Module):
+ def __init__(self, num_blocks, num_layers, hidden_dim, n_heads=1, knn=32,
+ num_r_gaussian=50, edge_feat_dim=0, num_node_types=8, act_fn='relu', norm=True,
+ cutoff_mode='radius', ew_net_type='r',
+ num_init_x2h=1, num_init_h2x=0, num_x2h=1, num_h2x=1, r_max=10., x2h_out_fc=True, sync_twoup=False, name='unio2net'):
+ super().__init__()
+ self.name = name
+ # Build the network
+ self.num_blocks = num_blocks
+ self.num_layers = num_layers
+ self.hidden_dim = hidden_dim
+ self.n_heads = n_heads
+ self.num_r_gaussian = num_r_gaussian
+ self.edge_feat_dim = edge_feat_dim
+ self.act_fn = act_fn
+ self.norm = norm
+ self.num_node_types = num_node_types
+ # radius graph / knn graph
+ self.cutoff_mode = cutoff_mode # [radius, none]
+ self.knn = knn
+ self.ew_net_type = ew_net_type # [r, m, none]
+
+ self.num_x2h = num_x2h
+ self.num_h2x = num_h2x
+ self.num_init_x2h = num_init_x2h
+ self.num_init_h2x = num_init_h2x
+ self.r_max = r_max
+ self.x2h_out_fc = x2h_out_fc
+ self.sync_twoup = sync_twoup
+ self.distance_expansion = GaussianSmearing(0., r_max, num_gaussians=num_r_gaussian)
+ if self.ew_net_type == 'global':
+ self.edge_pred_layer = MLP(num_r_gaussian, 1, hidden_dim)
+
+ self.init_h_emb_layer = self._build_init_h_layer()
+ self.base_block = self._build_share_blocks()
+
+ def __repr__(self):
+ return f'UniTransformerO2(num_blocks={self.num_blocks}, num_layers={self.num_layers}, n_heads={self.n_heads}, ' \
+ f'act_fn={self.act_fn}, norm={self.norm}, cutoff_mode={self.cutoff_mode}, ew_net_type={self.ew_net_type}, ' \
+ f'init h emb: {self.init_h_emb_layer.__repr__()} \n' \
+ f'base block: {self.base_block.__repr__()} \n' \
+ f'edge pred layer: {self.edge_pred_layer.__repr__() if hasattr(self, "edge_pred_layer") else "None"}) '
+
+ def _build_init_h_layer(self):
+ layer = AttentionLayerO2TwoUpdateNodeGeneral(
+ self.hidden_dim, self.n_heads, self.num_r_gaussian, self.edge_feat_dim, act_fn=self.act_fn, norm=self.norm,
+ num_x2h=self.num_init_x2h, num_h2x=self.num_init_h2x, r_max=self.r_max, num_node_types=self.num_node_types,
+ ew_net_type=self.ew_net_type, x2h_out_fc=self.x2h_out_fc, sync_twoup=self.sync_twoup,
+ )
+ return layer
+
+ def _build_share_blocks(self):
+ # Equivariant layers
+ base_block = []
+ for l_idx in range(self.num_layers):
+ layer = AttentionLayerO2TwoUpdateNodeGeneral(
+ self.hidden_dim, self.n_heads, self.num_r_gaussian, self.edge_feat_dim, act_fn=self.act_fn,
+ norm=self.norm,
+ num_x2h=self.num_x2h, num_h2x=self.num_h2x, r_max=self.r_max, num_node_types=self.num_node_types,
+ ew_net_type=self.ew_net_type, x2h_out_fc=self.x2h_out_fc, sync_twoup=self.sync_twoup,
+ )
+ base_block.append(layer)
+ return nn.ModuleList(base_block)
+
+ def _connect_edge(self, x, mask_ligand, batch):
+ if self.cutoff_mode == 'radius':
+ edge_index = radius_graph(x, r=self.r, batch=batch, flow='source_to_target')
+ elif self.cutoff_mode == 'knn':
+ edge_index = knn_graph(x, k=self.knn, batch=batch, flow='source_to_target')
+ else:
+ raise ValueError(f'Not supported cutoff mode: {self.cutoff_mode}')
+ return edge_index
+
+ @staticmethod
+ def _build_edge_type(edge_index, mask_ligand):
+ src, dst = edge_index
+ edge_type = torch.zeros(len(src)).to(edge_index)
+ n_src = mask_ligand[src] == 1
+ n_dst = mask_ligand[dst] == 1
+ edge_type[n_src & n_dst] = 0
+ edge_type[n_src & ~n_dst] = 1
+ edge_type[~n_src & n_dst] = 2
+ edge_type[~n_src & ~n_dst] = 3
+ edge_type = F.one_hot(edge_type, num_classes=4)
+ return edge_type
+
+ def forward(self, h, x, mask_ligand, batch, return_all=False, fix_x=False):
+ all_x = [x]
+ all_h = [h]
+
+ for b_idx in range(self.num_blocks):
+ edge_index = self._connect_edge(x, mask_ligand, batch)
+ src, dst = edge_index
+
+ # edge type (dim: 4)
+ edge_type = self._build_edge_type(edge_index, mask_ligand)
+ if self.ew_net_type == 'global':
+ dist = torch.norm(x[dst] - x[src], p=2, dim=-1, keepdim=True)
+ dist_feat = self.distance_expansion(dist)
+ logits = self.edge_pred_layer(dist_feat)
+ e_w = torch.sigmoid(logits)
+ else:
+ e_w = None
+
+ for l_idx, layer in enumerate(self.base_block):
+ h, x = layer(h, x, edge_type, edge_index, mask_ligand, e_w=e_w, fix_x=fix_x)
+ all_x.append(x)
+ all_h.append(h)
+
+ outputs = {'x': x, 'h': h}
+ if return_all:
+ outputs.update({'all_x': all_x, 'all_h': all_h})
+ return outputs
+
+class TimeEmbedLayer(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.time_emb = lambda x: x
+
+ def forward(self, t):
+ return self.time_emb(t)
+
+class ShiftedSoftplus(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.shift = torch.log(torch.tensor(2.0)).item()
+
+ def forward(self, x):
+ return F.softplus(x) - self.shift
+
+class MolCRAFT(StructureBasedDrugDesignModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(MolCRAFT, self).__init__(model_cfg)
+ self.config = model_cfg
+ self.node_indicator = getattr(model_cfg, 'node_indicator', False)
+ emb_dim = model_cfg.hidden_dim if not self.node_indicator else model_cfg.hidden_dim - 1
+
+ self.time_emb_layer = TimeEmbedLayer()
+ self.protein_atom_emb = nn.Linear(model_cfg.protein_atom_feature_dim, emb_dim)
+ self.ligand_atom_emb = nn.Linear(model_cfg.ligand_atom_feature_dim + 1, emb_dim)
+ self.unio2net = UniTransformerO2TwoUpdateGeneral(**model_cfg.unio2net.todict())
+ self.v_inference = nn.Sequential(
+ nn.Linear(model_cfg.hidden_dim, model_cfg.hidden_dim),
+ ShiftedSoftplus(),
+ nn.Linear(model_cfg.hidden_dim, model_cfg.ligand_atom_feature_dim),
+ ) # [hidden to 13]
+ self.sigma1_coord = torch.tensor(model_cfg.sigma1_coord, dtype=torch.float32)
+ self.beta1 = torch.tensor(model_cfg.beta1, dtype=torch.float32)
+
+ self.featurizers = {
+ "molecule": MolCRAFTMoleculeFeaturizer(pos_norm=model_cfg.pos_norm),
+ "pocket": MolCRAFTPocketFeaturizer(pos_norm=model_cfg.pos_norm),
+ }
+ self.collators = {
+ "molecule": PygCollator(follow_batch=["mu_pos"]),
+ "pocket": PygCollator(follow_batch=["pos"])
+ }
+
+ for parent in reversed(type(self).__mro__[1:-1]):
+ if hasattr(parent, '_add_task'):
+ parent._add_task(self)
+
+ def continuous_var_bayesian_update(self, t: torch.Tensor, x: torch.Tensor) -> torch.Tensor:
+ # Eq.(77): p_F(θ|x;t) ~ N (μ | γ(t)x, γ(t)(1 − γ(t))I)
+ gamma = (1 - torch.pow(self.sigma1_coord, 2 * t)) # [B]
+ mu = gamma * x + torch.sqrt(gamma* (1 - gamma)) * torch.randn_like(x)
+ return mu, gamma
+
+ def discrete_var_bayesian_update(self, t: torch.Tensor, x: torch.Tensor, K: int) -> torch.Tensor:
+ # Eq.(182): β(t) = t**2 β(1)
+ beta = (self.config.beta1 * (t**2)) # (B,)
+
+ # Eq.(185): p_F(θ|x;t) = E_{N(y | β(t)(Ke_x−1), β(t)KI)} δ (θ − softmax(y))
+ # can be sampled by first drawing y ~ N(y | β(t)(Ke_x−1), β(t)KI)
+ # then setting θ = softmax(y)
+ one_hot_x = x # (N, K)
+ mean = beta * (K * one_hot_x - 1)
+ std = (beta * K).sqrt()
+ eps = torch.randn_like(mean)
+ y = mean + std * eps
+ theta = F.softmax(y, dim=-1)
+ return theta
+
+ def compose_context(self, h_protein, h_ligand, pos_protein, pos_ligand, batch_protein, batch_ligand):
+ # previous version has problems when ligand atom types are fixed
+ # (due to sorting randomly in case of same element)
+
+ batch_ctx = torch.cat([batch_protein, batch_ligand], dim=0)
+ sort_idx = torch.sort(batch_ctx, stable=True).indices
+
+ mask_ligand = torch.cat([
+ torch.zeros([batch_protein.size(0)], device=batch_protein.device).bool(),
+ torch.ones([batch_ligand.size(0)], device=batch_ligand.device).bool(),
+ ], dim=0)[sort_idx]
+
+ batch_ctx = batch_ctx[sort_idx]
+ h_ctx = torch.cat([h_protein, h_ligand], dim=0)[sort_idx] # (N_protein+N_ligand, H)
+ pos_ctx = torch.cat([pos_protein, pos_ligand], dim=0)[sort_idx] # (N_protein+N_ligand, 3)
+
+ return h_ctx, pos_ctx, batch_ctx, mask_ligand
+
+ def interdependency_modeling(
+ self,
+ time,
+ protein_pos, # transform from the orginal BFN codebase
+ protein_v, # transform from
+ batch_protein, # index for protein
+ theta_h_t,
+ mu_pos_t,
+ batch_ligand, # index for ligand
+ gamma_coord,
+ return_all=False, # legacy from targetdiff
+ fix_x=False,
+ ):
+ """
+ Compute output distribution parameters for p_O (x' | θ; t) (x_hat or k^(d) logits).
+ Draw output_sample = x' ~ p_O (x' | θ; t).
+ continuous x ~ δ(x - x_hat(θ, t))
+ discrete k^(d) ~ softmax(Ψ^(d)(θ, t))_k
+ Args:
+ time: [node_num x batch_size, 1] := [N_ligand, 1]
+ protein_pos: [node_num x batch_size, 3] := [N_protein, 3]
+ protein_v: [node_num x batch_size, protein_atom_feature_dim] := [N_protein, 27]
+ batch_protein: [node_num x batch_size] := [N_protein]
+ theta_h_t: [node_num x batch_size, atom_type] := [N_ligand, 13]
+ mu_pos_t: [node_num x batch_size, 3] := [N_ligand, 3]
+ batch_ligand: [node_num x batch_size] := [N_ligand]
+ gamma_coord: [node_num x batch_size, 1] := [N_ligand, 1]
+ """
+ theta_h_t = 2 * theta_h_t - 1 # from 1/K \in [0,1] to 2/K-1 \in [-1,1]
+
+ # ---------for targetdiff-----------
+ init_ligand_v = theta_h_t
+ # time embedding
+ time_emb = self.time_emb_layer(time)
+ input_ligand_feat = torch.cat([init_ligand_v, time_emb], -1)
+
+ h_protein = self.protein_atom_emb(protein_v) # [N_protein, self.hidden_dim - 1]
+ init_ligand_h = self.ligand_atom_emb(input_ligand_feat) # [N_ligand, self.hidden_dim - 1]
+
+ if self.node_indicator:
+ h_protein = torch.cat(
+ [h_protein, torch.zeros(len(h_protein), 1).to(h_protein)], -1
+ ) # [N_ligand, self.hidden_dim]
+ init_ligand_h = torch.cat(
+ [init_ligand_h, torch.ones(len(init_ligand_h), 1).to(h_protein)], -1
+ ) # [N_ligand, self.hidden_dim]
+
+ h_all, pos_all, batch_all, mask_ligand = self.compose_context(
+ h_protein=h_protein,
+ h_ligand=init_ligand_h,
+ pos_protein=protein_pos,
+ pos_ligand=mu_pos_t,
+ batch_protein=batch_protein,
+ batch_ligand=batch_ligand,
+ )
+ # get the context for the protein and ligand, while the ligand is h is noisy (h_t)/ pos is also the noise version. (pos_t)
+
+ # time = 2 * time - 1
+ outputs = self.unio2net(
+ h_all, pos_all, mask_ligand, batch_all, return_all=return_all, fix_x=fix_x
+ )
+ final_pos, final_h = outputs["x"], outputs["h"]
+ final_ligand_pos, final_ligand_h = final_pos[mask_ligand], final_h[mask_ligand]
+ final_ligand_v = self.v_inference(final_ligand_h) # [N_ligand, 13]
+
+ # 1. for continuous, network outputs eps_hat(θ, t)
+ # Eq.(84): x_hat(θ, t) = μ / γ(t) − \sqrt{(1 − γ(t)) / γ(t)} * eps_hat(θ, t)
+ # 2. for discrete, network outputs Ψ(θ, t)
+ # take softmax will do
+ return final_ligand_pos, F.softmax(final_ligand_v, dim=-1), torch.zeros_like(mu_pos_t)
+
+ def create_dummy_molecule(self, pocket: Featurized[Pocket]) -> Featurized[Molecule]:
+ num_atoms = pocket["estimated_ligand_num_atoms"].cpu()
+ return Data(**{
+ "mu_pos": torch.zeros(num_atoms.sum().item(), 3),
+ "theta_h": torch.ones(num_atoms.sum().item(), self.config.ligand_atom_feature_dim) / self.config.ligand_atom_feature_dim,
+ "mu_pos_batch": torch.repeat_interleave(torch.arange(len(num_atoms)), num_atoms),
+ }).to(pocket["atom_feature"].device)
+
+ @torch.no_grad()
+ def sample(self, molecule: Featurized[Molecule], pocket: Featurized[Pocket]) -> List[Molecule]:
+ in_traj, out_traj = [], []
+ device = molecule['mu_pos'].device
+ num_atoms = molecule['mu_pos_batch'].shape[0]
+
+ for step in tqdm(range(1, self.config.num_sample_steps + 1), desc="Sampling"):
+ t = torch.ones((num_atoms, 1), dtype=torch.float, device=device) * (step - 1) / self.config.num_sample_steps
+ gamma_coord = 1 - torch.pow(self.sigma1_coord, 2 * t)
+ in_traj.append((molecule["mu_pos"].clone(), molecule["theta_h"].clone()))
+ coord_pred, p0_h, _ = self.interdependency_modeling(
+ time=t,
+ protein_pos=pocket['pos'],
+ protein_v=pocket['atom_feature'],
+ batch_protein=pocket['pos_batch'],
+ batch_ligand=molecule['mu_pos_batch'],
+ theta_h_t=molecule['theta_h'],
+ mu_pos_t=molecule['mu_pos'],
+ gamma_coord=gamma_coord,
+ )
+ out_traj.append((coord_pred.detach().clone(), p0_h.detach().clone()))
+
+ t = torch.ones((num_atoms, 1), dtype=torch.float, device=device) * step / self.config.num_sample_steps
+ molecule['theta_h'] = self.discrete_var_bayesian_update(t, p0_h, self.config.ligand_atom_feature_dim)
+ molecule['mu_pos'], _ = self.continuous_var_bayesian_update(t, coord_pred)
+
+ """
+ if (step - 1) % 10 == 0:
+ print(molecule['mu_pos'][:10])
+ print(molecule['theta_h'][:10])
+ """
+
+ # Compute final output distribution parameters for p_O (x' | θ; t)
+ in_traj.append((molecule["mu_pos"].detach().clone(), molecule["theta_h"].detach().clone()))
+ mu_pos_final, p0_h_final, _ = self.interdependency_modeling(
+ time=torch.ones((num_atoms, 1)).to(device),
+ protein_pos=pocket['pos'],
+ protein_v=pocket['atom_feature'],
+ batch_protein=pocket['pos_batch'],
+ batch_ligand=molecule['mu_pos_batch'],
+ theta_h_t=molecule['theta_h'],
+ mu_pos_t=molecule['mu_pos'],
+ gamma_coord=1 - self.sigma1_coord ** 2, # γ(t) = 1 − (σ1**2) ** t
+ )
+ p0_h_final = torch.clamp(p0_h_final, min=1e-6)
+ out_traj.append((mu_pos_final.detach().clone(), p0_h_final.detach().clone()))
+
+ num_mols = molecule['mu_pos_batch'].max() + 1
+ in_traj_split, out_traj_split = [], []
+ out_molecules = []
+ for i in range(num_mols):
+ cur_molecule = {}
+ idx = torch.where(molecule['mu_pos_batch'] == i)[0]
+ in_traj_split.append({
+ "pos": torch.stack([in_traj[j][0][idx] for j in range(len(in_traj))], dim=0),
+ "atom_type": torch.stack([in_traj[j][1][idx] for j in range(len(in_traj))], dim=0),
+ })
+ out_traj_split.append({
+ "pos": torch.stack([out_traj[j][0][idx] for j in range(len(out_traj))], dim=0),
+ "atom_type": torch.stack([out_traj[j][1][idx] for j in range(len(out_traj))], dim=0),
+ })
+ cur_molecule = {
+ "pos": out_traj_split[i]["pos"][-1],
+ "atom_type": torch.argmax(out_traj_split[i]["atom_type"][-1], dim=-1),
+ }
+ out_molecules.append(self.featurizers["molecule"].decode(cur_molecule, pocket["pocket_center"][i]))
+ """
+ import pickle
+ from datetime import datetime
+ pickle.dump({
+ "in_traj": in_traj_split[0],
+ "out_traj": out_traj_split[0],
+ }, open(f"./tmp/debug_traj_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pkl", "wb"))
+ """
+ return out_molecules
+
+ def forward_structure_based_drug_design(self, pocket: Featurized[Pocket], label: Featurized[Molecule]) -> Dict[str, torch.Tensor]:
+ pass
+
+ @torch.no_grad()
+ def predict_structure_based_drug_design(self, pocket: Featurized[Pocket]) -> F.List[Molecule]:
+ molecule = self.create_dummy_molecule(pocket)
+ return self.sample(molecule, pocket)
\ No newline at end of file
diff --git a/open_biomed/models/protein/esmfold/esmfold.py b/open_biomed/models/protein/esmfold/esmfold.py
new file mode 100644
index 0000000000000000000000000000000000000000..1db00d16bf4745a33e60d23cc69dd05a809847e2
--- /dev/null
+++ b/open_biomed/models/protein/esmfold/esmfold.py
@@ -0,0 +1,107 @@
+import contextlib
+from typing import Any, Dict, List, Optional, Tuple
+
+from huggingface_hub import snapshot_download
+import logging
+import os
+import torch
+import torch.nn as nn
+from transformers import EsmTokenizer, DataCollatorWithPadding
+
+from open_biomed.models.protein.esmfold.modeling_esmfold import EsmForProteinFolding
+from open_biomed.data import Protein
+from open_biomed.models.task_models.protein_folding import ProteinFoldingModel
+from open_biomed.utils.collator import Collator, EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import Featurizer, Featurized
+
+class ProteinEsmFeaturizer(Featurizer):
+ def __init__(self,
+ protein_tokenizer: EsmTokenizer,
+ max_length_protein: int=1024,
+ add_special_tokens: bool=False,
+ ) -> None:
+ super().__init__()
+ self.protein_tokenizer = protein_tokenizer
+ self.max_length_protein = max_length_protein
+ self.add_special_tokens = add_special_tokens
+
+ def __call__(self, protein: Protein) -> Dict[str, Any]:
+ sequence = protein.sequence
+
+ featurized = {}
+ featurized["protein"] = self.protein_tokenizer(
+ sequence,
+ max_length=self.max_length_protein,
+ truncation=True,
+ add_special_tokens=self.add_special_tokens,
+ )
+
+ return featurized
+
+ def get_attrs(self) -> List[str]:
+ return ["protein"]
+
+
+class EsmFold(ProteinFoldingModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(EsmFold, self).__init__(model_cfg)
+ if not os.path.exists(model_cfg.hf_model_name_or_path):
+ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
+ logging.info("Repo not found. Try downloading from snapshot")
+ snapshot_download(repo_id="facebook/esmfold_v1", local_dir=model_cfg.hf_model_name_or_path, force_download=True)
+ # load tokenizer
+ logging.info("*** loading protein esm tokenizer...")
+ self.protein_tokenizer = EsmTokenizer.from_pretrained(model_cfg.hf_model_name_or_path)
+ # load esmfold model
+ logging.info("*** loading protein folding model...")
+ self.protein_model = EsmForProteinFolding.from_pretrained(model_cfg.hf_model_name_or_path, low_cpu_mem_usage=True)
+
+ if model_cfg.chunk_size:
+ self.protein_model.trunk.set_chunk_size(model_cfg.chunk_size)
+
+ for parent in reversed(type(self).__mro__[1:-1]):
+ if hasattr(parent, '_add_task'):
+ parent._add_task(self)
+
+ def maybe_autocast(self, device="cuda:0", dtype=torch.bfloat16):
+ # if on cpu, don't use autocast
+ # if on gpu, use autocast with dtype if provided, otherwise use torch.float16
+ enable_autocast = device != torch.device("cpu")
+
+ if enable_autocast:
+ return torch.cuda.amp.autocast(dtype=dtype)
+ else:
+ return contextlib.nullcontext()
+
+ def featurizer_protein_folding(self) -> Tuple[Featurizer, Collator]:
+ return ProteinEsmFeaturizer(
+ protein_tokenizer=self.protein_tokenizer,
+ max_length_protein=self.config.max_length,
+ add_special_tokens=False,
+ ), EnsembleCollator({
+ "protein": DataCollatorWithPadding(
+ self.protein_tokenizer,
+ padding=True
+ )
+ })
+
+ def forward_protein_folding(self, protein: Featurized[Protein], **kwargs) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError("Training EsmFold is currently unavailable! Please see https://github.com/facebookresearch/esm/blob/main/esm/esmfold/v1/esmfold.py for more details.")
+
+ @torch.no_grad()
+ def predict_protein_folding(self,
+ protein: Featurized[Protein],
+ **kwargs
+ ) -> List[str]:
+ device = protein.input_ids.device
+
+ with self.maybe_autocast(device, dtype=torch.float16 if device != torch.device('cpu') and self.config.use_fp16_for_esm else torch.float32):
+ output = self.protein_model(protein.input_ids)
+
+ # TODO: convert output to open_biomed.data.Protein
+ output = self.protein_model.output_to_pdb(output)
+ output = [Protein.from_pdb(item.split("\n")) for item in output]
+
+ return output
+
\ No newline at end of file
diff --git a/open_biomed/models/protein/esmfold/modeling_esmfold.py b/open_biomed/models/protein/esmfold/modeling_esmfold.py
new file mode 100644
index 0000000000000000000000000000000000000000..029c56835fe72939f087c466659d146b76755eaf
--- /dev/null
+++ b/open_biomed/models/protein/esmfold/modeling_esmfold.py
@@ -0,0 +1,2319 @@
+# coding=utf-8
+# Copyright 2022 Meta and The HuggingFace Inc. team. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import math
+import sys
+from dataclasses import dataclass
+from functools import partial
+from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union
+
+import numpy as np
+import torch
+import torch.nn as nn
+from torch.nn import LayerNorm
+from transformers.deepspeed import is_deepspeed_available
+from transformers.modeling_outputs import ModelOutput
+from transformers.utils import (
+ ContextManagers,
+ add_start_docstrings,
+ add_start_docstrings_to_model_forward,
+ is_scipy_available,
+ logging,
+ replace_return_docstrings,
+)
+
+from transformers.models.esm.configuration_esm import EsmConfig
+from transformers.models.esm.modeling_esm import ESM_START_DOCSTRING, EsmModel, EsmPreTrainedModel
+from transformers.models.esm.openfold_utils import (
+ OFProtein,
+ Rigid,
+ Rotation,
+ atom14_to_atom37,
+ chunk_layer,
+ compute_predicted_aligned_error,
+ compute_tm,
+ frames_and_literature_positions_to_atom14_pos,
+ make_atom14_masks,
+ residue_constants,
+ to_pdb,
+ torsion_angles_to_frames,
+)
+
+logger = logging.get_logger(__name__)
+_CHECKPOINT_FOR_DOC = "facebook/esmfold_v1"
+_CONFIG_FOR_DOC = "EsmConfig"
+
+
+@dataclass
+class EsmForProteinFoldingOutput(ModelOutput):
+ """
+ Output type of [`EsmForProteinFoldingOutput`].
+
+ Args:
+ frames (`torch.FloatTensor`):
+ Output frames.
+ sidechain_frames (`torch.FloatTensor`):
+ Output sidechain frames.
+ unnormalized_angles (`torch.FloatTensor`):
+ Predicted unnormalized backbone and side chain torsion angles.
+ angles (`torch.FloatTensor`):
+ Predicted backbone and side chain torsion angles.
+ positions (`torch.FloatTensor`):
+ Predicted positions of the backbone and side chain atoms.
+ states (`torch.FloatTensor`):
+ Hidden states from the protein folding trunk.
+ s_s (`torch.FloatTensor`):
+ Per-residue embeddings derived by concatenating the hidden states of each layer of the ESM-2 LM stem.
+ s_z (`torch.FloatTensor`):
+ Pairwise residue embeddings.
+ distogram_logits (`torch.FloatTensor`):
+ Input logits to the distogram used to compute residue distances.
+ lm_logits (`torch.FloatTensor`):
+ Logits output by the ESM-2 protein language model stem.
+ aatype (`torch.FloatTensor`):
+ Input amino acids (AlphaFold2 indices).
+ atom14_atom_exists (`torch.FloatTensor`):
+ Whether each atom exists in the atom14 representation.
+ residx_atom14_to_atom37 (`torch.FloatTensor`):
+ Mapping between atoms in the atom14 and atom37 representations.
+ residx_atom37_to_atom14 (`torch.FloatTensor`):
+ Mapping between atoms in the atom37 and atom14 representations.
+ atom37_atom_exists (`torch.FloatTensor`):
+ Whether each atom exists in the atom37 representation.
+ residue_index (`torch.FloatTensor`):
+ The index of each residue in the protein chain. Unless internal padding tokens are used, this will just be
+ a sequence of integers from 0 to `sequence_length`.
+ lddt_head (`torch.FloatTensor`):
+ Raw outputs from the lddt head used to compute plddt.
+ plddt (`torch.FloatTensor`):
+ Per-residue confidence scores. Regions of low confidence may indicate areas where the model's prediction is
+ uncertain, or where the protein structure is disordered.
+ ptm_logits (`torch.FloatTensor`):
+ Raw logits used for computing ptm.
+ ptm (`torch.FloatTensor`):
+ TM-score output representing the model's high-level confidence in the overall structure.
+ aligned_confidence_probs (`torch.FloatTensor`):
+ Per-residue confidence scores for the aligned structure.
+ predicted_aligned_error (`torch.FloatTensor`):
+ Predicted error between the model's prediction and the ground truth.
+ max_predicted_aligned_error (`torch.FloatTensor`):
+ Per-sample maximum predicted error.
+ """
+
+ frames: torch.FloatTensor = None
+ sidechain_frames: torch.FloatTensor = None
+ unnormalized_angles: torch.FloatTensor = None
+ angles: torch.FloatTensor = None
+ positions: torch.FloatTensor = None
+ states: torch.FloatTensor = None
+ s_s: torch.FloatTensor = None
+ s_z: torch.FloatTensor = None
+ distogram_logits: torch.FloatTensor = None
+ lm_logits: torch.FloatTensor = None
+ aatype: torch.FloatTensor = None
+ atom14_atom_exists: torch.FloatTensor = None
+ residx_atom14_to_atom37: torch.FloatTensor = None
+ residx_atom37_to_atom14: torch.FloatTensor = None
+ atom37_atom_exists: torch.FloatTensor = None
+ residue_index: torch.FloatTensor = None
+ lddt_head: torch.FloatTensor = None
+ plddt: torch.FloatTensor = None
+ ptm_logits: torch.FloatTensor = None
+ ptm: torch.FloatTensor = None
+ aligned_confidence_probs: torch.FloatTensor = None
+ predicted_aligned_error: torch.FloatTensor = None
+ max_predicted_aligned_error: torch.FloatTensor = None
+
+
+ESMFOLD_INPUTS_DOCSTRING = r"""
+ Args:
+ input_ids (`torch.LongTensor` of shape `({0})`):
+ Indices of input sequence tokens in the vocabulary.
+
+ Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
+ [`PreTrainedTokenizer.__call__`] for details.
+
+ [What are input IDs?](../glossary#input-ids)
+ attention_mask (`torch.FloatTensor` of shape `({0})`, *optional*):
+ Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`:
+
+ - 1 for tokens that are **not masked**,
+ - 0 for tokens that are **masked**.
+
+ [What are attention masks?](../glossary#attention-mask)
+ position_ids (`torch.LongTensor` of shape `({0})`, *optional*):
+ Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
+ config.max_position_embeddings - 1]`.
+
+ [What are position IDs?](../glossary#position-ids)
+ masking_pattern (`torch.LongTensor` of shape `({0})`, *optional*):
+ Locations of tokens to mask during training as a form of regularization. Mask values selected in `[0, 1]`.
+ num_recycles (`int`, *optional*, defaults to `None`):
+ Number of times to recycle the input sequence. If `None`, defaults to `config.num_recycles`. "Recycling"
+ consists of passing the output of the folding trunk back in as input to the trunk. During training, the
+ number of recycles should vary with each batch, to ensure that the model learns to output valid predictions
+ after each recycle. During inference, num_recycles should be set to the highest value that the model was
+ trained with for maximum accuracy. Accordingly, when this value is set to `None`, config.max_recycles is
+ used.
+"""
+
+
+def is_fp16_enabled():
+ # Autocast world
+ fp16_enabled = torch.get_autocast_gpu_dtype() == torch.float16
+ fp16_enabled = fp16_enabled and torch.is_autocast_enabled()
+
+ return fp16_enabled
+
+
+def is_deepspeed_initialized():
+ if is_deepspeed_available():
+ return False
+ else:
+ try:
+ import deepspeed
+
+ # This is not available in all DeepSpeed versions.
+ return deepspeed.utils.is_initialized()
+ except Exception:
+ return False
+
+
+def collate_dense_tensors(samples: List[torch.Tensor], pad_v: float = 0) -> torch.Tensor:
+ """
+ Takes a list of tensors with the following dimensions:
+ [(d_11, ..., d_1K),
+ (d_21, ..., d_2K), ..., (d_N1, ..., d_NK)]
+ and stack + pads them into a single tensor of:
+ (N, max_i=1,N { d_i1 }, ..., max_i=1,N {diK})
+ """
+ if len(samples) == 0:
+ return torch.Tensor()
+ if len({x.dim() for x in samples}) != 1:
+ raise RuntimeError(f"Samples has varying dimensions: {[x.dim() for x in samples]}")
+ (device,) = tuple({x.device for x in samples}) # assumes all on same device
+ max_shape = [max(lst) for lst in zip(*[x.shape for x in samples])]
+ result = torch.empty(len(samples), *max_shape, dtype=samples[0].dtype, device=device)
+ result.fill_(pad_v)
+ for i in range(len(samples)):
+ result_i = result[i]
+ t = samples[i]
+ result_i[tuple(slice(0, k) for k in t.shape)] = t
+ return result
+
+
+def flatten_final_dims(t: torch.Tensor, no_dims: int):
+ return t.reshape(t.shape[:-no_dims] + (-1,))
+
+
+def permute_final_dims(tensor: torch.Tensor, inds: List[int]):
+ zero_index = -1 * len(inds)
+ first_inds = list(range(len(tensor.shape[:zero_index])))
+ return tensor.permute(first_inds + [zero_index + i for i in inds])
+
+
+def dict_multimap(fn, dicts):
+ first = dicts[0]
+ new_dict = {}
+ for k, v in first.items():
+ all_v = [d[k] for d in dicts]
+ if type(v) is dict:
+ new_dict[k] = dict_multimap(fn, all_v)
+ else:
+ new_dict[k] = fn(all_v)
+
+ return new_dict
+
+
+def trunc_normal_init_(weights, scale=1.0, fan="fan_in"):
+ shape = weights.shape
+ scale = scale / max(1, shape[1])
+
+ if not is_scipy_available():
+ logger.warning(
+ "This init requires scipy, but scipy was not found, default to an approximation that might not be"
+ " equivalent."
+ )
+ std = math.sqrt(scale)
+ torch.nn.init.normal_(weights, std=std).clamp(min=0.0, max=2.0 * std)
+
+ else:
+ from scipy.stats import truncnorm
+
+ std = math.sqrt(scale) / truncnorm.std(a=-2, b=2, loc=0, scale=1)
+ samples = truncnorm.rvs(a=-2, b=2, loc=0, scale=std, size=weights.numel())
+ samples = np.reshape(samples, shape)
+ weights.copy_(torch.tensor(samples, device=weights.device))
+
+
+def ipa_point_weights_init_(weights):
+ with torch.no_grad():
+ softplus_inverse_1 = 0.541324854612918
+ weights.fill_(softplus_inverse_1)
+
+
+class EsmFoldLinear(nn.Linear):
+ """
+ A Linear layer with built-in nonstandard initializations. Called just like torch.nn.Linear.
+
+ Implements the initializers in 1.11.4, plus some additional ones found in the code.
+ """
+
+ def __init__(
+ self,
+ in_dim: int,
+ out_dim: int,
+ bias: bool = True,
+ init: str = "default",
+ init_fn: Optional[Callable[[torch.Tensor, torch.Tensor], None]] = None,
+ ):
+ """
+ Args:
+ in_dim:
+ The final dimension of inputs to the layer
+ out_dim:
+ The final dimension of layer outputs
+ bias:
+ Whether to learn an additive bias. True by default
+ init:
+ The initializer to use. Choose from:
+
+ "default": LeCun fan-in truncated normal initialization "relu": He initialization w/ truncated normal
+ distribution "glorot": Fan-average Glorot uniform initialization "gating": Weights=0, Bias=1 "normal":
+ Normal initialization with std=1/sqrt(fan_in) "final": Weights=0, Bias=0
+
+ Overridden by init_fn if the latter is not None.
+ init_fn:
+ A custom initializer taking weight and bias as inputs. Overrides init if not None.
+ """
+ super().__init__(in_dim, out_dim, bias=bias)
+
+ if bias:
+ with torch.no_grad():
+ self.bias.fill_(0)
+ self.init = init
+ self.init_fn = init_fn
+
+ if init not in ["default", "relu", "glorot", "gating", "normal", "final"]:
+ raise ValueError("Invalid init string.")
+
+
+class EsmFoldLayerNorm(nn.Module):
+ def __init__(self, c_in, eps=1e-5):
+ super().__init__()
+
+ self.c_in = (c_in,)
+ self.eps = eps
+
+ self.weight = nn.Parameter(torch.ones(c_in))
+ self.bias = nn.Parameter(torch.zeros(c_in))
+
+ def forward(self, x):
+ d = x.dtype
+ if d is torch.bfloat16 and not is_deepspeed_initialized():
+ with torch.cuda.amp.autocast(enabled=False):
+ out = nn.functional.layer_norm(x, self.c_in, self.weight.to(dtype=d), self.bias.to(dtype=d), self.eps)
+ else:
+ out = nn.functional.layer_norm(x, self.c_in, self.weight, self.bias, self.eps)
+
+ return out
+
+
+@torch.jit.ignore
+def softmax_no_cast(t: torch.Tensor, dim: int = -1) -> torch.Tensor:
+ """
+ Softmax, but without automatic casting to fp32 when the input is of type bfloat16
+ """
+ d = t.dtype
+ if d is torch.bfloat16 and not is_deepspeed_initialized():
+ with torch.cuda.amp.autocast(enabled=False):
+ s = torch.nn.functional.softmax(t, dim=dim)
+ else:
+ s = torch.nn.functional.softmax(t, dim=dim)
+
+ return s
+
+
+class EsmFoldAttention(nn.Module):
+ """
+ Standard multi-head attention using AlphaFold's default layer initialization. Allows multiple bias vectors.
+ """
+
+ def __init__(
+ self,
+ c_q: int,
+ c_k: int,
+ c_v: int,
+ c_hidden: int,
+ no_heads: int,
+ gating: bool = True,
+ ):
+ """
+ Args:
+ c_q:
+ Input dimension of query data
+ c_k:
+ Input dimension of key data
+ c_v:
+ Input dimension of value data
+ c_hidden:
+ Per-head hidden dimension
+ no_heads:
+ Number of attention heads
+ gating:
+ Whether the output should be gated using query data
+ """
+ super().__init__()
+
+ self.c_q = c_q
+ self.c_k = c_k
+ self.c_v = c_v
+ self.c_hidden = c_hidden
+ self.no_heads = no_heads
+ self.gating = gating
+
+ # DISCREPANCY: c_hidden is not the per-head channel dimension, as
+ # stated in the supplement, but the overall channel dimension.
+
+ self.linear_q = EsmFoldLinear(self.c_q, self.c_hidden * self.no_heads, bias=False, init="glorot")
+ self.linear_k = EsmFoldLinear(self.c_k, self.c_hidden * self.no_heads, bias=False, init="glorot")
+ self.linear_v = EsmFoldLinear(self.c_v, self.c_hidden * self.no_heads, bias=False, init="glorot")
+ self.linear_o = EsmFoldLinear(self.c_hidden * self.no_heads, self.c_q, init="final")
+
+ self.linear_g = None
+ if self.gating:
+ self.linear_g = EsmFoldLinear(self.c_q, self.c_hidden * self.no_heads, init="gating")
+
+ self.sigmoid = nn.Sigmoid()
+
+ def _prep_qkv(self, q_x: torch.Tensor, kv_x: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
+ # [*, Q/K/V, H * C_hidden]
+ q = self.linear_q(q_x)
+ k = self.linear_k(kv_x)
+ v = self.linear_v(kv_x)
+
+ # [*, Q/K, H, C_hidden]
+ q = q.view(q.shape[:-1] + (self.no_heads, -1))
+ k = k.view(k.shape[:-1] + (self.no_heads, -1))
+ v = v.view(v.shape[:-1] + (self.no_heads, -1))
+
+ # [*, H, Q/K, C_hidden]
+ q = q.transpose(-2, -3)
+ k = k.transpose(-2, -3)
+ v = v.transpose(-2, -3)
+
+ q /= math.sqrt(self.c_hidden)
+
+ return q, k, v
+
+ def _wrap_up(self, o: torch.Tensor, q_x: torch.Tensor) -> torch.Tensor:
+ if self.linear_g is not None:
+ g = self.sigmoid(self.linear_g(q_x))
+
+ # [*, Q, H, C_hidden]
+ g = g.view(g.shape[:-1] + (self.no_heads, -1))
+ o = o * g
+
+ # [*, Q, H * C_hidden]
+ o = flatten_final_dims(o, 2)
+
+ # [*, Q, C_q]
+ o = self.linear_o(o)
+
+ return o
+
+ def forward(
+ self,
+ q_x: torch.Tensor,
+ kv_x: torch.Tensor,
+ biases: Optional[List[torch.Tensor]] = None,
+ use_memory_efficient_kernel: bool = False,
+ use_lma: bool = False,
+ lma_q_chunk_size: int = 1024,
+ lma_kv_chunk_size: int = 4096,
+ use_flash: bool = False,
+ flash_mask: Optional[torch.Tensor] = None,
+ ) -> torch.Tensor:
+ """
+ Args:
+ q_x:
+ [*, Q, C_q] query data
+ kv_x:
+ [*, K, C_k] key data
+ biases:
+ List of biases that broadcast to [*, H, Q, K]
+ use_memory_efficient_kernel:
+ Whether to use a custom memory-efficient attention kernel. This should be the default choice for most.
+ If none of the "use_<...>" flags are True, a stock PyTorch implementation is used instead
+ use_lma:
+ Whether to use low-memory attention (Staats & Rabe 2021). If none of the "use_<...>" flags are True, a
+ stock PyTorch implementation is used instead
+ lma_q_chunk_size:
+ Query chunk size (for LMA)
+ lma_kv_chunk_size:
+ Key/Value chunk size (for LMA)
+ Returns
+ [*, Q, C_q] attention update
+ """
+ if use_lma and (lma_q_chunk_size is None or lma_kv_chunk_size is None):
+ raise ValueError("If use_lma is specified, lma_q_chunk_size and lma_kv_chunk_size must be provided")
+
+ if use_flash and biases is not None:
+ raise ValueError("use_flash is incompatible with the bias option. For masking, use flash_mask instead")
+
+ attn_options = [use_memory_efficient_kernel, use_lma, use_flash]
+ if sum(attn_options) > 1:
+ raise ValueError("Choose at most one alternative attention algorithm")
+
+ if biases is None:
+ biases = []
+
+ # [*, H, Q/K, C_hidden]
+ query, key, value = self._prep_qkv(q_x, kv_x)
+ key = permute_final_dims(key, (1, 0))
+
+ # [*, H, Q, K]
+ output = torch.matmul(query, key)
+ for b in biases:
+ output += b
+ output = softmax_no_cast(output, -1)
+
+ # [*, H, Q, C_hidden]
+ output = torch.matmul(output, value)
+ output = output.transpose(-2, -3)
+ output = self._wrap_up(output, q_x)
+
+ return output
+
+
+class EsmFoldTriangleAttention(nn.Module):
+ def __init__(self, c_in, c_hidden, no_heads, starting=True, inf=1e9):
+ """
+ Args:
+ c_in:
+ Input channel dimension
+ c_hidden:
+ Overall hidden channel dimension (not per-head)
+ no_heads:
+ Number of attention heads
+ """
+ super().__init__()
+
+ self.c_in = c_in
+ self.c_hidden = c_hidden
+ self.no_heads = no_heads
+ self.starting = starting
+ self.inf = inf
+
+ self.layer_norm = LayerNorm(self.c_in)
+
+ self.linear = EsmFoldLinear(c_in, self.no_heads, bias=False, init="normal")
+
+ self.mha = EsmFoldAttention(self.c_in, self.c_in, self.c_in, self.c_hidden, self.no_heads)
+
+ @torch.jit.ignore
+ def _chunk(
+ self,
+ x: torch.Tensor,
+ biases: List[torch.Tensor],
+ chunk_size: int,
+ use_memory_efficient_kernel: bool = False,
+ use_lma: bool = False,
+ inplace_safe: bool = False,
+ ) -> torch.Tensor:
+ "triangle! triangle!"
+ mha_inputs = {
+ "q_x": x,
+ "kv_x": x,
+ "biases": biases,
+ }
+
+ return chunk_layer(
+ partial(self.mha, use_memory_efficient_kernel=use_memory_efficient_kernel, use_lma=use_lma),
+ mha_inputs,
+ chunk_size=chunk_size,
+ no_batch_dims=len(x.shape[:-2]),
+ _out=x if inplace_safe else None,
+ )
+
+ def forward(
+ self,
+ x: torch.Tensor,
+ mask: Optional[torch.Tensor] = None,
+ chunk_size: Optional[int] = None,
+ use_memory_efficient_kernel: bool = False,
+ use_lma: bool = False,
+ inplace_safe: bool = False,
+ ) -> torch.Tensor:
+ """
+ Args:
+ x:
+ [*, I, J, C_in] input tensor (e.g. the pair representation)
+ Returns:
+ [*, I, J, C_in] output tensor
+ """
+ if mask is None:
+ # [*, I, J]
+ mask = x.new_ones(
+ x.shape[:-1],
+ )
+
+ if not self.starting:
+ x = x.transpose(-2, -3)
+ mask = mask.transpose(-1, -2)
+
+ # [*, I, J, C_in]
+ x = self.layer_norm(x)
+
+ # [*, I, 1, 1, J]
+ mask_bias = (self.inf * (mask - 1))[..., :, None, None, :]
+
+ # [*, H, I, J]
+ triangle_bias = permute_final_dims(self.linear(x), (2, 0, 1))
+
+ # [*, 1, H, I, J]
+ triangle_bias = triangle_bias.unsqueeze(-4)
+
+ biases = [mask_bias, triangle_bias]
+
+ if chunk_size is not None:
+ x = self._chunk(
+ x,
+ biases,
+ chunk_size,
+ use_memory_efficient_kernel=use_memory_efficient_kernel,
+ use_lma=use_lma,
+ inplace_safe=inplace_safe,
+ )
+ else:
+ x = self.mha(
+ q_x=x, kv_x=x, biases=biases, use_memory_efficient_kernel=use_memory_efficient_kernel, use_lma=use_lma
+ )
+
+ if not self.starting:
+ x = x.transpose(-2, -3)
+
+ return x
+
+
+class EsmFoldTriangleMultiplicativeUpdate(nn.Module):
+ """
+ Implements Algorithms 11 and 12.
+ """
+
+ def __init__(self, config, _outgoing=True):
+ super().__init__()
+ c_hidden = config.pairwise_state_dim
+ self._outgoing = _outgoing
+
+ self.linear_a_p = EsmFoldLinear(c_hidden, c_hidden)
+ self.linear_a_g = EsmFoldLinear(c_hidden, c_hidden, init="gating")
+ self.linear_b_p = EsmFoldLinear(c_hidden, c_hidden)
+ self.linear_b_g = EsmFoldLinear(c_hidden, c_hidden, init="gating")
+ self.linear_g = EsmFoldLinear(c_hidden, c_hidden, init="gating")
+ self.linear_z = EsmFoldLinear(c_hidden, c_hidden, init="final")
+
+ self.layer_norm_in = LayerNorm(c_hidden)
+ self.layer_norm_out = LayerNorm(c_hidden)
+
+ self.sigmoid = nn.Sigmoid()
+
+ def _combine_projections(
+ self, a: torch.Tensor, b: torch.Tensor, _inplace_chunk_size: Optional[int] = None
+ ) -> torch.Tensor:
+ if self._outgoing:
+ a = permute_final_dims(a, (2, 0, 1))
+ b = permute_final_dims(b, (2, 1, 0))
+ else:
+ a = permute_final_dims(a, (2, 1, 0))
+ b = permute_final_dims(b, (2, 0, 1))
+
+ if _inplace_chunk_size is not None:
+ # To be replaced by torch vmap
+ for i in range(0, a.shape[-3], _inplace_chunk_size):
+ a_chunk = a[..., i : i + _inplace_chunk_size, :, :]
+ b_chunk = b[..., i : i + _inplace_chunk_size, :, :]
+ a[..., i : i + _inplace_chunk_size, :, :] = torch.matmul(
+ a_chunk,
+ b_chunk,
+ )
+
+ p = a
+ else:
+ p = torch.matmul(a, b)
+
+ return permute_final_dims(p, (1, 2, 0))
+
+ def _inference_forward(
+ self,
+ z: torch.Tensor,
+ mask: Optional[torch.Tensor] = None,
+ inplace_chunk_size: Optional[int] = None,
+ with_add: bool = True,
+ ):
+ """
+ Args:
+ z:
+ A [*, N, N, C_z] pair representation
+ mask:
+ A [*, N, N] pair mask
+ inplace_chunk_size:
+ Size of chunks used in the main computation. Increase to trade memory for speed.
+ with_add:
+ If True, z is overwritten with (z + update). Otherwise, it is overwritten with (update).
+ Returns:
+ A reference to the overwritten z
+
+ More memory-efficient, inference-only version of the forward function. Uses in-place operations, fusion of the
+ addition that happens after this module in the Evoformer, a smidge of recomputation, and a cache of overwritten
+ values to lower peak memory consumption of this module from 5x the size of the input tensor z to 2.5x its size.
+ Useful for inference on extremely long sequences.
+
+ It works as follows. We will make reference to variables used in the default forward implementation below.
+ Naively, triangle multiplication attention requires the manifestation of 5 tensors the size of z: 1) z, the
+ "square" input tensor, 2) a, the first projection of z, 3) b, the second projection of b, 4) g, a z-sized mask,
+ and 5) a z-sized tensor for intermediate computations. For large N, this is prohibitively expensive; for
+ N=4000, for example, z is more than 8GB alone. To avoid this problem, we compute b, g, and all intermediate
+ tensors in small chunks, noting that the chunks required to compute a chunk of the output depend only on the
+ tensor a and corresponding vertical and horizontal chunks of z. This suggests an algorithm that loops over
+ pairs of chunks of z: hereafter "columns" and "rows" of z, even though each "column" and "row" in fact contains
+ inplace_chunk_size contiguous true columns and rows of z. Writing output chunks to a new tensor would bring
+ total memory consumption down to 3x the size of z. However, more memory can be saved by writing output chunks
+ directly to z in-place. WLOG, we choose to write output chunks vertically, overwriting the ith "column" of z at
+ the end of the ith iteration of the main loop. Despite this overwriting, the ith column is always one column
+ ahead of previously overwritten columns and can be recovered directly from z. After the first iteration,
+ however, the ith row of z is always at least partially overwritten. For this reason, we introduce the z-cache,
+ a tensor one-half the size of z. The z-cache initially contains the left half (2nd and 3rd quadrants) of z. For
+ 0 < i < N/2, the missing left part of the ith row of z is recovered from this cache at the beginning of the ith
+ iteration. Once i exceeds n/2, the cache is "reoriented" to encompass the 3rd and 4th quadrants of z instead.
+ Though the 3rd quadrant of the original z is entirely overwritten at this point, it can be recovered from the
+ z-cache itself. Thereafter, the ith row of z can be recovered in its entirety from the reoriented z-cache.
+ After the final iteration, z has been completely overwritten and contains the triangular multiplicative update.
+ If with_add is True, it instead contains the sum of z and the triangular multiplicative update. In either case,
+ peak memory consumption is just 2.5x the size of z, disregarding memory used for chunks and other small
+ variables.
+ """
+ if mask is None:
+ mask = z.new_ones(z.shape[:-1])
+
+ mask = mask.unsqueeze(-1)
+
+ def compute_projection_helper(pair, mask, a=True):
+ if a:
+ linear_g = self.linear_a_g
+ linear_p = self.linear_a_p
+ else:
+ linear_g = self.linear_b_g
+ linear_p = self.linear_b_p
+
+ pair = self.layer_norm_in(pair)
+ p = linear_g(pair)
+ p.sigmoid_()
+ p *= linear_p(pair)
+ p *= mask
+ p = permute_final_dims(p, (2, 0, 1))
+ return p
+
+ def compute_projection(pair, mask, a=True, chunked=True):
+ need_transpose = self._outgoing ^ a
+ if not chunked:
+ p = compute_projection_helper(pair, mask, a)
+ if need_transpose:
+ p = p.transpose(-1, -2)
+ else:
+ # This computation is chunked so as not to exceed our 2.5x
+ # budget with a large intermediate tensor
+ linear_g = self.linear_a_g if a else self.linear_b_g
+ c = linear_g.bias.shape[-1]
+ out_shape = pair.shape[:-3] + (c,) + pair.shape[-3:-1]
+ p = pair.new_zeros(out_shape)
+ for i in range(0, pair.shape[-3], inplace_chunk_size):
+ pair_chunk = pair[..., i : i + inplace_chunk_size, :, :]
+ pair_chunk = compute_projection_helper(
+ pair[..., i : i + inplace_chunk_size, :, :],
+ mask[..., i : i + inplace_chunk_size, :, :],
+ a,
+ )
+ if need_transpose:
+ pair_chunk = pair_chunk.transpose(-1, -2)
+ p[..., i : i + inplace_chunk_size] = pair_chunk
+ else:
+ p[..., i : i + inplace_chunk_size, :] = pair_chunk
+
+ del pair_chunk
+
+ return p
+
+ # We start by fully manifesting a. In addition to the input, this
+ # brings total memory consumption to 2x z (disregarding size of chunks)
+ # [*, N, N, c]
+ a = compute_projection(z, mask, True, chunked=True)
+
+ if inplace_chunk_size is not None:
+ n = a.shape[-1]
+ half_n = n // 2 + n % 2
+ row_dim = -3
+ col_dim = -2
+ b_chunk_dim = row_dim if self._outgoing else col_dim
+
+ def empty_slicer(t):
+ return [slice(None) for _ in t.shape]
+
+ def slice_tensor(t, start, end, dim):
+ # Slices start:end from the dim dimension of t
+ s = empty_slicer(t)
+ s[dim] = slice(start, end)
+ return t[s]
+
+ def flip_z_cache_(z_cache, z):
+ # "Reorient" the z_cache (see below), filling it with quadrants
+ # 3---recovered from the z_cache---and 4---recovered from z---
+ # of the input tensor z.
+ quadrant_3 = slice_tensor(z_cache, half_n, None, row_dim)
+ z_cache = z_cache.transpose(row_dim, col_dim)
+
+ # If n is odd, we need to shrink the z_cache by one row
+ z_cache = z_cache[..., : (n // 2), :, :]
+
+ # Move the 3rd quadrant of z into the
+ first_half_slicer = empty_slicer(z_cache)
+ first_half_slicer[col_dim] = slice(0, half_n)
+ z_cache[first_half_slicer] = quadrant_3
+
+ # Get the fourth quadrant of z
+ quadrant_4 = slice_tensor(z, half_n, None, row_dim)
+ quadrant_4 = slice_tensor(quadrant_4, half_n, None, col_dim)
+
+ # Insert said quadrant into the rotated z-cache
+ quadrant_3_slicer = empty_slicer(z_cache)
+ quadrant_3_slicer[col_dim] = slice(half_n, None)
+
+ z_cache[quadrant_3_slicer] = quadrant_4
+
+ return z_cache
+
+ # Initialize the z cache to the left half of z.
+ z_cache_shape = list(z.shape)
+ z_cache_shape[col_dim] = half_n
+ z_cache = z.new_zeros(z_cache_shape)
+ z_cache_slicer = empty_slicer(z_cache)
+ z_cache_slicer[col_dim] = slice(0, half_n)
+ z_cache.copy_(z[z_cache_slicer])
+ z_cache_rotated = False
+
+ # We need to reorient the z-cache at the halfway point, and we
+ # don't want a single chunk to straddle that point. We contract one
+ # of the chunks in the middle to address that problem.
+ i_range = list(range(0, half_n, inplace_chunk_size))
+ initial_offsets = [i_2 - i_1 for i_1, i_2 in zip(i_range, i_range[1:] + [half_n])]
+ after_half = list(range(half_n, n, inplace_chunk_size))
+ after_half_offsets = [inplace_chunk_size for _ in after_half]
+ combined_range_with_offsets = zip(i_range + after_half, initial_offsets + after_half_offsets)
+ for i, offset in combined_range_with_offsets:
+ if not z_cache_rotated and i >= half_n:
+ z_cache = flip_z_cache_(z_cache, z)
+ z_cache_rotated = True
+
+ z_chunk_b = slice_tensor(z, i, i + offset, b_chunk_dim)
+ mask_chunk = slice_tensor(mask, i, i + offset, b_chunk_dim)
+
+ z_chunk_b = z_chunk_b.clone()
+ if b_chunk_dim == col_dim:
+ z_chunk_b = slice_tensor(z, i, i + offset, col_dim)
+ else: # b_chunk_dim == row_dim
+ # In this case, the b-dimension (b_chunk_dim) is partially
+ # overwritten at the end of each iteration. We need to
+ # restore the missing component from the z-cache.
+ if not z_cache_rotated:
+ z_chunk_slicer = empty_slicer(z_chunk_b)
+ z_chunk_slicer[col_dim] = slice(0, half_n)
+ z_chunk_b[z_chunk_slicer] = slice_tensor(z_cache, i, i + offset, row_dim)
+ else:
+ z_cache_offset = i - half_n
+ z_chunk_b = slice_tensor(z_cache, z_cache_offset, z_cache_offset + offset, row_dim)
+
+ b_chunk = compute_projection(z_chunk_b, mask_chunk, a=False, chunked=False)
+ del z_chunk_b
+
+ x_chunk = torch.matmul(a, b_chunk)
+ x_chunk = permute_final_dims(x_chunk, (1, 2, 0))
+ x_chunk = self.layer_norm_out(x_chunk)
+ x_chunk = self.linear_z(x_chunk)
+
+ # The g dimension (col_dim) is parallel to and ahead of the
+ # overwrites in z. We can extract the g chunk normally.
+ z_chunk_g = slice_tensor(z, i, i + offset, col_dim)
+ g_chunk = self.linear_g(self.layer_norm_in(z_chunk_g))
+ g_chunk.sigmoid_()
+ del z_chunk_g
+
+ x_chunk *= g_chunk
+
+ # Write the columns into z in-place
+ z_slicer = empty_slicer(z)
+ z_slicer[col_dim] = slice(i, i + offset)
+ if with_add:
+ z[z_slicer] += x_chunk
+ else:
+ z[z_slicer] = x_chunk
+ else:
+ b = compute_projection(z, mask, False, False)
+ x = torch.matmul(a, b)
+ x = self.layer_norm_out(x)
+ x = self.linear_z(x)
+ g = self.linear_g(z)
+ g.sigmoid_()
+ x *= g
+ if with_add:
+ z += x
+ else:
+ z = x
+
+ return z
+
+ def forward(
+ self,
+ z: torch.Tensor,
+ mask: Optional[torch.Tensor] = None,
+ inplace_safe: bool = False,
+ _add_with_inplace: bool = False,
+ _inplace_chunk_size: Optional[int] = 256,
+ ) -> torch.Tensor:
+ """
+ Args:
+ x:
+ [*, N_res, N_res, C_z] input tensor
+ mask:
+ [*, N_res, N_res] input mask
+ Returns:
+ [*, N_res, N_res, C_z] output tensor
+ """
+ if inplace_safe:
+ x = self._inference_forward(
+ z,
+ mask,
+ inplace_chunk_size=_inplace_chunk_size,
+ with_add=_add_with_inplace,
+ )
+ return x
+
+ if mask is None:
+ mask = z.new_ones(z.shape[:-1])
+
+ mask = mask.unsqueeze(-1)
+
+ z = self.layer_norm_in(z)
+ a = mask
+ a = a * self.sigmoid(self.linear_a_g(z))
+ a = a * self.linear_a_p(z)
+ b = mask
+ b = b * self.sigmoid(self.linear_b_g(z))
+ b = b * self.linear_b_p(z)
+
+ if is_fp16_enabled():
+ with torch.cuda.amp.autocast(enabled=False):
+ x = self._combine_projections(a.float(), b.float())
+ else:
+ x = self._combine_projections(a, b)
+
+ del a, b
+ x = self.layer_norm_out(x)
+ x = self.linear_z(x)
+ g = self.sigmoid(self.linear_g(z))
+ x = x * g
+
+ return x
+
+
+class EsmFoldPreTrainedModel(EsmPreTrainedModel):
+ """
+ An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
+ models.
+ """
+
+ # Subclass `EsMPreTrainedModel` to deal with special init
+ def _init_weights(self, module):
+ """Initialize the weights"""
+ if isinstance(module, EsmFoldLinear):
+ with torch.no_grad():
+ if module.init_fn is not None:
+ module.init_fn(module.weight, module.bias)
+ elif module.init == "default":
+ trunc_normal_init_(module.weight, scale=1.0)
+ elif module.init == "relu":
+ trunc_normal_init_(module.weight, scale=2.0)
+ elif module.init == "glorot":
+ nn.init.xavier_uniform_(module.weight, gain=1)
+ elif module.init == "gating":
+ module.weight.fill_(0.0)
+ if module.bias:
+ module.bias.fill_(1.0)
+ elif module.init == "normal":
+ torch.nn.init.kaiming_normal_(module.weight, nonlinearity="linear")
+ elif module.init == "final":
+ module.weight.fill_(0.0)
+ elif isinstance(module, EsmFoldInvariantPointAttention):
+ ipa_point_weights_init_(module.head_weights)
+ elif isinstance(module, EsmFoldTriangularSelfAttentionBlock):
+ torch.nn.init.zeros_(module.tri_mul_in.linear_z.weight)
+ torch.nn.init.zeros_(module.tri_mul_in.linear_z.bias)
+ torch.nn.init.zeros_(module.tri_mul_out.linear_z.weight)
+ torch.nn.init.zeros_(module.tri_mul_out.linear_z.bias)
+ torch.nn.init.zeros_(module.tri_att_start.mha.linear_o.weight)
+ torch.nn.init.zeros_(module.tri_att_start.mha.linear_o.bias)
+ torch.nn.init.zeros_(module.tri_att_end.mha.linear_o.weight)
+ torch.nn.init.zeros_(module.tri_att_end.mha.linear_o.bias)
+
+ torch.nn.init.zeros_(module.sequence_to_pair.o_proj.weight)
+ torch.nn.init.zeros_(module.sequence_to_pair.o_proj.bias)
+ torch.nn.init.zeros_(module.pair_to_sequence.linear.weight)
+ torch.nn.init.zeros_(module.seq_attention.o_proj.weight)
+ torch.nn.init.zeros_(module.seq_attention.o_proj.bias)
+ torch.nn.init.zeros_(module.mlp_seq.mlp[-2].weight)
+ torch.nn.init.zeros_(module.mlp_seq.mlp[-2].bias)
+ torch.nn.init.zeros_(module.mlp_pair.mlp[-2].weight)
+ torch.nn.init.zeros_(module.mlp_pair.mlp[-2].bias)
+ else:
+ super()._init_weights(module)
+
+
+class EsmFoldSelfAttention(nn.Module):
+ def __init__(self, embed_dim, num_heads, head_width, gated=False):
+ super().__init__()
+ assert embed_dim == num_heads * head_width
+
+ self.embed_dim = embed_dim
+ self.num_heads = num_heads
+ self.head_width = head_width
+
+ self.proj = nn.Linear(embed_dim, embed_dim * 3, bias=False)
+ self.o_proj = nn.Linear(embed_dim, embed_dim, bias=True)
+ self.gated = gated
+ if gated:
+ self.g_proj = nn.Linear(embed_dim, embed_dim)
+ torch.nn.init.zeros_(self.g_proj.weight)
+ torch.nn.init.ones_(self.g_proj.bias)
+
+ self.rescale_factor = self.head_width**-0.5
+
+ torch.nn.init.zeros_(self.o_proj.bias)
+
+ def forward(self, x, mask=None, bias=None, indices=None):
+ """
+ Basic self attention with optional mask and external pairwise bias. To handle sequences of different lengths,
+ use mask.
+
+ Inputs:
+ x: batch of input sequneces (.. x L x C) mask: batch of boolean masks where 1=valid, 0=padding position (..
+ x L_k) bias: batch of scalar pairwise attention biases (.. x Lq x Lk x num_heads)
+
+ Outputs:
+ sequence projection (B x L x embed_dim), attention maps (B x L x L x num_heads)
+ """
+
+ t = self.proj(x).view(*x.shape[:2], self.num_heads, -1)
+ t = t.permute(0, 2, 1, 3)
+ q, k, v = t.chunk(3, dim=-1)
+
+ q = self.rescale_factor * q
+ a = torch.einsum("...qc,...kc->...qk", q, k)
+
+ # Add external attention bias.
+ if bias is not None:
+ a = a + bias.permute(0, 3, 1, 2)
+
+ # Do not attend to padding tokens.
+ if mask is not None:
+ mask = mask[:, None, None]
+ a = a.masked_fill(mask == False, -np.inf) # noqa: E712
+
+ a = nn.functional.softmax(a, dim=-1)
+
+ y = torch.einsum("...hqk,...hkc->...qhc", a, v)
+ y = y.reshape(*y.shape[:2], -1)
+
+ if self.gated:
+ y = self.g_proj(x).sigmoid() * y
+ y = self.o_proj(y)
+
+ return y, a.permute(0, 3, 1, 2)
+
+
+class EsmFoldDropout(nn.Module):
+ """
+ Implementation of dropout with the ability to share the dropout mask along a particular dimension.
+ """
+
+ def __init__(self, r: float, batch_dim: Union[int, List[int]]):
+ super().__init__()
+
+ self.r = r
+ if type(batch_dim) == int:
+ batch_dim = [batch_dim]
+ self.batch_dim = batch_dim
+ self.dropout = nn.Dropout(self.r)
+
+ def forward(self, x: torch.Tensor) -> torch.Tensor:
+ shape = list(x.shape)
+ if self.batch_dim is not None:
+ for bd in self.batch_dim:
+ shape[bd] = 1
+ return x * self.dropout(x.new_ones(shape))
+
+
+class EsmFoldSequenceToPair(nn.Module):
+ def __init__(self, sequence_state_dim, inner_dim, pairwise_state_dim):
+ super().__init__()
+
+ self.layernorm = nn.LayerNorm(sequence_state_dim)
+ self.proj = nn.Linear(sequence_state_dim, inner_dim * 2, bias=True)
+ self.o_proj = nn.Linear(2 * inner_dim, pairwise_state_dim, bias=True)
+
+ torch.nn.init.zeros_(self.proj.bias)
+ torch.nn.init.zeros_(self.o_proj.bias)
+
+ def forward(self, sequence_state):
+ """
+ Inputs:
+ sequence_state: B x L x sequence_state_dim
+
+ Output:
+ pairwise_state: B x L x L x pairwise_state_dim
+
+ Intermediate state:
+ B x L x L x 2*inner_dim
+ """
+
+ assert len(sequence_state.shape) == 3
+
+ s = self.layernorm(sequence_state)
+ s = self.proj(s)
+ q, k = s.chunk(2, dim=-1)
+
+ prod = q[:, None, :, :] * k[:, :, None, :]
+ diff = q[:, None, :, :] - k[:, :, None, :]
+
+ x = torch.cat([prod, diff], dim=-1)
+ x = self.o_proj(x)
+
+ return x
+
+
+class EsmFoldPairToSequence(nn.Module):
+ def __init__(self, pairwise_state_dim, num_heads):
+ super().__init__()
+
+ self.layernorm = nn.LayerNorm(pairwise_state_dim)
+ self.linear = nn.Linear(pairwise_state_dim, num_heads, bias=False)
+
+ def forward(self, pairwise_state):
+ """
+ Inputs:
+ pairwise_state: B x L x L x pairwise_state_dim
+
+ Output:
+ pairwise_bias: B x L x L x num_heads
+ """
+ assert len(pairwise_state.shape) == 4
+ z = self.layernorm(pairwise_state)
+ pairwise_bias = self.linear(z)
+ return pairwise_bias
+
+
+class EsmFoldResidueMLP(nn.Module):
+ def __init__(self, embed_dim, inner_dim, dropout=0):
+ super().__init__()
+
+ self.mlp = nn.Sequential(
+ nn.LayerNorm(embed_dim),
+ nn.Linear(embed_dim, inner_dim),
+ nn.ReLU(),
+ nn.Linear(inner_dim, embed_dim),
+ nn.Dropout(dropout),
+ )
+
+ def forward(self, x):
+ return x + self.mlp(x)
+
+
+class EsmFoldTriangularSelfAttentionBlock(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.config = config
+
+ sequence_state_dim = config.sequence_state_dim
+ pairwise_state_dim = config.pairwise_state_dim
+ sequence_num_heads = sequence_state_dim // config.sequence_head_width
+ pairwise_num_heads = pairwise_state_dim // config.pairwise_head_width
+
+ self.layernorm_1 = nn.LayerNorm(sequence_state_dim)
+
+ self.sequence_to_pair = EsmFoldSequenceToPair(sequence_state_dim, pairwise_state_dim // 2, pairwise_state_dim)
+ self.pair_to_sequence = EsmFoldPairToSequence(pairwise_state_dim, sequence_num_heads)
+
+ self.seq_attention = EsmFoldSelfAttention(
+ sequence_state_dim, sequence_num_heads, config.sequence_head_width, gated=True
+ )
+ self.tri_mul_out = EsmFoldTriangleMultiplicativeUpdate(config, _outgoing=True)
+ self.tri_mul_in = EsmFoldTriangleMultiplicativeUpdate(config, _outgoing=False)
+
+ self.tri_att_start = EsmFoldTriangleAttention(
+ pairwise_state_dim, config.pairwise_head_width, pairwise_num_heads, inf=1e9, starting=True
+ )
+ self.tri_att_end = EsmFoldTriangleAttention(
+ pairwise_state_dim, config.pairwise_head_width, pairwise_num_heads, inf=1e9, starting=False
+ )
+
+ self.mlp_seq = EsmFoldResidueMLP(sequence_state_dim, 4 * sequence_state_dim, dropout=config.dropout)
+ self.mlp_pair = EsmFoldResidueMLP(pairwise_state_dim, 4 * pairwise_state_dim, dropout=config.dropout)
+
+ self.drop = nn.Dropout(config.dropout)
+ self.row_drop = EsmFoldDropout(config.dropout * 2, 2)
+ self.col_drop = EsmFoldDropout(config.dropout * 2, 1)
+
+ def forward(self, sequence_state, pairwise_state, mask=None, chunk_size=None, **__kwargs):
+ """
+ Inputs:
+ sequence_state: B x L x sequence_state_dim pairwise_state: B x L x L x pairwise_state_dim mask: B x L boolean
+ tensor of valid positions
+
+ Output:
+ sequence_state: B x L x sequence_state_dim pairwise_state: B x L x L x pairwise_state_dim
+ """
+ if len(sequence_state.shape) != 3:
+ raise ValueError(f"`sequence_state` should be a 3d-tensor, got {len(sequence_state.shape)} dims.")
+ if len(pairwise_state.shape) != 4:
+ raise ValueError(f"`pairwise_state` should be a 4d-tensor, got {len(pairwise_state.shape)} dims.")
+ if mask is not None and len(mask.shape) != 2:
+ raise ValueError(f"`mask` should be a 2d-tensor, got {len(mask.shape)} dims.")
+
+ batch_dim, seq_dim, sequence_state_dim = sequence_state.shape
+ pairwise_state_dim = pairwise_state.shape[3]
+
+ if sequence_state_dim != self.config.sequence_state_dim:
+ raise ValueError(
+ "`sequence_state` last dimension should be equal to `self.sequence_state_dim`. Got"
+ f"{sequence_state_dim} != {self.config.sequence_state_dim}."
+ )
+ if pairwise_state_dim != self.config.pairwise_state_dim:
+ raise ValueError(
+ "`pairwise_state` last dimension should be equal to `self.pairwise_state_dim`. Got "
+ f"{pairwise_state_dim} != {self.config.pairwise_state_dim}."
+ )
+ if batch_dim != pairwise_state.shape[0]:
+ raise ValueError(
+ f"`sequence_state` and `pairwise_state` have inconsistent batch size: {batch_dim} != "
+ f"{pairwise_state.shape[0]}."
+ )
+ if seq_dim != pairwise_state.shape[1] or seq_dim != pairwise_state.shape[2]:
+ raise ValueError(
+ f"`sequence_state` and `pairwise_state` have inconsistent sequence length: {seq_dim} != "
+ f"{pairwise_state.shape[1]} or {pairwise_state.shape[2]}."
+ )
+
+ # Update sequence state
+ bias = self.pair_to_sequence(pairwise_state)
+
+ # Self attention with bias + mlp.
+ y = self.layernorm_1(sequence_state)
+ y, _ = self.seq_attention(y, mask=mask, bias=bias)
+ sequence_state = sequence_state + self.drop(y)
+ sequence_state = self.mlp_seq(sequence_state)
+
+ # Update pairwise state
+ pairwise_state = pairwise_state + self.sequence_to_pair(sequence_state)
+
+ # Axial attention with triangular bias.
+ tri_mask = mask.unsqueeze(2) * mask.unsqueeze(1) if mask is not None else None
+ pairwise_state = pairwise_state + self.row_drop(self.tri_mul_out(pairwise_state, mask=tri_mask))
+ pairwise_state = pairwise_state + self.col_drop(self.tri_mul_in(pairwise_state, mask=tri_mask))
+ pairwise_state = pairwise_state + self.row_drop(
+ self.tri_att_start(pairwise_state, mask=tri_mask, chunk_size=chunk_size)
+ )
+ pairwise_state = pairwise_state + self.col_drop(
+ self.tri_att_end(pairwise_state, mask=tri_mask, chunk_size=chunk_size)
+ )
+
+ # MLP over pairs.
+ pairwise_state = self.mlp_pair(pairwise_state)
+
+ return sequence_state, pairwise_state
+
+
+class EsmCategoricalMixture:
+ def __init__(self, param, bins=50, start=0, end=1):
+ # All tensors are of shape ..., bins.
+ self.logits = param
+ bins = torch.linspace(start, end, bins + 1, device=self.logits.device, dtype=self.logits.dtype)
+ self.v_bins = (bins[:-1] + bins[1:]) / 2
+
+ def log_prob(self, true):
+ # Shapes are:
+ # self.probs: ... x bins
+ # true : ...
+ true_index = (true.unsqueeze(-1) - self.v_bins[[None] * true.ndim]).abs().argmin(-1)
+ nll = self.logits.log_softmax(-1)
+ return torch.take_along_dim(nll, true_index.unsqueeze(-1), dim=-1).squeeze(-1)
+
+ def mean(self):
+ return (self.logits.softmax(-1) @ self.v_bins.unsqueeze(1)).squeeze(-1)
+
+
+def categorical_lddt(logits, bins=50):
+ # Logits are ..., 37, bins.
+ return EsmCategoricalMixture(logits, bins=bins).mean()
+
+
+def get_axial_mask(mask):
+ """
+ Helper to convert B x L mask of valid positions to axial mask used in row column attentions.
+
+ Input:
+ mask: B x L tensor of booleans
+
+ Output:
+ mask: B x L x L tensor of booleans
+ """
+
+ if mask is None:
+ return None
+
+ if len(mask.shape) != 2:
+ raise ValueError(f"`mask` should be a 2d-tensor, got {len(mask.shape)} dims.")
+ batch_dim, seq_dim = mask.shape
+ m = mask.unsqueeze(1).expand(batch_dim, seq_dim, seq_dim)
+ m = m.reshape(batch_dim * seq_dim, seq_dim)
+ return m
+
+
+class EsmFoldRelativePosition(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.bins = config.position_bins
+
+ # Note an additional offset is used so that the 0th position
+ # is reserved for masked pairs.
+ self.embedding = torch.nn.Embedding(2 * self.bins + 2, config.pairwise_state_dim)
+
+ def forward(self, residue_index, mask=None):
+ """
+ Input:
+ residue_index: B x L tensor of indices (dytpe=torch.long) mask: B x L tensor of booleans
+
+ Output:
+ pairwise_state: B x L x L x pairwise_state_dim tensor of embeddings
+ """
+ if residue_index.dtype != torch.long:
+ raise ValueError(f"`residue_index` has dtype {residue_index.dtype}, it should be `torch.long`.")
+ if mask is not None and residue_index.shape != mask.shape:
+ raise ValueError(
+ f"`residue_index` and `mask` have inconsistent shapes: {residue_index.shape} != {mask.shape}."
+ )
+
+ diff = residue_index[:, None, :] - residue_index[:, :, None]
+ diff = diff.clamp(-self.bins, self.bins)
+ diff = diff + self.bins + 1 # Add 1 to adjust for padding index.
+
+ if mask is not None:
+ mask = mask[:, None, :] * mask[:, :, None]
+ diff[mask == False] = 0 # noqa: E712
+
+ output = self.embedding(diff)
+ return output
+
+
+class EsmFoldAngleResnetBlock(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+
+ self.linear_1 = EsmFoldLinear(config.resnet_dim, config.resnet_dim, init="relu")
+ self.linear_2 = EsmFoldLinear(config.resnet_dim, config.resnet_dim, init="final")
+
+ self.relu = nn.ReLU()
+
+ def forward(self, a: torch.Tensor) -> torch.Tensor:
+ s_initial = a
+
+ a = self.relu(a)
+ a = self.linear_1(a)
+ a = self.relu(a)
+ a = self.linear_2(a)
+
+ return a + s_initial
+
+
+class EsmFoldAngleResnet(nn.Module):
+ """
+ Implements Algorithm 20, lines 11-14
+ """
+
+ def __init__(self, config):
+ super().__init__()
+ self.config = config
+
+ self.linear_in = EsmFoldLinear(config.sequence_dim, config.resnet_dim)
+ self.linear_initial = EsmFoldLinear(config.sequence_dim, config.resnet_dim)
+
+ self.layers = nn.ModuleList()
+ for _ in range(config.num_resnet_blocks):
+ layer = EsmFoldAngleResnetBlock(config)
+ self.layers.append(layer)
+
+ self.linear_out = EsmFoldLinear(config.resnet_dim, config.num_angles * 2)
+
+ self.relu = nn.ReLU()
+
+ def forward(self, s: torch.Tensor, s_initial: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
+ """
+ Args:
+ s:
+ [*, C_hidden] single embedding
+ s_initial:
+ [*, C_hidden] single embedding as of the start of the StructureModule
+ Returns:
+ [*, no_angles, 2] predicted angles
+ """
+ # NOTE: The ReLU's applied to the inputs are absent from the supplement
+ # pseudocode but present in the source. For maximal compatibility with
+ # the pretrained weights, I'm going with the source.
+
+ # [*, C_hidden]
+ s_initial = self.relu(s_initial)
+ s_initial = self.linear_initial(s_initial)
+ s = self.relu(s)
+ s = self.linear_in(s)
+ s = s + s_initial
+
+ for l in self.layers:
+ s = l(s)
+
+ s = self.relu(s)
+
+ # [*, no_angles * 2]
+ s = self.linear_out(s)
+
+ # [*, no_angles, 2]
+ s = s.view(s.shape[:-1] + (-1, 2))
+
+ unnormalized_s = s
+ norm_denom = torch.sqrt(
+ torch.clamp(
+ torch.sum(s**2, dim=-1, keepdim=True),
+ min=self.config.epsilon,
+ )
+ )
+ s = s / norm_denom
+
+ return unnormalized_s, s
+
+
+class EsmFoldInvariantPointAttention(nn.Module):
+ """
+ Implements Algorithm 22.
+ """
+
+ def __init__(self, config):
+ super().__init__()
+ self.config = config
+
+ c_s = config.sequence_dim
+ c_z = config.pairwise_dim
+ self.hidden_dim = config.ipa_dim
+ self.num_heads = config.num_heads_ipa
+ self.num_qk_points = config.num_qk_points
+ self.num_v_points = config.num_v_points
+
+ # These linear layers differ from their specifications in the
+ # supplement. There, they lack bias and use Glorot initialization.
+ # Here as in the official source, they have bias and use the default
+ # Lecun initialization.
+ hc = config.ipa_dim * config.num_heads_ipa
+ self.linear_q = EsmFoldLinear(c_s, hc)
+ self.linear_kv = EsmFoldLinear(c_s, 2 * hc)
+
+ hpq = config.num_heads_ipa * config.num_qk_points * 3
+ self.linear_q_points = EsmFoldLinear(c_s, hpq)
+
+ hpkv = config.num_heads_ipa * (config.num_qk_points + config.num_v_points) * 3
+ self.linear_kv_points = EsmFoldLinear(c_s, hpkv)
+
+ self.linear_b = EsmFoldLinear(c_z, config.num_heads_ipa)
+
+ self.head_weights = nn.Parameter(torch.zeros((config.num_heads_ipa)))
+
+ concat_out_dim = config.num_heads_ipa * (c_z + config.ipa_dim + config.num_v_points * 4)
+ self.linear_out = EsmFoldLinear(concat_out_dim, c_s, init="final")
+
+ self.softmax = nn.Softmax(dim=-1)
+ self.softplus = nn.Softplus()
+
+ def forward(
+ self,
+ s: torch.Tensor,
+ z: Optional[torch.Tensor],
+ r: Rigid,
+ mask: torch.Tensor,
+ _offload_inference: bool = False,
+ _z_reference_list: Optional[Sequence[torch.Tensor]] = None,
+ ) -> torch.Tensor:
+ """
+ Args:
+ s:
+ [*, N_res, C_s] single representation
+ z:
+ [*, N_res, N_res, C_z] pair representation
+ r:
+ [*, N_res] transformation object
+ mask:
+ [*, N_res] mask
+ Returns:
+ [*, N_res, C_s] single representation update
+ """
+ z = [z]
+
+ #######################################
+ # Generate scalar and point activations
+ #######################################
+ # [*, N_res, H * C_hidden]
+ q = self.linear_q(s)
+ kv = self.linear_kv(s)
+
+ # [*, N_res, H, C_hidden]
+ q = q.view(q.shape[:-1] + (self.num_heads, -1))
+
+ # [*, N_res, H, 2 * C_hidden]
+ kv = kv.view(kv.shape[:-1] + (self.num_heads, -1))
+
+ # [*, N_res, H, C_hidden]
+ k, v = torch.split(kv, self.hidden_dim, dim=-1)
+
+ # [*, N_res, H * P_q * 3]
+ q_pts = self.linear_q_points(s)
+
+ # This is kind of clunky, but it's how the original does it
+ # [*, N_res, H * P_q, 3]
+ q_pts = torch.split(q_pts, q_pts.shape[-1] // 3, dim=-1)
+ q_pts = torch.stack(q_pts, dim=-1)
+ q_pts = r[..., None].apply(q_pts)
+
+ # [*, N_res, H, P_q, 3]
+ q_pts = q_pts.view(q_pts.shape[:-2] + (self.num_heads, self.num_qk_points, 3))
+
+ # [*, N_res, H * (P_q + P_v) * 3]
+ kv_pts = self.linear_kv_points(s)
+
+ # [*, N_res, H * (P_q + P_v), 3]
+ kv_pts = torch.split(kv_pts, kv_pts.shape[-1] // 3, dim=-1)
+ kv_pts = torch.stack(kv_pts, dim=-1)
+ kv_pts = r[..., None].apply(kv_pts)
+
+ # [*, N_res, H, (P_q + P_v), 3]
+ kv_pts = kv_pts.view(kv_pts.shape[:-2] + (self.num_heads, -1, 3))
+
+ # [*, N_res, H, P_q/P_v, 3]
+ k_pts, v_pts = torch.split(kv_pts, [self.num_qk_points, self.num_v_points], dim=-2)
+
+ ##########################
+ # Compute attention scores
+ ##########################
+ # [*, N_res, N_res, H]
+ b = self.linear_b(z[0])
+
+ if _offload_inference:
+ assert sys.getrefcount(z[0]) == 2
+ z[0] = z[0].cpu()
+
+ # [*, H, N_res, N_res]
+ if is_fp16_enabled():
+ with torch.cuda.amp.autocast(enabled=False):
+ a = torch.matmul(
+ permute_final_dims(q.float(), (1, 0, 2)), # [*, H, N_res, C_hidden]
+ permute_final_dims(k.float(), (1, 2, 0)), # [*, H, C_hidden, N_res]
+ )
+ else:
+ a = torch.matmul(
+ permute_final_dims(q, (1, 0, 2)), # [*, H, N_res, C_hidden]
+ permute_final_dims(k, (1, 2, 0)), # [*, H, C_hidden, N_res]
+ )
+
+ a *= math.sqrt(1.0 / (3 * self.hidden_dim))
+ a += math.sqrt(1.0 / 3) * permute_final_dims(b, (2, 0, 1))
+
+ # [*, N_res, N_res, H, P_q, 3]
+ pt_att = q_pts.unsqueeze(-4) - k_pts.unsqueeze(-5)
+ pt_att = pt_att**2
+
+ # [*, N_res, N_res, H, P_q]
+ pt_att = sum(torch.unbind(pt_att, dim=-1))
+ head_weights = self.softplus(self.head_weights).view(*((1,) * len(pt_att.shape[:-2]) + (-1, 1)))
+ head_weights = head_weights * math.sqrt(1.0 / (3 * (self.num_qk_points * 9.0 / 2)))
+ pt_att = pt_att * head_weights
+
+ # [*, N_res, N_res, H]
+ pt_att = torch.sum(pt_att, dim=-1) * (-0.5)
+ # [*, N_res, N_res]
+ square_mask = mask.unsqueeze(-1) * mask.unsqueeze(-2)
+ square_mask = self.config.inf * (square_mask - 1)
+
+ # [*, H, N_res, N_res]
+ pt_att = permute_final_dims(pt_att, (2, 0, 1))
+
+ a = a + pt_att
+ a = a + square_mask.unsqueeze(-3)
+ a = self.softmax(a)
+
+ ################
+ # Compute output
+ ################
+ # [*, N_res, H, C_hidden]
+ o = torch.matmul(a, v.transpose(-2, -3).to(dtype=a.dtype)).transpose(-2, -3)
+
+ # [*, N_res, H * C_hidden]
+ o = flatten_final_dims(o, 2)
+
+ # [*, H, 3, N_res, P_v]
+ o_pt = torch.sum(
+ (a[..., None, :, :, None] * permute_final_dims(v_pts, (1, 3, 0, 2))[..., None, :, :]),
+ dim=-2,
+ )
+
+ # [*, N_res, H, P_v, 3]
+ o_pt = permute_final_dims(o_pt, (2, 0, 3, 1))
+ o_pt = r[..., None, None].invert_apply(o_pt)
+
+ # [*, N_res, H * P_v]
+ o_pt_norm = flatten_final_dims(torch.sqrt(torch.sum(o_pt**2, dim=-1) + self.config.epsilon), 2)
+
+ # [*, N_res, H * P_v, 3]
+ o_pt = o_pt.reshape(*o_pt.shape[:-3], -1, 3)
+
+ if _offload_inference:
+ z[0] = z[0].to(o_pt.device)
+
+ # [*, N_res, H, C_z]
+ o_pair = torch.matmul(a.transpose(-2, -3), z[0].to(dtype=a.dtype))
+
+ # [*, N_res, H * C_z]
+ o_pair = flatten_final_dims(o_pair, 2)
+
+ # [*, N_res, C_s]
+ s = self.linear_out(
+ torch.cat((o, *torch.unbind(o_pt, dim=-1), o_pt_norm, o_pair), dim=-1).to(dtype=z[0].dtype)
+ )
+
+ return s
+
+
+class EsmFoldBackboneUpdate(nn.Module):
+ """
+ Implements part of Algorithm 23.
+ """
+
+ def __init__(self, config):
+ super().__init__()
+
+ self.linear = EsmFoldLinear(config.sequence_dim, 6, init="final")
+
+ def forward(self, s: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
+ """
+ Args:
+ [*, N_res, C_s] single representation
+ Returns:
+ [*, N_res, 6] update vector
+ """
+ # [*, 6]
+ update = self.linear(s)
+
+ return update
+
+
+class EsmFoldStructureModuleTransitionLayer(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+
+ self.linear_1 = EsmFoldLinear(config.sequence_dim, config.sequence_dim, init="relu")
+ self.linear_2 = EsmFoldLinear(config.sequence_dim, config.sequence_dim, init="relu")
+ self.linear_3 = EsmFoldLinear(config.sequence_dim, config.sequence_dim, init="final")
+
+ self.relu = nn.ReLU()
+
+ def forward(self, s):
+ s_initial = s
+ s = self.linear_1(s)
+ s = self.relu(s)
+ s = self.linear_2(s)
+ s = self.relu(s)
+ s = self.linear_3(s)
+
+ s = s + s_initial
+
+ return s
+
+
+class EsmFoldStructureModuleTransition(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.config = config
+
+ self.layers = nn.ModuleList()
+ for _ in range(config.num_transition_layers):
+ l = EsmFoldStructureModuleTransitionLayer(config)
+ self.layers.append(l)
+
+ self.dropout = nn.Dropout(config.dropout_rate)
+ self.layer_norm = LayerNorm(config.sequence_dim)
+
+ def forward(self, s):
+ for l in self.layers:
+ s = l(s)
+
+ s = self.dropout(s)
+ s = self.layer_norm(s)
+
+ return s
+
+
+class EsmFoldStructureModule(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.config = config
+
+ # Buffers to be lazily initialized later
+ # self.default_frames
+ # self.group_idx
+ # self.atom_mask
+ # self.lit_positions
+
+ self.layer_norm_s = LayerNorm(config.sequence_dim)
+ self.layer_norm_z = LayerNorm(config.pairwise_dim)
+
+ self.linear_in = EsmFoldLinear(config.sequence_dim, config.sequence_dim)
+
+ self.ipa = EsmFoldInvariantPointAttention(config)
+
+ self.ipa_dropout = nn.Dropout(config.dropout_rate)
+ self.layer_norm_ipa = LayerNorm(config.sequence_dim)
+
+ self.transition = EsmFoldStructureModuleTransition(config)
+ self.bb_update = EsmFoldBackboneUpdate(config)
+ self.angle_resnet = EsmFoldAngleResnet(config)
+
+ def forward(
+ self,
+ evoformer_output_dict,
+ aatype,
+ mask=None,
+ _offload_inference=False,
+ ):
+ """
+ Args:
+ evoformer_output_dict:
+ Dictionary containing:
+ "single":
+ [*, N_res, C_s] single representation
+ "pair":
+ [*, N_res, N_res, C_z] pair representation
+ aatype:
+ [*, N_res] amino acid indices
+ mask:
+ Optional [*, N_res] sequence mask
+ Returns:
+ A dictionary of outputs
+ """
+ s = evoformer_output_dict["single"]
+
+ if mask is None:
+ # [*, N]
+ mask = s.new_ones(s.shape[:-1])
+
+ # [*, N, C_s]
+ s = self.layer_norm_s(s)
+
+ # [*, N, N, C_z]
+ z = self.layer_norm_z(evoformer_output_dict["pair"])
+
+ z_reference_list = None
+ if _offload_inference:
+ assert sys.getrefcount(evoformer_output_dict["pair"]) == 2
+ evoformer_output_dict["pair"] = evoformer_output_dict["pair"].cpu()
+ z_reference_list = [z]
+ z = None
+
+ # [*, N, C_s]
+ s_initial = s
+ s = self.linear_in(s)
+
+ # [*, N]
+ rigids = Rigid.identity(
+ s.shape[:-1],
+ s.dtype,
+ s.device,
+ self.training,
+ fmt="quat",
+ )
+ outputs = []
+ for i in range(self.config.num_blocks):
+ # [*, N, C_s]
+ s = s + self.ipa(
+ s,
+ z,
+ rigids,
+ mask,
+ _offload_inference=_offload_inference,
+ _z_reference_list=z_reference_list,
+ )
+ s = self.ipa_dropout(s)
+ s = self.layer_norm_ipa(s)
+ s = self.transition(s)
+
+ # [*, N]
+ rigids = rigids.compose_q_update_vec(self.bb_update(s))
+
+ # To hew as closely as possible to AlphaFold, we convert our
+ # quaternion-based transformations to rotation-matrix ones
+ # here
+ backb_to_global = Rigid(
+ Rotation(rot_mats=rigids.get_rots().get_rot_mats(), quats=None),
+ rigids.get_trans(),
+ )
+
+ backb_to_global = backb_to_global.scale_translation(self.config.trans_scale_factor)
+
+ # [*, N, 7, 2]
+ unnormalized_angles, angles = self.angle_resnet(s, s_initial)
+
+ all_frames_to_global = self.torsion_angles_to_frames(backb_to_global, angles, aatype)
+
+ pred_xyz = self.frames_and_literature_positions_to_atom14_pos(all_frames_to_global, aatype)
+
+ scaled_rigids = rigids.scale_translation(self.config.trans_scale_factor)
+
+ preds = {
+ "frames": scaled_rigids.to_tensor_7(),
+ "sidechain_frames": all_frames_to_global.to_tensor_4x4(),
+ "unnormalized_angles": unnormalized_angles,
+ "angles": angles,
+ "positions": pred_xyz,
+ "states": s,
+ }
+
+ outputs.append(preds)
+
+ rigids = rigids.stop_rot_gradient()
+
+ del z, z_reference_list
+
+ if _offload_inference:
+ evoformer_output_dict["pair"] = evoformer_output_dict["pair"].to(s.device)
+
+ outputs = dict_multimap(torch.stack, outputs)
+ outputs["single"] = s
+
+ return outputs
+
+ def _init_residue_constants(self, float_dtype, device):
+ if not hasattr(self, "default_frames"):
+ self.register_buffer(
+ "default_frames",
+ torch.tensor(
+ residue_constants.restype_rigid_group_default_frame,
+ dtype=float_dtype,
+ device=device,
+ requires_grad=False,
+ ),
+ persistent=False,
+ )
+ if not hasattr(self, "group_idx"):
+ self.register_buffer(
+ "group_idx",
+ torch.tensor(
+ residue_constants.restype_atom14_to_rigid_group,
+ device=device,
+ requires_grad=False,
+ ),
+ persistent=False,
+ )
+ if not hasattr(self, "atom_mask"):
+ self.register_buffer(
+ "atom_mask",
+ torch.tensor(
+ residue_constants.restype_atom14_mask,
+ dtype=float_dtype,
+ device=device,
+ requires_grad=False,
+ ),
+ persistent=False,
+ )
+ if not hasattr(self, "lit_positions"):
+ self.register_buffer(
+ "lit_positions",
+ torch.tensor(
+ residue_constants.restype_atom14_rigid_group_positions,
+ dtype=float_dtype,
+ device=device,
+ requires_grad=False,
+ ),
+ persistent=False,
+ )
+
+ def torsion_angles_to_frames(self, r, alpha, f):
+ # Lazily initialize the residue constants on the correct device
+ self._init_residue_constants(alpha.dtype, alpha.device)
+ # Separated purely to make testing less annoying
+ return torsion_angles_to_frames(r, alpha, f, self.default_frames)
+
+ def frames_and_literature_positions_to_atom14_pos(self, r, f): # [*, N, 8] # [*, N]
+ # Lazily initialize the residue constants on the correct device
+ self._init_residue_constants(r.get_rots().dtype, r.get_rots().device)
+ return frames_and_literature_positions_to_atom14_pos(
+ r,
+ f,
+ self.default_frames,
+ self.group_idx,
+ self.atom_mask,
+ self.lit_positions,
+ )
+
+
+class EsmFoldingTrunk(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.config = config
+
+ c_s = config.sequence_state_dim
+ c_z = config.pairwise_state_dim
+
+ self.pairwise_positional_embedding = EsmFoldRelativePosition(config)
+
+ self.blocks = nn.ModuleList([EsmFoldTriangularSelfAttentionBlock(config) for _ in range(config.num_blocks)])
+
+ self.recycle_bins = 15
+ self.recycle_s_norm = nn.LayerNorm(c_s)
+ self.recycle_z_norm = nn.LayerNorm(c_z)
+ self.recycle_disto = nn.Embedding(self.recycle_bins, c_z)
+ self.recycle_disto.weight[0].detach().zero_()
+
+ self.structure_module = EsmFoldStructureModule(config.structure_module)
+ self.trunk2sm_s = nn.Linear(c_s, config.structure_module.sequence_dim)
+ self.trunk2sm_z = nn.Linear(c_z, config.structure_module.pairwise_dim)
+
+ self.chunk_size = config.chunk_size
+
+ def set_chunk_size(self, chunk_size):
+ # This parameter means the axial attention will be computed
+ # in a chunked manner. This should make the memory used more or less O(L) instead of O(L^2).
+ # It's equivalent to running a for loop over chunks of the dimension we're iterative over,
+ # where the chunk_size is the size of the chunks, so 128 would mean to parse 128-lengthed chunks.
+ self.chunk_size = chunk_size
+
+ def forward(self, seq_feats, pair_feats, true_aa, residx, mask, no_recycles):
+ """
+ Inputs:
+ seq_feats: B x L x C tensor of sequence features pair_feats: B x L x L x C tensor of pair features residx: B
+ x L long tensor giving the position in the sequence mask: B x L boolean tensor indicating valid residues
+
+ Output:
+ predicted_structure: B x L x (num_atoms_per_residue * 3) tensor wrapped in a Coordinates object
+ """
+
+ device = seq_feats.device
+ s_s_0 = seq_feats
+ s_z_0 = pair_feats
+
+ if no_recycles is None:
+ no_recycles = self.config.max_recycles
+ else:
+ if no_recycles < 0:
+ raise ValueError("Number of recycles must not be negative.")
+ no_recycles += 1 # First 'recycle' is just the standard forward pass through the model.
+
+ def trunk_iter(s, z, residx, mask):
+ z = z + self.pairwise_positional_embedding(residx, mask=mask)
+
+ for block in self.blocks:
+ s, z = block(s, z, mask=mask, residue_index=residx, chunk_size=self.chunk_size)
+ return s, z
+
+ s_s = s_s_0
+ s_z = s_z_0
+ recycle_s = torch.zeros_like(s_s)
+ recycle_z = torch.zeros_like(s_z)
+ recycle_bins = torch.zeros(*s_z.shape[:-1], device=device, dtype=torch.int64)
+
+ for recycle_idx in range(no_recycles):
+ with ContextManagers([] if recycle_idx == no_recycles - 1 else [torch.no_grad()]):
+ # === Recycling ===
+ recycle_s = self.recycle_s_norm(recycle_s.detach()).to(device)
+ recycle_z = self.recycle_z_norm(recycle_z.detach()).to(device)
+ recycle_z += self.recycle_disto(recycle_bins.detach()).to(device)
+
+ s_s, s_z = trunk_iter(s_s_0 + recycle_s, s_z_0 + recycle_z, residx, mask)
+
+ # === Structure module ===
+ structure = self.structure_module(
+ {"single": self.trunk2sm_s(s_s), "pair": self.trunk2sm_z(s_z)},
+ true_aa,
+ mask.float(),
+ )
+
+ recycle_s = s_s
+ recycle_z = s_z
+ # Distogram needs the N, CA, C coordinates, and bin constants same as alphafold.
+ recycle_bins = EsmFoldingTrunk.distogram(
+ structure["positions"][-1][:, :, :3],
+ 3.375,
+ 21.375,
+ self.recycle_bins,
+ )
+
+ structure["s_s"] = s_s
+ structure["s_z"] = s_z
+
+ return structure
+
+ @staticmethod
+ def distogram(coords, min_bin, max_bin, num_bins):
+ # Coords are [... L x 3 x 3], where it's [N, CA, C] x 3 coordinates.
+ boundaries = torch.linspace(
+ min_bin,
+ max_bin,
+ num_bins - 1,
+ device=coords.device,
+ )
+ boundaries = boundaries**2
+ N, CA, C = [x.squeeze(-2) for x in coords.chunk(3, dim=-2)]
+ # Infer CB coordinates.
+ b = CA - N
+ c = C - CA
+ a = b.cross(c, dim=-1)
+ CB = -0.58273431 * a + 0.56802827 * b - 0.54067466 * c + CA
+ dists = (CB[..., None, :, :] - CB[..., :, None, :]).pow(2).sum(dim=-1, keepdims=True)
+ bins = torch.sum(dists > boundaries, dim=-1) # [..., L, L]
+ return bins
+
+
+# TODO Add information to the docstring about any methods that convert to PDB format, or otherwise prepare
+# the outputs for downstream use.
+
+
+@add_start_docstrings(
+ """
+ ESMForProteinFolding is the HuggingFace port of the original ESMFold model. It consists of an ESM-2 "stem" followed
+ by a protein folding "head", although unlike most other output heads, this "head" is similar in size and runtime to
+ the rest of the model combined! It outputs a dictionary containing predicted structural information about the input
+ protein(s).
+ """,
+ ESM_START_DOCSTRING,
+)
+class EsmForProteinFolding(EsmPreTrainedModel):
+ def __init__(self, config):
+ super().__init__(config)
+
+ self.config = config
+
+ self.distogram_bins = 64
+
+ self.esm = EsmModel(config, add_pooling_layer=False)
+
+ self.esm.requires_grad_(False)
+ if self.config.esmfold_config.fp16_esm:
+ self.esm.half()
+
+ self.esm_feats = self.config.hidden_size
+ self.esm_attns = self.config.num_hidden_layers * self.config.num_attention_heads
+ self.esm_layers = self.config.num_hidden_layers
+ self.register_buffer("af2_to_esm", self._af2_to_esm_from_vocab_list(config.vocab_list))
+ self.esm_s_combine = nn.Parameter(torch.zeros(self.esm_layers + 1))
+
+ trunk_config = self.config.esmfold_config.trunk
+ c_s = trunk_config.sequence_state_dim
+ c_z = trunk_config.pairwise_state_dim
+ self.esm_s_mlp = nn.Sequential(
+ LayerNorm(self.esm_feats),
+ nn.Linear(self.esm_feats, c_s),
+ nn.ReLU(),
+ nn.Linear(c_s, c_s),
+ )
+
+ # 0 is padding, N is unknown residues, N + 1 is mask.
+ self.n_tokens_embed = residue_constants.restype_num + 3
+ self.pad_idx = 0
+ self.unk_idx = self.n_tokens_embed - 2
+ self.mask_idx = self.n_tokens_embed - 1
+ self.esm_dict_cls_idx = self.config.vocab_list.index("")
+ self.esm_dict_mask_idx = self.config.vocab_list.index("")
+ self.esm_dict_eos_idx = self.config.vocab_list.index("")
+ self.esm_dict_padding_idx = self.config.vocab_list.index("")
+ if self.config.esmfold_config.embed_aa:
+ self.embedding = nn.Embedding(self.n_tokens_embed, c_s, padding_idx=0)
+
+ self.trunk = EsmFoldingTrunk(trunk_config)
+
+ self.distogram_head = nn.Linear(c_z, self.distogram_bins)
+ self.ptm_head = nn.Linear(c_z, self.distogram_bins)
+ self.lm_head = nn.Linear(c_s, self.n_tokens_embed)
+ self.lddt_bins = 50
+ structure_module_config = trunk_config.structure_module
+ self.lddt_head = nn.Sequential(
+ nn.LayerNorm(structure_module_config.sequence_dim),
+ nn.Linear(structure_module_config.sequence_dim, self.config.esmfold_config.lddt_head_hid_dim),
+ nn.Linear(self.config.esmfold_config.lddt_head_hid_dim, self.config.esmfold_config.lddt_head_hid_dim),
+ nn.Linear(self.config.esmfold_config.lddt_head_hid_dim, 37 * self.lddt_bins),
+ )
+
+ @staticmethod
+ def _af2_to_esm_from_vocab_list(vocab_list: List[str]) -> torch.Tensor:
+ # Remember that t is shifted from residue_constants by 1 (0 is padding).
+ esm_reorder = [vocab_list.index("")] + [vocab_list.index(v) for v in residue_constants.restypes_with_x]
+ return torch.tensor(esm_reorder)
+
+ @add_start_docstrings_to_model_forward(ESMFOLD_INPUTS_DOCSTRING.format("batch_size, sequence_length"))
+ @replace_return_docstrings(output_type=EsmForProteinFoldingOutput, config_class=EsmConfig)
+ def forward(
+ self,
+ input_ids: torch.Tensor,
+ attention_mask: torch.Tensor = None,
+ position_ids: Optional[torch.Tensor] = None,
+ masking_pattern: Optional[torch.Tensor] = None,
+ num_recycles: Optional[int] = None,
+ ):
+ r"""
+ Returns:
+
+ Example:
+
+ ```python
+ >>> from transformers import AutoTokenizer, EsmForProteinFolding
+
+ >>> model = EsmForProteinFolding.from_pretrained("facebook/esmfold_v1")
+ >>> tokenizer = AutoTokenizer.from_pretrained("facebook/esmfold_v1")
+ >>> inputs = tokenizer(["MLKNVQVQLV"], return_tensors="pt", add_special_tokens=False) # A tiny random peptide
+ >>> outputs = model(**inputs)
+ >>> folded_positions = outputs.positions
+ ```
+
+ """
+ cfg = self.config.esmfold_config
+
+ aa = input_ids # B x L
+ B = aa.shape[0]
+ L = aa.shape[1]
+ device = input_ids.device
+ if attention_mask is None:
+ attention_mask = torch.ones_like(aa, device=device)
+ if position_ids is None:
+ position_ids = torch.arange(L, device=device).expand_as(input_ids)
+
+ # === ESM ===
+ esmaa = self.af2_idx_to_esm_idx(aa, attention_mask)
+
+ if masking_pattern is not None:
+ masked_aa, esmaa, mlm_targets = self.bert_mask(aa, esmaa, attention_mask, masking_pattern)
+ else:
+ masked_aa = aa
+ mlm_targets = None
+
+ # We get sequence and pair representations from whatever version of ESM /
+ # configuration we are using. The sequence representation esm_s is always
+ # present. The pair embedding esm_z may be present depending on the
+ # configuration of the model. If esm_z is not used by the model then it
+ # is returned as None here.
+ esm_s = self.compute_language_model_representations(esmaa)
+
+ # Convert esm_s and esm_z, if present, to the precision used by the trunk and
+ # the structure module. These tensors may be a lower precision if, for example,
+ # we're running the language model in fp16 precision.
+ esm_s = esm_s.to(self.esm_s_combine.dtype)
+
+ if cfg.esm_ablate_sequence:
+ esm_s = esm_s * 0
+
+ esm_s = esm_s.detach()
+
+ # === preprocessing ===
+ esm_s = (self.esm_s_combine.softmax(0).unsqueeze(0) @ esm_s).squeeze(2)
+ s_s_0 = self.esm_s_mlp(esm_s)
+
+ s_z_0 = s_s_0.new_zeros(B, L, L, cfg.trunk.pairwise_state_dim)
+
+ if self.config.esmfold_config.embed_aa:
+ s_s_0 += self.embedding(masked_aa)
+
+ structure: dict = self.trunk(s_s_0, s_z_0, aa, position_ids, attention_mask, no_recycles=num_recycles)
+ # Documenting what we expect:
+ structure = {
+ k: v
+ for k, v in structure.items()
+ if k
+ in [
+ "s_z",
+ "s_s",
+ "frames",
+ "sidechain_frames",
+ "unnormalized_angles",
+ "angles",
+ "positions",
+ "states",
+ ]
+ }
+
+ # Add BERT mask for the loss to use, if available.
+ if mlm_targets:
+ structure["mlm_targets"] = mlm_targets
+
+ disto_logits = self.distogram_head(structure["s_z"])
+ disto_logits = (disto_logits + disto_logits.transpose(1, 2)) / 2
+ structure["distogram_logits"] = disto_logits
+
+ lm_logits = self.lm_head(structure["s_s"])
+ structure["lm_logits"] = lm_logits
+
+ structure["aatype"] = aa
+ make_atom14_masks(structure)
+ # Of course, this doesn't respect the true mask because it doesn't know about it...
+ # We're not going to properly mask change of index tensors:
+ # "residx_atom14_to_atom37",
+ # "residx_atom37_to_atom14",
+ for k in [
+ "atom14_atom_exists",
+ "atom37_atom_exists",
+ ]:
+ structure[k] *= attention_mask.unsqueeze(-1)
+ structure["residue_index"] = position_ids
+
+ lddt_head = self.lddt_head(structure["states"]).reshape(structure["states"].shape[0], B, L, -1, self.lddt_bins)
+ structure["lddt_head"] = lddt_head
+ plddt = categorical_lddt(lddt_head[-1], bins=self.lddt_bins)
+ structure["plddt"] = plddt
+
+ ptm_logits = self.ptm_head(structure["s_z"])
+ structure["ptm_logits"] = ptm_logits
+ structure["ptm"] = compute_tm(ptm_logits, max_bin=31, no_bins=self.distogram_bins)
+ structure.update(compute_predicted_aligned_error(ptm_logits, max_bin=31, no_bins=self.distogram_bins))
+
+ return EsmForProteinFoldingOutput(**structure)
+
+ def af2_idx_to_esm_idx(self, aa, mask):
+ # avoid indexing on different devices
+ if self.af2_to_esm.device != aa.device:
+ self.af2_to_esm = self.af2_to_esm.to(aa.device)
+ aa = (aa + 1).masked_fill(mask != 1, 0)
+ return self.af2_to_esm[aa]
+
+ def compute_language_model_representations(self, esmaa: torch.Tensor) -> torch.Tensor:
+ device = next(self.parameters()).device
+ B, L = esmaa.shape # B = batch size, L = sequence length.
+
+ if self.config.esmfold_config.bypass_lm:
+ esm_s = torch.zeros(B, L, self.esm_s_combine.size[0], -1, self.esm_feats, device=device)
+ return esm_s
+
+ bosi, eosi = self.esm_dict_cls_idx, self.esm_dict_eos_idx
+ bos = esmaa.new_full((B, 1), bosi)
+ eos = esmaa.new_full((B, 1), self.esm_dict_padding_idx)
+ esmaa = torch.cat([bos, esmaa, eos], dim=1)
+ # Use the first padding index as eos during inference.
+ esmaa[range(B), (esmaa != 1).sum(1)] = eosi
+
+ # _, esm_z, esm_s = self.esm(esmaa, return_pairs=self.config.esmfold_config.use_esm_attn_map)
+ # Because we do not support use_esm_attn_map in the HF port as it is not used in any public models,
+ # esm_z is always None
+ esm_hidden_states = self.esm(esmaa, attention_mask=esmaa != 1, output_hidden_states=True)["hidden_states"]
+ esm_s = torch.stack(esm_hidden_states, dim=2)
+
+ esm_s = esm_s[:, 1:-1] # B, L, nLayers, C
+
+ return esm_s
+
+ def bert_mask(self, aa, esmaa, mask, pattern):
+ new_aa = aa.clone()
+ target = aa.clone()
+ new_esmaa = esmaa.clone()
+ new_aa[pattern == 1] = self.mask_idx
+ target[pattern != 1] = 0
+ new_esmaa[pattern == 1] = self.esm_dict_mask_idx
+ return new_aa, new_esmaa, target
+
+ @torch.no_grad()
+ def infer(
+ self,
+ seqs: Union[str, List[str]],
+ position_ids=None,
+ ):
+ if type(seqs) is str:
+ lst = [seqs]
+ else:
+ lst = seqs
+ # Returns the raw outputs of the model given an input sequence.
+ device = next(self.parameters()).device
+ aatype = collate_dense_tensors(
+ [
+ torch.from_numpy(
+ residue_constants.sequence_to_onehot(
+ sequence=seq,
+ mapping=residue_constants.restype_order_with_x,
+ map_unknown_to_x=True,
+ )
+ )
+ .to(device)
+ .argmax(dim=1)
+ for seq in lst
+ ]
+ ) # B=1 x L
+ mask = collate_dense_tensors([aatype.new_ones(len(seq)) for seq in lst])
+ position_ids = (
+ torch.arange(aatype.shape[1], device=device).expand(len(lst), -1)
+ if position_ids is None
+ else position_ids.to(device)
+ )
+ if position_ids.ndim == 1:
+ position_ids = position_ids.unsqueeze(0)
+ return self.forward(
+ aatype,
+ mask,
+ position_ids=position_ids,
+ )
+
+ @staticmethod
+ def output_to_pdb(output: Dict) -> List[str]:
+ """Returns the pbd (file) string from the model given the model output."""
+ output = {k: v.to("cpu").numpy() for k, v in output.items()}
+ pdbs = []
+ final_atom_positions = atom14_to_atom37(output["positions"][-1], output)
+ final_atom_mask = output["atom37_atom_exists"]
+ for i in range(output["aatype"].shape[0]):
+ aa = output["aatype"][i]
+ pred_pos = final_atom_positions[i]
+ mask = final_atom_mask[i]
+ resid = output["residue_index"][i] + 1
+ pred = OFProtein(
+ aatype=aa,
+ atom_positions=pred_pos,
+ atom_mask=mask,
+ residue_index=resid,
+ b_factors=output["plddt"][i],
+ )
+ pdbs.append(to_pdb(pred))
+ return pdbs
+
+ def infer_pdb(self, seqs, *args, **kwargs) -> str:
+ """Returns the pdb (file) string from the model given an input sequence."""
+ assert type(seqs) is str
+ output = self.infer(seqs, *args, **kwargs)
+ return self.output_to_pdb(output)[0]
+
+ def infer_pdbs(self, seqs: List[str], *args, **kwargs) -> List[str]:
+ """Returns the pdb (file) string from the model given an input sequence."""
+ output = self.infer(seqs, *args, **kwargs)
+ return self.output_to_pdb(output)
diff --git a/open_biomed/models/protein/mutaplm/modeling_esm.py b/open_biomed/models/protein/mutaplm/modeling_esm.py
new file mode 100644
index 0000000000000000000000000000000000000000..bac728da005453870e907ff0b6174077da1ab6e5
--- /dev/null
+++ b/open_biomed/models/protein/mutaplm/modeling_esm.py
@@ -0,0 +1,1390 @@
+# coding=utf-8
+# Copyright 2022 Meta and The HuggingFace Inc. team. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+""" PyTorch ESM model."""
+
+import copy
+import math
+from typing import List, Optional, Tuple, Union
+
+import torch
+import torch.utils.checkpoint
+from torch import nn
+from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss
+import torch.nn.functional as F
+
+from transformers.file_utils import add_code_sample_docstrings, add_start_docstrings, add_start_docstrings_to_model_forward
+from transformers.modeling_outputs import (
+ BaseModelOutputWithPastAndCrossAttentions,
+ BaseModelOutputWithPoolingAndCrossAttentions,
+ MaskedLMOutput,
+ SequenceClassifierOutput,
+ TokenClassifierOutput,
+ ModelOutput,
+)
+from transformers.modeling_utils import PreTrainedModel, find_pruneable_heads_and_indices, prune_linear_layer
+from transformers.utils import logging
+from transformers.models.esm.configuration_esm import EsmConfig
+
+logger = logging.get_logger(__name__)
+
+_CHECKPOINT_FOR_DOC = "facebook/esm2_t6_8M_UR50D"
+_CONFIG_FOR_DOC = "EsmConfig"
+
+ESM_PRETRAINED_MODEL_ARCHIVE_LIST = [
+ "facebook/esm2_t6_8M_UR50D",
+ "facebook/esm2_t12_35M_UR50D",
+ # This is not a complete list of all ESM models!
+ # See all ESM models at https://huggingface.co/models?filter=esm
+]
+
+
+def rotate_half(x):
+ x1, x2 = x.chunk(2, dim=-1)
+ return torch.cat((-x2, x1), dim=-1)
+
+
+def apply_rotary_pos_emb(x, cos, sin):
+ cos = cos[:, :, : x.shape[-2], :]
+ sin = sin[:, :, : x.shape[-2], :]
+
+ return (x * cos) + (rotate_half(x) * sin)
+
+
+def gelu(x):
+ """
+ This is the gelu implementation from the original ESM repo. Using F.gelu yields subtly wrong results.
+ """
+ return x * 0.5 * (1.0 + torch.erf(x / math.sqrt(2.0)))
+
+
+def symmetrize(x):
+ "Make layer symmetric in final two dimensions, used for contact prediction."
+ return x + x.transpose(-1, -2)
+
+
+def average_product_correct(x):
+ "Perform average product correct, used for contact prediction."
+ a1 = x.sum(-1, keepdims=True)
+ a2 = x.sum(-2, keepdims=True)
+ a12 = x.sum((-1, -2), keepdims=True)
+
+ avg = a1 * a2
+ avg.div_(a12) # in-place to reduce memory
+ normalized = x - avg
+ return normalized
+
+
+class RotaryEmbedding(torch.nn.Module):
+ """
+ Rotary position embeddings based on those in
+ [RoFormer](https://huggingface.co/docs/transformers/model_doc/roformer). Query and keys are transformed by rotation
+ matrices which depend on their relative positions.
+ """
+
+ def __init__(self, dim: int):
+ super().__init__()
+ # Generate and save the inverse frequency buffer (non trainable)
+ inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2).float() / dim))
+ inv_freq = inv_freq
+ self.register_buffer("inv_freq", inv_freq)
+
+ self._seq_len_cached = None
+ self._cos_cached = None
+ self._sin_cached = None
+
+ def _update_cos_sin_tables(self, x, seq_dimension=2):
+ seq_len = x.shape[seq_dimension]
+
+ # Reset the tables if the sequence length has changed,
+ # or if we're on a new device (possibly due to tracing for instance)
+ if seq_len != self._seq_len_cached or self._cos_cached.device != x.device:
+ self._seq_len_cached = seq_len
+ t = torch.arange(x.shape[seq_dimension], device=x.device).type_as(self.inv_freq)
+ freqs = torch.outer(t, self.inv_freq)
+ emb = torch.cat((freqs, freqs), dim=-1).to(x.device)
+
+ self._cos_cached = emb.cos()[None, None, :, :]
+ self._sin_cached = emb.sin()[None, None, :, :]
+
+ return self._cos_cached, self._sin_cached
+
+ def forward(self, q: torch.Tensor, k: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
+ self._cos_cached, self._sin_cached = self._update_cos_sin_tables(q, seq_dimension=-2)
+ rotated_q = apply_rotary_pos_emb(q, self._cos_cached, self._sin_cached)
+
+ self._cos_cached, self._sin_cached = self._update_cos_sin_tables(k, seq_dimension=-2)
+ rotated_k = apply_rotary_pos_emb(k, self._cos_cached, self._sin_cached)
+
+ return (rotated_q, rotated_k)
+
+
+class EsmContactPredictionHead(nn.Module):
+ """Performs symmetrization, apc, and computes a logistic regression on the output features"""
+
+ def __init__(
+ self,
+ in_features: int,
+ bias=True,
+ eos_idx: int = 2,
+ ):
+ super().__init__()
+ self.in_features = in_features
+ self.eos_idx = eos_idx
+ self.regression = nn.Linear(in_features, 1, bias)
+ self.activation = nn.Sigmoid()
+
+ def forward(self, tokens, attentions):
+ # remove eos token attentions
+ eos_mask = tokens.ne(self.eos_idx).to(attentions)
+ eos_mask = eos_mask.unsqueeze(1) * eos_mask.unsqueeze(2)
+ attentions = attentions * eos_mask[:, None, None, :, :]
+ attentions = attentions[..., :-1, :-1]
+ # remove cls token attentions
+ attentions = attentions[..., 1:, 1:]
+ batch_size, layers, heads, seqlen, _ = attentions.size()
+ attentions = attentions.view(batch_size, layers * heads, seqlen, seqlen)
+
+ # features: batch x channels x tokens x tokens (symmetric)
+ attentions = attentions.to(
+ self.regression.weight.device
+ ) # attentions always float32, may need to convert to float16
+ attentions = average_product_correct(symmetrize(attentions))
+ attentions = attentions.permute(0, 2, 3, 1)
+ return self.activation(self.regression(attentions).squeeze(3))
+
+
+class EsmEmbeddings(nn.Module):
+ """
+ Same as BertEmbeddings with a tiny tweak for positional embeddings indexing.
+ """
+
+ def __init__(self, config):
+ super().__init__()
+ self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id)
+
+ if config.emb_layer_norm_before:
+ self.layer_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
+ else:
+ self.layer_norm = None
+ self.dropout = nn.Dropout(config.hidden_dropout_prob)
+ # position_ids (1, len position emb) is contiguous in memory and exported when serialized
+ self.position_embedding_type = getattr(config, "position_embedding_type", "absolute")
+ self.register_buffer(
+ "position_ids", torch.arange(config.max_position_embeddings).expand((1, -1)), persistent=False
+ )
+
+ self.padding_idx = config.pad_token_id
+ self.position_embeddings = nn.Embedding(
+ config.max_position_embeddings, config.hidden_size, padding_idx=self.padding_idx
+ )
+ self.token_dropout = config.token_dropout
+ self.mask_token_id = config.mask_token_id
+
+ def forward(
+ self, input_ids=None, attention_mask=None, position_ids=None, inputs_embeds=None, past_key_values_length=0
+ ):
+ if position_ids is None:
+ if input_ids is not None:
+ # Create the position ids from the input token ids. Any padded tokens remain padded.
+ position_ids = create_position_ids_from_input_ids(input_ids, self.padding_idx, past_key_values_length)
+ else:
+ position_ids = self.create_position_ids_from_inputs_embeds(inputs_embeds)
+
+ if inputs_embeds is None:
+ inputs_embeds = self.word_embeddings(input_ids)
+
+ # Note that if we want to support ESM-1 (not 1b!) in future then we need to support an
+ # embedding_scale factor here.
+ embeddings = inputs_embeds
+
+ # Matt: ESM has the option to handle masking in MLM in a slightly unusual way. If the token_dropout
+ # flag is False then it is handled in the same was as BERT/RoBERTa. If it is set to True, however,
+ # masked tokens are treated as if they were selected for input dropout and zeroed out.
+ # This "mask-dropout" is compensated for when masked tokens are not present, by scaling embeddings by
+ # a factor of (fraction of unmasked tokens during training) / (fraction of unmasked tokens in sample).
+ # This is analogous to the way that dropout layers scale down outputs during evaluation when not
+ # actually dropping out values (or, equivalently, scale up their un-dropped outputs in training).
+ if self.token_dropout:
+ embeddings = embeddings.masked_fill((input_ids == self.mask_token_id).unsqueeze(-1), 0.0)
+ mask_ratio_train = 0.15 * 0.8 # Hardcoded as the ratio used in all ESM model training runs
+ src_lengths = attention_mask.sum(-1)
+ mask_ratio_observed = (input_ids == self.mask_token_id).sum(-1).float() / src_lengths
+ embeddings = (embeddings * (1 - mask_ratio_train) / (1 - mask_ratio_observed)[:, None, None]).to(
+ embeddings.dtype
+ )
+
+ if self.position_embedding_type == "absolute":
+ position_embeddings = self.position_embeddings(position_ids)
+ embeddings = embeddings + position_embeddings
+
+ if self.layer_norm is not None:
+ embeddings = self.layer_norm(embeddings)
+ if attention_mask is not None:
+ embeddings = (embeddings * attention_mask.unsqueeze(-1)).to(embeddings.dtype)
+ # Matt: I think this line was copied incorrectly from BERT, disabling it for now.
+ # embeddings = self.dropout(embeddings)
+ return embeddings
+
+ def create_position_ids_from_inputs_embeds(self, inputs_embeds):
+ """
+ We are provided embeddings directly. We cannot infer which are padded so just generate sequential position ids.
+
+ Args:
+ inputs_embeds: torch.Tensor
+
+ Returns: torch.Tensor
+ """
+ input_shape = inputs_embeds.size()[:-1]
+ sequence_length = input_shape[1]
+
+ position_ids = torch.arange(
+ self.padding_idx + 1, sequence_length + self.padding_idx + 1, dtype=torch.long, device=inputs_embeds.device
+ )
+ return position_ids.unsqueeze(0).expand(input_shape)
+
+
+class EsmSelfAttention(nn.Module):
+ def __init__(self, config, position_embedding_type=None):
+ super().__init__()
+ if config.hidden_size % config.num_attention_heads != 0 and not hasattr(config, "embedding_size"):
+ raise ValueError(
+ f"The hidden size ({config.hidden_size}) is not a multiple of the number of attention "
+ f"heads ({config.num_attention_heads})"
+ )
+
+ self.num_attention_heads = config.num_attention_heads
+ self.attention_head_size = int(config.hidden_size / config.num_attention_heads)
+ self.all_head_size = self.num_attention_heads * self.attention_head_size
+
+ self.query = nn.Linear(config.hidden_size, self.all_head_size)
+ self.key = nn.Linear(config.hidden_size, self.all_head_size)
+ self.value = nn.Linear(config.hidden_size, self.all_head_size)
+
+ self.dropout = nn.Dropout(config.attention_probs_dropout_prob)
+ self.position_embedding_type = position_embedding_type or getattr(
+ config, "position_embedding_type", "absolute"
+ )
+ self.rotary_embeddings = None
+ if self.position_embedding_type == "relative_key" or self.position_embedding_type == "relative_key_query":
+ self.max_position_embeddings = config.max_position_embeddings
+ self.distance_embedding = nn.Embedding(2 * config.max_position_embeddings - 1, self.attention_head_size)
+ elif self.position_embedding_type == "rotary":
+ self.rotary_embeddings = RotaryEmbedding(dim=self.attention_head_size)
+
+ self.is_decoder = config.is_decoder
+
+ def transpose_for_scores(self, x: torch.Tensor) -> torch.Tensor:
+ new_x_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size)
+ x = x.view(new_x_shape)
+ return x.permute(0, 2, 1, 3)
+
+ def forward(
+ self,
+ hidden_states: torch.Tensor,
+ attention_mask: Optional[torch.FloatTensor] = None,
+ head_mask: Optional[torch.FloatTensor] = None,
+ encoder_hidden_states: Optional[torch.FloatTensor] = None,
+ encoder_attention_mask: Optional[torch.FloatTensor] = None,
+ past_key_value: Optional[Tuple[Tuple[torch.FloatTensor]]] = None,
+ output_attentions: Optional[bool] = False,
+ ) -> Tuple[torch.Tensor]:
+ mixed_query_layer = self.query(hidden_states)
+
+ # If this is instantiated as a cross-attention module, the keys
+ # and values come from an encoder; the attention mask needs to be
+ # such that the encoder's padding tokens are not attended to.
+ is_cross_attention = encoder_hidden_states is not None
+
+ if is_cross_attention and past_key_value is not None:
+ # reuse k,v, cross_attentions
+ key_layer = past_key_value[0]
+ value_layer = past_key_value[1]
+ attention_mask = encoder_attention_mask
+ elif is_cross_attention:
+ key_layer = self.transpose_for_scores(self.key(encoder_hidden_states))
+ value_layer = self.transpose_for_scores(self.value(encoder_hidden_states))
+ attention_mask = encoder_attention_mask
+ elif past_key_value is not None:
+ key_layer = self.transpose_for_scores(self.key(hidden_states))
+ value_layer = self.transpose_for_scores(self.value(hidden_states))
+ key_layer = torch.cat([past_key_value[0], key_layer], dim=2)
+ value_layer = torch.cat([past_key_value[1], value_layer], dim=2)
+ else:
+ key_layer = self.transpose_for_scores(self.key(hidden_states))
+ value_layer = self.transpose_for_scores(self.value(hidden_states))
+
+ query_layer = self.transpose_for_scores(mixed_query_layer)
+
+ # Matt: Our BERT model (which this code was derived from) scales attention logits down by sqrt(head_dim).
+ # ESM scales the query down by the same factor instead. Modulo numerical stability these are equivalent,
+ # but not when rotary embeddings get involved. Therefore, we scale the query here to match the original
+ # ESM code and fix rotary embeddings.
+ query_layer = query_layer * self.attention_head_size**-0.5
+
+ if self.is_decoder:
+ # if cross_attention save Tuple(torch.Tensor, torch.Tensor) of all cross attention key/value_states.
+ # Further calls to cross_attention layer can then reuse all cross-attention
+ # key/value_states (first "if" case)
+ # if uni-directional self-attention (decoder) save Tuple(torch.Tensor, torch.Tensor) of
+ # all previous decoder key/value_states. Further calls to uni-directional self-attention
+ # can concat previous decoder key/value_states to current projected key/value_states (third "elif" case)
+ # if encoder bi-directional self-attention `past_key_value` is always `None`
+ past_key_value = (key_layer, value_layer)
+
+ if self.position_embedding_type == "rotary":
+ query_layer, key_layer = self.rotary_embeddings(query_layer, key_layer)
+
+ # Take the dot product between "query" and "key" to get the raw attention scores.
+ attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2))
+
+ if self.position_embedding_type == "relative_key" or self.position_embedding_type == "relative_key_query":
+ seq_length = hidden_states.size()[1]
+ position_ids_l = torch.arange(seq_length, dtype=torch.long, device=hidden_states.device).view(-1, 1)
+ position_ids_r = torch.arange(seq_length, dtype=torch.long, device=hidden_states.device).view(1, -1)
+ distance = position_ids_l - position_ids_r
+ positional_embedding = self.distance_embedding(distance + self.max_position_embeddings - 1)
+ positional_embedding = positional_embedding.to(dtype=query_layer.dtype) # fp16 compatibility
+
+ if self.position_embedding_type == "relative_key":
+ relative_position_scores = torch.einsum("bhld,lrd->bhlr", query_layer, positional_embedding)
+ attention_scores = attention_scores + relative_position_scores
+ elif self.position_embedding_type == "relative_key_query":
+ relative_position_scores_query = torch.einsum("bhld,lrd->bhlr", query_layer, positional_embedding)
+ relative_position_scores_key = torch.einsum("bhrd,lrd->bhlr", key_layer, positional_embedding)
+ attention_scores = attention_scores + relative_position_scores_query + relative_position_scores_key
+
+ if attention_mask is not None:
+ # Apply the attention mask is (precomputed for all layers in EsmModel forward() function)
+ attention_scores = attention_scores + attention_mask
+
+ # Normalize the attention scores to probabilities.
+ attention_probs = nn.functional.softmax(attention_scores, dim=-1)
+
+ # This is actually dropping out entire tokens to attend to, which might
+ # seem a bit unusual, but is taken from the original Transformer paper.
+ attention_probs = self.dropout(attention_probs)
+
+ # Mask heads if we want to
+ if head_mask is not None:
+ attention_probs = attention_probs * head_mask
+
+ context_layer = torch.matmul(attention_probs, value_layer)
+
+ context_layer = context_layer.permute(0, 2, 1, 3).contiguous()
+ new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size,)
+ context_layer = context_layer.view(new_context_layer_shape)
+
+ outputs = (context_layer, attention_probs) if output_attentions else (context_layer,)
+
+ if self.is_decoder:
+ outputs = outputs + (past_key_value,)
+ return outputs
+
+
+class EsmSelfOutput(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.dense = nn.Linear(config.hidden_size, config.hidden_size)
+ self.dropout = nn.Dropout(config.hidden_dropout_prob)
+
+ def forward(self, hidden_states, input_tensor):
+ hidden_states = self.dense(hidden_states)
+ hidden_states = self.dropout(hidden_states)
+ hidden_states = hidden_states + input_tensor
+ return hidden_states
+
+
+class EsmAttention(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.self = EsmSelfAttention(config)
+ self.output = EsmSelfOutput(config)
+ self.pruned_heads = set()
+ self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
+
+ def prune_heads(self, heads):
+ if len(heads) == 0:
+ return
+ heads, index = find_pruneable_heads_and_indices(
+ heads, self.self.num_attention_heads, self.self.attention_head_size, self.pruned_heads
+ )
+
+ # Prune linear layers
+ self.self.query = prune_linear_layer(self.self.query, index)
+ self.self.key = prune_linear_layer(self.self.key, index)
+ self.self.value = prune_linear_layer(self.self.value, index)
+ self.output.dense = prune_linear_layer(self.output.dense, index, dim=1)
+
+ # Update hyper params and store pruned heads
+ self.self.num_attention_heads = self.self.num_attention_heads - len(heads)
+ self.self.all_head_size = self.self.attention_head_size * self.self.num_attention_heads
+ self.pruned_heads = self.pruned_heads.union(heads)
+
+ def forward(
+ self,
+ hidden_states,
+ attention_mask=None,
+ head_mask=None,
+ encoder_hidden_states=None,
+ encoder_attention_mask=None,
+ past_key_value=None,
+ output_attentions=False,
+ ):
+ hidden_states_ln = self.LayerNorm(hidden_states)
+ self_outputs = self.self(
+ hidden_states_ln,
+ attention_mask,
+ head_mask,
+ encoder_hidden_states,
+ encoder_attention_mask,
+ past_key_value,
+ output_attentions,
+ )
+ attention_output = self.output(self_outputs[0], hidden_states)
+ outputs = (attention_output,) + self_outputs[1:] # add attentions if we output them
+ return outputs
+
+
+class EsmIntermediate(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.dense = nn.Linear(config.hidden_size, config.intermediate_size)
+
+ def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
+ hidden_states = self.dense(hidden_states)
+ hidden_states = gelu(hidden_states)
+ return hidden_states
+
+
+class EsmOutput(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.dense = nn.Linear(config.intermediate_size, config.hidden_size)
+ self.dropout = nn.Dropout(config.hidden_dropout_prob)
+
+ def forward(self, hidden_states, input_tensor):
+ hidden_states = self.dense(hidden_states)
+ hidden_states = self.dropout(hidden_states)
+ hidden_states = hidden_states + input_tensor
+ return hidden_states
+
+
+class EsmLayer(nn.Module):
+ def __init__(self, config, layer_id):
+ super().__init__()
+ self.chunk_size_feed_forward = config.chunk_size_feed_forward
+ self.seq_len_dim = 1
+ self.attention = EsmAttention(config)
+ self.is_decoder = config.is_decoder
+ self.add_cross_attention = config.add_cross_attention and (layer_id + 1) % config.adapter_freq == 0
+ if self.add_cross_attention:
+ """
+ fuck this assertion
+ if not self.is_decoder:
+ raise RuntimeError(f"{self} should be used as a decoder model if cross attention is added")
+ """
+ adapter_config = copy.deepcopy(config)
+ adapter_config.intermediate_size = adapter_config.hidden_size // 2
+ self.crossattention_adapter = EsmAttention(adapter_config)
+ self.intermediate_adapter = EsmIntermediate(adapter_config)
+ self.output_adapter = EsmOutput(adapter_config)
+ self.LayerNorm_adapter = nn.LayerNorm(adapter_config.hidden_size, adapter_config.layer_norm_eps)
+ self.intermediate = EsmIntermediate(config)
+ self.output = EsmOutput(config)
+ self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
+
+ def forward(
+ self,
+ hidden_states,
+ attention_mask=None,
+ head_mask=None,
+ encoder_hidden_states=None,
+ encoder_attention_mask=None,
+ past_key_value=None,
+ output_attentions=False,
+ ):
+ # decoder uni-directional self-attention cached key/values tuple is at positions 1,2
+ self_attn_past_key_value = past_key_value[:2] if past_key_value is not None else None
+ self_attention_outputs = self.attention(
+ hidden_states,
+ attention_mask,
+ head_mask,
+ output_attentions=output_attentions,
+ past_key_value=self_attn_past_key_value,
+ )
+ attention_output = self_attention_outputs[0]
+
+ # if decoder, the last output is tuple of self-attn cache
+ if self.is_decoder:
+ outputs = self_attention_outputs[1:-1]
+ present_key_value = self_attention_outputs[-1]
+ else:
+ outputs = self_attention_outputs[1:] # add self attentions if we output attention weights
+
+ layer_output = self.feed_forward_chunk(attention_output)
+
+ cross_attn_present_key_value = None
+ if self.add_cross_attention and encoder_hidden_states is not None:
+ if not hasattr(self, "crossattention_adapter"):
+ raise AttributeError(
+ f"If `encoder_hidden_states` are passed, {self} has to be instantiated"
+ " with cross-attention layers by setting `config.add_cross_attention=True`"
+ )
+
+ # cross_attn cached key/values tuple is at positions 3,4 of past_key_value tuple
+ cross_attn_past_key_value = past_key_value[-2:] if past_key_value is not None else None
+ cross_attention_outputs = self.crossattention_adapter(
+ layer_output,
+ attention_mask,
+ head_mask,
+ encoder_hidden_states,
+ encoder_attention_mask,
+ cross_attn_past_key_value,
+ output_attentions,
+ )
+ attention_output = cross_attention_outputs[0]
+ layer_output = self.feed_forward_chunk_adapter(attention_output)
+
+ outputs = outputs + cross_attention_outputs[1:-1] # add cross attentions if we output attention weights
+
+ # add cross-attn cache to positions 3,4 of present_key_value tuple
+ # cross_attn_present_key_value = cross_attention_outputs[-1]
+ # present_key_value = present_key_value + cross_attn_present_key_value
+
+ outputs = (layer_output,) + outputs
+
+ # if decoder, return the attn key/values as the last output
+ if self.is_decoder:
+ outputs = outputs + (present_key_value,)
+ return outputs
+
+ def feed_forward_chunk(self, attention_output):
+ attention_output_ln = self.LayerNorm(attention_output)
+ intermediate_output = self.intermediate(attention_output_ln)
+ layer_output = self.output(intermediate_output, attention_output)
+ return layer_output
+
+ def feed_forward_chunk_adapter(self, attention_output):
+ attention_output_ln = self.LayerNorm_adapter(attention_output)
+ intermediate_output = self.intermediate_adapter(attention_output_ln)
+ layer_output = self.output_adapter(intermediate_output, attention_output)
+ return layer_output
+
+
+class EsmEncoder(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.config = config
+ self.layer = nn.ModuleList([EsmLayer(config, i) for i in range(config.num_hidden_layers)])
+ self.emb_layer_norm_after = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
+ self.gradient_checkpointing = False
+
+ def forward(
+ self,
+ hidden_states,
+ attention_mask=None,
+ head_mask=None,
+ encoder_hidden_states=None,
+ encoder_attention_mask=None,
+ past_key_values=None,
+ use_cache=None,
+ output_attentions=False,
+ output_hidden_states=False,
+ return_dict=True,
+ ):
+ if self.gradient_checkpointing and self.training:
+ if use_cache:
+ logger.warning_once(
+ "`use_cache=True` is incompatible with `config.gradient_checkpointing=True`. Setting "
+ "`use_cache=False`..."
+ )
+ use_cache = False
+ all_hidden_states = () if output_hidden_states else None
+ all_self_attentions = () if output_attentions else None
+ all_cross_attentions = () if output_attentions and self.config.add_cross_attention else None
+
+ next_decoder_cache = () if use_cache else None
+ for i, layer_module in enumerate(self.layer):
+ if output_hidden_states:
+ all_hidden_states = all_hidden_states + (hidden_states,)
+
+ layer_head_mask = head_mask[i] if head_mask is not None else None
+ past_key_value = past_key_values[i] if past_key_values is not None else None
+
+ if self.gradient_checkpointing and self.training:
+ layer_outputs = self._gradient_checkpointing_func(
+ layer_module.__call__,
+ hidden_states,
+ attention_mask,
+ layer_head_mask,
+ encoder_hidden_states,
+ encoder_attention_mask,
+ past_key_value,
+ output_attentions,
+ )
+ else:
+ layer_outputs = layer_module(
+ hidden_states,
+ attention_mask,
+ layer_head_mask,
+ encoder_hidden_states,
+ encoder_attention_mask,
+ past_key_value,
+ output_attentions,
+ )
+
+ hidden_states = layer_outputs[0]
+ if use_cache:
+ next_decoder_cache = next_decoder_cache + (layer_outputs[-1],)
+ if output_attentions:
+ all_self_attentions = all_self_attentions + (layer_outputs[1],)
+ if self.config.add_cross_attention:
+ all_cross_attentions = all_cross_attentions + (layer_outputs[2],)
+
+ if self.emb_layer_norm_after:
+ hidden_states = self.emb_layer_norm_after(hidden_states)
+
+ if output_hidden_states:
+ all_hidden_states = all_hidden_states + (hidden_states,)
+
+ if not return_dict:
+ return tuple(
+ v
+ for v in [
+ hidden_states,
+ next_decoder_cache,
+ all_hidden_states,
+ all_self_attentions,
+ all_cross_attentions,
+ ]
+ if v is not None
+ )
+ return BaseModelOutputWithPastAndCrossAttentions(
+ last_hidden_state=hidden_states,
+ past_key_values=next_decoder_cache,
+ hidden_states=all_hidden_states,
+ attentions=all_self_attentions,
+ cross_attentions=all_cross_attentions,
+ )
+
+
+# Copied from transformers.models.bert.modeling_bert.BertPooler
+class EsmPooler(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ self.dense = nn.Linear(config.hidden_size, config.hidden_size)
+ self.activation = nn.Tanh()
+
+ def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
+ # We "pool" the model by simply taking the hidden state corresponding
+ # to the first token.
+ first_token_tensor = hidden_states[:, 0]
+ pooled_output = self.dense(first_token_tensor)
+ pooled_output = self.activation(pooled_output)
+ return pooled_output
+
+
+class EsmPreTrainedModel(PreTrainedModel):
+ """
+ An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
+ models.
+ """
+
+ config_class = EsmConfig
+ base_model_prefix = "esm"
+ supports_gradient_checkpointing = True
+ _no_split_modules = ["EsmLayer", "EsmFoldTriangularSelfAttentionBlock", "EsmEmbeddings"]
+
+ # Copied from transformers.models.bert.modeling_bert.BertPreTrainedModel._init_weights
+ def _init_weights(self, module):
+ """Initialize the weights"""
+ if isinstance(module, nn.Linear):
+ # Slightly different from the TF version which uses truncated_normal for initialization
+ # cf https://github.com/pytorch/pytorch/pull/5617
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
+ if module.bias is not None:
+ module.bias.data.zero_()
+ elif isinstance(module, nn.Embedding):
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
+ if module.padding_idx is not None:
+ module.weight.data[module.padding_idx].zero_()
+ elif isinstance(module, nn.LayerNorm):
+ module.bias.data.zero_()
+ module.weight.data.fill_(1.0)
+
+
+ESM_START_DOCSTRING = r"""
+
+ This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the
+ library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads
+ etc.)
+
+ This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass.
+ Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage
+ and behavior.
+
+ Parameters:
+ config ([`EsmConfig`]): Model configuration class with all the parameters of the
+ model. Initializing with a config file does not load the weights associated with the model, only the
+ configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights.
+"""
+
+ESM_INPUTS_DOCSTRING = r"""
+ Args:
+ input_ids (`torch.LongTensor` of shape `({0})`):
+ Indices of input sequence tokens in the vocabulary.
+
+ Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
+ [`PreTrainedTokenizer.__call__`] for details.
+
+ [What are input IDs?](../glossary#input-ids)
+ attention_mask (`torch.FloatTensor` of shape `({0})`, *optional*):
+ Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`:
+
+ - 1 for tokens that are **not masked**,
+ - 0 for tokens that are **masked**.
+
+ [What are attention masks?](../glossary#attention-mask)
+ position_ids (`torch.LongTensor` of shape `({0})`, *optional*):
+ Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
+ config.max_position_embeddings - 1]`.
+
+ [What are position IDs?](../glossary#position-ids)
+ head_mask (`torch.FloatTensor` of shape `(num_heads,)` or `(num_layers, num_heads)`, *optional*):
+ Mask to nullify selected heads of the self-attention modules. Mask values selected in `[0, 1]`:
+
+ - 1 indicates the head is **not masked**,
+ - 0 indicates the head is **masked**.
+
+ inputs_embeds (`torch.FloatTensor` of shape `({0}, hidden_size)`, *optional*):
+ Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This
+ is useful if you want more control over how to convert `input_ids` indices into associated vectors than the
+ model's internal embedding lookup matrix.
+ output_attentions (`bool`, *optional*):
+ Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned
+ tensors for more detail.
+ output_hidden_states (`bool`, *optional*):
+ Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
+ more detail.
+ return_dict (`bool`, *optional*):
+ Whether or not to return a [`~file_utils.ModelOutput`] instead of a plain tuple.
+"""
+
+
+@add_start_docstrings(
+ "The bare ESM Model transformer outputting raw hidden-states without any specific head on top.",
+ ESM_START_DOCSTRING,
+)
+class EsmModel(EsmPreTrainedModel):
+ """
+
+ The model can behave as an encoder (with only self-attention) as well as a decoder, in which case a layer of
+ cross-attention is added between the self-attention layers, following the architecture described in [Attention is
+ all you need](https://arxiv.org/abs/1706.03762) by Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit,
+ Llion Jones, Aidan N. Gomez, Lukasz Kaiser and Illia Polosukhin.
+
+ To behave as an decoder the model needs to be initialized with the `is_decoder` argument of the configuration set
+ to `True`. To be used in a Seq2Seq model, the model needs to initialized with both `is_decoder` argument and
+ `add_cross_attention` set to `True`; an `encoder_hidden_states` is then expected as an input to the forward pass.
+ """
+
+ def __init__(self, config, add_pooling_layer=True):
+ config.add_cross_attention = True
+ config.adapter_freq = 11
+ super().__init__(config)
+ self.config = config
+
+ self.embeddings = EsmEmbeddings(config)
+ self.encoder = EsmEncoder(config)
+
+ self.pooler = EsmPooler(config) if add_pooling_layer else None
+
+ self.contact_head = EsmContactPredictionHead(
+ in_features=config.num_hidden_layers * config.num_attention_heads, bias=True
+ )
+
+ # Initialize weights and apply final processing
+ self.post_init()
+
+ def get_input_embeddings(self):
+ return self.embeddings.word_embeddings
+
+ def set_input_embeddings(self, value):
+ self.embeddings.word_embeddings = value
+
+ def _prune_heads(self, heads_to_prune):
+ """
+ Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base
+ class PreTrainedModel
+ """
+ for layer, heads in heads_to_prune.items():
+ self.encoder.layer[layer].attention.prune_heads(heads)
+
+ @add_start_docstrings_to_model_forward(ESM_INPUTS_DOCSTRING.format("(batch_size, sequence_length)"))
+ @add_code_sample_docstrings(
+ checkpoint=_CHECKPOINT_FOR_DOC,
+ output_type=BaseModelOutputWithPoolingAndCrossAttentions,
+ config_class=_CONFIG_FOR_DOC,
+ )
+ def forward(
+ self,
+ input_ids: Optional[torch.Tensor] = None,
+ attention_mask: Optional[torch.Tensor] = None,
+ position_ids: Optional[torch.Tensor] = None,
+ head_mask: Optional[torch.Tensor] = None,
+ inputs_embeds: Optional[torch.Tensor] = None,
+ encoder_hidden_states: Optional[torch.Tensor] = None,
+ encoder_attention_mask: Optional[torch.Tensor] = None,
+ past_key_values: Optional[List[torch.FloatTensor]] = None,
+ use_cache: Optional[bool] = None,
+ output_attentions: Optional[bool] = None,
+ output_hidden_states: Optional[bool] = None,
+ return_dict: Optional[bool] = None,
+ ) -> Union[Tuple[torch.Tensor], BaseModelOutputWithPoolingAndCrossAttentions]:
+ r"""
+ encoder_hidden_states (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*):
+ Sequence of hidden-states at the output of the last layer of the encoder. Used in the cross-attention if
+ the model is configured as a decoder.
+ encoder_attention_mask (`torch.FloatTensor` of shape `(batch_size, sequence_length)`, *optional*):
+ Mask to avoid performing attention on the padding token indices of the encoder input. This mask is used in
+ the cross-attention if the model is configured as a decoder. Mask values selected in `[0, 1]`:
+
+ - 1 for tokens that are **not masked**,
+ - 0 for tokens that are **masked**.
+ past_key_values (`tuple(tuple(torch.FloatTensor))` of length `config.n_layers` with each tuple having 4 tensors of shape `(batch_size, num_heads, sequence_length - 1, embed_size_per_head)`):
+ Contains precomputed key and value hidden states of the attention blocks. Can be used to speed up decoding.
+
+ If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that
+ don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all
+ `decoder_input_ids` of shape `(batch_size, sequence_length)`.
+ use_cache (`bool`, *optional*):
+ If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see
+ `past_key_values`).
+ """
+ output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
+ output_hidden_states = (
+ output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
+ )
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
+
+ if self.config.is_decoder:
+ use_cache = use_cache if use_cache is not None else self.config.use_cache
+ else:
+ use_cache = False
+
+ if input_ids is not None and inputs_embeds is not None:
+ raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")
+ elif input_ids is not None:
+ self.warn_if_padding_and_no_attention_mask(input_ids, attention_mask)
+ input_shape = input_ids.size()
+ elif inputs_embeds is not None:
+ input_shape = inputs_embeds.size()[:-1]
+ else:
+ raise ValueError("You have to specify either input_ids or inputs_embeds")
+
+ batch_size, seq_length = input_shape
+ device = input_ids.device if input_ids is not None else inputs_embeds.device
+
+ # past_key_values_length
+ past_key_values_length = past_key_values[0][0].shape[2] if past_key_values is not None else 0
+
+ if attention_mask is None:
+ attention_mask = torch.ones(((batch_size, seq_length + past_key_values_length)), device=device)
+
+ # We can provide a self-attention mask of dimensions [batch_size, from_seq_length, to_seq_length]
+ # ourselves in which case we just need to make it broadcastable to all heads.
+ extended_attention_mask: torch.Tensor = self.get_extended_attention_mask(attention_mask, input_shape)
+
+ # If a 2D or 3D attention mask is provided for the cross-attention
+ # we need to make broadcastable to [batch_size, num_heads, seq_length, seq_length]
+ if self.config.is_decoder and encoder_hidden_states is not None:
+ encoder_batch_size, encoder_sequence_length, _ = encoder_hidden_states.size()
+ encoder_hidden_shape = (encoder_batch_size, encoder_sequence_length)
+ if encoder_attention_mask is None:
+ encoder_attention_mask = torch.ones(encoder_hidden_shape, device=device)
+ encoder_extended_attention_mask = self.invert_attention_mask(encoder_attention_mask)
+ else:
+ encoder_extended_attention_mask = None
+
+ # Prepare head mask if needed
+ # 1.0 in head_mask indicate we keep the head
+ # attention_probs has shape bsz x n_heads x N x N
+ # input head_mask has shape [num_heads] or [num_hidden_layers x num_heads]
+ # and head_mask is converted to shape [num_hidden_layers x batch x num_heads x seq_length x seq_length]
+ head_mask = self.get_head_mask(head_mask, self.config.num_hidden_layers)
+
+ embedding_output = self.embeddings(
+ input_ids=input_ids,
+ position_ids=position_ids,
+ attention_mask=attention_mask,
+ inputs_embeds=inputs_embeds,
+ past_key_values_length=past_key_values_length,
+ )
+ encoder_outputs = self.encoder(
+ embedding_output,
+ attention_mask=extended_attention_mask,
+ head_mask=head_mask,
+ encoder_hidden_states=encoder_hidden_states,
+ encoder_attention_mask=encoder_extended_attention_mask,
+ past_key_values=past_key_values,
+ use_cache=use_cache,
+ output_attentions=output_attentions,
+ output_hidden_states=output_hidden_states,
+ return_dict=return_dict,
+ )
+ sequence_output = encoder_outputs[0]
+ pooled_output = self.pooler(sequence_output) if self.pooler is not None else None
+
+ if not return_dict:
+ return (sequence_output, pooled_output) + encoder_outputs[1:]
+
+ return BaseModelOutputWithPoolingAndCrossAttentions(
+ last_hidden_state=sequence_output,
+ pooler_output=pooled_output,
+ past_key_values=encoder_outputs.past_key_values,
+ hidden_states=encoder_outputs.hidden_states,
+ attentions=encoder_outputs.attentions,
+ cross_attentions=encoder_outputs.cross_attentions,
+ )
+
+ def predict_contacts(self, tokens, attention_mask):
+ attns = self(tokens, attention_mask=attention_mask, return_dict=True, output_attentions=True).attentions
+ attns = torch.stack(attns, dim=1) # Matches the original model layout
+ # In the original model, attentions for padding tokens are completely zeroed out.
+ # This makes no difference most of the time because the other tokens won't attend to them,
+ # but it does for the contact prediction task, which takes attentions as input,
+ # so we have to mimic that here.
+ attns *= attention_mask.unsqueeze(1).unsqueeze(2).unsqueeze(3)
+ attns *= attention_mask.unsqueeze(1).unsqueeze(2).unsqueeze(4)
+ return self.contact_head(tokens, attns)
+
+
+@add_start_docstrings("""ESM Model with a `language modeling` head on top.""", ESM_START_DOCSTRING)
+class EsmForMaskedLM(EsmPreTrainedModel):
+ _tied_weights_keys = ["lm_head.decoder.weight"]
+
+ def __init__(self, config):
+ super().__init__(config)
+
+ if config.is_decoder:
+ logger.warning(
+ "If you want to use `EsmForMaskedLM` make sure `config.is_decoder=False` for "
+ "bi-directional self-attention."
+ )
+
+ self.esm = EsmModel(config, add_pooling_layer=False)
+ self.lm_head = EsmLMHead(config)
+
+ self.init_weights()
+
+ def get_output_embeddings(self):
+ return self.lm_head.decoder
+
+ def set_output_embeddings(self, new_embeddings):
+ self.lm_head.decoder = new_embeddings
+
+ @add_start_docstrings_to_model_forward(ESM_INPUTS_DOCSTRING.format("batch_size, sequence_length"))
+ @add_code_sample_docstrings(
+ checkpoint=_CHECKPOINT_FOR_DOC,
+ output_type=MaskedLMOutput,
+ config_class=_CONFIG_FOR_DOC,
+ mask="",
+ )
+ def forward(
+ self,
+ input_ids: Optional[torch.LongTensor] = None,
+ attention_mask: Optional[torch.Tensor] = None,
+ position_ids: Optional[torch.LongTensor] = None,
+ head_mask: Optional[torch.Tensor] = None,
+ inputs_embeds: Optional[torch.FloatTensor] = None,
+ encoder_hidden_states: Optional[torch.FloatTensor] = None,
+ encoder_attention_mask: Optional[torch.Tensor] = None,
+ labels: Optional[torch.LongTensor] = None,
+ output_attentions: Optional[bool] = None,
+ output_hidden_states: Optional[bool] = None,
+ return_dict: Optional[bool] = None,
+ ) -> Union[Tuple, MaskedLMOutput]:
+ r"""
+ labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
+ Labels for computing the masked language modeling loss. Indices should be in `[-100, 0, ...,
+ config.vocab_size]` (see `input_ids` docstring) Tokens with indices set to `-100` are ignored (masked), the
+ loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`
+ kwargs (`Dict[str, any]`, optional, defaults to *{}*):
+ Used to hide legacy arguments that have been deprecated.
+ """
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
+
+ outputs = self.esm(
+ input_ids,
+ attention_mask=attention_mask,
+ position_ids=position_ids,
+ head_mask=head_mask,
+ inputs_embeds=inputs_embeds,
+ encoder_hidden_states=encoder_hidden_states,
+ encoder_attention_mask=encoder_attention_mask,
+ output_attentions=output_attentions,
+ output_hidden_states=output_hidden_states,
+ return_dict=return_dict,
+ )
+ sequence_output = outputs[0]
+ prediction_scores = self.lm_head(sequence_output)
+
+ masked_lm_loss = None
+ if labels is not None:
+ loss_fct = CrossEntropyLoss(reduction='none')
+
+ labels = labels.to(prediction_scores.device)
+ masked_lm_loss = loss_fct(prediction_scores.view(-1, self.config.vocab_size), labels.view(-1))
+
+ if not return_dict:
+ output = (prediction_scores,) + outputs[2:]
+ return ((masked_lm_loss,) + output) if masked_lm_loss is not None else output
+
+ return MaskedLMOutput(
+ loss=masked_lm_loss,
+ logits=prediction_scores,
+ hidden_states=outputs.hidden_states,
+ attentions=outputs.attentions,
+ )
+
+ def predict_contacts(self, tokens, attention_mask):
+ return self.esm.predict_contacts(tokens, attention_mask=attention_mask)
+
+
+class EsmLMHead(nn.Module):
+ """ESM Head for masked language modeling."""
+
+ def __init__(self, config):
+ super().__init__()
+ self.dense = nn.Linear(config.hidden_size, config.hidden_size)
+ self.layer_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
+
+ self.decoder = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
+ self.bias = nn.Parameter(torch.zeros(config.vocab_size))
+
+ def forward(self, features, **kwargs):
+ x = self.dense(features)
+ x = gelu(x)
+ x = self.layer_norm(x)
+
+ # project back to size of vocabulary with bias
+ x = self.decoder(x) + self.bias
+ return x
+
+
+@add_start_docstrings(
+ """
+ ESM Model transformer with a sequence classification/regression head on top (a linear layer on top of the pooled
+ output) e.g. for GLUE tasks.
+ """,
+ ESM_START_DOCSTRING,
+)
+class EsmForSequenceClassification(EsmPreTrainedModel):
+ def __init__(self, config):
+ super().__init__(config)
+ self.num_labels = config.num_labels
+ self.config = config
+
+ self.esm = EsmModel(config, add_pooling_layer=False)
+ self.classifier = EsmClassificationHead(config)
+
+ self.init_weights()
+
+ @add_start_docstrings_to_model_forward(ESM_INPUTS_DOCSTRING.format("batch_size, sequence_length"))
+ @add_code_sample_docstrings(
+ checkpoint=_CHECKPOINT_FOR_DOC,
+ output_type=SequenceClassifierOutput,
+ config_class=_CONFIG_FOR_DOC,
+ )
+ def forward(
+ self,
+ input_ids: Optional[torch.LongTensor] = None,
+ attention_mask: Optional[torch.Tensor] = None,
+ position_ids: Optional[torch.LongTensor] = None,
+ head_mask: Optional[torch.Tensor] = None,
+ inputs_embeds: Optional[torch.FloatTensor] = None,
+ labels: Optional[torch.LongTensor] = None,
+ output_attentions: Optional[bool] = None,
+ output_hidden_states: Optional[bool] = None,
+ return_dict: Optional[bool] = None,
+ ) -> Union[Tuple, SequenceClassifierOutput]:
+ r"""
+ labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
+ Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,
+ config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
+ `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
+ """
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
+
+ outputs = self.esm(
+ input_ids,
+ attention_mask=attention_mask,
+ position_ids=position_ids,
+ head_mask=head_mask,
+ inputs_embeds=inputs_embeds,
+ output_attentions=output_attentions,
+ output_hidden_states=output_hidden_states,
+ return_dict=return_dict,
+ )
+ sequence_output = outputs[0]
+ logits = self.classifier(sequence_output)
+
+ loss = None
+ if labels is not None:
+ labels = labels.to(logits.device)
+
+ if self.config.problem_type is None:
+ if self.num_labels == 1:
+ self.config.problem_type = "regression"
+ elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int):
+ self.config.problem_type = "single_label_classification"
+ else:
+ self.config.problem_type = "multi_label_classification"
+
+ if self.config.problem_type == "regression":
+ loss_fct = MSELoss()
+ if self.num_labels == 1:
+ loss = loss_fct(logits.squeeze(), labels.squeeze())
+ else:
+ loss = loss_fct(logits, labels)
+ elif self.config.problem_type == "single_label_classification":
+ loss_fct = CrossEntropyLoss()
+ loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1))
+ elif self.config.problem_type == "multi_label_classification":
+ loss_fct = BCEWithLogitsLoss()
+ loss = loss_fct(logits, labels)
+
+ if not return_dict:
+ output = (logits,) + outputs[2:]
+ return ((loss,) + output) if loss is not None else output
+
+ return SequenceClassifierOutput(
+ loss=loss,
+ logits=logits,
+ hidden_states=outputs.hidden_states,
+ attentions=outputs.attentions,
+ )
+
+
+@add_start_docstrings(
+ """
+ ESM Model with a token classification head on top (a linear layer on top of the hidden-states output) e.g. for
+ Named-Entity-Recognition (NER) tasks.
+ """,
+ ESM_START_DOCSTRING,
+)
+class EsmForTokenClassification(EsmPreTrainedModel):
+ def __init__(self, config):
+ super().__init__(config)
+ self.num_labels = config.num_labels
+
+ self.esm = EsmModel(config, add_pooling_layer=False)
+ self.dropout = nn.Dropout(config.hidden_dropout_prob)
+ self.classifier = nn.Linear(config.hidden_size, config.num_labels)
+
+ self.init_weights()
+
+ @add_start_docstrings_to_model_forward(ESM_INPUTS_DOCSTRING.format("batch_size, sequence_length"))
+ @add_code_sample_docstrings(
+ checkpoint=_CHECKPOINT_FOR_DOC,
+ output_type=TokenClassifierOutput,
+ config_class=_CONFIG_FOR_DOC,
+ )
+ def forward(
+ self,
+ input_ids: Optional[torch.LongTensor] = None,
+ attention_mask: Optional[torch.Tensor] = None,
+ position_ids: Optional[torch.LongTensor] = None,
+ head_mask: Optional[torch.Tensor] = None,
+ inputs_embeds: Optional[torch.FloatTensor] = None,
+ labels: Optional[torch.LongTensor] = None,
+ output_attentions: Optional[bool] = None,
+ output_hidden_states: Optional[bool] = None,
+ return_dict: Optional[bool] = None,
+ ) -> Union[Tuple, TokenClassifierOutput]:
+ r"""
+ labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
+ Labels for computing the token classification loss. Indices should be in `[0, ..., config.num_labels - 1]`.
+ """
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
+
+ outputs = self.esm(
+ input_ids,
+ attention_mask=attention_mask,
+ position_ids=position_ids,
+ head_mask=head_mask,
+ inputs_embeds=inputs_embeds,
+ output_attentions=output_attentions,
+ output_hidden_states=output_hidden_states,
+ return_dict=return_dict,
+ )
+ attention_mask = attention_mask.to()
+ sequence_output = outputs[0]
+
+ sequence_output = self.dropout(sequence_output)
+ logits = self.classifier(sequence_output)
+
+ loss = None
+ if labels is not None:
+ loss_fct = CrossEntropyLoss()
+
+ labels = labels.to(logits.device)
+ loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1))
+
+ if not return_dict:
+ output = (logits,) + outputs[2:]
+ return ((loss,) + output) if loss is not None else output
+
+ return TokenClassifierOutput(
+ loss=loss,
+ logits=logits,
+ hidden_states=outputs.hidden_states,
+ attentions=outputs.attentions,
+ )
+
+
+class EsmClassificationHead(nn.Module):
+ """Head for sentence-level classification tasks."""
+
+ def __init__(self, config):
+ super().__init__()
+ self.dense = nn.Linear(config.hidden_size, config.hidden_size)
+ self.dropout = nn.Dropout(config.hidden_dropout_prob)
+ self.out_proj = nn.Linear(config.hidden_size, config.num_labels)
+
+ def forward(self, features, **kwargs):
+ x = features[:, 0, :] # take token (equiv. to [CLS])
+ x = self.dropout(x)
+ x = self.dense(x)
+ x = torch.tanh(x)
+ x = self.dropout(x)
+ x = self.out_proj(x)
+ return x
+
+class EsmForMutationDesign(EsmPreTrainedModel):
+ def __init__(self, config):
+ config.add_cross_attention = True
+ config.adapter_freq = 3
+ super().__init__(config)
+
+ self.esm = EsmModel(config, add_pooling_layer=False)
+ self.dropout = nn.Dropout(config.hidden_dropout_prob)
+ self.mutation_classifier = nn.Linear(config.hidden_size, 2)
+ self.lm_head = EsmLMHead(config)
+
+ self.init_weights()
+
+ def forward(
+ self,
+ input_ids: Optional[torch.LongTensor] = None,
+ attention_mask: Optional[torch.Tensor] = None,
+ position_ids: Optional[torch.LongTensor] = None,
+ head_mask: Optional[torch.Tensor] = None,
+ inputs_embeds: Optional[torch.FloatTensor] = None,
+ mutation_position: Optional[torch.LongTensor] = None,
+ mutation_aa: Optional[torch.LongTensor] = None,
+ batch_idx: Optional[torch.LongTensor] = None,
+ encoder_hidden_states: Optional[torch.FloatTensor] = None,
+ encoder_attention_mask: Optional[torch.LongTensor] = None,
+ output_attentions: Optional[bool] = None,
+ output_hidden_states: Optional[bool] = None,
+ return_dict: Optional[bool] = None,
+ ) -> Union[Tuple, ModelOutput]:
+ r"""
+ labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
+ Labels for computing the token classification loss. Indices should be in `[0, ..., config.num_labels - 1]`.
+ """
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
+
+ outputs = self.esm(
+ input_ids,
+ attention_mask=attention_mask,
+ position_ids=position_ids,
+ head_mask=head_mask,
+ inputs_embeds=inputs_embeds,
+ output_attentions=output_attentions,
+ output_hidden_states=output_hidden_states,
+ encoder_hidden_states=encoder_hidden_states,
+ encoder_attention_mask=encoder_attention_mask,
+ return_dict=return_dict,
+ )
+ sequence_output = outputs[0]
+ sequence_output = self.dropout(sequence_output)
+ mutation_pos_logits = self.mutation_classifier(sequence_output)
+ # extended_attention_mask = (1.0 - attention_mask) * torch.finfo(sequence_output.dtype).min
+ # mutation_pos_logits += extended_attention_mask
+
+ extended_mutation_position = batch_idx * sequence_output.shape[1] + mutation_position
+ mutation_aa_logits = self.lm_head(sequence_output.view(-1, sequence_output.shape[2])[extended_mutation_position])
+
+ # mutation_position_label = torch.eye(input_ids.shape[1], dtype=torch.long).to(input_ids.device)[mutation_position] - 100 * (1 - attention_mask)
+ mutation_position_label = torch.zeros(input_ids.shape, dtype=torch.long).to(input_ids.device)
+ mutation_position_label[batch_idx, mutation_position] = 1
+ mutation_position_label -= 100 * (1 - attention_mask)
+
+ loss_fct_pos = CrossEntropyLoss(weight=torch.tensor([1.0, 50.0]).to(input_ids.device))
+ loss_fct_aa = CrossEntropyLoss()
+ loss_pos = loss_fct_pos(mutation_pos_logits.view(-1, 2), mutation_position_label.view(-1))
+ loss_aa = loss_fct_aa(mutation_aa_logits.view(-1, self.config.vocab_size), mutation_aa.view(-1))
+
+ if not return_dict:
+ output = (mutation_pos_logits, mutation_aa_logits,) + outputs[2:]
+ return ((loss_pos, loss_aa) + output)
+
+ return ModelOutput(
+ loss_pos=loss_pos,
+ loss_aa=loss_aa,
+ logits_pos=mutation_pos_logits,
+ logits_aa=mutation_aa_logits,
+ hidden_states=outputs.hidden_states,
+ attentions=outputs.attentions,
+ )
+
+ @torch.no_grad()
+ def lm_design(self, input_ids, attention_mask, encoder_hidden_states, encoder_attention_mask):
+ outputs = self.esm(
+ input_ids,
+ attention_mask=attention_mask,
+ encoder_hidden_states=encoder_hidden_states,
+ encoder_attention_mask=encoder_attention_mask,
+ return_dict=True
+ )
+ sequence_output = outputs[0]
+ mutation_pos_prob = F.softmax(self.mutation_classifier(sequence_output) / 0.5, dim=-1)[:, :, 1] * attention_mask
+ mutation_pos_prob[:, 0] = 0
+ mutation_pos_prob[input_ids == 2] = 0
+ mutation_aa_prob = F.softmax(self.lm_head(sequence_output) / 0.5, dim=-1)
+ i = torch.arange(mutation_aa_prob.shape[0]).unsqueeze(1).expand(mutation_aa_prob.shape[:-1])
+ j = torch.arange(mutation_aa_prob.shape[1]).unsqueeze(0).expand(mutation_aa_prob.shape[:-1])
+ mutation_aa_prob[i, j, input_ids] = 0
+ mutation_prob = mutation_pos_prob.unsqueeze(2) * mutation_aa_prob
+
+ return mutation_prob
+
+
+def create_position_ids_from_input_ids(input_ids, padding_idx, past_key_values_length=0):
+ """
+ Replace non-padding symbols with their position numbers. Position numbers begin at padding_idx+1. Padding symbols
+ are ignored. This is modified from fairseq's `utils.make_positions`.
+
+ Args:
+ x: torch.Tensor x:
+
+ Returns: torch.Tensor
+ """
+ # The series of casts and type-conversions here are carefully balanced to both work with ONNX export and XLA.
+ mask = input_ids.ne(padding_idx).int()
+ incremental_indices = (torch.cumsum(mask, dim=1).type_as(mask) + past_key_values_length) * mask
+ return incremental_indices.long() + padding_idx
\ No newline at end of file
diff --git a/open_biomed/models/protein/mutaplm/mutaplm.py b/open_biomed/models/protein/mutaplm/mutaplm.py
new file mode 100644
index 0000000000000000000000000000000000000000..9ae601b8b0d450ade0843af1caf3ed8d9e6f4060
--- /dev/null
+++ b/open_biomed/models/protein/mutaplm/mutaplm.py
@@ -0,0 +1,545 @@
+import contextlib
+from typing import Any, Dict, List, Optional, Tuple
+
+import logging
+import torch
+import torch.nn as nn
+
+from huggingface_hub import snapshot_download
+import os
+from transformers import PreTrainedTokenizer, LlamaTokenizer, LlamaConfig, LlamaForCausalLM, EsmTokenizer, DataCollatorWithPadding
+from peft import get_peft_model, LoraConfig, TaskType
+
+from open_biomed.data import Protein, Text
+from open_biomed.models.task_models.mutation_text_translation import MutationExplanationModel, MutationEngineeringModel
+from open_biomed.models.protein.mutaplm.modeling_esm import EsmForMutationDesign
+from open_biomed.utils.collator import Collator, ClassLabelCollator, EnsembleCollator, ListCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import Featurizer, Featurized
+
+class MutaPLMExplanationFeaturizer(Featurizer):
+ def __init__(self,
+ protein_tokenizer: PreTrainedTokenizer,
+ text_tokenizer: PreTrainedTokenizer,
+ max_length_func: int=512,
+ max_length_protein: int=1024,
+ max_length_label: int=256,
+ stage2_prompt: str="",
+ ) -> None:
+ super().__init__()
+ self.protein_tokenizer = protein_tokenizer
+ self.text_tokenizer = text_tokenizer
+ self.max_length_func = max_length_func
+ self.max_length_protein = max_length_protein
+ self.max_length_label = max_length_label
+ self.stage2_prompt = stage2_prompt
+
+ def __call__(self, protein: Protein, mutation: str, label: Optional[Text]=None, function: Optional[Text]=None) -> Dict[str, Any]:
+ pos = int(mutation[1:-1])
+ wild_type = protein.sequence
+ mutant = wild_type[:pos - 1] + mutation[-1] + wild_type[pos:]
+ featurized = {}
+ featurized["wild_type"] = self.protein_tokenizer(
+ wild_type,
+ max_length=self.max_length_protein,
+ truncation=True,
+ add_special_tokens=True,
+ )
+ featurized["mutant"] = self.protein_tokenizer(
+ mutant,
+ max_length=self.max_length_protein,
+ truncation=True,
+ add_special_tokens=True,
+ )
+ featurized["stage2_prompt"] = self.text_tokenizer(
+ self.stage2_prompt.format(mutation[0], mutation[-1], mutation[1:-1]),
+ max_length=self.max_length_label,
+ truncation=True,
+ add_special_tokens=False,
+ )
+ if label is not None:
+ featurized["label"] = self.text_tokenizer(
+ label.str,
+ max_length=self.max_length_label,
+ truncation=True,
+ add_special_tokens=False,
+ )
+ if function is not None:
+ featurized["gt_function"] = self.text_tokenizer(
+ function.str,
+ max_length=self.max_length_func,
+ truncation=True,
+ add_special_tokens=False,
+ )
+
+ return featurized
+
+ def get_attrs(self) -> List[str]:
+ return ["wild_type", "mutant", "stage2_prompt", "label", "gt_function"]
+
+class MutaPLMEngineeringFeaturizer(Featurizer):
+ def __init__(self,
+ protein_tokenizer: PreTrainedTokenizer,
+ text_tokenizer: PreTrainedTokenizer,
+ max_length_func: int=512,
+ max_length_protein: int=1024,
+ max_length_prompt: int=256,
+ ) -> None:
+ super().__init__()
+ self.protein_tokenizer = protein_tokenizer
+ self.text_tokenizer = text_tokenizer
+ self.max_length_func = max_length_func
+ self.max_length_protein = max_length_protein
+ self.max_length_prompt = max_length_prompt
+
+ def __call__(self, protein: Protein, text: Text, label: Optional[str]=None, function: Optional[Text]=None) -> Dict[str, Any]:
+ featurized = {}
+ featurized["wild_type"] = self.protein_tokenizer(
+ protein.sequence,
+ max_length=self.max_length_protein,
+ truncation=True,
+ add_special_tokens=True,
+ )
+ featurized["prompt"] = self.text_tokenizer(
+ text.str,
+ max_length=self.max_length_prompt,
+ truncation=True,
+ add_special_tokens=False,
+ )
+ if label is not None:
+ featurized["label"] = {
+ "pos": torch.LongTensor(int(label[1:-1]) - 1),
+ "aa": self.protein_tokenizer(label[-1], return_tensors='pt').input_ids,
+ }
+ if function is not None:
+ featurized["gt_function"] = self.text_tokenizer(
+ function.str,
+ max_length=self.max_length_func,
+ truncation=True,
+ add_special_tokens=False,
+ )
+
+ return featurized
+
+ def get_attrs(self) -> List[str]:
+ return ["wild_type", "prompt", "label", "gt_function"]
+
+class MutaPLM(MutationExplanationModel, MutationEngineeringModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super(MutaPLM, self).__init__(model_cfg)
+
+ # load esm
+ logging.info("*** loading protein model...")
+ if not os.path.exists(model_cfg.protein_model):
+ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
+ logging.info("Repo not found. Try downloading from snapshot")
+ snapshot_download(repo_id="facebook/esm2_t33_650M_UR50D", local_dir=model_cfg.hf_model_name_or_path, force_download=True)
+ self.protein_model = EsmForMutationDesign.from_pretrained(model_cfg.protein_model, torch_dtype=torch.bfloat16) # delta decoder is here
+ self.protein_tokenizer = EsmTokenizer.from_pretrained(model_cfg.protein_model)
+
+ # load llm
+ logging.info("*** loading llm tokenizer...")
+ if not os.path.exists(model_cfg.protein_model):
+ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
+ logging.info("Repo not found. Try downloading from snapshot")
+ snapshot_download(repo_id="PharMolix/BioMedGPT-LM-7B", local_dir=model_cfg.hf_model_name_or_path, force_download=True)
+ self.llm_tokenizer = LlamaTokenizer.from_pretrained(model_cfg.llama_ckpt, truncation_side="left")
+ self.llm_tokenizer.add_special_tokens({'pad_token': '[PAD]'})
+ self.llm_tokenizer.add_special_tokens({'bos_token': ''})
+ self.llm_tokenizer.add_special_tokens({'eos_token': ''})
+ self.llm_tokenizer.add_special_tokens({'unk_token': ''})
+ logging.info(f"*** loading llm from {model_cfg.llama_ckpt}...")
+ llm_cfg = LlamaConfig.from_pretrained(model_cfg.llama_ckpt)
+ self.llm = LlamaForCausalLM(llm_cfg)
+ self.llm.resize_token_embeddings(len(self.llm_tokenizer))
+
+ # add lora
+ logging.info("*** adding LoRA...")
+ lora_config = LoraConfig(
+ peft_type=TaskType.CAUSAL_LM,
+ inference_mode=True,
+ r=16, lora_alpha=16,
+ lora_dropout=0.05,
+ target_modules=["v_proj", "k_proj", "o_proj", "gate_proj", "down_proj", "up_proj"],
+ )
+ self.llm = get_peft_model(self.llm, lora_config)
+ self.llm.print_trainable_parameters()
+
+ # delta encoder and decoder
+ logging.info("*** building delta network...")
+ self.query_protein1 = nn.Parameter(
+ torch.zeros(1, model_cfg.num_query_tokens_protein1, self.protein_model.config.hidden_size)
+ )
+ nn.init.normal_(self.query_protein1, 0, 0.02)
+ self.query_protein2 = nn.Parameter(
+ torch.zeros(1, model_cfg.num_query_tokens_protein2, self.protein_model.config.hidden_size)
+ )
+ nn.init.normal_(self.query_protein2, 0, 0.02)
+ self.pooler_protein1 = nn.MultiheadAttention(
+ embed_dim=self.protein_model.config.hidden_size,
+ num_heads=model_cfg.ca_num_head,
+ batch_first=True
+ )
+ self.pooler_protein2 = nn.MultiheadAttention(
+ embed_dim=self.protein_model.config.hidden_size,
+ num_heads=model_cfg.ca_num_head,
+ batch_first=True
+ )
+
+ self.bop_embeds = nn.Parameter(torch.zeros(1, 1, self.llm.config.hidden_size))
+ self.eop_embeds = nn.Parameter(torch.zeros(1, 1, self.llm.config.hidden_size))
+ self.bom_embeds = nn.Parameter(torch.zeros(1, 1, self.llm.config.hidden_size))
+ self.eom_embeds = nn.Parameter(torch.zeros(1, 1, self.llm.config.hidden_size))
+ self.soft_tokens = nn.Parameter(torch.zeros(1, model_cfg.num_query_tokens_protein2, self.llm.config.hidden_size))
+ nn.init.normal_(self.bop_embeds, 0, 0.02)
+ nn.init.normal_(self.eop_embeds, 0, 0.02)
+ nn.init.normal_(self.bom_embeds, 0, 0.02)
+ nn.init.normal_(self.eom_embeds, 0, 0.02)
+ nn.init.normal_(self.soft_tokens, 0, 0.02)
+
+ # build proj
+ self.proj_protein1 = nn.Linear(self.protein_model.config.hidden_size, self.llm.config.hidden_size)
+ self.proj_protein2 = nn.Linear(self.protein_model.config.hidden_size, self.llm.config.hidden_size)
+ self.proj_text = nn.Linear(self.llm.config.hidden_size, self.protein_model.config.hidden_size)
+
+ for parent in reversed(type(self).__mro__[1:-1]):
+ if hasattr(parent, '_add_task'):
+ parent._add_task(self)
+
+ def load_ckpt(self, state_dict: Dict[str, torch.Tensor]) -> None:
+ self.load_state_dict(state_dict["model"])
+
+ def featurizer_mutation_explanation(self) -> Tuple[Featurizer, Collator]:
+ return MutaPLMExplanationFeaturizer(
+ self.protein_tokenizer,
+ self.llm_tokenizer,
+ self.config.func_maxlen,
+ self.config.protein_maxlen,
+ self.config.text_maxlen,
+ self.config.stage2_prompt,
+ ), EnsembleCollator({
+ "wild_type": DataCollatorWithPadding(self.protein_tokenizer, padding=True),
+ "mutant": DataCollatorWithPadding(self.protein_tokenizer, padding=True),
+ "label": ListCollator(),
+ "gt_function": DataCollatorWithPadding(self.llm_tokenizer, padding=False),
+ "stage2_prompt": DataCollatorWithPadding(self.llm_tokenizer, padding=False),
+ })
+
+ def featurizer_mutation_engineering(self) -> Tuple[Featurizer, Collator]:
+ return MutaPLMEngineeringFeaturizer(
+ self.protein_tokenizer,
+ self.llm_tokenizer,
+ self.config.func_maxlen,
+ self.config.protein_maxlen,
+ self.config.text_maxlen,
+ ), EnsembleCollator({
+ "wild_type": DataCollatorWithPadding(self.protein_tokenizer, padding=True),
+ "prompt": DataCollatorWithPadding(self.llm_tokenizer, padding=False),
+ "label": EnsembleCollator({
+ "pos": ClassLabelCollator(),
+ "aa": ClassLabelCollator(),
+ }),
+ "gt_function": DataCollatorWithPadding(self.llm_tokenizer, padding=False),
+ })
+
+ def maybe_autocast(self, device="cuda:0", dtype=torch.bfloat16):
+ # if on cpu, don't use autocast
+ # if on gpu, use autocast with dtype if provided, otherwise use torch.float16
+ enable_autocast = device != torch.device("cpu")
+
+ if enable_autocast:
+ return torch.cuda.amp.autocast(dtype=dtype)
+ else:
+ return contextlib.nullcontext()
+
+
+ def _encode_protein(self, protein1: Featurized[Protein], protein2: Optional[Featurized[Protein]]):
+ batch_size = protein1.input_ids.shape[0]
+ device = protein1.input_ids.device
+
+ with self.maybe_autocast(device):
+ p_feature1_in = self.protein_model.esm(**protein1) # last_hidden_states: [bs, prot_len, esm_hidden_size]
+ query_protein1 = self.query_protein1.expand(batch_size, -1, -1)
+ attn_mask_1 = (1 - protein1.attention_mask.repeat(self.config.ca_num_head, 1).unsqueeze(1).expand(-1, self.config.num_query_tokens_protein1, -1)).to(bool)
+ p_feature1 = self.pooler_protein1(
+ query_protein1,
+ p_feature1_in[0],
+ p_feature1_in[0],
+ attn_mask = attn_mask_1
+ )
+ protein1_embeds = self.proj_protein1(p_feature1[0])
+
+ if protein2 is not None:
+ p_feature2_in = self.protein_model.esm(**protein2)
+ query_protein2 = self.query_protein2.expand(batch_size, -1, -1)
+ attn_mask_2 = (1 - protein2.attention_mask.repeat(self.config.ca_num_head, 1).unsqueeze(1).expand(-1, self.config.num_query_tokens_protein2, -1)).to(bool)
+ delta_feature = p_feature2_in[0] - p_feature1_in[0]
+ p_feature2 = self.pooler_protein2(
+ query_protein2,
+ delta_feature,
+ delta_feature,
+ attn_mask = attn_mask_2
+ )
+ protein2_embeds = self.proj_protein2(p_feature2[0])
+
+ if protein2 is not None:
+ return protein1_embeds, protein2_embeds
+ else:
+ return protein1_embeds
+
+
+ def add_padding(self, wrapped_embeds: torch.Tensor, wrapped_attention_mask: torch.Tensor=None, targets: torch.Tensor=None, regress_ids: torch.Tensor=None, padding: str="right"):
+ assert (targets is None) or (regress_ids is None)
+ batch_size = len(wrapped_embeds)
+ max_length_batch = max([x.shape[1] for x in wrapped_embeds])
+ for i in range(batch_size):
+ pad_len = max_length_batch - wrapped_embeds[i].shape[1]
+ if padding == "right":
+ wrapped_embeds[i] = torch.cat((
+ wrapped_embeds[i],
+ torch.zeros((1, pad_len, wrapped_embeds[i].shape[2]), dtype=wrapped_embeds[i].dtype).to(wrapped_embeds[i].device)
+ ), dim=1)
+ if wrapped_attention_mask:
+ wrapped_attention_mask[i] = torch.cat((
+ wrapped_attention_mask[i],
+ torch.zeros((1, pad_len), dtype=wrapped_attention_mask[i].dtype).to(wrapped_attention_mask[i].device)
+ ), dim=1)
+ if targets:
+ targets[i] = torch.cat((
+ targets[i],
+ torch.ones((1, pad_len), dtype=targets[i].dtype).to(targets[i].device).fill_(-100)
+ ), dim=1)
+ if regress_ids:
+ regress_ids[i] = torch.cat((
+ regress_ids[i],
+ torch.zeros((pad_len), dtype=regress_ids[i].dtype).to(regress_ids[i].device)
+ ), dim=0)
+ else:
+ wrapped_embeds[i] = torch.cat((
+ torch.zeros((1, pad_len, wrapped_embeds[i].shape[2]), dtype=wrapped_embeds[i].dtype).to(wrapped_embeds[i].device),
+ wrapped_embeds[i],
+ ), dim=1)
+ if wrapped_attention_mask:
+ wrapped_attention_mask[i] = torch.cat((
+ torch.zeros((1, pad_len), dtype=wrapped_attention_mask[i].dtype).to(wrapped_attention_mask[i].device),
+ wrapped_attention_mask[i],
+ ), dim=1)
+ if targets:
+ targets[i] = torch.cat((
+ torch.ones((1, pad_len), dtype=targets[i].dtype).to(targets[i].device).fill_(-100),
+ targets[i],
+ ), dim=1)
+ if regress_ids:
+ regress_ids[i] = torch.cat((
+ torch.zeros((pad_len), dtype=regress_ids[i].dtype).to(regress_ids[i].device),
+ regress_ids[i]
+ ), dim=0)
+
+ if targets:
+ return torch.cat(wrapped_embeds, dim=0), torch.cat(wrapped_attention_mask, dim=0), torch.cat(targets, dim=0)
+ if regress_ids:
+ return torch.cat(wrapped_embeds, dim=0), torch.cat(wrapped_attention_mask, dim=0), torch.stack(regress_ids, dim=0)
+ if wrapped_attention_mask is None:
+ return torch.cat(wrapped_embeds, dim=0)
+ else:
+ return torch.cat(wrapped_embeds, dim=0), torch.cat(wrapped_attention_mask, dim=0)
+
+ def _wrapped_sentence_inference(
+ self,
+ protein1_embeds: torch.Tensor=None,
+ protein2_embeds: Optional[torch.Tensor]=None,
+ stage2_prompt: Featurized[Text]=None,
+ predicted_function: Optional[Featurized[Text]]=None,
+ mutation_description: Optional[Featurized[Text]]=None,
+ ):
+ batch_size = protein1_embeds.shape[0]
+ device = protein1_embeds.device
+ input_emb = self.llm.get_input_embeddings()
+ bos_tokens = self.llm_tokenizer('', return_tensors='pt', add_special_tokens=False).to(device).input_ids
+ bos_embeds = input_emb(bos_tokens) # [1, 1, 4096]
+ sys_prompt_tokens = self.llm_tokenizer(
+ self.config.system_prompt,
+ max_length=self.config.func_maxlen,
+ padding=False,
+ truncation=True,
+ return_tensors='pt',
+ add_special_tokens=False,
+ ).to(device).input_ids
+ sys_embeds = input_emb(sys_prompt_tokens)
+ if predicted_function is None: # CoT stage 1
+ sys_embeds = sys_embeds.expand(batch_size, -1, -1)
+ bos_embeds = bos_embeds.expand(batch_size, -1, -1)
+ bop_embeds = self.bop_embeds.expand(batch_size, -1, -1)
+ eop_embeds = self.eop_embeds.expand(batch_size, -1, -1)
+ bom_embeds = self.bom_embeds.expand(batch_size, -1, -1)
+ eom_embeds = self.eom_embeds.expand(batch_size, -1, -1)
+ wrapped_embeds = torch.cat([bos_embeds, sys_embeds, bop_embeds, protein1_embeds, eop_embeds], dim=1)
+ attention_mask = torch.ones((batch_size, wrapped_embeds.shape[1]), dtype=torch.long, device=device)
+ return wrapped_embeds, attention_mask
+
+ else: # CoT stage 2
+ bop_embeds = self.bop_embeds.to(device)
+ eop_embeds = self.eop_embeds.to(device)
+ bom_embeds = self.bom_embeds.to(device)
+ eom_embeds = self.eom_embeds.to(device)
+ batched_embeds, batched_attn_mask = [], []
+ if mutation_description is not None:
+ batched_regress_ids = []
+ for i in range(batch_size):
+ function_tokens = predicted_function[i]
+ func_embeds = input_emb(function_tokens)
+
+ if mutation_description is not None:
+ mut_eff_embeds = input_emb(mutation_description.input_ids[i])
+ soft_embeds = self.soft_tokens.to(device)
+ regress_start_id = sys_embeds.shape[1] + self.config.num_query_tokens_protein1 + 4 + func_embeds.shape[0] + mut_eff_embeds.shape[0]
+ wrapped_embeds = torch.cat([
+ bos_embeds, sys_embeds, bop_embeds, protein1_embeds[i].unsqueeze(0), eop_embeds,
+ func_embeds.unsqueeze(0), mut_eff_embeds.unsqueeze(0),
+ bom_embeds, soft_embeds
+ ], dim=1)
+ regress_ids = torch.cat([
+ torch.zeros(regress_start_id, dtype=torch.long, device=device),
+ torch.ones(self.config.num_query_tokens_protein2, dtype=torch.long, device=device),
+ ], dim=0).bool()
+ batched_regress_ids.append(regress_ids)
+ else:
+ mutation_tokens = stage2_prompt.input_ids[i]
+ muta_embeds = input_emb(mutation_tokens)
+ wrapped_embeds = torch.cat([
+ bos_embeds, sys_embeds, bop_embeds, protein1_embeds[i].unsqueeze(0), eop_embeds,
+ func_embeds.unsqueeze(0), muta_embeds.unsqueeze(0),
+ bom_embeds, protein2_embeds[i].unsqueeze(0), eom_embeds,
+ ], dim=1)
+ wrapped_attn_mask = torch.ones((1, wrapped_embeds.shape[1]), dtype=torch.long, device=device)
+ batched_embeds.append(wrapped_embeds)
+ batched_attn_mask.append(wrapped_attn_mask)
+
+ if mutation_description is None:
+ batched_embeds, batched_attn_mask = self.add_padding(
+ batched_embeds, batched_attn_mask, targets=None, regress_ids=None, padding="left")
+ return batched_embeds, batched_attn_mask
+ else:
+ batched_embeds, batched_attn_mask, batched_regress_ids = self.add_padding(
+ batched_embeds, batched_attn_mask, targets=None, regress_ids=batched_regress_ids, padding="left")
+ return batched_embeds, batched_attn_mask, batched_regress_ids
+
+ def forward_mutation_explanation(self, wild_type: Featurized[Protein], mutant: Featurized[Any], label: Featurized[Text], **kwargs) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError("Training MutaPLM is currently unavailable! Please see https://github.com/PharMolix/MutaPLM for training or use MutaPLM-mini-M2T instead.")
+
+ @torch.no_grad()
+ def predict_mutation_explanation(self,
+ wild_type: Featurized[Protein],
+ mutant: Featurized[Any],
+ stage2_prompt: Featurized[Text],
+ gt_function: Optional[Featurized[Text]]=None,
+ **kwargs
+ ) -> List[Text]:
+ device = wild_type.input_ids.device
+ with self.maybe_autocast(device):
+ protein1_embeds, protein2_embeds = self._encode_protein(wild_type, mutant)
+ if gt_function is None:
+ # stage 1
+ input_embeds, attn_mask = self._wrapped_sentence_inference(protein1_embeds, protein2_embeds)
+ outputs_function = self.llm.generate(
+ inputs_embeds=input_embeds,
+ attention_mask=attn_mask,
+ eos_token_id=self.llm_tokenizer.eos_token_id,
+ pad_token_id=self.llm_tokenizer.pad_token_id,
+ **self.config.text_generation.todict(),
+ )
+ outputs_function[outputs_function == 0] = 2 # convert output id 0 to 2 (eos_token_id)
+ outputs_function = self.llm_tokenizer.batch_decode(outputs_function)
+ logging.info(f"Predicted function: {outputs_function}")
+ outputs_function = self.llm_tokenizer(
+ outputs_function,
+ max_length=self.config.func_maxlen,
+ padding=False,
+ truncation=True,
+ return_tensors='pt',
+ add_special_tokens=False,
+ ).to(device)
+ else:
+ outputs_function = gt_function
+ # stage 2
+ input_embeds, attn_mask = self._wrapped_sentence_inference(protein1_embeds, protein2_embeds, stage2_prompt, predicted_function=outputs_function.input_ids)
+ outputs_effect = self.llm.generate(
+ inputs_embeds=input_embeds,
+ attention_mask=attn_mask,
+ eos_token_id=self.llm_tokenizer.eos_token_id,
+ pad_token_id=self.llm_tokenizer.pad_token_id,
+ **self.config.text_generation.todict(),
+ max_new_tokens=512
+ )
+ outputs_effect[outputs_effect == 0] = 2 # convert output id 0 to 2 (eos_token_id)
+ output_effect_text = self.llm_tokenizer.batch_decode(outputs_effect, skip_special_tokens=True)
+ output_effect_text = [text.strip() for text in output_effect_text]
+ return output_effect_text
+
+ def forward_mutation_engineering(self, wild_type: Featurized[Protein], prompt: Featurized[Text], label: Featurized[Any], **kwargs) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError("Training MutaPLM is currently unavailable! Please see https://github.com/PharMolix/MutaPLM for training or use MutaPLM-mini-T2M instead.")
+
+ @torch.no_grad()
+ def predict_mutation_engineering(self,
+ wild_type: Featurized[Protein],
+ prompt: Featurized[Text],
+ position: Optional[torch.LongTensor]=None,
+ gt_function: Optional[Featurized[Text]]=None,
+ **kwargs
+ ) -> List[List[str]]:
+ device = wild_type.input_ids.device
+ with self.maybe_autocast(device):
+ protein_embeds = self._encode_protein(wild_type, None)
+ if gt_function is None:
+ # stage 1
+ input_embeds, attn_mask = self._wrapped_sentence_inference(protein1_embeds=protein_embeds)
+ outputs_function = self.llm.generate(
+ inputs_embeds=input_embeds,
+ attention_mask=attn_mask,
+ eos_token_id=self.llm_tokenizer.eos_token_id,
+ pad_token_id=self.llm_tokenizer.pad_token_id,
+ **self.config.text_generation.todict(),
+ )
+ outputs_function[outputs_function == 0] = 2 # convert output id 0 to 2 (eos_token_id)
+ outputs_function = self.llm_tokenizer.batch_decode(outputs_function)
+ logging.info(f"Predicted function: {outputs_function}")
+ outputs_function = self.llm_tokenizer(
+ outputs_function,
+ max_length=self.config.func_maxlen,
+ padding=False,
+ truncation=True,
+ return_tensors='pt',
+ add_special_tokens=False,
+ ).to(device)
+ else:
+ outputs_function = gt_function
+
+ # stage 2
+ input_embeds, attn_mask, soft_ids = self._wrapped_sentence_inference(protein1_embeds=protein_embeds, predicted_function=outputs_function.input_ids, mutation_description=prompt)
+ soft_output = self.llm.model(
+ inputs_embeds=input_embeds,
+ attention_mask=attn_mask,
+ output_hidden_states=True,
+ return_dict=True
+ ).hidden_states[-1]
+ soft_output = soft_output[soft_ids].contiguous()
+ soft_output = self.proj_text(soft_output.view(wild_type.input_ids.shape[0], self.config.num_query_tokens_protein2, -1))
+ scores = self.protein_model.lm_design(
+ input_ids=wild_type.input_ids,
+ attention_mask=wild_type.attention_mask,
+ encoder_hidden_states=soft_output,
+ encoder_attention_mask=torch.ones(soft_output.shape[:-1], dtype=torch.long).to(device)
+ )
+ outputs = []
+ for i in range(scores.shape[0]):
+ if position is None:
+ top50 = scores[i].flatten().topk(50).indices
+ pred_pos = top50 // len(self.protein_tokenizer)
+ pred_aa = top50 % len(self.protein_tokenizer)
+ else:
+ pred_pos = position[i].repeat(len(self.protein_tokenizer))
+ pred_aa = scores[i][position[i]].sort(descending=True).indices
+ wt_aa = self.protein_tokenizer.batch_decode(wild_type.input_ids[i][pred_pos])
+ pred_aa = self.protein_tokenizer.batch_decode(pred_aa)
+ outputs.append([f"{wt_aa[j]}{pred_pos[j]}{pred_aa[j]}" for j in range(50)])
+ return outputs
\ No newline at end of file
diff --git a/open_biomed/models/protein/progen/modeling_progen.py b/open_biomed/models/protein/progen/modeling_progen.py
new file mode 100644
index 0000000000000000000000000000000000000000..fc410c2aaeeeedc343c7436da92264bdb213ba9d
--- /dev/null
+++ b/open_biomed/models/protein/progen/modeling_progen.py
@@ -0,0 +1,759 @@
+# coding=utf-8
+# Copyright 2021 The EleutherAI and HuggingFace Teams. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Modified forward-pass implementation based on https://github.com/huggingface/transformers/blob/main/src/transformers/models/gptj/modeling_gptj.py
+
+from typing import Tuple
+
+import numpy as np
+
+import torch
+import torch.utils.checkpoint
+from torch import nn
+from torch.nn import CrossEntropyLoss
+
+from transformers.activations import ACT2FN
+from transformers.configuration_utils import PretrainedConfig
+from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast
+from transformers.modeling_utils import PreTrainedModel
+from transformers.utils import logging
+from transformers.utils.model_parallel_utils import assert_device_map, get_device_map
+
+
+logger = logging.get_logger(__name__)
+
+class ProGenConfig(PretrainedConfig):
+ model_type = "progen"
+
+ def __init__(
+ self,
+ vocab_size=50400,
+ n_positions=2048,
+ n_ctx=2048,
+ n_embd=4096,
+ n_layer=28,
+ n_head=16,
+ rotary_dim=64,
+ n_inner=None,
+ activation_function="gelu_new",
+ resid_pdrop=0.0,
+ embd_pdrop=0.0,
+ attn_pdrop=0.0,
+ layer_norm_epsilon=1e-5,
+ initializer_range=0.02,
+ scale_attn_weights=True,
+ gradient_checkpointing=False,
+ use_cache=True,
+ bos_token_id=50256,
+ eos_token_id=50256,
+ **kwargs
+ ):
+ super().__init__(bos_token_id=bos_token_id, eos_token_id=eos_token_id, **kwargs)
+
+ self.vocab_size = vocab_size
+ self.n_ctx = n_ctx
+ self.n_positions = n_positions
+ self.n_embd = n_embd
+ self.n_layer = n_layer
+ self.n_head = n_head
+ self.n_inner = n_inner
+ self.rotary_dim = rotary_dim
+ self.activation_function = activation_function
+ self.resid_pdrop = resid_pdrop
+ self.embd_pdrop = embd_pdrop
+ self.attn_pdrop = attn_pdrop
+ self.layer_norm_epsilon = layer_norm_epsilon
+ self.initializer_range = initializer_range
+ self.gradient_checkpointing = gradient_checkpointing
+ self.scale_attn_weights = scale_attn_weights
+ self.use_cache = use_cache
+
+ self.bos_token_id = bos_token_id
+ self.eos_token_id = eos_token_id
+
+ @property
+ def max_position_embeddings(self):
+ return self.n_positions
+
+ @property
+ def hidden_size(self):
+ return self.n_embd
+
+ @property
+ def num_attention_heads(self):
+ return self.n_head
+
+ @property
+ def num_hidden_layers(self):
+ return self.n_layer
+
+
+def fixed_pos_embedding(x, seq_dim=1, seq_len=None):
+ dim = x.shape[-1]
+ if seq_len is None:
+ seq_len = x.shape[seq_dim]
+ inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2) / dim))
+ sinusoid_inp = torch.einsum("i , j -> i j", torch.arange(seq_len), inv_freq).to(x.device).float()
+ return torch.sin(sinusoid_inp), torch.cos(sinusoid_inp)
+
+
+def rotate_every_two(x):
+ x1 = x[:, :, :, ::2]
+ x2 = x[:, :, :, 1::2]
+ x = torch.stack((-x2, x1), axis=-1)
+ return x.flatten(-2) # in einsum notation: rearrange(x, '... d j -> ... (d j)')
+
+
+def apply_rotary_pos_emb(x, sincos, offset=0):
+ sin, cos = map(lambda t: t[None, offset : x.shape[1] + offset, None, :].repeat_interleave(2, 3), sincos)
+ # einsum notation for lambda t: repeat(t[offset:x.shape[1]+offset,:], "n d -> () n () (d j)", j=2)
+ return (x * cos) + (rotate_every_two(x) * sin)
+
+
+class ProGenAttention(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+
+ max_positions = config.max_position_embeddings
+ self.register_buffer(
+ "bias",
+ torch.tril(torch.ones((max_positions, max_positions), dtype=torch.bool)).view(
+ 1, 1, max_positions, max_positions
+ ),
+ )
+ self.register_buffer("masked_bias", torch.tensor(-1e9))
+
+ self.attn_dropout = nn.Dropout(config.attn_pdrop)
+ self.resid_dropout = nn.Dropout(config.resid_pdrop)
+
+ self.embed_dim = config.hidden_size
+ self.num_attention_heads = config.num_attention_heads
+ self.head_dim = self.embed_dim // self.num_attention_heads
+ if self.head_dim * self.num_attention_heads != self.embed_dim:
+ raise ValueError(
+ f"embed_dim must be divisible by num_attention_heads (got `embed_dim`: {self.embed_dim} and `num_attention_heads`: {self.num_attention_heads})."
+ )
+ self.scale_attn = torch.sqrt(torch.tensor(self.head_dim, dtype=torch.float32)).to(torch.get_default_dtype())
+ self.qkv_proj = nn.Linear(self.embed_dim, self.embed_dim * 3, bias=False)
+
+ self.out_proj = nn.Linear(self.embed_dim, self.embed_dim, bias=False)
+ self.rotary_dim = None
+ if config.rotary_dim is not None:
+ self.rotary_dim = config.rotary_dim
+
+ def _split_heads(self, x, n_head, dim_head, mp_num):
+ reshaped = x.reshape(x.shape[:-1] + (n_head//mp_num, dim_head))
+ reshaped = reshaped.reshape(x.shape[:-2] + (-1, ) + reshaped.shape[-1:])
+ return reshaped
+
+ def _merge_heads(self, tensor, num_attention_heads, attn_head_size):
+ """
+ Merges attn_head_size dim and num_attn_heads dim into n_ctx
+ """
+ if len(tensor.shape) == 5:
+ tensor = tensor.permute(0, 1, 3, 2, 4).contiguous()
+ elif len(tensor.shape) == 4:
+ tensor = tensor.permute(0, 2, 1, 3).contiguous()
+ else:
+ raise ValueError(f"Input tensor rank should be one of [4, 5], but is: {len(tensor.shape)}")
+ new_shape = tensor.size()[:-2] + (num_attention_heads * attn_head_size,)
+ return tensor.view(new_shape)
+
+ def _attn(
+ self,
+ query,
+ key,
+ value,
+ attention_mask=None,
+ head_mask=None,
+ ):
+
+ # compute causal mask from causal mask buffer
+ query_length, key_length = query.size(-2), key.size(-2)
+ causal_mask = self.bias[:, :, key_length - query_length : key_length, :key_length]
+
+ # Keep the attention weights computation in fp32 to avoid overflow issues
+ query = query.to(torch.float32)
+ key = key.to(torch.float32)
+
+ attn_weights = torch.matmul(query, key.transpose(-1, -2))
+
+ attn_weights = attn_weights / self.scale_attn
+ attn_weights = torch.where(causal_mask, attn_weights, self.masked_bias.to(attn_weights.dtype))
+
+ if attention_mask is not None:
+ # Apply the attention mask
+ attn_weights = attn_weights + attention_mask
+
+ attn_weights = nn.Softmax(dim=-1)(attn_weights)
+ attn_weights = attn_weights.to(value.dtype)
+ attn_weights = self.attn_dropout(attn_weights)
+
+ # Mask heads if we want to
+ if head_mask is not None:
+ attn_weights = attn_weights * head_mask
+
+ attn_output = torch.matmul(attn_weights, value)
+
+ return attn_output, attn_weights
+
+ def forward(
+ self,
+ hidden_states,
+ attention_mask=None,
+ layer_past=None,
+ head_mask=None,
+ use_cache=False,
+ output_attentions=False,
+ ):
+
+ qkv = self.qkv_proj(hidden_states)
+ # TODO(enijkamp): factor out number of logical TPU-v3/v4 cores or make forward pass agnostic
+ # mp_num = 4
+ mp_num = 8
+ qkv_split = qkv.reshape(qkv.shape[:-1] + (mp_num, -1))
+
+ local_dim = self.head_dim * self.num_attention_heads // mp_num
+ query, value, key = torch.split(qkv_split, local_dim, dim=-1)
+ query = self._split_heads(query, self.num_attention_heads, self.head_dim, mp_num=mp_num)
+ key = self._split_heads(key, self.num_attention_heads, self.head_dim, mp_num=mp_num)
+
+ value = self._split_heads(value, self.num_attention_heads, self.head_dim, mp_num=mp_num)
+ value = value.permute(0, 2, 1, 3)
+
+ seq_len = key.shape[1]
+ offset = 0
+
+ if layer_past is not None:
+ offset = layer_past[0].shape[-2]
+ seq_len += offset
+
+ if self.rotary_dim is not None:
+ k_rot = key[:, :, :, : self.rotary_dim]
+ k_pass = key[:, :, :, self.rotary_dim :]
+
+ q_rot = query[:, :, :, : self.rotary_dim]
+ q_pass = query[:, :, :, self.rotary_dim :]
+
+ sincos = fixed_pos_embedding(k_rot, 1, seq_len=seq_len)
+ k_rot = apply_rotary_pos_emb(k_rot, sincos, offset=offset)
+ q_rot = apply_rotary_pos_emb(q_rot, sincos, offset=offset)
+
+ key = torch.cat([k_rot, k_pass], dim=-1)
+ query = torch.cat([q_rot, q_pass], dim=-1)
+ else:
+ sincos = fixed_pos_embedding(key, 1, seq_len=seq_len)
+ key = apply_rotary_pos_emb(key, sincos, offset=offset)
+ query = apply_rotary_pos_emb(query, sincos, offset=offset)
+
+ key = key.permute(0, 2, 1, 3)
+ query = query.permute(0, 2, 1, 3)
+
+ if layer_past is not None:
+ past_key = layer_past[0]
+ past_value = layer_past[1]
+ key = torch.cat((past_key, key), dim=-2)
+ value = torch.cat((past_value, value), dim=-2)
+
+ if use_cache is True:
+ present = (key, value)
+ else:
+ present = None
+
+ # compute self-attention: V x Softmax(QK^T)
+ attn_output, attn_weights = self._attn(query, key, value, attention_mask, head_mask)
+
+ attn_output = self._merge_heads(attn_output, self.num_attention_heads, self.head_dim)
+
+ attn_output = self.out_proj(attn_output)
+ attn_output = self.resid_dropout(attn_output)
+
+ outputs = (attn_output, present)
+ if output_attentions:
+ outputs += (attn_weights,)
+
+ return outputs # a, present, (attentions)
+
+
+class ProGenMLP(nn.Module):
+ def __init__(self, intermediate_size, config): # in MLP: intermediate_size= 4 * embed_dim
+ super().__init__()
+ embed_dim = config.n_embd
+
+ self.fc_in = nn.Linear(embed_dim, intermediate_size)
+ self.fc_out = nn.Linear(intermediate_size, embed_dim)
+
+ self.act = ACT2FN[config.activation_function]
+ self.dropout = nn.Dropout(config.resid_pdrop)
+
+ def forward(self, hidden_states):
+ hidden_states = self.fc_in(hidden_states)
+ hidden_states = self.act(hidden_states)
+ hidden_states = self.fc_out(hidden_states)
+ hidden_states = self.dropout(hidden_states)
+ return hidden_states
+
+
+class ProGenBlock(nn.Module):
+ def __init__(self, config):
+ super().__init__()
+ inner_dim = config.n_inner if config.n_inner is not None else 4 * config.n_embd
+ self.ln_1 = nn.LayerNorm(config.n_embd, eps=config.layer_norm_epsilon)
+ self.attn = ProGenAttention(config)
+ self.mlp = ProGenMLP(inner_dim, config)
+
+ def forward(
+ self,
+ hidden_states,
+ layer_past=None,
+ attention_mask=None,
+ head_mask=None,
+ use_cache=False,
+ output_attentions=False,
+ ):
+ residual = hidden_states
+ hidden_states = self.ln_1(hidden_states)
+ attn_outputs = self.attn(
+ hidden_states,
+ layer_past=layer_past,
+ attention_mask=attention_mask,
+ head_mask=head_mask,
+ use_cache=use_cache,
+ output_attentions=output_attentions,
+ )
+ attn_output = attn_outputs[0] # output_attn: a, present, (attentions)
+ outputs = attn_outputs[1:]
+
+ feed_forward_hidden_states = self.mlp(hidden_states)
+ hidden_states = attn_output + feed_forward_hidden_states + residual
+
+ if use_cache:
+ outputs = (hidden_states,) + outputs
+ else:
+ outputs = (hidden_states,) + outputs[1:]
+
+ return outputs # hidden_states, present, (attentions)
+
+
+class ProGenPreTrainedModel(PreTrainedModel):
+ """
+ An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
+ models.
+ """
+
+ config_class = ProGenConfig
+ base_model_prefix = "transformer"
+ is_parallelizable = True
+
+ def __init__(self, *inputs, **kwargs):
+ super().__init__(*inputs, **kwargs)
+
+ def _init_weights(self, module):
+ """Initialize the weights."""
+ if isinstance(module, (nn.Linear,)):
+ # Slightly different from Mesh Transformer JAX which uses truncated_normal for initialization
+ # cf https://github.com/pytorch/pytorch/pull/5617
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
+ if module.bias is not None:
+ module.bias.data.zero_()
+ elif isinstance(module, nn.Embedding):
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
+ if module.padding_idx is not None:
+ module.weight.data[module.padding_idx].zero_()
+ elif isinstance(module, nn.LayerNorm):
+ module.bias.data.zero_()
+ module.weight.data.fill_(1.0)
+
+
+class ProGenModel(ProGenPreTrainedModel):
+ def __init__(self, config):
+ super().__init__(config)
+
+ self.embed_dim = config.n_embd
+ self.vocab_size = config.vocab_size
+ self.wte = nn.Embedding(config.vocab_size, self.embed_dim)
+ self.drop = nn.Dropout(config.embd_pdrop)
+ self.h = nn.ModuleList([ProGenBlock(config) for _ in range(config.n_layer)])
+ self.ln_f = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_epsilon)
+ self.rotary_dim = min(config.rotary_dim, config.n_ctx // config.num_attention_heads)
+ self.init_weights()
+
+ # Model parallel
+ self.model_parallel = False
+ self.device_map = None
+
+
+ def parallelize(self, device_map=None):
+ # Check validity of device_map
+ self.device_map = (
+ get_device_map(len(self.h), range(torch.cuda.device_count())) if device_map is None else device_map
+ )
+ assert_device_map(self.device_map, len(self.h))
+ self.model_parallel = True
+ self.first_device = "cpu" if "cpu" in self.device_map.keys() else "cuda:" + str(min(self.device_map.keys()))
+ self.last_device = "cuda:" + str(max(self.device_map.keys()))
+ self.wte = self.wte.to(self.first_device)
+ # Load onto devices
+ for k, v in self.device_map.items():
+ for block in v:
+ cuda_device = "cuda:" + str(k)
+ self.h[block] = self.h[block].to(cuda_device)
+ # ln_f to last
+ self.ln_f = self.ln_f.to(self.last_device)
+
+
+ def deparallelize(self):
+ self.model_parallel = False
+ self.device_map = None
+ self.first_device = "cpu"
+ self.last_device = "cpu"
+ self.wte = self.wte.to("cpu")
+ for index in range(len(self.h)):
+ self.h[index] = self.h[index].to("cpu")
+ self.ln_f = self.ln_f.to("cpu")
+ torch.cuda.empty_cache()
+
+ def get_input_embeddings(self):
+ return self.wte
+
+ def set_input_embeddings(self, new_embeddings):
+ self.wte = new_embeddings
+
+ def forward(
+ self,
+ input_ids=None,
+ past_key_values=None,
+ attention_mask=None,
+ token_type_ids=None,
+ position_ids=None,
+ head_mask=None,
+ inputs_embeds=None,
+ use_cache=None,
+ output_attentions=None,
+ output_hidden_states=None,
+ return_dict=None,
+ ):
+ output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
+ output_hidden_states = (
+ output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
+ )
+ use_cache = use_cache if use_cache is not None else self.config.use_cache
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
+
+ if input_ids is not None and inputs_embeds is not None:
+ raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")
+ elif input_ids is not None:
+ input_shape = input_ids.size()
+ input_ids = input_ids.view(-1, input_shape[-1])
+ batch_size = input_ids.shape[0]
+ elif inputs_embeds is not None:
+ input_shape = inputs_embeds.size()[:-1]
+ batch_size = inputs_embeds.shape[0]
+ else:
+ raise ValueError("You have to specify either input_ids or inputs_embeds")
+
+ device = input_ids.device if input_ids is not None else inputs_embeds.device
+
+ if token_type_ids is not None:
+ token_type_ids = token_type_ids.view(-1, input_shape[-1])
+
+ if position_ids is not None:
+ position_ids = position_ids.view(-1, input_shape[-1])
+
+ if past_key_values is None:
+ past_length = 0
+ past_key_values = tuple([None] * len(self.h))
+ else:
+ past_length = past_key_values[0][0].size(-2)
+
+ if position_ids is None:
+ position_ids = torch.arange(past_length, input_shape[-1] + past_length, dtype=torch.long, device=device)
+ position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1])
+
+ # Attention mask.
+ if attention_mask is not None:
+ assert batch_size > 0, "batch_size has to be defined and > 0"
+ attention_mask = attention_mask.view(batch_size, -1)
+ # We create a 3D attention mask from a 2D tensor mask.
+ # Sizes are [batch_size, 1, 1, to_seq_length]
+ # So we can broadcast to [batch_size, num_heads, from_seq_length, to_seq_length]
+ # this attention mask is more simple than the triangular masking of causal attention
+ # used in OpenAI GPT, we just need to prepare the broadcast dimension here.
+ attention_mask = attention_mask[:, None, None, :]
+
+ # Since attention_mask is 1.0 for positions we want to attend and 0.0 for
+ # masked positions, this operation will create a tensor which is 0.0 for
+ # positions we want to attend and -10000.0 for masked positions.
+ # Since we are adding it to the raw scores before the softmax, this is
+ # effectively the same as removing these entirely.
+ attention_mask = attention_mask.to(dtype=self.dtype) # fp16 compatibility
+ attention_mask = (1.0 - attention_mask) * -10000.0
+
+ # Prepare head mask if needed
+ # 1.0 in head_mask indicate we keep the head
+ # attention_probs has shape bsz x num_attention_heads x N x N
+ # head_mask has shape n_layer x batch x num_attention_heads x N x N
+ head_mask = self.get_head_mask(head_mask, self.config.n_layer)
+
+ if inputs_embeds is None:
+ inputs_embeds = self.wte(input_ids)
+
+ hidden_states = inputs_embeds
+
+ if token_type_ids is not None:
+ token_type_embeds = self.wte(token_type_ids)
+ hidden_states = hidden_states + token_type_embeds
+
+ hidden_states = self.drop(hidden_states)
+
+ output_shape = input_shape + (hidden_states.size(-1),)
+
+ presents = () if use_cache else None
+ all_self_attentions = () if output_attentions else None
+ all_hidden_states = () if output_hidden_states else None
+ for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)):
+
+ # Model parallel
+ if self.model_parallel:
+ torch.cuda.set_device(hidden_states.device)
+ # Ensure layer_past is on same device as hidden_states (might not be correct)
+ if layer_past is not None:
+ layer_past = tuple(past_state.to(hidden_states.device) for past_state in layer_past)
+ # Ensure that attention_mask is always on the same device as hidden_states
+ if attention_mask is not None:
+ attention_mask = attention_mask.to(hidden_states.device)
+ if isinstance(head_mask, torch.Tensor):
+ head_mask = head_mask.to(hidden_states.device)
+ if output_hidden_states:
+ all_hidden_states = all_hidden_states + (hidden_states,)
+
+ if getattr(self.config, "gradient_checkpointing", False) and self.training:
+
+ if use_cache:
+ logger.warning(
+ "`use_cache=True` is incompatible with `config.gradient_checkpointing=True`. Setting "
+ "`use_cache=False`..."
+ )
+ use_cache = False
+
+ def create_custom_forward(module):
+ def custom_forward(*inputs):
+ # None for past_key_value
+ return module(*inputs, use_cache, output_attentions)
+
+ return custom_forward
+
+ outputs = torch.utils.checkpoint.checkpoint(
+ create_custom_forward(block),
+ hidden_states,
+ None,
+ attention_mask,
+ head_mask[i],
+ )
+ else:
+ outputs = block(
+ hidden_states,
+ layer_past=layer_past,
+ attention_mask=attention_mask,
+ head_mask=head_mask[i],
+ use_cache=use_cache,
+ output_attentions=output_attentions,
+ )
+
+ hidden_states = outputs[0]
+ if use_cache is True:
+ presents = presents + (outputs[1],)
+
+ if output_attentions:
+ all_self_attentions = all_self_attentions + (outputs[2 if use_cache else 1],)
+
+ # Model Parallel: If it's the last layer for that device, put things on the next device
+ if self.model_parallel:
+ for k, v in self.device_map.items():
+ if i == v[-1] and "cuda:" + str(k) != self.last_device:
+ hidden_states = hidden_states.to("cuda:" + str(k + 1))
+
+ hidden_states = self.ln_f(hidden_states)
+
+ hidden_states = hidden_states.view(*output_shape)
+ # Add last hidden state
+ if output_hidden_states:
+ all_hidden_states = all_hidden_states + (hidden_states,)
+
+ if not return_dict:
+ return tuple(v for v in [hidden_states, presents, all_hidden_states, all_self_attentions] if v is not None)
+
+ return BaseModelOutputWithPast(
+ last_hidden_state=hidden_states,
+ past_key_values=presents,
+ hidden_states=all_hidden_states,
+ attentions=all_self_attentions,
+ )
+
+
+class ProGenForCausalLM(ProGenPreTrainedModel):
+ _keys_to_ignore_on_load_missing = [r"h\.\d+\.attn\.masked_bias", r"h\.\d+\.attn\.bias", r"lm_head\.weight"]
+
+ def __init__(self, config):
+ super().__init__(config)
+ self.transformer = ProGenModel(config)
+ self.lm_head = nn.Linear(config.n_embd, config.vocab_size)
+ self.init_weights()
+
+ # Model parallel
+ self.model_parallel = False
+ self.device_map = None
+
+ def parallelize(self, device_map=None):
+ self.device_map = (
+ get_device_map(len(self.transformer.h), range(torch.cuda.device_count()))
+ if device_map is None
+ else device_map
+ )
+ assert_device_map(self.device_map, len(self.transformer.h))
+ self.transformer.parallelize(self.device_map)
+ self.lm_head = self.lm_head.to(self.transformer.first_device)
+ self.model_parallel = True
+
+ def deparallelize(self):
+ self.transformer.deparallelize()
+ self.transformer = self.transformer.to("cpu")
+ self.lm_head = self.lm_head.to("cpu")
+ self.model_parallel = False
+ torch.cuda.empty_cache()
+
+ def get_output_embeddings(self):
+ return None
+
+ def set_output_embeddings(self, new_embeddings):
+ return
+
+ def prepare_inputs_for_generation(self, input_ids, past_key_values=None, inputs_embeds=None, **kwargs):
+ token_type_ids = kwargs.get("token_type_ids", None)
+ # only last token for inputs_ids if past is defined in kwargs
+ # print(past_key_values)
+ if past_key_values:
+ input_ids = input_ids[:, -1].unsqueeze(-1)
+ if token_type_ids is not None:
+ token_type_ids = token_type_ids[:, -1].unsqueeze(-1)
+
+ attention_mask = kwargs.get("attention_mask", None)
+ position_ids = kwargs.get("position_ids", None)
+
+ if attention_mask is not None and position_ids is None:
+ # create position_ids on the fly for batch generation
+ position_ids = attention_mask.long().cumsum(-1) - 1
+ position_ids.masked_fill_(attention_mask == 0, 1)
+ if past_key_values:
+ position_ids = position_ids[:, -1].unsqueeze(-1)
+ else:
+ position_ids = None
+
+ if inputs_embeds is not None and past_key_values is None:
+ model_inputs = {"inputs_embeds": inputs_embeds}
+ else:
+ model_inputs = {"input_ids": input_ids}
+
+ model_inputs.update({
+ "past_key_values": past_key_values,
+ "use_cache": kwargs.get("use_cache"),
+ "position_ids": position_ids,
+ "attention_mask": attention_mask,
+ "token_type_ids": token_type_ids,
+ })
+ return model_inputs
+
+ def forward(
+ self,
+ input_ids=None,
+ past_key_values=None,
+ attention_mask=None,
+ token_type_ids=None,
+ position_ids=None,
+ head_mask=None,
+ inputs_embeds=None,
+ labels=None,
+ use_cache=None,
+ output_attentions=None,
+ output_hidden_states=None,
+ return_dict=None,
+ ):
+ r"""
+ labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
+ Labels for language modeling. Note that the labels **are shifted** inside the model, i.e. you can set
+ ``labels = input_ids`` Indices are selected in ``[-100, 0, ..., config.vocab_size]`` All labels set to
+ ``-100`` are ignored (masked), the loss is only computed for labels in ``[0, ..., config.vocab_size]``
+ """
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
+
+ transformer_outputs = self.transformer(
+ input_ids,
+ past_key_values=past_key_values,
+ attention_mask=attention_mask,
+ token_type_ids=token_type_ids,
+ position_ids=position_ids,
+ head_mask=head_mask,
+ inputs_embeds=inputs_embeds,
+ use_cache=use_cache,
+ output_attentions=output_attentions,
+ output_hidden_states=output_hidden_states,
+ return_dict=return_dict,
+ )
+ hidden_states = transformer_outputs[0]
+
+ # Set device for model parallelism
+ if self.model_parallel:
+ torch.cuda.set_device(self.transformer.first_device)
+ hidden_states = hidden_states.to(self.lm_head.weight.device)
+
+ # make sure sampling in fp16 works correctly and
+ # compute loss in fp32 to match with mesh-tf version
+ # https://github.com/EleutherAI/gpt-neo/blob/89ce74164da2fb16179106f54e2269b5da8db333/models/gpt2/gpt2.py#L179
+ lm_logits = self.lm_head(hidden_states).to(torch.float32)
+
+ loss = None
+ if labels is not None:
+ # Shift so that tokens < n predict n
+ shift_logits = lm_logits[..., :-1, :].contiguous()
+ shift_labels = labels[..., 1:].contiguous()
+ # Flatten the tokens
+ loss_fct = CrossEntropyLoss()
+ loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
+
+ loss = loss.to(hidden_states.dtype)
+
+ if not return_dict:
+ output = (lm_logits,) + transformer_outputs[1:]
+ return ((loss,) + output) if loss is not None else output
+
+ return CausalLMOutputWithPast(
+ loss=loss,
+ logits=lm_logits,
+ past_key_values=transformer_outputs.past_key_values,
+ hidden_states=transformer_outputs.hidden_states,
+ attentions=transformer_outputs.attentions,
+ )
+
+ @staticmethod
+ def _reorder_cache(past: Tuple[Tuple[torch.Tensor]], beam_idx: torch.Tensor) -> Tuple[Tuple[torch.Tensor]]:
+ """
+ This function is used to re-order the :obj:`past_key_values` cache if
+ :meth:`~transformers.PretrainedModel.beam_search` or :meth:`~transformers.PretrainedModel.beam_sample` is
+ called. This is required to match :obj:`past_key_values` with the correct beam_idx at every generation step.
+ """
+ return tuple(
+ tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past)
+ for layer_past in past
+ )
\ No newline at end of file
diff --git a/open_biomed/models/protein/progen/progen.py b/open_biomed/models/protein/progen/progen.py
new file mode 100644
index 0000000000000000000000000000000000000000..12b94c5a70fc2186e09af5c53cefa2db41ab2ddf
--- /dev/null
+++ b/open_biomed/models/protein/progen/progen.py
@@ -0,0 +1,178 @@
+from typing import Any, Dict, List, Optional, Tuple
+
+import contextlib
+from huggingface_hub import snapshot_download
+import logging
+import numpy as np
+import os
+import torch
+from tokenizers import Tokenizer
+from transformers import DataCollatorWithPadding
+
+from open_biomed.data import Protein
+from open_biomed.models.functional_model import ProteinDecoder
+from open_biomed.models.protein.progen.modeling_progen import ProGenForCausalLM
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import Featurized, ProteinFeaturizer, ProteinTransformersFeaturizer
+
+class ProGenFeaturizer(ProteinFeaturizer):
+ def __init__(self,
+ tokenizer: Tokenizer,
+ max_length: int=1024,
+ ) -> None:
+ super().__init__()
+ self.tokenizer = tokenizer
+ self.max_length = max_length
+
+ def __call__(self, protein: Protein) -> Dict[str, Any]:
+ seq = protein.sequence
+ if len(seq) > self.max_length - 2:
+ seq = seq[:self.max_length - 2]
+ seq = '1' + seq + '2'
+ return {
+ "input_ids": self.tokenizer.encode(seq).ids,
+ "attention_mask": [1 for i in range(len(seq))],
+ }
+
+class ProGenCollator(Collator):
+ def __init__(self, tokenizer: Tokenizer) -> None:
+ super().__init__()
+ self.tokenizer = tokenizer
+ self.pad_token = self.tokenizer.encode('<|pad|>').ids[0]
+
+ def __call__(self, protein: List[Any]) -> Dict[str, torch.Tensor]:
+ max_length = np.max([len(x["input_ids"]) for x in protein])
+ input_ids, attention_mask = [], []
+ for x in protein:
+ input_ids.append(torch.LongTensor(x["input_ids"] + [self.pad_token for i in range(max_length - len(x["input_ids"]))]))
+ attention_mask.append(torch.LongTensor(x["attention_mask"] + [0 for i in range(max_length - len(x["input_ids"]))]))
+ return {
+ "input_ids": torch.stack(input_ids, dim=0),
+ "attention_mask": torch.stack(attention_mask, dim=0),
+ }
+
+class ProGen(ProteinDecoder):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+ if not os.path.exists(model_cfg.protein_model):
+ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
+ logging.info("Repo not found. Try downloading from snapshot")
+ snapshot_download(repo_id="hugohrban/progen2-base", local_dir=model_cfg.hf_model_name_or_path, force_download=True)
+ self.model = ProGenForCausalLM.from_pretrained(model_cfg.model_name_or_path)
+ if getattr(model_cfg, "fp16", False):
+ self.model = self.model.to(torch.bfloat16)
+ with open(os.path.join(model_cfg.model_name_or_path, "tokenizer.json"), "r") as f:
+ self.tokenizer = Tokenizer.from_str(f.read())
+ self.featurizer = ProGenFeaturizer(self.tokenizer, max_length=model_cfg.max_length)
+ self.collator = ProGenCollator(self.tokenizer)
+
+ def get_protein_processor(self) -> Tuple[ProteinFeaturizer, Collator]:
+ return self.featurizer, self.collator
+
+ def maybe_autocast(self, dtype=torch.bfloat16):
+ # if on cpu, don't use autocast
+ # if on gpu, use autocast with dtype if provided, otherwise use torch.float16
+ enable_autocast = self.model.device != torch.device("cpu")
+
+ if enable_autocast:
+ return torch.cuda.amp.autocast(dtype=dtype)
+ else:
+ return contextlib.nullcontext()
+
+ def freeze_parameters(self):
+ for name, param in self.named_parameters():
+ # if not (("25" in name) or ("26" in name)):
+ param.requires_grad = False
+
+ def truncate(self, sample, terminals):
+ pos = []
+ for terminal in terminals:
+ find_pos = sample.find(terminal, 1)
+ if find_pos != -1:
+ pos.append(find_pos)
+ if len(pos) > 0:
+ return sample[:(min(pos)+1)]
+ else:
+ return sample
+
+ def generate_loss(self,
+ label: Featurized[Protein],
+ add_embeds: Optional[torch.Tensor]=None, # For conditional generation (e.g. natural language)
+ add_attention_mask: Optional[torch.Tensor]=None,
+ **kwargs
+ ) -> Dict[str, torch.Tensor]:
+ with self.maybe_autocast():
+ if add_embeds is not None:
+ # Conditional generation
+ protein_embeds = self.model.get_input_embeddings()(label["input_ids"])
+ # Concatenate multiple tokenized results by putting the non-padding tokens together
+ batch_size = protein_embeds.shape[0]
+ embeds = torch.cat([add_embeds, protein_embeds], dim=1)
+ attention_mask = torch.cat([add_attention_mask, label["attention_mask"]], dim=-1)
+ non_padding_length = attention_mask.sum(-1)
+ max_length = non_padding_length.max().item()
+
+ new_embeds = []
+ new_attention_mask = []
+ new_labels = []
+ for i in range(batch_size):
+ perm = torch.cat([
+ torch.where(attention_mask[i] == 1)[0], # non-padding tokens
+ torch.where(attention_mask[i] == 0)[0], # padding tokens
+ ])
+ new_embeds.append(embeds[i][perm[:max_length]])
+ new_attention_mask.append(attention_mask[i][perm[:max_length]])
+ new_labels.append(torch.cat([
+ torch.ones(add_attention_mask[i].sum().item()).to(add_attention_mask) * -100,
+ label["input_ids"][i][torch.where(label["attention_mask"][i] == 1)],
+ torch.ones(max_length - attention_mask[i].sum().item()).to(add_attention_mask) * -100
+ ], dim=0))
+ # print(new_labels)
+ return {"loss": self.model(
+ inputs_embeds=torch.stack(new_embeds, dim=0),
+ attention_mask=torch.stack(new_attention_mask, dim=0),
+ labels=torch.stack(new_labels, dim=0),
+ return_dict=True,
+ ).loss}
+ else:
+ label_tokens = label["input_ids"].clone()
+ label_tokens[torch.where(label["attention_mask"] == 0)] = -100
+ return {"loss": self.model(
+ input_ids=label["input_ids"],
+ attention_mask=label["attention_mask"],
+ labels=label["input_ids"],
+ return_dict=True,
+ ).loss}
+
+ @torch.no_grad()
+ def generate_protein(self, add_embeds: Optional[torch.Tensor]=None, add_attention_mask: Optional[torch.Tensor]=None, **kwargs) -> List[Protein]:
+ with self.maybe_autocast():
+ if add_embeds is not None:
+ inputs = torch.ones((add_embeds.shape[0], 1), dtype=torch.long).to(self.model.device) * self.tokenizer.encode("1").ids[0]
+ inputs_embeds = self.model.get_input_embeddings()(inputs)
+ # Move padding to left
+ new_embeds, new_attention_mask = [], []
+ for i in range(add_embeds.shape[0]):
+ perm = torch.cat([
+ torch.where(add_attention_mask[i] == 1)[0], # non-padding tokens
+ torch.where(add_attention_mask[i] == 0)[0], # padding tokens
+ ])
+ new_embeds.append(torch.cat([add_embeds[i][perm], inputs_embeds[i]], dim=0))
+ new_attention_mask.append(torch.cat([add_attention_mask[i][perm], torch.ones(1, dtype=torch.long, device=self.model.device)], dim=0))
+ outputs = self.model.generate(
+ inputs_embeds=torch.stack(new_embeds, dim=0),
+ attention_mask=torch.stack(new_attention_mask, dim=0),
+ pad_token_id=self.tokenizer.encode('<|pad|>').ids[0],
+ **self.config.generation.todict(),
+ )
+ else:
+ inputs = torch.tensor(self.tokenizer.encode("1").ids).to(self.model.device)
+ outputs = self.model.generate(
+ inputs.view([1, -1]),
+ pad_token_id=self.tokenizer.encode('<|pad|>').ids[0],
+ **self.config.generation.todict()
+ )
+ as_lists = lambda batch: [batch[i, ...].detach().cpu().numpy().tolist() for i in range(batch.shape[0])]
+ outputs = self.tokenizer.decode_batch(as_lists(outputs))
+ return [Protein.from_fasta(self.truncate(output, ['1', '2'])[:-1]) for output in outputs]
\ No newline at end of file
diff --git a/open_biomed/models/task_models/__init__.py b/open_biomed/models/task_models/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9be13115ae469b0361e72c97eba9138d81858590
--- /dev/null
+++ b/open_biomed/models/task_models/__init__.py
@@ -0,0 +1,10 @@
+from open_biomed.models.task_models.text_based_molecule_editing import *
+from open_biomed.models.task_models.molecule_captioning import *
+from open_biomed.models.task_models.text_guided_molecule_generation import *
+from open_biomed.models.task_models.molecule_question_answering import *
+from open_biomed.models.task_models.protein_question_answering import *
+from open_biomed.models.task_models.structure_based_drug_design import *
+from open_biomed.models.task_models.protein_molecule_docking import *
+from open_biomed.models.task_models.protein_text_translation import *
+from open_biomed.models.task_models.molecule_property_prediction import *
+from open_biomed.models.task_models.protein_folding import *
diff --git a/open_biomed/models/task_models/cell_annotation.py b/open_biomed/models/task_models/cell_annotation.py
new file mode 100644
index 0000000000000000000000000000000000000000..36dd95dd48c3701054d46a2c3dc62a20c7ec1c43
--- /dev/null
+++ b/open_biomed/models/task_models/cell_annotation.py
@@ -0,0 +1,40 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Optional, Tuple
+
+import torch
+
+from open_biomed.data import Cell, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import Featurizer, Featurized
+
+class CellAnnotation(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ featurizer, collator = self.get_featurizer()
+ self.supported_tasks["cell_annotation"] = {
+ "forward_fn": self.forward,
+ "predict_fn": self.predict,
+ "featurizer": featurizer,
+ "collator": collator,
+ }
+
+ @abstractmethod
+ def forward(self) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict(self,
+ cell: Featurized[Cell],
+ class_texts: Featurized[Text],
+ **kwargs,
+ ) -> int:
+ raise NotImplementedError
+
+ @abstractmethod
+ def get_featurizer(self) -> Tuple[Featurizer, Collator]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/task_models/molecule_captioning.py b/open_biomed/models/task_models/molecule_captioning.py
new file mode 100644
index 0000000000000000000000000000000000000000..66fd355072f0e2124bcba8177a471bbe45d2ec63
--- /dev/null
+++ b/open_biomed/models/task_models/molecule_captioning.py
@@ -0,0 +1,43 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Union
+
+import torch
+
+from open_biomed.data import Molecule, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import EnsembleFeaturizer
+from open_biomed.utils.misc import sub_dict
+
+class MoleculeCaptioningModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ self.supported_tasks["molecule_captioning"] = {
+ "forward_fn": self.forward_molecule_captioning,
+ "predict_fn": self.predict_molecule_captioning,
+ "featurizer": EnsembleFeaturizer({
+ **sub_dict(self.featurizers, ["molecule"]),
+ "label": self.featurizers["text"]
+ }),
+ "collator": EnsembleCollator({
+ **sub_dict(self.collators, ["molecule"]),
+ "label": self.collators["text"]
+ })
+ }
+
+ @abstractmethod
+ def forward_molecule_captioning(self,
+ molecule: List[Molecule],
+ label: List[Text],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_molecule_captioning(self,
+ molecule: List[Molecule],
+ ) -> List[Text]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/task_models/molecule_property_prediction.py b/open_biomed/models/task_models/molecule_property_prediction.py
new file mode 100644
index 0000000000000000000000000000000000000000..7da1e9d7bd4c94ad2a873a6cd3fbb3d5a23dac84
--- /dev/null
+++ b/open_biomed/models/task_models/molecule_property_prediction.py
@@ -0,0 +1,67 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Union
+
+import torch
+
+from open_biomed.data import Molecule, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import EnsembleFeaturizer
+from open_biomed.utils.misc import sub_dict
+
+
+def get_num_task(dataset):
+ dataset = dataset.lower()
+ """ used in molecule_finetune.py """
+ if dataset == 'tox21':
+ return 12
+ elif dataset in ['hiv', 'bace', 'bbbp', 'donor', "bbb_martins", "caco2_wang", "cyp2c9_veith", "half_life_obach", "ld50_zhu"]:
+ return 1
+ elif dataset == 'pcba':
+ return 92
+ elif dataset == 'muv':
+ return 17
+ elif dataset == 'toxcast':
+ return 617
+ elif dataset == 'sider':
+ return 27
+ elif dataset == 'clintox':
+ return 2
+ raise ValueError('Invalid dataset name.')
+
+
+class MoleculePropertyPredictionModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+ self.num_tasks = get_num_task(model_cfg.dataset_name)
+
+ def _add_task(self) -> None:
+ self.supported_tasks["molecule_property_prediction"] = {
+ "forward_fn": self.forward_molecule_property_prediction,
+ "predict_fn": self.predict_molecule_property_prediction,
+ # TODO: 这里label的featurize和collator如何定义呢
+ "featurizer": EnsembleFeaturizer({
+ **sub_dict(self.featurizers, ["molecule"]),
+ "label": self.featurizers["classlabel"]
+ }),
+ "collator": EnsembleCollator({
+ **sub_dict(self.collators, ["molecule"]),
+ "label": self.collators["classlabel"]
+ })
+ }
+
+ # TODO: Add type hints to the parameters.
+ @abstractmethod
+ def forward_molecule_property_prediction(self,
+ molecule,
+ label
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_molecule_property_prediction(self,
+ molecule
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/task_models/molecule_question_answering.py b/open_biomed/models/task_models/molecule_question_answering.py
new file mode 100644
index 0000000000000000000000000000000000000000..c3c35dd179e966b0ebaf19905e232dc6848a4127
--- /dev/null
+++ b/open_biomed/models/task_models/molecule_question_answering.py
@@ -0,0 +1,45 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Union
+
+import torch
+
+from open_biomed.data import Molecule, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import EnsembleFeaturizer, Featurized
+from open_biomed.utils.misc import sub_dict
+
+class MoleculeQAModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ self.supported_tasks["molecule_question_answering"] = {
+ "forward_fn": self.forward_molecule_question_answering,
+ "predict_fn": self.predict_molecule_question_answering,
+ "featurizer": EnsembleFeaturizer({
+ **sub_dict(self.featurizers, ["molecule", "text"]),
+ "label": self.featurizers["text"]
+ }),
+ "collator": EnsembleCollator({
+ **sub_dict(self.collators, ["molecule", "text"]),
+ "label": self.collators["text"]
+ })
+ }
+
+ @abstractmethod
+ def forward_molecule_question_answering(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ label: Featurized[Text],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_molecule_question_answering(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ ) -> List[Text]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/task_models/mutation_text_translation.py b/open_biomed/models/task_models/mutation_text_translation.py
new file mode 100644
index 0000000000000000000000000000000000000000..44cf9f4520161faa7d09a82541018be401690f32
--- /dev/null
+++ b/open_biomed/models/task_models/mutation_text_translation.py
@@ -0,0 +1,81 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Optional, Tuple
+
+import torch
+
+from open_biomed.data import Protein, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import Featurizer, Featurized
+
+class MutationExplanationModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ featurizer, collator = self.featurizer_mutation_explanation()
+ self.supported_tasks["mutation_explanation"] = {
+ "forward_fn": self.forward_mutation_explanation,
+ "predict_fn": self.predict_mutation_explanation,
+ "featurizer": featurizer,
+ "collator": collator,
+ }
+
+ @abstractmethod
+ def forward_mutation_explanation(self,
+ wild_type: Featurized[Protein],
+ mutant: Featurized[Any],
+ label: Featurized[Text],
+ **kwargs,
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_mutation_explanation(self,
+ wild_type: Featurized[Protein],
+ mutant: Featurized[Any],
+ **kwargs,
+ ) -> List[Text]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def featurizer_mutation_explanation(self) -> Tuple[Featurizer, Collator]:
+ raise NotImplementedError
+
+class MutationEngineeringModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ featurizer, collator = self.featurizer_mutation_engineering()
+ self.supported_tasks["mutation_engineering"] = {
+ "forward_fn": self.forward_mutation_engineering,
+ "predict_fn": self.predict_mutation_engineering,
+ "featurizer": featurizer,
+ "collator": collator,
+ }
+
+ @abstractmethod
+ def forward_mutation_engineering(self,
+ wild_type: Featurized[Protein],
+ prompt: Featurized[Text],
+ label: Featurized[Any],
+ **kwargs,
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_mutation_engineering(self,
+ wild_type: Featurized[Protein],
+ prompt: Featurized[Text],
+ position: Optional[torch.LongTensor]=None,
+ **kwargs,
+ ) -> List[List[Tuple[Protein, str]]]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def featurizer_mutation_engineering(self) -> Tuple[Featurizer, Collator]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/task_models/protein_folding.py b/open_biomed/models/task_models/protein_folding.py
new file mode 100644
index 0000000000000000000000000000000000000000..43b4bfb971b465a67777e495e30be65fde04e9f5
--- /dev/null
+++ b/open_biomed/models/task_models/protein_folding.py
@@ -0,0 +1,42 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Union, Tuple
+
+import torch
+
+from open_biomed.data import Protein
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import Collator, EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import Featurizer, EnsembleFeaturizer, Featurized
+from open_biomed.utils.misc import sub_dict
+
+
+class ProteinFoldingModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ featurizer, collator = self.featurizer_protein_folding()
+ self.supported_tasks["protein_folding"] = {
+ "forward_fn": self.forward_protein_folding,
+ "predict_fn": self.predict_protein_folding,
+ "featurizer": featurizer,
+ "collator": collator,
+ }
+
+ @abstractmethod
+ def forward_protein_folding(self,
+ protein: Featurized[Protein],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_protein_folding(self,
+ protein: Featurized[Protein],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def featurizer_protein_folding(self) -> Tuple[Featurizer, Collator]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/task_models/protein_molecule_docking.py b/open_biomed/models/task_models/protein_molecule_docking.py
new file mode 100644
index 0000000000000000000000000000000000000000..cd9aa56bea650fa299002b2f3c877479a4aabbb3
--- /dev/null
+++ b/open_biomed/models/task_models/protein_molecule_docking.py
@@ -0,0 +1,50 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Union
+
+import torch
+
+from open_biomed.data import Molecule, Pocket
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import EnsembleFeaturizer, Featurized
+from open_biomed.utils.misc import sub_dict
+
+class PocketMolDockModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ self.supported_tasks["pocket_molecule_docking"] = {
+ "forward_fn": self.forward_pocket_molecule_docking,
+ "predict_fn": self.predict_pocket_molecule_docking,
+ "featurizer": EnsembleFeaturizer({
+ **sub_dict(self.featurizers, ["molecule", "pocket"]),
+ "label": self.featurizers["molecule"]
+ }),
+ "collator": EnsembleCollator({
+ **sub_dict(self.collators, ["molecule", "pocket"]),
+ "label": self.collators["molecule"]
+ })
+ }
+
+ @abstractmethod
+ def forward_pocket_molecule_docking(self,
+ molecule: Featurized[Molecule],
+ pocket: Featurized[Pocket],
+ label: Featurized[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_pocket_molecule_docking(self,
+ molecule: Featurized[Molecule],
+ pocket: Featurized[Pocket],
+ ) -> List[Molecule]:
+ raise NotImplementedError
+
+#TODO: implement blind docking
+class BlindMolDockModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
\ No newline at end of file
diff --git a/open_biomed/models/task_models/protein_question_answering.py b/open_biomed/models/task_models/protein_question_answering.py
new file mode 100644
index 0000000000000000000000000000000000000000..5bf7f34b42b9f6ad92808f6f2e6a1904fefabd42
--- /dev/null
+++ b/open_biomed/models/task_models/protein_question_answering.py
@@ -0,0 +1,45 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Union
+
+import torch
+
+from open_biomed.data import Protein, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import Featurized, EnsembleFeaturizer
+from open_biomed.utils.misc import sub_dict
+
+class ProteinQAModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ self.supported_tasks["protein_question_answering"] = {
+ "forward_fn": self.forward_protein_question_answering,
+ "predict_fn": self.predict_protein_question_answering,
+ "featurizer": EnsembleFeaturizer({
+ **sub_dict(self.featurizers, ["protein", "text"]),
+ "label": self.featurizers["text"]
+ }),
+ "collator": EnsembleCollator({
+ **sub_dict(self.collators, ["protein", "text"]),
+ "label": self.collators["text"]
+ })
+ }
+
+ @abstractmethod
+ def forward_protein_question_answering(self,
+ protein: Featurized[Protein],
+ text: Featurized[Text],
+ label: Featurized[Text],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_protein_question_answering(self,
+ protein: Featurized[Protein],
+ text: Featurized[Text],
+ ) -> List[Text]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/task_models/protein_text_translation.py b/open_biomed/models/task_models/protein_text_translation.py
new file mode 100644
index 0000000000000000000000000000000000000000..73081fdf252d5d2f012a9db910dddadaf83ab650
--- /dev/null
+++ b/open_biomed/models/task_models/protein_text_translation.py
@@ -0,0 +1,96 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Optional, Tuple
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+from open_biomed.data import Protein, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.models.functional_model_registry import TEXT_ENCODER_REGISTRY, PROTEIN_DECODER_REGISTRY
+from open_biomed.models.misc import MLP
+from open_biomed.utils.collator import EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import Featurized, EnsembleFeaturizer
+
+class TextBasedProteinGenerationModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ self.supported_tasks["text_based_protein_generation"] = {
+ "forward_fn": self.forward_text_based_protein_generation,
+ "predict_fn": self.predict_text_based_protein_generation,
+ "featurizer": EnsembleFeaturizer({
+ "text": self.featurizers["text"],
+ "label": self.featurizers["protein"],
+ }),
+ "collator": EnsembleCollator({
+ "text": self.collators["text"],
+ "label": self.collators["protein"]
+ })
+ }
+
+ @abstractmethod
+ def forward_text_based_protein_generation(self,
+ text: Featurized[Text],
+ label: Featurized[Protein],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_text_based_protein_generation(self,
+ text: Featurized[Text]
+ ) -> List[Protein]:
+ raise NotImplementedError
+
+class EnsembleTextBasedProteinGenerationModel(TextBasedProteinGenerationModel):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+ self.text_config = Config(config_file=model_cfg.text.config_file).model
+ self.text_model = TEXT_ENCODER_REGISTRY[self.text_config.name](self.text_config)
+ if hasattr(model_cfg.text, "model_checkpoint"):
+ self.text_model.load_from_checkpoint(model_cfg.text.model_checkpoint)
+ for param in self.text_model.parameters():
+ param.requires_grad = False
+ self.protein_config = Config(config_file=model_cfg.protein.config_file).model
+ self.protein_model = PROTEIN_DECODER_REGISTRY[self.protein_config.name](self.protein_config)
+ if hasattr(model_cfg.protein, "model_checkpoint"):
+ self.protein_model.load_from_checkpoint(model_cfg.protein.model_checkpoint)
+ if getattr(model_cfg.protein, "freeze", False):
+ self.protein_model.freeze_parameters()
+ self.connector = MLP(
+ **model_cfg.connector.todict()
+ )
+ self.dropout = nn.Dropout(0.2)
+
+ text_featurizer, text_collator = self.text_model.get_text_processor()
+ protein_featurizer, protein_collator = self.protein_model.get_protein_processor()
+ self.featurizers = {
+ "text": text_featurizer,
+ "protein": protein_featurizer,
+ }
+ self.collators = {
+ "text": text_collator,
+ "protein": protein_collator,
+ }
+
+ self._add_task()
+
+ def forward_text_based_protein_generation(self,
+ text: Featurized[Text],
+ label: Featurized[Protein]
+ ) -> Dict[str, torch.Tensor]:
+ text_embeds = self.text_model.encode_text(text)
+ text_embeds = self.dropout(self.connector(text_embeds))
+ return self.protein_model.generate_loss(label, add_embeds=text_embeds[:, 0, :].unsqueeze(1), add_attention_mask=text.attention_mask[:, 0].unsqueeze(1))
+ # return self.protein_model.generate_loss(label, add_embeds=text_embeds, add_attention_mask=text.attention_mask)
+
+ def predict_text_based_protein_generation(self,
+ text: Featurized[Text]
+ ) -> List[Protein]:
+ text_embeds = self.text_model.encode_text(text)
+ text_embeds = self.dropout(self.connector(text_embeds))
+ return self.protein_model.generate_protein(add_embeds=text_embeds[:, 0, :].unsqueeze(1), add_attention_mask=text.attention_mask[:, 0].unsqueeze(1))
+ # return self.protein_model.generate_protein(add_embeds=text_embeds, add_attention_mask=text.attention_mask)
\ No newline at end of file
diff --git a/open_biomed/models/task_models/structure_based_drug_design.py b/open_biomed/models/task_models/structure_based_drug_design.py
new file mode 100644
index 0000000000000000000000000000000000000000..e2f0341ba7d14e3b62607ff91cab06dafe82a9f5
--- /dev/null
+++ b/open_biomed/models/task_models/structure_based_drug_design.py
@@ -0,0 +1,43 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Union
+
+import torch
+
+from open_biomed.data import Molecule, Pocket
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import EnsembleFeaturizer, Featurized
+from open_biomed.utils.misc import sub_dict
+
+class StructureBasedDrugDesignModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ self.supported_tasks["structure_based_drug_design"] = {
+ "forward_fn": self.forward_structure_based_drug_design,
+ "predict_fn": self.predict_structure_based_drug_design,
+ "featurizer": EnsembleFeaturizer({
+ **sub_dict(self.featurizers, ["pocket"]),
+ "label": self.featurizers["molecule"]
+ }),
+ "collator": EnsembleCollator({
+ **sub_dict(self.collators, ["pocket"]),
+ "label": self.collators["molecule"]
+ })
+ }
+
+ @abstractmethod
+ def forward_structure_based_drug_design(self,
+ pocket: Featurized[Pocket],
+ label: Featurized[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_structure_based_drug_design(self,
+ pocket: Featurized[Pocket],
+ ) -> List[Molecule]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/task_models/text_based_molecule_editing.py b/open_biomed/models/task_models/text_based_molecule_editing.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec53e64f2b0d82da9fdd8514dfa423285d32941e
--- /dev/null
+++ b/open_biomed/models/task_models/text_based_molecule_editing.py
@@ -0,0 +1,45 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Union
+
+import torch
+
+from open_biomed.data import Molecule, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import EnsembleFeaturizer, Featurized
+from open_biomed.utils.misc import sub_dict
+
+class TextBasedMoleculeEditingModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ self.supported_tasks["text_based_molecule_editing"] = {
+ "forward_fn": self.forward_text_based_molecule_editing,
+ "predict_fn": self.predict_text_based_molecule_editing,
+ "featurizer": EnsembleFeaturizer({
+ **sub_dict(self.featurizers, ["molecule", "text"]),
+ "label": self.featurizers["molecule"]
+ }),
+ "collator": EnsembleCollator({
+ **sub_dict(self.collators, ["molecule", "text"]),
+ "label": self.collators["molecule"]
+ })
+ }
+
+ @abstractmethod
+ def forward_text_based_molecule_editing(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ label: Featurized[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ @torch.no_grad()
+ def predict_text_based_molecule_editing(self,
+ molecule: Featurized[Molecule],
+ text: Featurized[Text],
+ ) -> List[Molecule]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/task_models/text_guided_molecule_generation.py b/open_biomed/models/task_models/text_guided_molecule_generation.py
new file mode 100644
index 0000000000000000000000000000000000000000..868f75cbbb1a15c49b8660966e92171e22c5628e
--- /dev/null
+++ b/open_biomed/models/task_models/text_guided_molecule_generation.py
@@ -0,0 +1,42 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Union
+
+import torch
+
+from open_biomed.data import Molecule, Text
+from open_biomed.models.base_model import BaseModel
+from open_biomed.utils.collator import EnsembleCollator
+from open_biomed.utils.config import Config
+from open_biomed.utils.featurizer import EnsembleFeaturizer
+from open_biomed.utils.misc import sub_dict
+
+class TextGuidedMoleculeGenerationModel(BaseModel, ABC):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+
+ def _add_task(self) -> None:
+ self.supported_tasks["text_guided_molecule_generation"] = {
+ "forward_fn": self.forward_text_guided_molecule_generation,
+ "predict_fn": self.predict_text_guided_molecule_generation,
+ "featurizer": EnsembleFeaturizer({
+ **sub_dict(self.featurizers, ["text"]),
+ "label": self.featurizers["molecule"]
+ }),
+ "collator": EnsembleCollator({
+ **sub_dict(self.collators, ["text"]),
+ "label": self.collators["molecule"]
+ })
+ }
+
+ @abstractmethod
+ def forward_text_guided_molecule_generation(self,
+ text: List[Text],
+ label: List[Molecule],
+ ) -> Dict[str, torch.Tensor]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def predict_text_guided_molecule_generation(self,
+ text: List[Text],
+ ) -> List[Molecule]:
+ raise NotImplementedError
\ No newline at end of file
diff --git a/open_biomed/models/text/pretrained_lm.py b/open_biomed/models/text/pretrained_lm.py
new file mode 100644
index 0000000000000000000000000000000000000000..4eeb3d7d1f322351a74a952de2aa49a074bc810d
--- /dev/null
+++ b/open_biomed/models/text/pretrained_lm.py
@@ -0,0 +1,27 @@
+from typing import List, Tuple, Union
+
+import torch
+from transformers import AutoModel, AutoTokenizer, DataCollatorWithPadding
+
+from open_biomed.data import Text
+from open_biomed.models.functional_model import TextEncoder
+from open_biomed.utils.config import Config
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.featurizer import Featurized, TextFeaturizer, TextTransformersFeaturizer
+
+class PretrainedLMForTextEncoding(TextEncoder):
+ def __init__(self, model_cfg: Config) -> None:
+ super().__init__(model_cfg)
+ self.model = AutoModel.from_pretrained(model_cfg.model_name_or_path)
+ self.tokenizer = AutoTokenizer.from_pretrained(model_cfg.model_name_or_path)
+ self.featurizer = TextTransformersFeaturizer(self.tokenizer, model_cfg.max_length)
+ self.collator = DataCollatorWithPadding(self.tokenizer, padding=True)
+
+ def get_text_processor(self) -> Tuple[TextFeaturizer, Collator]:
+ return self.featurizer, self.collator
+
+ def encode_text(self, text: Union[List[Text], Featurized[Text]]) -> torch.Tensor:
+ if isinstance(text, list):
+ text = self.collator([self.featurizer(t) for t in text]).to(self.model.device)
+ return self.model(**text).last_hidden_state
+
\ No newline at end of file
diff --git a/open_biomed/scripts/chat.py b/open_biomed/scripts/chat.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa29d908c758b8c331494a15c02f85ec7a80985e
--- /dev/null
+++ b/open_biomed/scripts/chat.py
@@ -0,0 +1,39 @@
+import os
+import sys
+sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
+
+import argparse
+import logging
+
+from open_biomed.data import Molecule, Protein, Text
+from open_biomed.models.foundation_models.biomedgpt import BioMedGPT4Chat
+
+def chat_biomedgpt():
+ agent = BioMedGPT4Chat.from_pretrained("./checkpoints/biomedgpt-10b/", "cuda:4")
+ molecule = Molecule.from_smiles("CC(=CCC1=CC(=CC(=C1O)CC=C(C)C)/C=C/C(=O)C2=C(C=C(C=C2)O)O)C")
+ protein = Protein.from_fasta("MAKEDTLEFPGVVKELLPNATFRVELDNGHELIAVMAGKMRKNRIRVLAGDKVQVEMTPYDLSKGRINYRFK")
+ agent.append_molecule(molecule)
+ print(agent.chat(Text.from_str("Please describe this molecule.")))
+ agent.reset()
+ agent.append_protein(protein)
+ print(agent.chat(Text.from_str("What is the function of this protein?")))
+
+CHAT_UNIT_TESTS = {
+ "biomedgpt": chat_biomedgpt,
+}
+
+if __name__ == "__main__":
+ logging.basicConfig(
+ format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
+ datefmt="%m/%d/%Y %H:%M:%S",
+ level=logging.INFO,
+ )
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--model", type=str, default="biomedgpt")
+ args = parser.parse_args()
+
+ if args.model not in CHAT_UNIT_TESTS:
+ raise NotImplementedError(f"{args.model} is not currently supported for chat!")
+ else:
+ CHAT_UNIT_TESTS[args.model]()
\ No newline at end of file
diff --git a/open_biomed/scripts/inference.py b/open_biomed/scripts/inference.py
new file mode 100644
index 0000000000000000000000000000000000000000..a251cf734af3dd7b7994a00a15c0c002db0d7936
--- /dev/null
+++ b/open_biomed/scripts/inference.py
@@ -0,0 +1,250 @@
+import os
+import sys
+sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
+import torch
+torch.set_printoptions(precision=4, sci_mode=False)
+
+import argparse
+
+from open_biomed.core.pipeline import InferencePipeline, EnsemblePipeline
+from open_biomed.core.tool_misc import MutationToSequence
+from open_biomed.data import Molecule, Text, Protein, Pocket
+from open_biomed.tasks.aidd_tasks.protein_molecule_docking import VinaDockTask
+
+os.environ["dataset_name"] = "BBBP"
+
+def test_text_based_molecule_editing():
+ pipeline = InferencePipeline(
+ task="text_based_molecule_editing",
+ model="molt5",
+ model_ckpt="./checkpoints/server/text_based_molecule_editing_biot5.ckpt",
+ device="cuda:0"
+ )
+ input_smiles = "Nc1[nH]c(C(=O)c2ccccc2)c(-c2ccccn2)c1C(=O)c1c[nH]c2ccc(Br)cc12"
+ input_text = "This molecule can bind with recombinant human 15-LOX-1"
+ outputs = pipeline.run(
+ molecule=Molecule.from_smiles(input_smiles),
+ text=Text.from_str(input_text),
+ )
+ print(f"Input SMILES: {input_smiles}")
+ print(f"Input Text: {input_text}")
+ print(outputs[0])
+ return pipeline
+
+def test_pocket_molecule_docking():
+ pipeline = InferencePipeline(
+ task="pocket_molecule_docking",
+ model="pharmolix_fm",
+ model_ckpt="./checkpoints/server/pharmolix_fm.ckpt",
+ device="cuda:0"
+ )
+ protein = Protein.from_pdb_file("./checkpoints/server/test_data/4xli_B.pdb")
+ ligand = Molecule.from_sdf_file("./checkpoints/server/test_data/4xli_B_ref.sdf")
+ pocket = Pocket.from_protein_ref_ligand(protein, ligand)
+ outputs = pipeline.run(
+ molecule=ligand,
+ pocket=pocket,
+ )
+ print(outputs)
+ return pipeline
+
+def test_structure_based_drug_design():
+ pipeline = InferencePipeline(
+ task="structure_based_drug_design",
+ model="pharmolix_fm",
+ model_ckpt="./checkpoints/server/pharmolix_fm.ckpt",
+ # model="molcraft",
+ # model_ckpt="./checkpoints/molcraft/last_updated.ckpt",
+ device="cuda:0"
+ )
+ protein = Protein.from_pdb_file("./checkpoints/server/test_data/4xli_B.pdb")
+ ligand = Molecule.from_sdf_file("./checkpoints/server/test_data/4xli_B_ref.sdf")
+ from pytorch_lightning import seed_everything
+ seed_everything(1234)
+ pocket = Pocket.from_protein_ref_ligand(protein, ligand)
+ pocket.estimated_num_atoms = ligand.get_num_atoms()
+ for i in range(1):
+ outputs = pipeline.run(
+ pocket=pocket
+ )
+ print(outputs[0][0])
+ print(outputs[0][0].conformer)
+ from open_biomed.tasks.aidd_tasks.structure_based_drug_design import calc_vina_molecule_metrics
+ print(calc_vina_molecule_metrics(outputs[0][0], protein))
+ print(outputs)
+ return pipeline
+
+def test_protein_molecule_docking():
+ protein = Protein.from_pdb_file("./checkpoints/server/test_data/4xli_B.pdb")
+ ligand = Molecule.from_sdf_file("./checkpoints/server/test_data/4xli_B_ref.sdf")
+ vina = VinaDockTask(mode="dock")
+ print(vina.run(ligand, protein)[0][0])
+ return vina
+
+def test_molecule_question_answering():
+ pipeline = InferencePipeline(
+ task="molecule_question_answering",
+ model="biot5",
+ model_ckpt="./checkpoints/server/molecule_question_answering_biot5.ckpt",
+ device="cuda:0"
+ )
+ molecule = Molecule.from_smiles("C[C@@H]1CCCCO[C@@H](CN(C)C(=O)Cc2ccccc2)[C@@H](C)CN([C@@H](C)CO)C(=O)c2cc(NS(C)(=O)=O)ccc2O1")
+ question = Text.from_str("Could you provide the systematic name of this compound according to IUPAC nomenclature?")
+ outputs = pipeline.run(
+ molecule=molecule,
+ text=question,
+ )
+ print(outputs)
+ return pipeline
+
+def test_protein_question_answering():
+ pipeline = InferencePipeline(
+ task="protein_question_answering",
+ model="biot5",
+ model_ckpt="./checkpoints/server/protein_question_answering_biot5.ckpt",
+ device="cuda:0"
+ )
+ protein = Protein.from_fasta("MRVGVIRFPGSNCDRDVHHVLELAGAEPEYVWWNQRNLDHLDAVVIPGGFSYGDYLRAGAIAAITPVMDAVRELVREEKPVLGICNGAQILAEVGLVPGVFTVNEHPKFNCQWTELRVKTTRTPFTGLFKKDEVIRMPVAHAEGRYYHDNISEVWENDQVVLQFHGENPNGSLDGITGVCDESGLVCAVMPHPERASEEILGSVDGFKFFRGILKFRG")
+ question = Text.from_str("Inspect the protein sequence and offer a concise description of its properties.")
+ outputs = pipeline.run(
+ protein=protein,
+ text=question,
+ )
+ print(outputs)
+ return pipeline
+
+def test_mutation_explanation():
+ pipeline = InferencePipeline(
+ task="mutation_explanation",
+ model="mutaplm",
+ model_ckpt="./checkpoints/server/mutaplm.pth",
+ device="cuda:0"
+ )
+ protein = Protein.from_fasta("MTLENVLEAARHLHQTLPALSEFGNWPTDLTATGLQPRAIPATPLVQALDQPGSPRTTGLVQAIRSAAHLAHWKRTYTEAEVGADFRNRYGYFELFGPTGHFHSTQLRGYVAYWGAGLDYDWHSHQAEELYLTLAGGAVFKVDGERAFVGAEGTRLHASWQSAAMSTGDQPILTFVLWRGEGLNALPRMDAA")
+ mutation = "H163A"
+ outputs = pipeline.run(
+ protein=protein,
+ mutation=mutation,
+ )
+ print(outputs)
+ return pipeline
+
+def test_mutation_engineering():
+ pipeline = InferencePipeline(
+ task="mutation_engineering",
+ model="mutaplm",
+ model_ckpt="./checkpoints/server/mutaplm.pth",
+ device="cuda:1"
+ )
+ protein = Protein.from_fasta("MASDAAAEPSSGVTHPPRYVIGYALAPKKQQSFIQPSLVAQAASRGMDLVPVDASQPLAEQGPFHLLIHALYGDDWRAQLVAFAARHPAVPIVDPPHAIDRLHNRISMLQVVSELDHAADQDSTFGIPSQVVVYDAAALADFGLLAALRFPLIAKPLVADGTAKSHKMSLVYHREGLGKLRPPLVLQEFVNHGGVIFKVYVVGGHVTCVKRRSLPDVSPEDDASAQGSVSFSQVSNLPTERTAEEYYGEKSLEDAVVPPAAFINQIAGGLRRALGLQLFNFDMIRDVRAGDRYLVIDINYFPGYAKMPGYETVLTDFFWEMVHKDGVGNQQEEKGANHVVVK")
+ prompt = Text.from_str("Strongly enhanced InsP6 kinase activity. The mutation in the ITPK protein causes a change in its catalytic activity.")
+ outputs = pipeline.run(
+ protein=protein,
+ text=prompt
+ )
+ print(outputs[0])
+ converter = MutationToSequence()
+ outputs = converter.run([protein for i in range(len(outputs[0][0]))], outputs[0][0])
+ print(outputs[0][0], outputs[1][0])
+ return pipeline
+
+def test_protein_generation():
+ from open_biomed.models.functional_model_registry import PROTEIN_DECODER_REGISTRY
+ from open_biomed.utils.config import Config
+ config = Config(config_file="./configs/model/progen.yaml").model
+ model = PROTEIN_DECODER_REGISTRY["progen"](config)
+ model = model.to("cuda:0")
+ print(model.generate_protein()[0])
+ protein = Protein.from_fasta('GFLPFRGADEGLAAREAATLAARGTAARAYREDSWAVPVPRGLLGDLTARVAALGAASPPPADPLAVTLDLHHVTAEVALTTVLDAATLVHGQTRVLSAEDAAEAATAAAAATEAYLERLQDFVLFMSASVRVWRRGNAAGATGPEWDQWYTVADRDALGSAPTHLAVLGRQADALCHFVLDRVAWGTCGTPLWSGDEDLGNVVATFAGYADRLATAPRDLIM')
+ protein = model.collator([model.featurizer(protein)])
+ protein = {
+ "input_ids": protein["input_ids"].to("cuda:0"),
+ "attention_mask": protein["attention_mask"].to("cuda:0"),
+ }
+ print(model.generate_loss(protein))
+
+
+# TODO: support other datasets
+def test_molecule_property_prediction():
+ OUTPUT_PROMPTS = {
+ "BBBP": "The blood-brain barrier penetration of the molecule is {output}",
+ "SIDER": "The possibility of the molecule to exhibit the side effects are:\n Hepatobiliary disorders: {output[0]:.4f}\n Metabolism and nutrition disorders: {output[1]:.4f}\nProduct issues: {output[2]:.4f}\nEye disorders: {output[3]:.4f}\nInvestigations: {output[4]:.4f}\nMusculoskeletal and connective tissue disorders: {output[5]:.4f}\nGastrointestinal disorders :{output[6]:.4f}\nSocial circumstances: {output[7]:.4f}\nImmune system disorders: {output[8]:.4f}\nReproductive system and breast disorders: {output[9]:.4f}\nNeoplasms benign, malignant and unspecified (incl cysts and polyps): {output[10]:.4f}\nGeneral disorders and administration site conditions: {output[11]:.4f}\nEndocrine disorders: {output[12]:.4f}\nSurgical and medical procedures: {output[13]:.4f}\nVascular disorders: {output[14]:.4f}\nBlood and lymphatic system disorders: {output[15]:.4f}\nSkin and subcutaneous tissue disorders: {output[16]:.4f}\nCongenital, familial and genetic disorders: {output[17]:.4f}\nInfections and infestations: {output[18]:.4f}\nRespiratory, thoracic and mediastinal disorders: {output[19]:.4f}\nPsychiatric disorders: {output[20]:.4f}\nRenal and urinary disorders: {output[21]:.4f}\nPregnancy, puerperium and perinatal conditions: {output[22]:.4f}\nEar and labyrinth disorders: {output[23]:.4f}\nCardiac disorders: {output[24]:.4f}\nNervous system disorders: {output[25]:.4f}\nInjury, poisoning and procedural complications: {output[26]:.4f}\n",
+ }
+ OUTPUT_PROMPTS_REGRESSION = {
+ "caco2_wang": "The rate of drug passing through the Caco-2 cells is {output}",
+ "half_life_obach": "The half-life of the molecule is {output}",
+ "ld50_zhu": "The most conservative dose of the molecule that can lead to lethal adverse effects is {output}",
+ }
+ pipelines = {}
+ for task in OUTPUT_PROMPTS:
+ pipelines[task] = InferencePipeline(
+ task="molecule_property_prediction",
+ model="graphmvp",
+ model_ckpt=f"./checkpoints/server/graphmvp-{task}.ckpt",
+ additional_config=f"./configs/dataset/{task.lower()}.yaml",
+ device="cuda:0",
+ output_prompt=OUTPUT_PROMPTS[task],
+ )
+ for task in OUTPUT_PROMPTS_REGRESSION:
+ pipelines[task] = InferencePipeline(
+ task="molecule_property_prediction_regression",
+ model="graphmvp_regression",
+ model_ckpt=f"./checkpoints/server/graphmvp-{task}.ckpt",
+ additional_config=f"./configs/dataset/{task.lower()}.yaml",
+ device="cuda:0",
+ output_prompt=OUTPUT_PROMPTS_REGRESSION[task],
+ )
+ pipeline = EnsemblePipeline(pipelines)
+ input_smiles = "Nc1[nH]c(C(=O)c2ccccc2)c(-c2ccccn2)c1C(=O)c1c[nH]c2ccc(Br)cc12"
+ for task in OUTPUT_PROMPTS:
+ outputs = pipeline.run(
+ molecule=Molecule.from_smiles(input_smiles),
+ task=task,
+ )
+ print(outputs)
+ for task in OUTPUT_PROMPTS_REGRESSION:
+ outputs = pipeline.run(
+ molecule=Molecule.from_smiles(input_smiles),
+ task=task,
+ )
+ print(outputs)
+ return pipeline
+
+
+def test_protein_folding():
+ pipeline = InferencePipeline(
+ task="protein_folding",
+ model="esmfold",
+ model_ckpt="./checkpoints/server/esmfold.ckpt",
+ device="cuda:1"
+ )
+ protein = Protein.from_fasta("MASDAAAEPSSGVTHPPRYVIGYALAPKKQQSFIQPSLVAQAASRGMDLVPVDASQPLAEQGPFHLLIHALYGDDWRAQLVAFAARHPAVPIVDPPHAIDRLHNRISMLQVVSELDHAADQDSTFGIPSQVVVYDAAALADFGLLAALRFPLIAKPLVADGTAKSHKMSLVYHREGLGKLRPPLVLQEFVNHGGVIFKVYVVGGHVTCVKRRSLPDVSPEDDASAQGSVSFSQVSNLPTERTAEEYYGEKSLEDAVVPPAAFINQIAGGLRRALGLQLFNFDMIRDVRAGDRYLVIDINYFPGYAKMPGYETVLTDFFWEMVHKDGVGNQQEEKGANHVVVK")
+ outputs = pipeline.run(
+ protein=protein,
+ )
+ print(outputs[0][0], outputs[1][0])
+ return pipeline
+
+INFERENCE_UNIT_TESTS = {
+ "text_based_molecule_editing": test_text_based_molecule_editing,
+ "pocket_molecule_docking": test_pocket_molecule_docking,
+ "structure_based_drug_design": test_structure_based_drug_design,
+ "molecule_question_answering": test_molecule_question_answering,
+ "protein_question_answering": test_protein_question_answering,
+ "mutation_explanation": test_mutation_explanation,
+ "mutation_engineering": test_mutation_engineering,
+ "protein_generation": test_protein_generation,
+ "molecule_property_prediction": test_molecule_property_prediction,
+ "protein_folding": test_protein_folding,
+}
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--task", type=str, default="protein_folding")
+ args = parser.parse_args()
+
+ if args.task not in INFERENCE_UNIT_TESTS:
+ raise NotImplementedError(f"{args.task} is not currently supported!")
+ else:
+ INFERENCE_UNIT_TESTS[args.task]()
+
\ No newline at end of file
diff --git a/open_biomed/scripts/run_server.py b/open_biomed/scripts/run_server.py
new file mode 100644
index 0000000000000000000000000000000000000000..b3eb345a4c89b4f4fedc3085fe483f413a6431e9
--- /dev/null
+++ b/open_biomed/scripts/run_server.py
@@ -0,0 +1,631 @@
+from fastapi import FastAPI, HTTPException
+from pydantic import BaseModel
+import torch.nn.functional as F
+import uvicorn
+import random
+import copy
+import asyncio
+import logging
+import subprocess
+from typing import Optional, List, Dict, Callable, Any, Literal
+
+# import function
+from open_biomed.data import Molecule, Text, Protein, Pocket
+from open_biomed.core.tool_misc import MutationToSequence
+from open_biomed.core.oss_warpper import oss_warpper
+from open_biomed.core.tool_registry import TOOLS
+
+
+app = FastAPI()
+
+
+class IO_Reader:
+ def __init__(self):
+ pass
+ @staticmethod
+ def get_molecule(string):
+ if string.endswith(".sdf"):
+ return Molecule.from_sdf_file(string)
+ elif string.endswith(".pkl"):
+ return Molecule.from_binary_file(string)
+ else:
+ return Molecule.from_smiles(string)
+
+ @staticmethod
+ def get_protein(string):
+ if string.endswith(".pdb"):
+ return Protein.from_pdb_file(string)
+ elif string.endswith(".pkl"):
+ return Protein.from_binary_file(string)
+ else:
+ return Protein.from_fasta(string)
+
+ @staticmethod
+ def get_pocket(string):
+ return Pocket.from_binary_file(string)
+
+ @staticmethod
+ def get_text(string):
+ return Text.from_str(string)
+
+
+
+
+molecule_property_prediction_prompt = {
+ "BBBP": "The blood-brain barrier prediction result is {output}. "
+ "This result indicates the model's prediction of whether the compound can effectively penetrate the blood-brain barrier. "
+ "A positive result suggests that the compound may have potential for central nervous system targeting, "
+ "while a negative result implies limited permeability.",
+
+ "ClinTox": "The clinical toxicity prediction result is {output}. "
+ "This result reflects the model's assessment of the likelihood that the compound will fail clinical trials due to toxicity concerns. "
+ "A positive result indicates a higher risk of toxicity, while a negative result suggests the compound is less likely to exhibit significant toxicity in clinical settings.",
+
+ "Tox21": "The Tox21 toxicity assessment result is {output}. "
+ "This result provides an evaluation of the compound's potential toxicity, focusing on nuclear receptors and stress response pathways. "
+ "A positive result indicates the presence of toxic effects, while a negative result suggests the compound is less likely to exhibit these toxicities.",
+
+ "ToxCast": "The ToxCast toxicity screening result is {output}. "
+ "This result is based on high-throughput in vitro screening and indicates the compound's potential toxicity profile. "
+ "A positive result suggests significant toxicity, while a negative result implies lower toxicity risk.",
+
+ "SIDER": "The SIDER adverse drug reaction analysis result is {output}. "
+ "This result provides insights into the potential adverse drug reactions (ADRs) associated with the compound. "
+ "A positive result indicates a higher likelihood of adverse reactions, while a negative result suggests fewer potential ADRs.",
+
+ "HIV": "The HIV inhibition prediction result is {output}. "
+ "This result indicates the model's prediction of the compound's ability to inhibit HIV replication. "
+ "A positive result suggests strong inhibitory activity, while a negative result implies limited effectiveness against HIV.",
+
+ "BACE": "The BACE-1 activity prediction result is {output}. "
+ "This result provides a prediction of the compound's binding affinity to human β-secretase 1 (BACE-1). "
+ "A positive result indicates strong binding activity, suggesting potential as a BACE-1 inhibitor, while a negative result implies weaker binding.",
+
+ "MUV": "The MUV virtual screening validation result is {output}. "
+ "This result indicates the model's assessment of the compound's potential as a hit in virtual screening. "
+ "A positive result suggests the compound is likely to be active against the target, while a negative result implies lower activity."
+}
+
+
+# Define the request body model
+class TaskRequest(BaseModel):
+ task: str
+ model: Optional[str] = None
+ config: Optional[str] = None
+ visualize: Optional[str] = None
+ molecule: Optional[str] = None
+ protein: Optional[str] = None
+ pocket: Optional[str] = None
+ text: Optional[str] = None
+ dataset: Optional[str] = None
+ query: Optional[str] = None
+ mutation: Optional[str] = None
+ indices: Optional[str] = None
+ property: Optional[Literal["QED", "SA", "LogP", "Lipinski"]] = None
+ molecule_1: Optional[str] = None
+ molecule_2: Optional[str] = None
+ similarity: Optional[float] = None
+ value: Optional[str] = None
+
+
+class SearchRequest(BaseModel):
+ task: str
+ query: Optional[str] = None
+ molecule: Optional[str] = None
+ threshold: Optional[str] = None
+
+
+class TaskConfig:
+ def __init__(self, task_name: str, required_inputs: List[str], pipeline_key: str, handler_function: Callable, is_async: bool = False):
+ self.task_name = task_name
+ self.required_inputs = required_inputs
+ self.pipeline_key = pipeline_key
+ self.handler_function = handler_function
+ self.is_async = is_async
+
+ def validate_inputs(self, request: Dict[str, Any]):
+ missing_inputs = [key for key in self.required_inputs if key not in request]
+ if missing_inputs:
+ raise HTTPException(status_code=400, detail=f"Missing required inputs: {', '.join(missing_inputs)}")
+
+
+
+class TaskLoader:
+ def __init__(self):
+ self.tasks = {}
+
+ def register_task(self, task_config: TaskConfig):
+ self.tasks[task_config.task_name] = task_config
+
+ def get_task(self, task_name: str):
+ task = self.tasks.get(task_name)
+ if not task:
+ raise HTTPException(status_code=400, detail="Invalid task_name")
+ return task
+
+
+
+# Handlers for run_pipeline
+def handle_text_based_molecule_editing(request: TaskRequest, pipeline):
+ required_inputs = ["molecule", "text"]
+ molecule = IO_Reader.get_molecule(request.molecule)
+ text = IO_Reader.get_text(request.text)
+ outputs = pipeline.run(molecule=molecule, text=text)
+ smiles = outputs[0][0].smiles
+ path = outputs[1][0]
+ return {"task": request.task, "model": request.model, "molecule": path, "molecule_preview": smiles}
+
+def handle_structure_based_drug_design(request: TaskRequest, pipeline):
+ required_inputs = ["pocket"]
+ pocket = Pocket.from_binary_file(request.pocket)
+ outputs = pipeline.run(pocket=pocket)
+ smiles = outputs[0][0].smiles
+ path = outputs[1][0]
+ return {"task": request.task, "model": request.model, "molecule": path, "molecule_preview": smiles}
+
+def handle_molecule_question_answering(request: TaskRequest, pipeline):
+ required_inputs = ["text", "molecule"]
+ text = IO_Reader.get_text(request.text)
+ molecule = IO_Reader.get_molecule(request.molecule)
+ outputs = pipeline.run(molecule=molecule, text=text)
+ text = outputs[0][0].str
+ return {"task": request.task, "model": request.model, "text": text}
+
+def handle_protein_question_answering(request: TaskRequest, pipeline):
+ required_inputs = ["text", "protein"]
+ text = IO_Reader.get_text(request.text)
+ protein = IO_Reader.get_protein(request.protein)
+ outputs = pipeline.run(protein=protein, text=text)
+ text = outputs[0][0].str
+ return {"task": request.task, "model": request.model, "text": text}
+
+def handle_visualize_molecule(request: TaskRequest, pipeline):
+ required_inputs = ["molecule"]
+ #ligand = Molecule.from_binary_file(request.molecule)
+ #outputs = pipeline.run(ligand, config="ball_and_stick", rotate=False)
+ vis_process = [
+ "python3", "./open_biomed/core/visualize.py",
+ "--task", "visualize_molecule",
+ "--molecule_config", request.visualize,
+ "--save_output_filename", "./tmp/molecule_visualization_file.txt",
+ "--molecule", request.molecule]
+ subprocess.Popen(vis_process).communicate()
+ outputs = open("./tmp/molecule_visualization_file.txt", "r").read()
+ oss_file_path = oss_warpper.generate_file_name(outputs)
+ outputs = oss_warpper.upload(oss_file_path, outputs)
+ return {"task": request.task, "image": outputs}
+
+def handle_visualize_complex(request: TaskRequest, pipeline):
+ required_inputs = ["protein", "molecule"]
+ #ligand = Molecule.from_binary_file(request.molecule)
+ #protein = Protein.from_pdb_file(request.protein)
+ #outputs = pipeline.run(molecule=ligand, protein=protein, rotate=True)
+ vis_process = [
+ "python3", "./open_biomed/core/visualize.py",
+ "--task", "visualize_complex",
+ "--save_output_filename", "./tmp/complex_visualization_file.txt",
+ "--molecule", request.molecule,
+ "--protein", request.protein]
+ subprocess.Popen(vis_process).communicate()
+ outputs = open("./tmp/complex_visualization_file.txt", "r").read()
+ oss_file_path = oss_warpper.generate_file_name(outputs)
+ outputs = oss_warpper.upload(oss_file_path, outputs)
+ return {"task": request.task, "image": outputs}
+
+def handle_molecule_property_prediction(request: TaskRequest, pipeline):
+ required_inputs = ["molecule", "dataset"]
+ molecule = IO_Reader.get_molecule(request.molecule)
+ dataset = IO_Reader.get_text(request.dataset)
+ outputs = pipeline.run(molecule=molecule, task=dataset.str)
+
+ #output = outputs[0][0].cpu()
+ #output = F.softmax(output, dim=0).tolist()
+ return {"task": request.task, "model": request.model, "score": outputs[0][0]}
+
+def handle_protein_binding_site_prediction(request: TaskRequest, pipeline):
+ required_inputs = ["protein"]
+ protein = IO_Reader.get_protein(request.protein)
+ outputs = pipeline.run(protein=protein)
+ output = outputs[1][0]
+ pocket_preview = str(outputs[0][0])
+ return {"task": request.task, "model": request.model, "pocket": output, "pocket_preview": pocket_preview}
+
+def handle_protein_folding(request: TaskRequest, pipeline):
+ required_inputs = ["protein"]
+ protein = IO_Reader.get_protein(request.protein)
+ outputs = pipeline.run(protein=protein)
+ protein = outputs[1][0]
+ return {"task": request.task, "model": request.model, "protein": protein}
+
+
+# Handlers for web_search
+async def handle_molecule_name_request(request: SearchRequest, requester):
+ outputs = await requester.run(request.query)
+ smiles = outputs[0][0].smiles
+ output = outputs[1][0]
+ return {"task": request.task, "molecule": output, "molecule_preview": smiles}
+
+def handle_web_search(request: SearchRequest, requester):
+ outputs = requester.run(request.query)
+ outputs = outputs[0][0]
+ return {"task": request.task, "text": outputs}
+
+async def handle_molecule_structure_request(request: SearchRequest, requester):
+ molecule = IO_Reader.get_molecule(request.molecule)
+ threshold = request.threshold
+ outputs = await requester.run(molecule, threshold=float(threshold), max_records=1)
+ # Pick a random molecule
+ index = random.randint(0, len(outputs[1])-1)
+ molecule = outputs[1][index]
+ molecule_preview = outputs[0][index].smiles
+ return {"task": request.task, "molecule": molecule, "molecule_preview": molecule_preview}
+
+
+async def handle_protein_uniprot_request(request: SearchRequest, requester):
+ outputs = await requester.run(request.query)
+ outputs = outputs[1][0]
+ protein = IO_Reader.get_protein(outputs)
+ protein_preview = str(protein)
+ return {"task": request.task, "protein": outputs, "protein_preview": protein_preview}
+
+
+async def handle_protein_pdb_request(request: SearchRequest, requester):
+ outputs = await requester.run(request.query)
+ outputs = outputs[1][0]
+ protein = IO_Reader.get_protein(outputs)
+ protein_preview = str(protein)
+ return {"task": request.task, "protein": outputs, "protein_preview": protein_preview}
+
+
+def handle_mutation_explanation(request: TaskRequest, pipeline):
+ required_inputs = ["protein", "mutation"]
+ mutation = request.mutation
+ protein = IO_Reader.get_protein(request.protein)
+ outputs = pipeline.run(protein=protein, mutation=mutation)
+ output = outputs[0][0]
+ return {"task": request.task, "model":request.model, "text": output}
+
+
+def handle_mutation_engineering(request: TaskRequest, pipeline):
+ required_inputs = ["protein", "text"]
+ protein = IO_Reader.get_protein(request.protein)
+ text = IO_Reader.get_text(request.text)
+ outputs = pipeline.run(protein=protein, text=text)
+ mutation_list = copy.deepcopy(outputs[0][0][:50])
+ mutation = random.choice(outputs[0][0])
+ converter = MutationToSequence()
+ outputs = converter.run([protein], [mutation])
+ protein = outputs[1][0]
+ protein_preview = outputs[0][0].sequence
+ return {"task": request.task, "model":request.model, "mutation": mutation_list, "protein": protein, "protein_preview": protein_preview}
+
+
+def handle_pocket_molecule_docking(request: TaskRequest, pipeline):
+ required_inputs = ["pocket", "molecule"]
+ pocket = Pocket.from_binary_file(request.pocket)
+ molecule = IO_Reader.get_molecule(request.molecule)
+ outputs = pipeline.run(pocket=pocket, molecule=molecule)
+ output = outputs[1][0]
+ return {"task": request.task, "model":request.model, "molecule": output}
+
+
+def handle_protein_molecule_docking_score(request: TaskRequest, pipeline):
+ required_inputs = ["protein", "molecule"]
+ protein = IO_Reader.get_protein(request.protein)
+ molecule = IO_Reader.get_molecule(request.molecule)
+ outputs = pipeline.run(protein=protein, molecule=molecule)
+ output = outputs[0][0]
+ return {"task": request.task, "model":request.model, "score": str(output)}
+
+
+def handle_visualize_protein(request: TaskRequest, pipeline):
+ required_inputs = ["protein"]
+ protein = IO_Reader.get_protein(request.protein)
+ vis_process = [
+ "python3", "./open_biomed/core/visualize.py",
+ "--task", "visualize_protein",
+ "--protein_config", request.visualize,
+ "--save_output_filename", "./tmp/protein_visualization_file.txt",
+ "--protein", request.protein]
+ subprocess.Popen(vis_process).communicate()
+ outputs = open("./tmp/protein_visualization_file.txt", "r").read()
+ oss_file_path = oss_warpper.generate_file_name(outputs)
+ outputs = oss_warpper.upload(oss_file_path, outputs)
+ return {"task": request.task, "image": outputs}
+
+
+def handle_visualize_protein_pocket(request: TaskRequest, pipeline):
+ required_inputs = ["protein", "pocket"]
+ protein = IO_Reader.get_protein(request.protein)
+ pocket = IO_Reader.get_pocket(request.pocket)
+ vis_process = [
+ "python3", "./open_biomed/core/visualize.py",
+ "--task", "visualize_protein_pocket",
+ "--save_output_filename", "./tmp/protein_pocket_visualization_file.txt",
+ "--protein", request.protein,
+ "--pocket", request.pocket]
+ subprocess.Popen(vis_process).communicate()
+ outputs = open("./tmp/protein_pocket_visualization_file.txt", "r").read()
+ oss_file_path = oss_warpper.generate_file_name(outputs)
+ outputs = oss_warpper.upload(oss_file_path, outputs)
+ return {"task": request.task, "image": outputs}
+
+
+def handle_export_molecule(request: TaskRequest, pipeline):
+ required_inputs = ["molecule"]
+ molecule = IO_Reader.get_molecule(request.molecule)
+ files = pipeline.run([molecule])
+ oss_file_path = oss_warpper.generate_file_name(files[0])
+ outputs = oss_warpper.upload(oss_file_path, files[0])
+ return {"task": request.task, "file": outputs}
+
+
+def handle_export_protein(request: TaskRequest, pipeline):
+ required_inputs = ["protein"]
+ protein = IO_Reader.get_protein(request.protein)
+ files = pipeline.run([protein])
+ oss_file_path = oss_warpper.generate_file_name(files[0])
+ outputs = oss_warpper.upload(oss_file_path, files[0])
+ return {"task": request.task, "file": outputs}
+
+
+def handle_import_pocket(request: TaskRequest, pipeline):
+ required_inputs = ["protein", "indices"]
+ protein = IO_Reader.get_protein(request.protein)
+ indices = [int(i) - 1 for i in request.indices.split(";")]
+ pockets, files = pipeline.run([protein], [indices])
+ return {"task": request.task, "pocket": files[0], "pocket_preview": str(pockets[0])}
+
+# 25
+def handle_molecule_similarity(request: TaskRequest, pipeline):
+ required_inputs = ["molecule_1", "molecule_2"]
+ molecule_1 = IO_Reader.get_molecule(request.molecule_1)
+ molecule_2 = IO_Reader.get_molecule(request.molecule_2)
+ outputs = pipeline.run(molecule_1=molecule_1, molecule_2=molecule_2)
+ return {"task": request.task, "model":request.model, "similarity": outputs}
+
+# 26
+def handle_molecule_property_calculation(request: TaskRequest, pipeline):
+ required_inputs = ["molecule", "property"]
+ molecule = IO_Reader.get_molecule(request.molecule)
+ property = request.property
+ outputs = pipeline.run(molecule=molecule, property=property)
+ return {"task": request.task, "model":request.model, "score": round(outputs, 5)}
+
+
+TASK_CONFIGS = [
+ {
+ "task_name": "text_based_molecule_editing",
+ "required_inputs": ["molecule", "text"],
+ "pipeline_key": "text_based_molecule_editing",
+ "handler_function": handle_text_based_molecule_editing,
+ "is_async": False
+ },
+ {
+ "task_name": "structure_based_drug_design",
+ "required_inputs": ["pocket"],
+ "pipeline_key": "structure_based_drug_design",
+ "handler_function": handle_structure_based_drug_design,
+ "is_async": False
+ },
+ {
+ "task_name": "molecule_question_answering",
+ "required_inputs": ["text", "molecule"],
+ "pipeline_key": "molecule_question_answering",
+ "handler_function": handle_molecule_question_answering,
+ "is_async": False
+ },
+ {
+ "task_name": "protein_question_answering",
+ "required_inputs": ["text", "protein"],
+ "pipeline_key": "protein_question_answering",
+ "handler_function": handle_protein_question_answering,
+ "is_async": False
+ },
+ {
+ "task_name": "visualize_molecule",
+ "required_inputs": ["visualize", "molecule"],
+ "pipeline_key": "visualize_molecule",
+ "handler_function": handle_visualize_molecule,
+ "is_async": False
+ },
+ {
+ "task_name": "visualize_complex",
+ "required_inputs": ["protein", "molecule"],
+ "pipeline_key": "visualize_complex",
+ "handler_function": handle_visualize_complex,
+ "is_async": False
+ },
+ {
+ "task_name": "visualize_protein",
+ "required_inputs": ["visualize", "protein"],
+ "pipeline_key": "visualize_protein",
+ "handler_function": handle_visualize_protein,
+ "is_async": False
+ },
+ {
+ "task_name": "visualize_protein_pocket",
+ "required_inputs": ["protein", "pocket"],
+ "pipeline_key": "visualize_protein_pocket",
+ "handler_function": handle_visualize_protein_pocket,
+ "is_async": False
+ },
+ {
+ "task_name": "molecule_property_prediction",
+ "required_inputs": ["molecule", "dataset"],
+ "pipeline_key": "molecule_property_prediction",
+ "handler_function": handle_molecule_property_prediction,
+ "is_async": False
+ },
+ {
+ "task_name": "protein_binding_site_prediction",
+ "required_inputs": ["protein"],
+ "pipeline_key": "protein_binding_site_prediction",
+ "handler_function": handle_protein_binding_site_prediction,
+ "is_async": False
+ },
+ {
+ "task_name": "protein_folding",
+ "required_inputs": ["protein"],
+ "pipeline_key": "protein_folding",
+ "handler_function": handle_protein_folding,
+ "is_async": False
+ },
+ {
+ "task_name": "molecule_name_request",
+ "required_inputs": ["query"],
+ "pipeline_key": "molecule_name_request",
+ "handler_function": handle_molecule_name_request,
+ "is_async": True
+ },
+ {
+ "task_name": "web_search",
+ "required_inputs": ["query"],
+ "pipeline_key": "web_search",
+ "handler_function": handle_web_search,
+ "is_async": False
+ },
+ {
+ "task_name": "molecule_structure_request",
+ "required_inputs": ["molecule", "threshold"],
+ "pipeline_key": "molecule_structure_request",
+ "handler_function": handle_molecule_structure_request,
+ "is_async": True
+ },
+ {
+ "task_name": "protein_uniprot_request",
+ "required_inputs": ["query"],
+ "pipeline_key": "protein_uniprot_request",
+ "handler_function": handle_protein_uniprot_request,
+ "is_async": True
+ },
+ {
+ "task_name": "protein_pdb_request",
+ "required_inputs": ["query"],
+ "pipeline_key": "protein_pdb_request",
+ "handler_function": handle_protein_pdb_request,
+ "is_async": True
+ },
+ {
+ "task_name": "mutation_explanation",
+ "required_inputs": ["mutation", "protein"],
+ "pipeline_key": "mutation_explanation",
+ "handler_function": handle_mutation_explanation,
+ "is_async": False
+ },
+ {
+ "task_name": "mutation_engineering",
+ "required_inputs": ["text", "protein"],
+ "pipeline_key": "mutation_engineering",
+ "handler_function": handle_mutation_engineering,
+ "is_async": False
+ },
+ {
+ "task_name": "pocket_molecule_docking",
+ "required_inputs": ["pocket", "molecule"],
+ "pipeline_key": "pocket_molecule_docking",
+ "handler_function": handle_pocket_molecule_docking,
+ "is_async": False
+ },
+ {
+ "task_name": "protein_molecule_docking_score",
+ "required_inputs": ["protein", "molecule"],
+ "pipeline_key": "protein_molecule_docking_score",
+ "handler_function": handle_protein_molecule_docking_score,
+ "is_async": False
+ },
+ {
+ "task_name": "export_molecule",
+ "required_inputs": ["molecule"],
+ "pipeline_key": "export_molecule",
+ "handler_function": handle_export_molecule,
+ "is_async": False
+ },
+ {
+ "task_name": "export_protein",
+ "required_inputs": ["protein"],
+ "pipeline_key": "export_protein",
+ "handler_function": handle_export_protein,
+ "is_async": False
+ },
+ {
+ "task_name": "import_pocket",
+ "required_inputs": ["pocket", "indices"],
+ "pipeline_key": "import_pocket",
+ "handler_function": handle_import_pocket,
+ "is_async": False
+ },
+ {
+ "task_name": "molecule_similarity", # 25
+ "required_inputs": ["molecule_1", "molecule_2"],
+ "pipeline_key": "molecule_similarity",
+ "handler_function": handle_molecule_similarity,
+ "is_async": False
+ },
+ {
+ "task_name": "molecule_property_calculation", # 25
+ "required_inputs": ["molecule", "property"],
+ "pipeline_key": "molecule_property_calculation",
+ "handler_function": handle_molecule_property_calculation,
+ "is_async": False
+ }
+
+
+]
+
+
+task_loader = TaskLoader()
+
+for task_config in TASK_CONFIGS:
+ task_loader.register_task(TaskConfig(
+ task_name=task_config["task_name"],
+ required_inputs=task_config["required_inputs"],
+ pipeline_key=task_config["pipeline_key"],
+ handler_function=task_config["handler_function"],
+ is_async=task_config["is_async"]
+ ))
+
+
+
+
+@app.post("/run_pipeline/")
+async def run_pipeline(request: TaskRequest):
+ task_name = request.task.lower()
+ logging.info(request)
+ try:
+ task_config = task_loader.get_task(task_name)
+ task_config.validate_inputs(request.model_dump())
+ pipeline = TOOLS[task_config.pipeline_key]
+ output = task_config.handler_function(request, pipeline)
+ return output
+ except Exception as e:
+ print(e)
+ raise HTTPException(status_code=500, detail=str(e))
+
+
+@app.post("/web_search/")
+async def web_search(request: SearchRequest):
+ task_name = request.task.lower()
+
+ try:
+ task_config = task_loader.get_task(task_name)
+ task_config.validate_inputs(request.model_dump())
+ requester = TOOLS[task_config.pipeline_key]
+
+ if task_config.is_async:
+ output = await task_config.handler_function(request, requester)
+ else:
+ output = task_config.handler_function(request, requester)
+ return output
+ except Exception as e:
+ print(e)
+ raise HTTPException(status_code=500, detail=str(e))
+
+
+@app.get("/healthz")
+def ping():
+ return "Service available"
+
+
+if __name__ == "__main__":
+ uvicorn.run(app, host="0.0.0.0", port=8082)
diff --git a/open_biomed/scripts/run_server_workflow.py b/open_biomed/scripts/run_server_workflow.py
new file mode 100644
index 0000000000000000000000000000000000000000..7a052ff5f10fcf9b3b66d5515f5f9af28c342170
--- /dev/null
+++ b/open_biomed/scripts/run_server_workflow.py
@@ -0,0 +1,51 @@
+import os
+import sys
+sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
+
+from fastapi import FastAPI, HTTPException
+from pydantic import BaseModel
+import uvicorn
+import asyncio
+
+# import function
+from open_biomed.core.llm_request import ReportGeneratorSBDD, ReportGeneratorGeneral
+
+app = FastAPI()
+
+# Define the request body model
+class ReportRequest(BaseModel):
+ task: str
+ workflow: str
+ user_email: str
+ num_repeats: int
+
+@app.post("/run_workflow/")
+async def run_workflow(request: ReportRequest):
+ request = request.model_dump()
+ task = request["task"].lower()
+ try:
+ if task == "drug_design":
+ requester = ReportGeneratorSBDD()
+ else:
+ requester = ReportGeneratorGeneral()
+
+ required_inputs = ["workflow", "user_email", "num_repeats"]
+ if not all(key in request for key in required_inputs):
+ raise HTTPException(
+ status_code=400, detail="workflow config file is required for report generation task")
+
+ asyncio.create_task(requester.run(workflow=request["workflow"], user_email= request["user_email"], num_repeats=request["num_repeats"]))
+
+ return {"type": task+"_report", "content": "Workflow is still running...", "thinking": ""}
+ except Exception as e:
+ print(e)
+ raise HTTPException(status_code=500, detail=str(e))
+
+
+@app.get("/healthz")
+def ping():
+ return "Service available"
+
+
+if __name__ == "__main__":
+ uvicorn.run(app, host="0.0.0.0", port=8083, limit_concurrency=2)
diff --git a/open_biomed/scripts/train.py b/open_biomed/scripts/train.py
new file mode 100644
index 0000000000000000000000000000000000000000..9744501b58284a572bfc7279ba530d0e5a0d0561
--- /dev/null
+++ b/open_biomed/scripts/train.py
@@ -0,0 +1,9 @@
+import os
+import sys
+sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
+
+from open_biomed.core.pipeline import TrainValPipeline
+
+if __name__ == "__main__":
+ pipeline = TrainValPipeline()
+ pipeline.run()
\ No newline at end of file
diff --git a/open_biomed/tasks/__init__.py b/open_biomed/tasks/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3dabc48266c4777890de2cb3e2deef1eaa886e03
--- /dev/null
+++ b/open_biomed/tasks/__init__.py
@@ -0,0 +1,36 @@
+from typing import Optional
+
+from open_biomed.tasks.multi_modal_tasks.text_based_molecule_editing import TextMoleculeEditing
+from open_biomed.tasks.multi_modal_tasks.molecule_text_translation import MoleculeCaptioning
+from open_biomed.tasks.multi_modal_tasks.text_guided_molecule_generation import TextGuidedMoleculeGeneration
+from open_biomed.tasks.multi_modal_tasks.molecule_question_answering import MoleculeQA
+from open_biomed.tasks.multi_modal_tasks.protein_text_translation import TextBasedProteinGeneration
+from open_biomed.tasks.multi_modal_tasks.protein_question_answering import ProteinQA
+from open_biomed.tasks.multi_modal_tasks.mutation_text_translation import MutationExplanation, MutationEngineering
+from open_biomed.tasks.aidd_tasks.molecule_property_prediction import MoleculePropertyPrediction, MoleculePropertyPredictionRegression
+from open_biomed.tasks.aidd_tasks.protein_molecule_docking import PocketMoleculeDocking
+from open_biomed.tasks.aidd_tasks.structure_based_drug_design import StructureBasedDrugDesign
+from open_biomed.tasks.aidd_tasks.protein_folding import ProteinFolding
+from open_biomed.tasks.aidd_tasks.cell_annotation import CellAnnotation
+
+TASK_REGISTRY = {
+ "text_based_molecule_editing": TextMoleculeEditing,
+ "molecule_captioning": MoleculeCaptioning,
+ "text_guided_molecule_generation": TextGuidedMoleculeGeneration,
+ "molecule_question_answering": MoleculeQA,
+ "protein_question_answering": ProteinQA,
+ "text_based_protein_generation": TextBasedProteinGeneration,
+ "molecule_property_prediction": MoleculePropertyPrediction,
+ "molecule_property_prediction_regression": MoleculePropertyPredictionRegression,
+ "pocket_molecule_docking": PocketMoleculeDocking,
+ "structure_based_drug_design": StructureBasedDrugDesign,
+ "mutation_explanation": MutationExplanation,
+ "mutation_engineering": MutationEngineering,
+ "protein_folding": ProteinFolding,
+ "cell_annotation": CellAnnotation,
+}
+
+def check_compatible(task_name: str, dataset_name: Optional[str], model_name: Optional[str]) -> None:
+ # Check if the dataset and model supports the task
+ # If not, raise NotImplementedError
+ pass
\ No newline at end of file
diff --git a/open_biomed/tasks/aidd_tasks/__init__.py b/open_biomed/tasks/aidd_tasks/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/tasks/aidd_tasks/cell_annotation.py b/open_biomed/tasks/aidd_tasks/cell_annotation.py
new file mode 100644
index 0000000000000000000000000000000000000000..e09ba6dea76b06f0faecfc77b0b961b819920c55
--- /dev/null
+++ b/open_biomed/tasks/aidd_tasks/cell_annotation.py
@@ -0,0 +1,50 @@
+from typing import Dict, List, Tuple, Optional
+from typing_extensions import Any
+
+import json
+import logging
+import os
+import numpy as np
+import pytorch_lightning as pl
+from sklearn.metrics import (accuracy_score, average_precision_score,
+ roc_auc_score)
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+import torch
+
+from open_biomed.data import molecule_fingerprint_similarity, check_identical_molecules
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class CellAnnotation(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage():
+ return "\n".join([
+ 'Cell annotation.',
+ 'Inputs: {"cell": a cell. "class_texts": text descriptions of the cell types.}',
+ "Outputs: A classification result in Int."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("cell_annotation", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("cell_annotation", model_cfg, train_cfg)
+
+ # @staticmethod
+ # def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ # return MoleculePropertyPredictionEvaluationCallback()
+
+ # @staticmethod
+ # def get_monitor_cfg() -> Struct:
+ # return Struct(
+ # name="val/roc_auc",
+ # output_str="-{val_roc_auc:.4f}",
+ # mode="max",
+ # )
diff --git a/open_biomed/tasks/aidd_tasks/drug_cell_response_prediction.py b/open_biomed/tasks/aidd_tasks/drug_cell_response_prediction.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/tasks/aidd_tasks/drug_drug_interaction.py b/open_biomed/tasks/aidd_tasks/drug_drug_interaction.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/tasks/aidd_tasks/molecule_design.py b/open_biomed/tasks/aidd_tasks/molecule_design.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/tasks/aidd_tasks/molecule_property_prediction.py b/open_biomed/tasks/aidd_tasks/molecule_property_prediction.py
new file mode 100644
index 0000000000000000000000000000000000000000..8f814339d5ffcccf3ee7c4f1bc2b5203807ad7eb
--- /dev/null
+++ b/open_biomed/tasks/aidd_tasks/molecule_property_prediction.py
@@ -0,0 +1,326 @@
+from typing import Dict, List, Tuple, Optional
+from typing_extensions import Any
+
+import json
+import logging
+import os
+import numpy as np
+import pytorch_lightning as pl
+from sklearn.metrics import (accuracy_score, average_precision_score,
+ roc_auc_score)
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+import torch
+from scipy.stats import spearmanr
+
+
+from open_biomed.data import molecule_fingerprint_similarity, check_identical_molecules
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class MoleculePropertyPrediction(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage():
+ return "\n".join([
+ 'Molecular property prediction.',
+ 'Inputs: {"molecule": a small molecule}',
+ "Outputs: A float number in [0, 1] indicating the likeness of the molecule to exhibit certain properties."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("molecule_property_prediction", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("molecule_property_prediction", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return MoleculePropertyPredictionEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/roc_auc",
+ output_str="-{val_roc_auc:.4f}",
+ mode="max",
+ )
+
+
+class MoleculePropertyPredictionEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.eval_dataset = None
+ self.eval_metric = roc_auc_score
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ self.outputs.extend(outputs)
+ if batch_idx == 0:
+ for i in range(2):
+ out_labels = '\n'.join([str(x) for x in self.eval_dataset.labels[i]])
+ logging.info(f"Original: {self.eval_dataset.molecules[i]}")
+ logging.info(f"Predict: {self.outputs[i]}")
+ logging.info(f"Ground Truth: {out_labels}")
+
+ def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_validation_epoch_start(trainer, pl_module)
+ self.status = "val"
+ self.outputs = []
+ self.eval_dataset = trainer.val_dataloaders.dataset
+
+ def on_validation_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+
+ y_true = np.squeeze(np.array(self.eval_dataset.labels), axis=1)
+
+ self.outputs = [torch.tensor(x) for x in self.outputs]
+
+ # y_scores = torch.unsqueeze(torch.tensor(self.outputs), dim=1).numpy()
+ y_scores_tensor = torch.stack(self.outputs, dim=0)
+ y_scores = y_scores_tensor.cpu().numpy()
+
+ output_str = "\t".join(["roc_auc"]) + "\n"
+
+ roc_list = []
+ for i in range(y_true.shape[1]):
+ # AUC is only defined when there is at least one positive data.
+ if np.sum(y_true[:, i] == 1) > 0 and np.sum(y_true[:, i] == -1) > 0:
+ is_valid = y_true[:, i] ** 2 > 0
+ roc_list.append(self.eval_metric((y_true[is_valid, i] + 1) / 2, y_scores[is_valid, i]))
+ else:
+ print('{} is invalid'.format(i))
+
+ if len(roc_list) < y_true.shape[1]:
+ logging.info(len(roc_list))
+ logging.info('Some target is missing!')
+ logging.info('Missing ratio: %f' %(1 - float(len(roc_list)) / y_true.shape[1]))
+
+ roc_auc = sum(roc_list) / len(roc_list)
+
+ logging.info(f"{self.status}/roc_auc: {roc_auc:.4f}")
+
+ output_str += "\t".join([f"{roc_auc:.4f}"]) + "\n"
+
+ # 更新监控值
+ pl_module.log_dict({f"{self.status}/roc_auc": roc_auc})
+
+ output_path = os.path.join(trainer.default_root_dir, f"{self.status}_outputs", f"epoch{pl_module.current_epoch}")
+
+ # 保存测试结果
+ if trainer.is_global_zero:
+ with open(output_path + "_outputs.txt", "w") as f:
+ f.write(output_str)
+
+ def on_test_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: STEP_OUTPUT,
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0,
+ ) -> None:
+ self.on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+
+ def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_test_epoch_start(trainer, pl_module)
+ self.status = "test"
+ self.outputs = []
+ self.eval_dataset = trainer.test_dataloaders.dataset
+
+ def on_test_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ self.on_validation_epoch_end(trainer, pl_module)
+
+
+class MoleculePropertyPredictionRegression(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage():
+ return "\n".join([
+ 'Molecular property prediction.',
+ 'Inputs: {"molecule": a small molecule}',
+ "Outputs: A float number in indicating the regression result of the molecule's certain properties."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("molecule_property_prediction", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("molecule_property_prediction", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ # TODO:传个参数切换 回归与分类任务的评估方法
+ return MoleculePropertyPredictionRegressionEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/mae",
+ output_str="-{mae:.4f}",
+ mode="min",
+ )
+ # return Struct(
+ # name="val/spearman",
+ # output_str="-{val_spearman:.4f}",
+ # mode="max",
+ # )
+
+class MoleculePropertyPredictionRegressionEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.eval_dataset = None
+ # self.eval_metric = roc_auc_score
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ self.outputs.extend(outputs)
+ if batch_idx == 0:
+ for i in range(2):
+ out_labels = '\n'.join([str(x) for x in self.eval_dataset.labels[i]])
+ logging.info(f"Original: {self.eval_dataset.molecules[i]}")
+ logging.info(f"Predict: {self.outputs[i]}")
+ logging.info(f"Ground Truth: {out_labels}")
+
+ def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_validation_epoch_start(trainer, pl_module)
+ self.status = "val"
+ self.outputs = []
+ self.eval_dataset = trainer.val_dataloaders.dataset
+
+ def on_validation_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+
+ y_true = np.squeeze(np.array(self.eval_dataset.labels), axis=1)
+
+ # y_scores = torch.unsqueeze(torch.tensor(self.outputs), dim=1).numpy()
+ # print(self.outputs)
+ # print(y_true)
+ # print(y_true.shape)
+ # print(len(self.outputs))
+
+ tensors = [torch.tensor(x) for x in self.outputs]
+ y_pred_tensor = torch.stack(tensors, dim=0)
+ y_pred = y_pred_tensor.cpu().numpy()
+
+ # Prepare metrics for regression
+ output_str = "\t".join(["rmse", "mae", "r2", "spearman"]) + "\n"
+
+ rmse_list = []
+ mae_list = []
+ r2_list = []
+ spearman_list = []
+
+ for i in range(y_true.shape[1]):
+ is_valid = ~np.isnan(y_true[:, i]) # Check for valid targets
+ y_true_col = y_true[is_valid, i]
+ y_pred_col = y_pred[is_valid, i]
+
+ if len(y_true_col) > 0: # Only calculate if we have valid samples
+ # Calculate RMSE
+ rmse = np.sqrt(np.mean((y_true_col - y_pred_col) ** 2))
+ rmse_list.append(rmse)
+
+ # Calculate MAE
+ mae = np.mean(np.abs(y_true_col - y_pred_col))
+ mae_list.append(mae)
+
+ # Calculate R²
+ ss_res = np.sum((y_true_col - y_pred_col) ** 2)
+ ss_tot = np.sum((y_true_col - np.mean(y_true_col)) ** 2)
+ r2 = 1 - (ss_res / (ss_tot + 1e-10)) # Small epsilon to avoid division by zero
+ r2_list.append(r2)
+
+ # Calculate Spearman correlation
+ spearman_corr, _ = spearmanr(y_true_col, y_pred_col)
+ spearman_list.append(spearman_corr)
+ else:
+ print(f'Column {i} has no valid targets')
+
+ if len(rmse_list) < y_true.shape[1]:
+ logging.info(f'Valid targets count: {len(rmse_list)}/{y_true.shape[1]}')
+ logging.info('Some target is missing!')
+ logging.info('Missing ratio: %f' % (1 - float(len(rmse_list)) / y_true.shape[1]))
+
+ # Calculate average metrics
+ avg_rmse = np.mean(rmse_list) if rmse_list else np.nan
+ avg_mae = np.mean(mae_list) if mae_list else np.nan
+ avg_r2 = np.mean(r2_list) if r2_list else np.nan
+ avg_spearman = np.mean(spearman_list) if spearman_list else np.nan
+
+ logging.info(f"{self.status}/rmse: {avg_rmse:.4f}")
+ logging.info(f"{self.status}/mae: {avg_mae:.4f}")
+ logging.info(f"{self.status}/r2: {avg_r2:.4f}")
+ logging.info(f"{self.status}/spearman: {avg_spearman:.4f}")
+
+ output_str += "\t".join([f"{avg_rmse:.4f}", f"{avg_mae:.4f}", f"{avg_r2:.4f}", f"{avg_spearman:.4f}"]) + "\n"
+
+ # Log metrics
+ pl_module.log_dict({
+ f"{self.status}/rmse": avg_rmse,
+ f"{self.status}/mae": avg_mae,
+ f"{self.status}/r2": avg_r2,
+ f"{self.status}/spearman": avg_spearman
+ })
+
+ # Save results
+ output_path = os.path.join(trainer.default_root_dir, f"{self.status}_outputs", f"epoch{pl_module.current_epoch}")
+ if trainer.is_global_zero:
+ with open(output_path + "_outputs.txt", "w") as f:
+ f.write(output_str)
+
+
+
+ def on_test_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: STEP_OUTPUT,
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0,
+ ) -> None:
+ self.on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+
+ def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_test_epoch_start(trainer, pl_module)
+ self.status = "test"
+ self.outputs = []
+ self.eval_dataset = trainer.test_dataloaders.dataset
+
+ def on_test_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ self.on_validation_epoch_end(trainer, pl_module)
diff --git a/open_biomed/tasks/aidd_tasks/protein_design.py b/open_biomed/tasks/aidd_tasks/protein_design.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/tasks/aidd_tasks/protein_folding.py b/open_biomed/tasks/aidd_tasks/protein_folding.py
new file mode 100644
index 0000000000000000000000000000000000000000..8f75e50d9d0b65b1656b907bc9fc93430169401e
--- /dev/null
+++ b/open_biomed/tasks/aidd_tasks/protein_folding.py
@@ -0,0 +1,47 @@
+from typing import Optional
+
+import pytorch_lightning as pl
+
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class ProteinFolding(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage():
+ return "\n".join([
+ 'Protein folding prediction.',
+ 'Inputs: {"protein": a protein sequence}',
+ "Outputs: A protein object with 3D structure available."
+ ])
+
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("protein_folding", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("protein_folding", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return FoldingEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/rmsd",
+ output_str="-{val_rmsd:.4f}",
+ mode="min",
+ )
+
+class FoldingEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
+
+ # TODO: Implement the evaluation logic
\ No newline at end of file
diff --git a/open_biomed/tasks/aidd_tasks/protein_molecule_docking.py b/open_biomed/tasks/aidd_tasks/protein_molecule_docking.py
new file mode 100644
index 0000000000000000000000000000000000000000..9d98a34783dbc593125bb0f619b3257de3bebf9b
--- /dev/null
+++ b/open_biomed/tasks/aidd_tasks/protein_molecule_docking.py
@@ -0,0 +1,282 @@
+from typing import List, Optional, Union, Dict, Any
+
+import contextlib
+import copy
+import numpy as np
+import os
+from tqdm import tqdm
+import sys
+import pytorch_lightning as pl
+
+from open_biomed.core.tool import Tool
+from open_biomed.data import Molecule, Protein, calc_mol_rmsd, mol_array_to_conformer
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class PocketMoleculeDocking(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Ligand-pocket docking.',
+ 'Inputs: {"molecule": the ligand, "pocket": the pocket}',
+ "Outputs: A new molecule with 3D coordinates indicating the binding pose."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("pocket_molecule_docking", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("pocket_molecule_docking", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ if callback_cfg is None or getattr(callback_cfg, "rmsd", False):
+ return DockingRMSDEvaluationCallback()
+ else:
+ try:
+ return DockingPoseBustersEvaluationCallback()
+ except ImportError:
+ return DockingRMSDEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/rmsd_mean",
+ output_str="-{val_rmsd_mean:.4f}",
+ mode="min",
+ )
+
+def pbcheck_single(mol_pred: List[Molecule], mol_gt: Molecule, protein: Protein, buster: object) -> List[float]:
+ pdb_path = protein.save_pdb()
+ for mol in mol_pred:
+ mol._add_rdmol()
+ buster_result = buster.bust([mol.rdmol for mol in mol_pred], mol_gt.rdmol, pdb_path)
+ buster_result = buster_result.reset_index().iloc[0].to_dict()
+ return buster_result
+
+def aggregate_pb_results(pb_results: List[Dict[str, Any]]) -> Dict[str, Any]:
+ pbvalid_mol_keys = [
+ "mol_pred_loaded",
+ "mol_cond_loaded",
+ "sanitization",
+ "inchi_convertible",
+ "all_atoms_connected",
+ "bond_lengths",
+ "bond_angles",
+ "internal_steric_clash",
+ "aromatic_ring_flatness",
+ "double_bond_flatness",
+ "internal_energy",
+ ]
+
+ pbvalid_dock_keys = [
+ "protein-ligand_maximum_distance",
+ "minimum_distance_to_protein",
+ "minimum_distance_to_organic_cofactors",
+ "minimum_distance_to_inorganic_cofactors",
+ "minimum_distance_to_waters",
+ "volume_overlap_with_protein",
+ "volume_overlap_with_organic_cofactors",
+ "volume_overlap_with_inorganic_cofactors",
+ "volume_overlap_with_waters",
+ ]
+
+ pbvalid_mol = True
+ for key in pbvalid_mol_keys:
+ pbvalid_mol &= pb_results[0][key]
+ pbvalid_dock = True
+ for key in pbvalid_dock_keys:
+ pbvalid_dock &= pb_results[0][key]
+ return {
+ "pbvalid_mol": pbvalid_mol,
+ "pbvalid_dock": pbvalid_dock,
+ "pbvalid": pbvalid_mol and pbvalid_dock,
+ }
+
+class DockingRMSDEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.rmsds = []
+ self.eval_dataset = None
+
+ def on_validation_batch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule, outputs: Dict[str, Any], batch: Dict[str, Any], batch_idx: int, dataloader_idx: int=0) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ self.outputs.extend(outputs)
+
+ def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_validation_epoch_start(trainer, pl_module)
+ self.status = "val"
+ self.outputs = []
+ self.eval_dataset = trainer.val_dataloaders.dataset
+
+ def on_validation_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ all_rmsd = []
+ for i in tqdm(range(len(self.outputs)), desc="Calculating docking RMSD"):
+ # The decoded molecule may be different due to post-processing such as kekulization, so we only update the conformer.
+ self.outputs[i].rdmol = copy.deepcopy(self.eval_dataset.molecules[i].rdmol)
+ self.outputs[i].rdmol.RemoveAllConformers()
+ self.outputs[i].rdmol.AddConformer(mol_array_to_conformer(self.outputs[i].conformer))
+ rmsd = calc_mol_rmsd(self.outputs[i], self.eval_dataset.molecules[i])
+ all_rmsd.append(rmsd)
+ self.rmsds.append(all_rmsd)
+ pl_module.log(f"{self.status}/rmsd_mean", np.mean(all_rmsd))
+ pl_module.log(f"{self.status}/rmsd_median", np.median(all_rmsd))
+ pl_module.log(f"{self.status}/rmsd < 2Å (%)", np.mean([rmsd < 2 for rmsd in all_rmsd]))
+
+ def on_test_batch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule, outputs: Dict[str, Any], batch: Dict[str, Any], batch_idx: int, dataloader_idx: int=0) -> None:
+ self.on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+
+ def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ # For docking, we may generate multiple poses.
+ super().on_test_epoch_start(trainer, pl_module)
+ if getattr(self, "status", None) != "test":
+ self.status = "test"
+ self.rmsds = []
+ self.eval_dataset = trainer.test_dataloaders.dataset
+ self.outputs = []
+
+ def on_test_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ self.on_validation_epoch_end(trainer, pl_module)
+
+class DockingPoseBustersEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.rmsds = []
+ self.pbresults = {}
+ self.eval_dataset = None
+ try:
+ from posebusters import PoseBusters
+ self.buster = PoseBusters()
+ except ImportError:
+ raise ImportError("PoseBusters not installed. Please install it using `pip install posebusters==0.3.1`.")
+
+ def on_validation_batch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule, outputs: Dict[str, Any], batch: Dict[str, Any], batch_idx: int, dataloader_idx: int=0) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ self.outputs.extend(outputs)
+
+ def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_validation_epoch_start(trainer, pl_module)
+ self.status = "val"
+ self.outputs = []
+ self.eval_dataset = trainer.val_dataloaders.dataset
+
+ def on_validation_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ all_rmsd = []
+ all_pbresults = {}
+ for i in tqdm(range(len(self.outputs)), desc="Calculating docking RMSD"):
+ rmsd = calc_mol_rmsd(self.outputs[i], self.eval_dataset.molecules[i])
+ all_rmsd.append(rmsd)
+ pb_results = pbcheck_single(self.outputs[i], self.eval_dataset.molecules[i], self.eval_dataset.proteins[i], self.buster)
+ for key, value in pb_results.items():
+ if key not in all_pbresults:
+ all_pbresults[key] = []
+ all_pbresults[key].append(value)
+ agg = aggregate_pb_results(pb_results)
+ for key, value in agg.items():
+ if key not in all_pbresults:
+ all_pbresults[key] = []
+ all_pbresults[key].append(value)
+ if "pbvalid & rmsd < 2Å" not in all_pbresults:
+ all_pbresults["pbvalid & rmsd < 2Å"] = []
+ all_pbresults["pbvalid & rmsd < 2Å"].append(rmsd < 2 and agg["pbvalid"])
+ self.rmsds.append(all_rmsd)
+ for key, value in all_pbresults.items():
+ if key not in self.pbresults:
+ self.pbresults[key] = []
+ self.pbresults[key].append(value)
+ pl_module.log(f"{self.status}/{key}", np.mean(value))
+ pl_module.log(f"{self.status}/rmsd_mean", np.mean(all_rmsd))
+ pl_module.log(f"{self.status}/rmsd_median", np.median(all_rmsd))
+
+ def on_test_batch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule, outputs: Dict[str, Any], batch: Dict[str, Any], batch_idx: int, dataloader_idx: int=0) -> None:
+ self.on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+
+ def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ # For docking, we may generate multiple poses.
+ super().on_test_epoch_start(trainer, pl_module)
+ if getattr(self, "status", None) != "test":
+ self.status = "test"
+ self.rmsds = []
+ self.pbresults = {}
+ self.eval_dataset = trainer.test_dataloaders.dataset
+ self.outputs = []
+
+ def on_test_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ self.on_validation_epoch_end(trainer, pl_module)
+
+class VinaDockTask(Tool):
+ def __init__(self, mode: str="dock") -> None:
+ self.mode = mode
+
+ python_path = sys.executable
+ conda_env_root = os.path.dirname(os.path.dirname(python_path))
+ self.pdb2pqr_path = os.path.join(conda_env_root, 'bin', 'pdb2pqr30')
+
+ def print_usage(self) -> str:
+ return "\n".join([
+ 'Ligand-receptor docking.',
+ 'Inputs: {"molecule": the ligand, "protein": the receptor}',
+ "Outputs: A float number indicating the AutoDockVina score of the binding."
+ ])
+
+ def run(self, molecule: Molecule, protein: Protein) -> Union[List[float], List[str]]:
+ sdf_file = molecule.save_sdf()
+ pdb_file = protein.save_pdb()
+ pos = np.array(molecule.conformer)
+ center = (pos.max(0) + pos.min(0)) / 2
+ size = pos.max(0) - pos.min(0) + 5
+ try:
+ from openbabel import pybel
+ from meeko import MoleculePreparation
+ import subprocess
+ from vina import Vina
+ import AutoDockTools
+
+ ob_mol = next(pybel.readfile("sdf", sdf_file))
+ lig_pdbqt = sdf_file.replace(".sdf", ".pdbqt")
+ if not os.path.exists(lig_pdbqt):
+ with open(os.devnull, 'w') as devnull:
+ with contextlib.redirect_stdout(devnull):
+ preparator = MoleculePreparation()
+ preparator.prepare(ob_mol.OBMol)
+ preparator.write_pdbqt_file(lig_pdbqt)
+
+ prot_pqr = pdb_file.replace(".pdb", ".pqr")
+ if not os.path.exists(prot_pqr):
+ subprocess.Popen([self.pdb2pqr_path,'--ff=AMBER', pdb_file, prot_pqr],
+ stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL).communicate()
+ prot_pdbqt = pdb_file.replace(".pdb", ".pdbqt")
+ if not os.path.exists(prot_pdbqt):
+ prepare_receptor = os.path.join(AutoDockTools.__path__[0], 'Utilities24/prepare_receptor4.py')
+ subprocess.Popen(['python3', prepare_receptor, '-r', prot_pqr, '-o', prot_pdbqt],
+ stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL).communicate()
+
+ v = Vina(sf_name='vina', seed=0, verbosity=0)
+ v.set_receptor(prot_pdbqt)
+ v.set_ligand_from_file(lig_pdbqt)
+ v.compute_vina_maps(center=center, box_size=size)
+ if self.mode == "min":
+ score = v.optimize()[0]
+ pose_file = f"./tmp/{molecule.name}_{protein.name}_pose"
+ with open(pose_file, "w") as f:
+ v.write_pose(pose_file, overwrite=True)
+ elif self.mode == 'dock':
+ v.dock(exhaustiveness=8, n_poses=1)
+ score = v.energies(n_poses=1)[0][0]
+ pose_file = "None"
+ elif self.mode == 'score':
+ score = v.score()[0]
+ pose_file = "None"
+ return [score], [pose_file]
+ except ImportError:
+ print("AutoDockVina not installed. This function return 0.0.")
+ return [0.0], ["0.0"]
\ No newline at end of file
diff --git a/open_biomed/tasks/aidd_tasks/protein_property_prediction.py b/open_biomed/tasks/aidd_tasks/protein_property_prediction.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/tasks/aidd_tasks/protein_protein_interaction.py b/open_biomed/tasks/aidd_tasks/protein_protein_interaction.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/tasks/aidd_tasks/structure_based_drug_design.py b/open_biomed/tasks/aidd_tasks/structure_based_drug_design.py
new file mode 100644
index 0000000000000000000000000000000000000000..6e04717e5aeffe42e4dda954d5e98e531cb97162
--- /dev/null
+++ b/open_biomed/tasks/aidd_tasks/structure_based_drug_design.py
@@ -0,0 +1,273 @@
+from typing import Optional, Any, Dict, List
+
+import logging
+import numpy as np
+import pytorch_lightning as pl
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+from rdkit import Chem
+from rdkit.Chem import rdMolTransforms
+from scipy.spatial.distance import jensenshannon
+from tqdm import tqdm
+
+from open_biomed.data import Molecule, Protein
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class StructureBasedDrugDesign(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Structure-based drug design.',
+ 'Inputs: {"pocket": a protein pocket}',
+ "Outputs: A small molecule that is likely to bind with the pocket."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("structure_based_drug_design", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("structure_based_drug_design", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return StructureBasedDrugDesignEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/vina_score/median",
+ output_str="-{val_vina_score_med:.4f}",
+ mode="min",
+ )
+
+def calc_vina_molecule_metrics(molecule: Molecule, protein: Protein, calculate_vina_dock: bool=True) -> Dict[str, float]:
+ metrics = {}
+
+ # Vina scores
+ from open_biomed.tasks.aidd_tasks.protein_molecule_docking import VinaDockTask
+ modes = ["min", "dock", "score"] if calculate_vina_dock else ["min", "score"]
+ for mode in modes:
+ vina_task = VinaDockTask(mode=mode)
+ metrics[f"vina_{mode}"] = vina_task.run(molecule, protein)[0][0]
+
+ # Molecule property metrics
+ molecule._add_smiles()
+ metrics["completeness"] = 0 if "." in molecule.smiles else 1
+ metrics["qed"] = molecule.calc_qed()
+ metrics["sa"] = molecule.calc_sa()
+ metrics["logp"] = molecule.calc_logp()
+ metrics["lipinski"] = molecule.calc_lipinski()
+
+ # Success rate
+ if calculate_vina_dock:
+ metrics["success"] = 1 if metrics["vina_dock"] < -8.18 and metrics["qed"] > 0.25 and metrics["sa"] > 0.59 else 0
+ else:
+ metrics["success"] = 1 if metrics["vina_min"] < -8.18 and metrics["qed"] > 0.25 and metrics["sa"] > 0.59 else 0
+ return metrics
+
+BOND_TYPE_TO_ID = {
+ Chem.rdchem.BondType.UNSPECIFIED: 0,
+ Chem.rdchem.BondType.SINGLE: 1,
+ Chem.rdchem.BondType.DOUBLE: 2,
+ Chem.rdchem.BondType.TRIPLE: 3,
+ Chem.rdchem.BondType.AROMATIC: 4,
+}
+EVAL_BOND_TYPES = [
+ (6, 6, 1), # CC 716 29.6% 1.2857153558712793 1.696778883283098 0.004110635274118186
+ (6, 6, 4), # C:C 500 20.7% 1.2981754588686738 1.5429516779717267 0.002447762191030529
+ (6, 8, 1), # CO 336 13.9% 1.217717567891834 1.592581263775381 0.0037486369588354694
+ (6, 7, 1), # CN 245 10.1% 1.2412786652760066 1.609101379383609 0.0036782271410760246
+ (6, 7, 4), # C:N 213 8.8% 1.2781037555594505 1.4881754271876604 0.002100716716282098
+]
+EVAL_BOND_TYPES_STR = ["CC", "C:C", "CO", "CN", "C:N"]
+EVAL_BOND_ANGLES = [
+ (6, 1, 6, 1, 6), # CCC 521 18.1% 59.52230720788234 135.50315793532704 0.759808507274447
+ (6, 4, 6, 4, 6), # C:C:C 460 16.0% 101.54806405949785 127.54928623790771 0.2600122217840986
+ (6, 1, 6, 1, 8), # CCO 274 9.5% 57.19735111082594 136.5409407542893 0.7934358964346336
+]
+EVAL_BOND_ANGLES_STR = ["CCC", "C:C:C", "CCO"]
+
+def calc_bond_length_profile(molecule: Molecule) -> Dict[str, List[float]]:
+ distance = molecule.calc_distance()
+ bond_len_profile = {k: [] for k in EVAL_BOND_TYPES}
+ for bond in molecule.rdmol.GetBonds():
+ s_sym = bond.GetBeginAtom().GetAtomicNum()
+ t_sym = bond.GetEndAtom().GetAtomicNum()
+ s_idx, t_idx = bond.GetBeginAtomIdx(), bond.GetEndAtomIdx()
+ bond_type = BOND_TYPE_TO_ID[bond.GetBondType()]
+ if s_idx > t_idx:
+ s_idx, t_idx = t_idx, s_idx
+ if (s_sym, t_sym, bond_type) in EVAL_BOND_TYPES:
+ bond_len_profile[(s_sym, t_sym, bond_type)].append(distance[s_idx, t_idx])
+ return bond_len_profile
+
+def calc_bond_angle_profile(molecule: Molecule) -> Dict[str, List[float]]:
+ bond_angle_profile = {k: [] for k in EVAL_BOND_ANGLES}
+ for bond1 in molecule.rdmol.GetBonds():
+ atom1, atom2 = bond1.GetBeginAtom(), bond1.GetEndAtom()
+ for bond2 in atom2.GetBonds():
+ atom3 = bond2.GetOtherAtom(atom2)
+ if atom3.GetIdx() == atom1.GetIdx():
+ continue
+ try:
+ angle = rdMolTransforms.GetAngleDeg(molecule.rdmol.GetConformer(), atom1.GetIdx(), atom2.GetIdx(), atom3.GetIdx())
+ atom1_sym = atom1.GetAtomicNum()
+ atom2_sym = atom2.GetAtomicNum()
+ atom3_sym = atom3.GetAtomicNum()
+ bond1_type = BOND_TYPE_TO_ID[bond1.GetBondType()]
+ bond2_type = BOND_TYPE_TO_ID[bond2.GetBondType()]
+ if atom1_sym > atom3_sym:
+ atom1_sym, atom3_sym = atom3_sym, atom1_sym
+ bond1_type, bond2_type = bond2_type, bond1_type
+ if (atom1_sym, bond1_type, atom2_sym, bond2_type, atom3_sym) in EVAL_BOND_ANGLES:
+ bond_angle_profile[(atom1_sym, bond1_type, atom2_sym, bond2_type, atom3_sym)].append(angle)
+
+ except Exception as e:
+ logging.error(f"Error calculating bond angle for {molecule.name}: {e}")
+ continue
+
+ return bond_angle_profile
+
+class StructureBasedDrugDesignEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.eval_dataset = None
+
+ def init_metrics(self) -> None:
+ self.metrics = {"valid": []}
+ self.bond_len_profile_ref = {}
+ self.bond_len_profile_pred = {}
+ self.bond_angle_profile_ref = {}
+ self.bond_angle_profile_pred = {}
+ for elem in EVAL_BOND_TYPES:
+ self.bond_len_profile_ref[elem] = []
+ self.bond_len_profile_pred[elem] = []
+ for elem in EVAL_BOND_ANGLES:
+ self.bond_angle_profile_ref[elem] = []
+ self.bond_angle_profile_pred[elem] = []
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: STEP_OUTPUT,
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ self.outputs.extend(outputs)
+ if batch_idx == 0:
+ for i in range(1):
+ logging.info(f"Generated Molecule: {self.outputs[i]}")
+
+ def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_validation_epoch_start(trainer, pl_module)
+ self.status = "val"
+ self.outputs = []
+ self.eval_dataset = trainer.val_dataloaders.dataset
+
+ def on_validation_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ for i in tqdm(range(len(self.outputs)), desc="Calculating SBDD metrics"):
+ if self.outputs[i] is None:
+ self.metrics["valid"].append(0)
+ continue
+ self.metrics["valid"].append(1)
+ cur_metrics = calc_vina_molecule_metrics(self.outputs[i], self.eval_dataset.proteins[i])
+ for k, v in cur_metrics.items():
+ if not k in self.metrics:
+ self.metrics[k] = []
+ self.metrics[k].append(v)
+
+ # Calculate bond distance & angle profiles
+ cur_len_profile_ref = calc_bond_length_profile(self.eval_dataset.molecules[i])
+ for k, v in cur_len_profile_ref.items():
+ self.bond_len_profile_ref[k].extend(v)
+ cur_len_profile_pred = calc_bond_length_profile(self.outputs[i])
+ for k, v in cur_len_profile_pred.items():
+ self.bond_len_profile_pred[k].extend(v)
+
+ cur_angle_profile_ref = calc_bond_angle_profile(self.eval_dataset.molecules[i])
+ for k, v in cur_angle_profile_ref.items():
+ self.bond_angle_profile_ref[k].extend(v)
+ cur_angle_profile_pred = calc_bond_angle_profile(self.outputs[i])
+ for k, v in cur_angle_profile_pred.items():
+ self.bond_angle_profile_pred[k].extend(v)
+
+ # Evaluate clash
+ """
+ try:
+ from posecheck import PoseCheck
+ pc = PoseCheck()
+ pdb_file = self.eval_dataset.pockets[i].save_pdb()
+ pc.load_protein_from_pdb(pdb_file)
+ pc.load_ligands_from_mols([self.outputs[i].rdmol])
+ clash = pc.calculate_clashes()[0]
+ if "clash_num" not in self.metrics:
+ self.metrics["clash_num"] = []
+ self.metrics["atom_num"] = []
+ self.metrics["clash_num"].append(clash)
+ self.metrics["atom_num"].append(self.outputs[i].get_num_atoms())
+ except ImportError:
+ logging.error("posecheck is not installed. Please install it following README.md.")
+ """
+
+ # WARNING: the results are averaged over all test repeats, so only the last repeat should be used
+ output_metrics = {}
+ for vina_metrics in ["vina_min", "vina_dock", "vina_score"]:
+ output_metrics[f"{self.status}/{vina_metrics}/median"] = np.median(self.metrics[vina_metrics])
+ output_metrics[f"{self.status}/{vina_metrics}/mean"] = np.mean(self.metrics[vina_metrics])
+ for metric in ["valid", "qed", "sa", "logp", "lipinski", "success"]:
+ output_metrics[f"{self.status}/{metric}"] = np.mean(self.metrics[metric])
+ # output_metrics[f"{self.status}/clash_ratio_atom"] = np.sum(self.metrics["clash_num"]) / np.sum(self.metrics["atom_num"])
+ # output_metrics[f"{self.status}/clash_ratio_molecule"] = np.mean(np.array(self.metrics["clash_num"]) > 0)
+
+ for i, bond_type in enumerate(EVAL_BOND_TYPES):
+ bond_len_dist_ref = np.histogram(self.bond_len_profile_ref[bond_type], bins=np.arange(1.1, 1.7000001, 0.005), density=True)[0]
+ bond_len_dist_pred = np.histogram(self.bond_len_profile_pred[bond_type], bins=np.arange(1.1, 1.7000001, 0.005), density=True)[0]
+ jsd = jensenshannon(bond_len_dist_ref, bond_len_dist_pred)
+ output_metrics[f"{self.status}/JSD_bond_len_{EVAL_BOND_TYPES_STR[i]}"] = 1 if np.isnan(jsd) else jsd
+
+ for i, bond_angle in enumerate(EVAL_BOND_ANGLES):
+ bond_angle_dist_ref = np.histogram(self.bond_angle_profile_ref[bond_angle], bins=np.arange(100, 140.01, 0.25), density=True)[0]
+ bond_angle_dist_pred = np.histogram(self.bond_angle_profile_pred[bond_angle], bins=np.arange(100, 140.01, 0.25), density=True)[0]
+ jsd = jensenshannon(bond_angle_dist_ref, bond_angle_dist_pred)
+ output_metrics[f"{self.status}/JSD_bond_angle_{EVAL_BOND_ANGLES_STR[i]}"] = 1 if np.isnan(jsd) else jsd
+
+ pl_module.log_dict(output_metrics)
+
+ def on_test_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: STEP_OUTPUT,
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0,
+ ) -> None:
+ self.on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+
+ def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ # For SBDD, we perform test multiple times
+ super().on_test_epoch_start(trainer, pl_module)
+
+ if getattr(self, "status", None) != "test":
+ # First time test, initialize the stored results
+ self.status = "test"
+ self.init_metrics()
+ self.eval_dataset = trainer.test_dataloaders.dataset
+ self.outputs = []
+
+
+ def on_test_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ self.on_validation_epoch_end(trainer, pl_module)
+
diff --git a/open_biomed/tasks/base_task.py b/open_biomed/tasks/base_task.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb51b6d929025d83c24dc3886b8a46d499df3f5b
--- /dev/null
+++ b/open_biomed/tasks/base_task.py
@@ -0,0 +1,164 @@
+# Three major responsibilities of a Task module:
+# Corresponding Datasets
+# TaskModel Wrapper: defining training and validation step, call appropreiate Model functions
+# Callbacks: sampling / validation
+
+from abc import ABC, abstractmethod, abstractstaticmethod
+from pytorch_lightning.utilities.types import TRAIN_DATALOADERS, EVAL_DATALOADERS, STEP_OUTPUT
+from typing import Dict, Tuple, Optional
+from typing_extensions import Any
+
+import os
+import pytorch_lightning as pl
+import torch
+from torch.utils.data import DataLoader
+
+from open_biomed.models import MODEL_REGISTRY
+from open_biomed.datasets import DATASET_REGISTRY
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class ModelWrapper(pl.LightningModule, ABC):
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
+ super().__init__(*args, **kwargs)
+
+ @abstractmethod
+ def get_featurizer(self) -> Tuple[Featurizer, Collator]:
+ raise NotImplementedError
+
+class BaseTask(ABC):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @abstractstaticmethod
+ def print_usage():
+ raise NotImplementedError
+
+ @abstractstaticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ raise NotImplementedError
+
+ @abstractstaticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> ModelWrapper:
+ raise NotImplementedError
+
+ @abstractstaticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ raise NotImplementedError
+
+ @abstractstaticmethod
+ def get_monitor_cfg() -> Struct:
+ raise NotImplementedError
+
+class DefaultDataModule(pl.LightningDataModule):
+ def __init__(self, task: str,dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> None:
+ super(DefaultDataModule, self).__init__()
+ dataset = DATASET_REGISTRY[task][dataset_cfg.name](dataset_cfg, featurizer)
+ train, valid, test = dataset.split()
+ self.train_loader = DataLoader(
+ dataset=train,
+ batch_size=dataset_cfg.batch_size_train,
+ shuffle=True,
+ num_workers=dataset_cfg.num_workers,
+ collate_fn=collator
+ )
+ if valid is not None:
+ self.valid_loader = DataLoader(
+ dataset=valid,
+ batch_size=dataset_cfg.batch_size_eval,
+ shuffle=False,
+ num_workers=dataset_cfg.num_workers,
+ collate_fn=collator,
+ )
+ self.test_loader = DataLoader(
+ dataset=test,
+ batch_size=dataset_cfg.batch_size_eval,
+ shuffle=False,
+ num_workers=dataset_cfg.num_workers,
+ collate_fn=collator,
+ )
+
+ def train_dataloader(self) -> TRAIN_DATALOADERS:
+ return self.train_loader
+
+ def val_dataloader(self) -> EVAL_DATALOADERS:
+ return self.valid_loader
+
+ def test_dataloader(self) -> EVAL_DATALOADERS:
+ return self.test_loader
+
+class DefaultModelWrapper(ModelWrapper):
+ def __init__(self, task: str, model_cfg: Config, train_cfg: Config) -> None:
+ super().__init__()
+ self.model_cfg = model_cfg
+ self.train_cfg = train_cfg
+ if getattr(model_cfg, 'pretrained', ''):
+ self.model = MODEL_REGISTRY[task][model_cfg.name].from_pretrained(model_cfg)
+ else:
+ self.model = MODEL_REGISTRY[task][model_cfg.name](model_cfg)
+ self.model.configure_task(task)
+
+ def get_featurizer(self) -> Tuple[Featurizer, Collator]:
+ return self.model.get_featurizer()
+
+ def forward(self, batch: Dict[str, Any]):
+ return self.model(**batch)
+
+ def predict(self, batch: Dict[str, Any]):
+ return self.model.predict(**batch)
+
+ def training_step(self, batch: Dict[str, Any], batch_idx: int) -> STEP_OUTPUT:
+ loss_dict = self.model(**batch)
+ loss_dict = {f"train/{k}": v for k, v in loss_dict.items()}
+ self.log_dict(loss_dict, batch_size=self.train_cfg.batch_size, sync_dist=True, prog_bar=True, logger=True)
+ return loss_dict["train/loss"]
+
+ def validation_step(self, batch: Dict[str, Any], batch_idx: int, *args, **kwargs) -> Optional[STEP_OUTPUT]:
+ return self.model.predict(**batch)
+
+ def test_step(self, batch: Dict[str, Any], batch_idx: int, *args, **kwargs) -> Optional[STEP_OUTPUT]:
+ return self.model.predict(**batch)
+
+ def configure_optimizers(self) -> Any:
+ if self.train_cfg.optimizer.name == "adam":
+ self.optimizer = torch.optim.Adam(
+ self.model.parameters(),
+ lr=self.train_cfg.optimizer.lr,
+ weight_decay=self.train_cfg.optimizer.weight_decay,
+ betas=(
+ getattr(self.train_cfg.optimizer, "beta1", 0.9),
+ getattr(self.train_cfg.optimizer, "beta2", 0.999),
+ )
+ )
+ else:
+ raise NotImplementedError(f'Optimizer not supported:{self.train_cfg.optimizer.name}')
+
+ if self.train_cfg.scheduler.name == "cosine":
+ scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
+ self.optimizer,
+ T_max=self.train_cfg.max_iters,
+ eta_min=getattr(self.train_cfg.optimizer, "min_lr", self.train_cfg.optimizer.lr * 0.05),
+ )
+ self.scheduler = {
+ "scheduler": scheduler,
+ "interval": "step",
+ }
+ elif self.train_cfg.schedular == "plateau":
+ scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
+ self.optimizer,
+ factor=getattr(self.train_cfg.scheduler, "factor", 0.6),
+ patience=getattr(self.train_cfg.scheduler, "patience", 10),
+ min_lr=getattr(self.train_cfg.scheduler, "min_lr", self.train_cfg.optimizer.lr * 0.05)
+ )
+ self.scheduler = {
+ "scheduler": scheduler,
+ "monitor": self.train_cfg.monitor.name,
+ "interval": "step",
+ "frequency": getattr(self.cfg, "val_freq", 1000)
+ }
+
+ return {
+ "optimizer": self.optimizer,
+ "lr_schedular": self.scheduler,
+ }
\ No newline at end of file
diff --git a/open_biomed/tasks/multi_modal_tasks/__init__.py b/open_biomed/tasks/multi_modal_tasks/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/tasks/multi_modal_tasks/molecule_question_answering.py b/open_biomed/tasks/multi_modal_tasks/molecule_question_answering.py
new file mode 100644
index 0000000000000000000000000000000000000000..7840224fffb4fa269162be213ffafa02a788ee0f
--- /dev/null
+++ b/open_biomed/tasks/multi_modal_tasks/molecule_question_answering.py
@@ -0,0 +1,69 @@
+from typing import Dict, List, Tuple, Optional
+from typing_extensions import Any
+
+import json
+import logging
+import os
+import pytorch_lightning as pl
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.callbacks import TextOverlapEvalCallback
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class MoleculeQA(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Molecule question answering.',
+ 'Inputs: {"molecule": a small molecule you are interested in. "text": a question about the molecule.}',
+ "Outputs: An answer to the question."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("molecule_question_answering", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("molecule_question_answering", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return MoleculeQAEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/ROUGE-1",
+ output_str="-BLEU-2_{val/BLEU-2:.4f}-BLEU-4_{val/BLEU-4:.4f}-ROUGE-1_{val/ROUGE-1:.4f}-ROUGE-2_{val/ROUGE-2:.4f}",
+ mode="max",
+ )
+
+class MoleculeQAEvaluationCallback(TextOverlapEvalCallback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.eval_dataset = None
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ if batch_idx == 0:
+ for i in range(2):
+ out_labels = str(self.eval_dataset.labels[i])
+ logging.info(f"Molecule: {self.eval_dataset.molecules[i]}")
+ logging.info(f"Question: {self.eval_dataset.texts[i]}")
+ logging.info(f"Predict: {self.outputs[i]}")
+ logging.info(f"Ground Truth: {out_labels}")
\ No newline at end of file
diff --git a/open_biomed/tasks/multi_modal_tasks/molecule_text_translation.py b/open_biomed/tasks/multi_modal_tasks/molecule_text_translation.py
new file mode 100644
index 0000000000000000000000000000000000000000..90675609569855b53403c948b31bca597eadbdf0
--- /dev/null
+++ b/open_biomed/tasks/multi_modal_tasks/molecule_text_translation.py
@@ -0,0 +1,68 @@
+from typing import Dict, List, Tuple, Optional
+from typing_extensions import Any
+
+import json
+import logging
+import os
+import pytorch_lightning as pl
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+import torch
+
+from open_biomed.data import molecule_fingerprint_similarity, check_identical_molecules
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.callbacks import TextOverlapEvalCallback
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class MoleculeCaptioning(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Molecule captioning.',
+ 'Inputs: {"molecule": a small molecule you are interested in.}',
+ "Outputs: Detailed textual descriptions of the molecule."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("molecule_captioning", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("molecule_captioning", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return MoleculeCaptioningEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/ROUGE-1",
+ output_str="-BLUE-2_{val/BLUE-2:.4f}-BLUE-4_{val/BLUE-4:.4f}-BLUE-L_{val/BLUE-L:.4f}-ROUGE-1_{val/ROUGE-1:.4f}-ROUGE-2_{val/ROUGE-2:.4f}",
+ mode="max",
+ )
+
+class MoleculeCaptioningEvaluationCallback(TextOverlapEvalCallback):
+ def __init__(self) -> None:
+ super().__init__(tokenizer_type="BERT")
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ if batch_idx == 0:
+ for i in range(2):
+ out_labels = str(self.eval_dataset.labels[i])
+ logging.info(f"Molecule: {self.eval_dataset.molecules[i]}")
+ logging.info(f"Predict: {self.outputs[i]}")
+ logging.info(f"Ground Truth: {out_labels}")
diff --git a/open_biomed/tasks/multi_modal_tasks/mutation_text_translation.py b/open_biomed/tasks/multi_modal_tasks/mutation_text_translation.py
new file mode 100644
index 0000000000000000000000000000000000000000..90c268b21e4ac9f958e23cdbe74f93487536304f
--- /dev/null
+++ b/open_biomed/tasks/multi_modal_tasks/mutation_text_translation.py
@@ -0,0 +1,100 @@
+from typing import Optional, Any
+
+import logging
+import pytorch_lightning as pl
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.callbacks import TextOverlapEvalCallback
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class MutationExplanation(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Mutation explanation.',
+ 'Inputs: {"protein": a protein (the amino acid sequence is required). "mutation": a string that describes a single-point substitution mutation. (e.g. A51F indicates that the 51st amino acid changes from A to F)}',
+ "Outputs: Textual descriptions of how this mutation affects protein function and further biological significance."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("mutation_explanation", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("mutation_explanation", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return MutationExplanationEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/ROUGE-1",
+ output_str="-BLUE-2_{val/BLUE-2:.4f}-BLUE-4_{val/BLUE-4:.4f}-BLUE-L_{val/BLUE-L:.4f}-ROUGE-1_{val/ROUGE-1:.4f}-ROUGE-2_{val/ROUGE-2:.4f}",
+ mode="max",
+ )
+
+class MutationExplanationEvaluationCallback(TextOverlapEvalCallback):
+ def __init__(self) -> None:
+ super().__init__(tokenizer_type=None)
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ if batch_idx == 0:
+ for i in range(2):
+ out_labels = str(self.eval_dataset.labels[i])
+ logging.info(f"Protein: {self.eval_dataset.protein[i]}")
+ logging.info(f"Predict: {self.outputs[i]}")
+ logging.info(f"Ground Truth: {out_labels}")
+
+class MutationEngineering(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Mutation engineering.',
+ 'Inputs: {"protein": a protein (the amino acid sequence is required). "prompt": A textual prompt indicating the desired property of the mutant.}',
+ "Outputs: A string that describes a single-point substitution mutation. (e.g. A51F indicates that the 51st amino acid changes from A to F)."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("mutation_engineering", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("mutation_engineering", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return MutationEngineeringEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/recall@50",
+ output_str="-Recall@50_{val/recall@50:.4f}-Accuracy_{val/accuracy:.4f}",
+ mode="max",
+ )
+
+# TODO: implement mutation engineering
+class MutationEngineeringEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
\ No newline at end of file
diff --git a/open_biomed/tasks/multi_modal_tasks/protein_question_answering.py b/open_biomed/tasks/multi_modal_tasks/protein_question_answering.py
new file mode 100644
index 0000000000000000000000000000000000000000..19665656dd7b46742e681854d25732f44571b514
--- /dev/null
+++ b/open_biomed/tasks/multi_modal_tasks/protein_question_answering.py
@@ -0,0 +1,70 @@
+from typing import Dict, List, Tuple, Optional
+from typing_extensions import Any
+
+import json
+import logging
+import os
+import pytorch_lightning as pl
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+import torch
+
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.callbacks import TextOverlapEvalCallback
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class ProteinQA(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Protein question answering.',
+ 'Inputs: {"protein": a protein you are interested in. "text": a question about the protein.}',
+ "Outputs: An answer to the question."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("protein_question_answering", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("protein_question_answering", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return ProteinQAEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/ROUGE-1",
+ output_str="-BLUE-2_{val/BLEU-2:.4f}-BLUE-4_{val/BLEU-4:.4f}-ROUGE-1_{val/ROUGE-1:.4f}-ROUGE-2_{val/ROUGE-2:.4f}",
+ mode="max",
+ )
+
+class ProteinQAEvaluationCallback(TextOverlapEvalCallback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.eval_dataset = None
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ if batch_idx == 0:
+ for i in range(2):
+ out_labels = str(self.eval_dataset.labels[i])
+ logging.info(f"Question: {self.eval_dataset.texts[i]}")
+ logging.info(f"Protein: {self.eval_dataset.proteins[i]}")
+ logging.info(f"Predict: {self.outputs[i]}")
+ logging.info(f"Ground Truth: {out_labels}")
\ No newline at end of file
diff --git a/open_biomed/tasks/multi_modal_tasks/protein_text_translation.py b/open_biomed/tasks/multi_modal_tasks/protein_text_translation.py
new file mode 100644
index 0000000000000000000000000000000000000000..18ee43f12265589d87ddb5246aa7401805a136e7
--- /dev/null
+++ b/open_biomed/tasks/multi_modal_tasks/protein_text_translation.py
@@ -0,0 +1,114 @@
+from typing import Optional
+from typing_extensions import Any
+
+import json
+import logging
+import numpy as np
+import os
+import pytorch_lightning as pl
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+import re
+
+from open_biomed.data import protein_sequence_similarity
+from open_biomed.utils.callbacks import TextOverlapEvalCallback
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class TextBasedProteinGeneration(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Text-based protein generation.',
+ 'Inputs: {"text": Textual instructions descrbing the desired properties of the designed protein.}',
+ "Outputs: A protein sequence or structure."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("text_based_protein_generation", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("text_based_protein_generation", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return TextBasedProteinGenerationEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/similarity",
+ output_str="-similarity_{val/similarity:.4f}",
+ mode="max",
+ )
+
+class TextBasedProteinGenerationEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.eval_dataset = None
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ self.outputs.extend(outputs)
+ if batch_idx == 0:
+ for i in range(2):
+ out_labels = str(self.eval_dataset.labels[i])
+ logging.info(f"Text: {self.eval_dataset.texts[i]}")
+ logging.info(f"Predict: {self.outputs[i]}")
+ logging.info(f"Ground Truth: {out_labels}")
+
+ def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_validation_epoch_start(trainer, pl_module)
+ self.status = "val"
+ self.outputs = []
+ self.eval_dataset = trainer.val_dataloaders.dataset
+
+ def on_validation_epoch_end(self, trainer: "pl.Trainer", pl_module: "pl.LightningModule") -> None:
+ output_path = os.path.join(trainer.default_root_dir, f"{self.status}_outputs", f"epoch{pl_module.current_epoch}")
+ scores = []
+ with open(output_path + "_outputs.txt", "w") as f:
+ f.write("Text\tPredicted\tGround Truth\tScore\n")
+ for i in range(len(self.outputs)):
+ score, seq1, seq2 = protein_sequence_similarity(self.outputs[i], self.eval_dataset.proteins[i])
+ scores.append(score)
+ text = re.sub(r"[\n\t]", "", self.eval_dataset.texts[i].str)
+ f.write(f"{text}\n{seq1}\n{seq2}\n{score:.4f}\n")
+ out_metrics = {f"{self.status}/similarity": np.mean(scores)}
+ pl_module.log_dict(out_metrics)
+ json.dump(out_metrics, open(output_path + "_metrics.json", "w"))
+
+ def on_test_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: STEP_OUTPUT,
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0,
+ ) -> None:
+ self.on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+
+ def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_test_epoch_start(trainer, pl_module)
+ self.status = "test"
+ self.outputs = []
+ self.eval_dataset = trainer.test_dataloaders.dataset
+
+ def on_test_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ self.on_validation_epoch_end(trainer, pl_module)
\ No newline at end of file
diff --git a/open_biomed/tasks/multi_modal_tasks/text_based_molecule_editing.py b/open_biomed/tasks/multi_modal_tasks/text_based_molecule_editing.py
new file mode 100644
index 0000000000000000000000000000000000000000..e3b085c44ca57f5df0eebcdaa9490e7291bffbb0
--- /dev/null
+++ b/open_biomed/tasks/multi_modal_tasks/text_based_molecule_editing.py
@@ -0,0 +1,143 @@
+from typing import Dict, List, Tuple, Optional
+from typing_extensions import Any
+
+import json
+import logging
+import os
+import pytorch_lightning as pl
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+import torch
+
+from open_biomed.data import molecule_fingerprint_similarity, check_identical_molecules
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class TextMoleculeEditing(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Text-based molecule editing.',
+ 'Inputs: {"molecule": a small molecule, "text": the desired property of the updated molecule}',
+ "Outputs: A new molecule that is structurally similar to the original molecule but exhibit improved property described in text."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("text_based_molecule_editing", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("text_based_molecule_editing", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return TextMoleculeEditingEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/ratio_improved",
+ output_str="-validity_{val/validity:.4f}-ratio_improved_{val/ratio_improved:.4f}-accuracy_{val/accuracy:.4f}",
+ mode="max",
+ )
+
+class TextMoleculeEditingEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.eval_dataset = None
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ self.outputs.extend(outputs)
+ if batch_idx == 0:
+ for i in range(2):
+ out_labels = '\n'.join([str(x) for x in self.eval_dataset.labels[i]])
+ logging.info(f"Original: {self.eval_dataset.molecules[i]}")
+ logging.info(f"Prompt: {self.eval_dataset.texts[i]}")
+ logging.info(f"Predict: {self.outputs[i]}")
+ logging.info(f"Ground Truth: {out_labels}")
+
+ def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_validation_epoch_start(trainer, pl_module)
+ self.status = "val"
+ self.outputs = []
+ self.eval_dataset = trainer.val_dataloaders.dataset
+
+ def on_validation_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ cnt_valid, cnt_improved, cnt_accurate = 0, 0, 0
+ output_str = "\t".join(["Original", "Prompt", "Predicted", "Best_Reference", "All_Reference", "FP_Similarity", "FP_Similarity_orig"]) + "\n"
+ for i in range(len(self.outputs)):
+ best_sim, best_sim_orig = 0.0, 0.0
+ best_ref = None
+
+ orig_mol, prompt, label = self.eval_dataset.molecules[i], self.eval_dataset.texts[i], self.eval_dataset.labels[i]
+ all_ref = []
+ for ref_mol in label:
+ cur_sim = molecule_fingerprint_similarity(self.outputs[i], ref_mol)
+ if cur_sim > best_sim:
+ best_sim = cur_sim
+ best_ref = ref_mol
+ all_ref.append(str(ref_mol))
+ cur_sim = molecule_fingerprint_similarity(orig_mol, ref_mol)
+ if cur_sim > best_sim_orig:
+ best_sim_orig = cur_sim
+
+ output_str += "\t".join([str(orig_mol), str(prompt), str(self.outputs[i]), str(best_ref), ",".join(all_ref), f"{best_sim:.4f}", f"{best_sim_orig:.4f}"]) + "\n"
+ if self.outputs[i].rdmol is not None:
+ cnt_valid += 1
+ if best_sim > best_sim_orig:
+ cnt_improved += 1
+ if check_identical_molecules(self.outputs[i], best_ref):
+ cnt_accurate += 1
+
+ output_path = os.path.join(trainer.default_root_dir, f"{self.status}_outputs", f"epoch{pl_module.current_epoch}")
+ out_metrics = {
+ f"{self.status}/validity": cnt_valid / len(self.outputs),
+ f"{self.status}/ratio_improved": cnt_improved / len(self.outputs),
+ f"{self.status}/accuracy": cnt_accurate / len(self.outputs),
+ }
+ pl_module.log_dict(out_metrics)
+ print(json.dumps(out_metrics, indent=4))
+ json.dump(out_metrics, open(output_path + "_metrics.json", "w"))
+
+ with open(output_path + "_outputs.txt", "w") as f:
+ f.write(output_str)
+
+
+ def on_test_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: STEP_OUTPUT,
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0,
+ ) -> None:
+ self.on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+
+ def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_test_epoch_start(trainer, pl_module)
+ self.status = "test"
+ self.outputs = []
+ self.eval_dataset = trainer.test_dataloaders.dataset
+
+ def on_test_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ self.on_validation_epoch_end(trainer, pl_module)
\ No newline at end of file
diff --git a/open_biomed/tasks/multi_modal_tasks/text_guided_molecule_generation.py b/open_biomed/tasks/multi_modal_tasks/text_guided_molecule_generation.py
new file mode 100644
index 0000000000000000000000000000000000000000..0d58d1312dda56fda079106c41387f9356643572
--- /dev/null
+++ b/open_biomed/tasks/multi_modal_tasks/text_guided_molecule_generation.py
@@ -0,0 +1,129 @@
+from typing import Dict, List, Tuple, Optional
+from typing_extensions import Any
+
+import json
+import logging
+import os
+import pytorch_lightning as pl
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+import torch
+
+from open_biomed.data import molecule_fingerprint_similarity, check_identical_molecules
+from open_biomed.tasks.base_task import BaseTask, DefaultDataModule, DefaultModelWrapper
+from open_biomed.utils.collator import Collator
+from open_biomed.utils.config import Config, Struct
+from open_biomed.utils.featurizer import Featurizer
+
+class TextGuidedMoleculeGeneration(BaseTask):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @staticmethod
+ def print_usage() -> str:
+ return "\n".join([
+ 'Text-based molecule generation.',
+ 'Inputs: {"text": textual descriptions of the desired molecule.}',
+ "Outputs: A new molecule that best fits the textual instruction."
+ ])
+
+ @staticmethod
+ def get_datamodule(dataset_cfg: Config, featurizer: Featurizer, collator: Collator) -> pl.LightningDataModule:
+ return DefaultDataModule("text_guided_molecule_generation", dataset_cfg, featurizer, collator)
+
+ @staticmethod
+ def get_model_wrapper(model_cfg: Config, train_cfg: Config) -> pl.LightningModule:
+ return DefaultModelWrapper("text_guided_molecule_generation", model_cfg, train_cfg)
+
+ @staticmethod
+ def get_callbacks(callback_cfg: Optional[Config]=None) -> pl.Callback:
+ return TextGuidedMoleculeGenerationEvaluationCallback()
+
+ @staticmethod
+ def get_monitor_cfg() -> Struct:
+ return Struct(
+ name="val/accuracy",
+ output_str="-accuracy_{val/accuracy:.4f}-validity_{val/validity:.4f}",
+ mode="max",
+ )
+
+class TextGuidedMoleculeGenerationEvaluationCallback(pl.Callback):
+ def __init__(self) -> None:
+ super().__init__()
+ self.outputs = []
+ self.eval_dataset = None
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ self.outputs.extend(outputs)
+ if batch_idx == 0:
+ for i in range(2):
+ out_labels = str(self.eval_dataset.labels[i])
+ logging.info(f"Original: {self.eval_dataset.texts[i]}")
+ logging.info(f"Predict: {self.outputs[i]}")
+ logging.info(f"Ground Truth: {out_labels}")
+
+ def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_validation_epoch_start(trainer, pl_module)
+ self.status = "val"
+ self.outputs = []
+ self.eval_dataset = trainer.val_dataloaders.dataset
+
+ def on_validation_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ gts = self.eval_dataset.labels
+
+ cnt_valid, cnt_accurate = 0, 0
+ output_str = ""
+ for i in range(len(self.outputs)):
+ text, label = self.eval_dataset.texts[i], self.eval_dataset.labels[i]
+ cur_sim = molecule_fingerprint_similarity(self.outputs[i], gts[i])
+
+ output_str += "\t".join([str(text), str(label), str(self.outputs[i]), f"{cur_sim:.4f}"]) + "\n"
+ if self.outputs[i].rdmol is not None:
+ cnt_valid += 1
+ if check_identical_molecules(self.outputs[i], gts[i]):
+ cnt_accurate += 1
+
+ output_path = os.path.join(trainer.default_root_dir, f"{self.status}_outputs", f"epoch{pl_module.current_epoch}")
+ out_metrics = {
+ f"{self.status}/validity": cnt_valid / len(self.outputs),
+ f"{self.status}/accuracy": cnt_accurate / len(self.outputs),
+ }
+ pl_module.log_dict(out_metrics)
+ print(json.dumps(out_metrics, indent=4))
+ json.dump(out_metrics, open(output_path + "_metrics.json", "w"))
+
+ with open(output_path + "_outputs.txt", "w") as f:
+ f.write(output_str)
+
+
+ def on_test_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: STEP_OUTPUT,
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0,
+ ) -> None:
+ self.on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+
+ def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_test_epoch_start(trainer, pl_module)
+ self.status = "test"
+ self.outputs = []
+ self.eval_dataset = trainer.test_dataloaders.dataset
+
+ def on_test_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ self.on_validation_epoch_end(trainer, pl_module)
\ No newline at end of file
diff --git a/open_biomed/tasks/multi_modal_tasks/vision_to_molecule.py b/open_biomed/tasks/multi_modal_tasks/vision_to_molecule.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/utils/__init__.py b/open_biomed/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/utils/callbacks.py b/open_biomed/utils/callbacks.py
new file mode 100644
index 0000000000000000000000000000000000000000..e6e1bcb617ca28274a8687e7c04df74adf080e93
--- /dev/null
+++ b/open_biomed/utils/callbacks.py
@@ -0,0 +1,235 @@
+from typing import Optional, Union
+from typing_extensions import Any
+
+from absl import logging
+import json
+import numpy as np
+import os
+import pytorch_lightning as pl
+from pytorch_lightning.utilities.types import STEP_OUTPUT
+import re
+import torch
+
+from transformers import BertTokenizerFast
+
+class Queue:
+ def __init__(self, max_len=50):
+ self.items = [1]
+ self.max_len = max_len
+
+ def __len__(self):
+ return len(self.items)
+
+ def add(self, item):
+ self.items.insert(0, item)
+ if len(self) > self.max_len:
+ self.items.pop()
+
+ def mean(self):
+ return np.mean(self.items)
+
+ def std(self):
+ return np.std(self.items)
+
+class GradientClip(pl.Callback):
+ def __init__(self, max_grad_norm: Union[float, str]='Q', Q=Queue(3000)) -> None:
+ super().__init__()
+ # self.max_norm = max_norm
+ self.gradnorm_queue = Q
+ if max_grad_norm == 'Q':
+ self.max_grad_norm = max_grad_norm
+ else:
+ self.max_grad_norm = float(max_grad_norm)
+
+ def on_before_optimizer_step(self, trainer: pl.Trainer, pl_module: pl.LightningModule, optimizer: torch.optim.Optimizer) -> None:
+ # zero graidents if they are not finite
+ if self.max_grad_norm == 'Q':
+ max_grad_norm = 1.5 * self.gradnorm_queue.mean() + 2 * self.gradnorm_queue.std()
+ max_grad_norm = max_grad_norm.item()
+ else:
+ max_grad_norm = self.max_grad_norm
+ grad_norm = torch.nn.utils.clip_grad_norm_(
+ pl_module.parameters(), max_norm=max_grad_norm, norm_type=2.0
+ )
+
+ if self.max_grad_norm == 'Q':
+ if float(grad_norm) > max_grad_norm:
+ self.gradnorm_queue.add(float(max_grad_norm))
+ else:
+ self.gradnorm_queue.add(float(grad_norm))
+
+ if float(grad_norm) > max_grad_norm:
+ logging.info(
+ f"Clipped gradient with value {grad_norm:.1f} "
+ f"while allowed {max_grad_norm:.1f}",
+ )
+ pl_module.log_dict(
+ {
+ "grad_norm": grad_norm.item(),
+ 'max_grad_norm': max_grad_norm,
+ },
+ on_step=True,
+ prog_bar=False,
+ logger=True,
+ batch_size=pl_module.train_cfg.batch_size,
+ )
+
+class RecoverCallback(pl.Callback):
+ def __init__(self, latest_ckpt: str, recover_trigger_loss: float=1e3, resume: bool=False) -> None:
+ super().__init__()
+ self.latest_ckpt = latest_ckpt
+ self.recover_trigger_loss = recover_trigger_loss
+ self.resume = resume
+
+ def setup(self, trainer: pl.Trainer, pl_module: pl.LightningModule, stage: str) -> None:
+ super().setup(trainer, pl_module, stage)
+ if os.path.exists(self.latest_ckpt) and self.resume:
+ print(f"recover from checkpoint: {self.latest_ckpt}")
+ checkpoint = torch.load(self.latest_ckpt)
+ pl_module.load_state_dict(checkpoint["state_dict"])
+ # pl_module.load_from_checkpoint(self.latest_ckpt)
+ elif not os.path.exists(self.latest_ckpt) and self.resume:
+ print(
+ f"checkpoint {self.latest_ckpt} not found, training from scratch"
+ )
+
+ def on_train_batch_end(
+ self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: STEP_OUTPUT,
+ batch: Any,
+ batch_idx: int,
+ ) -> None:
+ super().on_train_batch_end(trainer, pl_module, outputs, batch, batch_idx)
+ if "loss" not in outputs:
+ return None
+
+ if outputs["loss"] > self.recover_trigger_loss:
+ logging.warning(
+ f"loss too large: {outputs}\n recovering from checkpoint: {self.latest_ckpt}"
+ )
+ if os.path.exists(self.latest_ckpt):
+ checkpoint = torch.load(self.latest_ckpt)
+ pl_module.load_state_dict(checkpoint["state_dict"])
+ else:
+ for layer in pl_module.children():
+ if hasattr(layer, "reset_parameters"):
+ layer.reset_parameters()
+ logging.warning(
+ f"checkpoint {self.latest_ckpt} not found, training from scratch"
+ )
+
+ else:
+ pass
+
+class TextOverlapEvalCallback(pl.Callback):
+ def __init__(self, tokenizer_type: Optional[str]="BERT") -> None:
+ super().__init__()
+ self.outputs = []
+ self.eval_dataset = None
+ self.tokenizer_type = tokenizer_type
+ if tokenizer_type == "BERT":
+ abs_path = os.path.abspath("./checkpoints/tokenizers/bert-base-uncased/")
+ self.tokenizer = BertTokenizerFast.from_pretrained(abs_path)
+ self.filter_tokens = ["[PAD]", "[CLS]", "[SEP]"]
+ if tokenizer_type == "every" or tokenizer_type is None:
+ self.tokenizer = None
+ self.filter_tokens = []
+
+ def on_validation_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Optional[STEP_OUTPUT],
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0
+ ) -> None:
+ super().on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+ self.outputs.extend(outputs)
+
+ def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_validation_epoch_start(trainer, pl_module)
+ self.status = "val"
+ self.outputs = []
+ self.eval_dataset = trainer.val_dataloaders.dataset
+
+ def on_validation_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
+ from nltk.translate.meteor_score import meteor_score
+ from rouge_score import rouge_scorer
+
+ scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'])
+
+ gts = self.eval_dataset.labels
+ meteor_scores = []
+ rouge_scores_1 = []
+ rouge_scores_2 = []
+ rouge_scores_L = []
+ bleu2, bleu4 = [], []
+ for i in range(len(self.outputs)):
+ if self.tokenizer_type == "every":
+ self.outputs[i] = " ".join([x for x in str(self.outputs[i])])
+ gts[i] = " ".join([x for x in str(gts[i])])
+ rouge = scorer.score(str(self.outputs[i]), str(gts[i]))
+ rouge_scores_1.append(rouge['rouge1'].fmeasure)
+ rouge_scores_2.append(rouge['rouge2'].fmeasure)
+ rouge_scores_L.append(rouge['rougeL'].fmeasure)
+
+ if self.tokenizer_type == "BERT":
+ output_token = self.tokenizer.tokenize(str(self.outputs[i]), truncation=True, max_length=512, padding='max_length')
+ gt_token = self.tokenizer.tokenize(str(gts[i]), truncation=True, max_length=512, padding='max_length')
+ elif self.tokenizer_type == "every" or self.tokenizer_type is None:
+ output_token = str(self.outputs[i]).split(" ")
+ gt_token = str(gts[i]).split(" ")
+ for token in self.filter_tokens:
+ output_token = list(filter(token.__ne__, output_token))
+ gt_token = list(filter(token.__ne__, gt_token))
+ bleu2.append(sentence_bleu([gt_token], output_token, weights=(0.5, 0.5), smoothing_function=SmoothingFunction().method1))
+ bleu4.append(sentence_bleu([gt_token], output_token, weights=(0.25, 0.25, 0.25, 0.25), smoothing_function=SmoothingFunction().method1))
+ meteor_scores.append(meteor_score([gt_token], output_token))
+
+ output_path = os.path.join(trainer.default_root_dir, f"{self.status}_outputs", f"epoch{pl_module.current_epoch}")
+ out_metrics = {
+ f"{self.status}/BLEU-2": np.mean(bleu2),
+ f"{self.status}/BLEU-4": np.mean(bleu4),
+ f"{self.status}/METEOR": np.mean(meteor_scores),
+ f"{self.status}/ROUGE-1": np.mean(rouge_scores_1),
+ f"{self.status}/ROUGE-2": np.mean(rouge_scores_2),
+ f"{self.status}/ROUGE-L": np.mean(rouge_scores_L)
+ }
+ pl_module.log_dict(out_metrics)
+ print(json.dumps(out_metrics, indent=4))
+ json.dump(out_metrics, open(output_path + "_metrics.json", "w"))
+
+ with open(output_path + "_outputs.txt", "w") as f:
+ f.write("Predicted\tGround Truth\tBLEU-2\tBLEU-4\tROUGE-1\tROUGE-2\tROUGE-L\n")
+ for i in range(len(self.outputs)):
+ self.outputs[i] = re.sub(r"[\n\t]", "", str(self.outputs[i]))
+ gts[i] = re.sub(r"[\n\t]", "", str(gts[i]))
+ f.write(f"{self.outputs[i]}\t{gts[i]}\t{bleu2[i]:.4f}\t{bleu4[i]:.4f}\t{rouge_scores_1[i]:.4f}\t{rouge_scores_2[i]:.4f}\t{rouge_scores_L[i]:.4f}\n")
+
+ def on_test_batch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: STEP_OUTPUT,
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int = 0,
+ ) -> None:
+ self.on_validation_batch_end(trainer, pl_module, outputs, batch, batch_idx, dataloader_idx)
+
+ def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None:
+ super().on_test_epoch_start(trainer, pl_module)
+ self.status = "test"
+ self.outputs = []
+ self.eval_dataset = trainer.test_dataloaders.dataset
+
+ def on_test_epoch_end(self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule
+ ) -> None:
+ self.on_validation_epoch_end(trainer, pl_module)
\ No newline at end of file
diff --git a/open_biomed/utils/cluster.py b/open_biomed/utils/cluster.py
new file mode 100644
index 0000000000000000000000000000000000000000..91275db16d8002a508ffa8ecbf9248226dab6d19
--- /dev/null
+++ b/open_biomed/utils/cluster.py
@@ -0,0 +1,48 @@
+import logging
+logger = logging.getLogger(__name__)
+import numpy as np
+
+class UFS(object):
+ def __init__(self, n):
+ self.fa = list(range(n))
+
+ def merge(self, x, y):
+ self.fa[x] = self.find(y)
+
+ def find(self, x):
+ self.fa[x] = self.find(self.fa[x]) if self.fa[x] != x else x
+ return self.fa[x]
+
+def cluster_with_sim_matrix(sim_matrix, threshold):
+ n = len(sim_matrix)
+ e = []
+ f = UFS(n)
+ for i in range(n):
+ for j in range(n):
+ x, y = f.find(i), f.find(j)
+ if x != y and sim_matrix[x][y] > threshold:
+ f.merge(x, y)
+ for k in range(n):
+ sim_matrix[y][k] = min(sim_matrix[y][k], sim_matrix[x][k])
+ clusters = [[] for i in range(n)]
+ for i in range(n):
+ clusters[f.find(i)].append(i)
+ return clusters
+
+def merge_cluster(clusters, n_cluster):
+ merged_clusters = [[] for i in range(n_cluster)]
+ n_cutoff = np.sum([len(cluster) for cluster in clusters]) // n_cluster
+ perm = np.random.permutation(len(clusters))
+ cur = 0
+ for i in perm:
+ if cur < n_cluster - 1 and len(merged_clusters[cur]) + len(clusters[i]) > n_cutoff:
+ if len(merged_clusters[cur]) + len(clusters[i]) - n_cutoff > n_cutoff - len(merged_clusters[cur]):
+ cur += 1
+ merged_clusters[cur].extend(clusters[i])
+ else:
+ merged_clusters[cur].extend(clusters[i])
+ cur += 1
+ else:
+ merged_clusters[cur].extend(clusters[i])
+ logger.info("cluster size: %s" % (", ".join([str(len(merged_cluster)) for merged_cluster in merged_clusters])))
+ return merged_clusters
\ No newline at end of file
diff --git a/open_biomed/utils/collator.py b/open_biomed/utils/collator.py
new file mode 100644
index 0000000000000000000000000000000000000000..b76740bc119a0ccdfa86eeb8ea77945e25f85d6d
--- /dev/null
+++ b/open_biomed/utils/collator.py
@@ -0,0 +1,66 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, List
+from torch_geometric.data import Data, Batch
+import torch
+
+from transformers import AutoTokenizer, DataCollatorWithPadding
+
+class Collator(ABC):
+ def __init__(self) -> None:
+ pass
+
+ @abstractmethod
+ def __call__(self, inputs: List[Any]) -> Any:
+ raise NotImplementedError
+
+ def _collate_single(self, data):
+ if isinstance(data[0], Data):
+ return Batch.from_data_list(data)
+ elif torch.is_tensor(data[0]):
+ return torch.stack([x.squeeze() for x in data])
+ elif isinstance(data[0], int):
+ return torch.tensor(data).view((-1, 1))
+
+class PygCollator(Collator):
+ def __init__(self, follow_batch: List[str]=[], exclude_keys: List[str]=[]) -> None:
+ super().__init__()
+ self.follow_batch = follow_batch
+ self.exclude_keys = exclude_keys
+
+ def __call__(self, inputs: List[Data]) -> Batch:
+ return Batch.from_data_list(inputs, follow_batch=self.follow_batch, exclude_keys=self.exclude_keys)
+
+class ListCollator(Collator):
+ def __call__(self, inputs: List[Any]) -> Any:
+ return inputs
+
+class ClassLabelCollator(Collator):
+ def __call__(self, inputs: List[Any]) -> Any:
+ batch = torch.stack(inputs)
+ return batch
+
+
+class DPCollator(Collator):
+ def __init__(self):
+ super(DPCollator, self).__init__()
+
+ def __call__(self, mols):
+ batch = self._collate_single(mols)
+ return batch
+
+
+class EnsembleCollator(Collator):
+ def __init__(self, to_ensemble: Dict[str, Collator]) -> None:
+ super().__init__()
+ self.collators = {}
+ for k, v in to_ensemble.items():
+ self.collators[k] = v
+
+ def __call__(self, inputs: List[Dict[str, Any]]) -> Dict[Any, Any]:
+ collated = {}
+ for k in inputs[0]:
+ collated[k] = self.collators[k]([item[k] for item in inputs])
+ return collated
+
+ def get_attrs(self) -> List[str]:
+ return list(self.collators.keys())
\ No newline at end of file
diff --git a/open_biomed/utils/config.py b/open_biomed/utils/config.py
new file mode 100644
index 0000000000000000000000000000000000000000..6174e32a5086dc2e1c877d32759bb5fd1dd9ed07
--- /dev/null
+++ b/open_biomed/utils/config.py
@@ -0,0 +1,265 @@
+from typing import Dict
+
+import yaml
+import os
+import re
+from ast import literal_eval
+import argparse
+import json
+import copy
+
+class Struct:
+ def __init__(self, **kwargs):
+ for key, value in kwargs.items():
+ if isinstance(value, dict):
+ self.__dict__[key] = Struct(**value)
+ else:
+ self.__dict__[key] = value
+
+ def todict(self):
+ # recursively convert to dict
+ return {
+ k: v.todict() if isinstance(v, Struct) else v
+ for k, v in self.__dict__.items()
+ }
+
+ def __getitem__(self, index):
+ return self.__dict__[index]
+
+
+class Config:
+ def __init__(self, config_file=None, **kwargs):
+ if config_file is not None:
+ _config = parse_config(path=config_file, subs_dict=kwargs)
+ else:
+ _config = {}
+ for key, value in _config.items():
+ if isinstance(value, dict):
+ self.__dict__[key] = Struct(**value)
+ else:
+ self.__dict__[key] = value
+
+ @classmethod
+ def from_dict(cls, **kwargs):
+ cfg = cls(None)
+ for key, value in kwargs.items():
+ if isinstance(value, dict):
+ cfg.__dict__[key] = Struct(**value)
+ else:
+ cfg.__dict__[key] = value
+ return cfg
+
+ def __getitem__(self, index):
+ return self.__dict__[index]
+
+ def todict(self):
+ # recursively convert to dict
+ return {
+ k: v.todict() if isinstance(v, Struct) else v
+ for k, v in self.__dict__.items()
+ }
+
+ def save2yaml(self, path):
+ with open(path, "w") as f:
+ yaml.dump(self.todict(), f, default_flow_style=False)
+
+ def __str__(self):
+ def prepare_dict4print(dict_):
+ tmp_dict = copy.deepcopy(dict_)
+
+ def recursive_change_list_to_string(d, summarize=16):
+ for k, v in d.items():
+ if isinstance(v, dict):
+ recursive_change_list_to_string(v)
+ elif isinstance(v, list):
+ d[k] = (
+ (
+ str(
+ v[: summarize // 2] + ["..."] + v[-summarize // 2 :]
+ )
+ + f" (len={len(v)})"
+ )
+ if len(v) > summarize
+ else str(v) + f" (len={len(v)})"
+ )
+ else:
+ pass
+
+ recursive_change_list_to_string(tmp_dict)
+ return tmp_dict
+
+ return json.dumps(prepare_dict4print(self.todict()), indent=4, sort_keys=False)
+
+
+def simplest_type(s):
+ try:
+ return literal_eval(s)
+ except:
+ return s
+
+
+# enable parsing of environment variables in yaml files
+def parse_config(
+ path=None,
+ data=None,
+ subs_dict={},
+ envtag="!ENV",
+ substag="!SUB",
+ envsubstag="!ENVSUB",
+):
+ # pattern for global vars: look for ${word}
+ pattern = re.compile(".*?\${([\w:\-\.]+)}.*?")
+ loader = yaml.FullLoader
+
+ # the tag will be used to mark where to start searching for the pattern
+ # e.g. somekey: !ENV somestring${MYENVVAR}blah blah blah
+ loader.add_implicit_resolver(envtag, pattern, None)
+ loader.add_implicit_resolver(substag, pattern, None)
+ loader.add_implicit_resolver(envsubstag, pattern, None)
+
+ def constructor_env_variables(loader, node):
+ """
+ Extracts the environment variable from the node's value
+ :param yaml.Loader loader: the yaml loader
+ :param node: the current node in the yaml
+ :return: the parsed string that contains the value of the environment
+ variable
+ """
+ value = loader.construct_scalar(node)
+ match = pattern.findall(value) # to find all env variables in line
+ if match:
+ full_value = value
+ for g in match:
+ vname, sep, default_val = g.partition(":-")
+ full_value = full_value.replace(
+ f"${{{g}}}", os.environ.get(vname, default_val)
+ )
+ return simplest_type(full_value)
+ return simplest_type(value)
+
+ def constructor_subs_variables(loader, node):
+ """
+ Extracts the environment variable from the node's value
+ :param yaml.Loader loader: the yaml loader
+ :param node: the current node in the yaml
+ :return: the parsed string that contains the value of the environment
+ variable
+ """
+ value = loader.construct_scalar(node)
+ match = pattern.findall(value) # to find all env variables in line
+ # print(value)
+ # print(match)
+ if match:
+ full_value = value
+ for g in match:
+ vname, sep, default_val = g.partition(":-")
+ if len(str(subs_dict.get(vname, default_val))) == 0:
+ raise ValueError(
+ f"""argument `{vname}` required,
+ should be specified from command line with: --{vname} ,
+ or set a default value for `{vname}` in `{path}` file.
+ """
+ )
+ full_value = full_value.replace(
+ f"${{{g}}}", str(subs_dict.get(vname, default_val))
+ )
+ return simplest_type(full_value)
+ return simplest_type(value)
+
+ def constructor_envsubs_variables(loader, node):
+ """
+ Extracts the environment variable from the node's value
+ :param yaml.Loader loader: the yaml loader
+ :param node: the current node in the yaml
+ :return: the parsed string that contains the value of the environment
+ variable
+ """
+ value = loader.construct_scalar(node)
+ match = pattern.findall(value) # to find all env variables in line
+ if match:
+ full_value = value
+ for g in match:
+ vname, sep, default_val = g.partition(":-")
+ if (
+ len(str(subs_dict.get(vname, default_val))) == 0
+ and len(str(os.environ.get(vname, default_val))) == 0
+ ):
+ raise ValueError(
+ f"""argument `{vname}` required,
+ should be specified from command line with: --{vname} ,
+ or set a default value for `{vname}` in `{path}` file.
+ """
+ )
+ full_value = full_value.replace(
+ f"${{{g}}}",
+ str(subs_dict.get(vname, os.environ.get(vname, default_val))),
+ )
+ return simplest_type(full_value)
+ return simplest_type(value)
+
+ def constructor_pathjoin(loader, node):
+ value = loader.construct_sequence(node)
+ value = [str(v) for v in value]
+ return os.path.join(*value)
+
+ def constructor_strjoin(loader, node):
+ value = loader.construct_sequence(node)
+ value = [str(v) for v in value]
+ return "".join(value)
+
+ def constructor_listadd(loader, node):
+ value = loader.construct_sequence(node)
+ value = sum([simplest_type(v) for v in value])
+ return value
+
+ def constructor_listmul(loader, node):
+ value = loader.construct_sequence(node)
+ ret = 1
+ for v in value:
+ ret *= simplest_type(v)
+ return ret
+
+ loader.add_constructor(envtag, constructor_env_variables)
+ loader.add_constructor(substag, constructor_subs_variables)
+ loader.add_constructor(envsubstag, constructor_envsubs_variables)
+ loader.add_constructor("!PATHJOIN", constructor_pathjoin)
+ loader.add_constructor("!STRJOIN", constructor_strjoin)
+ loader.add_constructor("!LISTADD", constructor_listadd)
+ loader.add_constructor("!LISTMUL", constructor_listmul)
+
+ if path:
+ with open(path) as conf_data:
+ return yaml.load(conf_data, Loader=loader)
+ elif data:
+ return yaml.load(data, Loader=loader)
+ else:
+ raise ValueError("Either a path or data should be defined as input")
+
+def merge_config(cfg1: Config, cfg2: Config) -> Config:
+ # Combine config values in cfg2 into cfg
+ # NOTE: the values in cfg2 will overwrite those in cfg1 for overlapping keys
+ def recursive_merge(cfg1: Struct, cfg2: Struct) -> None:
+ for key, value in cfg2.__dict__.items():
+ if isinstance(value, Struct) and key in cfg1.__dict__:
+ recursive_merge(cfg1.__dict__[key], cfg2.__dict__[key])
+ else:
+ cfg1.__dict__[key] = value
+ return cfg1
+ return recursive_merge(cfg1, cfg2)
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--config_file",
+ type=str,
+ default="../debug.yaml",
+ )
+ parser.add_argument("--batch_size", type=int, default=32)
+ parser.add_argument("--no_wandb", action="store_true")
+ parser.add_argument("--lr", type=float, default=1e-3)
+ parser.add_argument("--exp_name", type=str, default="debug")
+ parser.add_argument("--debug", action="store_true")
+ parser.add_argument("--epochs", type=int, default=100)
+ _args, unknown = parser.parse_known_args()
+ cfg = Config(**_args.__dict__)
+ print(f"The config of this process is:\n{cfg}")
diff --git a/open_biomed/utils/distributed.py b/open_biomed/utils/distributed.py
new file mode 100644
index 0000000000000000000000000000000000000000..f16a97a8d4f6481561d13e9259bad6f2db7792d9
--- /dev/null
+++ b/open_biomed/utils/distributed.py
@@ -0,0 +1,14 @@
+def setup_outputs_for_distributed(is_master, cfg):
+ """
+ This function disables printing when not in master process
+ """
+ import builtins as __builtin__
+ builtin_print = __builtin__.print
+
+ def print(*args, **kwargs):
+ force = kwargs.pop('force', False)
+ if is_master or force:
+ builtin_print(*args, **kwargs)
+
+ __builtin__.print = print
+ cfg.logging_level = "error"
\ No newline at end of file
diff --git a/open_biomed/utils/exception.py b/open_biomed/utils/exception.py
new file mode 100644
index 0000000000000000000000000000000000000000..6bd1ab5836945464da902d844a5b1a5c1e1123d4
--- /dev/null
+++ b/open_biomed/utils/exception.py
@@ -0,0 +1,9 @@
+
+
+class MoleculeConstructError(Exception):
+ def __init__(self, *args: object) -> None:
+ super(MoleculeConstructError, self).__init__(*args)
+
+class ProteinConstructError(Exception):
+ def __init__(self, *args: object) -> None:
+ super(ProteinConstructError).__init__(*args)
\ No newline at end of file
diff --git a/open_biomed/utils/featurizer.py b/open_biomed/utils/featurizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..65c76a0f28d303c45b1d5dcb9d7a6225c6b17e9b
--- /dev/null
+++ b/open_biomed/utils/featurizer.py
@@ -0,0 +1,179 @@
+from abc import ABC, abstractmethod
+from typing import Any, Dict, Generic, List, TypeVar
+
+import os
+import sys
+import numpy as np
+sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
+
+import torch
+from transformers import BatchEncoding, T5Tokenizer
+from transformers.tokenization_utils import PreTrainedTokenizer
+
+from open_biomed.data import Molecule, Protein, Pocket, Text
+
+T = TypeVar('T', bound=Any)
+
+class Featurized(Generic[T]):
+ def __init__(self, value: T):
+ self.value = value
+
+class Featurizer(ABC):
+ def __init__(self) -> None:
+ pass
+
+ @abstractmethod
+ def __call__(self, *args: Any, **kwargs: Any) -> Dict[str, Any]:
+ raise NotImplementedError
+
+ @abstractmethod
+ def get_attrs(self) -> List[str]:
+ raise NotImplementedError
+
+class MoleculeFeaturizer(Featurizer):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @abstractmethod
+ def __call__(self, molecule: Molecule) -> Dict[str, Any]:
+ raise NotImplementedError
+
+ def get_attrs(self) -> List[str]:
+ return ["molecule"]
+
+class MoleculeTransformersFeaturizer(MoleculeFeaturizer):
+ def __init__(self,
+ tokenizer: PreTrainedTokenizer,
+ max_length: int=512,
+ add_special_tokens: bool=True,
+ base: str='SMILES',
+ ) -> None:
+ super().__init__()
+ self.tokenizer = tokenizer
+ self.max_length = max_length
+ self.add_special_tokens = add_special_tokens
+ self.base = base
+ if base not in ["SMILES", "SELFIES"]:
+ raise ValueError(f"{base} is not a valid 1D representaiton of molecules!")
+
+ def __call__(self, molecule: Molecule) -> BatchEncoding:
+ if self.base == "SMILES":
+ molecule._add_smiles()
+ parse_str = molecule.smiles
+ if self.base == "SELFIES":
+ molecule._add_selfies()
+ parse_str = molecule.selfies
+ return self.tokenizer(
+ parse_str,
+ max_length=self.max_length,
+ truncation=True,
+ add_special_tokens=self.add_special_tokens,
+ )
+
+class TextFeaturizer(Featurizer):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @abstractmethod
+ def __call__(self, text: Text) -> Dict[str, Any]:
+ raise NotImplementedError
+
+ def get_attrs(self) -> List[str]:
+ return ["text"]
+
+class TextTransformersFeaturizer(TextFeaturizer):
+ def __init__(self,
+ tokenizer: PreTrainedTokenizer,
+ max_length: int=512,
+ add_special_tokens: bool=True,
+ ) -> None:
+ super().__init__()
+ self.tokenizer = tokenizer
+ self.max_length = max_length
+ self.add_special_tokens = add_special_tokens
+
+ def __call__(self, text: Text) -> BatchEncoding:
+ return self.tokenizer(
+ text.str,
+ max_length=self.max_length,
+ truncation=True,
+ add_special_tokens=self.add_special_tokens,
+ )
+
+class ProteinFeaturizer(Featurizer):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @abstractmethod
+ def __call__(self, protein: Protein) -> Dict[str, Any]:
+ raise NotImplementedError
+
+ def get_attrs(self) -> List[str]:
+ return ["protein"]
+
+class ProteinTransformersFeaturizer(ProteinFeaturizer):
+ def __init__(self,
+ tokenizer: PreTrainedTokenizer,
+ max_length: int=1024,
+ add_special_tokens: bool=True,
+ ) -> None:
+ super().__init__()
+ self.tokenizer = tokenizer
+ self.max_length = max_length
+ self.add_special_tokens = add_special_tokens
+
+ def __call__(self, protein: Protein) -> Dict[str, Any]:
+ return self.tokenizer(
+ protein.sequence,
+ max_length=self.max_length,
+ truncation=True,
+ add_special_tokens=self.add_special_tokens,
+ )
+
+class PocketFeaturizer(Featurizer):
+ def __init__(self) -> None:
+ super().__init__()
+
+ @abstractmethod
+ def __call__(self, pocket: Pocket) -> Dict[str, Any]:
+ raise NotImplementedError
+
+ def get_attrs(self) -> List[str]:
+ return ["pocket"]
+
+# For classification tasks, directly convert numbers or arrays into tensors.
+class ClassLabelFeaturizer(Featurizer):
+ def __init__(self) -> None:
+ super().__init__()
+
+ # Input a number or an array, and return a tensor.
+ def __call__(self, label: np.array) -> torch.tensor:
+ return torch.tensor(label)
+
+ def get_attrs(self) -> List[str]:
+ return ["classlabel"]
+
+
+class EnsembleFeaturizer(Featurizer):
+ def __init__(self, to_ensemble: Dict[str, Featurizer]) -> None:
+ super().__init__()
+ self.featurizers = {}
+ for k, v in to_ensemble.items():
+ self.featurizers[k] = v
+
+ def __call__(self, **kwargs: Any) -> Dict[Any, Any]:
+ featurized = {}
+ for k, v in kwargs.items():
+ featurized[k] = self.featurizers[k](v)
+ return featurized
+
+ def get_attrs(self) -> List[str]:
+ return list(self.featurizers.keys())
+
+if __name__ == "__main__":
+ from transformers import DataCollatorWithPadding
+ featurizer = TextTransformersFeaturizer(T5Tokenizer.from_pretrained("./checkpoints/molt5/base"))
+ a = featurizer(text=Text.from_str("Hello"))
+ b = featurizer(text=Text.from_str("Hello World"))
+ collator = DataCollatorWithPadding(featurizer.tokenizer, padding=True)
+ print(collator([a, b]))
\ No newline at end of file
diff --git a/open_biomed/utils/logger.py b/open_biomed/utils/logger.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/open_biomed/utils/misc.py b/open_biomed/utils/misc.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a4507a1bd0ed0064833cf4cdf608779399d4339
--- /dev/null
+++ b/open_biomed/utils/misc.py
@@ -0,0 +1,114 @@
+from typing import Any, Dict, List, Optional, TextIO
+
+import numpy as np
+import random
+import torch
+import os
+from transformers import BatchEncoding, PreTrainedTokenizer
+
+from open_biomed.data import Molecule, Pocket, Protein, Text
+
+def sub_dict(in_dict: dict[str, Any], keys_to_include: List[str]) -> dict[str, Any]:
+ # Get a sub-dictionary based on keys_to_include
+ return {k: in_dict[k] for k in keys_to_include}
+
+def sub_batch_by_interval(start: int, end: int, **kwargs: Dict[str, List[Any]]) -> Dict[str, List[Any]]:
+ # Construct a smaller batch from [start, end) of the original batch
+ new_batch = {}
+ for key in kwargs:
+ new_batch[key] = kwargs[key][start:end]
+ return new_batch
+
+def safe_index(l: List[Any], e: Any) -> int:
+ # Return index of element e in list l. If e is not present, return the last index
+ try:
+ return l.index(e)
+ except:
+ return len(l) - 1
+
+def concatenate_tokens(tokens_to_concat: List[BatchEncoding]) -> BatchEncoding:
+ # Concatenate multiple tokenized results by putting the non-padding tokens together
+ batch_size = tokens_to_concat[0].input_ids.shape[0]
+ concatenated = {
+ "input_ids": torch.cat([tokens.input_ids for tokens in tokens_to_concat], dim=-1),
+ "attention_mask": torch.cat([tokens.attention_mask for tokens in tokens_to_concat], dim=-1),
+ }
+ non_padding_length = concatenated["attention_mask"].sum(-1)
+ max_length = non_padding_length.max().item()
+
+ new_input_ids = []
+ new_attention_mask = []
+ for i in range(batch_size):
+ perm = torch.cat([
+ torch.where(concatenated["attention_mask"][i] == 1)[0], # non-padding tokens
+ torch.where(concatenated["attention_mask"][i] == 0)[0], # padding tokens
+ ])
+ new_input_ids.append(concatenated["input_ids"][i][perm[:max_length]])
+ new_attention_mask.append(concatenated["attention_mask"][i][perm[:max_length]])
+
+ return BatchEncoding({
+ "input_ids": torch.stack(new_input_ids, dim=0),
+ "attention_mask": torch.stack(new_attention_mask, dim=0),
+ })
+
+def collate_objects_as_list(inputs: List[Dict[str, Any]]) -> Dict[str, Any]:
+ outputs = {}
+ for sample in inputs:
+ for k, v in sample.items():
+ if k not in outputs:
+ outputs[k] = []
+ outputs[k].append(v)
+ return outputs
+
+def wrap_and_select_outputs(outputs: Any, context: Optional[TextIO]=None) -> Dict[str, Any]:
+ if isinstance(outputs, tuple):
+ outputs = outputs[0]
+ if isinstance(outputs, list):
+ if isinstance(outputs[0], list):
+ outputs = outputs[0]
+ selected = random.randint(0, len(outputs) - 1)
+ if len(outputs) > 1 and context is not None:
+ context.write(f"Selected {selected}th output for downstream tools.\n")
+ outputs = outputs[selected]
+ if isinstance(outputs, tuple):
+ wrapped_all = {}
+ for out in outputs:
+ wrapped = wrap_and_select_outputs(out)
+ for key, value in wrapped.items():
+ wrapped_all[key] = value
+ return wrapped_all
+ elif isinstance(outputs, Molecule):
+ return {"molecule": outputs}
+ elif isinstance(outputs, Protein):
+ return {"protein": outputs}
+ elif isinstance(outputs, Pocket):
+ return {"pocket": outputs}
+ elif isinstance(outputs, Text):
+ return {"text": outputs}
+ else:
+ return {"output": outputs}
+
+def create_tool_input(data_type: str, value: str) -> Any:
+ if data_type == "molecule":
+ if value.endswith(".sdf"):
+ return Molecule.from_sdf_file(value)
+ elif value.endswith(".pkl"):
+ return Molecule.from_binary_file(value)
+ else:
+ return Molecule.from_smiles(value)
+ elif data_type == "protein":
+ if value.endswith(".pdb"):
+ return Protein.from_pdb_file(value)
+ if os.path.exists(value.replace(".pkl", ".pdb")):
+ return Protein.from_pdb_file(value.replace(".pkl", ".pdb"))
+ if value.endswith(".pkl"):
+ return Protein.from_binary_file(value)
+ else:
+ return Protein.from_fasta(value)
+ elif data_type == "pocket":
+ return Pocket.from_binary_file(value)
+ elif data_type == "text":
+ return Text.from_str(value)
+ else:
+ return value
+
\ No newline at end of file
diff --git a/open_biomed/utils/mol_featurizer.py b/open_biomed/utils/mol_featurizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..8824a951bb4c55f19cac05ccf05511ccb5a86c1c
--- /dev/null
+++ b/open_biomed/utils/mol_featurizer.py
@@ -0,0 +1,452 @@
+import logging
+logger = logging.getLogger(__name__)
+
+import os
+import sys
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+
+
+import argparse
+import copy
+import json
+import numpy as np
+import pickle
+
+import torch
+
+import rdkit.Chem as Chem
+from rdkit.Chem import DataStructs, rdmolops
+from rdkit.Chem import AllChem, Descriptors
+from rdkit.Chem.rdMHFPFingerprint import MHFPEncoder
+from rdkit import RDLogger
+RDLogger.DisableLog("rdApp.*")
+
+from sklearn.preprocessing import OneHotEncoder
+from torch_geometric.data import Data
+from transformers import BertTokenizer, T5Tokenizer
+
+from .featurizer import MoleculeFeaturizer
+
+from open_biomed.data.molecule import Molecule
+
+
+def one_hot_encoding(x, allowable_set, encode_unknown=False):
+ """One-hot encoding.
+ """
+ if encode_unknown and (allowable_set[-1] is not None):
+ allowable_set.append(None)
+
+ if encode_unknown and (x not in allowable_set):
+ x = None
+
+ return list(map(lambda s: x == s, allowable_set))
+
+def safe_index(l, e):
+ """
+ Return index of element e in list l. If e is not present, return the last index
+ """
+ try:
+ return l.index(e)
+ except:
+ return len(l) - 1
+
+# Atom featurization: Borrowed from dgllife.utils.featurizers.py
+
+def atom_type_one_hot(atom, allowable_set=None, encode_unknown=False):
+ """One hot encoding for the type of an atom.
+ """
+ if allowable_set is None:
+ allowable_set = ['C', 'N', 'O', 'S', 'F', 'Si', 'P', 'Cl', 'Br', 'Mg', 'Na', 'Ca',
+ 'Fe', 'As', 'Al', 'I', 'B', 'V', 'K', 'Tl', 'Yb', 'Sb', 'Sn',
+ 'Ag', 'Pd', 'Co', 'Se', 'Ti', 'Zn', 'H', 'Li', 'Ge', 'Cu', 'Au',
+ 'Ni', 'Cd', 'In', 'Mn', 'Zr', 'Cr', 'Pt', 'Hg', 'Pb']
+ return one_hot_encoding(atom.GetSymbol(), allowable_set, encode_unknown)
+
+def atom_degree_one_hot(atom, allowable_set=None, encode_unknown=False):
+ """One hot encoding for the degree of an atom.
+ """
+ if allowable_set is None:
+ allowable_set = list(range(11))
+ return one_hot_encoding(atom.GetDegree(), allowable_set, encode_unknown)
+
+def atom_implicit_valence_one_hot(atom, allowable_set=None, encode_unknown=False):
+ """One hot encoding for the implicit valence of an atom.
+ """
+ if allowable_set is None:
+ allowable_set = list(range(7))
+ return one_hot_encoding(atom.GetImplicitValence(), allowable_set, encode_unknown)
+
+def atom_formal_charge(atom):
+ """Get formal charge for an atom.
+ """
+ return [atom.GetFormalCharge()]
+
+def atom_num_radical_electrons(atom):
+ return [atom.GetNumRadicalElectrons()]
+
+def atom_hybridization_one_hot(atom, allowable_set=None, encode_unknown=False):
+ """One hot encoding for the hybridization of an atom.
+ """
+ if allowable_set is None:
+ allowable_set = [Chem.rdchem.HybridizationType.SP,
+ Chem.rdchem.HybridizationType.SP2,
+ Chem.rdchem.HybridizationType.SP3,
+ Chem.rdchem.HybridizationType.SP3D,
+ Chem.rdchem.HybridizationType.SP3D2]
+ return one_hot_encoding(atom.GetHybridization(), allowable_set, encode_unknown)
+
+def atom_is_aromatic(atom):
+ """Get whether the atom is aromatic.
+ """
+ return [atom.GetIsAromatic()]
+
+def atom_total_num_H_one_hot(atom, allowable_set=None, encode_unknown=False):
+ """One hot encoding for the total number of Hs of an atom.
+ """
+ if allowable_set is None:
+ allowable_set = list(range(5))
+ return one_hot_encoding(atom.GetTotalNumHs(), allowable_set, encode_unknown)
+
+def atom_is_in_ring(atom):
+ """Get whether the atom is in ring.
+ """
+ return [atom.IsInRing()]
+
+def atom_chirality_type_one_hot(atom, allowable_set=None, encode_unknown=False):
+ """One hot encoding for the chirality type of an atom.
+ """
+ if not atom.HasProp('_CIPCode'):
+ return [False, False]
+
+ if allowable_set is None:
+ allowable_set = ['R', 'S']
+ return one_hot_encoding(atom.GetProp('_CIPCode'), allowable_set, encode_unknown)
+
+# Atom featurization: Borrowed from dgllife.utils.featurizers.py
+
+def bond_type_one_hot(bond, allowable_set=None, encode_unknown=False):
+ """One hot encoding for the type of a bond.
+ """
+ if allowable_set is None:
+ allowable_set = [Chem.rdchem.BondType.SINGLE,
+ Chem.rdchem.BondType.DOUBLE,
+ Chem.rdchem.BondType.TRIPLE,
+ Chem.rdchem.BondType.AROMATIC]
+ return one_hot_encoding(bond.GetBondType(), allowable_set, encode_unknown)
+
+class MolOneHotFeaturizer(MoleculeFeaturizer):
+ smiles_char = ['?', '#', '%', ')', '(', '+', '-', '.', '1', '0', '3', '2', '5', '4',
+ '7', '6', '9', '8', '=', 'A', 'C', 'B', 'E', 'D', 'G', 'F', 'I',
+ 'H', 'K', 'M', 'L', 'O', 'N', 'P', 'S', 'R', 'U', 'T', 'W', 'V',
+ 'Y', '[', 'Z', ']', '_', 'a', 'c', 'b', 'e', 'd', 'g', 'f', 'i',
+ 'h', 'm', 'l', 'o', 'n', 's', 'r', 'u', 't', 'y']
+
+ def __init__(self, config):
+ super(MolOneHotFeaturizer, self).__init__()
+ self.max_len = config["max_len"]
+ self.enc = OneHotEncoder().fit(np.array(self.smiles_char).reshape(-1, 1))
+
+ def __call__(self, data):
+ temp = [c if c in self.smiles_char else '?' for c in data]
+ if len(temp) < self.max_len:
+ temp = temp + ['?'] * (self.max_len - len(temp))
+ else:
+ temp = temp[:self.max_len]
+ return torch.tensor(self.enc.transform(np.array(temp).reshape(-1, 1)).toarray().T)
+
+class MolGraphFeaturizer(MoleculeFeaturizer):
+ allowable_features = {
+ 'possible_atomic_num_list': list(range(1, 119)) + ['misc'],
+ 'possible_formal_charge_list': [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 'misc'],
+ 'possible_chirality_list': [
+ Chem.rdchem.ChiralType.CHI_UNSPECIFIED,
+ Chem.rdchem.ChiralType.CHI_TETRAHEDRAL_CW,
+ Chem.rdchem.ChiralType.CHI_TETRAHEDRAL_CCW,
+ Chem.rdchem.ChiralType.CHI_OTHER
+ ],
+ 'possible_hybridization_list': [
+ Chem.rdchem.HybridizationType.SP,
+ Chem.rdchem.HybridizationType.SP2,
+ Chem.rdchem.HybridizationType.SP3,
+ Chem.rdchem.HybridizationType.SP3D,
+ Chem.rdchem.HybridizationType.SP3D2,
+ Chem.rdchem.HybridizationType.UNSPECIFIED,
+ 'misc'
+ ],
+ 'possible_numH_list': [0, 1, 2, 3, 4, 5, 6, 7, 8, 'misc'],
+ 'possible_implicit_valence_list': [0, 1, 2, 3, 4, 5, 6],
+ 'possible_degree_list': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'misc'],
+ 'possible_number_radical_e_list': [0, 1, 2, 3, 4, 'misc'],
+ 'possible_is_aromatic_list': [False, True],
+ 'possible_is_in_ring_list': [False, True],
+ 'possible_bond_type_list': [
+ Chem.rdchem.BondType.SINGLE,
+ Chem.rdchem.BondType.DOUBLE,
+ Chem.rdchem.BondType.TRIPLE,
+ Chem.rdchem.BondType.AROMATIC,
+ 'misc'
+ ],
+ 'possible_bond_dirs': [ # only for double bond stereo information
+ Chem.rdchem.BondDir.NONE,
+ Chem.rdchem.BondDir.ENDUPRIGHT,
+ Chem.rdchem.BondDir.ENDDOWNRIGHT
+ ],
+ 'possible_bond_stereo_list': [
+ Chem.rdchem.BondStereo.STEREONONE,
+ Chem.rdchem.BondStereo.STEREOZ,
+ Chem.rdchem.BondStereo.STEREOE,
+ Chem.rdchem.BondStereo.STEREOCIS,
+ Chem.rdchem.BondStereo.STEREOTRANS,
+ Chem.rdchem.BondStereo.STEREOANY,
+ ],
+ 'possible_is_conjugated_list': [False, True]
+ }
+
+ def __init__(self, config):
+ super(MolGraphFeaturizer, self).__init__()
+ self.config = config
+ if self.config["name"] == "unimap":
+ self.allowable_features["possible_atomic_num_list"] = self.allowable_features["possible_atomic_num_list"][:-1] + ['[MASK]', 'misc']
+ self.allowable_features["possible_bond_type_list"] = self.allowable_features["possible_bond_type_list"][:-1] + ['[MASK]', '[SELF]', 'misc']
+ self.allowable_features["possible_bond_stereo_list"] = self.allowable_features["possible_bond_stereo_list"] + ['[MASK]']
+ self.allowable_features["possible_hybridization_list"] = self.allowable_features["possible_hybridization_list"][:-2] + ['misc']
+
+ def __call__(self, data):
+ if isinstance(data, Molecule):
+ mol = Chem.MolFromSmiles(data.smiles)
+ # mol = AllChem.MolFromSmiles(data)
+ else:
+ mol = data
+ # atoms
+ atom_features_list = []
+ for atom in mol.GetAtoms():
+ if self.config["name"] in ["ogb", "unimap"]:
+ atom_feature = [
+ safe_index(self.allowable_features['possible_atomic_num_list'], atom.GetAtomicNum()),
+ self.allowable_features['possible_chirality_list'].index(atom.GetChiralTag()),
+ safe_index(self.allowable_features['possible_degree_list'], atom.GetTotalDegree()),
+ safe_index(self.allowable_features['possible_formal_charge_list'], atom.GetFormalCharge()),
+ safe_index(self.allowable_features['possible_numH_list'], atom.GetTotalNumHs()),
+ safe_index(self.allowable_features['possible_number_radical_e_list'], atom.GetNumRadicalElectrons()),
+ safe_index(self.allowable_features['possible_hybridization_list'], atom.GetHybridization()),
+ self.allowable_features['possible_is_aromatic_list'].index(atom.GetIsAromatic()),
+ self.allowable_features['possible_is_in_ring_list'].index(atom.IsInRing()),
+ ]
+ else:
+ atom_feature = [
+ safe_index(self.allowable_features['possible_atomic_num_list'], atom.GetAtomicNum()),
+ self.allowable_features['possible_chirality_list'].index(atom.GetChiralTag())
+ ]
+ atom_features_list.append(atom_feature)
+ x = torch.tensor(np.array(atom_features_list), dtype=torch.long)
+
+ # bonds
+ if len(mol.GetBonds()) <= 0: # mol has no bonds
+ num_bond_features = 3 if self.config["name"] in ["ogb", "unimap"] else 2
+ edge_index = torch.empty((2, 0), dtype=torch.long)
+ edge_attr = torch.empty((0, num_bond_features), dtype=torch.long)
+ else: # mol has bonds
+ edges_list = []
+ edge_features_list = []
+ for bond in mol.GetBonds():
+ i = bond.GetBeginAtomIdx()
+ j = bond.GetEndAtomIdx()
+ if self.config["name"] in ["ogb", "unimap"]:
+ edge_feature = [
+ safe_index(self.allowable_features['possible_bond_type_list'], bond.GetBondType()),
+ self.allowable_features['possible_bond_stereo_list'].index(bond.GetStereo()),
+ self.allowable_features['possible_is_conjugated_list'].index(bond.GetIsConjugated()),
+ ]
+ else:
+ edge_feature = [
+ self.allowable_features['possible_bond_type_list'].index(bond.GetBondType()),
+ self.allowable_features['possible_bond_dirs'].index(bond.GetBondDir())
+ ]
+ edges_list.append((i, j))
+ edge_features_list.append(edge_feature)
+ edges_list.append((j, i))
+ edge_features_list.append(edge_feature)
+
+ # data.edge_index: Graph connectivity in COO format with shape [2, num_edges]
+ edge_index = torch.tensor(np.array(edges_list).T, dtype=torch.long)
+
+ # data.edge_attr: Edge feature matrix with shape [num_edges, num_edge_features]
+ edge_attr = torch.tensor(np.array(edge_features_list), dtype=torch.long)
+
+ data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr)
+
+ return data
+
+class MolGGNNFeaturizer(MoleculeFeaturizer):
+ def __init__(self, config):
+ super(MolGGNNFeaturizer, self).__init__()
+ self.max_n_atoms = config["max_n_atoms"]
+ self.atomic_num_list = config["atomic_num_list"]
+ self.bond_type_list = [
+ Chem.rdchem.BondType.SINGLE,
+ Chem.rdchem.BondType.DOUBLE,
+ Chem.rdchem.BondType.TRIPLE,
+ 'misc'
+ ]
+
+ def __call__(self, data):
+ if isinstance(data, str):
+ mol = Chem.MolFromSmiles(data)
+ else:
+ mol = data
+ Chem.Kekulize(mol)
+ x = self._construct_atomic_number_array(mol, self.max_n_atoms)
+ adj = self._construct_adj_matrix(mol, self.max_n_atoms)
+ return x, adj, self._rescale_adj(adj)
+
+ def _construct_atomic_number_array(self, mol, out_size=-1):
+ """Returns atomic numbers of atoms consisting a molecule.
+
+ Args:
+ mol (rdkit.Chem.Mol): Input molecule.
+ out_size (int): The size of returned array.
+ If this option is negative, it does not take any effect.
+ Otherwise, it must be larger than the number of atoms
+ in the input molecules. In that case, the tail of
+ the array is padded with zeros.
+
+ Returns:
+ torch.tensor: a tensor consisting of atomic numbers
+ of atoms in the molecule.
+ """
+
+ atom_list = [a.GetAtomicNum() for a in mol.GetAtoms()]
+ if len(atom_list) > self.max_n_atoms:
+ atom_list = atom_list[:self.max_n_atoms]
+
+ if out_size < 0:
+ result = torch.zeros(len(atom_list), len(self.atomic_num_list))
+ else:
+ result = torch.zeros(out_size, len(self.atomic_num_list))
+ for i, atom in enumerate(atom_list):
+ result[i, safe_index(self.atomic_num_list, atom)] = 1
+ for i in range(len(atom_list), self.max_n_atoms):
+ result[i, -1] = 1
+ return result
+
+ def _construct_adj_matrix(self, mol, out_size=-1, self_connection=True):
+ """Returns the adjacent matrix of the given molecule.
+
+ This function returns the adjacent matrix of the given molecule.
+ Contrary to the specification of
+ :func:`rdkit.Chem.rdmolops.GetAdjacencyMatrix`,
+ The diagonal entries of the returned matrix are all-one.
+
+ Args:
+ mol (rdkit.Chem.Mol): Input molecule.
+ out_size (int): The size of the returned matrix.
+ If this option is negative, it does not take any effect.
+ Otherwise, it must be larger than the number of atoms
+ in the input molecules. In that case, the adjacent
+ matrix is expanded and zeros are padded to right
+ columns and bottom rows.
+ self_connection (bool): Add self connection or not.
+ If True, diagonal element of adjacency matrix is filled with 1.
+
+ Returns:
+ adj (torch.tensor): The adjacent matrix of the input molecule.
+ It is 2-dimensional tensor with shape (atoms1, atoms2), where
+ atoms1 & atoms2 represent from and to of the edge respectively.
+ If ``out_size`` is non-negative, the returned
+ its size is equal to that value. Otherwise,
+ it is equal to the number of atoms in the the molecule.
+ """
+
+ if out_size < 0:
+ adj = torch.zeros(4, mol.GetNumAtoms(), mol.GetNumAtoms())
+ else:
+ adj = torch.zeros(4, out_size, out_size)
+ for bond in mol.GetBonds():
+ i = bond.GetBeginAtomIdx()
+ j = bond.GetEndAtomIdx()
+ adj[safe_index(self.bond_type_list, bond.GetBondType()), i, j] = 1
+ adj[safe_index(self.bond_type_list, bond.GetBondType()), j, i] = 1
+ adj[3] = 1 - torch.sum(adj[:3], dim=0)
+ return adj
+
+ def _rescale_adj(self, adj):
+ # Previous paper didn't use rescale_adj.
+ # In their implementation, the normalization sum is: num_neighbors = F.sum(adj, axis=(1, 2))
+ # In this implementation, the normaliztion term is different
+ # raise NotImplementedError
+ # (256,4,9, 9):
+ # 4: single, double, triple, and bond between disconnected atoms (negative mask of sum of previous)
+ # 1-adj[i,:3,:,:].sum(dim=0) == adj[i,4,:,:]
+ # usually first 3 matrices have no diagnal, the last has.
+ # A_prime = self.A + sp.eye(self.A.shape[0])
+ num_neighbors = adj.sum(dim=(0, 1)).float()
+ num_neighbors_inv = num_neighbors.pow(-1)
+ num_neighbors_inv[num_neighbors_inv == float('inf')] = 0
+ adj_prime = num_neighbors_inv[None, None, :] * adj
+ return adj_prime
+
+class MolMGNNFeaturizer(MoleculeFeaturizer):
+ allowable_atom_list = ['C', 'N', 'O', 'S', 'F', 'Si', 'P', 'Cl', 'Br', 'Mg', 'Na','Ca', 'Fe', 'As', 'Al', 'I', 'B', 'V', 'K', 'Tl', 'Yb','Sb', 'Sn', 'Ag', 'Pd', 'Co', 'Se', 'Ti', 'Zn', 'H','Li', 'Ge', 'Cu', 'Au', 'Ni', 'Cd', 'In', 'Mn', 'Zr','Cr', 'Pt', 'Hg', 'Pb', 'Unknown']
+ allowable_degree_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ allowable_num_hs_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ allowable_implicit_valence_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ allowable_hybridization_list = [
+ Chem.rdchem.HybridizationType.SP,
+ Chem.rdchem.HybridizationType.SP2,
+ Chem.rdchem.HybridizationType.SP3,
+ Chem.rdchem.HybridizationType.SP3D,
+ Chem.rdchem.HybridizationType.SP3D2,
+ 'other'
+ ]
+ allowable_cip_code_list = ['R', 'S']
+
+ def __init__(self, config):
+ super(MolMGNNFeaturizer, self).__init__()
+ self.config = config
+
+ def __call__(self, data):
+ if isinstance(data, str):
+ mol = Chem.MolFromSmiles(data)
+ else:
+ mol = data
+
+ atom_features_list = []
+ for atom in mol.GetAtoms():
+ encoding = self.one_of_k_encoding_unk(atom.GetSymbol(), self.allowable_atom_list)
+ encoding += self.one_of_k_encoding(atom.GetDegree(), self.allowable_degree_list)
+ encoding += self.one_of_k_encoding_unk(atom.GetTotalNumHs(), self.allowable_num_hs_list)
+ encoding += self.one_of_k_encoding_unk(atom.GetImplicitValence(), self.allowable_implicit_valence_list)
+ encoding += self.one_of_k_encoding_unk(atom.GetHybridization(), self.allowable_hybridization_list)
+ encoding += [atom.GetIsAromatic()]
+ try:
+ encoding += self.one_of_k_encoding_unk(atom.GetProp("_CIPNode"), self.allowable_cip_code_list)
+ except:
+ encoding += [0, 0]
+ encoding += [atom.HasProp("_ChiralityPossible")]
+ encoding /= np.sum(encoding)
+ atom_features_list.append(encoding)
+ x = torch.tensor(np.array(atom_features_list), dtype=torch.float)
+
+ if len(mol.GetBonds()) <= 0:
+ edge_index = torch.empty((2, 0), dtype=torch.long)
+ else:
+ edges_list = []
+ for bond in mol.GetBonds():
+ i = bond.GetBeginAtomIdx()
+ j = bond.GetEndAtomIdx()
+ edges_list.append((i, j))
+ edges_list.append((j, i))
+ edge_index = torch.tensor(np.array(edges_list).T, dtype=torch.long)
+
+ return Data(x=x, edge_index=edge_index)
+
+ def one_of_k_encoding(self, x, allowable_set):
+ if x not in allowable_set:
+ raise Exception("input {0} not in allowable set{1}:".format(x, allowable_set))
+ return list(map(lambda s: x == s, allowable_set))
+
+ def one_of_k_encoding_unk(self, x, allowable_set):
+ """Maps inputs not in the allowable set to the last element."""
+ if x not in allowable_set:
+ x = allowable_set[-1]
+ return list(map(lambda s: x == s, allowable_set))
diff --git a/open_biomed/utils/prot_utils.py b/open_biomed/utils/prot_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..ca1f5489f058d574470bd291c59f3440a0d649c3
--- /dev/null
+++ b/open_biomed/utils/prot_utils.py
@@ -0,0 +1,16 @@
+import numpy as np
+import math
+
+def get_normalized_ctd(proteins):
+ from PyBioMed.PyProtein import CTD
+ ctds = []
+ for prot in proteins:
+ ctds.append(np.array(list(CTD.CalculateCTD(prot).values())))
+ ctds = np.array(ctds)
+ for i in range(ctds.shape[1]):
+ mean = np.mean(ctds[:, i])
+ var = np.var(ctds[:, i])
+ ctds[:, i] = (ctds[:, i] - mean) / math.sqrt(var)
+ for i in range(ctds.shape[0]):
+ ctds[i] /= np.linalg.norm(ctds[i])
+ return ctds
\ No newline at end of file
diff --git a/open_biomed/utils/split_utils.py b/open_biomed/utils/split_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf34eddbe13b489708def8405c9a118d95ba9d7a
--- /dev/null
+++ b/open_biomed/utils/split_utils.py
@@ -0,0 +1,180 @@
+import logging
+logger = logging.getLogger(__name__)
+
+import math
+import numpy as np
+from rdkit import Chem
+from rdkit.Chem.Scaffolds.MurckoScaffold import MurckoScaffoldSmiles
+import json
+import collections
+
+from open_biomed.utils.cluster import cluster_with_sim_matrix, merge_cluster
+from open_biomed.utils.prot_utils import get_normalized_ctd
+
+def random_split(n, r_val, r_test):
+ r_train = 1 - r_val - r_test
+ perm = np.random.permutation(n)
+ train_cutoff = r_train * n
+ val_cutoff = (r_train + r_val) * n
+ return perm[:train_cutoff], perm[train_cutoff : val_cutoff], perm[val_cutoff:]
+
+def kfold_split(n, k):
+ perm = np.random.permutation(n)
+ return [perm[i * n // k: (i + 1) * n // k] for i in range(k)]
+
+def _generate_scaffold(smiles, include_chirality=False, is_standard=False):
+ if is_standard:
+ scaffold = MurckoScaffoldSmiles(smiles=smiles, includeChirality=True)
+ else:
+ mol = Chem.MolFromSmiles(smiles)
+ scaffold = MurckoScaffoldSmiles(mol=mol, includeChirality=include_chirality)
+ return scaffold
+
+def generate_scaffolds(dataset, log_every_n=1000, sort=True, is_standard=False):
+ scaffolds = {}
+ data_len = len(dataset)
+
+ logger.info("About to generate scaffolds")
+ for ind, molecule in enumerate(dataset.molecules):
+ if log_every_n > 0 and ind % log_every_n == 0:
+ logger.info("Generating scaffold %d/%d" % (ind, data_len))
+ # TODO: z
+ scaffold = _generate_scaffold(molecule.smiles, is_standard=is_standard)
+ if scaffold not in scaffolds:
+ scaffolds[scaffold] = [ind]
+ else:
+ scaffolds[scaffold].append(ind)
+
+ if sort:
+ # Sort from largest to smallest scaffold sets
+ scaffolds = {key: sorted(value) for key, value in scaffolds.items()}
+ scaffold_sets = [
+ scaffold_set for (scaffold, scaffold_set) in sorted(
+ scaffolds.items(),
+ key=lambda x: (len(x[1]), x[1][0]),
+ reverse=True
+ )
+ ]
+ else:
+ scaffold_sets = [value for key, value in scaffolds.items()]
+
+ # TODO: DEBUG
+ """
+ scaffold_index = collections.OrderedDict()
+ for i, value in enumerate(scaffold_sets):
+ scaffold_index[i] = str(value)
+ scaffold_index = json.dumps(scaffold_index)
+ with open("scaffold_set_2.json","w") as f:
+ f.write(scaffold_index)
+ """
+ return scaffold_sets
+
+def scaffold_split(dataset, r_val, r_test, log_every_n=1000, is_standard=False):
+ r_train = 1.0 - r_val - r_test
+ scaffold_sets = generate_scaffolds(dataset, log_every_n, is_standard=is_standard)
+
+ train_cutoff = r_train * len(dataset)
+ valid_cutoff = (r_train + r_val) * len(dataset)
+ train_inds = []
+ valid_inds = []
+ test_inds = []
+
+ logger.info("About to sort in scaffold sets")
+ for scaffold_set in scaffold_sets:
+ if len(train_inds) + len(scaffold_set) > train_cutoff:
+ if len(train_inds) + len(valid_inds) + len(scaffold_set) > valid_cutoff:
+ test_inds += scaffold_set
+ else:
+ valid_inds += scaffold_set
+ else:
+ train_inds += scaffold_set
+ return train_inds, valid_inds, test_inds
+
+def cold_drug_split(dataset, nfolds):
+ scaffold_sets = generate_scaffolds(dataset, -1, sort=False)
+ n_cutoff = len(dataset.pair_index) // nfolds
+ drug_pair_index = {}
+ for i, (i_drug, i_prot) in enumerate(dataset.pair_index):
+ if i_drug not in drug_pair_index:
+ drug_pair_index[i_drug] = [i]
+ else:
+ drug_pair_index[i_drug].append(i)
+
+ folds = [[] for i in range(nfolds)]
+ cur = 0
+ for scaffold_set in scaffold_sets:
+ pair_in_scaffold_set = []
+ for i_drug in scaffold_set:
+ pair_in_scaffold_set += drug_pair_index[i_drug]
+ if cur != nfolds - 1 and len(folds[cur]) + len(pair_in_scaffold_set) >= n_cutoff:
+ if len(folds[cur]) + len(pair_in_scaffold_set) - n_cutoff > n_cutoff - len(folds[cur]):
+ cur += 1
+ folds[cur] += pair_in_scaffold_set
+ else:
+ folds[cur] += pair_in_scaffold_set
+ cur += 1
+ else:
+ folds[cur] += pair_in_scaffold_set
+ return folds
+
+def cold_protein_split(dataset, nfolds):
+ ctds = get_normalized_ctd(dataset.proteins)
+ prot_sim = ctds @ ctds.T
+ clusters = cluster_with_sim_matrix(prot_sim, 0.3)
+
+ prot_pair_index = {}
+ for i, (i_drug, i_prot) in enumerate(dataset.pair_index):
+ if i_prot not in prot_pair_index:
+ prot_pair_index[i_prot] = [i]
+ else:
+ prot_pair_index[i_prot].append(i)
+
+ n_cutoff = len(dataset.pair_index) // nfolds
+ folds = [[] for i in range(nfolds)]
+ cur = 0
+ for cluster in clusters:
+ pair_in_cluster = []
+ for i_protein in cluster:
+ if i_protein in prot_pair_index:
+ pair_in_cluster += prot_pair_index[i_protein]
+ if cur != nfolds - 1 and len(folds[cur]) + len(pair_in_cluster) >= n_cutoff:
+ if len(folds[cur]) + len(pair_in_cluster) - n_cutoff > n_cutoff - len(folds[cur]):
+ cur += 1
+ folds[cur] += pair_in_cluster
+ else:
+ folds[cur] += pair_in_cluster
+ cur += 1
+ else:
+ folds[cur] += pair_in_cluster
+ return folds
+
+def cold_cluster_split(dataset, ngrids):
+ drug_clusters = generate_scaffolds(dataset, -1)
+ drug_clusters = merge_cluster(drug_clusters, ngrids)
+
+ ctds = get_normalized_ctd(dataset.proteins)
+ prot_sim = ctds @ ctds.T
+ prot_clusters = cluster_with_sim_matrix(prot_sim, 0.3)
+ prot_clusters = merge_cluster(prot_clusters, ngrids)
+
+ pair_in_grid = []
+ for i in range(ngrids):
+ pair_in_grid.append([])
+ for j in range(ngrids):
+ pair_in_grid[i].append([])
+ for k, (i_drug, i_prot) in enumerate(dataset.pair_index):
+ if i_drug in drug_clusters[i] and i_prot in prot_clusters[j]:
+ pair_in_grid[i][j].append(k)
+
+ folds = []
+ for i in range(ngrids):
+ for j in range(ngrids):
+ folds.append({"test": pair_in_grid[i][j]})
+ train = []
+ for k in range(ngrids):
+ if k != i:
+ for l in range(ngrids):
+ if l != j:
+ train += pair_in_grid[k][l]
+ folds[-1]["train"] = train
+ return folds
\ No newline at end of file
diff --git a/predictions_test.csv b/predictions_test.csv
deleted file mode 100644
index 74b11a6606cd1f51cea5d5e4cedcc32c10f221f5..0000000000000000000000000000000000000000
--- a/predictions_test.csv
+++ /dev/null
@@ -1,3007 +0,0 @@
-y_true,y_pred
-5.0,5.800771236419678
-5.0,5.395237922668457
-5.0,5.276166915893555
-6.2441251443275085,5.942971229553223
-8.060480747381382,5.462637424468994
-5.0,5.4621429443359375
-5.0,5.235345840454102
-6.920818753952375,5.619464874267578
-5.0,5.140495777130127
-6.6020599913279625,6.127887725830078
-5.0,5.162744522094727
-5.0,5.554845809936523
-6.721246399047171,6.297525405883789
-5.0,4.972941875457764
-5.0,5.874874114990234
-5.0,5.212632179260254
-5.0,5.052472114562988
-5.0,5.295834541320801
-5.0,5.053500175476074
-6.958607314841775,7.452765941619873
-5.0,5.674577713012695
-5.0,5.390100955963135
-5.0,5.070438861846924
-5.0,5.108304023742676
-5.0,5.092257499694824
-6.337242168318426,5.701745986938477
-6.7447274948966935,6.679371356964111
-6.318758762624412,5.175588607788086
-5.0,5.626478672027588
-5.5376020021010435,5.660998821258545
-5.0,4.905607223510742
-5.207608310501746,5.781177520751953
-6.494850021680094,5.278522491455078
-5.0,4.808359146118164
-6.42021640338319,7.507672309875488
-6.229147988357855,5.586282730102539
-5.0,4.840601921081543
-5.0,4.831413269042969
-5.0,4.976465702056885
-5.0,5.052407741546631
-7.920818753952375,5.231022834777832
-5.0,5.194699764251709
-5.0,5.313214302062988
-5.508638306165727,5.261484622955322
-5.0,5.032778263092041
-6.4089353929735005,5.249912738800049
-6.853871964321762,6.937121868133545
-5.0,4.935050010681152
-5.0,5.74592924118042
-5.0,5.954188346862793
-6.657577319177793,6.482194900512695
-5.0,5.674867153167725
-5.0,4.9116692543029785
-5.0,4.855142593383789
-5.0,5.738302707672119
-5.0,4.941376209259033
-5.0,5.331035614013672
-6.119186407719209,5.263011455535889
-5.0,4.958338260650635
-7.136677139879544,6.948382377624512
-6.119186407719209,5.537964344024658
-5.0,5.174159526824951
-5.638272163982407,5.3634233474731445
-5.0,5.0796661376953125
-5.0,4.904825210571289
-5.0,5.208569526672363
-6.6777807052660805,5.239508152008057
-5.0,5.298052787780762
-5.0,5.367343425750732
-5.0,5.049912452697754
-5.0,5.147462844848633
-5.0,5.108615875244141
-5.795880017344075,5.923310279846191
-5.327902142064283,5.280915260314941
-5.0,5.788806438446045
-5.229147988357856,5.07454776763916
-6.221848749616356,5.867895126342773
-5.0,4.960915565490723
-5.0,5.815549373626709
-5.4089353929735005,5.523706436157227
-7.214670164989233,5.827404499053955
-7.136677139879544,5.572232246398926
-5.0,5.234414100646973
-5.0,5.263697624206543
-5.0,4.852530002593994
-6.920818753952375,6.582401275634766
-6.443697499232712,5.707644939422607
-5.0,5.059152603149414
-5.853871964321762,5.177095413208008
-5.0,5.186605453491211
-5.0,5.318240165710449
-5.0,5.3157124519348145
-5.0,4.957765579223633
-5.0,5.206311225891113
-5.0,5.0425519943237305
-5.468521082957745,6.006145477294922
-5.0,4.968360900878906
-7.031517051446065,5.819790363311768
-5.0,5.07848596572876
-6.154901959985743,5.733901023864746
-5.3979400086720375,5.150167942047119
-5.0,4.806020736694336
-5.0,4.777266979217529
-5.0,5.287961959838867
-5.0,5.16200065612793
-5.0,5.320121765136719
-5.0,5.089414119720459
-5.0,5.3358612060546875
-5.0,5.0042724609375
-5.0,5.118223667144775
-5.0,5.454499244689941
-5.0,5.99526834487915
-5.958607314841775,5.936986446380615
-6.301029995663981,6.157201766967773
-5.0,5.681314468383789
-6.958607314841775,7.0343217849731445
-5.0,4.970902442932129
-5.619788758288394,6.972977161407471
-5.0,5.442862510681152
-5.0,5.144139289855957
-5.0,5.122621536254883
-5.0,4.94498348236084
-5.0,5.827373027801514
-5.017728766960431,5.684112548828125
-6.4089353929735005,5.919040679931641
-5.0,5.818535804748535
-5.0,4.965034484863281
-5.0,4.8870391845703125
-7.214670164989233,5.892489433288574
-5.698970004336019,7.007732391357422
-5.0,5.2298126220703125
-5.0,5.122974395751953
-5.0,5.224369049072266
-5.0,5.306283950805664
-5.0,4.963068008422852
-5.0,5.123898983001709
-5.0,5.129148483276367
-5.0,6.04791259765625
-5.0,5.025460243225098
-5.0,5.7056803703308105
-5.0,4.969108581542969
-5.0,4.90166711807251
-5.0,5.257298469543457
-7.886056647693163,6.580296516418457
-7.920818753952375,6.640806198120117
-5.0,5.401055335998535
-6.026872146400302,5.617675304412842
-5.0,5.134947776794434
-5.0,5.57351016998291
-5.0,5.2882184982299805
-5.0,5.1822614669799805
-5.0,5.200638771057129
-5.0,4.853910446166992
-5.0,4.987082004547119
-7.6777807052660805,5.57274866104126
-5.0,5.69786262512207
-5.0,5.837890625
-5.0,5.25885534286499
-5.0,4.967269420623779
-5.0,5.095975875854492
-5.0,5.161468982696533
-5.0,5.030512809753418
-5.0,5.04465389251709
-5.0,5.22902250289917
-5.0,4.920938491821289
-5.0,5.113481044769287
-5.0,5.022037506103516
-5.060480747381382,6.000720977783203
-5.0,5.321018218994141
-5.0,5.204470634460449
-5.0,4.976919651031494
-6.494850021680094,5.54464864730835
-5.0,5.256199836730957
-5.0,5.349587917327881
-5.0,5.121535301208496
-5.0,5.142595291137695
-7.008773924307505,6.185398101806641
-5.0,5.1634440422058105
-5.0,5.177967071533203
-5.0,5.489536285400391
-5.0,5.009149074554443
-7.657577319177793,5.900487899780273
-5.0,5.395733833312988
-5.0,5.154901027679443
-5.0,5.098935127258301
-6.823908740944319,6.2125749588012695
-5.0,5.275001525878906
-5.0,6.072685241699219
-5.0,5.442862510681152
-5.0,4.819635391235352
-8.744727494896694,7.002490043640137
-5.0,5.142800807952881
-5.0,5.744089603424072
-5.0,5.769959449768066
-5.0,5.238675117492676
-5.0,5.15510892868042
-6.823908740944319,5.044835090637207
-6.0655015487564325,5.204744338989258
-5.0,5.033991813659668
-5.0,4.900252819061279
-5.0,4.879431247711182
-5.0,5.070178031921387
-5.0,5.953505516052246
-5.0,6.778484344482422
-5.0,4.9876580238342285
-5.0,5.1724443435668945
-6.3979400086720375,6.1469597816467285
-5.0,5.784704208374023
-5.0,5.526500701904297
-5.585026652029182,5.105029106140137
-5.0,5.289300918579102
-5.920818753952375,5.837184906005859
-5.0,5.091568946838379
-5.0,5.216909408569336
-5.0,5.1169023513793945
-5.0,4.970987319946289
-5.853871964321762,5.221376419067383
-5.5376020021010435,6.26096248626709
-5.0,4.998921871185303
-8.4089353929735,5.864633560180664
-5.0,5.362435817718506
-5.0,5.746147632598877
-5.0,5.2399797439575195
-5.0,5.585816383361816
-5.259637310505756,5.811145782470703
-5.0,5.272889614105225
-6.6777807052660805,5.2989325523376465
-5.275724130399211,5.986598014831543
-5.0,5.137444496154785
-6.275724130399211,5.896261215209961
-6.585026652029182,5.261431694030762
-5.0,5.037272930145264
-5.0,5.08333158493042
-5.0,5.063558578491211
-5.0,4.9722418785095215
-5.0,5.0817670822143555
-5.0,5.2221269607543945
-5.0,5.197011947631836
-6.6777807052660805,7.1642374992370605
-5.0,4.919566631317139
-6.026872146400302,6.071964263916016
-6.366531544420414,5.985815525054932
-9.744727494896694,6.433475971221924
-5.0,5.588820934295654
-5.0,5.066689968109131
-5.0,5.790623664855957
-7.508638306165727,5.141849517822266
-7.309803919971486,6.50391960144043
-6.376750709602099,5.6910271644592285
-5.0,5.278624057769775
-5.0,5.961750030517578
-5.0,7.02808952331543
-5.0,5.1241655349731445
-7.853871964321762,6.124077796936035
-6.173925197299173,4.995600700378418
-5.0,5.5167317390441895
-5.0,4.984444618225098
-5.0,5.000624179840088
-5.0,5.119114398956299
-6.886056647693163,6.500754356384277
-5.0,5.2388224601745605
-5.0,5.235677719116211
-5.0,5.106536388397217
-5.585026652029182,5.134629249572754
-5.0,5.219902038574219
-5.552841968657781,6.369990825653076
-5.455931955649724,5.907295227050781
-6.275724130399211,5.755067825317383
-5.0,5.063395977020264
-5.4089353929735005,5.882179260253906
-5.0,5.688826084136963
-5.096910013008056,6.035136699676514
-6.42021640338319,6.017958641052246
-5.0,5.242674827575684
-6.366531544420414,5.700984001159668
-5.0,5.597861289978027
-5.481486060122113,5.471235275268555
-5.0,6.566420078277588
-5.0,5.509105205535889
-5.0,4.94508171081543
-5.0,5.004279136657715
-5.0,4.9165849685668945
-5.455931955649724,5.863786697387695
-6.443697499232712,5.223202705383301
-7.136677139879544,6.0015106201171875
-5.0,5.1476616859436035
-5.0,4.92098331451416
-5.0,5.043527603149414
-5.0,4.991308689117432
-5.0,4.927474498748779
-5.0,5.015485763549805
-5.0,5.499882698059082
-5.0,5.168109893798828
-5.251811972993799,5.580196380615234
-5.0,5.114068031311035
-5.0,5.077316761016846
-5.5376020021010435,5.206492900848389
-5.0,5.222158432006836
-5.0,5.201817512512207
-5.229147988357856,5.945888519287109
-5.337242168318426,5.248544216156006
-5.0,5.483777046203613
-5.0,5.747743606567383
-5.0,5.06587028503418
-5.0,5.748860836029053
-6.552841968657781,6.263679504394531
-5.017728766960431,5.2804059982299805
-5.0,5.027822971343994
-5.0,5.492182731628418
-5.0,5.89993953704834
-5.0,5.309436321258545
-5.0,5.100902557373047
-5.0,5.035425186157227
-5.0,5.323177337646484
-5.0,5.016190528869629
-5.0,5.848273277282715
-5.0,5.595371723175049
-5.0,5.0581865310668945
-5.0,5.7320661544799805
-5.0,5.241883754730225
-5.0,4.958637237548828
-5.0,5.105495452880859
-5.0,5.751912593841553
-5.0,5.313994407653809
-5.0,6.325577735900879
-5.769551078621726,5.4003825187683105
-5.0,4.90739107131958
-5.0,4.9871721267700195
-5.0,5.135955810546875
-6.522878745280337,4.990891456604004
-5.0,5.033950328826904
-5.0,5.994028091430664
-5.0,5.169327735900879
-5.0,5.085268020629883
-5.0,5.528985023498535
-5.0,4.809317588806152
-5.0,5.181736946105957
-5.0,5.8351006507873535
-5.0,5.253481864929199
-5.42021640338319,5.75039529800415
-5.0,5.305078506469727
-5.0,5.436279296875
-5.0,5.155648231506348
-5.0,5.176270484924316
-5.698970004336019,5.153957366943359
-6.431798275933005,5.695533752441406
-5.0,5.096131324768066
-5.958607314841775,5.280009746551514
-7.638272163982407,6.010324478149414
-5.920818753952375,5.039440155029297
-7.7447274948966935,5.899899482727051
-5.0,5.268021583557129
-5.0,5.168248176574707
-5.0,5.319695472717285
-5.0,5.712436676025391
-6.022276394711152,5.483909606933594
-8.244125144327509,6.625937461853027
-7.468521082957745,6.161527633666992
-5.0,5.3148698806762695
-6.6020599913279625,6.517254829406738
-5.0,5.889123439788818
-5.0,5.335798263549805
-5.0,5.495950222015381
-6.886056647693163,5.414768218994141
-5.0,4.8950347900390625
-6.455931955649724,5.482400417327881
-5.0,5.711033821105957
-5.267606240177032,5.02974796295166
-5.0,5.099306583404541
-5.0,5.107362747192383
-5.0,4.998247146606445
-5.0,5.941869258880615
-5.0,5.804447174072266
-6.173925197299173,5.22778844833374
-5.0,5.486037254333496
-5.0,5.154754161834717
-5.0,5.039571285247803
-5.431798275933005,5.035490989685059
-5.0,5.182390213012695
-5.0,5.688287258148193
-7.619788758288394,6.566010475158691
-5.0,5.652429580688477
-6.481486060122113,6.319108009338379
-5.0,5.300731182098389
-5.0,4.882905960083008
-5.443697499232712,5.444293975830078
-5.0,5.219795227050781
-6.494850021680094,4.973163604736328
-5.0,5.079753875732422
-5.0,5.6767988204956055
-5.0,6.036319255828857
-5.0,5.157500267028809
-5.0,4.855913162231445
-5.0,5.24519681930542
-5.568636235841013,5.722797393798828
-5.356547323513812,5.24831485748291
-5.0,4.972455024719238
-5.481486060122113,4.871864318847656
-5.0,5.160340309143066
-5.0,5.033148765563965
-8.214670164989233,6.637303352355957
-5.0,5.0061469078063965
-6.619788758288394,5.932549476623535
-5.0,5.640897750854492
-6.356547323513812,5.312372207641602
-5.886056647693163,6.157201766967773
-7.2076083105017466,5.695199012756348
-5.0,4.994394302368164
-5.0,5.532589435577393
-5.0,5.019037246704102
-8.113509274827518,6.491754531860352
-5.0,4.804320335388184
-5.0,5.227463722229004
-5.552841968657781,5.678529739379883
-5.0,5.264488220214844
-5.0,5.217649936676025
-5.0,5.109696388244629
-5.0,5.030018329620361
-5.0,5.69453239440918
-8.0,5.745770454406738
-5.0,4.944544315338135
-5.0,4.833592414855957
-5.0,5.741280555725098
-5.0,5.215654373168945
-5.0,5.866557598114014
-5.0,5.712643623352051
-5.0,4.990045547485352
-6.200659450546418,5.776348114013672
-5.0,5.452692031860352
-5.0,5.359696865081787
-5.0,5.05702018737793
-5.0,5.272481918334961
-5.0,5.167265892028809
-5.0,5.1825056076049805
-5.0,4.78274393081665
-5.0,5.015628814697266
-5.0,4.942127227783203
-5.0,5.1324334144592285
-6.920818753952375,6.968620300292969
-5.0,5.026400566101074
-7.0,5.980411052703857
-5.0,4.905078411102295
-5.920818753952375,5.384720802307129
-5.0,4.95792293548584
-5.0,5.321680068969727
-5.0,5.976737022399902
-5.0,4.971090316772461
-5.0,5.05668830871582
-5.0,5.039070129394531
-6.214670164989233,5.1990227699279785
-6.5376020021010435,5.544919490814209
-7.0,5.838437080383301
-6.886056647693163,5.540343284606934
-5.0,4.853780746459961
-5.0,5.595334053039551
-6.070581074285707,6.108811378479004
-5.0,5.600414276123047
-5.6777807052660805,5.772089958190918
-5.187086643357144,5.917047023773193
-5.0,4.92894172668457
-5.0,5.362913131713867
-5.0,5.510091304779053
-5.0,5.152087211608887
-7.552841968657781,7.240877628326416
-5.0,5.034891605377197
-5.508638306165727,5.788705825805664
-5.0,5.1092939376831055
-5.0,5.190609455108643
-5.0,5.324347496032715
-5.0,5.1134867668151855
-5.0,5.70916748046875
-5.0,5.051486015319824
-5.0,5.116579055786133
-6.657577319177793,5.655584335327148
-5.0,5.056426525115967
-5.0,5.327630043029785
-7.318758762624412,6.173102855682373
-7.853871964321762,7.0020318031311035
-5.0,5.554845809936523
-5.0,5.805891513824463
-5.0,4.814303874969482
-5.0,5.047793388366699
-7.096910013008056,5.784170627593994
-5.0,5.180851936340332
-5.0,5.041271209716797
-5.0,5.167912483215332
-5.0,5.141044616699219
-5.0,5.562365531921387
-5.0,5.260476112365723
-5.0,4.985695838928223
-5.508638306165727,5.152285575866699
-5.0,5.315399646759033
-5.0,5.4021501541137695
-5.0,5.171093940734863
-5.0,5.269597053527832
-5.0,5.537538528442383
-5.0,5.153337478637695
-5.0,5.253760814666748
-5.318758762624412,5.5159831047058105
-5.0655015487564325,5.832989692687988
-5.0,5.157661437988281
-5.0,5.249853610992432
-5.0,4.855950832366943
-7.5376020021010435,6.073287010192871
-5.494850021680094,5.019092082977295
-5.0,5.0281476974487305
-5.0,6.128477096557617
-5.0,5.0927734375
-5.0,5.829509735107422
-6.0655015487564325,5.811471939086914
-5.0,5.351591110229492
-5.0,5.142735481262207
-5.0,5.093090534210205
-5.0,5.115805625915527
-5.5376020021010435,5.182340621948242
-5.0,5.597780227661133
-5.0,4.935691833496094
-5.0,4.958979606628418
-5.0,4.97567892074585
-5.0,5.022613525390625
-5.0,5.134254455566406
-5.0,5.137014865875244
-5.0,5.363701820373535
-5.958607314841775,5.868472099304199
-5.0,5.073107719421387
-5.0,5.244617462158203
-5.0,5.497377395629883
-5.0,5.826061248779297
-5.0,5.209022521972656
-5.0,4.9176740646362305
-5.0,4.885644435882568
-5.0,5.1171875
-5.0,5.090361595153809
-5.0,5.705543518066406
-5.769551078621726,5.171658992767334
-5.0,4.939739227294922
-5.0,5.154618263244629
-5.0,5.27057409286499
-5.0,5.049792289733887
-5.0,5.139575004577637
-5.0,4.984949111938477
-5.0,5.820562362670898
-5.443697499232712,5.19661808013916
-6.443697499232712,6.086178779602051
-5.0,5.4033966064453125
-5.0,5.8149919509887695
-5.0,5.878381729125977
-5.0,5.469240188598633
-5.0,6.908328056335449
-7.366531544420414,5.983736038208008
-5.0,5.308106899261475
-7.698970004336019,5.933241844177246
-5.267606240177032,5.750804901123047
-5.0,5.151772499084473
-5.0,4.922313690185547
-6.886056647693163,5.890135765075684
-5.0,5.167149066925049
-5.0,4.907484531402588
-5.0,5.118232727050781
-6.2076083105017466,5.127645492553711
-5.0,5.00662899017334
-5.0,4.914810657501221
-5.455931955649724,5.238742351531982
-5.0,5.3042497634887695
-5.0,5.098928451538086
-5.0,5.377892017364502
-5.0,5.07125186920166
-5.0,5.047779560089111
-5.0,5.032094955444336
-5.0,5.270474433898926
-5.823908740944319,6.200937271118164
-5.0,4.97658634185791
-5.0,5.524571418762207
-9.036212172654444,6.091275691986084
-5.0,6.166292190551758
-5.0,5.23710298538208
-5.0,4.973126411437988
-5.0,4.872283935546875
-5.0,5.3056440353393555
-5.0,4.964639186859131
-5.0,5.151106834411621
-5.0,4.8993706703186035
-5.0,5.077704429626465
-9.259637310505756,5.575144290924072
-5.0,5.673410415649414
-8.42021640338319,6.121687889099121
-5.0,4.954280376434326
-6.259637310505756,5.854873180389404
-5.0,4.972519874572754
-5.0,5.111024856567383
-9.086186147616283,6.075257301330566
-5.0,5.164638996124268
-5.0,5.315009117126465
-5.0,5.073480606079102
-5.0,5.071231842041016
-5.366531544420414,5.095180034637451
-6.080921907623926,5.5278849601745605
-5.0,5.989908218383789
-5.0,5.182460784912109
-5.0,5.047375679016113
-5.0,4.821598052978516
-5.0,5.017077922821045
-5.0,5.223755836486816
-5.0,5.1370038986206055
-5.0,5.159942150115967
-5.0,5.41568660736084
-5.0,5.18551778793335
-6.585026652029182,5.879344940185547
-5.0,5.218673229217529
-5.0,5.738302707672119
-7.958607314841775,5.79322624206543
-5.0,5.267088890075684
-5.0,4.995248794555664
-6.795880017344075,5.7414231300354
-5.0,5.215909004211426
-5.0,6.016681671142578
-5.0,4.799931049346924
-6.346787486224656,6.468524932861328
-5.0,5.0365447998046875
-5.0,4.909472465515137
-5.920818753952375,5.062284469604492
-5.0,5.167934894561768
-8.18045606445813,4.932914733886719
-6.180456064458132,5.8472795486450195
-5.769551078621726,5.727960586547852
-5.0,5.081264972686768
-5.0,4.951349258422852
-5.0,5.49241304397583
-5.0,5.026005744934082
-5.0,4.872283935546875
-5.0,6.149606227874756
-5.0,5.338926315307617
-5.0,5.775002479553223
-5.0,4.998357772827148
-8.00436480540245,5.801205635070801
-6.0655015487564325,6.118099689483643
-5.0,5.036742687225342
-5.0,4.914289474487305
-5.0,4.927958011627197
-5.0,5.034151554107666
-5.0,5.073773384094238
-5.0,5.25950288772583
-5.0,5.75035285949707
-5.0,5.601175308227539
-5.0,5.417207717895508
-5.481486060122113,5.1402974128723145
-8.602059991327963,5.755471229553223
-6.585026652029182,6.145336151123047
-6.173925197299173,5.274653434753418
-5.0,5.053656578063965
-5.0,4.9517059326171875
-5.42021640338319,6.1735405921936035
-5.0,5.21207332611084
-5.0,5.250913619995117
-5.0,5.402470588684082
-5.431798275933005,6.414699554443359
-5.040958607678906,4.9912567138671875
-7.0,5.789031982421875
-6.292429823902063,5.493403434753418
-5.2441251443275085,5.854853630065918
-7.026872146400302,5.67960262298584
-6.508638306165727,7.177179336547852
-5.0,5.19662618637085
-5.0,5.694277286529541
-9.102372908709558,6.842217445373535
-5.0,4.967752933502197
-5.0,5.080929756164551
-5.0,5.085859298706055
-8.236572006437063,5.989786148071289
-6.356547323513812,5.321105003356934
-5.0,5.205772399902344
-5.0,5.696185111999512
-7.443697499232712,6.446946144104004
-5.0,5.048062324523926
-5.0,5.028811454772949
-5.0,5.2656660079956055
-5.0,4.895162582397461
-5.0,5.042176723480225
-5.0,5.25379753112793
-5.0,5.140639305114746
-5.0,5.664675712585449
-5.0,5.1158976554870605
-5.0,5.197992324829102
-7.275724130399211,5.974333763122559
-7.013228265733755,5.181201934814453
-5.0,5.614791393280029
-5.0,4.791403293609619
-7.309803919971486,6.312705993652344
-5.886056647693163,6.134792327880859
-5.0,5.185878753662109
-6.2839966563652006,5.273252487182617
-5.0,5.424480438232422
-5.0,5.681392669677734
-6.167491087293763,5.2039475440979
-8.602059991327963,6.685637950897217
-7.356547323513812,5.916413307189941
-5.0,5.147014617919922
-5.0,5.563138961791992
-5.0,5.101917743682861
-5.0,5.491768836975098
-5.0,5.615857124328613
-5.0,5.3705644607543945
-5.0,5.011993885040283
-6.42021640338319,6.8166913986206055
-5.0,5.166297435760498
-5.0,5.093245506286621
-5.0,5.279700756072998
-5.0,5.726114273071289
-7.0,5.746674537658691
-7.7447274948966935,5.8472795486450195
-5.0,5.408939361572266
-5.0,5.572492599487305
-5.0,4.866260528564453
-5.0,5.296327590942383
-5.0,5.769959449768066
-5.0,5.356321334838867
-5.0,5.481302738189697
-6.6777807052660805,5.881722450256348
-5.0,5.0855913162231445
-5.0,5.178956985473633
-5.0,4.78274393081665
-5.0655015487564325,6.255086898803711
-5.0,5.088420867919922
-5.0,5.293111324310303
-5.0,5.111166000366211
-5.0,4.913130760192871
-5.0,5.2408576011657715
-6.356547323513812,5.872750282287598
-5.0,5.594586372375488
-5.0,5.93961238861084
-6.443697499232712,5.466919422149658
-5.0,5.074549198150635
-5.0,4.96071720123291
-5.6777807052660805,5.231204986572266
-5.638272163982407,5.413413047790527
-5.0,5.150556564331055
-5.657577319177793,6.59342622756958
-5.0,5.7974772453308105
-5.309803919971486,7.261883735656738
-5.0,5.235506057739258
-5.0,5.099880218505859
-5.698970004336019,5.175846099853516
-5.0,4.944645881652832
-5.0,5.136077404022217
-5.0,5.008349418640137
-5.0,5.107083797454834
-5.0,4.999552249908447
-7.5376020021010435,6.619388580322266
-6.568636235841013,5.502920150756836
-5.0,4.908662796020508
-7.3979400086720375,6.420985221862793
-5.0,4.935611724853516
-5.522878745280337,5.2250823974609375
-7.309803919971486,6.564713954925537
-5.0,4.895526885986328
-6.00436480540245,5.399839401245117
-5.0,5.818535804748535
-5.0,5.769959449768066
-5.0,5.630594253540039
-5.638272163982407,5.108572006225586
-6.920818753952375,5.564547061920166
-5.075720713938118,5.321910858154297
-6.173925197299173,5.640385627746582
-5.0,5.0632829666137695
-5.0,5.1237921714782715
-5.0,5.69498348236084
-8.585026652029182,6.1292829513549805
-8.267606240177031,6.120221138000488
-5.0,5.223410129547119
-5.0,4.978537082672119
-5.0,6.500300407409668
-6.267606240177032,5.122910976409912
-5.0,5.12222957611084
-5.0,5.061741352081299
-6.6020599913279625,5.859128952026367
-5.0,5.076841354370117
-5.0,5.292351722717285
-5.0,5.707634925842285
-5.0,5.0369367599487305
-5.0,5.244826316833496
-5.0,4.803794860839844
-6.013228265733755,5.322436332702637
-5.0,5.1061201095581055
-5.0,5.4051103591918945
-7.5376020021010435,7.064375877380371
-6.2441251443275085,5.429422378540039
-5.0,5.481283187866211
-6.6777807052660805,5.940192699432373
-5.0,5.409833908081055
-6.013228265733755,5.619464874267578
-5.0,5.050139427185059
-5.0,5.0479512214660645
-5.0,4.9218034744262695
-5.0,5.991756916046143
-5.0,5.699978828430176
-5.0,5.072641372680664
-5.0,5.189891338348389
-5.0,5.184412956237793
-5.0,5.248296737670898
-7.6020599913279625,6.588867664337158
-5.0,5.568979263305664
-5.5376020021010435,5.699629783630371
-5.0,5.070915699005127
-5.0,4.971202850341797
-5.0,5.211804389953613
-5.455931955649724,6.149606227874756
-5.0,5.860658645629883
-5.638272163982407,5.811471939086914
-5.0,5.072415351867676
-5.0,5.132346153259277
-5.42021640338319,5.811471939086914
-8.823908740944319,4.901333808898926
-5.0,4.969202041625977
-6.050609993355087,5.544888973236084
-5.0,5.567722797393799
-5.0,5.091432571411133
-5.0,5.018865585327148
-6.6777807052660805,6.300543785095215
-5.0,4.945563316345215
-5.0,4.861330986022949
-5.0,5.69703483581543
-5.0,4.855749130249023
-5.0,6.2195539474487305
-7.2441251443275085,5.976245880126953
-6.045757490560675,5.836803436279297
-6.5376020021010435,5.07463264465332
-6.346787486224656,5.652858734130859
-5.6777807052660805,5.88160514831543
-5.0,4.916505813598633
-5.0,5.207067012786865
-6.154901959985743,5.3605265617370605
-5.0,5.001137733459473
-5.455931955649724,6.2259016036987305
-5.0,5.04837703704834
-6.508638306165727,5.765795707702637
-5.823908740944319,5.175320625305176
-5.42021640338319,5.721698760986328
-6.769551078621726,5.749342441558838
-5.494850021680094,5.6255083084106445
-5.0,5.84455680847168
-5.0,5.739250659942627
-6.259637310505756,5.6679253578186035
-5.0,5.090813636779785
-5.0,4.917590141296387
-5.0,5.6816253662109375
-5.0,5.036358833312988
-5.0,5.264842987060547
-8.154901959985743,6.9585723876953125
-5.3979400086720375,5.2721452713012695
-5.0,5.134481906890869
-5.0,5.2651047706604
-5.0,5.250278949737549
-5.494850021680094,7.261883735656738
-5.0,5.124876022338867
-5.0,5.061800003051758
-5.0,5.126908302307129
-5.0,5.300156116485596
-5.0,5.653731822967529
-5.0,5.177592754364014
-7.769551078621726,7.244752883911133
-5.376750709602099,5.40563440322876
-5.0,5.322014808654785
-7.958607314841775,7.032815456390381
-5.0,5.148261070251465
-5.0,4.881742000579834
-5.0,5.047867774963379
-5.42021640338319,5.320357799530029
-5.0,5.890224456787109
-5.0,5.216251850128174
-5.346787486224656,5.841745376586914
-6.455931955649724,6.086745738983154
-5.0,5.277146339416504
-5.0,5.061314582824707
-5.0,5.365492343902588
-5.0,5.2646589279174805
-5.0,5.1404619216918945
-5.431798275933005,5.4627366065979
-5.0,5.0194783210754395
-6.236572006437063,5.9483842849731445
-5.0,5.328670501708984
-5.0,5.331874847412109
-5.0,6.020847797393799
-5.0,5.110404968261719
-5.0,4.882788181304932
-5.0,5.564929962158203
-5.0,5.534367561340332
-8.468521082957745,6.716361045837402
-5.0,4.931008338928223
-5.0,5.7841877937316895
-6.3979400086720375,6.2020416259765625
-5.0,5.26871395111084
-7.920818753952375,5.0531816482543945
-5.0,4.817451477050781
-5.0,5.311394214630127
-5.0,5.353374481201172
-7.721246399047171,5.958389759063721
-5.0,5.161953926086426
-5.6020599913279625,5.593096733093262
-8.721246399047171,5.682146072387695
-5.0,5.738369941711426
-5.7447274948966935,5.1884260177612305
-5.0,5.050759315490723
-5.0,5.568979263305664
-5.0,5.209572792053223
-5.769551078621726,6.238066673278809
-5.0,5.699985027313232
-6.3979400086720375,6.084765434265137
-5.0,5.092777252197266
-5.0,4.928274154663086
-5.0,4.883503437042236
-5.0,4.952169418334961
-5.0,5.107905387878418
-6.853871964321762,6.06508731842041
-5.0,5.13300085067749
-5.0,5.019712448120117
-5.0,4.9026288986206055
-5.0,5.183358192443848
-9.4089353929735,7.0954999923706055
-5.886056647693163,5.138918876647949
-5.0,5.574373722076416
-5.0,5.426934719085693
-5.920818753952375,5.044047832489014
-6.585026652029182,5.424365520477295
-5.0,4.862037181854248
-5.0,5.7067108154296875
-5.0,5.33089017868042
-5.0,5.181069374084473
-5.0,5.2565484046936035
-5.0,5.089328765869141
-5.0,5.546241760253906
-6.6777807052660805,5.9344940185546875
-5.0,5.175637245178223
-5.0,5.076332092285156
-5.0,5.184449672698975
-5.0,5.896655082702637
-5.0,5.29122257232666
-5.0,5.3634514808654785
-5.0,5.400727272033691
-5.0,5.742465019226074
-9.161150909262744,6.146846294403076
-7.301029995663981,6.300704479217529
-5.0,5.122838020324707
-7.161150909262744,6.583554267883301
-5.0,5.281651496887207
-5.0,5.062882423400879
-5.0,4.842844009399414
-5.0,5.775934219360352
-5.0,5.118556022644043
-5.0,5.116522789001465
-5.0,5.746405124664307
-5.0,5.096880912780762
-5.0,4.940744400024414
-5.346787486224656,5.343737602233887
-5.0,5.282529830932617
-6.508638306165727,5.10034704208374
-5.0,5.590425491333008
-6.0915149811213505,5.763528823852539
-5.0,5.282712936401367
-5.0,5.159553527832031
-5.0,4.908206939697266
-5.0,5.107105255126953
-6.769551078621726,5.977210998535156
-5.0,4.896372318267822
-5.0,5.180999755859375
-5.0,4.971992492675781
-5.0,5.128357887268066
-5.698970004336019,5.889123439788818
-5.0,5.235146999359131
-5.0,5.8855204582214355
-7.045757490560675,5.152947425842285
-5.180456064458132,5.0722222328186035
-5.7447274948966935,5.109922409057617
-5.0,5.510689735412598
-5.0,4.890592575073242
-5.0,5.8427019119262695
-5.0,5.846999645233154
-5.0,5.091965675354004
-6.275724130399211,5.876625061035156
-5.0,5.70235538482666
-5.638272163982407,5.6184000968933105
-5.0,5.06111478805542
-5.0,5.231071472167969
-5.0,5.625035285949707
-5.2441251443275085,5.536773681640625
-5.0,5.094865798950195
-5.0,5.983345031738281
-5.0,5.147793292999268
-5.958607314841775,5.162507057189941
-5.0,5.130657196044922
-5.0,5.747743606567383
-5.0,5.57351016998291
-5.0,6.246509552001953
-5.0,5.198224067687988
-5.958607314841775,5.653171539306641
-5.0,5.851999282836914
-5.0,5.034296035766602
-5.259637310505756,5.796428203582764
-5.0,5.27070951461792
-5.173925197299174,7.011882781982422
-5.2839966563652006,5.24535608291626
-7.0,5.044098854064941
-5.0,5.417243957519531
-5.0,5.585967063903809
-5.309803919971486,6.245674133300781
-5.958607314841775,5.5307087898254395
-5.0,5.155115604400635
-8.113509274827518,5.405979156494141
-5.0,4.7758378982543945
-5.0,4.942119598388672
-5.0,5.161035537719727
-5.0,5.182578086853027
-5.0,5.0593156814575195
-5.0,5.198206424713135
-5.0,5.061382293701172
-5.0,5.144842147827148
-6.1938200260161125,4.90865421295166
-5.0,6.236489295959473
-6.221848749616356,5.200065612792969
-5.161150909262744,6.365843772888184
-5.346787486224656,5.29213809967041
-5.0,5.302227973937988
-5.0,5.240856170654297
-5.0,5.567092418670654
-7.102372908709558,6.122407913208008
-5.0,5.7823591232299805
-5.0,5.535969257354736
-5.522878745280337,5.92572021484375
-5.0,5.121676445007324
-5.0,5.498273849487305
-5.0,5.1979217529296875
-5.0,5.048131942749023
-5.0,5.307835102081299
-5.853871964321762,5.043683052062988
-5.0,5.6975250244140625
-5.0,4.970123291015625
-5.0,5.685408115386963
-5.0,5.380862236022949
-5.0,6.098895072937012
-5.0,5.082026481628418
-6.853871964321762,5.93005895614624
-5.431798275933005,5.979758262634277
-5.0,5.230156898498535
-5.0,5.325900077819824
-5.0,5.141519546508789
-6.7447274948966935,5.5844221115112305
-5.0,6.007086753845215
-5.0,5.2706756591796875
-5.0,5.404233932495117
-5.0,5.383040428161621
-5.0,5.788287162780762
-5.0,5.50537109375
-6.585026652029182,5.758671760559082
-6.0,5.857738018035889
-5.0,5.193702220916748
-6.552841968657781,5.650620937347412
-8.10790539730952,5.852931976318359
-5.0,6.209890365600586
-7.958607314841775,6.289633274078369
-5.0,5.857902526855469
-5.0,5.854262351989746
-5.0,4.995755195617676
-5.0,5.5722761154174805
-7.657577319177793,7.917829513549805
-6.366531544420414,5.962921142578125
-5.0,6.035660743713379
-6.309803919971486,6.537671089172363
-6.568636235841013,5.165081977844238
-5.522878745280337,6.070840835571289
-5.0,5.026201248168945
-5.0,5.387094497680664
-5.0,5.1767754554748535
-5.0,6.140738010406494
-5.0,5.23049259185791
-5.958607314841775,5.709746360778809
-6.229147988357855,6.0864577293396
-6.920818753952375,5.398360252380371
-5.0,5.627218246459961
-5.0,5.358977317810059
-5.0,5.132152080535889
-5.0,5.100765228271484
-7.7447274948966935,6.124077796936035
-5.0,4.874581336975098
-5.0,5.177272796630859
-5.0,5.0652546882629395
-5.0,5.123965263366699
-5.455931955649724,6.292859077453613
-5.0,5.073474407196045
-7.180456064458132,5.909873962402344
-5.0,5.197501182556152
-5.0,5.194077014923096
-5.0,5.10660457611084
-6.086186147616283,5.639441967010498
-5.0,5.1191511154174805
-6.508638306165727,6.331849098205566
-5.0,5.3373799324035645
-5.0,5.316793918609619
-5.0,4.878401756286621
-5.0,5.5162506103515625
-5.0,5.079921245574951
-7.494850021680094,6.6195068359375
-5.0,5.118224143981934
-5.0,5.047695636749268
-5.0,5.263941764831543
-5.0,4.958050727844238
-5.0,4.973017692565918
-5.0,5.084205627441406
-5.920818753952375,6.118099689483643
-5.0,4.994927406311035
-5.0,5.078587532043457
-5.853871964321762,6.077539443969727
-7.267606240177032,5.218878746032715
-5.0,5.48563814163208
-5.0,5.511906623840332
-5.0,4.969738960266113
-5.920818753952375,6.071178436279297
-6.4089353929735005,5.896410942077637
-8.602059991327963,7.054290294647217
-5.0,4.904876708984375
-6.267606240177032,4.956966400146484
-5.0,5.226425647735596
-5.0,5.022022724151611
-5.0,5.169085502624512
-6.0,5.408697128295898
-5.0,5.073164939880371
-5.0,5.3067402839660645
-5.0,6.331006050109863
-8.508638306165727,6.016699314117432
-5.0,5.15956449508667
-7.0,6.979831695556641
-5.207608310501746,5.215487480163574
-5.0,5.154875755310059
-5.0,5.146677017211914
-7.431798275933005,6.124077796936035
-5.050609993355087,5.923266410827637
-5.0,4.999246120452881
-6.013228265733755,5.075571537017822
-6.958607314841775,7.064516067504883
-5.0,5.557985305786133
-5.0,5.687197685241699
-5.0,5.188869476318359
-5.0,5.184711456298828
-5.0,4.796426773071289
-5.0,4.876142501831055
-5.0,5.288485050201416
-6.4089353929735005,7.0433573722839355
-5.0,6.026152610778809
-5.0,5.944884300231934
-5.886056647693163,4.994093894958496
-7.036212172654444,5.755471229553223
-5.0,5.098213195800781
-5.00436480540245,5.838769435882568
-7.154901959985743,6.219087600708008
-5.0,5.138200759887695
-5.638272163982407,5.327138900756836
-5.187086643357144,5.841745376586914
-5.0,5.732699394226074
-8.080921907623926,5.755471229553223
-5.0,4.8656744956970215
-5.0,5.008455276489258
-5.0,5.935582637786865
-5.0,4.948309898376465
-5.0,5.024043083190918
-5.0,5.302262306213379
-5.886056647693163,5.04293155670166
-5.0,4.962116241455078
-5.0,5.8074235916137695
-5.060480747381382,5.1931304931640625
-5.0,5.699628829956055
-5.769551078621726,5.35618782043457
-5.0,4.864201545715332
-5.0,5.121771335601807
-5.0,5.132430553436279
-5.0,5.074646949768066
-5.0,5.078376770019531
-5.0,5.705679893493652
-5.5376020021010435,5.17661190032959
-5.522878745280337,5.17598295211792
-5.0,5.241009712219238
-5.568636235841013,7.019701957702637
-5.0,5.314794540405273
-5.0,5.237338066101074
-5.0,5.0816264152526855
-6.0,6.080280303955078
-6.1938200260161125,5.1214375495910645
-5.0,5.631219863891602
-5.0,5.0008544921875
-5.0,5.5336222648620605
-5.0,5.003305912017822
-5.0,4.892431259155273
-5.0,5.557918071746826
-5.0,5.131155014038086
-5.0,5.024007797241211
-5.657577319177793,5.564286708831787
-5.0,4.9872941970825195
-5.0,5.2206525802612305
-8.920818753952375,6.961203575134277
-5.0,5.513126373291016
-5.0,5.434944152832031
-5.0,4.867055416107178
-6.013228265733755,5.244977951049805
-5.0,5.8976664543151855
-5.0,5.098393440246582
-5.0,5.236116409301758
-5.0,5.51078987121582
-5.0,4.856576919555664
-5.0,5.165796279907227
-5.0,5.658092498779297
-5.0,5.0160322189331055
-5.0,5.065028190612793
-5.0,5.055225849151611
-5.0,5.246847152709961
-5.0,5.1838274002075195
-5.0,5.181717872619629
-6.431798275933005,6.491187572479248
-5.0,5.2273664474487305
-5.0,5.166099548339844
-5.0,4.87090539932251
-5.0,5.134382247924805
-5.026872146400302,5.086352348327637
-5.0,5.5803542137146
-5.0,4.9298601150512695
-5.0,5.8174591064453125
-7.346787486224656,5.482209205627441
-5.0,5.1997222900390625
-7.200659450546418,6.50391960144043
-5.0,5.273124694824219
-5.886056647693163,5.1134033203125
-5.0,5.087270736694336
-5.0,5.03675651550293
-5.795880017344075,5.535167694091797
-5.0,5.482735633850098
-9.346787486224656,7.069303512573242
-5.3872161432802645,6.805514335632324
-8.958607314841775,5.755471229553223
-8.102372908709558,6.055492401123047
-5.2441251443275085,5.128665924072266
-7.823908740944319,7.209713459014893
-5.0,5.769959449768066
-8.522878745280337,6.080917835235596
-8.017728766960431,6.591649055480957
-5.0,5.728662967681885
-5.0,5.1001715660095215
-5.0,4.946878910064697
-5.0,4.9353718757629395
-5.0,5.112542629241943
-8.267606240177031,6.834686279296875
-5.0,5.430353164672852
-5.214670164989233,5.351589679718018
-5.0,5.595371723175049
-5.522878745280337,5.282112121582031
-6.585026652029182,5.685063362121582
-5.0,5.043683052062988
-5.0,5.136207580566406
-5.0,4.905807018280029
-6.698970004336019,5.242545127868652
-5.0,4.929176330566406
-5.0,5.354671955108643
-5.0,5.032461166381836
-5.0,5.043291091918945
-5.0,5.280797958374023
-5.0,5.0115556716918945
-5.0,6.325577735900879
-7.318758762624412,5.552177906036377
-6.4089353929735005,6.110538482666016
-5.0,5.574373722076416
-5.0,5.32090950012207
-5.638272163982407,7.154306888580322
-5.0,5.725383281707764
-5.0,5.172122001647949
-5.0,4.890357971191406
-5.6777807052660805,5.8219499588012695
-5.0,5.0070624351501465
-5.0,5.052396774291992
-5.0,5.860617637634277
-5.0,5.303020477294922
-5.0,5.5529069900512695
-6.886056647693163,6.0819172859191895
-5.0,5.383406639099121
-5.0,6.8740129470825195
-5.698970004336019,5.490667343139648
-5.0,5.172003269195557
-5.0,5.209410190582275
-5.0,5.021998405456543
-6.853871964321762,5.745770454406738
-5.0,5.166313648223877
-5.0,5.062996864318848
-5.0,4.876916885375977
-5.0,5.220357418060303
-5.0,5.18502950668335
-5.0,5.245901107788086
-5.0,5.909597396850586
-6.455931955649724,5.986693382263184
-5.853871964321762,5.380476951599121
-5.0,5.310511589050293
-5.0,5.1767754554748535
-5.0,5.630724906921387
-8.10790539730952,6.091131210327148
-5.0,5.479855537414551
-5.376750709602099,5.461133003234863
-5.0,5.075450897216797
-5.0,5.763574600219727
-5.0,5.286126136779785
-5.0,5.316219329833984
-5.585026652029182,5.6805033683776855
-5.0,5.64718770980835
-5.366531544420414,5.079193592071533
-5.0,5.073469161987305
-5.0,5.008033752441406
-5.0,5.061222076416016
-5.0,5.045931339263916
-5.0,5.175566673278809
-5.0,4.971877098083496
-5.522878745280337,5.781394004821777
-5.585026652029182,5.839539527893066
-7.301029995663981,5.529607772827148
-5.0,4.901052474975586
-5.0,4.910192966461182
-5.0,5.083390235900879
-5.0,5.105466365814209
-5.0,5.538674354553223
-5.0,5.021162986755371
-5.0,4.803465843200684
-5.0,5.042825222015381
-5.0,5.375392913818359
-5.0,5.006779670715332
-5.0,5.34962272644043
-5.522878745280337,5.41556453704834
-6.022276394711152,5.006396293640137
-5.0,5.741271018981934
-5.0,6.087365627288818
-5.795880017344075,5.7762651443481445
-5.0,4.959983825683594
-5.0,5.8120222091674805
-5.0,5.059961318969727
-6.920818753952375,5.806602478027344
-6.795880017344075,5.836082935333252
-9.0,5.5826873779296875
-5.568636235841013,5.274769306182861
-5.0,4.989231109619141
-5.0,5.236999988555908
-5.0,5.33712911605835
-7.0,6.081478118896484
-6.431798275933005,5.048496246337891
-5.0,5.271445274353027
-7.508638306165727,5.68321418762207
-5.0,5.25593376159668
-5.0,5.203350067138672
-5.0,4.901374816894531
-5.0,4.949761390686035
-5.0,4.877115249633789
-7.920818753952375,5.912632942199707
-5.0,5.140810489654541
-5.0,5.067802429199219
-5.292429823902063,5.03518533706665
-5.431798275933005,5.538853168487549
-5.0,4.918123722076416
-8.823908740944319,5.972027778625488
-5.0,4.962841987609863
-5.0,4.931541919708252
-5.0,5.146677017211914
-5.0,5.193362236022949
-5.0,5.264102935791016
-5.0,6.015875816345215
-5.0,5.350909233093262
-5.0,4.867677211761475
-5.0,5.44896125793457
-5.0,5.070747375488281
-5.0,5.448874473571777
-5.0,5.416087627410889
-6.508638306165727,6.105015754699707
-5.0,4.961238384246826
-5.0,5.5679731369018555
-5.0,5.349587917327881
-5.0,5.039098739624023
-5.0,5.6714677810668945
-5.0,5.305773735046387
-5.0,5.268559455871582
-6.075720713938118,5.966192722320557
-5.0,4.836892604827881
-5.0,5.742893218994141
-5.0,5.071625709533691
-5.0,5.303499221801758
-5.0,5.17233419418335
-6.958607314841775,5.528254985809326
-5.522878745280337,5.248684883117676
-5.0,5.068652629852295
-5.0,5.316451072692871
-7.494850021680094,7.001434326171875
-5.0,5.315191268920898
-5.0,5.024950981140137
-5.0,5.254791259765625
-5.0,4.963318824768066
-5.0,5.570267677307129
-5.0,5.490843772888184
-5.0,5.161630153656006
-8.619788758288394,6.824222087860107
-5.0,5.3156843185424805
-5.0,5.2942214012146
-5.0,5.554874420166016
-5.0,5.165999889373779
-5.0,5.283803939819336
-5.0,5.303933143615723
-5.431798275933005,5.666617393493652
-5.0,5.136105537414551
-5.0,5.049947738647461
-5.0,5.288876533508301
-5.0,5.039370536804199
-7.187086643357144,5.822373867034912
-5.0,4.919610023498535
-5.698970004336019,5.945400238037109
-5.0,5.683080673217773
-5.0,5.6627984046936035
-5.0,6.03623104095459
-5.0,5.932826042175293
-5.0,5.141118049621582
-9.022276394711152,5.033541202545166
-5.0,5.12965202331543
-5.0,5.339587688446045
-5.0,5.248780250549316
-5.0,4.836553573608398
-5.0,5.085101127624512
-5.0,4.8987579345703125
-5.0,5.07044792175293
-7.769551078621726,6.121687889099121
-5.0,5.00637149810791
-7.096910013008056,5.854928016662598
-5.0,5.260576248168945
-5.0,5.324342727661133
-5.0,5.062699794769287
-5.0,5.257168769836426
-5.0,5.060601711273193
-5.0,5.458560943603516
-5.0,5.024131774902344
-7.017728766960431,7.423998832702637
-7.214670164989233,5.269883155822754
-7.275724130399211,6.811774253845215
-5.0,6.191862106323242
-8.0,5.8472795486450195
-5.0,5.124912738800049
-5.0,5.1404829025268555
-5.0,4.867343902587891
-5.0,5.04022216796875
-5.0,5.2655029296875
-5.0,5.694277286529541
-5.0,5.013908863067627
-5.0,4.781917572021484
-5.0,5.219468116760254
-5.275724130399211,5.5331315994262695
-5.0,5.234189987182617
-5.0,5.480146884918213
-5.0,5.04767370223999
-5.0,5.6517014503479
-5.0,5.12379789352417
-5.0,5.126438140869141
-5.0,5.453824996948242
-5.0,5.8660888671875
-5.0,5.328244209289551
-5.0,5.17963981628418
-5.0,5.071131706237793
-5.0,4.956877708435059
-5.0,4.88063907623291
-5.0,5.047982215881348
-5.0,5.176419734954834
-5.0,4.954280376434326
-5.130768280269024,5.554845809936523
-5.0,5.113414764404297
-6.026872146400302,5.602947235107422
-5.0,4.924831867218018
-5.0,4.96695613861084
-6.309803919971486,5.174861907958984
-5.0,5.818310260772705
-5.721246399047171,4.909496307373047
-6.236572006437063,5.932527542114258
-8.795880017344075,6.969771862030029
-5.0,5.518884658813477
-5.0,6.007338523864746
-5.0,5.540932655334473
-5.0,5.788569450378418
-5.0,5.532705783843994
-6.5376020021010435,5.5160346031188965
-5.0,5.0912933349609375
-5.0,4.856468677520752
-8.397940008672037,6.058992862701416
-6.698970004336019,5.316241264343262
-5.0,5.130786418914795
-5.0,5.191119194030762
-5.0,5.679380416870117
-6.214670164989233,5.605595588684082
-5.0,5.145626544952393
-5.0,5.098324775695801
-6.2839966563652006,6.178473949432373
-5.0,4.896289348602295
-5.0,5.721698760986328
-5.0,5.675407886505127
-5.0,5.192127227783203
-6.3979400086720375,5.018643379211426
-6.721246399047171,5.705374240875244
-5.0,5.310056686401367
-5.0,4.997928619384766
-5.6777807052660805,5.876625061035156
-5.0,5.574373722076416
-6.481486060122113,5.6177239418029785
-5.0,5.176194190979004
-5.0,5.770070552825928
-5.0,5.065040588378906
-5.0,4.901945114135742
-5.0,5.304867744445801
-5.0,5.107433795928955
-5.0,5.159817695617676
-5.0,5.569995403289795
-8.318758762624412,5.876667022705078
-5.0,5.083118915557861
-8.638272163982407,5.956865310668945
-5.0,5.285742282867432
-5.0,5.110982894897461
-7.267606240177032,6.6297736167907715
-5.0,5.330287933349609
-5.0,6.089505195617676
-5.0,5.702353477478027
-5.0,5.437623977661133
-5.853871964321762,5.235838890075684
-7.638272163982407,7.055528163909912
-5.0,5.14874792098999
-5.0,5.137228965759277
-5.0,4.9849700927734375
-6.721246399047171,5.896649360656738
-5.0,4.895516395568848
-5.0,4.995662689208984
-5.7447274948966935,5.30023193359375
-8.958607314841775,5.564143180847168
-5.0,5.262574195861816
-5.494850021680094,5.407924652099609
-5.0,5.317014217376709
-5.0,5.595371723175049
-5.0,5.114924430847168
-5.0,5.2740020751953125
-7.221848749616356,6.200937271118164
-5.0,5.609557151794434
-7.769551078621726,6.328927993774414
-6.3979400086720375,5.982390403747559
-5.0,5.053490161895752
-5.0,5.115092754364014
-5.0,5.052903652191162
-5.0,5.078560829162598
-5.0,5.11417293548584
-5.0,5.095697402954102
-5.958607314841775,5.671141624450684
-5.0,4.895526885986328
-5.0,5.196778297424316
-5.0,5.450140476226807
-5.0,5.100974082946777
-5.522878745280337,5.610620975494385
-5.0,5.224007606506348
-5.0,5.471768379211426
-5.0,5.056853294372559
-5.0,5.0701446533203125
-5.0,5.137789726257324
-5.0,4.946321964263916
-5.337242168318426,6.070840835571289
-5.0,5.735260009765625
-5.0,5.747743606567383
-5.0,4.833939552307129
-5.0,5.379556655883789
-5.0,5.110578536987305
-5.698970004336019,5.339715003967285
-5.0,5.150895118713379
-5.0,5.805891513824463
-5.0,5.321376800537109
-5.161150909262744,5.2104902267456055
-5.0,5.201996803283691
-8.236572006437063,5.6636962890625
-7.769551078621726,6.989019870758057
-6.070581074285707,5.289624214172363
-5.585026652029182,5.530208587646484
-5.455931955649724,5.852368354797363
-5.0,5.745770454406738
-5.0,5.2944159507751465
-5.0,5.095922470092773
-5.0,5.198358058929443
-5.920818753952375,6.297525405883789
-5.6020599913279625,5.216314315795898
-5.0,5.124537467956543
-5.0,4.999621391296387
-5.481486060122113,4.991700172424316
-5.0,5.09813117980957
-5.0,5.062218189239502
-5.0,5.3744306564331055
-7.6777807052660805,5.964755058288574
-6.00436480540245,5.398259162902832
-5.0,5.248780250549316
-8.3767507096021,6.140512466430664
-5.0,5.850178241729736
-5.0,5.174772262573242
-5.0,5.044309139251709
-5.0,4.988915920257568
-5.0,5.288536548614502
-5.6020599913279625,5.856584072113037
-5.0,5.059901237487793
-5.0,5.605179786682129
-5.0,5.295160293579102
-5.0,5.479231357574463
-7.886056647693163,6.201131820678711
-5.0,4.782402515411377
-5.0,4.808653354644775
-5.886056647693163,5.373836040496826
-5.0,4.97236442565918
-5.920818753952375,6.572206974029541
-5.0,5.953269004821777
-6.013228265733755,6.070840835571289
-5.0,5.166252136230469
-5.0,6.007086753845215
-5.0,5.863348960876465
-5.0,5.324314117431641
-5.0,5.397709846496582
-5.0,5.144864559173584
-5.0,6.0432538986206055
-5.0,5.2523603439331055
-6.468521082957745,6.324986457824707
-5.0,4.868564605712891
-5.0,5.5538859367370605
-5.0,5.075579643249512
-5.0,4.8489298820495605
-5.721246399047171,5.777561187744141
-5.0,5.130781173706055
-5.0,5.197575569152832
-5.0,5.319944381713867
-5.0,5.378913402557373
-5.0,5.786166191101074
-5.0,4.8970136642456055
-8.086186147616283,5.898506164550781
-5.0,5.1984171867370605
-6.292429823902063,5.93101692199707
-5.0,5.07295560836792
-5.0,5.058791160583496
-5.0,5.068933486938477
-6.0,6.0819172859191895
-5.0,5.735260009765625
-5.0,5.14387845993042
-5.0,4.993603706359863
-5.0,5.0202531814575195
-5.0,5.195162773132324
-5.0,5.121493816375732
-5.0,5.0161333084106445
-5.0,5.09869384765625
-5.0,5.5422773361206055
-5.0,5.283176422119141
-5.721246399047171,5.681222915649414
-5.0,4.963068008422852
-5.0,5.828653812408447
-5.0,5.12947940826416
-5.0,5.023113250732422
-5.0,5.908696174621582
-5.0,4.9859700202941895
-5.0,5.207319259643555
-5.619788758288394,5.615939140319824
-5.0,4.937232971191406
-5.0,5.229761123657227
-5.0,5.5623579025268555
-5.0,5.030416965484619
-5.0,4.922423839569092
-5.0,5.215533256530762
-5.0,4.873162746429443
-6.013228265733755,6.029382228851318
-5.0,5.266998291015625
-5.0,5.762931823730469
-5.0,4.895915985107422
-5.0,5.163637161254883
-5.0,5.094509601593018
-7.455931955649724,6.612015724182129
-5.0,7.261883735656738
-5.455931955649724,6.0819172859191895
-5.0,5.0969953536987305
-7.008773924307505,5.295175075531006
-6.060480747381382,5.787758827209473
-8.236572006437063,5.0252909660339355
-8.301029995663981,5.345959663391113
-5.0,5.142392635345459
-5.0,5.168133735656738
-5.0,5.075342178344727
-5.552841968657781,5.374836444854736
-5.0,5.149288177490234
-5.0,5.098694801330566
-5.0,5.096076965332031
-5.0,4.866555213928223
-7.0,5.823170185089111
-5.3979400086720375,5.057816982269287
-6.0655015487564325,5.42949104309082
-8.200659450546418,5.9684553146362305
-5.080921907623926,5.191075325012207
-5.0,5.083878517150879
-5.42021640338319,5.69846248626709
-5.0,4.927145957946777
-5.0,5.137932777404785
-7.031517051446065,6.083136081695557
-5.958607314841775,5.057190418243408
-5.0,5.2373247146606445
-5.0,5.040612697601318
-5.0,5.080384731292725
-5.0,5.0921125411987305
-5.0,4.841069221496582
-5.0,5.805891513824463
-5.721246399047171,5.407353401184082
-5.0,5.041132926940918
-5.958607314841775,5.8190412521362305
-5.0,5.223513603210449
-5.853871964321762,5.790344715118408
-5.0,4.947116851806641
-5.0,5.290521144866943
-5.0,4.927859783172607
-5.0,5.093435764312744
-8.142667503568731,5.042320251464844
-5.638272163982407,5.554637908935547
-5.0,5.274047374725342
-5.0,5.006941795349121
-5.0,5.042314052581787
-6.130768280269024,5.048258304595947
-5.327902142064283,5.551751613616943
-5.0,5.119976043701172
-5.0,5.184651851654053
-5.0,5.087863445281982
-5.0,5.0676798820495605
-5.0,5.169462203979492
-5.0,4.944882869720459
-5.0,5.0667877197265625
-5.0,5.21164083480835
-5.0,5.37971830368042
-5.0,5.189648628234863
-5.0,5.914072513580322
-5.0,5.268737316131592
-5.1938200260161125,6.245674133300781
-5.0,5.7100043296813965
-6.236572006437063,5.9831438064575195
-5.00436480540245,5.287542343139648
-5.42021640338319,5.864152431488037
-5.0,5.13578987121582
-5.0,5.844880104064941
-8.468521082957745,6.1550798416137695
-5.0,5.102533340454102
-5.0,5.140647888183594
-5.0,5.268575668334961
-5.823908740944319,5.680168151855469
-6.3979400086720375,5.198143005371094
-5.0,5.554845809936523
-5.0,5.119728088378906
-5.0,5.4476118087768555
-5.0,5.176008701324463
-5.443697499232712,5.550199031829834
-5.0,5.130841255187988
-5.0,5.186311721801758
-5.0,4.913778305053711
-5.0,5.537200927734375
-5.0,5.074833869934082
-5.0,5.812960624694824
-8.337242168318426,5.183806419372559
-5.0,5.31158447265625
-5.0,4.820186138153076
-5.0,5.299338340759277
-6.050609993355087,5.290489673614502
-6.508638306165727,5.7874860763549805
-5.0,5.055419921875
-5.0,5.127567291259766
-5.0,5.525476932525635
-5.0,4.985363006591797
-5.0,5.189406394958496
-5.0,5.916285991668701
-5.0,4.881054401397705
-5.0,5.800771236419678
-5.0,5.11789608001709
-5.0,5.669097423553467
-5.0,5.0234246253967285
-6.657577319177793,5.957285404205322
-5.0,5.710318565368652
-5.0,5.82352352142334
-5.0,4.8507585525512695
-5.958607314841775,5.902114391326904
-5.886056647693163,5.313859462738037
-5.0,5.143030643463135
-5.0,5.203628063201904
-5.0,5.176963806152344
-5.0,5.101917743682861
-6.017728766960431,5.975214004516602
-5.823908740944319,5.0312652587890625
-5.0,4.898352146148682
-5.0,4.997610569000244
-5.0,5.147936820983887
-8.619788758288394,5.901167869567871
-5.0,5.067848205566406
-5.0,4.837224006652832
-6.292429823902063,7.011584758758545
-5.0,5.018156051635742
-5.886056647693163,6.149606227874756
-5.0,4.9794182777404785
-5.508638306165727,5.109586238861084
-5.0,5.455148696899414
-5.0,4.934081554412842
-5.0,5.008930206298828
-6.6777807052660805,5.303472995758057
-5.0,5.025608539581299
-5.0,5.074134826660156
-5.0,4.98422908782959
-5.0,5.67719030380249
-5.0,4.948105812072754
-5.0,5.161320686340332
-5.0,5.422482490539551
-5.0,4.991517066955566
-6.142667503568732,6.578041076660156
-5.0,5.2751922607421875
-5.823908740944319,6.634127616882324
-6.026872146400302,5.63886833190918
-5.823908740944319,5.30002498626709
-7.886056647693163,6.125850677490234
-5.0,5.1762824058532715
-5.0,5.337027549743652
-5.0,5.019153594970703
-5.0,5.564026355743408
-5.0,5.0396647453308105
-5.0,5.187400817871094
-5.0,5.185852527618408
-5.0,5.752268314361572
-5.0,5.163508415222168
-5.0,5.693586826324463
-5.0,5.899376392364502
-5.0,5.214658737182617
-6.356547323513812,5.896334171295166
-5.0,5.252484321594238
-6.721246399047171,6.0723700523376465
-5.251811972993799,6.464108467102051
-5.0,4.880385398864746
-5.0,4.987823486328125
-5.0,5.4633402824401855
-5.0,5.998905181884766
-6.522878745280337,6.468524932861328
-5.0,6.5985612869262695
-5.0,5.170330047607422
-7.0,5.654679298400879
-9.795880017344075,6.956006050109863
-5.0,4.896082401275635
-6.638272163982407,5.454794883728027
-5.823908740944319,5.029931545257568
-5.494850021680094,5.42294979095459
-5.0,5.446474075317383
-5.0,5.548917770385742
-5.698970004336019,5.329188346862793
-5.4089353929735005,6.336469650268555
-6.823908740944319,5.7849836349487305
-5.0,5.483310699462891
-5.795880017344075,5.767300605773926
-5.0,5.79163932800293
-7.107905397309519,5.45900821685791
-5.0,5.129743576049805
-8.823908740944319,4.901333808898926
-5.0,4.777696132659912
-6.920818753952375,5.788189888000488
-6.0,5.860832214355469
-5.0,4.920839786529541
-5.0,5.45849609375
-5.698970004336019,5.266758441925049
-7.657577319177793,5.900501251220703
-5.0,5.427187919616699
-5.0,5.367867469787598
-5.0,5.241382598876953
-5.0,5.412513732910156
-5.0,5.014494895935059
-6.221848749616356,5.772611141204834
-5.214670164989233,5.75670051574707
-5.0,5.805198669433594
-5.0,5.219902038574219
-5.0,5.117614269256592
-7.0,5.480337142944336
-6.096910013008056,5.976898193359375
-5.0,6.6162872314453125
-5.0,5.414114952087402
-5.0,4.8811140060424805
-5.0,5.088518142700195
-5.6020599913279625,5.949848651885986
-5.0,5.344054222106934
-5.0,5.723901748657227
-5.0,4.959595203399658
-5.0,5.31064510345459
-5.0,4.872775077819824
-5.0,5.236259937286377
-6.619788758288394,5.377869129180908
-5.0,5.323177337646484
-5.795880017344075,5.13213586807251
-5.0,5.0130615234375
-5.221848749616356,5.430251121520996
-8.494850021680094,6.990474700927734
-5.0,5.814802169799805
-6.130768280269024,5.616330146789551
-5.0,5.446417808532715
-5.0,4.850494384765625
-5.0,5.070901870727539
-5.301029995663981,5.328600883483887
-5.0,5.069902420043945
-5.0,4.873189926147461
-5.795880017344075,5.312308311462402
-5.0,5.143299102783203
-5.0,5.130724906921387
-5.0,5.386248588562012
-5.0,5.28123140335083
-5.0,5.078908920288086
-5.0,5.1914167404174805
-5.0,5.88693380355835
-5.0,5.172555923461914
-5.0,5.268787860870361
-5.0,5.148958206176758
-5.0,5.469461441040039
-5.0,4.911620140075684
-5.0,5.24478006362915
-5.0,5.149053573608398
-5.0,5.25627326965332
-5.0,4.9900054931640625
-5.0,5.054835319519043
-5.356547323513812,5.913827419281006
-5.0,5.061837196350098
-6.113509274827518,5.002420425415039
-5.0,5.403027534484863
-5.0,5.940440654754639
-5.0,4.973336696624756
-7.958607314841775,6.168784141540527
-5.0,5.177983283996582
-5.0,5.078145503997803
-5.0,4.933529853820801
-5.0,5.1947922706604
-9.387216143280265,5.757914066314697
-5.0,5.1979217529296875
-5.585026652029182,5.357439041137695
-5.0,6.232038497924805
-5.0,5.095844268798828
-5.0,5.292263031005859
-5.0,5.101437568664551
-5.0,4.900722503662109
-10.327902142064282,6.433475971221924
-5.0,5.052748680114746
-5.0,5.026836395263672
-5.0,5.74260139465332
-5.0,5.0817670822143555
-5.130768280269024,5.266097068786621
-5.0,5.403169631958008
-5.0,5.06298828125
-5.0,5.033968448638916
-5.0,5.076223373413086
-5.0,5.002239227294922
-6.229147988357855,6.081478118896484
-5.0,5.098994731903076
-5.0,5.061359882354736
-5.0,5.566514015197754
-7.721246399047171,5.9255690574646
-5.0,5.167634963989258
-6.431798275933005,6.570931434631348
-5.142667503568732,6.1469597816467285
-5.0,5.784704208374023
-5.0,4.83413028717041
-5.055517327849832,6.100607872009277
-5.0,5.076581954956055
-5.0,5.249560356140137
-6.275724130399211,5.56441593170166
-6.431798275933005,5.02067756652832
-5.0,5.057110786437988
-6.045757490560675,5.395101070404053
-5.0,5.0037078857421875
-5.0,4.996513366699219
-5.0,4.875942707061768
-5.0,5.560410976409912
-5.0,5.110130786895752
-5.0,5.345344543457031
-5.0,5.00662899017334
-5.0,5.681107521057129
-5.0,4.778080940246582
-5.0,5.770810127258301
-6.853871964321762,5.821983814239502
-5.0,5.020664215087891
-6.301029995663981,5.7847394943237305
-5.0,4.978996276855469
-5.721246399047171,5.446943283081055
-5.0,5.176641464233398
-5.0,5.187524318695068
-5.0,5.053587913513184
-5.0,4.951630115509033
-6.075720713938118,5.258608341217041
-5.0,5.043436050415039
-5.0,5.574373722076416
-5.0,4.918489456176758
-8.356547323513812,7.032384872436523
-5.0,5.0742998123168945
-5.0,5.022900581359863
-6.585026652029182,6.468524932861328
-5.0,5.0496721267700195
-5.0,5.900880813598633
-5.0,5.137021541595459
-5.0,5.194388389587402
-5.823908740944319,5.874350547790527
-7.301029995663981,5.30712366104126
-5.0,4.837940692901611
-5.508638306165727,5.7392578125
-5.0,5.223846435546875
-5.0,5.040786266326904
-5.769551078621726,5.847721099853516
-5.0,5.248645782470703
-6.455931955649724,6.996800422668457
-5.0,5.8888726234436035
-5.0,5.120123386383057
-6.494850021680094,6.383307456970215
-5.0,5.00172233581543
-5.107905397309519,5.080732345581055
-5.0,5.237883567810059
-5.0,4.970445156097412
-5.0,5.083791732788086
-7.0915149811213505,6.121687889099121
-5.0,6.035660743713379
-5.0,5.0850510597229
-5.6777807052660805,5.422045707702637
-5.0,5.328670501708984
-5.0,5.120737552642822
-6.142667503568732,6.541202068328857
-5.0,5.037298679351807
-5.823908740944319,5.268497467041016
-6.698970004336019,5.7560529708862305
-5.0,6.046812534332275
-5.698970004336019,5.087230205535889
-5.0,5.315523147583008
-5.0,4.930173873901367
-5.0,5.438509941101074
-5.0,5.183353424072266
-5.0,4.968513011932373
-6.522878745280337,5.540149688720703
-5.0,6.062459945678711
-5.508638306165727,5.978686332702637
-5.494850021680094,5.942141532897949
-5.0,5.837018013000488
-5.0,5.28697395324707
-5.0,4.903389930725098
-5.0,5.087607383728027
-5.0,5.122107982635498
-5.0,5.058021545410156
-5.568636235841013,5.519793510437012
-5.0,5.356562614440918
-5.0,5.128346920013428
-5.0,5.433239459991455
-6.657577319177793,5.954606056213379
-5.0,5.33618688583374
-7.481486060122112,6.25163459777832
-5.0,5.766303539276123
-5.0,5.347524166107178
-5.0,5.392266273498535
-7.7447274948966935,7.169955253601074
-5.0,5.142765045166016
-5.958607314841775,5.643701553344727
-5.0,4.949807167053223
-5.0,5.688826084136963
-5.0,5.941869258880615
-5.0,5.118895530700684
-5.0,4.816283226013184
-5.0,5.27882194519043
-5.0,5.112618446350098
-5.0,4.959427833557129
-7.142667503568732,7.071105003356934
-5.0,4.840236186981201
-5.0,5.0472259521484375
-5.0,4.982207775115967
-5.0,5.675407886505127
-5.0,5.811784267425537
-9.301029995663981,5.931362152099609
-5.0,5.184088230133057
-5.958607314841775,5.301470756530762
-5.0,5.419805526733398
-5.0,5.167335033416748
-5.0,5.300671100616455
-5.0,5.225922107696533
-6.657577319177793,5.860032558441162
-5.0,4.92154598236084
-6.136677139879544,5.203700065612793
-5.0,5.148393154144287
-5.0,5.511054039001465
-5.0,5.215608596801758
-5.0,5.329387664794922
-6.769551078621726,6.081478118896484
-6.096910013008056,6.248431205749512
-5.0,5.21708869934082
-5.0,5.010693550109863
-6.585026652029182,6.063931465148926
-5.0,5.045981407165527
-6.552841968657781,5.570218563079834
-5.0,5.167178153991699
-5.823908740944319,5.6150102615356445
-5.180456064458132,5.496599197387695
-5.0,5.323678016662598
-5.142667503568732,5.335887908935547
-5.0,5.1361565589904785
-5.0,5.442056655883789
-5.0,5.061773300170898
-5.0,4.988348007202148
-5.0,6.025759696960449
-5.0,5.220810413360596
-5.0,4.980427265167236
-5.0,5.199069023132324
-6.5376020021010435,5.581024646759033
-5.6777807052660805,5.675689697265625
-5.0,5.092046737670898
-5.366531544420414,6.048750400543213
-5.0,5.041281700134277
-5.0,5.630724906921387
-5.0,5.180087566375732
-6.050609993355087,5.215478897094727
-6.455931955649724,5.668018817901611
-5.0,5.224939346313477
-6.619788758288394,5.1805830001831055
-7.136677139879544,6.982718467712402
-5.0,5.549159049987793
-5.0,5.047005653381348
-5.0,4.8939619064331055
-5.0,5.311410427093506
-5.7447274948966935,6.279751777648926
-5.0,4.916207790374756
-5.886056647693163,6.12117862701416
-5.0,4.891939163208008
-6.366531544420414,5.953434944152832
-6.958607314841775,5.155145645141602
-6.6777807052660805,5.479715347290039
-5.0,4.96777868270874
-5.7447274948966935,6.297525405883789
-5.0,5.1762542724609375
-5.0,4.9183669090271
-5.2441251443275085,5.738369941711426
-5.0,5.219736576080322
-5.0,5.78594970703125
-5.0,5.161992073059082
-5.0,5.18921422958374
-5.0,4.841911792755127
-5.0,5.7731828689575195
-5.0,5.200016975402832
-5.920818753952375,5.199206352233887
-5.0,5.6416730880737305
-5.0,5.016135215759277
-5.0,5.13743782043457
-5.0,5.727575778961182
-5.0,5.024388313293457
-5.0,5.27601957321167
-5.0,5.899376392364502
-5.0,5.448630332946777
-7.3872161432802645,5.936554431915283
-5.0,5.1598968505859375
-5.0,4.988651275634766
-5.0,5.312493324279785
-5.0,5.23713493347168
-5.0,5.195990562438965
-5.0,5.350312232971191
-5.0,5.1331000328063965
-5.0,5.095782279968262
-5.0,5.479891777038574
-5.769551078621726,5.059808254241943
-5.0,5.281373500823975
-6.4089353929735005,5.928915500640869
-5.0,5.2076263427734375
-5.0,5.650112152099609
-5.0,4.936409950256348
-5.657577319177793,5.637761116027832
-5.0,5.170032501220703
-5.0,5.327764987945557
-6.200659450546418,5.098733901977539
-5.6777807052660805,5.0901079177856445
-5.0,5.139081954956055
-6.657577319177793,5.9139862060546875
-5.0,5.420815467834473
-8.958607314841775,6.453577518463135
-5.0,5.411110877990723
-5.769551078621726,5.151978492736816
-5.0,4.838422775268555
-5.0,5.085675239562988
-5.0,5.144502639770508
-9.259637310505756,6.366186618804932
-6.795880017344075,6.122407913208008
-5.0,5.0126237869262695
-5.6777807052660805,5.572327613830566
-5.0,5.970475196838379
-6.040958607678906,5.1339874267578125
-5.0,5.02725887298584
-5.259637310505756,5.328600883483887
-5.0,5.206199645996094
-5.0,5.200263977050781
-5.0,5.270627975463867
-5.6020599913279625,6.12824010848999
-6.853871964321762,5.210617542266846
-5.0,5.4568705558776855
-5.0,5.230368137359619
-7.481486060122112,6.348084449768066
-5.0,5.05129861831665
-5.0,5.123928070068359
-5.0,5.130136489868164
-5.0,5.689692497253418
-7.1487416512809245,6.106252670288086
-5.0,4.9157304763793945
-5.356547323513812,5.758405685424805
-5.494850021680094,5.241445541381836
-5.0,5.18727445602417
-5.0,4.936471462249756
-5.0,5.613638877868652
-5.0,5.593926429748535
-9.602059991327963,7.040454387664795
-5.0,5.725122451782227
-5.920818753952375,5.710304260253906
-5.0,5.667865753173828
-5.0,5.931347846984863
-5.0,4.982415199279785
-5.0,5.352862358093262
-5.0,5.004886627197266
-7.6777807052660805,6.104689598083496
-6.167491087293763,5.766303539276123
-5.0,5.149229526519775
-5.0,5.950233459472656
-5.0,5.342550754547119
-5.070581074285707,5.4026336669921875
-5.823908740944319,5.725122928619385
-5.0,4.893153667449951
-5.619788758288394,5.134391784667969
-5.0,5.014826774597168
-5.0,5.348171234130859
-5.0,6.01397180557251
-5.0,6.181660175323486
-6.229147988357855,6.05539608001709
-5.0,5.0496697425842285
-5.0,5.01552677154541
-5.0,5.69101619720459
-9.200659450546418,6.1729254722595215
-5.0,5.159036636352539
-5.0,5.2968549728393555
-6.853871964321762,6.704538345336914
-5.0,5.916802883148193
-5.585026652029182,5.465845584869385
-5.0,5.107630729675293
-5.0,5.267704010009766
-5.6777807052660805,5.8225603103637695
-5.0,5.601394176483154
-5.0,4.8487019538879395
-6.173925197299173,5.63515567779541
-5.657577319177793,6.28316593170166
-7.080921907623926,4.990891456604004
-5.0,5.183167457580566
-5.0,4.779679298400879
-5.698970004336019,5.873922824859619
-5.0,5.990155220031738
-7.795880017344075,6.078729152679443
-5.0,5.2514824867248535
-5.207608310501746,5.155476093292236
-5.0,6.322917938232422
-5.0,5.086453437805176
-5.0,5.287332534790039
-5.0,6.9648332595825195
-6.301029995663981,7.01969051361084
-5.0,4.959463119506836
-5.0,5.050135135650635
-5.0,5.074774742126465
-9.267606240177031,6.969840049743652
-7.795880017344075,5.828339099884033
-5.0,5.232540130615234
-5.0,4.948105812072754
-5.0,4.922046661376953
-6.142667503568732,5.5610456466674805
-5.0,5.563716411590576
-5.0,5.709658622741699
-5.0,6.2827863693237305
-5.0,5.812960624694824
-5.0,5.037583351135254
-5.0,5.081021308898926
-7.522878745280337,6.930846214294434
-5.0,5.2951507568359375
-5.657577319177793,5.757446765899658
-5.0,5.175546646118164
-5.853871964321762,5.496604919433594
-5.0,5.903420448303223
-5.0,5.2353925704956055
-9.721246399047171,4.898301601409912
-5.0,5.448046684265137
-5.0,5.300372123718262
-8.193820026016112,5.782652854919434
-5.0,5.560013771057129
-5.0,5.0844807624816895
-5.0,5.151494026184082
-5.0,5.032620429992676
-5.0,5.152386665344238
-5.0,5.248780250549316
-5.920818753952375,5.647356033325195
-5.0,4.781405925750732
-5.0,5.380083084106445
-5.0,5.117368221282959
-5.0,4.935338973999023
-6.568636235841013,7.423998832702637
-5.1249387366083,5.789730548858643
-5.0,4.934013366699219
-5.0,5.7841877937316895
-5.0,5.623664855957031
-5.0,4.9626359939575195
-5.0,5.01924991607666
-5.0,5.090538024902344
-5.0,5.823267936706543
-9.327902142064282,5.65963077545166
-5.585026652029182,6.0829267501831055
-5.0,5.652498722076416
-5.0,5.020552635192871
-5.0,5.1549072265625
-5.0,4.870360374450684
-5.0,5.197273254394531
-5.0,5.106172561645508
-5.0,5.228049278259277
-5.0,5.078157424926758
-5.0,5.899376392364502
-8.346787486224656,5.56805419921875
-5.0,5.176445960998535
-5.0,5.194200038909912
-5.0,5.080677032470703
-5.0,5.4074296951293945
-6.769551078621726,5.079036235809326
-5.0,5.269202709197998
-6.6020599913279625,5.528224945068359
-5.0,5.591968536376953
-6.638272163982407,5.779102325439453
-5.0,4.967693328857422
-5.309803919971486,5.393634796142578
-5.0,5.102380752563477
-5.0,5.526050567626953
-5.045757490560675,5.071056365966797
-5.2839966563652006,5.468219757080078
-5.795880017344075,5.890212535858154
-5.0,5.2220659255981445
-5.0,5.76399564743042
-5.0,5.618053436279297
-5.0,5.300662040710449
-5.0,6.166292190551758
-5.0,5.319906234741211
-5.327902142064283,5.828653812408447
-5.0,5.009707450866699
-6.337242168318426,5.884193420410156
-7.455931955649724,5.5251383781433105
-5.301029995663981,5.27107048034668
-5.0,6.01397180557251
-6.2076083105017466,5.142749786376953
-5.0,5.083580017089844
-5.0,5.138602256774902
-5.0,4.949151039123535
-5.5376020021010435,5.211377143859863
-5.0,4.989169120788574
-6.7447274948966935,5.922281742095947
-5.0,5.092674255371094
-5.0,5.070501327514648
-5.0,4.8204345703125
-5.0,5.525053024291992
-5.0,5.22028923034668
-7.769551078621726,5.646913528442383
-5.0,4.979857444763184
-5.0,4.940367221832275
-5.0,5.305204391479492
-5.0,5.124425411224365
-5.0,5.080996513366699
-5.0,4.848986625671387
-5.0,5.095510005950928
-6.552841968657781,5.884517669677734
-5.0,5.69786262512207
-6.1938200260161125,5.860239505767822
-5.0,5.213353633880615
-5.0,5.132605075836182
-5.0,5.637021541595459
-5.292429823902063,5.789730548858643
-5.6777807052660805,5.992137432098389
-5.0,5.441943168640137
-7.055517327849832,5.140649795532227
-5.0,5.005801200866699
-6.136677139879544,5.782013416290283
-5.0,5.182336807250977
-6.958607314841775,6.67197322845459
-5.0,5.150435447692871
-5.0,5.089216232299805
-5.0,5.115515232086182
-6.346787486224656,5.242466449737549
-5.0,5.9308319091796875
-5.0,5.1277055740356445
-5.0,4.996695518493652
-5.0,5.049859046936035
-5.0,4.912587642669678
-5.0,4.928353786468506
-5.0,5.08870792388916
-5.0,5.313379287719727
-5.0,5.925337791442871
-6.853871964321762,5.856503009796143
-5.0,4.922158241271973
-6.136677139879544,5.898246765136719
-5.0,5.631792068481445
-5.0,5.2919816970825195
-5.0,5.526106834411621
-5.0,5.635260581970215
-6.275724130399211,6.118099689483643
-5.853871964321762,5.454353332519531
-5.0,5.196191787719727
-5.0,5.0734944343566895
-6.481486060122113,5.647361755371094
-5.0,5.205197334289551
-5.0,4.887998580932617
-5.0,4.870664596557617
-5.0,5.5675811767578125
-5.0,5.077020168304443
-5.0,5.22743034362793
-5.0,5.3555908203125
-5.0,5.153173923492432
-5.886056647693163,5.08989143371582
-5.7447274948966935,5.2691779136657715
-7.096910013008056,6.520868301391602
-7.494850021680094,5.854981899261475
-5.6777807052660805,5.519548416137695
-5.0,5.074646949768066
-5.0,5.40714168548584
-5.0,4.897180080413818
-5.0,5.423702716827393
-6.1938200260161125,6.096947193145752
-6.3872161432802645,5.790798187255859
-6.229147988357855,4.966732978820801
-5.0,5.280702590942383
-7.619788758288394,5.866185188293457
-5.0,5.167778968811035
-5.0,5.034060001373291
-5.0,5.031160354614258
-6.638272163982407,5.790558815002441
-6.920818753952375,6.318928241729736
-5.0,5.848217010498047
-5.0,5.134057998657227
-5.0,5.151142120361328
-5.0,4.9897356033325195
-5.0,5.055907249450684
-5.0,5.352353096008301
-5.0,5.218184947967529
-5.0,5.375133991241455
-5.0,5.555765628814697
-5.0,4.982848644256592
-5.853871964321762,5.88686466217041
-5.0,4.934035301208496
-5.0,5.099947929382324
-5.3872161432802645,5.373217582702637
-5.0,5.233598709106445
-5.0,5.2401533126831055
-5.0,5.7115912437438965
-5.795880017344075,5.706482410430908
-5.0,5.052908897399902
-5.0,5.073075771331787
-5.0,5.809909820556641
-6.853871964321762,6.981624603271484
-8.602059991327963,6.828220367431641
-6.6020599913279625,5.86973762512207
-5.886056647693163,5.989985466003418
-5.0,5.1789703369140625
-5.0,5.019500255584717
-5.0,5.854468822479248
-7.060480747381382,6.749750137329102
-5.0,5.114171981811523
-5.0,5.057048797607422
-5.0,5.1757636070251465
-5.7447274948966935,5.075841426849365
-5.0,5.922826290130615
-9.2839966563652,5.65963077545166
-5.0,5.894754886627197
-5.795880017344075,5.620209217071533
-5.0,5.584494590759277
-5.0,5.17853307723999
-7.086186147616283,5.722965717315674
-5.0,4.987893581390381
-5.0,5.1003313064575195
-5.721246399047171,5.1954545974731445
-5.0,5.240261077880859
-5.0,5.536802291870117
-5.0,5.475227355957031
-5.0,5.310112953186035
-5.0,5.181850433349609
-5.0,4.874364376068115
-5.698970004336019,5.516777992248535
-5.0,4.95058536529541
-5.0,5.2908830642700195
-5.0,5.071765422821045
-5.0,5.675407886505127
-5.0,5.170841693878174
-7.508638306165727,5.957977294921875
-5.0,4.945024013519287
-5.0,5.497377395629883
-5.0,4.828794479370117
-5.0,5.38783597946167
-5.0,5.346932411193848
-5.0,5.129908084869385
-5.0,5.2240495681762695
-5.0,5.471339225769043
-5.0,5.18467903137207
-5.0,5.894829750061035
-5.0,4.951019287109375
-6.292429823902063,5.514928340911865
-5.0,5.145270824432373
-9.173925197299173,5.747437477111816
-5.0,4.905699253082275
-5.0,5.016477584838867
-6.0915149811213505,5.86532735824585
-5.0,5.077450275421143
-6.522878745280337,6.038887023925781
-5.0,5.161414623260498
-5.0,4.919811248779297
-5.0,5.206361770629883
-5.0,5.772451400756836
-5.0,6.468899726867676
-5.0,5.337562561035156
-5.0,5.061183929443359
-5.0,5.017290115356445
-5.0,5.110241889953613
-5.0,5.332320213317871
-5.0,5.101919174194336
-5.0,4.933536529541016
-5.0,5.1404619216918945
-9.619788758288394,5.820672988891602
-5.0,5.0546159744262695
-5.0,4.974708557128906
-5.0,6.01397180557251
-5.207608310501746,5.529297828674316
-5.0,5.265341758728027
-6.107905397309519,5.49204158782959
-5.0,5.679380416870117
-5.0,5.1809773445129395
-5.0,5.600425720214844
-6.251811972993799,5.62355375289917
-6.619788758288394,6.017958641052246
-5.0,6.062211990356445
-5.0,4.983519077301025
-7.221848749616356,4.941484451293945
-5.0,5.577676296234131
-5.0,4.952582359313965
-5.0,4.838966369628906
-5.0,5.201335430145264
-5.0,6.2380781173706055
-5.0,5.203497886657715
-8.022276394711152,6.684724807739258
-5.0,5.24078369140625
-5.0,5.0111870765686035
-5.0,5.085582733154297
-5.0,4.942212104797363
-5.0,5.107460021972656
-5.0,5.054518699645996
-5.0,5.9441423416137695
-6.3872161432802645,6.352518081665039
-5.0,5.003747940063477
-5.958607314841775,6.000339031219482
-5.0,4.931718349456787
-5.0,5.21005392074585
-5.0,6.069944381713867
-5.0,5.336822509765625
-5.0,4.7651166915893555
-6.508638306165727,5.39251708984375
-5.0,5.165271282196045
-5.0,5.200045585632324
-5.0,5.0459675788879395
-5.0,5.256990909576416
-5.0,4.9373979568481445
-5.7447274948966935,5.127891540527344
-6.327902142064283,5.184954643249512
-5.0,4.847654342651367
-5.0,5.027524948120117
-5.0,5.104108810424805
-6.136677139879544,6.008316516876221
-6.187086643357144,5.668183326721191
-5.0,5.147788047790527
-5.0,5.2322235107421875
-5.0,5.354198455810547
-5.0,5.327570915222168
-5.0,5.121330261230469
-5.0,5.063078880310059
-5.0,5.008854866027832
-5.0,5.98865270614624
-5.0,5.079410076141357
-5.0,5.005335807800293
-5.0,5.085379600524902
-5.0,5.967917442321777
-5.0,5.067115306854248
-6.036212172654444,6.003206253051758
-5.0,5.069398880004883
-5.0,5.195714950561523
-5.0,5.116494178771973
-7.795880017344075,7.01383638381958
-5.0,5.132066249847412
-5.0,5.035821914672852
-5.0,5.907358169555664
-5.0,5.084409713745117
-8.0268721464003,5.970152854919434
-5.886056647693163,5.923671245574951
-5.0,5.146362781524658
-5.0,5.711681842803955
-5.0,5.065497398376465
-5.0,5.029783248901367
-5.0,5.179046630859375
-5.0,5.650099754333496
-6.431798275933005,5.280778884887695
-5.0,5.136629104614258
-5.0,5.7257843017578125
-5.0,5.314552307128906
-5.0,6.166292190551758
-5.376750709602099,5.35509729385376
-5.167491087293763,5.750155925750732
-6.585026652029182,6.289925575256348
-5.0,5.29801607131958
-6.366531544420414,5.874327659606934
-5.0,5.141181468963623
-6.080921907623926,5.719197750091553
-5.0,5.345344543457031
-5.0,5.059579849243164
-5.795880017344075,5.706972122192383
-5.0,5.670386791229248
-5.0,4.878550052642822
-6.229147988357855,5.243846416473389
-7.886056647693163,5.8472795486450195
-5.0,4.984345436096191
-5.0,5.054057598114014
-6.42021640338319,5.071144104003906
-5.0,5.089015007019043
-5.0,4.939571380615234
-5.0,5.895547866821289
-5.0,5.231383323669434
-5.0,5.9382710456848145
-5.0,5.1555495262146
-5.0,5.335285663604736
-5.0,5.06434440612793
-7.275724130399211,6.017057418823242
-5.0,5.314289093017578
-5.0,4.933197975158691
-7.259637310505756,6.570931434631348
-5.0,5.290060997009277
-5.0,6.051436424255371
-7.508638306165727,5.861388206481934
-5.0,5.601394176483154
-5.0,5.257301330566406
-5.0,4.97573184967041
-5.0,5.070545673370361
-6.376750709602099,5.872655868530273
-5.0,5.039230823516846
-7.075720713938118,5.972027778625488
-5.0,4.897795677185059
-5.0,4.76895809173584
-5.0,5.631792068481445
-5.0,5.222566604614258
-7.795880017344075,5.398638725280762
-5.0,5.099506378173828
-5.0,5.140336990356445
-5.0,5.171553611755371
-5.0,5.50537109375
-5.0,5.112033843994141
-5.0,5.239709854125977
-6.086186147616283,5.675373077392578
-5.0,4.826381683349609
-5.886056647693163,5.738369941711426
-5.0,5.103188991546631
-5.0,5.102487087249756
-6.251811972993799,5.6591949462890625
-7.568636235841013,5.941123962402344
-6.236572006437063,5.825923919677734
-6.1249387366083,5.115701675415039
-5.0,5.005753517150879
-6.102372908709558,6.246509552001953
-5.0,5.83942985534668
-5.0,5.268750190734863
-5.221848749616356,5.097737789154053
-5.0,5.17658805847168
-5.0,4.99078369140625
-5.0,5.284359455108643
-5.3872161432802645,5.08957576751709
-5.0,5.11693000793457
-5.7447274948966935,5.477705001831055
-5.0,4.858384132385254
-5.0,5.142550468444824
-5.0,4.8358154296875
-5.0,5.441160202026367
-5.443697499232712,5.453722953796387
-5.0,5.357573509216309
-5.0,5.144262313842773
-7.200659450546418,5.116860866546631
-5.0,6.215811729431152
-5.0,6.276118278503418
-5.0,5.296074390411377
-8.537602002101044,6.132679462432861
-6.886056647693163,5.2070746421813965
-5.0,5.074911594390869
-5.0,5.5772223472595215
-5.0,5.275551795959473
-5.0,5.260644912719727
-5.0,5.4680495262146
-5.0,5.537995338439941
-7.795880017344075,5.95027494430542
-5.0,4.8663740158081055
-5.0,5.1143341064453125
-5.0,5.030080795288086
-5.0,5.68536376953125
-5.619788758288394,5.656157493591309
-5.0,4.97382926940918
-7.221848749616356,5.2630295753479
-5.0,5.161994934082031
-5.0,5.037347793579102
-5.958607314841775,5.380585670471191
-6.096910013008056,7.01383638381958
-5.0,5.57351016998291
-7.455931955649724,6.306081771850586
-5.6020599913279625,6.577685356140137
-7.721246399047171,6.310940742492676
-5.0,5.208520412445068
-5.443697499232712,6.570931434631348
-6.638272163982407,5.825923919677734
-8.075720713938118,6.257787227630615
-5.0,5.098692893981934
-5.0,4.943953037261963
-5.200659450546418,5.801288604736328
-5.0,5.325882434844971
-5.657577319177793,5.926325798034668
-5.0,5.259687423706055
-5.0,5.098049163818359
-5.0,5.317070960998535
-5.0,4.95228385925293
-5.0,5.039984703063965
-5.0,5.027309417724609
-5.0,5.105162620544434
-5.0,5.166486740112305
-6.251811972993799,6.383920192718506
-5.0,5.238554954528809
-5.0,5.1602888107299805
-5.259637310505756,5.542379856109619
-5.0,5.128211975097656
-5.0,5.11076545715332
-5.0,5.125316619873047
-9.167491087293763,6.6162872314453125
-6.823908740944319,6.704538345336914
-5.0,5.091875076293945
-5.0,5.412594318389893
-7.568636235841013,5.6474809646606445
-5.0,4.840211391448975
-5.657577319177793,5.7285308837890625
-6.958607314841775,6.45982551574707
-5.853871964321762,5.480402946472168
-5.0,4.845305919647217
-5.0,5.122851848602295
-5.920818753952375,5.6498637199401855
-6.657577319177793,7.010392189025879
-5.0,4.916254043579102
-5.0,5.767836093902588
-5.0,5.34040641784668
-5.0,5.25505256652832
-6.823908740944319,6.091305732727051
-6.107905397309519,5.265330791473389
-5.0,5.174365997314453
-5.0,5.146963119506836
-5.0,5.203784942626953
-6.853871964321762,5.158331871032715
-5.0,5.035920143127441
-5.0,4.847400665283203
-5.0,6.069944381713867
-5.0,4.777266979217529
-5.0,4.841005325317383
-5.0,5.72918176651001
-5.0,4.790530204772949
-8.55284196865778,6.580632209777832
-7.221848749616356,6.074103832244873
-5.0,5.294646739959717
-5.0,4.9412431716918945
-5.0,5.206007480621338
-5.481486060122113,5.061540603637695
-5.0,5.884346008300781
-5.0,5.298468589782715
-5.0,5.400884628295898
-7.376750709602099,6.884312629699707
-5.0,5.733511447906494
-5.0,4.968437194824219
-5.0,4.919164657592773
-5.0,5.296486854553223
-5.0,5.911825656890869
-5.0,5.106460094451904
-6.327902142064283,5.689182281494141
-5.0,5.156754493713379
-5.0,5.153713226318359
-7.366531544420414,6.348265647888184
-6.823908740944319,4.990891456604004
-5.0,5.201360702514648
-5.0,5.451536655426025
-5.0,4.907674789428711
-5.1249387366083,5.566045761108398
-5.0,5.200871467590332
-7.431798275933005,5.927453994750977
-5.0,4.8479905128479
-5.0,4.984513282775879
-5.0,5.220833778381348
-5.0,5.502265930175781
-5.0,5.50905704498291
-5.7447274948966935,5.519680976867676
-5.0,4.972838401794434
-5.356547323513812,4.9394097328186035
-5.0,4.915577411651611
-5.0,5.005415439605713
-5.0,4.787473201751709
-5.0,5.479450702667236
-8.275724130399212,6.6226806640625
-6.6777807052660805,6.063086986541748
-6.251811972993799,6.024188041687012
-5.0,4.964067459106445
-5.0,5.122323036193848
-5.0,5.2031779289245605
-5.0,4.835536003112793
-5.0,5.0320024490356445
-5.0,5.0218400955200195
-5.0,5.153533935546875
-5.0,5.176449775695801
-5.0,5.1891560554504395
-5.0,5.299984931945801
-7.119186407719209,7.507672309875488
-5.0,5.284343242645264
-5.0,5.158851146697998
-5.0,5.060532093048096
-5.0,5.137937545776367
-5.6777807052660805,5.702553749084473
-5.0,5.168368339538574
-5.0,5.25144100189209
-6.346787486224656,5.882380962371826
-6.481486060122113,5.133070945739746
-5.0,5.168749809265137
-5.0,5.01080846786499
-5.0,5.6332292556762695
-5.0,5.174461364746094
-5.0,5.178406715393066
-5.0,5.3109636306762695
-7.823908740944319,5.8806257247924805
-5.0,5.086490631103516
-5.638272163982407,5.3260931968688965
-5.0,5.368710517883301
-5.0,4.851520538330078
-5.0,5.362125396728516
-5.0,5.192352771759033
-5.468521082957745,5.839763641357422
-5.376750709602099,5.328600883483887
-6.031517051446065,5.0933518409729
-5.886056647693163,5.647361755371094
-5.0,5.122222900390625
-5.0,5.115117073059082
-5.0,5.1592607498168945
-5.920818753952375,5.266437530517578
-5.2839966563652006,5.248913764953613
-7.721246399047171,5.061558723449707
-5.0,5.423828125
-6.7447274948966935,6.716361045837402
-5.0,5.162948131561279
-5.0,5.091292381286621
-5.0,5.083808422088623
-5.0,5.6382646560668945
-8.508638306165727,6.132302284240723
-8.886056647693163,6.8166913986206055
-5.0,5.264803409576416
-5.0,5.135117053985596
-5.0,5.342402935028076
-5.0,5.045681476593018
-5.0,5.069754123687744
-8.886056647693163,6.366186618804932
-6.2839966563652006,5.20833683013916
-5.0,5.180560111999512
-5.795880017344075,5.457440376281738
-5.0,5.277270793914795
-5.0,4.998956203460693
-5.0,5.10333776473999
-6.6020599913279625,6.911126136779785
-5.0,5.457354545593262
-5.0,5.336845397949219
-7.657577319177793,7.672024726867676
-6.017728766960431,5.264810085296631
-6.086186147616283,5.968862056732178
-5.0,5.882948875427246
-5.0,5.110701084136963
-5.0,5.068387031555176
-5.0,5.175628662109375
-5.0,5.00732421875
-5.0,5.084347724914551
-5.0,5.242915153503418
-5.0,5.9378461837768555
-5.0,6.982866287231445
-6.327902142064283,7.035890579223633
-5.0,4.936737060546875
-5.0,5.651219367980957
-5.0,5.060980796813965
-5.769551078621726,5.695479393005371
-5.0,5.182758331298828
-5.0,5.132037162780762
-5.0,5.192315578460693
-5.0,4.896662712097168
-5.0,4.888282775878906
-5.0,5.431836128234863
-5.0,5.6571807861328125
-5.0,5.088990211486816
-5.0,4.930267333984375
-5.173925197299174,5.751497268676758
-8.318758762624412,5.789177417755127
-5.0,5.3173418045043945
-5.0,5.599140167236328
-5.0,5.079489707946777
-5.0,4.971954345703125
-5.0,5.105041980743408
-6.366531544420414,5.101592063903809
-5.0,5.611869812011719
-7.060480747381382,5.891292572021484
-5.0,5.080646514892578
-5.0,5.6736555099487305
-5.0,5.336208343505859
-5.0,5.26652717590332
-5.0,5.104479789733887
-5.0,5.723478317260742
-5.522878745280337,6.080280303955078
-6.309803919971486,6.114014625549316
-6.508638306165727,6.582401275634766
-6.455931955649724,5.489548683166504
-5.0,5.005613327026367
-5.0,5.167370796203613
-5.0,4.880470275878906
-5.508638306165727,5.302554130554199
-5.0,5.219719886779785
-5.356547323513812,5.720754623413086
-5.376750709602099,5.4886155128479
-5.0,5.351941108703613
-5.0,4.937067985534668
-10.244125144327509,6.433475971221924
-5.309803919971486,5.297577857971191
-5.0,5.176743030548096
-5.0,5.02462911605835
-5.0,5.694246768951416
-7.698970004336019,7.010984897613525
-5.0,4.9836835861206055
-5.0,5.119183540344238
-5.0,5.000309467315674
-5.0,5.354498863220215
-5.0,5.097986221313477
-5.0,5.125852584838867
-5.0,5.270114898681641
-5.638272163982407,5.6158127784729
-6.823908740944319,6.333222389221191
-5.7447274948966935,5.3647780418396
-5.0,5.325653076171875
-6.00436480540245,5.238890647888184
-5.0,4.9626665115356445
-5.0,4.853359699249268
-5.0,5.118577480316162
-5.0,5.240284442901611
-5.0,5.289942741394043
-5.0,5.088036060333252
-10.0,5.580023288726807
-6.42021640338319,5.792268753051758
-5.0,5.4488749504089355
-5.136677139879544,6.0819172859191895
-5.0,5.231499671936035
-5.698970004336019,6.021770000457764
-5.0,5.818310260772705
-6.795880017344075,5.520332336425781
-7.102372908709558,6.168784141540527
-6.698970004336019,5.996757507324219
-5.0,6.035660743713379
-7.552841968657781,6.532289028167725
-5.443697499232712,5.123176097869873
-5.0,5.221927642822266
-5.0,5.588973522186279
-5.795880017344075,5.142772197723389
-6.920818753952375,6.120882987976074
-5.0,5.177130699157715
-5.0,5.380862236022949
-5.0,4.998444557189941
-5.0,5.050379276275635
-5.301029995663981,6.108202934265137
-5.0,5.046897888183594
-5.1938200260161125,5.2523722648620605
-5.0,5.2812910079956055
-5.0,4.88677978515625
-5.0,5.070165157318115
-5.5376020021010435,5.193429946899414
-5.0,5.49241304397583
-5.022276394711152,6.280051231384277
-5.0,5.510637283325195
-7.769551078621726,6.055492401123047
-5.455931955649724,5.1902384757995605
-5.0,4.956918239593506
-5.0,5.000092029571533
-5.0,6.067366123199463
-5.0,5.633123397827148
-5.0,6.238078594207764
-5.0,4.849919319152832
-5.823908740944319,5.723908424377441
-7.42021640338319,5.871216297149658
-5.0,5.030050754547119
-5.107905397309519,5.438258171081543
-7.346787486224656,7.230086803436279
-5.958607314841775,7.013836860656738
-5.0,5.248174667358398
-5.0,5.183352470397949
-5.0,5.150734901428223
-5.0,5.235140323638916
-6.6020599913279625,5.6553544998168945
-5.0,5.301988124847412
-5.0,5.304476737976074
-5.0,5.623221397399902
-5.0,5.562075614929199
-5.221848749616356,6.106252670288086
-6.221848749616356,5.868464946746826
-5.619788758288394,5.72900390625
-5.0,4.956935882568359
-7.327902142064283,5.362081050872803
-5.187086643357144,5.456709861755371
-5.0,5.7761149406433105
-6.638272163982407,5.236672401428223
-5.0,5.148412227630615
-5.0,4.9362640380859375
-5.0,5.246590614318848
-5.0,5.382885932922363
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..de6eea7c775795bfa478753d176b2265f27c0476
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,23 @@
+torch_geometric==2.5.2
+transformers==4.38.0
+rdkit==2023.09.5
+sentencepiece==0.2.0
+selfies==2.1.2
+pandas==2.2.3
+lightning_utilities==0.11.9
+torchmetrics==1.5.2
+numpy==1.26.4
+absl-py==2.1.0
+easydict==1.13
+ratelimiter==1.2.0.post0
+openai==1.64.0
+uvicorn===0.32.1
+fastapi===0.115.5
+oss2==2.19.1
+dotenv==1.0.1
+protobuf==5.28.3
+scanpy==1.10.3
+qdrant-client>=1.7.0
+streamlit>=1.28.0
+plotly>=5.18.0
+scikit-learn>=1.3.0
diff --git a/runs/20260124_212915_DAVIS/test_markdowntable.txt b/runs/20260124_212915_DAVIS/test_markdowntable.txt
deleted file mode 100644
index e3738cf0333e3cd80e49daac66eab6e744061f0b..0000000000000000000000000000000000000000
--- a/runs/20260124_212915_DAVIS/test_markdowntable.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-+--------+---------------------+--------------+-------------------+
-| MSE | Pearson Correlation | with p-value | Concordance Index |
-+--------+---------------------+--------------+-------------------+
-| 0.4734 | 0.5386 | 0.0000 | 0.7885 |
-+--------+---------------------+--------------+-------------------+
\ No newline at end of file
diff --git a/runs/20260124_212915_DAVIS/valid_markdowntable.txt b/runs/20260124_212915_DAVIS/valid_markdowntable.txt
deleted file mode 100644
index a8ba554bd0b3dc2defd205af4b5f35f51bffce12..0000000000000000000000000000000000000000
--- a/runs/20260124_212915_DAVIS/valid_markdowntable.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-+---------+--------+---------------------+--------------+-------------------+
-| # epoch | MSE | Pearson Correlation | with p-value | Concordance Index |
-+---------+--------+---------------------+--------------+-------------------+
-| epoch 0 | 0.5978 | 0.4531 | 0.0000 | 0.7311 |
-| epoch 1 | 0.5074 | 0.5377 | 0.0000 | 0.7823 |
-| epoch 2 | 0.4985 | 0.5556 | 0.0000 | 0.7877 |
-| epoch 3 | 0.4908 | 0.5612 | 0.0000 | 0.7901 |
-| epoch 4 | 0.4868 | 0.5670 | 0.0000 | 0.7932 |
-| epoch 5 | 0.4889 | 0.5699 | 0.0000 | 0.7948 |
-| epoch 6 | 0.4791 | 0.5761 | 0.0000 | 0.7981 |
-| epoch 7 | 0.4769 | 0.5801 | 0.0000 | 0.8019 |
-| epoch 8 | 0.4714 | 0.5875 | 0.0000 | 0.8053 |
-| epoch 9 | 0.4764 | 0.5889 | 0.0000 | 0.8081 |
-+---------+--------+---------------------+--------------+-------------------+
\ No newline at end of file
diff --git a/runs/20260124_224109_KIBA/predictions_test.csv b/runs/20260124_224109_KIBA/predictions_test.csv
deleted file mode 100644
index 08437b8bf2f3b52c0a37f40057e1e2aa205a55c2..0000000000000000000000000000000000000000
--- a/runs/20260124_224109_KIBA/predictions_test.csv
+++ /dev/null
@@ -1,11767 +0,0 @@
-y_true,y_pred
-7.946921547407927,7.932218074798584
-7.946921547407927,7.954146385192871
-7.924453006674053,7.900312423706055
-7.950781972366453,7.9367475509643555
-7.9430951409681345,7.93069314956665
-7.9393021526221474,7.953742504119873
-7.9616219366397445,7.93306303024292
-7.882728704344236,7.894626140594482
-7.950781972366453,7.925267696380615
-7.928117974144348,7.913608074188232
-7.920818811243059,7.910808086395264
-7.935542022791058,7.948102951049805
-7.935542022791058,7.940457820892334
-7.950781972366453,7.957927227020264
-7.91721462968355,7.928230285644531
-7.913640203677234,7.927648067474365
-7.954677021213342,7.965569019317627
-7.924453006674053,7.928294658660889
-7.931814161156377,7.956510066986084
-7.89962956062971,7.926931381225586
-7.920818811243059,7.9147162437438965
-7.950781972366453,7.942707061767578
-7.950781972366453,7.939274311065674
-7.950781972366453,7.9506707191467285
-7.879527744657629,7.947937965393066
-7.889410352488291,7.938637733459473
-7.920818811243059,7.961490631103516
-7.954677021213342,7.952266216278076
-7.931814161156377,7.9304938316345215
-7.931814161156377,7.917392253875732
-7.950781972366453,7.922482967376709
-7.920818811243059,7.957272052764893
-7.924453006674053,7.93468713760376
-7.924453006674053,7.948428630828857
-7.924453006674053,7.9288225173950195
-7.954677021213342,7.917727947235107
-7.9393021526221474,7.916074752807617
-7.931814161156377,7.934874057769775
-7.924453006674053,7.921817302703857
-7.928117974144348,7.932576656341553
-7.9737577757544535,7.95188045501709
-7.8761493177145505,7.906239032745361
-7.9737577757544535,7.956270694732666
-7.928117974144348,7.9309773445129395
-7.946921547407927,7.937307834625244
-7.954677021213342,7.953810691833496
-7.950781972366453,7.919036865234375
-7.9913998274291025,7.9649858474731445
-7.928117974144348,7.939558506011963
-7.995678626217357,7.935093402862549
-7.920818811243059,7.930269718170166
-7.9430951409681345,7.918644428253174
-7.924453006674053,7.925937175750732
-7.931814161156377,7.922505855560303
-7.978810702253626,7.962743282318115
-7.89962956062971,7.92728328704834
-7.9393021526221474,7.911920070648193
-7.950781972366453,7.9627861976623535
-7.954677021213342,7.953721523284912
-7.950781972366453,7.960207462310791
-8.008819571765459,8.03095531463623
-7.9393021526221474,7.925484657287598
-7.896196359268842,7.926794528961182
-7.928117974144348,7.913241386413574
-7.950781972366453,7.975832939147949
-7.950781972366453,7.943875312805176
-7.924453006674053,7.933410167694092
-7.9737577757544535,7.948981285095215
-7.946921547407927,7.965430736541748
-7.9430951409681345,7.912204265594482
-7.896196359268842,7.930271148681641
-7.954677021213342,7.934022426605225
-7.9393021526221474,7.910609722137451
-7.9430951409681345,7.942115306854248
-7.889410352488291,7.906492710113525
-7.966576241738391,7.9270710945129395
-7.9430951409681345,7.945693492889404
-7.809726024550969,7.913854122161865
-7.946921547407927,7.938778400421143
-7.9393021526221474,7.934101104736328
-7.931814161156377,7.928801536560059
-7.889410352488291,7.945173263549805
-7.923581356476356,7.918636798858643
-7.946921547407927,7.941506862640381
-7.935542022791058,7.939118385314941
-7.9393021526221474,7.944537162780762
-7.95090181210265,7.929466724395752
-7.910094953104535,7.894185543060303
-7.924453006674053,7.949366092681885
-7.9430951409681345,7.919970989227295
-7.9737577757544535,7.951508045196533
-7.950781972366453,7.930184364318848
-7.978810702253626,7.930784702301025
-7.924453006674053,7.939912796020508
-7.935542022791058,7.953104496002197
-7.944083401933535,7.926260471343994
-7.950781972366453,7.954953193664551
-7.935542022791058,7.94064474105835
-7.950781972366453,7.94473934173584
-7.832673025823477,7.939361095428467
-7.950781972366453,7.9565253257751465
-7.950781972366453,7.935207366943359
-7.935542022791058,7.927318572998047
-7.924453006674053,7.909077167510986
-7.954677021213342,7.9692511558532715
-7.882728704344236,7.90742826461792
-7.920818811243059,7.925759792327881
-7.924453006674053,7.926876544952393
-7.954677021213342,7.950924396514893
-7.950781972366453,7.9667229652404785
-7.829768510087842,7.909403324127197
-7.935542022791058,7.957889080047607
-7.9430951409681345,7.934913158416748
-7.954677021213342,7.978199005126953
-7.950781972366453,7.934226036071777
-7.968365045565531,7.950148105621338
-7.946921547407927,7.938008785247803
-7.857937595672809,7.890322208404541
-7.946921547407927,7.92057466506958
-7.9393021526221474,7.938385486602783
-7.91721462968355,7.930212020874023
-7.950781972366453,7.919633388519287
-7.920818811243059,7.905455112457275
-7.982923651140671,7.920060157775879
-7.9393021526221474,7.928560733795166
-7.9393021526221474,7.906140327453613
-7.935542022791058,7.941574573516846
-7.954677021213342,7.9409499168396
-7.950781972366453,7.92184591293335
-7.889355338226999,7.970714569091797
-7.950781972366453,7.9650797843933105
-7.913640203677234,7.942265033721924
-7.950781972366453,7.964916706085205
-7.928936536236001,7.9110894203186035
-7.9393021526221474,7.920675754547119
-7.924453006674053,7.924276351928711
-7.9430951409681345,7.936442852020264
-7.950781972366453,7.961791038513184
-7.9737577757544535,7.938063144683838
-7.928117974144348,7.932016849517822
-7.950781972366453,7.939396381378174
-7.889410352488291,7.94730806350708
-7.9430951409681345,7.939559459686279
-7.950781972366453,7.921204090118408
-7.9335681432273475,7.908332347869873
-7.924453006674053,7.95734167098999
-7.970532618892763,7.963690280914307
-7.9393021526221474,7.910322189331055
-7.920818811243059,7.933207988739014
-7.924453006674053,7.935488224029541
-7.928117974144348,7.894452095031738
-7.903090094245322,7.9240803718566895
-7.950781972366453,7.932148456573486
-7.950781972366453,7.921646595001221
-7.950781972366453,7.915073871612549
-7.950781972366453,7.934550762176514
-7.860119116630385,7.939851760864258
-7.931814161156377,7.949714660644531
-7.9393021526221474,7.908389568328857
-7.89962956062971,7.909888744354248
-7.895765270234161,7.899459362030029
-7.9393021526221474,7.925829887390137
-7.954677021213342,7.936283111572266
-7.903090094245322,7.909369945526123
-7.928117974144348,7.922403812408447
-7.896196359268842,7.904938220977783
-7.935542022791058,7.926418304443359
-7.847706165863548,7.903109073638916
-7.954677021213342,7.943395614624023
-7.954677021213342,7.9710307121276855
-7.946921547407927,7.942424297332764
-7.8761493177145505,7.9318156242370605
-7.931814161156377,7.933987140655518
-7.931814161156377,7.932884693145752
-7.9430951409681345,7.937291145324707
-7.8761493177145505,7.9384446144104
-7.946921547407927,7.950075149536133
-7.91721462968355,7.934113502502441
-7.924453006674053,7.933073043823242
-7.954677021213342,7.925445079803467
-7.8728955601551585,7.92665958404541
-7.896822568967468,7.91250467300415
-7.9393021526221474,7.923977375030518
-7.910094953104535,7.952756404876709
-7.950781972366453,7.938605308532715
-7.946921547407927,7.935327053070068
-7.954677021213342,7.943334102630615
-7.946921547407927,7.946868896484375
-7.946921547407927,7.9457292556762695
-7.950781972366453,7.9566240310668945
-7.910094953104535,7.946224212646484
-7.910094953104535,7.918680191040039
-7.924453006674053,7.9427170753479
-7.9393021526221474,7.948800563812256
-7.9430951409681345,7.9310221672058105
-7.954677021213342,7.9391961097717285
-7.879425560900211,7.897300720214844
-7.935542022791058,7.957220077514648
-7.9393021526221474,7.942380428314209
-7.920818811243059,7.92722749710083
-7.950781972366453,7.931447505950928
-7.860119116630385,7.9047112464904785
-7.954677021213342,7.906580924987793
-7.9393021526221474,7.929720401763916
-7.9430951409681345,7.924509048461914
-7.950781972366453,7.955085754394531
-7.950781972366453,7.943638324737549
-7.950781972366453,7.936051368713379
-7.950781972366453,7.929957866668701
-7.896708615962599,7.937187194824219
-7.886056354845152,7.918321132659912
-7.9737577757544535,7.943812847137451
-7.9430951409681345,7.9437127113342285
-7.910094953104535,7.91654634475708
-7.903090094245322,7.945321559906006
-7.924453006674053,7.930606842041016
-7.910094953104535,7.93217134475708
-7.924453006674053,7.918032646179199
-7.954677021213342,7.961649417877197
-7.906578398789698,7.895632266998291
-7.924453006674053,7.941003322601318
-7.995678626217357,7.950240612030029
-7.924453006674053,7.940431594848633
-7.928117974144348,7.91243839263916
-7.928117974144348,7.925863265991211
-7.946921547407927,7.933858871459961
-7.954677021213342,7.951850891113281
-7.924453006674053,7.909487724304199
-7.920818811243059,7.905431747436523
-7.9393021526221474,7.934556484222412
-7.950781972366453,7.945284366607666
-7.946921547407927,7.950181484222412
-7.946921547407927,7.939047813415527
-7.946921547407927,7.94003438949585
-7.9430951409681345,7.954324722290039
-7.906578398789698,7.897691249847412
-7.970616219270671,7.944239139556885
-7.954677021213342,7.965336322784424
-7.910094953104535,7.939616680145264
-7.924453006674053,7.9271016120910645
-7.9393021526221474,7.912670135498047
-7.946921547407927,7.925287246704102
-7.9430951409681345,7.920719146728516
-7.920818811243059,7.933223724365234
-7.916637144431181,7.930052757263184
-7.928117974144348,7.916512489318848
-7.954677021213342,7.960174560546875
-7.954677021213342,7.904582500457764
-7.946921547407927,7.941210746765137
-7.863280055279963,7.924221992492676
-7.920818811243059,7.966715335845947
-7.9393021526221474,7.931575298309326
-7.928117974144348,7.916350841522217
-7.920818811243059,7.926329612731934
-7.9430951409681345,7.920717716217041
-7.920818811243059,7.919373035430908
-7.9430951409681345,7.9448747634887695
-7.85078088734462,7.895858287811279
-7.982923651140671,7.958015441894531
-7.954677021213342,7.9625043869018555
-7.954677021213342,7.949051380157471
-7.920818811243059,7.915622234344482
-7.882728704344236,7.917263507843018
-7.889410352488291,7.895493507385254
-7.954677021213342,7.945730686187744
-7.954677021213342,7.961135387420654
-7.9430951409681345,7.943922996520996
-7.931814161156377,7.958885192871094
-7.946921547407927,7.925678730010986
-7.928117974144348,7.934514045715332
-7.982923651140671,7.938833713531494
-7.844664854175832,7.918932914733887
-7.9393021526221474,7.9094367027282715
-7.9430951409681345,7.9572062492370605
-7.924453006674053,7.897963047027588
-7.906578398789698,7.902629375457764
-7.954677021213342,7.921873092651367
-7.935638432979158,7.96323823928833
-7.826774591089415,7.939833164215088
-7.946921547407927,7.9420695304870605
-7.9430951409681345,7.937542915344238
-7.892790308673911,7.926201820373535
-7.954677021213342,7.940145015716553
-7.920818811243059,7.931440830230713
-7.946921547407927,7.9180827140808105
-7.970616219270671,7.951902866363525
-7.913640203677234,7.941585063934326
-7.913640203677234,7.922282695770264
-7.950781972366453,7.952751636505127
-7.946921547407927,7.909524440765381
-7.950781972366453,7.941800594329834
-7.920818811243059,7.927067756652832
-7.946921547407927,7.966123580932617
-7.924453006674053,7.932699680328369
-7.946921547407927,7.944262504577637
-7.935542022791058,7.957367420196533
-7.946921547407927,7.928610324859619
-7.954677021213342,7.922099590301514
-7.931814161156377,7.941009044647217
-7.924453006674053,7.915736675262451
-7.924453006674053,7.940446853637695
-7.9393021526221474,7.940960884094238
-7.924453006674053,7.945310592651367
-7.96257349994767,7.9907307624816895
-7.950781972366453,7.9330830574035645
-7.9430951409681345,7.95036506652832
-7.954677021213342,7.947412490844727
-7.920818811243059,7.918269634246826
-7.889410352488291,7.921286106109619
-7.950781972366453,7.936625957489014
-7.924453006674053,7.924513816833496
-7.8728955601551585,7.9364495277404785
-7.9393021526221474,7.939764499664307
-7.9430951409681345,7.930263042449951
-7.946921547407927,7.936798095703125
-7.9430951409681345,7.932618618011475
-7.910094953104535,7.929439544677734
-7.982923651140671,7.93772554397583
-7.954677021213342,7.946532726287842
-7.982923651140671,7.972010135650635
-7.928117974144348,7.933962345123291
-7.954677021213342,7.928818225860596
-7.924453006674053,7.92942476272583
-7.860119116630385,7.911988735198975
-7.946921547407927,7.940714359283447
-7.928117974144348,7.925378322601318
-7.946921547407927,7.922359943389893
-7.9430951409681345,7.9632744789123535
-7.91721462968355,7.935440540313721
-7.946921547407927,7.953597068786621
-7.924453006674053,7.953573226928711
-7.920818811243059,7.934010028839111
-7.924453006674053,7.9222846031188965
-7.928117974144348,7.951725959777832
-7.9393021526221474,7.942732810974121
-7.924453006674053,7.933499813079834
-7.946921547407927,7.925624847412109
-7.924453006674053,7.9410400390625
-7.950781972366453,7.919403553009033
-7.974694136660875,7.939683437347412
-7.910094953104535,7.944432735443115
-7.854304717060746,7.910540580749512
-7.906578398789698,7.915935039520264
-7.950781972366453,7.953456401824951
-7.935542022791058,7.933523654937744
-7.9393021526221474,7.92098331451416
-7.954677021213342,7.962460041046143
-7.896196359268842,7.9248948097229
-7.946921547407927,7.941530704498291
-7.906578398789698,7.901152610778809
-7.924453006674053,7.953103065490723
-7.946921547407927,7.961178302764893
-7.950781972366453,7.936464309692383
-7.982966659490206,7.947539806365967
-7.892790308673911,7.904516696929932
-7.931814161156377,7.91511344909668
-7.924453006674053,7.921621322631836
-7.924453006674053,7.894520282745361
-7.844664854175832,7.910281658172607
-7.946921547407927,7.953681468963623
-7.910094953104535,7.92756462097168
-7.9430951409681345,7.947285175323486
-7.954677021213342,7.958134174346924
-7.995678626217357,7.952201843261719
-7.959562946911667,7.935921669006348
-7.950781972366453,7.949007511138916
-7.9958644827013945,8.001862525939941
-7.9393021526221474,7.939030647277832
-7.970532618892763,7.981855392456055
-7.928117974144348,7.922084808349609
-7.9393021526221474,7.938598155975342
-7.950781972366453,7.962278842926025
-7.950781972366453,7.941090106964111
-7.9430951409681345,7.904916286468506
-7.950781972366453,7.938724994659424
-7.928117974144348,7.9582085609436035
-7.920818811243059,7.9354681968688965
-7.950781972366453,7.965575218200684
-7.931814161156377,7.92960786819458
-7.9737577757544535,7.910457611083984
-7.954677021213342,7.942859172821045
-7.903090094245322,7.923309803009033
-7.91721462968355,7.908971309661865
-7.946921547407927,7.972283840179443
-7.928117974144348,7.9418044090271
-7.935542022791058,7.952329158782959
-7.954677021213342,7.964358806610107
-7.935542022791058,7.929066181182861
-7.935542022791058,7.938917636871338
-7.870077682537097,7.910092353820801
-7.970532618892763,7.926224708557129
-7.905110200811745,7.946710586547852
-7.920818811243059,7.918191432952881
-7.9393021526221474,7.95731782913208
-7.924453006674053,7.947623252868652
-7.931814161156377,7.9469146728515625
-7.946921547407927,7.922060489654541
-7.978940776011532,7.969882965087891
-7.954677021213342,7.954046726226807
-7.876350205074754,7.918826580047607
-7.954677021213342,7.948553085327148
-7.935542022791058,7.952122211456299
-7.9430951409681345,7.941802501678467
-7.939302143143198,7.914524078369141
-7.924453006674053,7.929929256439209
-7.920818811243059,7.935530185699463
-7.91721462968355,7.930902481079102
-7.920818811243059,7.950476169586182
-7.954677021213342,7.932878494262695
-7.946921547407927,7.934731960296631
-7.882728704344236,7.898674011230469
-7.946921547407927,7.9321746826171875
-7.931814161156377,7.929186820983887
-7.954677021213342,7.942784786224365
-7.954677021213342,7.950680732727051
-7.924453006674053,7.935696125030518
-7.910094953104535,7.937897205352783
-7.950781972366453,7.920070648193359
-7.869665979871627,7.902868747711182
-7.950781972366453,7.953752040863037
-7.926281689968135,7.949746608734131
-7.946921547407927,7.948624610900879
-7.946921547407927,7.948051452636719
-7.9430951409681345,7.95402717590332
-7.954677021213342,7.923190593719482
-7.847706165863548,7.889827251434326
-7.946921547407927,7.947828769683838
-7.950781972366453,7.947790622711182
-7.906578398789698,7.931325435638428
-7.846002795247612,7.922577381134033
-7.982923651140671,7.954326629638672
-7.928117974144348,7.932827472686768
-7.920818811243059,7.916038990020752
-7.924453006674053,7.951414585113525
-7.899571227272106,7.911928653717041
-7.950781972366453,7.961268424987793
-7.882728704344236,7.90356969833374
-7.954677021213342,7.951812744140625
-7.946921547407927,7.916756629943848
-7.907429380155008,7.925029754638672
-7.970616219270671,7.930628299713135
-7.928117974144348,7.933713436126709
-7.950781972366453,7.932322978973389
-7.946921547407927,7.968499660491943
-7.931814161156377,7.915747165679932
-7.928117974144348,7.920507431030273
-7.950781972366453,7.95758581161499
-7.931814161156377,7.91005277633667
-7.920818811243059,7.930240154266357
-7.835637836224461,7.908762454986572
-7.954677021213342,7.9012770652771
-7.9393021526221474,7.941573619842529
-7.892790308673911,7.902419567108154
-7.923581356476356,7.953729629516602
-7.882728704344236,7.894701957702637
-7.954677021213342,7.965390682220459
-7.975453335860696,7.959237575531006
-7.928117974144348,7.925130367279053
-7.950781972366453,7.94832181930542
-7.913640203677234,7.959794521331787
-7.920818811243059,7.9218621253967285
-7.882728704344236,7.923648834228516
-7.924453006674053,7.895077228546143
-7.928886632693791,7.900890827178955
-7.950781972366453,7.933607578277588
-7.9913998274291025,7.976412296295166
-7.946921547407927,7.952371597290039
-7.928117974144348,7.911158084869385
-7.9430951409681345,7.95669412612915
-7.950781972366453,7.950218200683594
-7.928117974144348,7.935470104217529
-7.82330639418584,7.90757417678833
-7.9430951409681345,7.922950744628906
-7.9393021526221474,7.943213939666748
-7.9393021526221474,7.94671106338501
-7.950781972366453,7.929665565490723
-7.924453006674053,7.924911975860596
-7.869665979871627,7.935734272003174
-7.931814161156377,7.91090726852417
-7.950781972366453,7.948555946350098
-7.8416326138557455,7.892560958862305
-7.924453006674053,7.903802394866943
-7.924453006674053,7.929961681365967
-7.89962956062971,7.920835971832275
-7.9430951409681345,7.929680347442627
-7.954677021213342,7.952643871307373
-7.886056354845152,7.894261360168457
-7.946921547407927,7.926817893981934
-7.950781972366453,7.965420246124268
-7.91721462968355,7.91947078704834
-7.889410352488291,7.914794445037842
-7.931814161156377,7.923476696014404
-7.924453006674053,7.928552627563477
-7.950781972366453,7.946238994598389
-7.935542022791058,7.933495044708252
-7.924453006674053,7.912782192230225
-7.954677021213342,7.970150470733643
-7.946921547407927,7.948421955108643
-7.878981826112309,7.923695087432861
-7.946921547407927,7.927310466766357
-7.931814161156377,7.916578769683838
-7.950781972366453,7.982685089111328
-7.879425560900211,7.913712024688721
-7.9393021526221474,7.923628330230713
-7.869665979871627,7.901593208312988
-7.920818811243059,7.910804271697998
-7.950781972366453,7.941103458404541
-7.85078088734462,7.915943145751953
-7.950781972366453,7.93446159362793
-7.950781972366453,7.9463372230529785
-7.954677021213342,7.9490861892700195
-7.924453006674053,7.930691719055176
-7.950781972366453,7.975606918334961
-7.863280055279963,7.926427364349365
-7.924453006674053,7.934042453765869
-7.913640203677234,7.941465377807617
-7.896196359268842,7.896986961364746
-7.954677021213342,7.940321922302246
-7.950781972366453,7.953841686248779
-7.954677021213342,7.961706161499023
-7.995678626217357,7.951206207275391
-7.948658283730227,7.950901031494141
-7.954677021213342,7.983963489532471
-7.9393021526221474,7.94479513168335
-7.931814161156377,7.939947128295898
-7.950781972366453,7.947672367095947
-7.950781972366453,7.9367852210998535
-7.935734864536909,7.89945125579834
-7.913640203677234,7.940194606781006
-7.9393021526221474,7.917819023132324
-7.903090094245322,7.92933988571167
-7.910094953104535,7.938991069793701
-7.946921547407927,7.914400577545166
-7.879705324991467,7.911117076873779
-7.946921547407927,7.951447010040283
-7.924453006674053,7.8966546058654785
-7.946921547407927,7.930490493774414
-7.950781972366453,7.934044361114502
-7.928117974144348,7.952454566955566
-7.954677021213342,7.940547943115234
-7.931814161156377,7.925558567047119
-7.954677021213342,7.962759017944336
-7.950781972366453,7.939383029937744
-7.954677021213342,7.9302849769592285
-7.954677021213342,7.948291778564453
-7.927336730250859,7.9247660636901855
-7.931814161156377,7.926929473876953
-7.9393021526221474,7.901813983917236
-7.924453006674053,7.919016361236572
-7.889410352488291,7.96060037612915
-7.892790308673911,7.934418678283691
-7.935542022791058,7.9564433097839355
-7.924453006674053,7.950943470001221
-7.9393021526221474,7.933653354644775
-7.950781972366453,7.954524040222168
-7.931471237773835,7.8979268074035645
-7.954677021213342,7.965177059173584
-7.950781972366453,7.9466776847839355
-7.8761493177145505,7.909135341644287
-7.970532618892763,7.9757399559021
-7.920818811243059,7.938124179840088
-7.950781972366453,7.944488525390625
-7.924453006674053,7.8850178718566895
-7.935542022791058,7.892155647277832
-7.886056354845152,7.96144437789917
-7.85078088734462,7.942600727081299
-7.920818811243059,7.908533096313477
-7.9393021526221474,7.921963214874268
-7.950781972366453,7.9297380447387695
-7.931814161156377,7.919952869415283
-7.995678626217357,7.962360382080078
-7.935542022791058,7.925736904144287
-7.924453006674053,7.930690288543701
-7.954677021213342,7.9629292488098145
-7.950781972366453,7.946306228637695
-7.9393021526221474,7.936185359954834
-7.920818811243059,7.924513339996338
-7.928117974144348,7.934200763702393
-7.950781972366453,7.953268527984619
-7.9393021526221474,7.934911251068115
-7.946921547407927,7.93111515045166
-7.950781972366453,7.955506324768066
-7.913640203677234,7.96381139755249
-7.935542022791058,7.9539475440979
-7.903090094245322,7.937532901763916
-7.950781972366453,7.940251350402832
-7.9393021526221474,7.943593502044678
-7.990339285400088,7.9583587646484375
-7.89962956062971,7.931665897369385
-7.924453006674053,7.938279628753662
-7.906578398789698,7.946788787841797
-7.931814161156377,7.947739124298096
-7.9098263336041486,7.917877197265625
-7.954677021213342,7.915578365325928
-7.954677021213342,7.97054386138916
-7.924453006674053,7.943166255950928
-7.954677021213342,7.97704553604126
-7.9430951409681345,7.940261363983154
-7.995678626217357,7.973989009857178
-7.950781972366453,7.927751064300537
-7.950781972366453,7.916487216949463
-7.928117974144348,7.915577411651611
-7.920818811243059,7.929446697235107
-7.9430951409681345,7.941356658935547
-7.913640203677234,7.938666820526123
-7.9393021526221474,7.9422407150268555
-7.920818811243059,7.930896282196045
-7.924453006674053,7.917547225952148
-7.982966659490206,7.974221706390381
-7.9393021526221474,7.92902946472168
-7.950781972366453,7.9416632652282715
-7.942204849789735,7.9558634757995605
-7.946921547407927,7.9315924644470215
-7.913640203677234,7.931272029876709
-7.866459873882536,7.899978160858154
-7.954677021213342,7.939280986785889
-7.950781972366453,7.9564714431762695
-7.924453006674053,7.917745113372803
-7.928117974144348,7.907845973968506
-7.973579366316557,7.9635233879089355
-7.866459873882536,7.934998512268066
-7.880728245831804,7.934875965118408
-7.928117974144348,7.938032627105713
-7.9430951409681345,7.942286491394043
-7.9393021526221474,7.9394402503967285
-7.954677021213342,7.9514055252075195
-7.924453006674053,7.935638904571533
-7.950781972366453,7.934638500213623
-7.903090094245322,7.9008402824401855
-7.954677021213342,7.952296733856201
-7.946921547407927,7.953841209411621
-7.863280055279963,7.932125568389893
-7.928117974144348,7.936468124389648
-7.9393021526221474,7.9269118309021
-7.932879511732186,7.8772873878479
-7.903090094245322,7.912975788116455
-7.950781972366453,7.948207378387451
-7.946921547407927,7.947916507720947
-7.995678626217357,7.971816539764404
-7.924453006674053,7.941254615783691
-7.910094953104535,7.936164855957031
-7.924453006674053,7.937073230743408
-7.91721462968355,7.948545932769775
-7.879425560900211,7.948271751403809
-7.924453006674053,7.916271686553955
-7.946358101683472,7.946336269378662
-7.946921547407927,7.926148414611816
-7.924453006674053,7.941306114196777
-7.9430951409681345,7.925832748413086
-7.935542022791058,7.921700477600098
-7.950781972366453,7.934092998504639
-7.950781972366453,7.94940710067749
-7.935542022791058,7.922854423522949
-7.866459873882536,7.8922438621521
-7.920818811243059,7.935641765594482
-7.920818811243059,7.945094585418701
-7.838693701646425,7.919096946716309
-7.928117974144348,7.900506973266602
-7.950781972366453,7.9557108879089355
-7.9393021526221474,7.918308258056641
-7.8728955601551585,7.938394069671631
-7.913199594653918,7.919158458709717
-7.954677021213342,7.953268051147461
-7.970616219270671,7.957295894622803
-7.9430951409681345,7.929265022277832
-7.912248836964282,7.914160251617432
-7.920818811243059,7.929884433746338
-7.954677021213342,7.939817428588867
-7.920818811243059,7.91384220123291
-7.954677021213342,7.930520534515381
-7.891097042468006,7.9313225746154785
-7.964781356411861,7.923960208892822
-7.928117974144348,7.941432952880859
-7.950781972366453,7.946587085723877
-7.950781972366453,7.9009175300598145
-7.8657311089458215,7.905442237854004
-7.950781972366453,7.948840618133545
-7.924453006674053,7.928104877471924
-7.870906197873508,7.946917533874512
-7.903090094245322,7.902730464935303
-7.913640203677234,7.925089359283447
-7.946921547407927,7.9318718910217285
-7.946921547407927,7.932765007019043
-7.91721462968355,7.9529571533203125
-7.931814161156377,7.9450578689575195
-7.950781972366453,7.950929164886475
-7.970532618892763,7.950259685516357
-7.931814161156377,7.9178466796875
-7.931814161156377,7.904401779174805
-7.9393021526221474,7.885369777679443
-7.9393021526221474,7.92577600479126
-7.924453006674053,7.93521785736084
-7.96981377267859,7.969764232635498
-7.906578398789698,7.896634578704834
-7.946921547407927,7.9364237785339355
-7.9393021526221474,7.938009262084961
-7.928117974144348,7.958278179168701
-7.935542022791058,7.923306465148926
-7.924453006674053,7.927468299865723
-7.9430951409681345,7.934380054473877
-7.935542022791058,7.934614658355713
-7.942518200864486,7.904172420501709
-7.924453006674053,7.929810523986816
-7.931814161156377,7.943860054016113
-7.931814161156377,7.948121547698975
-7.910094953104535,7.931001663208008
-7.928117974144348,7.926758766174316
-7.869732506393041,7.89915132522583
-7.924453006674053,7.919205188751221
-7.872861820710693,7.90568208694458
-7.866459873882536,7.921924114227295
-7.954677021213342,7.9442877769470215
-7.935542022791058,7.910951137542725
-7.924453006674053,7.926555156707764
-7.946921547407927,7.9659624099731445
-7.946921547407927,7.9446539878845215
-7.950781972366453,7.954885482788086
-7.932370292702363,7.94757604598999
-7.950781972366453,7.929831027984619
-7.946921547407927,7.942739963531494
-7.954677021213342,7.930746555328369
-7.8761493177145505,7.941959381103516
-7.85078088734462,7.881357669830322
-7.931814161156377,7.9458842277526855
-7.954677021213342,7.967895030975342
-7.943055911701025,7.928493976593018
-7.966576241738391,7.9768595695495605
-7.84475186285368,7.901804447174072
-7.931814161156377,7.9345879554748535
-7.950781972366453,7.9545416831970215
-7.920818811243059,7.961757183074951
-7.935542022791058,7.942101955413818
-7.950781972366453,7.953068256378174
-7.91721462968355,7.925952434539795
-7.954677021213342,7.926987171173096
-7.924453006674053,7.9422407150268555
-7.924453006674053,7.913422107696533
-7.924453006674053,7.947299480438232
-7.946921547407927,7.9474101066589355
-7.9393021526221474,7.941190242767334
-7.964781356411861,7.907009124755859
-7.928117974144348,7.929627895355225
-7.950781972366453,7.938201904296875
-7.946921547407927,7.951096534729004
-7.954677021213342,7.945333957672119
-7.931814161156377,7.94905424118042
-7.924453006674053,7.9344964027404785
-7.928117974144348,7.938615322113037
-7.928117974144348,7.936689376831055
-7.950781972366453,7.948098659515381
-7.950781972366453,7.968328475952148
-7.954677021213342,7.938610076904297
-7.9430951409681345,7.946815013885498
-7.903090094245322,7.922512054443359
-7.91721462968355,7.9360270500183105
-7.882728704344236,7.9307541847229
-7.920818811243059,7.92806339263916
-7.950781972366453,7.955517292022705
-7.958607309235428,7.949368000030518
-7.954677021213342,7.969656944274902
-7.928117974144348,7.942328929901123
-7.9430951409681345,7.934857368469238
-7.910094953104535,7.946802139282227
-7.9393021526221474,7.919328689575195
-7.903090094245322,7.944086074829102
-7.91721462968355,7.931407451629639
-7.945802750156343,7.937323570251465
-7.903090094245322,7.947732448577881
-7.8728955601551585,7.909963607788086
-7.954677021213342,7.980679035186768
-7.910094953104535,7.931190013885498
-7.928117974144348,7.935266494750977
-7.954677021213342,7.9516730308532715
-7.954677021213342,7.948475360870361
-7.950781972366453,7.945797920227051
-7.995678626217357,7.958573341369629
-7.9393021526221474,7.936716556549072
-7.922491400135772,7.940379619598389
-7.950781972366453,7.965540409088135
-7.920818811243059,7.935414791107178
-7.935542022791058,7.952629566192627
-7.924453006674053,7.94130277633667
-7.928117974144348,7.939535140991211
-7.911690158781656,7.901269912719727
-7.931814161156377,7.928041934967041
-7.931814161156377,7.923781871795654
-7.954677021213342,7.932456970214844
-7.946921547407927,7.928951740264893
-7.954677021213342,7.9838547706604
-7.946921547407927,7.9283552169799805
-7.954677021213342,7.952488422393799
-7.935542022791058,7.938939571380615
-7.9430951409681345,7.93583345413208
-7.931814161156377,7.922708511352539
-7.946921547407927,7.919456958770752
-7.96257349994767,7.967162609100342
-7.910094953104535,7.900771141052246
-7.954677021213342,7.93088960647583
-7.9393021526221474,7.912589073181152
-7.9737577757544535,7.971691131591797
-7.95942036130495,7.980774402618408
-7.856986114171083,7.918559551239014
-7.954677021213342,7.929165363311768
-7.882728704344236,7.9040069580078125
-7.924453006674053,7.917591571807861
-7.950781972366453,7.941639423370361
-7.9430951409681345,7.931568622589111
-7.9430951409681345,7.960063934326172
-7.950781972366453,7.939995765686035
-7.91721462968355,7.964748859405518
-7.809726024550969,7.9461493492126465
-7.920818811243059,7.942151069641113
-7.924453006674053,7.932824611663818
-7.9430951409681345,7.9443840980529785
-7.9393021526221474,7.923959732055664
-7.950781972366453,7.925722122192383
-7.832621809466494,7.966348171234131
-7.9393021526221474,7.945437908172607
-7.954677021213342,7.940402507781982
-7.9430951409681345,7.971512317657471
-7.935542022791058,7.940711498260498
-7.970532618892763,7.96047830581665
-7.928117974144348,7.916878700256348
-7.928117974144348,7.929774761199951
-7.954677021213342,7.960374355316162
-7.9737577757544535,7.954320907592773
-7.931814161156377,7.914416790008545
-7.946921547407927,7.914928913116455
-7.856238831797546,7.9500203132629395
-7.928117974144348,7.94810676574707
-7.931814161156377,7.962015628814697
-7.924453006674053,7.930960655212402
-7.935542022791058,7.923211574554443
-7.9430951409681345,7.923006534576416
-7.946921547407927,7.931816577911377
-7.880892069031858,7.907209873199463
-7.954677021213342,7.957741737365723
-7.954677021213342,7.964995861053467
-7.931814161156377,7.932608604431152
-7.928117974144348,7.94609260559082
-7.920818811243059,7.912968158721924
-7.956299563220691,7.939309597015381
-7.950781972366453,7.936391830444336
-7.9393021526221474,7.907468318939209
-7.9393021526221474,7.945121765136719
-7.954677021213342,7.966444969177246
-7.946921547407927,7.944539546966553
-7.928117974144348,7.920619964599609
-8.004782412028186,7.960404872894287
-7.879425560900211,7.9627461433410645
-7.924453006674053,7.903892993927002
-7.958607309235428,7.9511494636535645
-7.935542022791058,7.949952125549316
-7.935542022791058,7.941895961761475
-7.920818811243059,7.9278082847595215
-7.9393021526221474,7.926133632659912
-7.950781972366453,7.9457573890686035
-7.924453006674053,7.9241042137146
-7.918270557990233,7.930551528930664
-7.954677021213342,7.936798095703125
-7.903090094245322,7.935481548309326
-7.946921547407927,7.952733039855957
-7.946921547407927,7.936899185180664
-7.950781972366453,7.937046527862549
-7.896196359268842,7.912674903869629
-7.950781972366453,7.929621696472168
-7.9393021526221474,7.925041675567627
-7.931814161156377,7.932158946990967
-7.954677021213342,7.946394443511963
-7.950781972366453,7.943747520446777
-7.9393021526221474,7.919919490814209
-7.889410352488291,7.921313762664795
-7.924453006674053,7.945300579071045
-7.96981377267859,7.986032962799072
-7.910094953104535,7.893600940704346
-7.863280055279963,7.96035623550415
-7.946921547407927,7.94235372543335
-7.931814161156377,7.931178569793701
-7.954677021213342,7.903834819793701
-7.935542022791058,7.9391303062438965
-7.931814161156377,7.921725749969482
-7.950781972366453,7.934463024139404
-7.946921547407927,7.9431257247924805
-7.928117974144348,7.922343730926514
-7.928117974144348,7.908675193786621
-7.931814161156377,7.95663595199585
-7.860119116630385,7.898351669311523
-7.924453006674053,7.930272102355957
-7.856986114171083,7.89075231552124
-7.928117974144348,7.916276931762695
-7.954677021213342,7.949098110198975
-7.928117987946079,7.948665142059326
-7.9430951409681345,7.950713634490967
-7.939379961634402,7.932722568511963
-7.995678626217357,7.9902262687683105
-7.928117974144348,7.914116382598877
-7.954677021213342,7.925685882568359
-7.903090094245322,7.903458118438721
-7.946921547407927,7.932984828948975
-7.931814161156377,7.946150302886963
-7.86826275483874,7.917306423187256
-7.935542022791058,7.9295334815979
-7.8728955601551585,7.927090167999268
-7.879425560900211,7.900650501251221
-7.906578398789698,7.907086372375488
-7.892790308673911,7.92885160446167
-7.954677021213342,7.96113920211792
-7.946921547407927,7.910292148590088
-7.928117974144348,7.945367336273193
-7.924453006674053,7.901700973510742
-7.809102227538298,7.977198123931885
-7.847706165863548,7.8870158195495605
-7.9430951409681345,7.954585552215576
-7.928117974144348,7.919312000274658
-7.931814161156377,7.935673236846924
-7.970532618892763,7.939886569976807
-7.892790308673911,7.933691501617432
-7.9737577757544535,7.932661533355713
-7.9430951409681345,7.948551177978516
-7.9393021526221474,7.920520782470703
-7.924453006674053,7.924884796142578
-7.950781972366453,7.952180862426758
-7.903090094245322,7.93041467666626
-7.954677021213342,7.981475353240967
-7.9393021526221474,7.936182498931885
-7.869665979871627,7.914584159851074
-7.920818811243059,7.948751926422119
-7.954677021213342,7.9452009201049805
-7.9393021526221474,7.9460577964782715
-7.924453006674053,7.951291561126709
-7.924453006674053,7.930325508117676
-7.935542022791058,7.950668811798096
-7.950781972366453,7.942928791046143
-7.946921547407927,7.932555675506592
-7.982923651140671,7.904205799102783
-7.950781972366453,7.955596446990967
-7.9430951409681345,7.939951419830322
-7.928117974144348,7.922006130218506
-7.892790308673911,7.960049629211426
-7.954677021213342,7.960157871246338
-7.9430951409681345,7.960519313812256
-7.9430951409681345,7.940169811248779
-7.950781972366453,7.948915004730225
-7.9430951409681345,7.929454326629639
-7.935542022791058,7.939090251922607
-7.924453006674053,7.936773777008057
-7.889410352488291,7.917922496795654
-7.910094953104535,7.953322887420654
-7.886522706972261,7.940409183502197
-7.950781972366453,7.921572208404541
-7.954677021213342,7.8817009925842285
-7.920818811243059,7.902525901794434
-7.935542022791058,7.940040111541748
-7.9430951409681345,7.9129319190979
-7.920818811243059,7.9459123611450195
-7.935542022791058,7.953090190887451
-7.926474926395767,7.908881187438965
-7.946921547407927,7.9291205406188965
-7.928117974144348,7.8983283042907715
-7.935542022791058,7.928238868713379
-7.950781972366453,7.941354751586914
-7.913640203677234,7.924948692321777
-7.9367221576035965,7.941939830780029
-7.910094953104535,7.938364505767822
-7.924453006674053,7.914268493652344
-7.9430951409681345,7.930919647216797
-7.928117974144348,7.924025058746338
-7.856986114171083,7.926065921783447
-7.970532618892763,7.967466354370117
-7.954677021213342,7.953909397125244
-7.954677021213342,7.959568023681641
-7.950781972366453,7.9391255378723145
-7.8416326138557455,7.922825813293457
-7.954677021213342,7.961842060089111
-7.950781972366453,7.965764045715332
-7.924453006674053,7.908581256866455
-7.920818811243059,7.9369025230407715
-7.924453006674053,7.912642955780029
-7.9761711944251115,7.95122766494751
-7.896196359268842,7.922128200531006
-7.9430951409681345,7.953147888183594
-7.954677021213342,7.9172163009643555
-7.9913998274291025,7.950857639312744
-7.913640203677234,7.9172492027282715
-7.938235141062872,7.942220687866211
-7.950781972366453,7.938321590423584
-7.924453006674053,7.900173664093018
-7.935542022791058,7.92443323135376
-7.932396638893121,7.95212459564209
-7.9430951409681345,7.939792633056641
-7.928117974144348,7.918395042419434
-7.950781972366453,7.959636211395264
-7.935542022791058,7.9488420486450195
-7.950781972366453,7.93728494644165
-7.958607309235428,7.952527046203613
-7.924453006674053,7.914705753326416
-7.924453006674053,7.9188923835754395
-7.954677021213342,7.938260555267334
-7.931814161156377,7.935634136199951
-7.9393021526221474,7.914860725402832
-7.9393021526221474,7.951576232910156
-7.840545291482477,7.9366559982299805
-7.906578398789698,7.922669887542725
-7.888606117307137,7.885006427764893
-7.946082651207223,7.933660984039307
-7.957786139863943,7.956076622009277
-7.835637836224461,7.894050121307373
-7.950781972366453,7.957743167877197
-7.954677021213342,7.940850257873535
-7.950781972366453,7.93887996673584
-7.9393021526221474,7.949963092803955
-7.903090094245322,7.947469711303711
-7.950781972366453,7.932478427886963
-7.9430951409681345,7.954299449920654
-7.924453006674053,7.910274028778076
-7.931814161156377,7.930550575256348
-7.9430951409681345,7.960007190704346
-7.954677021213342,7.97055196762085
-7.866459873882536,7.915633678436279
-7.935542022791058,7.93108606338501
-7.903090094245322,7.942915439605713
-7.9430951409681345,7.938109397888184
-7.924016962894687,7.941804885864258
-7.856986114171083,7.928057670593262
-7.928117974144348,7.936180591583252
-7.935542022791058,7.929274082183838
-7.9430951409681345,7.955714702606201
-7.95344564411266,7.967957019805908
-7.954677021213342,7.933743476867676
-7.954677021213342,7.9250874519348145
-7.946921547407927,7.945617198944092
-7.89962956062971,7.929408073425293
-7.954677021213342,7.949244976043701
-7.856986114171083,7.906153202056885
-7.995678626217357,7.935558795928955
-7.920818811243059,7.965676307678223
-7.882728704344236,7.940757751464844
-7.9393021526221474,7.930820465087891
-7.935542022791058,7.930477142333984
-7.928117974144348,7.925931930541992
-7.892790308673911,7.902164936065674
-7.924453006674053,7.903872966766357
-7.954677021213342,7.9506049156188965
-7.924453006674053,7.9539666175842285
-7.9430951409681345,7.943119525909424
-7.928117974144348,7.944206714630127
-7.882728704344236,7.915504455566406
-7.9430951409681345,7.9161224365234375
-7.928117974144348,7.944382667541504
-7.954677021213342,7.959123611450195
-7.946921547407927,7.931125164031982
-7.935542022791058,7.942965507507324
-7.8323865723801545,7.9261345863342285
-7.950781972366453,7.9285502433776855
-7.935542022791058,7.934616565704346
-7.924453006674053,7.915574073791504
-7.9430951409681345,7.9148268699646
-7.935542022791058,7.945343494415283
-7.924453006674053,7.904336452484131
-7.946921547407927,7.945521831512451
-7.954677021213342,7.9316582679748535
-7.935542022791058,7.927087306976318
-7.950781972366453,7.950165748596191
-7.954677021213342,7.927295207977295
-7.920818811243059,7.929739952087402
-7.954677021213342,7.953427314758301
-7.931814161156377,7.9030961990356445
-7.860119116630385,7.908341407775879
-7.950781972366453,7.906706809997559
-7.931814161156377,7.909806251525879
-7.913640203677234,7.937063694000244
-7.9430951409681345,7.960771083831787
-7.920818811243059,7.905807971954346
-7.928117974144348,7.95011568069458
-7.950781972366453,7.951930522918701
-7.85078088734462,7.903014659881592
-7.950781972366453,7.943337917327881
-7.931814161156377,7.922553062438965
-7.863280055279963,7.913291931152344
-7.924453006674053,7.920856952667236
-7.946921547407927,7.966245174407959
-7.946921547407927,7.932965278625488
-7.954677021213342,7.940986633300781
-7.928117974144348,7.932475566864014
-7.950781972366453,7.939602375030518
-7.950781972366453,7.943741321563721
-7.91721462968355,7.923927307128906
-7.928117974144348,7.924062252044678
-7.954677021213342,7.963071346282959
-7.9430951409681345,7.92520809173584
-7.93468629292431,7.964553356170654
-7.901192931071858,7.953081130981445
-7.954677021213342,7.961236476898193
-7.924453006674053,7.960107326507568
-7.950781972366453,7.932681560516357
-7.950781972366453,7.951816082000732
-7.931814161156377,7.91017484664917
-7.931814161156377,7.924508094787598
-7.920818811243059,7.9025444984436035
-7.9430951409681345,7.952484607696533
-7.935542022791058,7.92345666885376
-7.928117974144348,7.935155868530273
-7.954677021213342,7.94592809677124
-7.920818811243059,7.92966890335083
-7.9430951409681345,7.919630527496338
-7.931814161156377,7.920849800109863
-7.987162773987728,7.948526382446289
-7.94094624659741,7.966449737548828
-7.913640203677234,7.9028801918029785
-7.950781972366453,7.937593460083008
-7.946921547407927,7.938169479370117
-7.950781972366453,7.955218315124512
-7.863280055279963,7.9336256980896
-7.910094953104535,7.895320892333984
-7.9393021526221474,7.902245998382568
-7.950781972366453,7.95548677444458
-7.946921547407927,7.936004638671875
-7.954677021213342,7.9607720375061035
-7.931814161156377,7.923940181732178
-7.9430951409681345,7.936233043670654
-7.931814161156377,7.924249649047852
-7.913640203677234,7.918529033660889
-7.916637144431181,7.9231696128845215
-7.924453006674053,7.91115665435791
-7.903090094245322,7.942253112792969
-7.913640203677234,7.910343647003174
-7.9430951409681345,7.95566987991333
-7.950781972366453,7.928660869598389
-7.895460094525281,7.933557033538818
-7.924453006674053,7.955591678619385
-7.950781972366453,7.954430103302002
-7.931814161156377,7.937683582305908
-7.950781972366453,7.948441982269287
-7.943055911701025,7.928183078765869
-7.924453006674053,7.924675464630127
-7.829768510087842,7.894603729248047
-7.9913998274291025,7.969046115875244
-7.946921547407927,7.952569484710693
-7.954677021213342,7.953093528747559
-7.954677021213342,7.9643635749816895
-7.913640203677234,7.907924175262451
-7.982923651140671,7.9678826332092285
-7.950781972366453,7.946384429931641
-7.903090094245322,7.947985649108887
-7.946921547407927,7.934914588928223
-8.004545578968134,7.968636512756348
-7.950781972366453,7.9349260330200195
-7.9430951409681345,7.933894634246826
-7.913640203677234,7.937071323394775
-7.924453006674053,7.9013142585754395
-7.9393021526221474,7.918375492095947
-7.856986114171083,7.910801887512207
-7.935542022791058,7.935896873474121
-7.931814161156377,7.909460067749023
-7.950781972366453,7.9148850440979
-7.954677021213342,7.934906005859375
-7.906578398789698,7.933913230895996
-7.9393021526221474,7.909262657165527
-7.954677021213342,7.943109035491943
-7.9393021526221474,7.93450403213501
-7.924453006674053,7.9394450187683105
-7.931814161156377,7.914634704589844
-7.924453006674053,7.956939220428467
-7.935542022791058,7.958990097045898
-7.931814161156377,7.963754653930664
-7.946921547407927,7.930527687072754
-7.913640203677234,7.918123722076416
-7.950781972366453,7.918838024139404
-7.903090094245322,7.921993732452393
-7.920818811243059,7.909421920776367
-7.823919469453418,7.918407917022705
-7.946921547407927,7.927363872528076
-7.871381458691152,7.9509687423706055
-7.946921547407927,7.913998603820801
-7.9430951409681345,7.944770812988281
-7.9430951409681345,7.9334001541137695
-7.946921547407927,7.940608978271484
-7.91721462968355,7.9080376625061035
-7.924453006674053,7.933157444000244
-7.935542022791058,7.918537139892578
-7.899713120466515,7.915476322174072
-7.954677021213342,7.912306308746338
-7.946921547407927,7.960012912750244
-7.982966659490206,7.957125663757324
-7.942033487170233,7.9636993408203125
-8.008819571765459,8.011067390441895
-7.954677021213342,7.956960201263428
-7.924453006674053,7.920912265777588
-7.9393021526221474,7.933328628540039
-7.950781972366453,7.924313068389893
-7.950781972366453,7.949157238006592
-7.920818811243059,7.922678470611572
-7.9393021526221474,7.936720371246338
-7.977975326564206,7.987548351287842
-7.950781972366453,7.961876392364502
-7.987162773987728,7.999470233917236
-7.856986114171083,7.88593053817749
-7.935542022791058,7.9434494972229
-8.026824561605242,7.965455532073975
-7.950781972366453,7.930988788604736
-7.8761493177145505,7.92324161529541
-7.954677021213342,7.9435014724731445
-7.954677021213342,7.9439873695373535
-7.928117974144348,7.946124076843262
-7.910094953104535,7.940150737762451
-7.931814161156377,7.90212345123291
-7.9393021526221474,7.95436954498291
-7.924453006674053,7.931790351867676
-7.931814161156377,7.934798240661621
-7.935542022791058,7.943823337554932
-7.954677021213342,7.950299263000488
-7.950781972366453,7.956711292266846
-7.924453006674053,7.938169956207275
-7.857937595672809,7.915287971496582
-7.9393021526221474,7.9093146324157715
-7.910094953104535,7.92760705947876
-7.954677021213342,7.94486141204834
-7.9393021526221474,7.930567741394043
-7.950781972366453,7.946221351623535
-7.950781972366453,7.941298484802246
-7.946921547407927,7.9406514167785645
-7.946921547407927,7.946617603302002
-7.995678626217357,7.961743354797363
-7.950781972366453,7.938479900360107
-7.924453006674053,7.930640697479248
-7.935542022791058,7.931187152862549
-7.924453006674053,7.95535135269165
-7.9393021526221474,7.943350791931152
-7.879425560900211,7.921823024749756
-7.950781972366453,7.952360153198242
-7.920818811243059,7.938300132751465
-7.946921547407927,7.95385217666626
-7.946921547407927,7.92905855178833
-7.954677021213342,7.935612201690674
-7.9393021526221474,7.93243408203125
-7.935542022791058,7.954708576202393
-7.928117974144348,7.919440269470215
-7.924453006674053,7.912017822265625
-7.928117974144348,7.97112512588501
-7.946921547407927,7.9561662673950195
-7.946921547407927,7.93250846862793
-7.931814161156377,7.977510929107666
-7.931814161156377,7.952261447906494
-7.950781972366453,7.939403057098389
-7.950781972366453,7.922195911407471
-7.8728955601551585,7.919250965118408
-7.886056354845152,7.95048713684082
-7.931814161156377,7.939817905426025
-7.913640203677234,7.896225929260254
-7.954441918624099,7.935492992401123
-7.91721462968355,7.930051326751709
-7.9430951409681345,7.96104621887207
-7.931814161156377,7.924133777618408
-7.9393021526221474,7.938628673553467
-7.935542022791058,7.944365978240967
-7.954677021213342,7.937501907348633
-7.869665979871627,7.899949073791504
-7.954677021213342,7.962049961090088
-7.9913998274291025,7.936357021331787
-7.982966659490206,7.931360721588135
-7.954677021213342,7.928708553314209
-7.946921547407927,7.913573741912842
-7.950781972366453,7.945291042327881
-7.950781972366453,7.960734844207764
-7.950781972366453,7.941251754760742
-7.950781972366453,7.932692050933838
-7.954677021213342,7.956071376800537
-7.9430951409681345,7.947814464569092
-7.9393021526221474,7.949309825897217
-7.954677021213342,7.960569858551025
-7.898335326061519,7.928573131561279
-7.863280055279963,7.941917896270752
-7.869665979871627,7.917572021484375
-7.903090094245322,7.926800727844238
-7.950781972366453,7.965557098388672
-7.906578398789698,7.933803081512451
-7.954677021213342,7.941924095153809
-7.954677021213342,7.947731018066406
-7.935542022791058,7.935713768005371
-7.942208174627828,7.955954074859619
-7.889410352488291,7.915073394775391
-7.950781972366453,7.915290355682373
-7.946921547407927,7.94707727432251
-7.924453006674053,7.931034088134766
-7.950781972366453,7.929996967315674
-7.935542022791058,7.9059953689575195
-7.9393021526221474,7.952329635620117
-7.928117974144348,7.913563251495361
-7.9430951409681345,7.927335739135742
-8.008819571765459,7.984632968902588
-7.924453006674053,7.898995876312256
-7.954677021213342,7.947295665740967
-7.9430951409681345,7.946465015411377
-7.950781972366453,7.94122838973999
-7.910094953104535,7.932974815368652
-7.924453006674053,7.942870616912842
-7.950781972366453,7.9412312507629395
-7.93741804551443,7.918391227722168
-7.9393021526221474,7.931613445281982
-7.954677021213342,7.938255310058594
-7.969065592938858,7.880520343780518
-7.920818811243059,7.917216777801514
-7.924453006674053,7.924947261810303
-7.935542022791058,7.957540035247803
-7.931814161156377,7.940606594085693
-7.9393021526221474,7.949108600616455
-7.954677021213342,7.930469036102295
-7.946921547407927,7.960021495819092
-7.931814161156377,7.947578430175781
-7.946921547407927,7.949041843414307
-7.946921547407927,7.956998348236084
-7.9393021526221474,7.9232025146484375
-7.946921547407927,7.913915157318115
-7.982923651140671,7.941462516784668
-7.85078088734462,7.900018215179443
-7.970532618892763,7.929687976837158
-7.950781972366453,7.948305606842041
-7.924453006674053,7.969017028808594
-7.924453006674053,7.935794353485107
-7.940309692292938,7.909997463226318
-7.954677021213342,7.942408084869385
-7.8761493177145505,7.921685695648193
-7.950781972366453,7.952789783477783
-7.954677021213342,7.953904151916504
-7.931814161156377,7.911845684051514
-7.892790308673911,7.896239757537842
-7.939302143143198,7.917684078216553
-7.950781972366453,7.947525978088379
-7.847706165863548,7.921620845794678
-7.950781972366453,7.935458183288574
-7.8728955601551585,7.925731658935547
-7.950781972366453,7.933825969696045
-7.9367221576035965,7.932651519775391
-7.920818811243059,7.897512912750244
-7.913640203677234,7.9095139503479
-7.856986114171083,7.924130916595459
-7.974694136660875,7.9411187171936035
-7.954677021213342,7.922362327575684
-7.935542022791058,7.953418254852295
-7.950781972366453,7.981521129608154
-7.892069753452455,7.918097019195557
-7.920818811243059,7.93560266494751
-7.91721462968355,7.961280822753906
-7.954677021213342,7.963588237762451
-7.8365845332054285,7.94470739364624
-7.954677021213342,7.940568447113037
-7.924453006674053,7.94775390625
-7.892790308673911,7.931103229522705
-7.889410352488291,7.91758394241333
-7.924453006674053,7.918398857116699
-7.913640203677234,7.948427677154541
-7.954677021213342,7.953026294708252
-7.928117974144348,7.942521572113037
-7.924453006674053,7.913062572479248
-7.928117974144348,7.928110599517822
-7.946921547407927,7.946877479553223
-7.950781972366453,7.941105365753174
-7.866459873882536,7.912935733795166
-7.94742290951084,7.944286823272705
-7.920818811243059,7.92490816116333
-7.935542022791058,7.965096950531006
-7.931814161156377,7.941195487976074
-7.913640203677234,7.943713665008545
-7.892790308673911,7.911128044128418
-7.903090094245322,7.929510593414307
-7.995678626217357,8.003026962280273
-7.882728704344236,7.929898262023926
-7.9737577757544535,7.926450729370117
-7.928117974144348,7.917679786682129
-7.892790308673911,7.916889667510986
-7.935542022791058,7.959044933319092
-7.975985781891215,7.932397365570068
-7.950781972366453,7.9482245445251465
-7.879425560900211,7.936067581176758
-7.9393021526221474,7.9353718757629395
-7.913640203677234,7.9204840660095215
-7.9393021526221474,7.9315505027771
-7.950781972366453,7.934133052825928
-7.928117974144348,7.921088695526123
-7.924453006674053,7.952724933624268
-7.954677021213342,7.94857931137085
-7.882728704344236,7.926558494567871
-7.946921547407927,7.928770542144775
-7.892790308673911,7.92432975769043
-7.838628495628443,7.89006233215332
-7.920818811243059,7.941873073577881
-8.040958607678906,7.9479594230651855
-7.931814161156377,7.940824031829834
-7.928117974144348,7.934473037719727
-7.928117974144348,7.942471981048584
-7.950781972366453,7.9325666427612305
-7.954677021213342,7.934091567993164
-7.85205769961263,7.910471439361572
-7.995678626217357,7.924428462982178
-7.9393021526221474,7.952057361602783
-7.853872762493711,7.8973588943481445
-7.9430951409681345,7.937716960906982
-7.903090094245322,7.911706924438477
-7.928117974144348,7.942276954650879
-7.920818811243059,7.89945125579834
-7.924453006674053,7.911882400512695
-7.950781972366453,7.959312438964844
-7.889410352488291,7.921447277069092
-7.928117974144348,7.9572577476501465
-7.9430951409681345,7.9425225257873535
-7.9393021526221474,7.962965488433838
-7.924453006674053,7.928670406341553
-7.931814161156377,7.939901828765869
-7.935542022791058,7.937597274780273
-7.8416326138557455,7.906378746032715
-7.910094953104535,7.905045986175537
-7.954677021213342,7.970983028411865
-7.950781972366453,7.935162544250488
-7.924453006674053,7.901439189910889
-7.928117974144348,7.919820308685303
-7.935542022791058,7.947883605957031
-8.004899782157656,7.967659950256348
-7.931814161156377,7.946354389190674
-7.959289744233731,7.951509952545166
-7.905730809051267,7.9561991691589355
-7.9152617795440126,7.93387508392334
-7.995678626217357,7.9313788414001465
-7.863280055279963,7.922575950622559
-7.9430951409681345,7.945204257965088
-7.920818811243059,7.928103446960449
-7.950781972366453,7.9563727378845215
-7.91721462968355,7.908130645751953
-7.946921547407927,7.9207539558410645
-7.903090094245322,7.882294178009033
-7.896196359268842,7.9285197257995605
-7.889410352488291,7.94395112991333
-7.946921547407927,7.946855545043945
-7.928117974144348,7.90630578994751
-7.96257349994767,7.925678253173828
-7.858096678988375,7.915160655975342
-7.954677021213342,7.971752643585205
-7.935542022791058,7.926220893859863
-7.931814161156377,7.924224376678467
-7.950781972366453,7.95912504196167
-7.924453006674053,7.923050403594971
-7.906578398789698,7.923103332519531
-7.935542022791058,7.906117916107178
-7.950781972366453,7.925945281982422
-7.954677021213342,7.946497440338135
-7.928117974144348,7.948459625244141
-7.9393021526221474,7.926059722900391
-7.91721462968355,7.939431190490723
-7.85078088734462,7.909770965576172
-7.950781972366453,7.94420862197876
-7.974694136660875,7.974740505218506
-7.904830708706697,7.921850681304932
-7.954677021213342,7.956655979156494
-7.950781972366453,7.9210286140441895
-7.946921547407927,7.944975852966309
-7.924453006674053,7.910680770874023
-7.954677021213342,7.951160430908203
-7.9430951409681345,7.926152229309082
-7.954677021213342,7.9459919929504395
-7.920818811243059,7.8948750495910645
-7.950781972366453,7.936595439910889
-7.924453006674053,7.9191508293151855
-7.950781972366453,7.914583206176758
-7.954677021213342,7.954514026641846
-7.8728955601551585,7.919953346252441
-7.892790308673911,7.928954601287842
-7.928117974144348,7.942048072814941
-7.924453006674053,7.925239562988281
-7.935542022791058,7.931696891784668
-7.9430951409681345,7.917873859405518
-7.946921547407927,7.912593841552734
-7.928117974144348,7.916843891143799
-7.950781972366453,7.911587715148926
-7.9393021526221474,7.950643539428711
-7.950781972366453,7.947655200958252
-7.924453006674053,7.9384942054748535
-7.903090094245322,7.914238452911377
-7.982923651140671,7.930148601531982
-8.008819571765459,8.038698196411133
-7.954677021213342,7.9752655029296875
-8.008819571765459,7.975552082061768
-7.920818811243059,7.899478435516357
-7.975236013287654,7.964546203613281
-7.954677021213342,7.949491024017334
-7.928117974144348,7.925294876098633
-7.946921547407927,7.9572553634643555
-7.920818811243059,7.918049335479736
-7.928117974144348,7.932610034942627
-7.928155902956855,7.962723731994629
-7.946921547407927,7.9427876472473145
-7.96257349994767,7.980621814727783
-7.928117974144348,7.932766437530518
-7.8761493177145505,7.928910732269287
-7.9430951409681345,7.914229393005371
-8.008819571765459,8.016631126403809
-7.954677021213342,7.955141544342041
-7.892790308673911,7.926929950714111
-7.924453006674053,7.943849086761475
-7.924453006674053,7.9221625328063965
-7.924453006674053,7.8956475257873535
-7.995678626217357,7.974549770355225
-7.95090181210265,7.9380388259887695
-7.935542022791058,7.943355083465576
-7.931814161156377,7.9331464767456055
-7.950628730874147,7.9379730224609375
-7.939869391201816,7.914443492889404
-7.924453006674053,7.907439231872559
-7.882728704344236,7.912132740020752
-7.946921547407927,7.94489049911499
-7.954677021213342,7.921458721160889
-7.90684353174384,7.903916835784912
-7.853872762493711,7.925046443939209
-7.91721462968355,7.959410190582275
-7.943055911701025,7.903934001922607
-7.8728955601551585,7.90338659286499
-7.826117415313418,7.892235279083252
-7.8761493177145505,7.938135623931885
-7.9393021526221474,7.9201979637146
-7.804531148177666,7.945006847381592
-7.946921547407927,7.950093746185303
-7.91721462968355,7.952822208404541
-7.950781972366453,7.942023754119873
-7.946921547407927,7.9504241943359375
-7.954677021213342,7.9278035163879395
-7.935542022791058,7.946074962615967
-7.879425560900211,7.933718681335449
-7.954677021213342,7.952117919921875
-7.954677021213342,7.971507549285889
-7.913640203677234,7.887929439544678
-7.928117974144348,7.947058200836182
-7.995678626217357,7.9697465896606445
-7.954677021213342,7.970675945281982
-7.924453006674053,7.925110340118408
-7.954677021213342,7.950092792510986
-7.892790308673911,7.927845478057861
-7.935542022791058,7.915226459503174
-7.954677021213342,7.961291790008545
-7.946921547407927,7.917901515960693
-7.931814161156377,7.90775728225708
-7.924453006674053,7.920066833496094
-7.920818811243059,7.911614894866943
-7.950781972366453,7.963886260986328
-7.9393021526221474,7.9313836097717285
-7.924453006674053,7.901675224304199
-7.928117974144348,7.93549108505249
-7.966617665152964,7.940531253814697
-7.931814161156377,7.961598873138428
-7.818151283467686,7.904582500457764
-7.928117974144348,7.939376354217529
-7.954677021213342,7.937007427215576
-7.950781972366453,7.961112976074219
-7.91721462968355,7.913928508758545
-7.928117974144348,7.9247965812683105
-8.013136044317282,7.969910144805908
-7.950781972366453,7.9437575340271
-7.863280055279963,7.9091620445251465
-7.89962956062971,7.936446666717529
-7.982923651140671,7.935361385345459
-7.974694136660875,7.93148946762085
-7.931814161156377,7.945210933685303
-7.928117974144348,7.9271440505981445
-7.95078197271544,7.924651622772217
-7.920818811243059,7.948904991149902
-7.828427770348437,7.885992527008057
-7.908539684071192,7.937434673309326
-7.950781972366453,7.951545238494873
-7.9393021526221474,7.945696830749512
-7.91721462968355,7.906243801116943
-7.829768510087842,7.8850016593933105
-7.891275104996169,7.909438133239746
-7.920818811243059,7.931478500366211
-7.950038636068048,7.909692764282227
-7.935542022791058,7.951910018920898
-7.96714741418301,7.925704002380371
-7.896196359268842,7.931581974029541
-7.920818811243059,7.932902812957764
-7.954677021213342,7.94495153427124
-7.866459873882536,7.950469493865967
-7.896196359268842,7.935356140136719
-7.950781972366453,7.927500247955322
-7.924453006674053,7.919153690338135
-7.935542022791058,7.933773517608643
-7.950781972366453,7.945830821990967
-7.91721462968355,7.923927307128906
-7.950781972366453,7.9303154945373535
-7.873946355627666,7.883241176605225
-7.924453006674053,7.924715995788574
-7.924453006674053,7.971227645874023
-7.954677021213342,7.932730197906494
-7.89962956062971,7.9300360679626465
-7.946921547407927,7.952274799346924
-7.950781972366453,7.9351348876953125
-7.954677021213342,7.935681343078613
-7.931814161156377,7.925500392913818
-7.935542022791058,7.9305243492126465
-7.954677021213342,7.8976216316223145
-7.924453006674053,7.938888072967529
-7.950781972366453,7.9530487060546875
-7.847298682761509,7.913922309875488
-7.928117974144348,7.9295244216918945
-7.950781972366453,7.948451519012451
-7.966576241738391,7.945094585418701
-7.9430951409681345,7.953981876373291
-7.935542022791058,7.953904628753662
-7.903090094245322,7.928153038024902
-7.935542022791058,7.90169095993042
-7.946921547407927,7.954221725463867
-7.920818811243059,7.947632312774658
-7.935542022791058,7.924576759338379
-7.924453006674053,7.925038814544678
-7.950781972366453,7.92004919052124
-7.9393021526221474,7.957281589508057
-7.954677021213342,7.937455654144287
-7.9737577757544535,7.944897174835205
-7.910094953104535,7.947041988372803
-7.954677021213342,7.972747802734375
-7.924453006674053,7.9337897300720215
-7.950781972366453,7.949834823608398
-7.946921547407927,7.9315571784973145
-7.946921547407927,7.924876689910889
-7.8416326138557455,7.926483631134033
-7.920818811243059,7.950194358825684
-7.946921547407927,7.950074672698975
-7.9430951409681345,7.951347351074219
-7.869665979871627,7.911880016326904
-7.920818811243059,7.938305377960205
-7.920818811243059,7.939626216888428
-7.954677021213342,7.9538702964782715
-7.9430951409681345,7.937833309173584
-7.954677021213342,7.950054168701172
-7.9393021526221474,7.956703186035156
-7.970532618892763,7.97880744934082
-7.954677021213342,7.940876007080078
-7.8728955601551585,7.934700965881348
-7.89962956062971,7.933035850524902
-7.889410352488291,7.937209606170654
-7.882728704344236,7.934866905212402
-7.950781972366453,7.942546367645264
-7.924453006674053,7.91269063949585
-7.931814161156377,7.911565780639648
-7.954677021213342,7.955722332000732
-7.91721462968355,7.917028903961182
-7.9430951409681345,7.951572418212891
-7.9393021526221474,7.929766654968262
-7.924453006674053,7.9172282218933105
-7.954677021213342,7.9370598793029785
-7.920818811243059,7.927818775177002
-7.913640203677234,7.929152965545654
-7.853872762493711,7.92940092086792
-7.950781972366453,7.945652008056641
-7.91721462968355,7.93832540512085
-7.946921547407927,7.952327728271484
-7.9393021526221474,7.935078144073486
-7.928117974144348,7.930816650390625
-7.906578398789698,7.878335475921631
-7.954677021213342,7.962310314178467
-7.954677021213342,7.956527233123779
-7.838693701646425,7.929862976074219
-7.966617665152964,7.9333953857421875
-7.892790308673911,7.941678047180176
-7.946921547407927,7.917689800262451
-7.9393021526221474,7.924874782562256
-7.925914591896404,7.893131256103516
-7.928117974144348,7.936645030975342
-7.935542022791058,7.944221019744873
-7.924453006674053,7.921220302581787
-7.9430951409681345,7.9133405685424805
-7.913640203677234,7.943467140197754
-7.945546910621388,7.904764175415039
-7.847706165863548,7.91178560256958
-7.913640203677234,7.902666091918945
-7.950781972366453,7.951358795166016
-7.935542022791058,7.967178821563721
-7.928117974144348,7.910261631011963
-7.924453006674053,7.936641216278076
-7.950781972366453,7.944254398345947
-7.913640203677234,7.9318766593933105
-7.920818811243059,7.948115825653076
-7.954677021213342,7.954521656036377
-7.924453006674053,7.930510997772217
-7.946921547407927,7.951003551483154
-7.91721462968355,7.93763542175293
-7.950781972366453,7.943928241729736
-7.946921547407927,7.946313381195068
-7.995678626217357,7.968237400054932
-7.9393021526221474,7.938666820526123
-7.9086465470720775,7.942007541656494
-7.9430951409681345,7.973108768463135
-7.9393021526221474,7.956491470336914
-7.935542022791058,7.9316086769104
-7.9393021526221474,7.941280841827393
-7.928117974144348,7.959408760070801
-7.906578398789698,7.935565948486328
-7.885953431936095,7.933163166046143
-7.9393021526221474,7.919774532318115
-7.9393021526221474,7.941426753997803
-7.925565706285505,7.9245076179504395
-7.924453006674053,7.944158554077148
-7.9393021526221474,7.954533576965332
-7.93741804551443,7.926577091217041
-7.84659136380027,7.887840747833252
-7.920818811243059,7.921261310577393
-7.892790308673911,7.9280805587768555
-7.9430951409681345,7.959016799926758
-7.935542022791058,7.9449334144592285
-7.950781972366453,7.970943927764893
-7.954677021213342,7.9569621086120605
-7.910094953104535,7.947930335998535
-7.954677021213342,7.953006744384766
-7.879425560900211,7.9388813972473145
-7.9430951409681345,7.930815696716309
-7.951740612759727,7.946897983551025
-7.879425560900211,7.9485907554626465
-7.982923651140671,7.930976390838623
-7.9393021526221474,7.904350280761719
-7.922491400135772,7.96209192276001
-7.954677021213342,7.913989543914795
-7.928117974144348,7.913318157196045
-7.859452790550835,7.907715797424316
-7.91721462968355,7.939918518066406
-7.869665979871627,7.931915760040283
-7.9616219366397445,7.980874538421631
-7.935542022791058,7.928634166717529
-7.950781972366453,7.937758922576904
-7.946921547407927,7.911835670471191
-7.946921547407927,7.957745552062988
-7.91721462968355,7.964036464691162
-7.9430951409681345,7.928402423858643
-7.8761493177145505,7.89625883102417
-7.935542022791058,7.938601970672607
-7.950781972366453,7.9657440185546875
-7.935542022791058,7.935719013214111
-7.924453006674053,7.940201282501221
-7.920818811243059,7.9424662590026855
-7.950781972366453,7.962904930114746
-7.924453006674053,7.957265377044678
-7.9737577757544535,7.954589366912842
-7.91721462968355,7.950989246368408
-7.913640203677234,7.938179016113281
-7.839328904096787,7.848137378692627
-7.950781972366453,7.926655292510986
-7.89962956062971,7.901017665863037
-7.924453006674053,7.90850830078125
-7.946921547407927,7.946126937866211
-7.954677021213342,7.963066577911377
-7.920818811243059,7.919076442718506
-7.903090094245322,7.950388431549072
-7.928117974144348,7.924773693084717
-7.954677021213342,7.951606750488281
-7.886056354845152,7.934084892272949
-7.954677021213342,7.943546295166016
-7.954677021213342,7.9830451011657715
-7.9430951409681345,7.9685540199279785
-7.946921547407927,7.943850994110107
-7.886056354845152,7.905434608459473
-7.978116334435664,7.948999404907227
-7.924453006674053,7.910245895385742
-7.9737577757544535,7.933260440826416
-7.931814161156377,7.907727241516113
-7.910094953104535,7.903792858123779
-7.950781972366453,7.945725917816162
-7.995678626217357,7.95059061050415
-7.931814161156377,7.945228576660156
-7.924453006674053,7.904568195343018
-7.924453006674053,7.93039083480835
-7.928117974144348,7.949985980987549
-7.935542022791058,7.953185558319092
-7.9393021526221474,7.900936603546143
-7.847706165863548,7.937984943389893
-7.950781972366453,7.9384331703186035
-7.9200659509493825,7.969939708709717
-7.924453006674053,7.914137363433838
-7.9430951409681345,7.948601245880127
-7.946921547407927,7.941502094268799
-7.85078088734462,7.947145462036133
-7.928117974144348,7.9270405769348145
-7.946921547407927,7.928725719451904
-7.879425560900211,7.928253650665283
-7.924453006674053,7.943331718444824
-7.91721462968355,7.906072616577148
-7.928117974144348,7.919376850128174
-7.924453006674053,7.90861701965332
-7.954677021213342,7.900824069976807
-7.9430951409681345,7.932275295257568
-7.924453006674053,7.923093318939209
-7.9430951409681345,7.945591449737549
-7.924453006674053,7.9321513175964355
-7.928117974144348,7.939475059509277
-7.954677021213342,7.936807632446289
-7.954677021213342,7.931673049926758
-7.9393021526221474,7.932380676269531
-7.950781972366453,7.919243812561035
-7.9430951409681345,7.953463077545166
-7.882728704344236,7.886569499969482
-7.931814161156377,7.905980587005615
-8.026824561605242,7.984825611114502
-7.9393021526221474,7.948365211486816
-7.946921547407927,7.942181587219238
-7.920818811243059,7.939918041229248
-7.910094953104535,7.917526721954346
-7.862918345879642,7.937692165374756
-7.954677021213342,7.931534290313721
-7.9430951409681345,7.949127674102783
-7.9393021526221474,7.943698406219482
-7.9430951409681345,7.962656497955322
-7.935542022791058,7.953547954559326
-7.950781972366453,7.955021381378174
-7.954677021213342,7.950422763824463
-7.93765506239242,7.938141345977783
-7.950781972366453,7.943281650543213
-7.950781972366453,7.963331699371338
-7.913640203677234,7.912853717803955
-7.950781972366453,7.946177005767822
-7.853872762493711,7.900905132293701
-7.928117974144348,7.931813716888428
-7.950781972366453,7.934188365936279
-7.982966659490206,7.931092739105225
-7.879527744657629,7.9232988357543945
-7.935542022791058,7.907352924346924
-7.950781972366453,7.95134973526001
-7.931814161156377,7.928305625915527
-7.9393021526221474,7.9362969398498535
-7.954677021213342,7.9327473640441895
-7.931814134875992,7.944796562194824
-7.928117974144348,7.938841342926025
-7.906578398789698,7.939333438873291
-7.950781972366453,7.939958572387695
-7.935542022791058,7.936488628387451
-7.9430951409681345,7.947839260101318
-7.966617665152964,7.961059093475342
-7.8931890133308515,7.938051700592041
-7.906578398789698,7.921787738800049
-7.8728955601551585,7.869917392730713
-7.9393021526221474,7.946915149688721
-7.950781972366453,7.946157932281494
-7.9430951409681345,7.93078088760376
-7.946921547407927,7.922621250152588
-7.9393021526221474,7.9527268409729
-7.982923651140671,7.942923545837402
-7.954677021213342,7.9811835289001465
-7.946921547407927,7.9295220375061035
-7.935542022791058,7.938147068023682
-7.928117974144348,7.9186320304870605
-7.869665979871627,7.920849323272705
-7.966576241738391,7.968618392944336
-7.924453006674053,7.940340042114258
-7.932979898863743,7.91808557510376
-7.879166050413646,7.923582553863525
-7.903090094245322,7.917670249938965
-7.950781972366453,7.925307750701904
-7.950781972366453,7.955085754394531
-7.923987557317199,7.897752285003662
-7.93468629292431,7.917242527008057
-7.9430951409681345,7.9315314292907715
-7.91721462968355,7.903048038482666
-7.886056354845152,7.916574001312256
-7.939379961634402,7.943072319030762
-7.903090094245322,7.940708637237549
-7.946921547407927,7.933956146240234
-7.920706937989397,7.91648530960083
-7.954677021213342,7.947208881378174
-7.913640203677234,7.934298038482666
-7.987162773987728,7.965121269226074
-7.9393021526221474,7.95508337020874
-7.906578398789698,7.92977237701416
-7.932396638893121,7.9428391456604
-7.829768510087842,7.9148945808410645
-7.913640203677234,7.910855293273926
-7.950781972366453,7.942140102386475
-7.954677021213342,7.919939994812012
-7.950781972366453,7.930695533752441
-7.950781972366453,7.947767734527588
-7.954677021213342,7.956438064575195
-7.901151046525181,7.905258655548096
-7.950781972366453,7.958393573760986
-7.846035765262794,7.901438236236572
-7.9616219366397445,7.955277919769287
-7.9430951409681345,7.937759876251221
-7.924453006674053,7.895199298858643
-7.950781972366453,7.951546669006348
-7.935542022791058,7.9377665519714355
-7.924453006674053,7.917294025421143
-7.954677021213342,7.930800437927246
-7.954677021213342,7.966935157775879
-7.856986114171083,7.889657974243164
-7.913640203677234,7.897708415985107
-7.903090094245322,7.916260242462158
-7.924453006674053,7.9403076171875
-7.96981377267859,7.983243465423584
-7.950781972366453,7.950033664703369
-7.946921547407927,7.930591583251953
-7.924453006674053,7.907660007476807
-7.950781972366453,7.942530155181885
-7.954677021213342,7.941030979156494
-7.928117974144348,7.93756103515625
-7.9430951409681345,7.922252178192139
-7.866459873882536,7.930071830749512
-7.91721462968355,7.9125189781188965
-7.924453006674053,7.9295172691345215
-7.954677021213342,7.966182708740234
-7.860820732007034,7.905893802642822
-7.9393021526221474,7.9659833908081055
-7.931814161156377,7.95752477645874
-7.931814161156377,7.950155735015869
-7.89962956062971,7.957800388336182
-7.924453006674053,7.91621732711792
-7.954677021213342,7.932348728179932
-7.950781972366453,7.931591510772705
-7.954677021213342,7.969168186187744
-7.838628495628443,7.929409503936768
-7.954677021213342,7.93176794052124
-7.950781972366453,7.934396266937256
-7.950781972366453,7.950616836547852
-7.954677021213342,7.95070219039917
-7.954677021213342,7.924377918243408
-7.924453006674053,7.913455486297607
-7.954677021213342,7.96492338180542
-7.954677021213342,7.957442283630371
-7.888606117307137,7.941314697265625
-7.9430951409681345,7.932172775268555
-7.886369505632882,7.9335036277771
-7.935542022791058,7.9359331130981445
-7.943055911701025,7.939736843109131
-7.995678626217357,7.954745769500732
-7.913640203677234,7.944665431976318
-7.9430951409681345,7.9484968185424805
-7.950781972366453,7.946382999420166
-7.931814161156377,7.928176403045654
-7.856986114171083,7.932164669036865
-7.9430951409681345,7.9496073722839355
-7.928117974144348,7.96825647354126
-7.9393021526221474,7.964645862579346
-7.935542022791058,7.951259136199951
-7.946921547407927,7.942758083343506
-7.946921547407927,7.927576541900635
-7.950781972366453,7.952502250671387
-7.950781972366453,7.932843208312988
-7.950781972366453,7.946583271026611
-7.924453006674053,7.944788932800293
-7.928117974144348,7.9331889152526855
-7.950781972366453,7.9375996589660645
-7.9393021526221474,7.936339378356934
-7.93412590860815,7.938872814178467
-7.954677021213342,7.929352760314941
-7.924453006674053,7.929660320281982
-7.924453006674053,7.927914142608643
-7.9430951409681345,7.947298526763916
-7.913640203677234,7.902780055999756
-7.85078088734462,7.901208400726318
-7.975453335860696,7.940005302429199
-7.950781972366453,7.948678493499756
-7.938102963264953,7.963560104370117
-7.928117974144348,7.946987628936768
-7.931814161156377,7.934023380279541
-7.970532618892763,7.967617988586426
-7.952725130123009,7.930482387542725
-7.910094953104535,7.9237470626831055
-7.910094953104535,7.918349742889404
-7.954677021213342,7.963080406188965
-7.954677021213342,7.9405198097229
-7.924453006674053,7.9361701011657715
-7.931814161156377,7.926940441131592
-7.991531413298041,7.987947940826416
-7.9393021526221474,7.945348262786865
-7.928117974144348,7.943891525268555
-7.970532618892763,7.970370769500732
-7.931814161156377,7.928592205047607
-7.954677021213342,7.95557165145874
-7.954677021213342,7.961331844329834
-7.946921547407927,7.930047512054443
-7.9737577757544535,7.957065582275391
-7.924453006674053,7.912961483001709
-7.924453006674053,7.942063331604004
-7.882728704344236,7.937154293060303
-7.924453006674053,7.923523902893066
-7.9737577757544535,7.949666500091553
-7.931814161156377,7.946187496185303
-7.9430951409681345,7.92742395401001
-7.930809816003702,7.9486403465271
-7.946921547407927,7.93245267868042
-7.935542022791058,7.920578956604004
-7.882728704344236,7.879919528961182
-7.954677021213342,7.955096244812012
-7.950781972366453,7.941276550292969
-7.982923651140671,7.92072868347168
-7.9155494703443505,7.940638542175293
-7.924453006674053,7.916332721710205
-7.931814161156377,7.92173433303833
-7.950781972366453,7.940124988555908
-7.935542022791058,7.93558931350708
-7.954677021213342,7.981359958648682
-8.008819571765459,7.992101192474365
-7.9430951409681345,7.950372219085693
-7.8761493177145505,7.902306079864502
-7.924453006674053,7.925556659698486
-7.931814161156377,7.936418056488037
-7.950781972366453,7.947237014770508
-7.931814161156377,7.926307201385498
-7.950781972366453,7.955114841461182
-7.982923651140671,7.8979105949401855
-7.931814161156377,7.956278324127197
-7.958111178310889,7.89035177230835
-7.946921547407927,7.951408863067627
-7.928117974144348,7.935751438140869
-7.950781972366453,7.947384834289551
-7.950781972366453,7.965160369873047
-7.950781972366453,7.953004837036133
-7.93978520718815,7.923433780670166
-7.946921547407927,7.901910305023193
-7.931814161156377,7.954102993011475
-7.950781972366453,7.941918849945068
-7.970616219270671,7.958775520324707
-7.882728704344236,7.92255973815918
-7.950781972366453,7.921223163604736
-7.946921547407927,7.931942462921143
-7.924453006674053,7.9358601570129395
-7.886056354845152,7.902831554412842
-7.946921547407927,7.926693439483643
-7.924453006674053,7.947215557098389
-7.950781972366453,7.936136245727539
-7.950781972366453,7.941609859466553
-7.954677021213342,7.9459452629089355
-7.954677021213342,7.955296516418457
-7.987162773987728,7.942492961883545
-7.9430951409681345,7.921423435211182
-7.950781972366453,7.966381549835205
-7.903090094245322,7.943774223327637
-7.910094953104535,7.948098659515381
-7.913640203677234,7.921715259552002
-7.9542414507479275,7.948004722595215
-7.924453006674053,7.914038181304932
-7.946921547407927,7.958940029144287
-7.946921547407927,7.956891059875488
-7.931814161156377,7.905989170074463
-7.950781972366453,7.944930553436279
-7.950781972366453,7.948143005371094
-7.954677021213342,7.964066028594971
-7.946921547407927,7.924601078033447
-7.946921547407927,7.927903175354004
-7.946921547407927,7.930992126464844
-7.931814161156377,7.929071426391602
-7.866185328564197,7.9054646492004395
-7.950781972366453,7.968222141265869
-7.950781972366453,7.959934234619141
-7.928117974144348,7.948143482208252
-7.946921547407927,7.9300408363342285
-7.924453006674053,7.922784805297852
-7.920818811243059,7.917846202850342
-7.935542022791058,7.9244465827941895
-7.931814161156377,7.92642879486084
-7.954677021213342,7.967137813568115
-7.928117974144348,7.9318318367004395
-7.950781972366453,7.944940090179443
-7.924453006674053,7.930367946624756
-7.924453006674053,7.91375207901001
-7.879425560900211,7.888324737548828
-7.9913998274291025,7.969058513641357
-7.950781972366453,7.974483013153076
-7.954677021213342,7.930696487426758
-7.924453006674053,7.9027934074401855
-7.920818811243059,7.949032783508301
-7.953262503246687,7.943027973175049
-7.931814161156377,7.928159236907959
-7.954677021213342,7.929686069488525
-7.910094953104535,7.9447340965271
-7.8728955601551585,7.918271541595459
-7.838628495628443,7.908080577850342
-7.950781972366453,7.934326648712158
-7.9430951409681345,7.925539493560791
-7.946921547407927,7.919506072998047
-7.9393021526221474,7.956547737121582
-7.950781972366453,7.939399719238281
-7.946921547407927,7.938271999359131
-7.950781972366453,7.921737194061279
-7.9393021526221474,7.931405544281006
-7.970616219270671,7.951107501983643
-7.950781972366453,7.943378925323486
-7.995678626217357,7.941757678985596
-7.946921547407927,7.91652250289917
-7.950781972366453,7.959371089935303
-7.954677021213342,7.928285121917725
-7.931814161156377,7.920121192932129
-7.946921547407927,7.939270973205566
-7.9393021526221474,7.9285054206848145
-7.90595341825991,7.960686206817627
-7.946921547407927,7.945356845855713
-7.928117974144348,7.93588399887085
-7.9430951409681345,7.932153701782227
-7.9430951409681345,7.932743549346924
-7.945236761475783,7.926363945007324
-7.928155902956855,7.943209171295166
-7.928117974144348,7.930993556976318
-7.863280055279963,7.877551555633545
-7.879425560900211,7.918150424957275
-7.8728955601551585,7.917019844055176
-7.950781972366453,7.950427532196045
-7.950781972366453,7.934540271759033
-7.950781972366453,7.966904163360596
-7.928117974144348,7.921732425689697
-7.931814161156377,7.945619583129883
-7.954677021213342,7.933516025543213
-7.875669587564858,7.911641597747803
-7.9393021526221474,7.956598281860352
-7.9393021526221474,7.941388130187988
-7.950781972366453,7.945948600769043
-7.954677021213342,7.940606594085693
-7.995678626217357,7.955111503601074
-7.950781972366453,7.947805404663086
-7.892790308673911,7.950407028198242
-7.892790308673911,7.93617582321167
-8.035307403686794,7.984978199005127
-7.909476463822079,7.938822269439697
-7.9393021526221474,7.963984966278076
-7.924453006674053,7.908911228179932
-7.931814161156377,7.913446426391602
-7.954677021213342,7.93396520614624
-7.9393021526221474,7.94852876663208
-7.924453006674053,7.942043781280518
-7.931814161156377,7.9076104164123535
-7.950781972366453,7.9716477394104
-7.89962956062971,7.931373596191406
-7.950781972366453,7.9529595375061035
-7.950781972366453,7.947436809539795
-7.924453006674053,7.919022083282471
-7.924453006674053,7.941590309143066
-7.950781972366453,7.94688081741333
-7.910094953104535,7.9143757820129395
-7.928117974144348,7.9297661781311035
-7.847706165863548,7.887667655944824
-7.946921547407927,7.9461140632629395
-7.928117974144348,7.917138576507568
-7.9393021526221474,7.946815013885498
-7.857475444315718,7.947296619415283
-7.924453006674053,7.947760105133057
-7.9430951409681345,7.935499668121338
-7.886056354845152,7.930321216583252
-7.892790308673911,7.938772201538086
-7.910094953104535,7.913389205932617
-7.9913998274291025,7.9560980796813965
-7.995678626217357,7.933190822601318
-7.896196359268842,7.928106307983398
-7.924453006674053,7.9203290939331055
-7.995678626217357,7.953269004821777
-7.935542022791058,7.913236618041992
-7.982923651140671,7.954761028289795
-7.903090094245322,7.935635089874268
-7.935542022791058,7.921483993530273
-7.954677021213342,7.935300350189209
-7.954677021213342,7.966756343841553
-7.9393021526221474,7.947212219238281
-7.946921547407927,7.935611724853516
-7.924453006674053,7.919956684112549
-7.946921547407927,7.940485000610352
-7.954677021213342,7.9533209800720215
-7.91721462968355,7.941682815551758
-7.928117974144348,7.9277472496032715
-7.928117974144348,7.92602014541626
-7.954677021213342,7.952219009399414
-7.950781972366453,7.9619669914245605
-7.924453006674053,7.949856281280518
-7.931814161156377,7.932557106018066
-7.954677021213342,7.945259094238281
-7.950781972366453,7.925664901733398
-7.927586760018237,7.909949779510498
-7.935542022791058,7.933370590209961
-7.920818811243059,7.934759140014648
-7.954677021213342,7.933695316314697
-7.869016357072147,7.911686420440674
-7.954677021213342,7.94420862197876
-7.9393021526221474,7.943708896636963
-7.950781972366453,7.951511859893799
-7.946921547407927,7.942811012268066
-7.928117974144348,7.9396138191223145
-7.935542022791058,7.944191932678223
-7.910957386956294,7.907898426055908
-7.954677021213342,7.944911479949951
-7.920818811243059,7.911999702453613
-7.9430951409681345,7.953024387359619
-7.91721462968355,7.922023296356201
-7.9393021526221474,7.911752223968506
-7.924453006674053,7.931440830230713
-7.950781972366453,7.954721927642822
-7.924453006674053,7.883642196655273
-7.9430951409681345,7.946360111236572
-7.924453006674053,7.963404178619385
-7.8416326138557455,7.896475315093994
-7.8416326138557455,7.899264812469482
-7.946921547407927,7.939080238342285
-7.931814161156377,7.925962448120117
-7.954677021213342,7.954643249511719
-7.943055911701025,7.982941627502441
-7.913640203677234,7.919305324554443
-7.860119116630385,7.902307510375977
-7.928936536236001,7.913865566253662
-7.8349671212224035,7.915889263153076
-7.950781972366453,7.94591760635376
-7.954677021213342,7.945492744445801
-7.873682696996433,7.937920093536377
-7.982923651140671,7.961203098297119
-7.906578398789698,7.948344707489014
-7.950781972366453,7.943540573120117
-7.950781972366453,7.934551239013672
-7.946921547407927,7.957504749298096
-7.9393021526221474,7.927225589752197
-7.906578398789698,7.940742015838623
-7.9430951409681345,7.925036907196045
-7.896196359268842,7.933813095092773
-7.946921547407927,7.924606800079346
-7.935542022791058,7.964572429656982
-7.950781972366453,7.959018230438232
-7.91721462968355,7.93002462387085
-7.931814161156377,7.935592174530029
-7.9393021526221474,7.961105823516846
-7.931814161156377,7.916098594665527
-7.9430951409681345,7.937283992767334
-7.906578398789698,7.923928260803223
-7.9430951409681345,7.9765095710754395
-7.913640203677234,7.923068046569824
-7.946921547407927,7.941751003265381
-7.954677021213342,7.951230049133301
-7.896708615962599,7.915395259857178
-7.950781972366453,7.957930564880371
-7.881529845545969,7.936125755310059
-7.935542022791058,7.929457187652588
-7.9430951409681345,7.953941345214844
-7.924453006674053,7.950240135192871
-7.974694136660875,7.938390731811523
-7.954677021213342,7.938032150268555
-7.950781972366453,7.9318013191223145
-7.935542022791058,7.921262264251709
-7.954677021213342,7.944324970245361
-7.860119116630385,7.895101070404053
-7.950781972366453,7.949240684509277
-7.935542022791058,7.9498419761657715
-7.924453006674053,7.933070659637451
-7.950781972366453,7.940727710723877
-7.962737687758908,7.9804792404174805
-7.946921547407927,7.939546585083008
-7.8728955601551585,7.899907112121582
-7.954677021213342,7.9329047203063965
-7.935542022791058,7.939493179321289
-7.954677021213342,7.9176506996154785
-7.950781972366453,7.96713399887085
-7.924453006674053,7.892368793487549
-7.931814161156377,7.951662063598633
-7.9393021526221474,7.953962802886963
-7.835637836224461,7.863059043884277
-7.924453006674053,7.949546813964844
-7.906578398789698,7.919684410095215
-7.950781972366453,7.919524192810059
-7.950781972366453,7.938701152801514
-7.950781972366453,7.9416680335998535
-7.924453006674053,7.926636695861816
-7.982923651140671,7.9394731521606445
-7.928117974144348,7.931990146636963
-8.008819571765459,8.00625991821289
-7.931814161156377,7.931166648864746
-7.856986114171083,7.902031421661377
-7.950781972366453,7.9238810539245605
-7.886056354845152,7.954431056976318
-7.924453006674053,7.921706676483154
-7.931814161156377,7.962099552154541
-7.826774591089415,7.895800590515137
-7.9393021526221474,7.933509349822998
-7.910094953104535,7.904456615447998
-7.918688621719399,7.964158535003662
-7.9737577757544535,7.951252460479736
-7.928117974144348,7.9093146324157715
-7.924453006674053,7.930337429046631
-7.906578398789698,7.903148174285889
-7.924453006674053,7.922547817230225
-7.950781972366453,7.95747709274292
-7.954677021213342,7.9608988761901855
-7.935542022791058,7.951727390289307
-7.946921547407927,7.947972774505615
-7.91721462968355,7.937466144561768
-7.950781972366453,7.954163551330566
-7.903090094245322,7.9499640464782715
-7.981017239849406,7.959924221038818
-7.950781972366453,7.948050022125244
-7.928117974144348,7.936293125152588
-7.910094953104535,7.9377217292785645
-7.924453006674053,7.9350152015686035
-7.9430951409681345,7.947835922241211
-7.839935417773265,7.880134105682373
-7.9393021526221474,7.956954002380371
-7.924453006674053,7.914175033569336
-7.906578398789698,7.906070709228516
-7.924453006674053,7.926238536834717
-7.931814161156377,7.946935176849365
-7.946921547407927,7.949977397918701
-7.950781972366453,7.937410354614258
-7.9393021526221474,7.922860622406006
-7.892790308673911,7.939221382141113
-7.954677021213342,7.956024646759033
-7.924453006674053,7.930201530456543
-7.954677021213342,7.922548770904541
-7.946921547407927,7.951711654663086
-7.9430951409681345,7.935263156890869
-7.925009000125929,7.9430928230285645
-7.866459873882536,7.896983623504639
-7.950781972366453,7.959396839141846
-7.8761493177145505,7.908624172210693
-7.995678626217357,7.928250789642334
-7.928117974144348,7.926433086395264
-7.946921547407927,7.947804927825928
-7.950781972366453,7.958428859710693
-7.8761493177145505,7.911418437957764
-7.950781972366453,7.931919097900391
-7.954677021213342,7.946625232696533
-7.935542022791058,7.94849157333374
-7.913640203677234,7.9459052085876465
-7.946921547407927,7.938340187072754
-7.924453006674053,7.917690277099609
-7.935542022791058,7.935460567474365
-7.9393021526221474,7.921796798706055
-7.946921547407927,7.930762767791748
-7.974694136660875,7.950226306915283
-7.946921547407927,7.952291011810303
-7.954677021213342,7.966939926147461
-7.950781972366453,7.9368367195129395
-7.982966659490206,7.978403091430664
-7.896196359268842,7.94108247756958
-7.920818811243059,7.935778617858887
-7.935542022791058,7.951751232147217
-7.978810702253626,7.957546234130859
-7.950781972366453,7.930643558502197
-7.946921547407927,7.927699565887451
-7.938102963264953,7.964745998382568
-7.950781972366453,7.932057857513428
-7.924453006674053,7.922950267791748
-7.935542022791058,7.948769569396973
-7.936235711226021,7.926319599151611
-7.946921547407927,7.93971586227417
-7.928117974144348,7.926262855529785
-7.928117974144348,7.897524356842041
-7.946921547407927,7.942508220672607
-7.8728955601551585,7.895175933837891
-7.935542022791058,7.943122386932373
-7.946921547407927,7.9263434410095215
-7.928117974144348,7.934106826782227
-7.935542022791058,7.934905052185059
-7.897047976439774,7.944528579711914
-7.982923651140671,7.932895660400391
-7.924453006674053,7.945347785949707
-7.9393021526221474,7.944682598114014
-7.931814161156377,7.928916931152344
-7.9430951409681345,7.962688446044922
-7.928117974144348,7.95718240737915
-7.931814161156377,7.932064533233643
-7.954677021213342,7.954389572143555
-7.954677021213342,7.97643518447876
-7.935542022791058,7.91900634765625
-7.954677021213342,7.957578182220459
-7.954677021213342,7.928459644317627
-7.935542022791058,7.926175117492676
-7.9393021526221474,7.924067497253418
-7.913640203677234,7.913318157196045
-7.950781972366453,7.949512958526611
-7.931814161156377,7.965689182281494
-7.924453006674053,7.938754558563232
-7.946921547407927,7.954086780548096
-7.928117974144348,7.917567253112793
-7.954677021213342,7.948996067047119
-7.9430951409681345,7.921225547790527
-7.924453006674053,7.939078330993652
-7.950781972366453,7.9309892654418945
-7.946921547407927,7.9320807456970215
-7.860119116630385,7.924914836883545
-7.987162773987728,7.971920013427734
-7.9393021526221474,7.939502239227295
-7.935542022791058,7.929112434387207
-7.954677021213342,7.95352029800415
-7.954677021213342,7.974849700927734
-7.9393021526221474,7.94059944152832
-7.89962956062971,7.928519248962402
-7.903090094245322,7.90193510055542
-7.933674092121578,7.946865081787109
-7.924453006674053,7.947390556335449
-7.85205769961263,7.915414810180664
-7.9430951409681345,7.971614360809326
-7.955487534501616,7.914663791656494
-7.950781972366453,7.949886322021484
-7.924453006674053,7.943437576293945
-7.950781972366453,7.921445369720459
-7.954677021213342,7.94228458404541
-7.950781972366453,7.93850564956665
-7.920818811243059,7.925197601318359
-7.928117974144348,7.9021830558776855
-7.924453006674053,7.948803901672363
-7.931814161156377,7.933372974395752
-7.950258453393831,7.946250915527344
-7.950781972366453,7.947635173797607
-7.9737577757544535,7.9438090324401855
-7.9737577757544535,7.938771724700928
-7.931814161156377,7.9409260749816895
-7.950781972366453,7.907375812530518
-7.882728704344236,7.918476581573486
-7.946921547407927,7.934852123260498
-7.9430951409681345,7.934553146362305
-7.920818811243059,7.917996883392334
-8.021868103338793,7.941225528717041
-7.9393021526221474,7.931316375732422
-7.9430951409681345,7.951051235198975
-7.954677021213342,7.945255279541016
-7.920818811243059,7.905445098876953
-7.950781972366453,7.9441986083984375
-7.903090094245322,7.933854103088379
-7.935542022791058,7.944281101226807
-7.924453006674053,7.914155006408691
-7.9393021526221474,7.956579685211182
-7.928117974144348,7.912143707275391
-7.931814161156377,7.93570613861084
-7.950781972366453,7.938744068145752
-7.882728704344236,7.944247722625732
-7.9393021526221474,7.953385353088379
-7.946921547407927,7.911068916320801
-7.950781972366453,7.939632892608643
-7.924453006674053,7.934367656707764
-7.928117974144348,7.948876857757568
-7.946921547407927,7.9456658363342285
-7.879425560900211,7.93898344039917
-7.903090094245322,7.909363746643066
-7.924453006674053,7.91975736618042
-7.995678626217357,7.921934604644775
-7.946921547407927,7.93256139755249
-7.962737687758908,7.985989093780518
-7.853872762493711,7.925653457641602
-7.946921547407927,7.945301055908203
-7.8761493177145505,7.919780254364014
-7.845056321514322,7.896965503692627
-7.982923651140671,7.94571590423584
-7.954677021213342,7.963705062866211
-7.950781972366453,7.9753570556640625
-7.950781972366453,7.937840461730957
-7.96257349994767,7.96878719329834
-7.954677021213342,7.941359043121338
-7.946921547407927,7.936346530914307
-7.892790308673911,7.928400039672852
-7.935542022791058,7.931999683380127
-7.920818811243059,7.921112060546875
-7.913640203677234,7.912746906280518
-7.950781972366453,7.972635746002197
-7.946921547407927,7.954104900360107
-7.9430951409681345,7.912033557891846
-7.946921547407927,7.9040913581848145
-7.889410352488291,7.900914669036865
-7.954677021213342,7.957481861114502
-7.9393021526221474,7.947220325469971
-7.91721462968355,7.943946838378906
-7.924453006674053,7.926602840423584
-7.913640203677234,7.951598167419434
-7.9430951409681345,7.934930324554443
-7.892790308673911,7.931922435760498
-7.920818811243059,7.961359024047852
-7.91721462968355,7.890636920928955
-7.950781972366453,7.951318264007568
-7.928117974144348,7.931493282318115
-7.995678626217357,7.960216999053955
-7.925009000125929,7.940310955047607
-7.920818811243059,7.887308597564697
-7.8416326138557455,7.891345500946045
-7.950781972366453,7.937958240509033
-7.924453006674053,7.909500598907471
-7.9393021526221474,7.927552700042725
-7.946921547407927,7.9436469078063965
-7.879425560900211,7.914066791534424
-7.924453006674053,7.961510181427002
-7.9430951409681345,7.953014850616455
-7.954677021213342,7.954732894897461
-7.924453006674053,7.927127361297607
-7.970532618892763,7.961158752441406
-7.954677021213342,7.928897380828857
-7.924453006674053,7.9179911613464355
-7.9178264228074555,7.949862480163574
-7.9430951409681345,7.952525615692139
-7.906578398789698,7.919646739959717
-7.892790308673911,7.94061803817749
-7.935542022791058,7.920274257659912
-7.950781972366453,7.939992427825928
-7.8349671212224035,7.927778720855713
-7.990339285400088,7.978497505187988
-7.954677021213342,7.94624137878418
-7.896196359268842,7.933669090270996
-7.924453006674053,7.919954299926758
-7.935542022791058,7.947790622711182
-7.950781972366453,7.952819347381592
-7.950781972366453,7.9238433837890625
-7.946921547407927,7.947417736053467
-7.950781972366453,7.930469989776611
-7.91721462968355,7.9185051918029785
-7.935542022791058,7.928419589996338
-7.9317376797944785,7.9280900955200195
-7.931814161156377,7.9224419593811035
-7.8728955601551585,7.931555271148682
-7.928117974144348,7.93844747543335
-7.9430951409681345,7.9248480796813965
-7.954677021213342,7.947184085845947
-7.924453006674053,7.927995204925537
-7.910094953104535,7.942524433135986
-7.886056354845152,7.933480262756348
-7.928117974144348,7.9164862632751465
-7.906578398789698,7.912791728973389
-7.921654300471129,7.949209690093994
-7.9913998274291025,7.965632915496826
-7.950781972366453,7.955500602722168
-7.920818811243059,7.940280437469482
-7.924453006674053,7.9343581199646
-7.866459873882536,7.907376289367676
-7.954677021213342,7.947096347808838
-7.946921547407927,7.9435296058654785
-7.9393021526221474,7.934904098510742
-7.928117974144348,7.930975914001465
-7.946921547407927,7.93569803237915
-7.954677021213342,7.976284503936768
-7.91721462968355,7.926882266998291
-7.935542022791058,7.915243625640869
-7.950781972366453,7.9607062339782715
-7.9393021526221474,7.911866188049316
-7.946921547407927,7.945486545562744
-7.950781972366453,7.952521324157715
-7.9393021526221474,7.948637008666992
-7.935542022791058,7.931660175323486
-7.920818811243059,7.913419723510742
-7.950781972366453,7.957963466644287
-7.968205654382864,7.958853721618652
-7.906578398789698,7.926218032836914
-7.906578398789698,7.880460262298584
-7.950781972366453,7.95382833480835
-7.892790308673911,7.9375529289245605
-7.950781972366453,7.955206871032715
-7.9393021526221474,7.928651332855225
-7.931814161156377,7.935348033905029
-7.924453006674053,7.9460906982421875
-7.935542022791058,7.950385570526123
-7.931814161156377,7.92311429977417
-7.903090094245322,7.902745723724365
-7.928117974144348,7.913656234741211
-7.931814161156377,7.951962947845459
-7.946921547407927,7.932723045349121
-7.950781972366453,7.955778121948242
-7.935542022791058,7.942587375640869
-7.924453006674053,7.890440464019775
-7.924453006674053,7.912750720977783
-7.895396032658235,7.933573246002197
-7.935542022791058,7.9530930519104
-7.924453006674053,7.950473785400391
-7.913640203677234,7.964822769165039
-7.903090094245322,7.925881385803223
-7.944934810975955,7.921335220336914
-7.928117974144348,7.914494514465332
-7.954677021213342,7.949232578277588
-7.91721462968355,7.943628787994385
-7.928117974144348,7.89068078994751
-7.953077439301119,7.9671735763549805
-7.920818811243059,7.917060375213623
-7.924453006674053,7.926046371459961
-7.931814161156377,7.949195384979248
-7.924453006674053,7.924513339996338
-7.903090094245322,7.9559550285339355
-7.9317759187918355,7.941098690032959
-7.946921547407927,7.942924976348877
-7.903090094245322,7.928395748138428
-7.924453006674053,7.9178786277771
-7.982923651140671,7.942996025085449
-7.931814161156377,7.935750484466553
-7.950781972366453,7.9340386390686035
-7.946921547407927,7.938242435455322
-7.950781972366453,7.916541576385498
-7.935542022791058,7.913634300231934
-7.886056354845152,7.933679103851318
-7.889410352488291,7.929781913757324
-7.982966659490206,7.966087818145752
-7.931814161156377,7.955801010131836
-7.954677021213342,7.94077205657959
-7.931814161156377,7.909997940063477
-7.950781972366453,7.9309210777282715
-7.89962956062971,7.946482181549072
-7.96257349994767,7.933966159820557
-7.920818811243059,7.904664516448975
-7.946921547407927,7.944513320922852
-7.935542022791058,7.892584800720215
-7.935542022791058,7.951547145843506
-7.931814161156377,7.928009510040283
-7.978895913358191,7.984192848205566
-7.950781972366453,7.9401469230651855
-7.9393021526221474,7.901354789733887
-7.928117974144348,7.93544864654541
-7.9393021526221474,7.926725387573242
-7.950781972366453,7.949103355407715
-7.910094953104535,7.933640956878662
-7.9323996276632,7.915040493011475
-7.954677021213342,7.948965549468994
-7.931814161156377,7.933000564575195
-7.823919469453418,7.904971122741699
-7.9430951409681345,7.949096202850342
-7.946921547407927,7.953294277191162
-7.954677021213342,7.960618019104004
-7.950781972366453,7.940829753875732
-7.89962956062971,7.916430473327637
-7.928117974144348,7.936130046844482
-7.950781972366453,7.936954975128174
-7.877418782738375,7.906014919281006
-7.910094953104535,7.918330669403076
-7.954677021213342,7.937840938568115
-7.935542022791058,7.9369306564331055
-7.987162773987728,7.93412446975708
-7.8728955601551585,7.947667598724365
-7.928117974144348,7.951817512512207
-7.9913998274291025,7.969001293182373
-7.950781972366453,7.9166483879089355
-7.9319299849042615,7.938507556915283
-7.946921547407927,7.943482398986816
-7.950781972366453,7.947133541107178
-7.878606331107103,7.962691307067871
-7.903090094245322,7.916851043701172
-7.928117974144348,7.925967693328857
-7.903090094245322,7.916551113128662
-7.950781972366453,7.939761638641357
-7.954677021213342,7.94298791885376
-7.928117974144348,7.946777820587158
-7.935542022791058,7.934966564178467
-7.844664854175832,7.905760288238525
-7.882728704344236,7.938519477844238
-7.96257349994767,7.930886268615723
-7.946921547407927,7.925450801849365
-7.91721462968355,7.92402982711792
-7.931814161156377,7.911259174346924
-7.924453006674053,7.9277167320251465
-7.913640203677234,7.893316745758057
-7.928117974144348,7.947238922119141
-7.924453006674053,7.926685810089111
-7.889410352488291,7.938999652862549
-7.931814161156377,7.959855556488037
-7.9393021526221474,7.926153182983398
-7.9393021526221474,7.927036285400391
-7.9393021526221474,7.919745922088623
-7.913640203677234,7.9213786125183105
-7.89962956062971,7.891303062438965
-7.903090094245322,7.926234722137451
-7.94094624659741,7.934664726257324
-7.950781972366453,7.924825191497803
-7.950781972366453,7.9733662605285645
-7.866459873882536,7.913761138916016
-7.931814161156377,7.885226249694824
-7.935542022791058,7.9467973709106445
-7.954677021213342,7.946235179901123
-7.931814161156377,7.9511590003967285
-7.9393021526221474,7.9276227951049805
-7.923581356476356,7.903343677520752
-7.950781972366453,7.938624382019043
-7.954677021213342,7.938287258148193
-7.954677021213342,7.936463832855225
-7.946921547407927,7.923956394195557
-7.9430951409681345,7.953780651092529
-7.920818811243059,7.9068450927734375
-7.928117974144348,7.949916839599609
-7.93468629292431,7.936720848083496
-7.924453006674053,7.924866676330566
-7.9393021526221474,7.906249523162842
-7.9393021526221474,7.924774646759033
-7.91721462968355,7.920084476470947
-7.946921547407927,7.907442092895508
-7.869665979871627,7.908274173736572
-7.931814161156377,7.940551280975342
-7.946921547407927,7.93593168258667
-7.8728955601551585,7.92716646194458
-7.89962956062971,7.894160747528076
-7.954677021213342,7.970961093902588
-7.995678626217357,7.97088098526001
-7.9393021526221474,7.908432483673096
-7.950781972366453,7.95367956161499
-7.906578398789698,7.909774303436279
-7.920818811243059,7.913681507110596
-7.935542022791058,7.978336334228516
-7.9393021526221474,7.916844367980957
-7.924453006674053,7.920396327972412
-7.939379961634402,7.858243465423584
-7.924453006674053,7.92456579208374
-7.950781972366453,7.934042453765869
-7.946921547407927,7.896620750427246
-7.896196359268842,7.921133518218994
-7.906578398789698,7.945016860961914
-7.9393021526221474,7.942379474639893
-7.935542022791058,7.921271800994873
-7.982923651140671,7.950563907623291
-7.906578398789698,7.916345119476318
-7.958607309235428,7.970839977264404
-7.924453006674053,7.93079948425293
-7.928117974144348,7.95584774017334
-7.966617665152964,7.961429119110107
-7.8728955601551585,7.903569221496582
-7.931814161156377,7.931407928466797
-7.950781972366453,7.944614887237549
-7.913640203677234,7.939850330352783
-7.950781972366453,7.976088047027588
-7.924453006674053,7.934919834136963
-7.9430951409681345,7.924305438995361
-7.950781972366453,7.925368785858154
-7.924453006674053,7.916346549987793
-7.931814161156377,7.929100036621094
-7.946921547407927,7.9350714683532715
-7.920818811243059,7.932371139526367
-7.91721462968355,7.937646389007568
-7.906578398789698,7.903783321380615
-7.954677021213342,7.925227642059326
-7.946921547407927,7.91022253036499
-7.892790308673911,7.926082134246826
-7.928117974144348,7.9233551025390625
-7.91721462968355,7.9376068115234375
-7.9393021526221474,7.948846340179443
-7.920818811243059,7.939912796020508
-7.920818811243059,7.9226508140563965
-7.954677021213342,7.950673580169678
-7.8728955601551585,7.914186000823975
-7.954677021213342,7.944331645965576
-7.954677021213342,7.9373674392700195
-7.928117974144348,7.92147159576416
-7.954677021213342,7.950157642364502
-7.950781972366453,7.936154842376709
-7.935542022791058,7.948604106903076
-7.913640203677234,7.904509544372559
-7.931814161156377,7.953690528869629
-7.935542022791058,7.935140132904053
-7.987162773987728,7.968795299530029
-7.866185328564197,7.9002485275268555
-7.954677021213342,7.976958274841309
-7.924453006674053,7.962975978851318
-7.9393021526221474,7.906924724578857
-7.860820732007034,7.9241204261779785
-7.892790308673911,7.9000396728515625
-7.860119116630385,7.912924766540527
-7.91721462968355,7.9307026863098145
-7.869665979871627,7.938034534454346
-7.80966502563657,7.868818283081055
-7.946921547407927,7.9255805015563965
-7.946921547407927,7.961779594421387
-7.9393021526221474,7.926218032836914
-7.920818811243059,7.922457218170166
-7.931814161156377,7.9189839363098145
-7.928117974144348,7.929083347320557
-7.838628495628443,7.895241737365723
-7.9393021526221474,7.957417011260986
-7.950781972366453,7.953273296356201
-7.954677021213342,7.94752836227417
-7.954677021213342,7.930253982543945
-7.950781972366453,7.939327716827393
-7.886056354845152,7.927136421203613
-7.975453335860696,7.939537048339844
-7.931814161156377,7.936425685882568
-7.906542242015022,7.936460971832275
-7.946921547407927,7.940484523773193
-7.906578398789698,7.932215213775635
-7.924453006674053,7.945269584655762
-7.9393021526221474,7.917489528656006
-7.913640203677234,7.936689853668213
-7.9393021526221474,7.929501056671143
-7.913640203677234,7.934677600860596
-7.920818811243059,7.911095142364502
-7.995678626217357,7.959702968597412
-7.954677021213342,7.96339225769043
-7.950781972366453,7.952147960662842
-7.89962956062971,7.94676399230957
-7.982923651140671,7.927868366241455
-7.886056354845152,7.937430381774902
-7.935542022791058,7.956074237823486
-7.954677021213342,7.97515344619751
-7.8499263047712216,7.915847301483154
-7.946921547407927,7.930383205413818
-7.889410352488291,7.954760551452637
-7.954677021213342,7.954466342926025
-7.9430951409681345,7.93391752243042
-7.9430951409681345,7.922390460968018
-7.9393021526221474,7.936483860015869
-7.931814161156377,7.921639919281006
-7.847706165863548,7.892159938812256
-7.920818811243059,7.899704456329346
-7.844664854175832,7.870909690856934
-7.924453006674053,7.916515827178955
-7.9393021526221474,7.932196617126465
-7.856986114171083,7.911083698272705
-7.950781972366453,7.956778049468994
-7.863280055279963,7.925801753997803
-7.903090094245322,7.927685260772705
-7.9430951409681345,7.926512241363525
-7.928117974144348,7.970578670501709
-7.89962956062971,7.930307865142822
-7.950781972366453,7.932496547698975
-7.946921547407927,7.93137264251709
-7.991531413298041,7.99716854095459
-7.931814161156377,7.93418550491333
-7.946921547407927,7.9336838722229
-7.920818811243059,7.913242816925049
-7.950781972366453,7.946328163146973
-7.9393021526221474,7.92945671081543
-7.9393021526221474,7.955214977264404
-7.892790308673911,7.8871941566467285
-7.856986114171083,7.923455715179443
-7.954677021213342,7.945623874664307
-7.950781972366453,7.942680835723877
-7.950781972366453,7.957899570465088
-7.924453006674053,7.928798198699951
-7.924453006674053,7.91050386428833
-7.935542022791058,7.9512505531311035
-7.954677021213342,7.949368953704834
-7.950781972366453,7.925483703613281
-7.9393021526221474,7.9348978996276855
-7.91721462968355,7.914144992828369
-7.829768510087842,7.916220664978027
-7.946921547407927,7.938973903656006
-7.91721462968355,7.947003364562988
-7.879425560900211,7.9431633949279785
-7.920818811243059,7.912792682647705
-7.892790308673911,7.901086330413818
-7.995678626217357,7.954178333282471
-7.903090094245322,7.932932376861572
-7.9430951409681345,7.911988735198975
-7.935542022791058,7.929031848907471
-7.931814161156377,7.919189929962158
-7.935542022791058,7.937093257904053
-7.950781972366453,7.941922664642334
-7.950781972366453,7.947476863861084
-7.954677021213342,7.940164566040039
-7.928117974144348,7.896326541900635
-7.954677021213342,7.950311183929443
-7.931814161156377,7.921709060668945
-7.924453006674053,7.921806335449219
-7.913640203677234,7.928757667541504
-7.9430951409681345,7.956418514251709
-7.928117974144348,7.928238391876221
-7.920818811243059,7.91957950592041
-7.954677021213342,7.950165271759033
-7.879425560900211,7.906566619873047
-7.863280055279963,7.910932540893555
-7.995678626217357,7.985327243804932
-7.946921547407927,7.92281436920166
-7.91721462968355,7.945204257965088
-7.935542022791058,7.93598747253418
-7.954677021213342,7.910163402557373
-7.9913998274291025,7.953015327453613
-7.954677021213342,7.950432300567627
-7.924453006674053,7.9261040687561035
-7.946921547407927,7.935366153717041
-7.924453006674053,7.919642448425293
-7.950781972366453,7.916378498077393
-7.931814161156377,7.954569339752197
-7.946921547407927,7.95189905166626
-7.91721462968355,7.918116092681885
-7.916754118885,7.924123287200928
-7.82102305270683,7.949164867401123
-7.935734864536909,7.924861431121826
-7.9393021526221474,7.942866802215576
-7.920818811243059,7.894026279449463
-7.9393021526221474,7.898512363433838
-7.931814161156377,7.9259467124938965
-7.924453006674053,7.931304931640625
-7.924453006674053,7.934030055999756
-7.954677021213342,7.969137668609619
-7.995678626217357,7.94878625869751
-7.946921547407927,7.952265739440918
-7.838628495628443,7.906778812408447
-7.931814161156377,7.917000770568848
-7.950781972366453,7.955920219421387
-7.950781972366453,7.9409565925598145
-7.906578398789698,7.933473110198975
-7.9737577757544535,7.960277557373047
-7.950781972366453,7.918547630310059
-7.950781972366453,7.961999416351318
-7.913640203677234,7.937819004058838
-7.9393021526221474,7.948488712310791
-7.935542022791058,7.929614067077637
-7.950781972366453,7.950811386108398
-7.91721462968355,7.935528755187988
-7.954677021213342,7.941816806793213
-7.8761493177145505,7.895880699157715
-7.928117974144348,7.918690204620361
-7.950781972366453,7.957468509674072
-7.912546261746637,7.915241718292236
-7.924453006674053,7.9258527755737305
-7.946921547407927,7.950799942016602
-7.946921547407927,7.929220199584961
-7.91721462968355,7.929201602935791
-7.926474926395767,7.9304656982421875
-7.913640203677234,7.905820846557617
-7.928117974144348,7.966954708099365
-7.928117974144348,7.945211410522461
-7.910094953104535,7.91508150100708
-7.9430951409681345,7.953854560852051
-7.954677021213342,7.932147979736328
-7.9393021526221474,7.928560733795166
-7.950781972366453,7.9504547119140625
-7.950781972366453,7.9598565101623535
-7.995678626217357,7.963140964508057
-7.931814161156377,7.9287214279174805
-7.924453006674053,7.915772438049316
-7.954677021213342,7.951910495758057
-7.9393021526221474,7.937978744506836
-7.931814161156377,7.910960674285889
-7.946921547407927,7.937320232391357
-7.931814161156377,7.928379535675049
-7.829768510087842,7.90142297744751
-7.889410352488291,7.930487155914307
-7.954677021213342,7.971096515655518
-7.954677021213342,7.946327209472656
-7.928117974144348,7.940092086791992
-7.935542022791058,7.931448459625244
-7.954677021213342,7.952653884887695
-7.954677021213342,7.969502925872803
-7.950781972366453,7.954885005950928
-7.950781972366453,7.924784183502197
-7.856986114171083,7.924025058746338
-7.832673025823477,7.910066604614258
-7.982923651140671,7.925583362579346
-7.9393021526221474,7.933004856109619
-7.89962956062971,7.932739734649658
-7.931814161156377,7.93449592590332
-7.935542022791058,7.912787914276123
-7.920818811243059,7.918271541595459
-7.853872762493711,7.8944501876831055
-7.913923212296786,7.948256015777588
-7.931814161156377,7.93538761138916
-7.9430951409681345,7.935361385345459
-7.91721462968355,7.92875337600708
-7.950781972366453,7.915113925933838
-7.946921547407927,7.935327529907227
-7.946921547407927,7.945158958435059
-7.9430951409681345,7.935116767883301
-7.85078088734462,7.924378871917725
-7.89102837972676,7.917856693267822
-7.954677021213342,7.932461738586426
-7.950781972366453,7.939446926116943
-7.974694136660875,7.960404872894287
-7.954677021213342,7.923874855041504
-7.950781972366453,7.932999134063721
-7.9393021526221474,7.895748138427734
-7.9430951409681345,7.938374996185303
-7.946921547407927,7.941262722015381
-7.9393021526221474,7.887730598449707
-7.924453006674053,7.912878513336182
-7.970532618892763,7.959621906280518
-7.950781972366453,7.939359188079834
-7.9393021526221474,7.955647945404053
-7.892790308673911,7.947202205657959
-7.9393021526221474,7.926308631896973
-7.894231790888085,7.940779209136963
-7.950781972366453,7.9668354988098145
-7.9393021526221474,7.945003986358643
-7.950781972366453,7.946835517883301
-7.946921547407927,7.933762073516846
-7.954677021213342,7.945629596710205
-7.924453006674053,7.927867412567139
-7.946921547407927,7.94836950302124
-7.938964847901857,7.965639591217041
-7.91721462968355,7.942094326019287
-7.950781972366453,7.929962635040283
-7.950781972366453,7.9326491355896
-7.924453006674053,7.922013759613037
-7.930395825138251,7.898108959197998
-7.950781972366453,7.952109336853027
-7.995678626217357,7.969527721405029
-7.950781972366453,7.93697452545166
-7.950781972366453,7.938126564025879
-7.950781972366453,7.9537153244018555
-7.903090094245322,7.935034275054932
-7.924453006674053,7.934188365936279
-7.935542022791058,7.947631359100342
-7.910094953104535,7.915038108825684
-7.950781972366453,7.962640285491943
-7.9393021526221474,7.94274377822876
-7.950781972366453,7.937263488769531
-7.924453006674053,7.92003870010376
-7.89962956062971,7.960812568664551
-7.885240505812072,7.974600791931152
-7.928117974144348,7.930158615112305
-7.954677021213342,7.954613208770752
-7.924453006674053,7.892266750335693
-7.85078088734462,7.899417400360107
-7.910094953104535,7.922047138214111
-7.935542022791058,7.946641445159912
-7.9430951409681345,7.943958759307861
-7.950781972366453,7.932377815246582
-7.954677021213342,7.962962627410889
-7.924453006674053,7.939468860626221
-7.935542022791058,7.925344944000244
-7.950781972366453,7.962151050567627
-7.928117974144348,7.951950550079346
-7.931814161156377,7.925904750823975
-7.946921547407927,7.934382915496826
-7.920818811243059,7.903597354888916
-7.924453006674053,7.92525577545166
-7.950781972366453,7.946108818054199
-7.928117974144348,7.923819065093994
-7.924453006674053,7.920412540435791
-7.924453006674053,7.906478404998779
-7.89962956062971,7.926917552947998
-7.903090094245322,7.924561500549316
-7.950781972366453,7.944075107574463
-7.954677021213342,7.920501232147217
-7.950781972366453,7.96503210067749
-7.946921547407927,7.918021202087402
-7.903090094245322,7.931423664093018
-7.9393021526221474,7.926823139190674
-7.9430951409681345,7.940925121307373
-7.903090094245322,7.921442985534668
-7.828808459121975,7.909775257110596
-7.954677021213342,7.941115856170654
-7.950781972366453,7.9312310218811035
-7.950781972366453,7.947155952453613
-7.954677021213342,7.930612564086914
-7.950781972366453,7.953211307525635
-7.941194505965742,7.936750888824463
-7.946921547407927,7.967494010925293
-7.9059218090964904,7.903565883636475
-7.924453006674053,7.92995023727417
-7.954677021213342,7.940957546234131
-7.9393021526221474,7.973310947418213
-7.9393021526221474,7.941198825836182
-7.946921547407927,7.928155422210693
-7.995678626217357,7.966439247131348
-7.935542022791058,7.945148944854736
-7.9393021526221474,7.9471917152404785
-7.954677021213342,7.967427730560303
-7.935542022791058,7.902822494506836
-7.79317412396815,7.93385124206543
-7.954677021213342,7.962639808654785
-7.954677021213342,7.971797466278076
-7.931814161156377,7.934683322906494
-7.9393021526221474,7.934289932250977
-7.806866690314549,7.918043613433838
-8.013136044317282,7.9769744873046875
-7.860119116630385,7.894533634185791
-7.924453006674053,7.941051006317139
-7.928117974144348,7.938212871551514
-7.935542022791058,7.928905963897705
-7.928117974144348,7.925702095031738
-7.978895913358191,7.966187000274658
-7.950781972366453,7.9323554039001465
-7.931814161156377,7.93075704574585
-7.982966659490206,7.969485759735107
-7.954677021213342,7.958274841308594
-7.928117974144348,7.9161481857299805
-7.9393021526221474,7.933908939361572
-7.954677021213342,7.952967166900635
-7.954677021213342,7.946094989776611
-7.950781972366453,7.950808525085449
-7.931814161156377,7.969735622406006
-7.989586925059168,7.966557025909424
-7.924453006674053,7.934244632720947
-7.9393021526221474,7.950897216796875
-7.896196359268842,7.9123148918151855
-7.954677021213342,7.968295097351074
-7.931814161156377,7.950103282928467
-7.946921547407927,7.930806636810303
-7.920818811243059,7.910410404205322
-7.946921547407927,7.91046667098999
-7.91721462968355,7.941870212554932
-7.9430951409681345,7.940772533416748
-7.946921547407927,7.91245174407959
-7.954677021213342,7.97029447555542
-7.9430951409681345,7.940292835235596
-7.950781972366453,7.951003551483154
-7.946921547407927,7.943530559539795
-7.928117974144348,7.927522659301758
-7.954677021213342,7.949068069458008
-7.913640203677234,7.917349338531494
-7.922491400135772,7.93589973449707
-7.924453006674053,7.925949573516846
-7.954677021213342,7.946005344390869
-7.9393021526221474,7.936680316925049
-7.896196359268842,7.92927885055542
-7.978895913358191,7.94223165512085
-7.879425560900211,7.912904262542725
-7.946921547407927,7.938801288604736
-7.87782536851803,7.898751735687256
-7.954677021213342,7.950594902038574
-7.866459873882536,7.888772487640381
-7.924453006674053,7.927651882171631
-7.903090094245322,7.912939071655273
-7.950781972366453,7.929025650024414
-7.9430951409681345,7.897202014923096
-7.950781972366453,7.927629470825195
-7.9430951409681345,7.9484028816223145
-7.91721462968355,7.901048183441162
-7.95090181210265,7.9379563331604
-7.935542022791058,7.920527458190918
-7.970532618892763,7.967951774597168
-7.862652575359676,7.931198596954346
-7.950781972366453,7.9331865310668945
-7.920818811243059,7.926056385040283
-7.935542022791058,7.925173282623291
-7.943055911701025,7.945169925689697
-7.946921547407927,7.915347576141357
-7.913640203677234,7.920206069946289
-7.995678626217357,7.964284420013428
-7.928117974144348,7.925541877746582
-7.9430951409681345,7.94342041015625
-7.928117974144348,7.9438629150390625
-7.931814161156377,7.9047160148620605
-7.950781972366453,7.948450565338135
-7.913640203677234,7.941776275634766
-7.928117974144348,7.937544345855713
-7.935542022791058,7.921233654022217
-8.008819571765459,8.029172897338867
-7.920818811243059,7.947502613067627
-7.924453006674053,7.925585746765137
-7.920818811243059,7.89461088180542
-7.9393021526221474,7.928853511810303
-7.935542022791058,7.940175533294678
-7.860119116630385,7.931807518005371
-7.946921547407927,7.916334629058838
-7.856986114171083,7.961406230926514
-7.9430951409681345,7.9184393882751465
-7.928117974144348,7.916879177093506
-7.946921547407927,7.941407680511475
-7.903090094245322,7.930203437805176
-7.950781972366453,7.947480201721191
-7.9393021526221474,7.933084964752197
-7.924453006674053,7.950088977813721
-7.946921547407927,7.939625263214111
-7.915102650305338,7.925347328186035
-7.832673025823477,7.884214401245117
-7.922491400135772,7.9356184005737305
-7.920818811243059,7.921281337738037
-7.928117974144348,7.9247145652771
-7.936131689340937,7.938806056976318
-7.935542022791058,7.916081428527832
-7.896196359268842,7.912970542907715
-7.950781972366453,7.9441399574279785
-7.950781972366453,7.9387359619140625
-7.924453006674053,7.92970609664917
-7.924453006674053,7.915223121643066
-7.9393021526221474,7.911585330963135
-7.91721462968355,7.934776306152344
-7.8728955601551585,7.928707599639893
-7.946921547407927,7.923020839691162
-7.928117974144348,7.932117462158203
-7.879425560900211,7.879876136779785
-7.928117974144348,7.948096752166748
-7.8434189201724,7.932357311248779
-7.946921547407927,7.945096492767334
-7.924453006674053,7.904726028442383
-7.924453006674053,7.931185245513916
-7.920818811243059,7.953359127044678
-7.9430951409681345,7.952308177947998
-7.931814161156377,7.9179253578186035
-7.8761493177145505,7.887268543243408
-7.995678626217357,7.944319725036621
-7.915575394493873,7.915979862213135
-7.950781972366453,7.941399097442627
-7.903090094245322,7.935645580291748
-7.978810702253626,7.991528511047363
-7.950781972366453,7.947271347045898
-7.950781972366453,7.9423980712890625
-7.806866690314549,7.880360126495361
-7.9430951409681345,7.915305137634277
-7.9393021526221474,7.931723117828369
-7.954677021213342,7.927553653717041
-7.950781972366453,7.937962055206299
-7.943055911701025,7.955076217651367
-7.950781972366453,7.952754497528076
-7.9393021526221474,7.909928798675537
-7.954677021213342,7.924684524536133
-7.946921547407927,7.914378643035889
-7.954677021213342,7.95505952835083
-7.954677021213342,7.9542365074157715
-7.924453006674053,7.941554069519043
-7.954677021213342,7.976685523986816
-7.950781972366453,7.930655002593994
-7.928117974144348,7.952815532684326
-7.954677021213342,7.925782203674316
-7.9393021526221474,7.909465312957764
-7.924453006674053,7.931617259979248
-7.924453006674053,7.920488357543945
-7.935542022791058,7.949526309967041
-7.935542022791058,7.957455635070801
-7.889410352488291,7.899176120758057
-7.970532618892763,7.937317371368408
-7.928117974144348,7.908668518066406
-7.950781972366453,7.948197841644287
-7.9200659509493825,7.948058605194092
-7.89962956062971,7.935039043426514
-7.946921547407927,7.925893783569336
-7.946921547407927,7.916603088378906
-7.950781972366453,7.919991970062256
-7.954677021213342,7.964745044708252
-7.970532618892763,7.976416110992432
-7.863280055279963,7.945558071136475
-7.946921547407927,7.944794654846191
-7.924453006674053,7.911741733551025
-7.917356228997307,7.9261555671691895
-7.958607309235428,7.947059154510498
-7.879425560900211,7.928500175476074
-7.931814161156377,7.94520902633667
-7.910094953104535,7.915299415588379
-7.910094953104535,7.915246486663818
-7.928117974144348,7.927657604217529
-7.970532618892763,7.965172290802002
-7.950781972366453,7.938259601593018
-7.924453006674053,7.927964687347412
-7.946921547407927,7.954124927520752
-7.946921547407927,7.9622673988342285
-7.923581356476356,7.930281639099121
-7.9430951409681345,7.942537784576416
-7.9430951409681345,7.9362921714782715
-7.946921547407927,7.951615810394287
-7.995678626217357,7.973036766052246
-7.889410352488291,7.915940284729004
-7.950781972366453,7.94804048538208
-7.91721462968355,7.940803527832031
-7.91591683954189,7.917727947235107
-7.931814161156377,7.947531700134277
-7.924453006674053,7.9363884925842285
-7.9430951409681345,7.974212646484375
-7.935542022791058,7.929783344268799
-7.950781972366453,7.934942245483398
-7.924453006674053,7.940685272216797
-7.946921547407927,7.932084560394287
-7.89962956062971,7.918299674987793
-7.958607309235428,7.959196090698242
-7.995678626217357,7.928028583526611
-7.966617665152964,7.941051483154297
-7.920818811243059,7.904811382293701
-7.935542022791058,7.91538143157959
-7.928117974144348,7.921885967254639
-7.89962956062971,7.92570161819458
-7.946921547407927,7.940735340118408
-7.982923651140671,7.929401874542236
-7.935542022791058,7.92424201965332
-7.935542022791058,7.900628089904785
-7.950781972366453,7.943669319152832
-7.950781972366453,7.928029537200928
-7.954677021213342,7.951041221618652
-7.908651212535908,7.928933620452881
-7.954677021213342,7.946391582489014
-7.948658283730227,7.926425933837891
-7.869665979871627,7.906837463378906
-7.920818811243059,7.93615198135376
-7.942033487170233,7.967833042144775
-7.910094953104535,7.9130144119262695
-7.920818811243059,7.927889347076416
-7.954677021213342,7.940134525299072
-7.954677021213342,7.966408729553223
-7.870077682537097,7.901710510253906
-7.924453006674053,7.91580057144165
-7.954677021213342,7.9291276931762695
-7.9430951409681345,7.895195484161377
-7.9393021526221474,7.904994964599609
-7.91721462968355,7.950235366821289
-7.847639088350085,7.8819732666015625
-7.950781972366453,7.960211753845215
-7.883703936864327,7.898513317108154
-7.950781972366453,7.924654006958008
-7.8761493177145505,7.885340213775635
-7.924453006674053,7.951000690460205
-7.946921547407927,7.940026760101318
-7.928117974144348,7.930826663970947
-7.954677021213342,7.935741901397705
-7.924453006674053,7.947123050689697
-7.954677021213342,7.9850897789001465
-7.950781972366453,7.947609901428223
-7.9393021526221474,7.946234226226807
-7.954677021213342,7.956501483917236
-7.946921547407927,7.945641994476318
-7.856986114171083,7.931967258453369
-7.838628495628443,7.915805816650391
-7.9393021526221474,7.949881076812744
-7.9430951409681345,7.935776233673096
-7.924453006674053,7.929762363433838
-7.892790308673911,7.9260029792785645
-7.906578398789698,7.900547981262207
-7.954677021213342,7.952653884887695
-7.903898502189827,7.92094087600708
-7.946921547407927,7.948659896850586
-7.950781972366453,7.947437763214111
-7.91721462968355,7.940823078155518
-7.9430951409681345,7.931210041046143
-7.906578398789698,7.91314697265625
-7.910094953104535,7.924776554107666
-7.948686988379175,7.938642978668213
-7.966576241738391,7.966944217681885
-7.950781972366453,7.946165084838867
-7.91721462968355,7.879024028778076
-7.982923651140671,7.968653202056885
-7.928117974144348,7.956233501434326
-7.9430951409681345,7.94879674911499
-7.946921547407927,7.961288928985596
-7.924453006674053,7.9202656745910645
-7.892790308673911,7.929427623748779
-7.8728955601551585,7.9008469581604
-7.931814161156377,7.944260120391846
-7.841040732801322,7.966804027557373
-7.924453006674053,7.9063944816589355
-7.9430951409681345,7.953362464904785
-7.892790308673911,7.911566257476807
-7.906578398789698,7.9154558181762695
-7.946921547407927,7.931316375732422
-7.946921547407927,7.902453422546387
-7.896196359268842,7.88754940032959
-7.9430951409681345,7.944437503814697
-7.913640203677234,7.950501918792725
-7.950781972366453,7.937817573547363
-7.939379961634402,7.956338405609131
-7.954677021213342,7.950069427490234
-7.946921547407927,7.942945957183838
-7.928117974144348,7.925929546356201
-7.920818811243059,7.924911022186279
-7.910094953104535,7.935826778411865
-7.9393021526221474,7.9431352615356445
-7.9393021526221474,7.932080268859863
-7.950781972366453,7.930398941040039
-7.832673025823477,7.9009928703308105
-7.950781972366453,7.920542240142822
-7.954677021213342,7.922298908233643
-7.9430951409681345,7.931988716125488
-7.928117974144348,7.9125237464904785
-7.954677021213342,7.9551310539245605
-7.950781972366453,7.945949077606201
-7.860119116630385,7.89828634262085
-7.935542022791058,7.945358753204346
-7.964781356411861,8.038328170776367
-7.928117974144348,7.959433078765869
-7.924453006674053,7.938220977783203
-7.995678626217357,7.9727044105529785
-7.9430951409681345,7.944952011108398
-7.950781972366453,7.949301242828369
-7.910094953104535,7.9160051345825195
-7.910094953104535,7.9369072914123535
-7.910094953104535,7.924315929412842
-7.886056354845152,7.939163684844971
-7.950781972366453,7.961024761199951
-7.924453006674053,7.937829971313477
-7.924453006674053,7.9178667068481445
-7.924453006674053,7.936522960662842
-7.946921547407927,7.945935249328613
-7.883154495902866,7.950075149536133
-7.946921547407927,7.912283420562744
-7.9430951409681345,7.926902770996094
-7.950781972366453,7.955271244049072
-7.954677021213342,7.932905673980713
-7.838693701646425,7.910373687744141
-7.9430951409681345,7.9608988761901855
-7.954677021213342,7.938185214996338
-7.913640203677234,7.905666351318359
-7.954677021213342,7.923956394195557
-7.950781972366453,7.927640438079834
-7.856986114171083,7.919238090515137
-7.920818811243059,7.932956695556641
-7.9393021526221474,7.935985565185547
-7.935542022791058,7.931201457977295
-7.946921547407927,7.9375224113464355
-7.924453006674053,7.933285236358643
-7.924453006674053,7.933577060699463
-7.928117974144348,7.935792922973633
-7.89520802887005,7.919098854064941
-7.886056354845152,7.904806137084961
-7.9430951409681345,7.942899227142334
-7.950781972366453,7.912474155426025
-7.950781972366453,7.935365200042725
-7.995678626217357,8.000720024108887
-7.954677021213342,7.9660868644714355
-7.8416326138557455,7.890567302703857
-7.958607309235428,7.966770648956299
-7.928117974144348,7.941666603088379
-7.946921547407927,7.948346138000488
-7.9430951409681345,7.92547082901001
-7.946921547407927,7.939248561859131
-7.931814161156377,7.886037349700928
-7.9393021526221474,7.930420875549316
-7.982923651140671,7.950364112854004
-7.903090094245322,7.939260959625244
-7.879425560900211,7.919442653656006
-7.935542022791058,7.954775333404541
-7.91721462968355,7.94116735458374
-7.924453006674053,7.914825916290283
-7.995678626217357,7.918048858642578
-7.867052707791308,7.913879871368408
-7.924453006674053,7.913498401641846
-7.9737577757544535,7.963316917419434
-7.982184017551764,7.970053195953369
-7.924453006674053,7.92280912399292
-7.982966659490206,7.942000389099121
-7.9430951409681345,7.94093656539917
-7.928117974144348,7.939393520355225
-7.950781972366453,7.938127040863037
-7.946921547407927,7.942520618438721
-7.903090094245322,7.944108486175537
-7.9048074470140355,7.922591686248779
-7.950781972366453,7.949954509735107
-7.860119116630385,7.921864032745361
-7.946921547407927,7.9368367195129395
-7.924453006674053,7.934708595275879
-7.924453006674053,7.913023471832275
-7.931814161156377,7.930516242980957
-7.978895913358191,7.961370944976807
-7.85205769961263,7.9623541831970215
-7.9393021526221474,7.899945259094238
-7.924453006674053,7.923446178436279
-7.910094953104535,7.928173542022705
-7.924453006674053,7.922328948974609
-7.924453006674053,7.914233684539795
-7.935542022791058,7.907886505126953
-7.931814161156377,7.938370227813721
-7.9393021526221474,7.955615520477295
-7.946921547407927,7.946305751800537
-7.946921547407927,7.9481987953186035
-7.928117974144348,7.936525344848633
-7.954677021213342,7.959651470184326
-7.889410352488291,7.915881633758545
-7.9393021526221474,7.935698509216309
-7.995678626217357,7.979128360748291
-7.954677021213342,7.986331462860107
-7.943055911701025,7.9464497566223145
-7.9393021526221474,7.925065517425537
-7.91721462968355,7.918241024017334
-7.9393021526221474,7.924193382263184
-7.9366741370281915,7.919966220855713
-7.946921547407927,7.909499168395996
-7.946921547407927,7.959534645080566
-7.920818811243059,7.8992204666137695
-7.882141353172741,7.9317402839660645
-7.954677021213342,7.96069860458374
-7.950781972366453,7.94886589050293
-7.892790308673911,7.927336692810059
-7.946921547407927,7.942384719848633
-7.931814161156377,7.905292987823486
-7.937195024046664,7.936478614807129
-7.954677021213342,7.945062160491943
-7.946921547407927,7.989354610443115
-7.935542022791058,7.930581569671631
-7.924453006674053,7.924272060394287
-7.954677021213342,7.9558305740356445
-7.91721462968355,7.935706615447998
-7.924453006674053,7.917697429656982
-7.946921547407927,7.9211344718933105
-7.935542022791058,7.913846015930176
-7.931814161156377,7.907968521118164
-7.954677021213342,7.957766532897949
-7.935542022791058,7.952652931213379
-7.950781972366453,7.94341516494751
-7.950781972366453,7.96016788482666
-7.96981377267859,7.960668563842773
-7.946921547407927,7.942111492156982
-7.828285247977007,7.927675247192383
-7.9430951409681345,7.942944049835205
-7.920818811243059,7.915116310119629
-7.954677021213342,7.942278861999512
-7.9393021526221474,7.934310436248779
-7.935542022791058,7.940861225128174
-7.9393021526221474,7.930820465087891
-7.946921547407927,7.9161787033081055
-7.928117974144348,7.933783054351807
-7.935542022791058,7.936190605163574
-7.9430951409681345,7.947624206542969
-7.916172445666446,7.902435779571533
-7.975453335860696,7.959321975708008
-7.982923651140671,7.934977054595947
-7.946921547407927,7.931253433227539
-7.924453006674053,7.903616905212402
-7.910094953104535,7.913720607757568
-7.918702847281798,7.883971214294434
-7.910094953104535,7.9385457038879395
-7.85078088734462,7.903152942657471
-7.9393021526221474,7.930268287658691
-7.954677021213342,7.950761795043945
-7.950781972366453,7.951486587524414
-7.950781972366453,7.960890293121338
-7.928117974144348,7.925078868865967
-7.954677021213342,7.927811145782471
-7.950781972366453,7.921475887298584
-7.946921547407927,7.932098388671875
-7.982923651140671,7.9306793212890625
-7.954677021213342,7.957176685333252
-7.950781972366453,7.953273296356201
-7.935542022791058,7.935464382171631
-7.928117974144348,7.922023296356201
-7.950781972366453,7.9421539306640625
-7.886522706972261,7.916306018829346
-7.9393021526221474,7.93865966796875
-7.950781972366453,7.9464640617370605
-7.9430951409681345,7.935856819152832
-7.924453006674053,7.8981614112854
-7.954677021213342,7.961390018463135
-7.954677021213342,7.932962894439697
-7.88005421299276,7.926450729370117
-7.950781972366453,7.968662738800049
-7.924453006674053,7.933584690093994
-7.866459873882536,7.905372142791748
-7.950781972366453,7.9487690925598145
-7.924453006674053,7.912800312042236
-7.913640203677234,7.952280044555664
-7.9393021526221474,7.920421600341797
-7.950781972366453,7.945581912994385
-7.950781972366453,7.948106288909912
-7.924453006674053,7.940436840057373
-7.946921547407927,7.9506988525390625
-7.954677021213342,7.977031230926514
-7.946921547407927,7.942922592163086
-7.910094953104535,7.913504123687744
-7.935542022791058,7.928625583648682
-7.9393021526221474,7.933364391326904
-7.928117974144348,7.930539131164551
-7.8761493177145505,7.896217346191406
-7.889410352488291,7.896579265594482
-7.924453006674053,7.934392929077148
-7.950781972366453,7.946383953094482
-7.91721462968355,7.942166805267334
-7.950781972366453,7.948535442352295
-7.911671457687047,7.905305862426758
-7.91721462968355,7.915125370025635
-7.847706165863548,7.91478967666626
-7.924453006674053,7.9568400382995605
-7.950781972366453,7.952441692352295
-7.950838529294059,7.8955488204956055
-7.928117974144348,7.920572280883789
-7.903090094245322,7.936197280883789
-7.954677021213342,7.956284046173096
-7.931814161156377,7.942800998687744
-7.935542022791058,7.902512073516846
-7.924453006674053,7.9240312576293945
-7.9430951409681345,7.945618152618408
-7.879425560900211,7.968899250030518
-7.924453006674053,7.930265426635742
-7.920818811243059,7.923797130584717
-7.9393021526221474,7.879257678985596
-7.950781972366453,7.936329364776611
-7.950781972366453,7.9228835105896
-7.889410352488291,7.915558338165283
-7.935542022791058,7.92709493637085
-7.946921547407927,7.946381092071533
-7.950781972366453,7.968297958374023
-7.970532618892763,7.960555076599121
-7.9430951409681345,7.953256130218506
-7.936316742449531,7.947879791259766
-7.924453006674053,7.915957927703857
-7.954677021213342,7.946768283843994
-7.896196359268842,7.904600620269775
-7.910094953104535,7.92535400390625
-7.950781972366453,7.930349826812744
-7.924453006674053,7.954329967498779
-7.924453006674053,7.950932025909424
-7.9393021526221474,7.918606281280518
-7.9430951409681345,7.967789173126221
-7.910094953104535,7.924546241760254
-7.882728704344236,7.904766082763672
-7.928117974144348,7.935469627380371
-7.950781972366453,7.921171188354492
-7.96257349994767,7.969214916229248
-7.89962956062971,7.956159591674805
-7.924453006674053,7.923550128936768
-7.931814161156377,7.929374694824219
-7.954677021213342,7.9637131690979
-7.978895913358191,7.925406455993652
-7.853872762493711,7.899247646331787
-7.9430951409681345,7.902867794036865
-7.950781972366453,7.935222148895264
-7.906578398789698,7.898662090301514
-7.920818811243059,7.935941696166992
-7.995678626217357,7.9429755210876465
-7.924453006674053,7.941535472869873
-7.946921547407927,7.935431003570557
-7.9393021526221474,7.94078254699707
-7.9393021526221474,7.924135208129883
-7.9299713005399575,7.974083423614502
-7.920818811243059,7.915495872497559
-7.8761493177145505,7.943272590637207
-7.9393021526221474,7.9401326179504395
-7.8416326138557455,7.892717361450195
-7.896196359268842,7.9290852546691895
-7.950781972366453,7.939718723297119
-7.889410352488291,7.931365013122559
-7.946921547407927,7.933411121368408
-7.954677021213342,7.935004711151123
-7.946921547407927,7.969668388366699
-7.950781972366453,7.925997257232666
-7.922491400135772,7.9162092208862305
-7.920818811243059,7.944263935089111
-7.950781972366453,7.9110846519470215
-7.954677021213342,7.961739540100098
-7.987162773987728,7.963362693786621
-7.874955785876363,7.955504894256592
-7.91721462968355,7.944122791290283
-7.950781972366453,7.939095497131348
-7.935542022791058,7.922417163848877
-7.946921547407927,7.93319845199585
-7.93067295654639,7.973421573638916
-7.950781972366453,7.9330878257751465
-7.9393021526221474,7.922694683074951
-7.920818811243059,7.915478229522705
-7.863280055279963,7.932225704193115
-7.9430951409681345,7.941836833953857
-7.9393021526221474,7.947654724121094
-7.946921547407927,7.913637638092041
-7.924453006674053,7.9516377449035645
-7.950781972366453,7.937285900115967
-7.931814161156377,7.931316375732422
-7.889410352488291,7.933879375457764
-7.950781972366453,7.920076847076416
-7.946921547407927,7.948071002960205
-7.928117974144348,7.9140400886535645
-7.920818811243059,7.931033611297607
-7.946921547407927,7.9461846351623535
-7.903090094245322,7.930211544036865
-7.928117974144348,7.918403148651123
-7.970532618892763,7.978581428527832
-7.906578398789698,7.943484306335449
-7.870077682537097,7.927313327789307
-7.931814161156377,7.903587341308594
-7.9430951409681345,7.931680202484131
-7.85078088734462,7.915714740753174
-7.869665979871627,7.9414963722229
-7.939379961634402,7.927120685577393
-7.954677021213342,7.953577518463135
-7.812474702908248,7.893032550811768
-7.9430951409681345,7.948616981506348
-7.931814161156377,7.930477619171143
-7.9430951409681345,7.980987071990967
-7.89962956062971,7.932538032531738
-7.950781972366453,7.929241180419922
-7.954677021213342,7.921238422393799
-7.950781972366453,7.933648586273193
-7.920818811243059,7.922061920166016
-8.026824561605242,7.980396270751953
-7.966617665152964,7.954145908355713
-7.954677021213342,7.983761310577393
-7.954677021213342,7.935206890106201
-7.9200135653594685,7.934147357940674
-7.85078088734462,7.931994915008545
-7.950781972366453,7.939512252807617
-7.963788392246652,7.880982875823975
-7.924453006674053,7.924158573150635
-7.892790308673911,7.8884477615356445
-7.928117974144348,7.9635090827941895
-7.982923651140671,7.988373279571533
-7.9393021526221474,7.93091344833374
-7.9430951409681345,7.950578689575195
-7.924453006674053,7.957504749298096
-7.935542022791058,7.931220531463623
-7.995678626217357,7.932084083557129
-7.935542022791058,7.9526190757751465
-7.910094953104535,7.912896633148193
-7.931814161156377,7.909378528594971
-7.924453006674053,7.931820869445801
-7.950781972366453,7.937413692474365
-7.954677021213342,7.957991123199463
-7.954677021213342,7.95152473449707
-7.946921547407927,7.958352565765381
-7.950781972366453,7.961569309234619
-7.931814161156377,7.920429706573486
-7.995678626217357,7.957712650299072
-7.954677021213342,7.947547435760498
-7.9430951409681345,7.943479061126709
-7.946921547407927,7.932097434997559
-7.928117974144348,7.931502819061279
-7.954677021213342,7.942077159881592
-7.924453006674053,7.925566673278809
-7.920818811243059,7.935399055480957
-7.9393021526221474,7.945471286773682
-7.9393021526221474,7.92862606048584
-7.950781972366453,7.924783706665039
-7.948658283730227,7.952435493469238
-7.931814161156377,7.942447662353516
-7.935542022791058,7.913756847381592
-7.924453006674053,7.930898666381836
-7.924453006674053,7.9412126541137695
-7.892790308673911,7.942333698272705
-7.954677021213342,7.964174747467041
-7.950781972366453,7.949875831604004
-7.9393021526221474,7.9177680015563965
-7.9430951409681345,7.938282489776611
-7.946921547407927,7.934022903442383
-7.9393021526221474,7.924956798553467
-7.946921547407927,7.959752559661865
-7.920818811243059,7.9424285888671875
-7.928117974144348,7.949142932891846
-7.995678626217357,7.928981781005859
-7.935542022791058,7.949487209320068
-7.995678626217357,7.96730375289917
-7.935542022791058,7.910960674285889
-7.954677021213342,7.960899353027344
-7.9393021526221474,7.931746482849121
-7.920818811243059,7.915260314941406
-7.928117974144348,7.943841934204102
-7.89962956062971,7.9568610191345215
-7.924453006674053,7.895760536193848
-7.920818811243059,7.930883884429932
-7.931814161156377,7.931088924407959
-7.928117974144348,7.941736221313477
-7.924453006674053,7.9345598220825195
-7.946921547407927,7.932467937469482
-7.950781972366453,7.949356555938721
-7.924453006674053,7.918516635894775
-7.9393021526221474,7.922648906707764
-7.906578398789698,7.921903610229492
-7.950781972366453,7.964487075805664
-7.954677021213342,7.9449782371521
-7.9430951409681345,7.93967342376709
-7.950781972366453,7.934062957763672
-7.924453006674053,7.917968273162842
-7.950781972366453,7.930815696716309
-7.928117974144348,7.936224460601807
-7.946921547407927,7.935681343078613
-7.892790308673911,7.923017978668213
-7.946921547407927,7.915064811706543
-7.89962956062971,7.913510799407959
-7.946921547407927,7.912346363067627
-7.974694136660875,7.967713356018066
-7.9393021526221474,7.940469264984131
-7.931814161156377,7.939085483551025
-7.950781972366453,7.964873790740967
-7.982966659490206,7.958250522613525
-7.924453006674053,7.952575206756592
-7.882728704344236,7.902468204498291
-7.910094953104535,7.922090530395508
-7.923581356476356,7.924100875854492
-7.931814161156377,7.933491230010986
-7.9430951409681345,7.929652690887451
-7.954677021213342,7.926633834838867
-7.8761493177145505,7.936030864715576
-7.903090094245322,7.902768611907959
-7.978895913358191,7.897170543670654
-7.938102963264953,7.900089263916016
-7.920818811243059,7.9229044914245605
-7.8761493177145505,7.928920745849609
-7.954677021213342,7.921410083770752
-7.950781972366453,7.955691814422607
-7.924453006674053,7.895375728607178
-7.910094953104535,7.934922218322754
-7.9430951409681345,7.9097442626953125
-7.91721462968355,7.951467990875244
-7.946921547407927,7.908977508544922
-7.970532618892763,7.9538254737854
-7.950781972366453,7.931538105010986
-7.954677021213342,7.969940185546875
-7.954677021213342,7.960262298583984
-7.954677021213342,7.947406768798828
-7.954677021213342,7.940517425537109
-7.946921547407927,7.946444988250732
-7.924453006674053,7.940129280090332
-7.950781972366453,7.929628849029541
-7.932396638893121,7.949611663818359
-7.946921547407927,7.95077657699585
-7.950781972366453,7.919620037078857
-7.966576087242179,7.959109306335449
-7.9393021526221474,7.933202743530273
-7.959158165932685,7.949563026428223
-7.978895913358191,7.954627990722656
-7.946921547407927,7.946882247924805
-7.924453006674053,7.942266464233398
-7.950781972366453,7.93241024017334
-7.928117974144348,7.9121994972229
-7.929461956609781,7.927535057067871
-7.950781972366453,7.9416303634643555
-7.950781972366453,7.948963642120361
-7.920818811243059,7.917438983917236
-7.823919469453418,7.889624118804932
-7.886056354845152,7.915043354034424
-7.995678626217357,7.967642784118652
-7.954677021213342,7.940658092498779
-7.924453006674053,7.918981552124023
-7.869665979871627,7.921857833862305
-7.8761493177145505,7.910209655761719
-7.946921547407927,7.944212436676025
-7.950781972366453,7.943872451782227
-7.954677021213342,7.928762912750244
-7.928117974144348,7.94173002243042
-7.882728704344236,7.894033432006836
-7.886056354845152,7.90624475479126
-7.954677021213342,7.935753345489502
-7.924453006674053,7.900352954864502
-7.913640203677234,7.940165996551514
-7.935542022791058,7.953993320465088
-7.950781972366453,7.97155237197876
-7.924453006674053,7.918436050415039
-7.954677021213342,7.946011066436768
-7.935542022791058,7.9365339279174805
-7.9393021526221474,7.923471927642822
-7.903090094245322,7.9223551750183105
-7.950781972366453,7.945257663726807
-7.886056354845152,7.937860488891602
-7.924453006674053,7.938972473144531
-7.946921547407927,7.945295333862305
-7.931814161156377,7.932827949523926
-7.954677021213342,7.936053276062012
-7.913640203677234,7.923397541046143
-7.931814161156377,7.933324813842773
-7.946921547407927,7.943500518798828
-7.931814161156377,7.936390399932861
-7.9393021526221474,7.939838886260986
-7.928117974144348,7.9091410636901855
-7.950781972366453,7.965984344482422
-7.924453006674053,7.919857501983643
-7.924453006674053,7.9365010261535645
-7.928117974144348,7.922898769378662
-7.9393021526221474,7.927178859710693
-7.946921547407927,7.962056636810303
-7.946921547407927,7.938965797424316
-7.928117974144348,7.911762714385986
-7.946921547407927,7.905673503875732
-7.920818811243059,7.9242963790893555
-7.950781972366453,7.959932804107666
-7.924453006674053,7.941987037658691
-7.950781972366453,7.935699939727783
-7.950781972366453,7.95643949508667
-7.954677021213342,7.9482293128967285
-7.920818811243059,7.960787296295166
-7.924453006674053,7.9430623054504395
-7.950781972366453,7.925782680511475
-7.936946048812535,7.938243389129639
-7.869665979871627,7.8733720779418945
-7.931814161156377,7.922232151031494
-7.973579366316557,7.95895528793335
-7.924453006674053,7.924968242645264
-7.946921547407927,7.939375877380371
-7.950781972366453,7.9531378746032715
-7.9430951409681345,7.9399943351745605
-7.954677021213342,7.958555698394775
-7.846035765262794,7.929455280303955
-7.9339905637299495,7.918965816497803
-7.924453006674053,7.938305377960205
-7.924453006674053,7.926987171173096
-7.910094953104535,7.9327826499938965
-7.903090094245322,7.924933910369873
-7.920818811243059,7.952376842498779
-7.924453006674053,7.91285514831543
-7.920818811243059,7.909558296203613
-7.829768510087842,7.887401580810547
-7.978895913358191,7.957381725311279
-7.924453006674053,7.9405035972595215
-7.931814161156377,7.937588214874268
-7.950781972366453,7.934349536895752
-7.954677021213342,7.955976963043213
-7.920818811243059,7.91618537902832
-7.954677021213342,7.959182262420654
-7.946921547407927,7.936781406402588
-7.949597987432084,7.960054874420166
-7.946921547407927,7.9459547996521
-7.954677021213342,7.92056941986084
-7.924453006674053,7.929139614105225
-7.954677021213342,7.940983295440674
-7.950781972366453,7.955794334411621
-7.946921547407927,7.964132785797119
-7.935542022791058,7.936557292938232
-7.950781972366453,7.9418559074401855
-7.9393021526221474,7.931698322296143
-7.950781972366453,7.91699743270874
-7.9393021526221474,7.928492069244385
-7.935542022791058,7.930984020233154
-7.946921547407927,7.94033145904541
-7.9393021526221474,7.935953617095947
-7.8761493177145505,7.918787479400635
-7.924453006674053,7.943465232849121
-7.935542022791058,7.922450065612793
-7.91721462968355,7.948690891265869
-7.946921547407927,7.935391426086426
-7.924453006674053,7.923492908477783
-7.950781972366453,7.9567975997924805
-7.9430951409681345,7.929811954498291
-7.879527744657629,7.92253303527832
-7.91721462968355,7.929266452789307
-7.950781972366453,7.935911655426025
-7.941678683201079,7.929306507110596
-7.882728704344236,7.9355854988098145
-7.946921547407927,7.945903301239014
-7.892790308673911,7.916774749755859
-7.9393021526221474,7.905064105987549
-7.935542022791058,7.9122114181518555
-7.906578398789698,7.90645170211792
-7.982923651140671,7.961795806884766
-7.954677021213342,7.928944110870361
-7.931814161156377,7.938662528991699
-7.882728704344236,7.894800662994385
-7.950781972366453,7.938424587249756
-7.928117974144348,7.923452377319336
-7.9430951409681345,7.9477009773254395
-7.920818811243059,7.9471869468688965
-7.9430951409681345,7.918563365936279
-7.928117974144348,7.918329238891602
-7.987162773987728,7.942925930023193
-7.920818811243059,7.922441482543945
-7.931814161156377,7.940914630889893
-7.879425560900211,7.903378963470459
-7.832673025823477,7.924406051635742
-7.954677021213342,7.9667510986328125
-7.928117974144348,7.9471025466918945
-7.924453006674053,7.927276134490967
-7.893544569594523,7.9377288818359375
-7.896196359268842,7.919751167297363
-7.931814161156377,7.937387943267822
-7.838628495628443,7.929861068725586
-7.85078088734462,7.905827522277832
-7.9393021526221474,7.930362701416016
-7.928117974144348,7.909484386444092
-7.8761493177145505,7.91254186630249
-7.931814161156377,7.943294048309326
-7.987162773987728,7.958462238311768
-7.946921547407927,7.935885906219482
-7.950781972366453,7.962479114532471
-7.928117974144348,7.910780906677246
-7.9393021526221474,7.920313835144043
-7.892790308673911,7.933270454406738
-7.950781972366453,7.942481994628906
-7.954677021213342,7.892646312713623
-7.954677021213342,7.938930988311768
-7.954677021213342,7.961693286895752
-7.935542022791058,7.9427056312561035
-7.9430951409681345,7.915085315704346
-7.946921547407927,7.919640064239502
-7.950781972366453,7.939608097076416
-7.946921547407927,7.944214344024658
-7.913640203677234,7.946908473968506
-7.928117974144348,7.927548408508301
-7.882728704344236,7.935385227203369
-7.913640203677234,7.953506946563721
-7.928117974144348,7.922430515289307
-7.9430951409681345,7.9262309074401855
-7.92154353482018,7.91598653793335
-7.995678626217357,7.985125541687012
-7.924453006674053,7.935277462005615
-7.954677021213342,7.9645256996154785
-7.924453006674053,7.924707889556885
-7.860119116630385,7.880086421966553
-7.935542022791058,7.933530807495117
-7.946921547407927,7.948493480682373
-7.978810702253626,7.955765724182129
-7.946921547407927,7.930802822113037
-7.882728704344236,7.909367084503174
-7.949816020592385,7.932531833648682
-7.896196359268842,7.938292503356934
-7.924453006674053,7.918306350708008
-7.9142650431285055,7.9169111251831055
-7.950781972366453,7.927759647369385
-7.931814161156377,7.959956645965576
-7.9335681432273475,7.94239616394043
-7.9737577757544535,7.959918975830078
-7.935542022791058,7.92857027053833
-7.950781972366453,7.9375176429748535
-7.950781972366453,7.9334845542907715
-7.9430951409681345,7.96077299118042
-7.982923651140671,7.953036785125732
-7.913640203677234,7.933554649353027
-7.931814161156377,7.923004150390625
-7.863280055279963,7.919880390167236
-7.9393021526221474,7.939166069030762
-7.950781972366453,7.944055080413818
-7.924453006674053,7.916930675506592
-7.928117974144348,7.947337627410889
-7.954677021213342,7.958390712738037
-7.920818811243059,7.936320781707764
-7.869665979871627,7.904999732971191
-7.924453006674053,7.917755603790283
-7.9393021526221474,7.945776462554932
-7.935542022791058,7.913339138031006
-7.921079769888915,7.950585842132568
-7.931814161156377,7.935129642486572
-7.889355338226999,7.9741692543029785
-7.924453006674053,7.907637119293213
-7.990339285400088,7.956966400146484
-7.920818811243059,7.897474765777588
-7.928117974144348,7.9402971267700195
-8.004664347090904,7.996920585632324
-7.954677021213342,7.946351528167725
-7.946921547407927,7.959963798522949
-7.946921547407927,7.949365139007568
-7.886056354845152,7.948638916015625
-7.89962956062971,7.919445991516113
-7.931814161156377,7.944943904876709
-7.892790308673911,7.932504177093506
-7.931814161156377,7.9556193351745605
-7.924453006674053,7.932035446166992
-7.89962956062971,7.913577079772949
-7.840466181564601,7.911505222320557
-7.924453006674053,7.912888050079346
-7.987162773987728,7.953604221343994
-7.954677021213342,7.930408954620361
-7.9393021526221474,7.946497440338135
-7.924453006674053,7.940873146057129
-7.931814161156377,7.950131893157959
-7.966617665152964,7.960020065307617
-7.954677021213342,7.965973377227783
-7.9317759187918355,7.9547648429870605
-7.950781972366453,7.935727119445801
-7.950781972366453,7.946846008300781
-7.920818811243059,7.931739330291748
-7.954677021213342,7.956544876098633
-7.946921547407927,7.9211106300354
-7.931814161156377,7.928750038146973
-7.950781972366453,7.951058387756348
-7.9393021526221474,7.9333415031433105
-7.950781972366453,7.933678150177002
-7.886056354845152,7.919416904449463
-7.950781972366453,7.944352626800537
-7.889410352488291,7.931142807006836
-7.928117974144348,7.939157009124756
-7.928117974144348,7.931099891662598
-7.886056354845152,7.900643825531006
-7.838628495628443,7.892129421234131
-7.954677021213342,7.939808368682861
-7.954677021213342,7.970808982849121
-7.924453006674053,7.909842014312744
-7.928155902956855,7.9277520179748535
-7.954677021213342,7.9200968742370605
-7.928117974144348,7.940661907196045
-7.946921547407927,7.925193786621094
-7.924453006674053,7.932274341583252
-7.826774591089415,7.9099907875061035
-7.9393021526221474,7.924214839935303
-7.9393021526221474,7.914987087249756
-7.924453006674053,7.9400105476379395
-7.946921547407927,7.931276798248291
-7.950781972366453,7.936368465423584
-7.920818811243059,7.901528358459473
-7.9430951409681345,7.935159683227539
-8.026824561605242,7.985533237457275
-7.882728704344236,7.901429176330566
-7.924453006674053,7.955068111419678
-7.935542022791058,7.933258533477783
-7.89962956062971,7.9491119384765625
-7.889410352488291,7.922461032867432
-7.924453006674053,7.9431233406066895
-7.924453006674053,7.953458786010742
-7.898841589585073,7.900428295135498
-7.954677021213342,7.932881832122803
-7.924453006674053,7.917746543884277
-7.9430951409681345,7.950206756591797
-7.954677021213342,7.940858364105225
-7.931814161156377,7.910687446594238
-7.950781972366453,7.918254375457764
-7.9393021526221474,7.929991245269775
-7.9393021526221474,7.966484546661377
-7.995678626217357,7.944755554199219
-7.9393021526221474,7.9500837326049805
-7.924453006674053,7.921726703643799
-7.920818811243059,7.940706253051758
-7.931213792939948,7.9863080978393555
-7.954677021213342,7.977158069610596
-7.8493737915542425,7.938834190368652
-7.903090094245322,7.911532878875732
-7.913640203677234,7.929965019226074
-7.928117974144348,7.936142444610596
-7.920818811243059,7.938242435455322
-7.924453006674053,7.944051265716553
-7.8761493177145505,7.910224437713623
-7.877000634081475,7.948577404022217
-7.903090094245322,7.89647912979126
-7.946921547407927,7.955705165863037
-7.838628495628443,7.88059663772583
-7.931814161156377,7.9267706871032715
-7.946921547407927,7.917564868927002
-7.946921547407927,7.9506611824035645
-7.931814161156377,7.927876949310303
-7.818151283467686,7.920424938201904
-7.954677021213342,7.937530994415283
-7.9430951409681345,7.959792613983154
-7.9393021526221474,7.943192005157471
-7.9393021526221474,7.9463791847229
-7.907371764033808,7.933430194854736
-7.946921547407927,7.9635329246521
-7.935542022791058,7.922850131988525
-7.950781972366453,7.944715976715088
-7.954677021213342,7.952575206756592
-7.987162773987728,7.983859062194824
-7.931814161156377,7.936733722686768
-7.920818811243059,7.927468776702881
-7.950298727941771,7.94895601272583
-7.930395825138251,7.921867847442627
-7.950781972366453,7.925383567810059
-7.935542022791058,7.9142327308654785
-7.946921547407927,7.961864471435547
-7.982184017551764,7.9589362144470215
-7.924453006674053,7.919564247131348
-7.935542022791058,7.935486316680908
-7.970616219270671,7.94608211517334
-7.863280055279963,7.935757160186768
-7.856986114171083,7.911681652069092
-7.946082651207223,7.930521011352539
-7.903090094245322,7.940647602081299
-7.946921547407927,7.939310550689697
-7.866459873882536,7.912658214569092
-7.9393021526221474,7.922702312469482
-7.924453006674053,7.9294633865356445
-7.946921547407927,7.942546844482422
-7.950781972366453,7.9553704261779785
-7.910094953104535,7.933854579925537
-7.948658283730227,7.942760944366455
-7.950781972366453,7.959049701690674
-7.9393021526221474,7.944080829620361
-7.946921547407927,7.9589948654174805
-7.970532618892763,7.922435283660889
-7.9430951409681345,7.9323201179504395
-7.882728704344236,7.919942855834961
-7.931814161156377,7.928390979766846
-7.8876003998252076,7.926535129547119
-7.954677021213342,7.960204601287842
-7.9393021526221474,7.907679080963135
-7.924453006674053,7.9522881507873535
-7.950781972366453,7.925866603851318
-7.9430951409681345,7.916134357452393
-7.950781972366453,7.975556373596191
-7.9393021526221474,7.956202507019043
-7.920818811243059,7.9445977210998535
-7.879425560900211,7.931420803070068
-7.9393021526221474,7.9318366050720215
-7.89962956062971,7.946678638458252
-7.9430951409681345,7.942012310028076
-7.950781972366453,7.931539058685303
-7.924453006674053,7.944312572479248
-7.954677021213342,7.947545051574707
-7.950781972366453,7.948056221008301
-7.954677021213342,7.953733444213867
-7.954677021213342,7.933255672454834
-7.9393021526221474,7.918118953704834
-7.886056354845152,7.909968376159668
-7.9393021526221474,7.909889221191406
-7.966576241738391,7.94555139541626
-7.946219331461382,7.960280895233154
-7.970532618892763,7.972336769104004
-7.978810702253626,7.942407131195068
-7.920818811243059,7.927631855010986
-7.950781972366453,7.9457244873046875
-7.9737577757544535,7.970369815826416
-7.9393021526221474,7.942535877227783
-7.920818811243059,7.9175190925598145
-7.954677021213342,7.941527843475342
-7.946921547407927,7.963408946990967
-7.995678626217357,7.967281818389893
-7.856986114171083,7.935964107513428
-7.853872762493711,7.908004283905029
-7.954677021213342,7.95197057723999
-7.970532618892763,7.929131507873535
-7.920818811243059,7.896087169647217
-7.924453006674053,7.9137139320373535
-7.910094953104535,7.920704364776611
-7.946921547407927,7.936466693878174
-7.9430951409681345,7.953479290008545
-7.9393021526221474,7.9307684898376465
-7.946921547407927,7.930457592010498
-7.946921547407927,7.915698051452637
-7.920818811243059,7.930846214294434
-7.982923651140671,7.989151477813721
-7.950781972366453,7.960099697113037
-7.892790308673911,7.951830863952637
-7.950781972366453,7.929508209228516
-7.913640203677234,7.940018653869629
-7.950781972366453,7.939818859100342
-7.995678626217357,7.969388484954834
-7.910094953104535,7.924373626708984
-7.931814161156377,7.934195041656494
-7.896196359268842,7.885185718536377
-7.844664854175832,7.88681173324585
-7.954677021213342,7.940403938293457
-7.928546044181974,7.962454319000244
-7.920818811243059,7.958531379699707
-7.950781972366453,7.938411235809326
-7.950781972366453,7.933226108551025
-7.924453006674053,7.9564127922058105
-7.951597197767561,7.9191575050354
-7.946921547407927,7.943473815917969
-7.924453006674053,7.919556617736816
-7.924453006674053,7.909032821655273
-7.950781972366453,7.964513778686523
-7.924453006674053,7.938739776611328
-7.935542022791058,7.906888484954834
-7.946921547407927,7.931349754333496
-7.924453006674053,7.921743869781494
-7.9393021526221474,7.931522846221924
-7.920818811243059,7.909311294555664
-7.928117974144348,7.920653343200684
-7.9393021526221474,7.918509483337402
-7.946921547407927,7.941835880279541
-7.935542022791058,7.916172504425049
-7.829768510087842,7.921820640563965
-7.954677021213342,7.961714267730713
-7.950781972366453,7.935473918914795
-7.931814161156377,7.944878101348877
-7.851107336107353,7.931869983673096
-7.950781972366453,7.937042713165283
-7.9393021526221474,7.911564350128174
-7.950781972366453,7.946807384490967
-7.954677021213342,7.948666095733643
-7.924453006674053,7.9203782081604
-7.950781972366453,7.9457688331604
-7.913640203677234,7.922912120819092
-7.950781972366453,7.946686267852783
-7.970532618892763,7.959926128387451
-7.938582393143787,7.944231033325195
-7.946921547407927,7.938535213470459
-7.931814161156377,7.9432806968688965
-7.928117974144348,7.963315010070801
-7.920818811243059,7.893167972564697
-7.9393021526221474,7.967807769775391
-7.954677021213342,7.9670844078063965
-7.978895913358191,7.933260440826416
-7.928117974144348,7.949783802032471
-7.835637836224461,7.914889335632324
-7.954677021213342,7.956369400024414
-7.94094624659741,7.929269790649414
-7.91721462968355,7.901352405548096
-7.946921547407927,7.956657886505127
-7.906578398789698,7.9170403480529785
-7.941194503765821,7.952585697174072
-7.882728704344236,7.912771701812744
-7.954677021213342,7.949143409729004
-7.931814161156377,7.938590049743652
-7.924453006674053,7.918051242828369
-7.935542022791058,7.927675724029541
-7.928117974144348,7.913663864135742
-7.8908616413487795,7.9467902183532715
-7.847706165863548,7.935125827789307
-7.948658283730227,7.929662227630615
-7.9393021526221474,7.956561088562012
-7.931814161156377,7.930049419403076
-7.950781972366453,7.958929538726807
-7.924453006674053,7.943809509277344
-7.924453006674053,7.935716152191162
-7.946921547407927,7.964292526245117
-7.954677021213342,7.921182155609131
-7.950781972366453,7.94193172454834
-7.856986114171083,7.9120073318481445
-7.946921547407927,7.9441351890563965
-7.954677021213342,7.923455715179443
-7.938881715602225,7.929288864135742
-7.946921547407927,7.953796863555908
-7.910094953104535,7.915309429168701
-7.950781972366453,7.946770191192627
-7.966576241738391,7.972702980041504
-7.892790308673911,7.938594341278076
-7.935542022791058,7.944977283477783
-7.931814161156377,7.9121174812316895
-7.924453006674053,7.912363052368164
-7.935542022791058,7.894197463989258
-7.931814161156377,7.942920207977295
-8.013136044317282,7.974709987640381
-7.886056354845152,7.924341201782227
-7.920818811243059,7.936864376068115
-7.924453006674053,7.948663711547852
-7.9393021526221474,7.934441089630127
-7.954677021213342,7.901521682739258
-7.924453006674053,7.9583563804626465
-7.954677021213342,7.965365886688232
-7.946921547407927,7.9319915771484375
-7.987162773987728,7.972214698791504
-7.9393021526221474,7.945561408996582
-7.920818811243059,7.930529594421387
-7.920818811243059,7.926046848297119
-7.896196359268842,7.960533618927002
-7.889410352488291,7.917488098144531
-7.9393021526221474,7.924526214599609
-7.856986114171083,7.930180549621582
-7.950781972366453,7.970653057098389
-7.9430951409681345,7.940525054931641
-7.954677021213342,7.976907253265381
-7.946921547407927,7.95442533493042
-7.91721462968355,7.952862739562988
-7.924453006674053,7.918406009674072
-7.85078088734462,7.894383907318115
-7.950781972366453,7.9311137199401855
-7.931814161156377,7.9196953773498535
-7.9393021526221474,7.931282997131348
-7.954677021213342,7.984156131744385
-7.935542022791058,7.935686111450195
-7.928155902956855,7.960907936096191
-7.872861820710693,7.939217567443848
-7.941194514917139,7.9463605880737305
-7.896196359268842,7.933206081390381
-7.950781972366453,7.943506240844727
-7.9393021526221474,7.956286907196045
-7.931814161156377,7.950046062469482
-7.924453006674053,7.945818901062012
-7.9430951409681345,7.96272611618042
-7.954677021213342,7.942039489746094
-7.9430951409681345,7.941938400268555
-7.847706165863548,7.957494735717773
-7.966617665152964,7.900206565856934
-7.9393021526221474,7.925370693206787
-7.924453006674053,7.939165115356445
-7.935542022791058,7.90950345993042
-7.9737577757544535,7.952611923217773
-7.9393021526221474,7.916060447692871
-7.924453006674053,7.945321559906006
-7.954677021213342,7.964457988739014
-7.9393021526221474,7.929304599761963
-7.954677021213342,7.948940753936768
-7.950781972366453,7.949941158294678
-7.982184017551764,7.955769062042236
-7.928117974144348,7.918729305267334
-7.9393021526221474,7.94020414352417
-7.924453006674053,7.910254001617432
-7.931814161156377,7.9222092628479
-7.906578398789698,7.923948764801025
-7.954677021213342,7.954195499420166
-7.924453006674053,7.922934532165527
-7.9393021526221474,7.925368785858154
-7.924453006674053,7.919318675994873
-7.910094953104535,7.908653259277344
-7.946921547407927,7.925787448883057
-7.85078088734462,7.928907871246338
-7.832673025823477,7.957092761993408
-7.920818811243059,7.912805557250977
-7.903090094245322,7.906711101531982
-7.951451351436392,7.9462361335754395
-7.9430951409681345,7.944291591644287
-7.913999520285983,7.954061508178711
-7.866459873882536,7.920739650726318
-7.9430951409681345,7.9274067878723145
-7.954677021213342,7.94633674621582
-7.950781972366453,7.940995216369629
-7.928117974144348,7.946628093719482
-7.94551824914185,7.925920009613037
-7.935542022791058,7.939825057983398
-7.950781972366453,7.933436870574951
-7.924453006674053,7.909170627593994
-7.906578398789698,7.93811559677124
-7.946921547407927,7.909231662750244
-7.928117974144348,7.89877986907959
-7.89962956062971,7.9176177978515625
-7.950781972366453,7.9372477531433105
-7.863280055279963,7.946751594543457
-7.946921547407927,7.92733097076416
-7.931814161156377,7.923707485198975
-7.870744247281552,7.9030680656433105
-7.950781972366453,7.93806791305542
-7.928117974144348,7.918558120727539
-7.894889476280892,7.8445000648498535
-7.950781972366453,7.966182231903076
-7.9430951409681345,7.919788837432861
-7.9737577757544535,7.948221683502197
-7.928117974144348,7.9215087890625
-7.9430951409681345,7.932371616363525
-7.954677021213342,7.961160659790039
-7.946921547407927,7.93718957901001
-7.89962956062971,7.939318656921387
-8.026824561605242,7.984070301055908
-7.910094953104535,7.907548427581787
-7.920818811243059,7.905943870544434
-7.946921547407927,7.9426774978637695
-7.9393021526221474,7.9322123527526855
-7.935542022791058,7.938910484313965
-7.920818811243059,7.941934108734131
-7.91721462968355,7.944091796875
-7.954677021213342,7.950674533843994
-7.954677021213342,7.956277847290039
-7.9393021526221474,7.962741851806641
-7.950781972366453,7.950753211975098
-7.970532618892763,7.9739670753479
-7.913640203677234,7.946345329284668
-7.928117974144348,7.947104454040527
-7.9430951409681345,7.962094306945801
-7.9393021526221474,7.948503017425537
-7.886056354845152,7.919207572937012
-7.931814161156377,7.926883697509766
-7.950781972366453,7.952515125274658
-7.9430951409681345,7.972513675689697
-7.946921547407927,7.950647830963135
-7.9913998274291025,7.974789142608643
-7.892790308673911,7.946773052215576
-7.946921547407927,7.9468488693237305
-7.954677021213342,7.981848239898682
-7.924453006674053,7.980949401855469
-7.913640203677234,7.923818111419678
-7.920818811243059,7.935633659362793
-7.950781972366453,7.94793176651001
-7.892790308673911,7.91089391708374
-7.9393021526221474,7.932762622833252
-7.924453006674053,7.925354480743408
-7.990339285400088,7.959875106811523
-7.9393021526221474,7.9332966804504395
-7.954677021213342,7.9215168952941895
-7.892790308673911,7.934428691864014
-7.9430951409681345,7.936385631561279
-7.954677021213342,7.942760944366455
-7.925565706285505,7.921267032623291
-7.946921547407927,7.929893493652344
-7.928117974144348,7.9159440994262695
-7.901574427881827,7.953174591064453
-7.931814161156377,7.948029041290283
-7.903090094245322,7.907253742218018
-7.931814161156377,7.878647804260254
-7.892790308673911,7.897049427032471
-7.9737577757544535,7.970809459686279
-7.954677021213342,7.975351810455322
-7.928117974144348,7.932314395904541
-7.954677021213342,7.934709072113037
-7.920818811243059,7.91621732711792
-7.950781972366453,7.950429439544678
-7.9393021526221474,7.940919399261475
-7.959158165932685,7.94699764251709
-7.950781972366453,7.961684703826904
-8.016694986585515,7.960627555847168
-7.9430951409681345,7.9450364112854
-7.950781972366453,7.954582691192627
-7.954677021213342,7.9805006980896
-7.924453006674053,7.926342487335205
-7.924453006674053,7.924699783325195
-7.935542022791058,7.940189361572266
-7.950781972366453,7.938053607940674
-7.924453006674053,7.931846618652344
-7.91721462968355,7.915661334991455
-7.892790308673911,7.909457206726074
-7.946921547407927,7.926334857940674
-7.93765506239242,7.93222713470459
-7.950781972366453,7.928971767425537
-7.950781972366453,7.943849086761475
-7.946921547407927,7.938313961029053
-7.931814161156377,7.928098201751709
-7.946921547407927,7.91575288772583
-7.946921547407927,7.945506572723389
-7.913640203677234,7.92301607131958
-7.950781972366453,7.921823978424072
-7.935542022791058,7.948436260223389
-7.924453006674053,7.925934314727783
-7.957786139863943,7.95010232925415
-7.928117974144348,7.944243907928467
-7.935542022791058,7.920321941375732
-7.931814161156377,7.95350980758667
-7.896196359268842,7.904637813568115
-7.954677021213342,7.939752101898193
-7.931814161156377,7.958646297454834
-7.948658283730227,7.949618816375732
-7.9430951409681345,7.934074878692627
-7.946921547407927,7.948017597198486
-7.913640203677234,7.919261455535889
-7.860119116630385,7.9152960777282715
-7.931814161156377,7.928363800048828
-7.924453006674053,7.922804355621338
-7.937021597224099,7.923055171966553
-7.950781972366453,7.97560453414917
-7.931814161156377,7.954243183135986
-7.9430951409681345,7.959941864013672
-7.950781972366453,7.9563984870910645
-7.9430951409681345,7.946691989898682
-7.889410352488291,7.941097259521484
-7.9393021526221474,7.958840847015381
-7.946921547407927,7.926079273223877
-7.866459873882536,7.909865856170654
-7.950781972366453,7.924803733825684
-7.950781972366453,7.930043697357178
-7.9430951409681345,7.931652545928955
-7.910094953104535,7.923278331756592
-7.946921547407927,7.930814266204834
-7.9393021526221474,7.902694225311279
-7.946921547407927,7.9286603927612305
-7.954677021213342,7.929999828338623
-7.946921547407927,7.931728839874268
-7.91721462968355,7.948169231414795
-7.913640203677234,7.902495861053467
-7.950781972366453,7.9330010414123535
-7.954677021213342,7.960641860961914
-7.889410352488291,7.8765363693237305
-7.928117974144348,7.937168598175049
-7.946921547407927,7.927540302276611
-7.924453006674053,7.91364049911499
-7.892824978756646,7.911458969116211
-7.950781972366453,7.930604457855225
-7.946921547407927,7.96953821182251
-7.882728704344236,7.876473426818848
-7.924453006674053,7.946183204650879
-7.968365045565531,7.945370197296143
-7.954677021213342,7.944043159484863
-7.924453006674053,7.920382976531982
-7.954677021213342,7.959405899047852
-7.9430951409681345,7.942874431610107
-7.935542022791058,7.929502010345459
-7.863280055279963,7.892267227172852
-7.954677021213342,7.937167644500732
-7.903090094245322,7.973903656005859
-7.906578398789698,7.942088603973389
-7.928117974144348,7.927658557891846
-7.954677021213342,7.952475070953369
-7.931814161156377,7.937099456787109
-7.9430951409681345,7.940122127532959
-7.954677021213342,7.961883068084717
-7.950781972366453,7.9627885818481445
-7.901151046525181,7.949974536895752
-7.950185844254969,7.947733402252197
-7.9393021526221474,7.934092044830322
-7.924453006674053,7.922153949737549
-7.924453006674053,7.923133373260498
-7.99909679285825,7.9540019035339355
-7.91721462968355,7.934841632843018
-7.924453006674053,7.933619976043701
-7.946921547407927,7.936796188354492
-7.885214382679302,7.93439245223999
-7.995678626217357,7.9173102378845215
-7.889410352488291,7.92748498916626
-7.910094953104535,7.892362117767334
-7.835637836224461,7.888574123382568
-7.9393021526221474,7.943478107452393
-7.950781972366453,7.951910495758057
-7.950781972366453,7.9341912269592285
-7.9393021526221474,7.949996471405029
-7.954677021213342,7.94369649887085
-7.950781972366453,7.934817314147949
-7.950781972366453,7.962042331695557
-7.950781972366453,7.948780536651611
-7.950781972366453,7.932337284088135
-7.954677021213342,7.947879314422607
-7.978895913358191,7.959080696105957
-7.931814161156377,7.9520649909973145
-7.9393021526221474,7.904465198516846
-7.950781972366453,7.943818092346191
-7.928117974144348,7.9170684814453125
-7.931814161156377,7.950503826141357
-7.950781972366453,7.95217752456665
-7.950781972366453,7.934193134307861
-7.9393021526221474,7.939958572387695
-7.946921547407927,7.940174579620361
-7.954677021213342,7.943814754486084
-7.950781972366453,7.937057018280029
-7.950781972366453,7.978291034698486
-7.931814161156377,7.927430152893066
-7.924453006674053,7.9191741943359375
-7.950781972366453,7.950067043304443
-7.952701373929933,7.947224140167236
-7.950781972366453,7.941205978393555
-7.903090094245322,7.912819862365723
-7.924453006674053,7.920934677124023
-7.950781972366453,7.937108516693115
-7.950781972366453,7.96314811706543
-7.838628495628443,7.924185276031494
-7.89043660207102,7.889585971832275
-7.91721462968355,7.941996097564697
-7.924453006674053,7.89053201675415
-7.950781972366453,7.924013614654541
-7.946921547407927,7.943463325500488
-7.892790308673911,7.918280601501465
-7.946921547407927,7.948173999786377
-7.950781972366453,7.9304327964782715
-7.91721462968355,7.9159674644470215
-7.829768510087842,7.902894496917725
-7.950781972366453,7.948023796081543
-7.987162773987728,7.968873023986816
-7.950781972366453,7.919228553771973
-7.950781972366453,7.972712516784668
-7.924453006674053,7.94699239730835
-7.946921547407927,7.941577434539795
-7.9430951409681345,7.942226886749268
-7.896196359268842,7.951082706451416
-7.946921547407927,7.941999912261963
-7.91721462968355,7.934915542602539
-7.931814161156377,7.931976795196533
-7.950781972366453,7.936151504516602
-7.950781972366453,7.951800346374512
-7.954677021213342,7.9495463371276855
-7.9393021526221474,7.897992134094238
-7.954677021213342,7.9411540031433105
-7.949130633177768,7.949618339538574
-7.924453006674053,7.927977085113525
-7.924453006674053,7.933557033538818
-7.935542022791058,7.968756675720215
-7.924453006674053,7.925540447235107
-7.924453006674053,7.961217403411865
-7.920818811243059,7.922653675079346
-7.950781972366453,7.938549518585205
-7.843093264073079,7.865478038787842
-7.931814161156377,7.9383769035339355
-7.950781972366453,7.955843448638916
-7.946110394145942,7.976340293884277
-7.954677021213342,7.947812080383301
-7.935542022791058,7.934999465942383
-7.950781972366453,7.942159652709961
-7.9393021526221474,7.882212162017822
-7.91721462968355,7.948248386383057
-7.928117974144348,7.954394817352295
-7.950781972366453,7.947885990142822
-7.954677021213342,7.960822105407715
-7.974694136660875,7.976369380950928
-7.920818811243059,7.9405035972595215
-7.924453006674053,7.917459487915039
-7.942721818964232,7.958102703094482
-7.9430951409681345,7.926118850708008
-7.924453006674053,7.92841100692749
-7.954677021213342,7.955636501312256
-7.924453006674053,7.919474124908447
-8.026824561605242,7.994621276855469
-7.950781972366453,7.9556450843811035
-7.954677021213342,7.93128776550293
-7.954677021213342,7.966907024383545
-7.950241642100192,7.930912494659424
-7.950781972366453,7.958442211151123
-7.950781972366453,7.9530439376831055
-7.924453006674053,7.918164253234863
-7.950781972366453,7.947981357574463
-7.952064708731984,7.8735432624816895
-7.91721462968355,7.927245140075684
-7.935542022791058,7.9416022300720215
-7.931814161156377,7.935897350311279
-7.946921547407927,7.935797691345215
-7.970532618892763,7.982375144958496
-7.924453006674053,7.932605266571045
-7.950781972366453,7.9455366134643555
-7.94094624659741,7.902708530426025
-7.950781972366453,7.935378551483154
-7.9393021526221474,7.921473979949951
-7.931814161156377,7.938200950622559
-7.9393021526221474,7.929874897003174
-7.946921547407927,7.9500412940979
-7.872383673051598,7.896932125091553
-7.928117974144348,7.943715572357178
-7.928117974144348,7.95483922958374
-7.954677021213342,7.948800563812256
-7.931814161156377,7.909474849700928
-7.9430951409681345,7.931062698364258
-7.950781972366453,7.949742794036865
-7.946921547407927,7.960090160369873
-7.935542022791058,7.893357276916504
-7.920818811243059,7.943389415740967
-7.826774591089415,7.905014514923096
-7.9226037161522465,7.934686183929443
-7.950781972366453,7.949527263641357
-7.982923651140671,7.959923267364502
-7.9393021526221474,7.935685157775879
-7.9737577757544535,7.926444053649902
-7.920818811243059,7.906703472137451
-7.928117974144348,7.938342094421387
-7.946921547407927,7.944493770599365
-7.950781972366453,7.9337005615234375
-7.903090094245322,7.936396598815918
-7.937195024046664,7.947562217712402
-7.950781972366453,7.966013431549072
-7.928117974144348,7.917564392089844
-7.9430951409681345,7.901409149169922
-7.910094953104535,7.951359272003174
-7.860153329415682,7.90146541595459
-7.950781972366453,7.946569919586182
-7.906578398789698,7.948581218719482
-7.950781972366453,7.971138954162598
-7.950781972366453,7.951173782348633
-7.950781972366453,7.926601886749268
-7.982923651140671,7.9263410568237305
-7.950781972366453,7.9437336921691895
-7.913640203677234,7.922436714172363
-7.950781972366453,7.913817882537842
-7.903090094245322,7.931784629821777
-7.9430951409681345,7.941173076629639
-7.935542022791058,7.92954158782959
-7.928117974144348,7.926162242889404
-7.85078088734462,7.918936729431152
-7.935542022791058,7.954833984375
-7.9393021526221474,7.909104824066162
-7.950781972366453,7.926806926727295
-7.954677021213342,7.937917232513428
-7.935542022791058,7.958270072937012
-7.928117974144348,7.923176288604736
-7.9393021526221474,7.95703649520874
-7.920818811243059,7.9580206871032715
-7.928117974144348,7.94984769821167
-7.935542022791058,7.936549663543701
-7.89962956062971,7.9140825271606445
-7.995678626217357,7.994548320770264
-7.8013712254607785,7.896152973175049
-7.9737577757544535,7.960954189300537
-7.9393021526221474,7.916384696960449
-7.954677021213342,7.937473773956299
-7.886056354845152,7.889430999755859
-7.978895913358191,7.9758477210998535
-7.950781972366453,7.9351325035095215
-7.900268059245174,7.955583095550537
-7.896196359268842,7.929817199707031
-7.954677021213342,7.944273471832275
-7.954677021213342,7.920819282531738
-7.9430951409681345,7.937211513519287
-7.954677021213342,7.974625587463379
-7.8728955601551585,7.922466278076172
-7.924453006674053,7.898252964019775
-7.9393021526221474,7.928752422332764
-7.892790308673911,7.940348148345947
-7.8728955601551585,7.937590599060059
-7.954677021213342,7.94519567489624
-7.91721462968355,7.927381992340088
-7.950781972366453,7.951967239379883
-7.920818811243059,7.934454441070557
-7.954677021213342,7.947492599487305
-7.982923651140671,7.94528341293335
-7.903090094245322,7.921326160430908
-7.913640203677234,7.898975849151611
-7.91721462968355,7.9545512199401855
-7.91721462968355,7.89968729019165
-7.9430951409681345,7.981468677520752
-7.853872762493711,7.918760776519775
-7.950781972366453,7.925098419189453
-7.924453006674053,7.935201168060303
-7.982923651140671,7.940741062164307
-7.946921547407927,7.9103851318359375
-7.89962956062971,7.918961524963379
-7.950781972366453,7.934595108032227
-7.931814161156377,7.948672771453857
-7.920818811243059,7.910421371459961
-7.9200659509493825,7.913893699645996
-7.931814161156377,7.940318584442139
-7.950781972366453,7.9519758224487305
-7.954677021213342,7.936213493347168
-7.91721462968355,7.914450645446777
-7.946921547407927,7.929795742034912
-7.920157222067213,7.958779811859131
-7.928117974144348,7.937490940093994
-7.928117974144348,7.947232723236084
-7.924453006674053,7.899013042449951
-7.954677021213342,7.936773300170898
-7.9430951409681345,7.914587497711182
-7.987162773987728,7.98105001449585
-7.9393021526221474,7.930075168609619
-7.950781972366453,7.918482780456543
-7.978895913358191,7.971251487731934
-7.950781972366453,7.944873809814453
-7.966576241738391,7.9530253410339355
-7.954677021213342,7.960240840911865
-7.9393021526221474,7.9304327964782715
-7.924453006674053,7.902072429656982
-7.954677021213342,7.962139129638672
-7.954677021213342,7.942348003387451
-7.954677021213342,7.930418491363525
-7.950781972366453,7.925174236297607
-7.82102305270683,7.929290294647217
-7.954259300743819,7.941572189331055
-7.903090094245322,7.916757106781006
-7.950781972366453,7.953580856323242
-7.954677021213342,7.9444098472595215
-7.91721462968355,7.939310073852539
-7.9737577757544535,7.949759483337402
-7.9393021526221474,7.937657833099365
-7.920818811243059,7.942561626434326
-7.896196359268842,7.937831401824951
-7.9430951409681345,7.950530529022217
-7.954677021213342,7.979886531829834
-7.886056354845152,7.917620658874512
-7.924453006674053,7.92988395690918
-7.924453006674053,7.936985969543457
-7.9393021526221474,7.923344612121582
-7.950781972366453,7.9499053955078125
-7.950781972366453,7.943813800811768
-7.946921547407927,7.958747386932373
-7.946921547407927,7.941074848175049
-7.924453006674053,7.924371242523193
-7.946921547407927,7.9492411613464355
-7.931814161156377,7.934830188751221
-7.866459873882536,7.907716274261475
-7.931814161156377,7.944836616516113
-7.924453006674053,7.925981044769287
-7.928117974144348,7.907286167144775
-7.896196359268842,7.941249847412109
-7.943400083598079,7.962008476257324
-7.931814161156377,7.898929119110107
-7.879425560900211,7.900405406951904
-7.954677021213342,7.946905612945557
-7.892790308673911,7.933310031890869
-7.954677021213342,7.9554443359375
-7.951252960495686,7.9595208168029785
-7.903090094245322,7.8885674476623535
-7.913640203677234,7.9387431144714355
-7.896196359268842,7.925626754760742
-7.950781972366453,7.923715114593506
-7.954677021213342,7.950249671936035
-7.826774591089415,7.917920112609863
-7.942033487170233,7.929320335388184
-7.928117974144348,7.9097418785095215
-7.928117974144348,7.955918788909912
-7.920818811243059,7.935068607330322
-7.950781972366453,7.939784049987793
-7.950781972366453,7.970159530639648
-7.954677021213342,7.962462425231934
-7.950781972366453,7.928699493408203
-7.89962956062971,7.881485462188721
-8.034343915929238,7.9528961181640625
-7.906578398789698,7.9336442947387695
-7.931814161156377,7.94645357131958
-7.954677021213342,7.937154769897461
-7.946921547407927,7.908700942993164
-7.954677021213342,7.935977458953857
-7.954677021213342,7.931617736816406
-7.9430951409681345,7.9312520027160645
-7.913640203677234,7.934035301208496
-7.924453006674053,7.908770561218262
-7.869732506393041,7.907447338104248
-7.913640203677234,7.919469356536865
-7.913640203677234,7.940405368804932
-7.9393021526221474,7.923614025115967
-7.954677021213342,7.978748798370361
-7.954677021213342,7.960537910461426
-7.920818811243059,7.89995813369751
-7.91721462968355,7.911286354064941
-7.935542022791058,7.914244174957275
-7.94052963377159,7.936779975891113
-7.954677021213342,7.933477878570557
-7.950781972366453,7.9452290534973145
-7.9430951409681345,7.9022417068481445
-7.935542022791058,7.9316582679748535
-7.924453006674053,7.949903964996338
-7.920818811243059,7.941308498382568
-7.832673025823477,7.917435169219971
-7.920818811243059,7.947746276855469
-7.910094953104535,7.917655944824219
-7.920818811243059,7.914835453033447
-7.954677021213342,7.95107364654541
-7.928117974144348,7.925193786621094
-7.913640203677234,7.931312561035156
-7.950781972366453,7.930295467376709
-7.950781972366453,7.955936908721924
-7.954677021213342,7.938643932342529
-7.946921547407927,7.9373931884765625
-7.9393021526221474,7.948361873626709
-7.970532618892763,7.977352619171143
-7.954677021213342,7.956924915313721
-7.9430951409681345,7.931690692901611
-7.950781972366453,7.931451320648193
-7.935542022791058,7.9422783851623535
-7.950781972366453,7.957879066467285
-7.924453006674053,7.933148384094238
-7.9393021526221474,7.942891597747803
-7.946921547407927,7.931005001068115
-7.9393021526221474,7.92941427230835
-7.954677021213342,7.925193786621094
-7.91721462968355,7.918280601501465
-7.9430951409681345,7.925155162811279
-7.928117974144348,7.919251918792725
-7.9393021526221474,7.940459728240967
-7.9430951409681345,7.94397497177124
-7.950781972366453,7.919656753540039
-7.946921547407927,7.945175647735596
-7.924453006674053,7.921175956726074
-7.906578398789698,7.935463905334473
-7.954677021213342,7.963082313537598
-7.982184017551764,7.963260173797607
-7.920706937989397,7.969269752502441
-7.9393021526221474,7.9686198234558105
-7.958607309235428,7.944118022918701
-7.950781972366453,7.952678203582764
-7.869665979871627,7.920002460479736
-7.860119116630385,7.9351325035095215
-7.954677021213342,7.948859691619873
-7.950781972366453,7.949173450469971
-7.931814161156377,7.940493106842041
-7.935542022791058,7.928542613983154
-7.859452790550835,7.891024112701416
-7.879425560900211,7.905180931091309
-7.946921547407927,7.940258026123047
-7.946921547407927,7.942524433135986
-7.935542022791058,7.941376209259033
-7.935542022791058,7.940496921539307
-7.954677021213342,7.965329647064209
-7.935542022791058,7.919119358062744
-7.889410352488291,7.938998699188232
-7.935542022791058,7.93095064163208
-7.935542022791058,7.940577983856201
-7.931814161156377,7.936893463134766
-7.953367912495746,7.940515041351318
-7.85205769961263,7.901096343994141
-7.954677021213342,7.940229415893555
-8.014634778962309,7.956355571746826
-7.838628495628443,7.912542819976807
-7.928117974144348,7.895899772644043
-7.982923651140671,7.9694132804870605
-7.89962956062971,7.935342311859131
-7.950781972366453,7.9276533126831055
-7.913640203677234,7.920220851898193
-7.946921547407927,7.967243194580078
-7.966617665152964,7.935868740081787
-7.928117974144348,7.901059150695801
-7.855305266277571,7.9066596031188965
-7.913640203677234,7.898380756378174
-7.946921547407927,7.925456523895264
-7.950781972366453,7.917827606201172
-7.924453006674053,7.923120021820068
-7.924453006674053,7.935271739959717
-7.946921547407927,7.9520745277404785
-7.924453006674053,7.933638572692871
-7.9393021526221474,7.92273473739624
-7.950781972366453,7.954282283782959
-7.946921547407927,7.942345142364502
-7.935542022791058,7.927019119262695
-7.950781972366453,7.933659076690674
-7.9430951409681345,7.970462322235107
-7.903090094245322,7.9306464195251465
-7.950781972366453,7.951797962188721
-7.950781972366453,7.9355926513671875
-7.892824978756646,7.9233856201171875
-7.946921547407927,7.930872440338135
-7.924453006674053,7.937047004699707
-7.896196359268842,7.931641578674316
-7.9393021526221474,7.912802219390869
-7.906578398789698,7.95517635345459
-7.934136499461806,7.9151434898376465
-7.928117974144348,7.955474376678467
-7.913640203677234,7.931436061859131
-7.9393021526221474,7.934924602508545
-7.920818811243059,7.925963878631592
-7.9737577757544535,7.953170299530029
-7.9737577757544535,7.937749862670898
-7.913640203677234,7.905855178833008
-7.950781972366453,7.961606502532959
-7.96257349994767,7.956055641174316
-7.9430951409681345,7.943427562713623
-7.950781972366453,7.957435131072998
-7.946921547407927,7.939693927764893
-7.924453006674053,7.92575216293335
-7.906578398789698,7.922378063201904
-7.954677021213342,7.952945232391357
-7.931814161156377,7.947041988372803
-7.987162773987728,7.946619510650635
-7.928117974144348,7.928882598876953
-7.935542022791058,7.913164138793945
-7.924453006674053,7.919384002685547
-7.920818811243059,7.918630123138428
-7.931814161156377,7.91424560546875
-7.910094953104535,7.9240031242370605
-7.950781972366453,7.9544878005981445
-7.9430951409681345,7.946493625640869
-7.913640203677234,7.903285503387451
-7.946921547407927,7.929427623748779
-7.9913998274291025,7.97324800491333
-7.982923651140671,7.921980381011963
-7.860119116630385,7.919596195220947
-7.954677021213342,7.942707061767578
-7.935542022791058,7.955721378326416
-7.879425560900211,7.910808563232422
-7.954677021213342,7.959046840667725
-7.928117974144348,7.932044506072998
-7.928117974144348,7.926006317138672
-7.89962956062971,7.917394161224365
-7.954677021213342,7.955850124359131
-7.889410352488291,7.904982089996338
-7.895643174926403,7.898798942565918
-7.931814161156377,7.947939395904541
-7.946921547407927,7.906866073608398
-7.9430951409681345,7.950582504272461
-7.950781972366453,7.9536919593811035
-7.931128869023377,7.912319660186768
-7.924453006674053,7.928037166595459
-7.950781972366453,7.922449588775635
-7.950781972366453,7.938889980316162
-7.894365606854938,7.912055015563965
-7.860119116630385,7.936550140380859
-7.924453006674053,7.91626501083374
-7.928117974144348,7.924001216888428
-7.928117974144348,7.945284366607666
-7.9393021526221474,7.941311359405518
-7.9393021526221474,7.928112983703613
-7.832673025823477,7.886268615722656
-7.9430951409681345,7.923527717590332
-7.951111119606262,7.948388576507568
-7.928117974144348,7.916655540466309
-7.920818811243059,7.933783054351807
-7.935542022791058,7.951021671295166
-7.9393021526221474,7.959323406219482
-7.82102305270683,7.903106212615967
-7.89962956062971,7.924070835113525
-7.8728955601551585,7.892883777618408
-7.931814161156377,7.926826000213623
-7.928117974144348,7.928341865539551
-7.9393021526221474,7.91542911529541
-7.913640203677234,7.9298272132873535
-7.928117974144348,7.934916019439697
-7.9849836249897255,7.922802925109863
-7.886056354845152,7.916583061218262
-7.91721462968355,7.941938877105713
-7.948847473653619,7.919541835784912
-7.935542022791058,7.960633754730225
-7.9200659509493825,7.944541931152344
-7.860119116630385,7.898308753967285
-7.954677021213342,7.944429397583008
-7.950781972366453,7.941103935241699
-7.954677021213342,7.962172031402588
-7.931814161156377,7.935780048370361
-7.924453006674053,7.942196846008301
-7.946921547407927,7.914191722869873
-7.924453006674053,7.9216084480285645
-7.954677021213342,7.910227298736572
-7.924453006674053,7.9248552322387695
-7.9430951409681345,7.942275524139404
-7.950781972366453,7.921285152435303
-7.924453006674053,7.939509868621826
-7.892790308673911,7.92932653427124
-7.9430951409681345,7.9333720207214355
-7.923581356476356,7.915139198303223
-7.946921547407927,7.951807975769043
-7.903161564307976,7.930147171020508
-7.995678626217357,7.972635746002197
-7.9430951409681345,7.926900863647461
-7.89962956062971,7.930688381195068
-7.928155902956855,7.9282755851745605
-7.924453006674053,7.908327579498291
-7.9393021526221474,7.945427417755127
-7.924453006674053,7.917583465576172
-7.950781972366453,7.962862014770508
-7.9166994502154875,7.938761234283447
-7.954677021213342,7.944642543792725
-7.943864654803505,7.959139347076416
-7.954677021213342,7.96816873550415
-7.950781972366453,7.931126117706299
-7.924453006674053,7.9187092781066895
-7.85750495533387,7.949227809906006
-7.91721462968355,7.915375232696533
-7.903090094245322,7.925487041473389
-7.946921547407927,7.948134899139404
-7.943392119977923,7.930526256561279
-7.920818811243059,7.929090976715088
-7.950781972366453,7.919570446014404
-7.9393021526221474,7.957668781280518
-7.954677021213342,7.974802494049072
-7.9430951409681345,7.950549125671387
-7.8761493177145505,7.9355058670043945
-7.845339292733202,7.920568943023682
-7.954677021213342,7.921464443206787
-7.869665979871627,7.934951305389404
-7.954677021213342,7.956121921539307
-7.924453006674053,7.92385721206665
-7.89962956062971,7.948486804962158
-7.946921547407927,7.949176788330078
-7.9430951409681345,7.9264702796936035
-7.935542022791058,7.913292407989502
-7.920818811243059,7.940479755401611
-7.928117974144348,7.932884693145752
-7.87543550142629,7.959547519683838
-7.924453006674053,7.9204487800598145
-7.935542022791058,7.930135726928711
-7.874709893782641,7.9003143310546875
-7.924453006674053,7.9392476081848145
-7.935542022791058,7.923742771148682
-7.924453006674053,7.936745643615723
-7.954677021213342,7.926638126373291
-7.910094953104535,7.926729679107666
-7.950781972366453,7.963665008544922
-7.950781972366453,7.936812400817871
-7.950781972366453,7.948235034942627
-7.9393021526221474,7.928643703460693
-7.903090094245322,7.904605388641357
-7.946921547407927,7.901069164276123
-7.906578398789698,7.929018497467041
-7.954677021213342,7.942965984344482
-7.950781972366453,7.932253360748291
-7.950781972366453,7.9344658851623535
-7.974737536115285,7.947572708129883
-7.931814161156377,7.965115070343018
-7.914290579732208,7.925016403198242
-7.9430951409681345,7.928234100341797
-7.950781972366453,7.9014573097229
-7.931814161156377,7.941072463989258
-7.946921547407927,7.9264140129089355
-7.9430951409681345,7.945960521697998
-7.953969186355689,7.945883274078369
-7.954677021213342,7.9513068199157715
-7.978895913358191,7.965897083282471
-7.954677021213342,7.960668087005615
-7.931814161156377,7.93207311630249
-7.924453006674053,7.928977012634277
-7.906578398789698,7.913081169128418
-7.896196359268842,7.94149923324585
-7.931814161156377,7.93087911605835
-7.9393021526221474,7.929895401000977
-7.9393021526221474,7.962470054626465
-7.950781972366453,7.940263271331787
-7.950781972366453,7.952343463897705
-7.924453006674053,7.914059162139893
-7.85078088734462,7.9455413818359375
-7.931814161156377,7.945178508758545
-7.924453006674053,7.898372650146484
-7.950781972366453,7.954289436340332
-7.924453006674053,7.921936511993408
-7.924453006674053,7.960772514343262
-7.954677021213342,7.941993713378906
-7.9430951409681345,7.931049823760986
-7.9430951409681345,7.9469709396362305
-7.896196359268842,7.909155368804932
-7.928117974144348,7.918978214263916
-7.935542022791058,7.951331615447998
-7.935542022791058,7.936983585357666
-7.935542022791058,7.927924633026123
-7.910094953104535,7.91859245300293
-7.9393021526221474,7.902095794677734
-7.924453006674053,7.924059867858887
-7.889410352488291,7.9117817878723145
-7.950781972366453,7.929284572601318
-7.931814161156377,7.954965114593506
-7.954677021213342,7.957798480987549
-7.928117974144348,7.941813945770264
-7.954677021213342,7.9491448402404785
-7.946921547407927,7.930301189422607
-7.946921547407927,7.963952541351318
-7.954677021213342,7.975825786590576
-7.946921547407927,7.9503631591796875
-7.928117974144348,7.919093608856201
-7.995678626217357,7.976268768310547
-7.9430951409681345,7.944962978363037
-7.91354207338809,7.960161209106445
-7.950781972366453,7.932337760925293
-7.9393021526221474,7.933465003967285
-7.9430951409681345,7.9386677742004395
-7.954677021213342,7.938151836395264
-7.85078088734462,7.913083553314209
-7.924453006674053,7.930967807769775
-7.9737577757544535,7.916970729827881
-7.950781972366453,7.942630290985107
-7.946921547407927,7.941341876983643
-7.931814161156377,7.933756351470947
-7.896196359268842,7.923569202423096
-7.924453006674053,7.93146276473999
-7.924453006674053,7.914270877838135
-7.935542022791058,7.944248199462891
-7.954677021213342,7.96212100982666
-7.891275104996169,7.908416748046875
-7.928117974144348,7.940488338470459
-7.8761493177145505,7.950587272644043
-7.898841589585073,7.939064025878906
-7.931814161156377,7.903545379638672
-7.924453006674053,7.946538925170898
-7.970532618892763,7.96906852722168
-7.954677021213342,7.933150768280029
-7.9393021526221474,7.944026947021484
-7.924453006674053,7.874698162078857
-7.9393021526221474,7.932543754577637
-7.860119116630385,7.91344690322876
-7.931814161156377,7.930479526519775
-7.928117974144348,7.948952674865723
-7.920818811243059,7.9604926109313965
-7.946921547407927,7.935652256011963
-7.935542022791058,7.934658527374268
-7.91721462968355,7.914625644683838
-7.950781972366453,7.945467472076416
-7.987162773987728,7.960795879364014
-7.89962956062971,7.902215003967285
-7.910094953104535,7.949182510375977
-7.935542022791058,7.938927173614502
-7.910094953104535,7.914389610290527
-7.935542022791058,7.9270501136779785
-7.931814161156377,7.929609775543213
-7.954677021213342,7.980079174041748
-7.954677021213342,7.938171863555908
-7.946921547407927,7.9328999519348145
-7.9335681432273475,7.972910404205322
-7.928117974144348,7.952804088592529
-7.9913998274291025,7.976916790008545
-7.91721462968355,7.9083781242370605
-7.920818811243059,7.920602321624756
-7.946921547407927,7.979136943817139
-7.954677021213342,7.932956695556641
-7.913640203677234,7.924316883087158
-7.9393021526221474,7.914839744567871
-7.950781972366453,7.944502353668213
-7.935542022791058,7.960159778594971
-7.878606331107103,7.903495788574219
-7.920818811243059,7.9225640296936035
-7.924453006674053,7.92653751373291
-7.9393021526221474,7.954352855682373
-7.9393021526221474,7.935650825500488
-7.928117974144348,7.932175159454346
-7.9913998274291025,7.961808681488037
-7.866459873882536,7.9121575355529785
-7.913640203677234,7.932223796844482
-7.931814161156377,7.9464335441589355
-7.924453006674053,7.901661396026611
-7.928117974144348,7.9454569816589355
-7.935542022791058,7.955000400543213
-7.910094953104535,7.935506343841553
-7.928117974144348,7.9187541007995605
-7.950781972366453,7.950380325317383
-7.993715522619759,7.9850850105285645
-7.889410352488291,7.966698169708252
-7.9393021526221474,7.922132968902588
-7.887806980848277,7.91421365737915
-7.924453006674053,7.90984582901001
-7.950781972366453,7.947117328643799
-7.9430951409681345,7.940871715545654
-7.9393021526221474,7.886920928955078
-7.931814161156377,7.9372992515563965
-7.966576241738391,7.956357479095459
-7.9393021526221474,7.933673858642578
-7.924453006674053,7.923942565917969
-7.910094953104535,7.911860466003418
-7.9430951409681345,7.95086669921875
-7.954677021213342,7.951948165893555
-7.954677021213342,7.931108474731445
-7.928117974144348,7.948458194732666
-7.889410352488291,7.889708042144775
-7.8728955601551585,7.915892124176025
-7.920818811243059,7.917481899261475
-7.928117974144348,7.919978618621826
-7.920818811243059,7.942978858947754
-7.9393021526221474,7.925885200500488
-7.931814161156377,7.937832355499268
-7.9430951409681345,7.950500011444092
-7.903090094245322,7.900095462799072
-7.9393021526221474,7.946404933929443
-7.954677021213342,7.9490647315979
-7.935542022791058,7.932661533355713
-7.954677021213342,7.962453842163086
-7.935542022791058,7.9559149742126465
-7.925565706285505,7.9563307762146
-7.950781972366453,7.952571868896484
-7.950781972366453,7.927413463592529
-7.950781972366453,7.954765796661377
-7.931814161156377,7.916782855987549
-7.9430951409681345,7.942391872406006
-7.954677021213342,7.936227798461914
-7.931814161156377,7.957432746887207
-7.903090094245322,7.899101257324219
-7.995678626217357,7.9443678855896
-7.946082651207223,7.929468631744385
-7.946921547407927,7.925211429595947
-7.935542022791058,7.945815086364746
-7.954677021213342,7.948029518127441
-7.966617665152964,7.890135765075684
-7.978810702253626,7.979954719543457
-7.950781972366453,7.959824562072754
-7.946921547407927,7.934408187866211
-7.901574427881827,7.947108745574951
-7.946921547407927,7.966221332550049
-7.978895913358191,7.965656757354736
-7.935542022791058,7.916930198669434
-7.9737577757544535,7.931328296661377
-7.844664854175832,7.911613464355469
-7.860119116630385,7.922715663909912
-7.892790308673911,7.951059818267822
-7.950781972366453,7.935908794403076
-7.882728704344236,7.91175651550293
-7.924453006674053,7.892088890075684
-7.931814161156377,7.959926128387451
-7.897970809988902,7.921991348266602
-7.913640203677234,7.885162353515625
-7.8761493177145505,7.907483100891113
-7.931814161156377,7.926347255706787
-7.950781972366453,7.948086261749268
-7.924453006674053,7.924981594085693
-7.966576241738391,7.9922051429748535
-7.928117974144348,7.9207892417907715
-7.954677021213342,7.956361293792725
-7.9430951409681345,7.933309078216553
-7.928117974144348,7.959116458892822
-7.935542022791058,7.9641642570495605
-7.928117974144348,7.92781400680542
-7.954677021213342,7.9370856285095215
-7.954677021213342,7.932303428649902
-7.982923651140671,7.9340009689331055
-7.954677021213342,7.9333343505859375
-7.9335681432273475,7.954200744628906
-7.995678626217357,7.973893165588379
-7.9393021526221474,7.926364421844482
-7.950781972366453,7.938216686248779
-7.935542022791058,7.933602333068848
-7.924453006674053,7.942749500274658
-7.9430951409681345,7.9164299964904785
-7.928117974144348,7.939122676849365
-7.827702142900784,7.947993755340576
-7.946921547407927,7.958862781524658
-7.9430951409681345,7.942214012145996
-7.931814161156377,7.948693752288818
-7.9393021526221474,7.952617168426514
-7.946921547407927,7.928866863250732
-7.928117974144348,7.933901786804199
-7.954677021213342,7.933784008026123
-7.928117974144348,7.934540748596191
-7.9393021526221474,7.921687126159668
-7.950781972366453,7.963825702667236
-7.935542022791058,7.918941020965576
-7.982966659490206,7.9443039894104
-7.928117974144348,7.94296932220459
-7.954677021213342,7.965857982635498
-7.935542022791058,7.946767807006836
-7.906578398789698,7.928596496582031
-7.982923651140671,7.919942378997803
-7.924453006674053,7.933143138885498
-7.970532618892763,7.9083356857299805
-7.946921547407927,7.953658580780029
-7.9913998274291025,7.963475704193115
-7.954677021213342,7.964172840118408
-7.9737577757544535,7.909488201141357
-7.9393021526221474,7.927657127380371
-7.920818811243059,7.9417033195495605
-7.9737577757544535,7.939825057983398
-7.935542022791058,7.933986186981201
-7.935542022791058,7.9067511558532715
-7.954677021213342,7.939164638519287
-7.950781972366453,7.940021514892578
-7.928117974144348,7.918795585632324
-7.903090094245322,7.935362815856934
-7.928117974144348,7.923391819000244
-7.928117974144348,7.950434684753418
-7.954677021213342,7.943472385406494
-7.946921547407927,7.930406093597412
-7.939379961634402,7.944888591766357
-7.82102305270683,7.912356376647949
-7.94551824914185,7.9603190422058105
-7.928117974144348,7.946422576904297
-7.950781972366453,7.933373928070068
-7.950781972366453,7.929450035095215
-7.832673025823477,7.890437602996826
-7.928117974144348,7.952245235443115
-7.978810702253626,7.978755474090576
-7.995678626217357,7.940891265869141
-7.995678626217357,7.945559501647949
-7.91721462968355,7.937079429626465
-7.928117974144348,7.960793972015381
-7.886056354845152,7.947070598602295
-7.935542022791058,7.939555644989014
-7.959933497874262,7.976023197174072
-7.946921547407927,7.951712131500244
-7.982966659490206,7.959019184112549
-7.863280055279963,7.938990116119385
-7.91721462968355,7.947362422943115
-7.924453006674053,7.921505928039551
-7.931814161156377,7.933063983917236
-7.954677021213342,7.921798229217529
-7.882728704344236,7.916816711425781
-7.924453006674053,7.920047283172607
-7.946921547407927,7.937960147857666
-7.896196359268842,7.923720359802246
-7.950781972366453,7.931321144104004
-7.910094953104535,7.925204753875732
-7.866459873882536,7.935362339019775
-7.950781972366453,7.949573040008545
-7.920818811243059,7.934127330780029
-7.954677021213342,7.949000835418701
-7.9430951409681345,7.917695045471191
-7.866459873882536,7.910151958465576
-7.910094953104535,7.932223320007324
-7.8761493177145505,7.909290313720703
-7.950781972366453,7.934272289276123
-7.896125840447619,7.913916110992432
-7.889410352488291,7.929840564727783
-7.928117974144348,7.931485652923584
-7.903090094245322,7.923695087432861
-7.931814161156377,7.923584461212158
-7.939379961634402,7.9253411293029785
-7.895458192229938,7.929590702056885
-7.950781972366453,7.934764385223389
-7.91721462968355,7.952908515930176
-7.954677021213342,7.936783313751221
-7.950781972366453,7.937531471252441
-7.9393021526221474,7.910389423370361
-7.9430951409681345,7.969201564788818
-7.93935659707521,7.888189792633057
-7.950781972366453,7.945460796356201
-7.903090094245322,7.885934352874756
-7.920818811243059,7.939842700958252
-7.946921547407927,7.93148946762085
-7.950781972366453,7.940006732940674
-7.950781972366453,7.949326038360596
-7.928117974144348,7.957799911499023
-7.946921547407927,7.933023929595947
-7.958607309235428,7.950772762298584
-7.946921547407927,7.942963600158691
-7.920818811243059,7.926389217376709
-7.892790308673911,7.911994934082031
-7.847706165863548,7.899570941925049
-7.928117974144348,7.9399800300598145
-7.910094953104535,7.919267654418945
-7.924453006674053,7.9250168800354
-7.924453006674053,7.918389320373535
-7.896196359268842,7.9371209144592285
-7.9430951409681345,7.959542751312256
-7.943055911701025,7.922526836395264
-7.913640203677234,7.922430515289307
-7.924453006674053,7.922549724578857
-7.896196359268842,7.921818256378174
-7.924453006674053,7.949930191040039
-7.950781972366453,7.92277717590332
-7.9430951409681345,7.942596912384033
-7.91721462968355,7.89823579788208
-7.946921547407927,7.941748142242432
-7.935542022791058,7.916919231414795
-7.913640203677234,7.912908554077148
-7.950781972366453,7.953860759735107
-7.954677021213342,7.928495407104492
-7.9430951409681345,7.936120510101318
-7.924453006674053,7.909317493438721
-7.928117974144348,7.936648845672607
-7.924453006674053,7.923229694366455
-7.9393021526221474,7.941810131072998
-7.910094953104535,7.918574810028076
-7.950781972366453,7.9610676765441895
-7.882728704344236,7.912288188934326
-7.924453006674053,7.946874141693115
-7.946921547407927,7.956007480621338
-7.928117974144348,7.90250825881958
-7.882728704344236,7.919198036193848
-7.879425560900211,7.9078779220581055
-7.924453006674053,7.922860622406006
-7.920818811243059,7.936208248138428
-7.92729567327985,7.947367191314697
-7.926738213581133,7.928441524505615
-7.9737577757544535,7.9454169273376465
-7.9430951409681345,7.930728912353516
-7.9430951409681345,7.975788593292236
-7.847806170429149,7.896352767944336
-7.946921547407927,7.938995838165283
-7.889410352488291,7.900430202484131
-7.9393021526221474,7.928155422210693
-7.9430951409681345,7.9744744300842285
-7.954677021213342,7.934503078460693
-7.948366372629572,7.94865083694458
-7.950781972366453,7.944305896759033
-7.950781972366453,7.937227249145508
-7.950781972366453,7.952587604522705
-7.87543550142629,7.9232635498046875
-7.935542022791058,7.920490264892578
-7.990339285400088,7.9448323249816895
-7.8416326138557455,7.9150824546813965
-7.928117974144348,7.939273357391357
-7.892790308673911,7.920816898345947
-7.954677021213342,7.950738906860352
-7.886056354845152,7.921210765838623
-7.950781972366453,7.936525821685791
-7.928117974144348,7.935879230499268
-7.9430951409681345,7.910350799560547
-7.9430951409681345,7.933818340301514
-7.9430951409681345,7.9372687339782715
-7.995678626217357,7.989497661590576
-7.9317376797944785,7.927036285400391
-7.935542022791058,7.9467573165893555
-7.9913998274291025,7.958587169647217
-8.004899782157656,7.9733052253723145
-7.8761493177145505,7.928051471710205
-7.954677021213342,7.980375289916992
-7.887178538791211,7.932450294494629
-7.931814161156377,7.9311909675598145
-7.935542022791058,7.951308727264404
-7.924453006674053,7.908495903015137
-7.931814161156377,7.966609001159668
-7.9393021526221474,7.939854621887207
-7.9430951409681345,7.934151649475098
-7.946921547407927,7.948456287384033
-7.882728704344236,7.8998847007751465
-7.931814161156377,7.941835880279541
-7.9393021526221474,7.927866458892822
-7.924453006674053,7.917360305786133
-7.9393021526221474,7.950687408447266
-7.935542022791058,7.9252543449401855
-7.950241642100192,7.926009178161621
-7.931814161156377,7.957014560699463
-7.950781972366453,7.930663585662842
-7.954677021213342,7.947576999664307
-7.89962956062971,7.901035785675049
-7.954677021213342,7.967288494110107
-7.950781972366453,7.956477165222168
-7.920818811243059,7.916676998138428
-7.950781972366453,7.969922065734863
-7.928117974144348,7.924373626708984
-7.928117974144348,7.948700428009033
-7.9430951409681345,7.938456058502197
-7.950781972366453,7.931722640991211
-7.950781972366453,7.950983047485352
-7.995678626217357,7.95042610168457
-7.978810702253626,7.961446285247803
-7.931814161156377,7.933144569396973
-7.935542022791058,7.921739101409912
-7.9913998274291025,7.967574596405029
-7.924453006674053,7.9216461181640625
-7.954677021213342,7.948277473449707
-7.924453006674053,7.93136739730835
-7.928117974144348,7.922667026519775
-7.950781972366453,7.942428112030029
-7.869665979871627,7.92561674118042
-7.8761493177145505,7.906564235687256
-7.91721462968355,7.926616191864014
-8.008819571765459,8.021341323852539
-7.920818811243059,7.910051345825195
-7.920818811243059,7.932442665100098
-7.903090094245322,7.92207670211792
-7.91375018033154,7.932775974273682
-7.954677021213342,7.950888156890869
-7.93468629292431,7.94821310043335
-7.935542022791058,7.937043190002441
-7.935542022791058,7.912775039672852
-7.970616219270671,7.951240539550781
-7.91721462968355,7.874694347381592
-7.946921547407927,7.946591377258301
-7.950781972366453,7.936942100524902
-7.995678626217357,7.913962364196777
-7.9393021526221474,7.943434238433838
-7.950781972366453,7.947695255279541
-7.928117974144348,7.9465250968933105
-7.89962956062971,7.933901309967041
-7.950781972366453,7.9722819328308105
-7.950781972366453,7.929248809814453
-7.946921547407927,7.90726900100708
-7.931814161156377,7.939090251922607
-7.91721462968355,7.937397003173828
-7.892790308673911,7.927015781402588
-7.9430951409681345,7.947170257568359
-7.950781972366453,7.960179328918457
-7.913640203677234,7.889832973480225
-7.913640203677234,7.917163372039795
-7.9430951409681345,7.91697883605957
-7.995678626217357,7.950712203979492
-7.924453006674053,7.916630744934082
-7.8877303691149265,7.943637371063232
-7.928117974144348,7.923746109008789
-7.847706165863548,7.919273853302002
-7.931814161156377,7.946834564208984
-7.924453006674053,7.932340145111084
-7.91721462968355,7.935917854309082
-7.950781972366453,7.96399450302124
-7.9393021526221474,7.937520980834961
-7.9393021526221474,7.911530017852783
-7.954677021213342,7.943975448608398
-7.954677021213342,7.924279689788818
-7.995678626217357,7.9807963371276855
-7.950781972366453,7.930598258972168
-7.950781972366453,7.965096950531006
-7.950781972366453,7.912574291229248
-7.879425560900211,7.901268482208252
-7.931814161156377,7.927708625793457
-7.903607877954982,7.956635475158691
-7.9393021526221474,7.924562931060791
-7.946921547407927,7.939012050628662
-7.946921547407927,7.951868534088135
-7.9393021526221474,7.947336673736572
-7.950781972366453,7.942612171173096
-7.950781972366453,7.961160659790039
-7.924453006674053,7.906721591949463
-7.954677021213342,7.917543411254883
-7.954677021213342,7.941587924957275
-7.889410352488291,7.899914264678955
-7.910094953104535,7.906425952911377
-7.954677021213342,7.94132137298584
-7.950781972366453,7.932076930999756
-7.928117974144348,7.927026271820068
-7.879425560900211,7.890792369842529
-7.958607309235428,7.94711971282959
-7.950781972366453,7.961108684539795
-7.958607309235428,7.960585117340088
-7.950781972366453,7.96450138092041
-7.954677021213342,7.953683376312256
-7.935542022791058,7.9477386474609375
-7.903090094245322,7.950222492218018
-7.974694136660875,7.959621906280518
-7.931814161156377,7.924607276916504
-7.954677021213342,7.976053714752197
-7.924453006674053,7.972418308258057
-7.950781972366453,7.940096378326416
-7.928117974144348,7.931913375854492
-7.995678626217357,7.973948001861572
-7.920818811243059,7.939311981201172
-7.8761493177145505,7.931336879730225
-7.866459873882536,7.918149471282959
-7.957786139863943,7.942291736602783
-7.982923651140671,7.938180923461914
-7.946921547407927,7.941244602203369
-7.950781972366453,7.93280553817749
-7.887071200127622,7.954686641693115
-7.954677021213342,7.960261821746826
-7.892790308673911,7.922518730163574
-7.9430951409681345,7.967261791229248
-7.9090928421897,7.908850193023682
-7.954677021213342,7.945064544677734
-7.946921547407927,7.946199893951416
-7.931814161156377,7.919548511505127
-7.954677021213342,7.947574138641357
-7.935542022791058,7.893551349639893
-7.925565706285505,7.906160354614258
-7.950781972366453,7.950972080230713
-7.9430951409681345,7.920947551727295
-7.954677021213342,7.940957546234131
-7.924453006674053,7.903774261474609
-7.918913331379011,7.941311836242676
-7.951268538741394,7.91102933883667
-7.935542022791058,7.945765018463135
-7.886056354845152,7.918676853179932
-7.924453006674053,7.915274143218994
-7.954677021213342,7.942756652832031
-7.928117974144348,7.922706604003906
-7.954677021213342,7.944809436798096
-7.910094953104535,7.9253764152526855
-7.924453006674053,7.944563388824463
-7.924453006674053,7.907981872558594
-7.889410352488291,7.891999244689941
-7.9393021526221474,7.942409515380859
-7.954677021213342,7.928569793701172
-7.91721462968355,7.943949222564697
-7.954677021213342,7.9452643394470215
-7.954677021213342,7.942185401916504
-7.954677021213342,7.954398155212402
-7.946921547407927,7.921652317047119
-7.928117974144348,7.9120378494262695
-7.978895913358191,7.908952236175537
-7.950781972366453,7.938976764678955
-7.9430951409681345,7.951244354248047
-7.943835773881208,7.951536655426025
-7.954677021213342,7.9534173011779785
-7.85078088734462,7.941193103790283
-7.946921547407927,7.944386959075928
-7.931814161156377,7.951284408569336
-7.950781972366453,7.95433235168457
-7.920818811243059,7.94553804397583
-7.9393021526221474,7.932459831237793
-7.920818811243059,7.9248480796813965
-7.950781972366453,7.9392781257629395
-7.924453006674053,7.917988300323486
-7.9430951409681345,7.9404683113098145
-7.978810702253626,7.964285850524902
-7.882728704344236,7.9085373878479
-7.920818811243059,7.925440311431885
-7.866459873882536,7.8916120529174805
-7.950781972366453,7.934996128082275
-7.928117974144348,7.9154372215271
-7.950781972366453,7.936602592468262
-7.954677021213342,7.953564643859863
-7.838601588751302,7.958166599273682
-7.995678626217357,7.969752311706543
-7.946921547407927,7.90931510925293
-7.931814161156377,7.925032138824463
-7.935542022791058,7.937039852142334
-7.9430951409681345,7.9504170417785645
-7.9393021526221474,7.930728912353516
-7.954677021213342,7.937239170074463
-7.935542022791058,7.907952308654785
-7.91721462968355,7.924224376678467
-7.826774591089415,7.935191631317139
-7.950781972366453,7.952494144439697
-7.826774591089415,7.926578998565674
-7.935542022791058,7.946835994720459
-7.924453006674053,7.932529449462891
-7.946921547407927,7.923462867736816
-7.970616219270671,7.970181465148926
-7.950781972366453,7.921164035797119
-7.931814161156377,7.948230266571045
-7.931814161156377,7.944238185882568
-7.94094624659741,7.928321361541748
-7.931814161156377,7.925712585449219
-7.946921547407927,7.898940086364746
-7.920818811243059,7.915675163269043
-7.9393021526221474,7.964837551116943
-7.995678626217357,7.955681324005127
-7.950781972366453,7.918969631195068
-7.924453006674053,7.929556846618652
-7.954677021213342,7.934494495391846
-7.950781972366453,7.938929557800293
-7.924453006674053,7.905105113983154
-7.946921547407927,7.93418025970459
-7.89962956062971,7.9252028465271
-7.916637144431181,7.939634799957275
-7.9393021526221474,7.933884620666504
-7.931814161156377,7.9459228515625
-7.924453006674053,7.911505222320557
-7.9393021526221474,7.927297592163086
-7.872577572415708,7.929260730743408
-7.903090094245322,7.945889949798584
-7.924453006674053,7.9172282218933105
-7.954677021213342,7.973868370056152
-7.91721462968355,7.892364978790283
-7.9393021526221474,7.936034679412842
-7.924453006674053,7.931014537811279
-7.946921547407927,7.919454097747803
-7.950781972366453,7.938787937164307
-7.924453006674053,7.944929599761963
-7.951924235060929,7.962258338928223
-7.9393021526221474,7.919656753540039
-7.946921547407927,7.943944931030273
-7.924453006674053,7.933310031890869
-7.827702142900784,7.8740715980529785
-7.924453006674053,7.906055450439453
-7.910094953104535,7.935667514801025
-7.9430951409681345,7.9635491371154785
-7.954677021213342,7.9603495597839355
-7.954677021213342,7.932145118713379
-7.951740612759727,7.953454494476318
-7.9200659509493825,7.940072536468506
-7.954677021213342,7.958951950073242
-7.924453006674053,7.934121608734131
-7.950781972366453,7.934046268463135
-7.896196359268842,7.919633388519287
-7.946921547407927,7.954137325286865
-7.957786139863943,7.9650187492370605
-7.950781972366453,7.959980487823486
-7.950781972366453,7.949404716491699
-7.950781972366453,7.938212871551514
-7.9393021526221474,7.931866645812988
-7.954677021213342,7.935929775238037
-7.950781972366453,7.925188064575195
-7.935542022791058,7.922537326812744
-7.946921547407927,7.963668346405029
-7.832673025823477,7.954591274261475
-7.957786139863943,7.968254089355469
-7.935542022791058,7.914609432220459
-7.951049882449536,7.958800792694092
-7.928117974144348,7.913321495056152
-7.913640203677234,7.963135242462158
-7.924453006674053,7.933663845062256
-7.913640203677234,7.928379535675049
-7.950781972366453,7.9572529792785645
-7.950781972366453,7.969846248626709
-7.931814161156377,7.954666614532471
-7.966617665152964,7.927480220794678
-7.905505004370402,7.926863193511963
-7.931080216138895,7.973573207855225
-7.906578398789698,7.936047077178955
-7.954677021213342,7.941507816314697
-7.903090094245322,7.906968593597412
-7.946921547407927,7.966318607330322
-7.8761493177145505,7.911497116088867
-7.847706165863548,7.924615859985352
-7.954677021213342,7.919577598571777
-7.928117974144348,7.95084810256958
-7.950781972366453,7.941148281097412
-7.89962956062971,7.923161029815674
-7.950781972366453,7.954012393951416
-7.946921547407927,7.948038101196289
-7.966576241738391,7.961925029754639
-7.89962956062971,7.93039083480835
-7.91721462968355,7.9182963371276855
-7.91721462968355,7.941176891326904
-7.920818811243059,7.950182914733887
-7.954677021213342,7.929765701293945
-7.896196359268842,7.923272132873535
-7.946921547407927,7.931732654571533
-7.950781972366453,7.941895484924316
-7.950781972366453,7.956714630126953
-7.954677021213342,7.945602893829346
-7.914869981638795,7.941349506378174
-7.903090094245322,7.894212245941162
-7.950781972366453,7.935599327087402
-7.928117974144348,7.923058032989502
-7.924453006674053,7.923930644989014
-7.924453006674053,7.9132981300354
-7.954677021213342,7.946319580078125
-7.954677021213342,7.952504634857178
-7.928117974144348,7.930068016052246
-7.954677021213342,7.906269073486328
-7.9430951409681345,7.9357590675354
-7.954677021213342,7.966088771820068
-7.8761493177145505,7.898033618927002
-8.026824561605242,7.981276035308838
-7.946921547407927,7.956181049346924
-7.935542022791058,7.93214750289917
-7.946921547407927,7.917327404022217
-7.9393021526221474,7.937358379364014
-7.928117974144348,7.949512958526611
-7.91721462968355,7.9313883781433105
-7.9430951409681345,7.964598178863525
-7.954677021213342,7.938620090484619
-7.924453006674053,7.943449020385742
-7.889410352488291,7.931596279144287
-7.924453006674053,7.936812877655029
-7.950781972366453,7.9411234855651855
-7.9393021526221474,7.950068950653076
-7.931714436094428,7.891203880310059
-7.9430951409681345,7.945789337158203
-7.9430951409681345,7.948681354522705
-7.954677021213342,7.9725847244262695
-7.91721462968355,7.908260345458984
-7.954677021213342,7.953732967376709
-7.950781972366453,7.9444580078125
-7.931814161156377,7.900355339050293
-7.950781972366453,7.9642653465271
-7.925990174229664,7.952359676361084
-7.982923651140671,7.920237064361572
-7.954677021213342,7.956886291503906
-7.82330639418584,7.898536205291748
-7.903090094245322,7.926513671875
-7.924453006674053,7.915195465087891
-7.9393021526221474,7.984394550323486
-7.928117974144348,7.894337177276611
-7.924453006674053,7.919167995452881
-7.9393021526221474,7.953063488006592
-7.935542022791058,7.947791576385498
-7.920818811243059,7.9359450340271
-7.950781972366453,7.968493938446045
-7.935542022791058,7.924011707305908
-7.954677021213342,7.9240217208862305
-7.954677021213342,7.944449424743652
-7.950781972366453,7.958194255828857
-7.910094953104535,7.928317070007324
-7.928117974144348,7.909306049346924
-7.886056354845152,7.919352054595947
-7.906578398789698,7.908297061920166
-7.910094953104535,7.9094648361206055
-7.920818811243059,7.916229724884033
-7.928117974144348,7.9246439933776855
-7.9393021526221474,7.926253318786621
-7.958607309235428,7.940389156341553
-7.954677021213342,7.918909549713135
-7.910094953104535,7.89734411239624
-7.950781972366453,7.9304327964782715
-7.935542022791058,7.957889080047607
-7.85078088734462,7.943032741546631
-7.954677021213342,7.94827127456665
-7.9393021526221474,7.9273295402526855
-7.906578398789698,7.928551197052002
-7.924453006674053,7.934198379516602
-7.950781972366453,7.95196533203125
-7.913640203677234,7.923384666442871
-7.9393021526221474,7.9229278564453125
-7.950781972366453,7.9279303550720215
-7.9393021526221474,7.951209545135498
-7.928117974144348,7.937489032745361
-7.9393021526221474,7.930836200714111
-7.935542022791058,7.959806442260742
-7.954677021213342,7.967412948608398
-7.931814161156377,7.923867702484131
-7.928117974144348,7.952742099761963
-7.924453006674053,7.9460906982421875
-7.889410352488291,7.903867244720459
-7.866459873882536,7.927130699157715
-7.869665979871627,7.903818607330322
-7.928117974144348,7.949148178100586
-7.928117974144348,7.92559814453125
-7.928117974144348,7.936915874481201
-7.89962956062971,7.933688163757324
-7.950781972366453,7.957698822021484
-7.954677021213342,7.947677135467529
-7.946921547407927,7.92832612991333
-7.946921547407927,7.940205097198486
-7.9430951409681345,7.898006439208984
-7.935542022791058,7.947879314422607
-7.896196359268842,7.924892425537109
-7.924453006674053,7.946441173553467
-7.931814161156377,7.933703422546387
-7.950781972366453,7.973059177398682
-7.950781972366453,7.946876049041748
-7.9430951409681345,7.9399237632751465
-7.9430951409681345,7.956312656402588
-7.913640203677234,7.955099105834961
-7.931814161156377,7.908474922180176
-7.903090094245322,7.9426116943359375
-7.946921547407927,7.949060440063477
-7.982923651140671,7.925644874572754
-7.882728704344236,7.9188127517700195
-7.931814161156377,7.975151538848877
-7.9393021526221474,7.959212779998779
-7.924453006674053,7.896594524383545
-7.9430951409681345,7.931041717529297
-7.978810702253626,7.943643093109131
-7.978895913358191,7.947399616241455
-7.966085998972441,7.943921089172363
-7.903090094245322,7.932301998138428
-7.954677021213342,7.9261860847473145
-7.9737577757544535,7.940562725067139
-7.9393021526221474,7.894569396972656
-7.924453006674053,7.9163899421691895
-7.920818811243059,7.93264627456665
-7.931814161156377,7.930677890777588
-7.954677021213342,7.963311672210693
-7.954677021213342,7.958565711975098
-7.954677021213342,7.947386264801025
-7.954677021213342,7.951722145080566
-7.924453006674053,7.91369104385376
-7.924453006674053,7.931122303009033
-7.935542022791058,7.956986904144287
-7.931814161156377,7.954161167144775
-7.950781972366453,7.94406270980835
-7.954677021213342,7.982450485229492
-7.954677021213342,7.913023471832275
-7.951006778242098,7.934085845947266
-7.889410352488291,7.934779644012451
-7.924453006674053,7.922332286834717
-7.924453006674053,7.9152140617370605
-7.950781972366453,7.932830333709717
-7.9737577757544535,7.977935314178467
-7.924453006674053,7.9607768058776855
-7.89962956062971,7.925917148590088
-7.954677021213342,7.966615676879883
-7.911379335946439,7.922462463378906
-7.847706165863548,7.951465129852295
-7.935542022791058,7.936818599700928
-7.950781972366453,7.88930606842041
-7.954677021213342,7.928928852081299
-7.950781972366453,7.971360206604004
-7.838693701646425,7.934251308441162
-7.910094953104535,7.91928243637085
-7.928117974144348,7.921388149261475
-7.982923651140671,7.952683448791504
-7.920818811243059,7.911455154418945
-7.935542022791058,7.941138744354248
-7.928155902956855,7.921720504760742
-7.886056354845152,7.934596538543701
-7.946921547407927,7.9248223304748535
-7.924453006674053,7.92598295211792
-7.9393021526221474,7.921236991882324
-7.924453006674053,7.9322028160095215
-7.9430951409681345,7.957489013671875
-7.946921547407927,7.938410758972168
-7.886056354845152,7.951252460479736
-7.89962956062971,7.934741020202637
-7.954677021213342,7.982112884521484
-7.85205769961263,7.920872688293457
-7.928117974144348,7.9369330406188965
-7.954677021213342,7.924105644226074
-7.931814161156377,7.947402477264404
-7.9393021526221474,7.974113941192627
-7.954677021213342,7.936079502105713
-7.857113944429969,7.902675628662109
-7.946921547407927,7.926687717437744
-7.950781972366453,7.947804927825928
-7.954677021213342,7.95233678817749
-7.882728704344236,7.920580863952637
-7.950781972366453,7.941451072692871
-7.954677021213342,7.963375091552734
-7.920818811243059,7.899934768676758
-7.950781972366453,7.908650875091553
-7.913640203677234,7.926246643066406
-7.954333871520422,7.910484790802002
-7.920818811243059,7.928922176361084
-7.950781972366453,7.968001365661621
-7.931814161156377,7.939971446990967
-7.946921547407927,7.9021477699279785
-7.924453006674053,7.939837455749512
-7.950781972366453,7.940227508544922
-7.950781972366453,7.945505619049072
-7.9393021526221474,7.932717800140381
-7.978810702253626,7.960259437561035
-7.89962956062971,7.92012357711792
-7.896196359268842,7.940695285797119
-7.954677021213342,7.942299842834473
-7.924453006674053,7.9305739402771
-7.931814161156377,7.920877933502197
-7.950781972366453,7.924209117889404
-7.950781972366453,7.923586845397949
-7.935542022791058,7.899667739868164
-7.89962956062971,7.916032791137695
-7.946921547407927,7.963460445404053
-7.954677021213342,7.9737420082092285
-7.815309402546056,7.918713092803955
-7.924453006674053,7.932056903839111
-7.924453006674053,7.923855304718018
-7.982923651140671,7.947923183441162
-7.924453006674053,7.928531646728516
-7.954677021213342,7.947187423706055
-7.954677021213342,7.949171543121338
-7.992871189127312,7.961768627166748
-7.91721462968355,7.900319576263428
-7.924453006674053,7.902519702911377
-7.928117974144348,7.936868190765381
-7.995678626217357,7.943813800811768
-7.91721462968355,7.9340901374816895
-7.958607309235428,7.963490009307861
-7.931814161156377,7.9253010749816895
-7.860119116630385,7.945927619934082
-7.920818811243059,7.90903377532959
-7.946921547407927,7.942087650299072
-7.9393021526221474,7.934823513031006
-7.946921547407927,7.952171325683594
-7.928117974144348,7.944380283355713
-7.8728955601551585,7.914418697357178
-7.928117974144348,7.938899517059326
-7.954677021213342,7.950459003448486
-7.928117974144348,7.944241046905518
-7.950781972366453,7.9390764236450195
-7.950781972366453,7.951565742492676
-7.950781972366453,7.938858509063721
-7.927370286369725,7.955472469329834
-7.954677021213342,7.913314342498779
-7.9430951409681345,7.9377875328063965
-7.946921547407927,7.963031768798828
-7.89962956062971,7.92672872543335
-7.924453006674053,7.9386162757873535
-7.826774591089415,7.912790298461914
-7.950781972366453,7.952855587005615
-7.946921547407927,7.9507856369018555
-7.995678626217357,7.941367149353027
-7.924453006674053,7.948496341705322
-7.942889676899551,7.971683979034424
-7.935542022791058,7.92551326751709
-7.924453006674053,7.933103084564209
-7.920818811243059,7.923320293426514
-7.866459873882536,7.918857574462891
-7.920818811243059,7.950439929962158
-7.931814161156377,7.918552398681641
-7.9393021526221474,7.934086799621582
-7.946921547407927,7.945502758026123
-7.9393021526221474,7.924273490905762
-7.950781972366453,7.920280933380127
-7.903090094245322,7.9133453369140625
-7.950781972366453,7.9576263427734375
-7.924453006674053,7.948847770690918
-7.9430951409681345,7.920015811920166
-7.950781972366453,7.924496173858643
-7.924453006674053,7.9096598625183105
-7.9393021526221474,7.92501974105835
-7.89962956062971,7.902153968811035
-7.935542022791058,7.945440769195557
-7.910094953104535,7.90162992477417
-7.954677021213342,7.951225280761719
-7.935542022791058,7.929793834686279
-7.910313148974003,7.931987285614014
-7.93468629292431,7.961278438568115
-7.935542022791058,7.956003189086914
-7.823919469453418,7.926965713500977
-7.906578398789698,7.914440631866455
-7.954677021213342,7.962813854217529
-7.835637836224461,7.90733003616333
-7.954677021213342,7.969336032867432
-7.9393021526221474,7.945666313171387
-7.896196359268842,7.9698662757873535
-7.928117974144348,7.925455570220947
-7.920818811243059,7.939067363739014
-7.928117974144348,7.932100772857666
-7.928117974144348,7.948086261749268
-7.882728704344236,7.90248966217041
-7.924453006674053,7.927271842956543
-7.9393021526221474,7.9496564865112305
-7.954677021213342,7.92989444732666
-7.856986114171083,7.887363433837891
-7.954677021213342,7.932023048400879
-7.954677021213342,7.951998233795166
-7.906578398789698,7.907293796539307
-7.913640203677234,7.939267635345459
-7.910094953104535,7.930857181549072
-7.950781972366453,7.952860355377197
-7.924453006674053,7.910231113433838
-7.935542022791058,7.953804016113281
-7.931814161156377,7.952345848083496
-7.882728704344236,7.894123077392578
-7.924453006674053,7.931331634521484
-7.935542022791058,7.942634582519531
-7.9393021526221474,7.924188613891602
-7.969065592938858,7.950253009796143
-7.950781972366453,7.919239521026611
-7.866185328564197,7.91450834274292
-7.946921547407927,7.958665370941162
-7.954677021213342,7.938195705413818
-7.950781972366453,7.961067199707031
-7.974694136660875,7.943216800689697
-7.950781972366453,7.924688816070557
-7.954677021213342,7.9463372230529785
-7.908269328059997,7.916335582733154
-7.950781972366453,7.946926116943359
-7.928117974144348,7.911479473114014
-7.946921547407927,7.929030895233154
-7.9393021526221474,7.943685054779053
-7.913640203677234,7.900824069976807
-7.931814161156377,7.9306111335754395
-7.954677021213342,7.957282543182373
-7.910094953104535,7.933042049407959
-7.8416326138557455,7.918727397918701
-7.863280055279963,7.919785499572754
-7.9393021526221474,7.954510688781738
-7.935542022791058,7.954097270965576
-7.935542022791058,7.940657615661621
-7.920818811243059,7.922555446624756
-7.905275909355806,7.928071022033691
-7.9430951409681345,7.945883274078369
-7.9393021526221474,7.930393695831299
-7.950781972366453,7.922586917877197
-7.950781972366453,7.946272850036621
-7.950781972366453,7.952442646026611
-7.946921547407927,7.92499303817749
-7.954677021213342,7.943518161773682
-7.9430951409681345,7.941634654998779
-7.9430951409681345,7.952376365661621
-7.950781972366453,7.933996677398682
-7.946921547407927,7.938089847564697
-7.947859240258506,7.917211055755615
-7.954677021213342,7.939906120300293
-7.928117974144348,7.930912017822266
-7.931814161156377,7.931570529937744
-7.9393021526221474,7.919615268707275
-7.853226624745831,7.9110331535339355
-7.928117974144348,7.934092998504639
-7.931814161156377,7.930285930633545
-7.879425560900211,7.9429097175598145
-7.954677021213342,7.924534320831299
-7.950781972366453,7.944691181182861
-7.896196359268842,7.87730598449707
-7.924453006674053,7.936441421508789
-7.954677021213342,7.959338665008545
-7.954677021213342,7.976468086242676
-7.928117974144348,7.9206109046936035
-7.946921547407927,7.9424285888671875
-7.91721462968355,7.9244608879089355
-7.954677021213342,7.941125869750977
-7.950781972366453,7.948538303375244
-7.931814161156377,7.931985855102539
-7.954677021213342,7.924722671508789
-7.91721462968355,7.931541442871094
-7.970532618892763,7.945070743560791
-7.9393021526221474,7.930225372314453
-7.8728955601551585,7.916069507598877
-7.924453006674053,7.918466567993164
-7.928117974144348,7.8963942527771
-7.931814161156377,7.918571472167969
-7.9737577757544535,7.927097797393799
-8.022370577841233,7.975829124450684
-7.860119116630385,7.928679943084717
-7.91721462968355,7.898680210113525
-7.905472480221491,7.930340766906738
-7.8416326138557455,7.939549446105957
-7.920818811243059,7.9287109375
-7.91721462968355,7.932478427886963
-7.9393021526221474,7.927168369293213
-7.920818811243059,7.897900581359863
-7.935542022791058,7.907948017120361
-7.920818811243059,7.935700416564941
-7.954677021213342,7.966098308563232
-7.841942416353511,7.8993659019470215
-7.931814161156377,7.924650192260742
-7.903090094245322,7.9254841804504395
-7.928117974144348,7.910708904266357
-7.906578398789698,7.946858882904053
-7.9393021526221474,7.947006702423096
-7.9393021526221474,7.960524082183838
-7.892790308673911,7.940676212310791
-7.931814161156377,7.915713787078857
-7.931814161156377,7.915442943572998
-7.954677021213342,7.948211193084717
-7.931814161156377,7.932351589202881
-7.928117974144348,7.952003002166748
-7.91721462968355,7.914313316345215
-7.954677021213342,7.9740777015686035
-7.950781972366453,7.9661173820495605
-7.860119116630385,7.937984943389893
-7.931814161156377,7.911816596984863
-7.950781972366453,7.944493770599365
-7.8349671212224035,7.900071620941162
-7.954677021213342,7.951841831207275
-7.9737577757544535,7.964662075042725
-7.995678626217357,7.922858238220215
-7.9393021526221474,7.936670780181885
-7.9393021526221474,7.9300336837768555
-7.950781972366453,7.9403791427612305
-7.950781972366453,7.943337917327881
-7.91721462968355,7.916853427886963
-7.950781972366453,7.926183223724365
-7.950781972366453,7.939464569091797
-7.920818811243059,7.933261394500732
-7.928117974144348,7.935849189758301
-7.954333871520422,7.922139644622803
-7.950781972366453,7.953341007232666
-7.950781972366453,7.931042671203613
-7.928117974144348,7.930544853210449
-7.946921547407927,7.929933547973633
-7.931814161156377,7.938504695892334
-7.9430951409681345,7.93314790725708
-7.924453006674053,7.932290077209473
-7.954677021213342,7.947936534881592
-7.946921547407927,7.9166388511657715
-7.903090094245322,7.921261787414551
-7.924453006674053,7.939866065979004
-7.82102305270683,7.878201007843018
-7.954677021213342,7.954969882965088
-7.931814161156377,7.916471004486084
-7.982923651140671,7.954260349273682
-7.950781972366453,7.947807312011719
-7.928117974144348,7.9329609870910645
-7.950781972366453,7.943308353424072
-7.9430951409681345,7.920332908630371
-7.911690158781656,7.912948131561279
-7.954677021213342,7.954827785491943
-7.9393021526221474,7.938249588012695
-7.9479076803299105,7.9547600746154785
-7.950781972366453,7.944580078125
-7.954677021213342,7.964366912841797
-7.946921547407927,7.963500499725342
-7.950781972366453,7.934514999389648
-7.950781972366453,7.958690166473389
-7.928117974144348,7.925686359405518
-7.931814161156377,7.9282965660095215
-7.946921547407927,7.922677040100098
-7.924453006674053,7.921519756317139
-7.982923651140671,7.923288822174072
-7.829768510087842,7.915061950683594
-7.950781972366453,7.946308135986328
-7.924453006674053,7.943396091461182
-7.931814161156377,7.898806095123291
-7.954677021213342,7.977542877197266
-7.9430951409681345,7.959389686584473
-7.896196359268842,7.950719833374023
-7.995678626217357,7.924458980560303
-7.91721462968355,7.947399139404297
-7.892790308673911,7.915991306304932
-7.931814161156377,7.956667423248291
-7.924453006674053,7.914126873016357
-7.950781972366453,7.960804462432861
-7.838628495628443,7.9414591789245605
-7.950781972366453,7.932211875915527
-7.911016527836275,7.970885753631592
-7.946921547407927,7.950814247131348
-7.9430951409681345,7.955657958984375
-7.924453006674053,7.932712078094482
-7.9587575167254565,7.92270040512085
-7.924453006674053,7.902637958526611
-7.950781972366453,7.941129207611084
-7.982923651140671,7.96515417098999
-7.9393021526221474,7.934478759765625
-7.950781972366453,7.956911563873291
-7.85205769961263,7.931001663208008
-7.950781972366453,7.926406383514404
-7.928117974144348,7.92815637588501
-7.935542022791058,7.914670467376709
-7.946921547407927,7.9423441886901855
-7.954677021213342,7.973642349243164
-7.921323674090253,7.95160436630249
-7.882728704344236,7.923414707183838
-7.950781972366453,7.951563358306885
-7.913640203677234,7.933552265167236
-7.931814161156377,7.926986217498779
-7.924453006674053,7.950174331665039
-7.954677021213342,7.93779993057251
-7.920818811243059,7.95754861831665
-7.935542022791058,7.954860210418701
-7.856986114171083,7.907660961151123
-7.931814161156377,7.914679527282715
-7.954677021213342,7.967838287353516
-7.950781972366453,7.943596839904785
-7.950781972366453,7.9404706954956055
-7.928117974144348,7.923709392547607
-7.978810702253626,7.960428714752197
-7.954677021213342,7.9384589195251465
-7.889410352488291,7.948940753936768
-7.928117974144348,7.924616813659668
-7.856261898513873,7.962470531463623
-7.950781972366453,7.925833225250244
-7.950781972366453,7.934560298919678
-7.946921547407927,7.968562602996826
-7.9430951409681345,7.929673671722412
-7.924453006674053,7.909716606140137
-7.9393021526221474,7.924288272857666
-7.950781972366453,7.926838397979736
-7.920818811243059,7.92356538772583
-7.935542022791058,7.913172721862793
-7.928117974144348,7.9177985191345215
-7.924453006674053,7.916371822357178
-7.882728704344236,7.873579978942871
-7.950781972366453,7.965748310089111
-7.931814161156377,7.9283366203308105
-7.924453006674053,7.939871311187744
-7.906578398789698,7.94643497467041
-7.920818811243059,7.925137996673584
-7.950781972366453,7.947467803955078
-7.844664854175832,7.914740562438965
-7.924453006674053,7.915645122528076
-7.950781972366453,7.940017223358154
-7.954677021213342,7.974390983581543
-7.928117974144348,7.930912971496582
-7.966576241738391,7.9726691246032715
-7.954677021213342,7.937551975250244
-7.935542022791058,7.9348297119140625
-7.924453006674053,7.910201072692871
-7.950781972366453,7.94589376449585
-7.946921547407927,7.941497325897217
-7.882728704344236,7.901876449584961
-7.950781972366453,7.956728935241699
-7.8728955601551585,7.889523029327393
-7.950781972366453,7.926649570465088
-7.920818811243059,7.953402996063232
-7.954677021213342,7.951649188995361
-7.89962956062971,7.956407070159912
-7.866459873882536,7.895248889923096
-7.91865271790783,7.95178747177124
-7.866459873882536,7.903484344482422
-7.928117974144348,7.903463363647461
-7.882728704344236,7.898393630981445
-7.950781972366453,7.943159103393555
-7.920818811243059,7.904891014099121
-7.924453006674053,7.906307697296143
-7.9430951409681345,7.963986396789551
-7.96257349994767,7.941714286804199
-7.931814161156377,7.9248762130737305
-7.928117974144348,7.90962553024292
-7.935542022791058,7.946695327758789
-7.910094953104535,7.9527907371521
-7.946921547407927,7.942115783691406
-7.9430951409681345,7.941903591156006
-7.946921547407927,7.941832065582275
-7.9393021526221474,7.9187211990356445
-7.950781972366453,7.946191310882568
-7.924453006674053,7.929940223693848
-7.946921547407927,7.9499831199646
-7.924453006674053,7.920492649078369
-7.920818811243059,7.929013729095459
-7.940702296085409,7.940361022949219
-7.99746214624634,7.969381809234619
-7.974694136660875,7.936826229095459
-7.950781972366453,7.938182830810547
-7.9393021526221474,7.942145347595215
-7.954677021213342,7.965328693389893
-7.9430951409681345,7.921346187591553
-7.966576241738391,7.953933238983154
-7.928117974144348,7.958201885223389
-7.94476951650491,7.9589362144470215
-7.954677021213342,7.939382076263428
-7.954677021213342,7.9460129737854
-7.950781972366453,7.984411716461182
-7.89962956062971,7.950398921966553
-7.931814161156377,7.93178129196167
-7.9393021526221474,7.928808212280273
-7.950781972366453,7.946584224700928
-7.954677021213342,7.959733963012695
-7.950781972366453,7.937589168548584
-7.863280055279963,7.891761302947998
-7.9430951409681345,7.939525127410889
-7.950781972366453,7.954650402069092
-7.8728955601551585,7.894890785217285
-7.91721462968355,7.89387845993042
-7.931814161156377,7.932110786437988
-7.9430951409681345,7.9399824142456055
-7.954677021213342,7.953030109405518
-7.928117974144348,7.939277648925781
-7.950781972366453,7.951191425323486
-7.954677021213342,7.949601173400879
-7.910313148974003,7.926733493804932
-7.920818811243059,7.898784160614014
-7.954677021213342,7.983412742614746
-7.931814161156377,7.9187140464782715
-7.89962956062971,7.928927421569824
-7.8761493177145505,7.91060209274292
-7.943055911701025,7.931315898895264
-7.880892069031858,7.89415168762207
-7.924453006674053,7.90999698638916
-7.913640203677234,7.933133125305176
-7.924453006674053,7.9212422370910645
-7.889410352488291,7.904938220977783
-7.950781972366453,7.926446437835693
-7.935542022791058,7.922359466552734
-7.924453006674053,7.915548324584961
-7.93468629292431,7.983861923217773
-7.950781972366453,7.950926303863525
-7.950781972366453,7.961367130279541
-7.954677021213342,7.972741603851318
-7.975453335860696,7.937402248382568
-7.928117974144348,7.947157382965088
-7.910094953104535,7.915114879608154
-7.943705240495888,7.9306511878967285
-7.9393021526221474,7.909979820251465
-7.954677021213342,7.946024417877197
-7.954677021213342,7.963892936706543
-8.008819571765459,8.016153335571289
-7.920818811243059,7.947482585906982
-7.950781972366453,7.964303493499756
-7.950781972366453,7.960327625274658
-7.924453006674053,7.901944637298584
-7.9430951409681345,7.952600479125977
-7.903090094245322,7.924835681915283
-7.954677021213342,7.917739391326904
-7.906578398789698,7.91326379776001
-7.950781972366453,7.965797424316406
-7.950781972366453,7.935072422027588
-7.950781972366453,7.939614772796631
-7.9430951409681345,7.958513259887695
-7.924453006674053,7.943917274475098
-7.982966659490206,7.965632915496826
-7.950781972366453,7.969470500946045
-7.954677021213342,7.957895755767822
-7.950781972366453,7.954198360443115
-7.954677021213342,7.954721450805664
-7.950781972366453,7.973155498504639
-7.946921547407927,7.943119525909424
-7.910094953104535,7.949463844299316
-7.924453006674053,7.925610542297363
-7.910094953104535,7.928539276123047
-7.935542022791058,7.9178290367126465
-7.943095160397098,7.931117534637451
-7.931814161156377,7.931020259857178
-7.934954607052369,7.923720836639404
-7.928117974144348,7.937987327575684
-7.934523230454486,7.9304070472717285
-7.946921547407927,7.962028980255127
-7.950781972366453,7.9566850662231445
-7.931814161156377,7.9455647468566895
-7.987162773987728,7.953236103057861
-7.9393021526221474,7.926773548126221
-7.970532618892763,7.973599910736084
-7.924453006674053,7.952246189117432
-7.935542022791058,7.957213401794434
-7.9430951409681345,7.932615756988525
-7.946921547407927,7.905778408050537
-7.954677021213342,7.964224338531494
-7.906578398789698,7.921985626220703
-7.950781972366453,7.948602199554443
-7.946921547407927,7.939737319946289
-7.891790467655871,7.932369709014893
-7.91721462968355,7.926610469818115
-7.950781972366453,7.988801002502441
-7.978810702253626,7.950371265411377
-7.9430951409681345,7.933681011199951
-7.954677021213342,7.9486188888549805
-7.954677021213342,7.9298014640808105
-7.9430951409681345,7.920708179473877
-7.950781972366453,7.9578633308410645
-7.946921547407927,7.956915378570557
-7.924453006674053,7.904516696929932
-7.943055911701025,7.938991069793701
-7.945802750156343,7.919099807739258
-7.910094953104535,7.9345502853393555
-7.8704148050425236,7.934322357177734
-7.913640203677234,7.931066989898682
-7.954677021213342,7.94670295715332
-7.91721462968355,7.927976131439209
-7.9393021526221474,7.924401760101318
-7.935542022791058,7.9282145500183105
-7.928117974144348,7.932546615600586
-7.882728704344236,7.9123663902282715
-7.931814161156377,7.918796062469482
-7.924453006674053,7.921909809112549
-7.966617665152964,7.966385364532471
-7.954677021213342,7.96832799911499
-7.9393021526221474,7.952282428741455
-7.866459873882536,7.914586067199707
-7.9737577757544535,7.926260471343994
-7.954677021213342,7.964876174926758
-7.9393021526221474,7.940523624420166
-7.91721462968355,7.938671588897705
-7.950781972366453,7.948702335357666
-7.920818811243059,7.937179088592529
-8.040958607678906,7.963574409484863
-7.950781972366453,7.946584224700928
-7.838628495628443,7.9238762855529785
-7.954677021213342,7.961526870727539
-7.882728704344236,7.901525020599365
-7.950781972366453,7.963529109954834
-7.950781972366453,7.927896022796631
-7.896196359268842,7.928290367126465
-7.954677021213342,7.942715167999268
-7.928117974144348,7.938202381134033
-7.950781972366453,7.954861164093018
-7.954677021213342,7.95951509475708
-7.842856529162001,7.927317142486572
-7.931814161156377,7.945224761962891
-7.954677021213342,7.955911636352539
-7.950781972366453,7.960575580596924
-7.920818811243059,7.9270100593566895
-7.889410352488291,7.928534030914307
-7.970532618892763,7.968917369842529
-7.954677021213342,7.940807819366455
-7.950781972366453,7.93563175201416
-7.9393021526221474,7.9353108406066895
-7.9367221576035965,7.930088996887207
-7.947685597102714,7.938613414764404
-7.932370292702363,7.922169208526611
-7.948847473653619,7.93805456161499
-7.970532618892763,7.968932628631592
-7.935542022791058,7.941646099090576
-7.950781972366453,7.976602077484131
-7.931814161156377,7.917996883392334
-7.924453006674053,7.909297943115234
-7.881214383716381,7.908802509307861
-7.950781972366453,7.938110828399658
-7.950781972366453,7.9406561851501465
-7.9430951409681345,7.945822715759277
-7.928117974144348,7.9402313232421875
-7.935542022791058,7.89651346206665
-7.982966659490206,7.954108715057373
-7.950781972366453,7.9143967628479
-7.856986114171083,7.924523830413818
-7.950781972366453,7.944288730621338
-7.9393021526221474,7.9477105140686035
-7.924453006674053,7.926660537719727
-7.954677021213342,7.940469741821289
-7.931814161156377,7.934983253479004
-7.950781972366453,7.938111782073975
-7.950781972366453,7.936622619628906
-7.893684507036385,7.950749397277832
-7.974694136660875,7.976729869842529
-7.935542022791058,7.93810510635376
-7.954677021213342,7.944088459014893
-7.928117974144348,7.9405951499938965
-7.928117974144348,7.9320969581604
-7.946921547407927,7.94173002243042
-7.889410352488291,7.91090202331543
-7.946921547407927,7.958014965057373
-7.869665979871627,7.903125762939453
-7.9913998274291025,7.9760422706604
-7.982923651140671,7.953773021697998
-7.896196359268842,7.946218967437744
-7.950781972366453,7.946871757507324
-7.9393021526221474,7.93584680557251
-7.954677021213342,7.926092147827148
-7.946921547407927,7.934966087341309
-7.928117974144348,7.940563678741455
-7.954677021213342,7.94973087310791
-7.950781972366453,7.9310431480407715
-7.928117974144348,7.934381008148193
-7.866459873882536,7.915689945220947
-7.928117974144348,7.946811199188232
-7.9393021526221474,7.942586898803711
-7.946921547407927,7.9481916427612305
-7.913640203677234,7.939137935638428
-7.924453006674053,7.9312615394592285
-7.970532618892763,7.9210638999938965
-7.910094953104535,7.9237446784973145
-7.886056354845152,7.9381866455078125
-7.950781972366453,7.933180809020996
-7.946921547407927,7.914840221405029
-7.966617665152964,7.972033977508545
-7.946921547407927,7.945856094360352
-7.9430951409681345,7.911600589752197
-7.954677021213342,7.9357380867004395
-7.924453006674053,7.923778533935547
-7.950781972366453,7.937047481536865
-7.910094953104535,7.934398174285889
-7.950781972366453,7.9314656257629395
-7.950781972366453,7.938564777374268
-7.920818811243059,7.924046039581299
-7.946921547407927,7.9583659172058105
-7.910094953104535,7.919830799102783
-7.920956437028112,7.931581974029541
-7.8728955601551585,7.9317803382873535
-7.931814161156377,7.921534061431885
-7.946921547407927,7.887045383453369
-7.9430951409681345,7.945394039154053
-7.906578398789698,7.922149181365967
-7.9393021526221474,7.888926029205322
-7.950781972366453,7.9424309730529785
-7.9430951409681345,7.936976909637451
-7.950781972366453,7.940394878387451
-7.9393021526221474,7.948170185089111
-7.954677021213342,7.937672138214111
-7.89962956062971,7.912771701812744
-7.910094953104535,7.918306827545166
-7.954677021213342,7.955078601837158
-7.924453006674053,7.929835319519043
-7.9430951409681345,7.9364705085754395
-7.903090094245322,7.911143779754639
-7.91721462968355,7.946396827697754
-7.920818811243059,7.934448719024658
-7.954677021213342,7.966639041900635
-7.970616219270671,7.931038856506348
-7.950781972366453,7.931661605834961
-7.931814161156377,7.93755578994751
-7.928117974144348,7.9344000816345215
-7.950781972366453,7.926604747772217
-7.931814161156377,7.940086841583252
-7.920818811243059,7.944694995880127
-7.924453006674053,7.928309917449951
-7.932979898863743,7.942237377166748
-7.954677021213342,7.954859256744385
-7.920818811243059,7.92568826675415
-7.946921547407927,7.933933258056641
-7.954677021213342,7.939087390899658
-7.9393021526221474,7.928038120269775
-7.885953431936095,7.913939476013184
-7.950781972366453,7.93505859375
-7.879425560900211,7.935055732727051
-7.838628495628443,7.929039478302002
-7.924453006674053,7.915055751800537
-7.950781972366453,7.9353108406066895
-7.9430951409681345,7.9345173835754395
-7.910094953104535,7.924767971038818
-7.931814161156377,7.936240196228027
-7.950781972366453,7.955257892608643
-7.9430951409681345,7.94050931930542
-7.924453006674053,7.91928768157959
-7.818151283467686,7.925723075866699
-8.022370577841233,7.981177806854248
-7.950781972366453,7.926579475402832
-7.954677021213342,7.956207275390625
-7.935542022791058,7.939564228057861
-7.9737577757544535,7.980697154998779
-7.928117974144348,7.910521984100342
-7.915067073469715,7.924117565155029
-7.89962956062971,7.922948837280273
-7.9479076803299105,7.944885730743408
-7.924453006674053,7.9392781257629395
-7.954677021213342,7.970116138458252
-7.9430951409681345,7.93555212020874
-7.920818811243059,7.916821002960205
-7.928117974144348,7.941128253936768
-7.948172776799763,7.953537940979004
-7.910094953104535,7.906436443328857
-7.954677021213342,7.937816143035889
-7.958607309235428,7.965691566467285
-7.928117974144348,7.938024520874023
-7.9737577757544535,7.965432167053223
-7.87543550142629,7.913389682769775
-7.954677021213342,7.960411548614502
-7.928117974144348,7.8933281898498535
-7.924453006674053,7.918718338012695
-7.91721462968355,7.957363128662109
-7.935542022791058,7.948987007141113
-7.954677021213342,7.929417610168457
-7.935542022791058,7.9637603759765625
-7.954677021213342,7.983102321624756
-7.949130633177768,7.931638240814209
-7.924453006674053,7.924492835998535
-7.950781972366453,7.931124210357666
-7.931814161156377,7.9121551513671875
-7.863280055279963,7.9311909675598145
-7.970532618892763,7.963110446929932
-7.910094953104535,7.916342258453369
-7.92729567327985,7.937925338745117
-7.954677021213342,7.934074401855469
-7.9393021526221474,7.910366535186768
-7.9393021526221474,7.922093868255615
-7.982923651140671,7.936584949493408
-7.910094953104535,7.9243597984313965
-7.950781972366453,7.972893714904785
-7.950781972366453,7.963480472564697
-7.920818811243059,7.895321369171143
-7.896125840447619,7.92781925201416
-7.91721462968355,7.942789554595947
-7.913640203677234,7.934648513793945
-7.954677021213342,7.945847511291504
-7.9393021526221474,7.945279598236084
-7.924453006674053,7.924487113952637
-7.844664854175832,7.889416217803955
-7.950781972366453,7.938253402709961
-7.830984932712759,7.937228679656982
-7.9393021526221474,7.9226460456848145
-7.935542022791058,7.931163311004639
-7.931814161156377,7.92999267578125
-7.9393021526221474,7.958251953125
-7.920818811243059,7.918343544006348
-7.928117974144348,7.925930976867676
-7.950781972366453,7.9600653648376465
-7.935542022791058,7.939876079559326
-7.946921547407927,7.923799514770508
-7.954677021213342,7.965965747833252
-7.964781356411861,7.957921981811523
-7.9430951409681345,7.960052013397217
-7.910094953104535,7.928222179412842
-7.931814161156377,7.937897205352783
-7.950781972366453,7.9409661293029785
-7.950781972366453,7.941215991973877
-7.908118640017608,7.9061102867126465
-7.935542022791058,7.923643112182617
-7.85078088734462,7.926427364349365
-7.9393021526221474,7.90508508682251
-7.913640203677234,7.875388145446777
-7.924453006674053,7.926723003387451
-7.950781972366453,7.941670894622803
-7.85078088734462,7.926690578460693
-7.950781972366453,7.952922344207764
-7.911690158781656,7.908010959625244
-7.954677021213342,7.933392524719238
-7.9430951409681345,7.9284186363220215
-7.950781972366453,7.945617198944092
-7.866459873882536,7.911087512969971
-7.854304717060746,7.912326335906982
-7.950781972366453,7.963776111602783
-7.950781972366453,7.934469223022461
-7.950781972366453,7.938369274139404
-7.946921547407927,7.9372782707214355
-7.9430951409681345,7.93396520614624
-7.928117974144348,7.906583309173584
-7.946921547407927,7.937119960784912
-7.923581356476356,7.9502387046813965
-7.950781972366453,7.9572882652282715
-7.825685176283933,7.904521942138672
-7.931814161156377,7.930428504943848
-7.946921547407927,7.941776275634766
-7.954677021213342,7.96002721786499
-7.9393021526221474,7.923773288726807
-7.924453006674053,7.9288177490234375
-7.954677021213342,7.9542317390441895
-7.928117974144348,7.943906784057617
-7.950781972366453,7.928724765777588
-7.952725130123009,7.929850101470947
-7.924453006674053,7.930662631988525
-7.920818811243059,7.918556213378906
-7.9393021526221474,7.905813217163086
-7.952909203067603,7.920796871185303
-7.904464059571048,7.903867721557617
-7.970616219270671,7.961671352386475
-7.9430951409681345,7.945714473724365
-7.935542022791058,7.932638645172119
-7.950781972366453,7.9423909187316895
-7.950781972366453,7.955142021179199
-7.924453006674053,7.9187331199646
-7.954677021213342,7.957936763763428
-7.924453006674053,7.92057466506958
-7.954677021213342,7.943336009979248
-7.920818811243059,7.9210944175720215
-7.896196359268842,7.917187213897705
-7.946921547407927,7.914596080780029
-7.950781972366453,7.97445011138916
-7.924453006674053,7.927545070648193
-7.903090094245322,7.934030532836914
-7.935542022791058,7.935786724090576
-7.950781972366453,7.942460060119629
-7.9393021526221474,7.943187236785889
-7.931814161156377,7.914685249328613
-7.950781972366453,7.9288763999938965
-7.913640203677234,7.954702377319336
-7.966576241738391,7.977516174316406
-7.931814161156377,7.943288803100586
-7.878606331107103,7.896564960479736
-7.950781972366453,7.9109883308410645
-7.886056354845152,7.965150833129883
-7.954677021213342,7.961979389190674
-7.920818811243059,7.923764228820801
-7.950781972366453,7.953344821929932
-7.954677021213342,7.96074914932251
-7.906578398789698,7.916589260101318
-7.847706165863548,7.913035869598389
-7.946921547407927,7.931229591369629
-7.906542242015022,7.946278095245361
-7.946921547407927,7.945517063140869
-7.946921547407927,7.954697608947754
-7.928117974144348,7.933121681213379
-7.954677021213342,7.978722095489502
-7.9393021526221474,7.934224605560303
-7.946921547407927,7.9222941398620605
-7.818151283467686,7.911892414093018
-7.924453006674053,7.935587406158447
-7.91721462968355,7.915931701660156
-7.950781972366453,7.950990200042725
-7.910094953104535,7.92617654800415
-7.896196359268842,7.932271957397461
-7.924453006674053,7.945249557495117
-7.924453006674053,7.966817378997803
-7.9393021526221474,7.936184406280518
-7.910094953104535,7.919100761413574
-7.910094953104535,7.905315399169922
-7.950781972366453,7.935184001922607
-7.9393021526221474,7.934863567352295
-7.931814161156377,7.924524307250977
-7.9430951409681345,7.964099407196045
-7.954677021213342,7.925231456756592
-7.9430951409681345,7.942864894866943
-7.954677021213342,7.9398980140686035
-7.954677021213342,7.967944622039795
-7.920818811243059,7.9352946281433105
-7.970616219270671,7.946276664733887
-7.946921547407927,7.936136245727539
-7.920818811243059,7.918210506439209
-7.977975326564206,7.991052150726318
-7.889410352488291,7.937988758087158
-7.9393021526221474,7.942216873168945
-7.954677021213342,7.931778430938721
-7.924453006674053,7.92246150970459
-7.950781972366453,7.955379962921143
-7.931814161156377,7.9214043617248535
-7.935542022791058,7.942183017730713
-7.946921547407927,7.9313483238220215
-7.9393021526221474,7.921851634979248
-7.896196359268842,7.895965099334717
-7.950781972366453,7.9257121086120605
-7.9737577757544535,7.933059215545654
-7.855305266277571,7.954945087432861
-7.954677021213342,7.9403300285339355
-7.91721462968355,7.959653377532959
-7.9200659509493825,7.933774471282959
-7.950781972366453,7.949417591094971
-7.9393021526221474,7.919125080108643
-7.946921547407927,7.974360942840576
-7.950781972366453,7.926098346710205
-7.935542022791058,7.931629180908203
-7.913640203677234,7.94236946105957
-7.946921547407927,7.916535377502441
-7.946921547407927,7.952697277069092
-7.939379961634402,7.927196979522705
-7.920818811243059,7.933676719665527
-7.889410352488291,7.9424591064453125
-7.882728704344236,7.937510967254639
-7.91721462968355,7.932093620300293
-7.892790308673911,7.919637203216553
-7.920818811243059,7.941732883453369
-7.928117974144348,7.935484409332275
-7.924453006674053,7.930945873260498
-7.9430951409681345,7.940794944763184
-7.935542022791058,7.915756702423096
-7.9200659509493825,7.938164234161377
-7.950781972366453,7.950182914733887
-8.008819571765459,7.989920139312744
-7.928117974144348,7.929203987121582
-7.9430951409681345,7.938027381896973
-7.920818811243059,7.930217742919922
-7.954677021213342,7.911098957061768
-7.924453006674053,7.935036659240723
-7.974694136660875,7.957452297210693
-7.882728704344236,7.913239479064941
-7.953736512549211,7.904125690460205
-7.928117974144348,7.94032621383667
-7.950781972366453,7.919917106628418
-7.950781972366453,7.947113037109375
-7.924453006674053,7.9162116050720215
-7.924453006674053,7.946259021759033
-7.913640203677234,7.924929141998291
-7.896196359268842,7.945697784423828
-7.950781972366453,7.925403118133545
-7.869665979871627,7.941838264465332
-7.931814161156377,7.958804607391357
-7.9393021526221474,7.933877944946289
-7.946921547407927,7.931833267211914
-7.9393021526221474,7.92969274520874
-7.995678626217357,7.913920879364014
-7.9430951409681345,7.959017753601074
-7.950781972366453,7.94434928894043
-7.913640203677234,7.9448771476745605
-7.954677021213342,7.955540180206299
-7.9393021526221474,7.940652847290039
-7.946921547407927,7.940086841583252
-7.906578398789698,7.931277751922607
-7.924453006674053,7.950153827667236
-7.931814161156377,7.917366981506348
-7.970532618892763,7.987121105194092
-7.913640203677234,7.909302711486816
-7.9430951409681345,7.92671537399292
-7.946921547407927,7.930017948150635
-7.89962956062971,7.922130584716797
-7.9430951409681345,7.944366931915283
-7.946921547407927,7.937557220458984
-7.910094953104535,7.919632434844971
-7.897865062681166,7.931042194366455
-7.954677021213342,7.947307109832764
-7.910094953104535,7.933289051055908
-7.946921547407927,7.947585105895996
-7.954677021213342,7.992561340332031
-7.9430951409681345,7.961406707763672
-7.950781972366453,7.955554008483887
-7.91721462968355,7.918945789337158
-7.950781972366453,7.950456142425537
-7.888606117307137,7.9355387687683105
-7.950781972366453,7.934549808502197
-7.8728955601551585,7.923925876617432
-7.928117974144348,7.927635192871094
-7.924453006674053,7.938029766082764
-7.954677021213342,7.928266525268555
-7.946921547407927,7.941329479217529
-7.931814161156377,7.9524245262146
-7.950781972366453,7.933088302612305
-7.9393021526221474,7.918177127838135
-7.924453006674053,7.902262210845947
-7.935542022791058,7.943970203399658
-7.8565729081096825,7.930302143096924
-7.950781972366453,7.965181827545166
-7.924453006674053,7.918664932250977
-7.931814161156377,7.943822383880615
-7.896708615962599,7.927252292633057
-7.954677021213342,7.926130771636963
-7.935542022791058,7.944467067718506
-7.9393021526221474,7.944360256195068
-7.85078088734462,7.9330854415893555
-8.008819571765459,7.999285697937012
-7.950781972366453,7.933379173278809
-7.928117974144348,7.933802604675293
-7.950781972366453,7.933629512786865
-7.946921547407927,7.972899436950684
-7.9393021526221474,7.887218475341797
-7.920818811243059,7.940415859222412
-7.920818811243059,7.932302951812744
-7.950781972366453,7.940122127532959
-7.924453006674053,7.920612812042236
-7.886056354845152,7.962928295135498
-7.931814161156377,7.939385890960693
-7.995678626217357,7.976578712463379
-7.954677021213342,7.986866474151611
-7.924453006674053,7.939194202423096
-7.982923651140671,7.957643032073975
-7.935542022791058,7.939548015594482
-7.9393021526221474,7.920523166656494
-7.931814161156377,7.922373294830322
-7.9200135653594685,7.9223151206970215
-7.954677021213342,7.94362735748291
-7.950781972366453,7.95892333984375
-7.924453006674053,7.905571460723877
-7.954677021213342,7.933218479156494
-7.950781972366453,7.944581031799316
-7.924453006674053,7.930538654327393
-7.954677021213342,7.942094326019287
-7.913640203677234,7.919583797454834
-7.935542022791058,7.952215671539307
-7.920818811243059,7.936891555786133
-7.995678626217357,7.940548419952393
-7.906578398789698,7.896948337554932
-7.96257349994767,7.94651460647583
-7.931814161156377,7.910638809204102
-7.950781972366453,7.9211812019348145
-7.950781972366453,7.9440531730651855
-7.954677021213342,7.941291809082031
-7.943055911701025,7.9230122566223145
-7.954677021213342,7.950603008270264
-7.950781972366453,7.954977512359619
-7.920818811243059,7.890964984893799
-7.950781972366453,7.967853546142578
-7.85078088734462,7.903506755828857
-7.924453006674053,7.943751335144043
-7.954677021213342,7.932928562164307
-7.874518114023228,7.953983783721924
-7.928117974144348,7.910598278045654
-7.954677021213342,7.9689154624938965
-7.950781972366453,7.923173427581787
-7.931814161156377,7.949601650238037
-7.946921547407927,7.950209140777588
-7.928117974144348,7.930752277374268
-7.924453006674053,7.934885501861572
-7.920818811243059,7.901846408843994
-7.9430951409681345,7.926980495452881
-7.982923651140671,7.947627544403076
-7.946921547407927,7.92828893661499
-7.970532618892763,7.980029582977295
-7.924453006674053,7.923560619354248
-7.924100333951067,7.922387599945068
-7.9393021526221474,7.935217380523682
-7.935542022791058,7.914918899536133
-7.950781972366453,7.92666482925415
-7.950781972366453,7.942938327789307
-7.920818811243059,7.957202911376953
-7.954677021213342,7.957329750061035
-7.931814161156377,7.930635929107666
-7.920818811243059,7.920392036437988
-7.954677021213342,7.951847553253174
-7.954677021213342,7.92889928817749
-7.946921547407927,7.97362756729126
-7.946921547407927,7.938030242919922
-7.954677021213342,7.949855327606201
-7.954677021213342,7.889785289764404
-7.946921547407927,7.906954288482666
-7.935542022791058,7.946040630340576
-7.9430951409681345,7.9115753173828125
-7.9393021526221474,7.923015117645264
-7.9393021526221474,7.961076259613037
-7.869665979871627,7.935427665710449
-7.954677021213342,7.968421459197998
-7.950781972366453,7.942219257354736
-7.931814161156377,7.9624199867248535
-7.924453006674053,7.944092273712158
-7.954677021213342,7.925308704376221
-7.928117974144348,7.939400672912598
-7.896196359268842,7.90317964553833
-7.982923651140671,7.936695098876953
-7.924453006674053,7.932142734527588
-7.978810702253626,7.962375164031982
-7.924453006674053,7.908090114593506
-7.982923651140671,7.943543910980225
-7.935542022791058,7.941654682159424
-7.928117974144348,7.925302505493164
-7.8728955601551585,7.916834354400635
-7.935542022791058,7.911590576171875
-7.96257349994767,7.97594690322876
-7.950781972366453,7.941505432128906
-7.910094953104535,7.956967830657959
-7.9430951409681345,7.949624538421631
-7.950781972366453,7.9424567222595215
-7.9430951409681345,7.941769123077393
-7.89962956062971,7.943284511566162
-7.9393021526221474,7.903092861175537
-7.9737577757544535,7.943821907043457
-7.9393021526221474,7.92506742477417
-7.9393021526221474,7.921299934387207
-7.954677021213342,7.928396701812744
-7.950781972366453,7.945646286010742
-7.949316049435304,7.932770729064941
-7.931814161156377,7.906815528869629
-7.954677021213342,7.974396228790283
-7.924453006674053,7.924670696258545
-7.924453006674053,7.9287028312683105
-7.928117974144348,7.946255683898926
-7.954677021213342,7.964223384857178
-7.954677021213342,7.961846828460693
-7.954677021213342,7.944781303405762
-7.931814161156377,7.93950891494751
-7.954677021213342,7.937747001647949
-7.954677021213342,7.9475555419921875
-7.935542022791058,7.917837619781494
-7.9430951409681345,7.942327976226807
-7.954677021213342,7.944219589233398
-7.950781972366453,7.929027080535889
-7.954677021213342,7.9604387283325195
-7.9430951409681345,7.931772708892822
-7.862652575359676,7.957602024078369
-7.889410352488291,7.917207717895508
-7.950781972366453,7.959543704986572
-7.9393021526221474,7.900130748748779
-7.95090181210265,7.974120140075684
-7.9393021526221474,7.930243968963623
-7.954677021213342,7.958638668060303
-7.954677021213342,7.9529948234558105
-7.924453006674053,7.944348335266113
-7.882728704344236,7.925439357757568
-7.931814161156377,7.938553810119629
-7.913640203677234,7.9289164543151855
-7.950781972366453,7.93030309677124
-7.931814161156377,7.947048187255859
-7.959191151416267,7.949662685394287
-7.9393021526221474,7.953115940093994
-7.946921547407927,7.926601886749268
-7.954677021213342,7.936060905456543
-7.9393021526221474,7.938408374786377
-7.9430951409681345,7.927530765533447
-7.954677021213342,7.970175266265869
-7.995678626217357,7.92730188369751
-7.9430951409681345,7.914975166320801
-7.954060896220394,7.958090305328369
-7.9393021526221474,7.927978992462158
-7.954677021213342,7.939055919647217
-7.889549016187033,7.959954261779785
-7.9393021526221474,7.912141799926758
-7.950781972366453,7.948202610015869
-7.950241642100192,7.952017784118652
-7.91721462968355,7.9343156814575195
-7.827702142900784,7.871025562286377
-7.860119116630385,7.897758960723877
-7.935542022791058,7.91737699508667
-7.924453006674053,7.9309515953063965
-7.924453006674053,7.9270195960998535
-7.935542022791058,7.899128437042236
-7.9393021526221474,7.944851875305176
-7.896196359268842,7.923149585723877
-7.9393021526221474,7.90622615814209
-7.982923651140671,7.939442157745361
-7.920818811243059,7.920290470123291
-8.003443541216441,8.001623153686523
-7.913640203677234,7.919852256774902
-7.935542022791058,7.901503086090088
-7.920818811243059,7.932071685791016
-7.860119116630385,7.947144985198975
-7.931814161156377,7.935075759887695
-7.946921547407927,7.966414928436279
-7.924453006674053,7.91297721862793
-7.946921547407927,7.943451404571533
-7.954677021213342,7.95576810836792
-7.950781972366453,7.96466588973999
-7.950781972366453,7.927052021026611
-7.846679045568875,7.9568257331848145
-7.946921547407927,7.92849588394165
-7.935542022791058,7.945227146148682
-7.954677021213342,7.9176506996154785
-7.950781972366453,7.931079864501953
-7.838628495628443,7.903774738311768
-7.935542022791058,7.945050239562988
-7.954677021213342,7.960311412811279
-7.954677021213342,7.942863464355469
-7.954677021213342,7.95419979095459
-7.950781972366453,7.945713996887207
-7.954677021213342,7.9278130531311035
-7.91375018033154,7.902496814727783
-7.950781972366453,7.954931735992432
-7.950781972366453,7.946639060974121
-7.863280055279963,7.903141498565674
-7.928117974144348,7.912622928619385
-7.931814161156377,7.94983434677124
-7.950781972366453,7.944632053375244
-7.935542022791058,7.94442081451416
-7.954677021213342,7.9765448570251465
-7.9393021526221474,7.949402332305908
-7.950781972366453,7.955722808837891
-7.91721462968355,7.966618061065674
-7.920818811243059,7.933803081512451
-7.946921547407927,7.93634557723999
-7.950781972366453,7.93314790725708
-7.928117974144348,7.937085151672363
-7.954677021213342,7.949016571044922
-7.954677021213342,7.945751667022705
-7.920818811243059,7.922030925750732
-7.928117974144348,7.927571773529053
-7.9393021526221474,7.939518451690674
-7.9737577757544535,7.948604106903076
-7.9393021526221474,7.935841083526611
-7.924453006674053,7.921855926513672
-7.9430951409681345,7.924899101257324
-7.995678626217357,7.979156017303467
-7.931814161156377,7.934293746948242
-7.920818811243059,7.929689407348633
-7.91721462968355,7.953725814819336
-7.924453006674053,7.918445110321045
-7.896196359268842,7.90787935256958
-7.931814161156377,7.941620826721191
-7.995678626217357,7.972759246826172
-7.924453006674053,7.916995525360107
-7.9430951409681345,7.930110931396484
-7.920818811243059,7.919429302215576
-7.946921547407927,7.9472551345825195
-7.928117974144348,7.938778400421143
-7.9393021526221474,7.930408000946045
-7.924453006674053,7.905030250549316
-7.928117974144348,7.933912754058838
-7.93765506239242,7.9264984130859375
-7.954677021213342,7.9267802238464355
-7.978895913358191,7.966187000274658
-7.89933181335733,7.921535015106201
-7.9430951409681345,7.930908679962158
-7.9335681432273475,7.923990726470947
-7.935542022791058,7.939473628997803
-7.950781972366453,7.930950164794922
-7.935542022791058,7.926693439483643
-7.954677021213342,7.965070724487305
-7.863280055279963,7.918857574462891
-7.9430951409681345,7.898947715759277
-7.892790308673911,7.931042194366455
-7.844664854175832,7.904325008392334
-7.924453006674053,7.9311747550964355
-7.9430951409681345,7.915188312530518
-7.946921547407927,7.958239555358887
-7.91721462968355,7.954860210418701
-7.919802320224209,7.937018394470215
-7.946921547407927,7.941409111022949
-7.928117974144348,7.912557601928711
-7.9393021526221474,7.911330699920654
-7.9430951409681345,7.9150776863098145
-7.879425560900211,7.923720359802246
-7.9430951409681345,7.953969478607178
-7.978810702253626,7.94681453704834
-7.970532618892763,7.9365925788879395
-7.9393021526221474,7.918734073638916
-7.8853617063081884,7.966276168823242
-7.931814161156377,7.9280548095703125
-7.91721462968355,7.944616794586182
-7.946921547407927,7.924035549163818
-7.954677021213342,7.909474849700928
-7.913640203677234,7.933169364929199
-7.853872762493711,7.954078674316406
-7.920818811243059,7.9435014724731445
-7.970532618892763,7.964817523956299
-7.910094953104535,7.91318941116333
-7.931814161156377,7.938619136810303
-7.931814161156377,7.951201915740967
-7.954677021213342,7.9488420486450195
-7.954677021213342,7.937880039215088
-7.935542022791058,7.937726020812988
-7.954677021213342,7.978116512298584
-7.954677021213342,7.947803020477295
-7.931814161156377,7.9250102043151855
-7.950781972366453,7.945277690887451
-7.946921547407927,7.954146862030029
-7.935542022791058,7.936673641204834
-7.928117974144348,7.93828821182251
-7.954677021213342,7.956037521362305
-7.950781972366453,7.972960948944092
-7.928117974144348,7.955211162567139
-7.863280055279963,7.917006492614746
-7.950781972366453,7.9251813888549805
-7.931814161156377,7.926344394683838
-7.9393021526221474,7.941552639007568
-7.950781972366453,7.925426006317139
-7.970532618892763,7.970475196838379
-7.928117974144348,7.937929630279541
-7.946921547407927,7.942096710205078
-7.9393021526221474,7.951187610626221
-7.9393021526221474,7.912445545196533
-7.966617665152964,7.954373836517334
-7.86826275483874,7.913386344909668
-7.950781972366453,7.9325852394104
-7.954677021213342,7.986392974853516
-7.9430951409681345,7.93145227432251
-7.924453006674053,7.938201904296875
-7.924453006674053,7.916825771331787
-7.924453006674053,7.942454814910889
-7.931814161156377,7.94716215133667
-7.9393021526221474,7.931863307952881
-7.950781972366453,7.922767639160156
-7.910094953104535,7.913600444793701
-7.950781972366453,7.937789440155029
-7.8728955601551585,7.9019646644592285
-7.950781972366453,7.963258266448975
-7.9430951409681345,7.915735721588135
-7.9430951409681345,7.931760787963867
-7.935542022791058,7.939913749694824
-7.9393021526221474,7.935049057006836
-7.950781972366453,7.9654669761657715
-7.928117974144348,7.94564962387085
-7.928117974144348,7.946329593658447
-7.950781972366453,7.961782455444336
-7.9393021526221474,7.928370952606201
-7.866185328564197,7.904627323150635
-7.924453006674053,7.920665264129639
-7.935542022791058,7.920839786529541
-7.924453006674053,7.931305885314941
-7.928117974144348,7.905844688415527
-7.946921547407927,7.938561916351318
-7.89962956062971,7.928410530090332
-7.856986114171083,7.902121067047119
-7.931814161156377,7.931873321533203
-7.935542022791058,7.9263834953308105
-7.950781972366453,7.965247631072998
-7.946921547407927,7.960173606872559
-7.954677021213342,7.939925193786621
-7.987162773987728,7.9445061683654785
-7.9913998274291025,7.96232271194458
-7.935542022791058,7.91937255859375
-7.9430951409681345,7.972621440887451
-7.85078088734462,7.945606708526611
-7.946921547407927,7.928951263427734
-7.823919469453418,7.933915138244629
-7.931814161156377,7.9361748695373535
-7.954677021213342,7.950557231903076
-7.924453006674053,7.926790237426758
-7.924453006674053,7.896897315979004
-7.954677021213342,7.957074165344238
-7.935542022791058,7.966397762298584
-7.924453006674053,7.925839900970459
-7.924453006674053,7.901652812957764
-7.931814161156377,7.945765972137451
-7.946921547407927,7.935127258300781
-7.9393021526221474,7.911791801452637
-7.950781972366453,7.954153537750244
-7.928117974144348,7.92157506942749
-7.954677021213342,7.947332859039307
-7.91721462968355,7.940683841705322
-7.924453006674053,7.907623767852783
-7.924453006674053,7.9331183433532715
-7.950781972366453,7.950970649719238
-7.874282136926076,7.950786590576172
-7.96981377267859,8.004372596740723
-7.950781972366453,7.933010578155518
-7.954677021213342,7.960641384124756
-7.924603424800292,7.894699573516846
-7.913640203677234,7.893738269805908
-7.950781972366453,7.950541973114014
-7.96257349994767,7.954039096832275
-7.9393021526221474,7.925467014312744
-7.9393021526221474,7.929919719696045
-7.924453006674053,7.915236949920654
-7.9393021526221474,7.951583385467529
-7.928117974144348,7.929444313049316
-7.950781972366453,7.937474727630615
-7.866459873882536,7.916266441345215
-7.863280055279963,7.912849426269531
-7.950781972366453,7.954091548919678
-7.946921547407927,7.94415807723999
-7.889410352488291,7.918065547943115
-7.924453006674053,7.924630641937256
-7.8810739922450885,7.9260783195495605
-7.935542022791058,7.9144673347473145
-7.9670439517473834,7.936959266662598
-7.954677021213342,7.955593585968018
-7.906578398789698,7.939101696014404
-7.875899990405765,7.895774841308594
-7.920818811243059,7.940986156463623
-7.913640203677234,7.923402309417725
-7.950781972366453,7.954265117645264
-7.9430951409681345,7.963009357452393
-7.892790308673911,7.929961681365967
-7.9430951409681345,7.97098970413208
-7.954677021213342,7.946750640869141
-7.987162773987728,7.932535171508789
-7.954677021213342,7.93953800201416
-7.950781972366453,7.925795078277588
-7.892790308673911,7.933228969573975
-7.935542022791058,7.91940975189209
-7.847706165863548,7.945423126220703
-7.935542022791058,7.950681209564209
-7.954677021213342,7.948625087738037
-7.830200797720251,7.918056964874268
-7.928117974144348,7.933224201202393
-7.950781972366453,7.963416576385498
-7.91721462968355,7.934157848358154
-7.889410352488291,7.946403980255127
-7.931814161156377,7.938384532928467
-7.924453006674053,7.918335914611816
-7.913640203677234,7.947933197021484
-7.860153329415682,7.904556751251221
-7.9393021526221474,7.949073791503906
-7.950781972366453,7.930765628814697
-7.896196359268842,7.873608112335205
-7.954677021213342,7.953172206878662
-7.950781972366453,7.934276103973389
-7.9393021526221474,7.908213138580322
-7.946921547407927,7.951091289520264
-7.9393021526221474,7.941224575042725
-7.9393021526221474,7.942800998687744
-7.896196359268842,7.931661605834961
-7.901151046525181,7.970457553863525
-7.924453006674053,7.935049533843994
-7.950781972366453,7.913688659667969
-7.950781972366453,7.951266288757324
-7.921563988377181,7.947515487670898
-7.954677021213342,7.9482293128967285
-7.924453006674053,7.909532070159912
-7.85078088734462,7.929175853729248
-7.882728704344236,7.896708011627197
-7.946921547407927,7.9467878341674805
-7.868644485039619,7.9077935218811035
-7.954677021213342,7.957292556762695
-7.931814161156377,7.937127590179443
-7.93978520718815,7.9672980308532715
-7.898075838044953,7.916259288787842
-7.974694136660875,7.95641565322876
-7.906578398789698,7.921308994293213
-7.954677021213342,7.92782735824585
-7.9430951409681345,7.9307427406311035
-7.943055911701025,7.935866832733154
-7.920818811243059,7.939209938049316
-7.950781972366453,7.925899982452393
-7.920818811243059,7.937765598297119
-7.950781972366453,7.936995029449463
-7.954677021213342,7.915585517883301
-7.924453006674053,7.918930530548096
-7.954677021213342,7.960241317749023
-7.9393021526221474,7.907619476318359
-7.920818811243059,7.941800117492676
-7.946921547407927,7.941047191619873
-7.935542022791058,7.949088096618652
-7.844664854175832,7.9364914894104
-7.950781972366453,7.9459428787231445
-7.860119116630385,7.909193992614746
-7.9393021526221474,7.915111064910889
-7.946921547407927,7.936352252960205
-7.946921547407927,7.911057949066162
-7.954677021213342,7.910349369049072
-7.928117974144348,7.950852870941162
-7.954677021213342,7.967521667480469
-7.913640203677234,7.916430950164795
-7.931814161156377,7.913517951965332
-7.954677021213342,7.929520606994629
-7.987162773987728,7.982734680175781
-7.954677021213342,7.969836235046387
-7.906578398789698,7.911947727203369
-7.93468629292431,7.936291694641113
-7.946921547407927,7.968539714813232
-7.946921547407927,7.941517353057861
-7.9616219366397445,7.877538204193115
-7.860119116630385,7.924343585968018
-7.950781972366453,7.958421230316162
-7.928117974144348,7.927331447601318
-7.928118049483403,7.950733184814453
-7.954677021213342,7.935298442840576
-7.946921547407927,7.940852165222168
-7.950781972366453,7.944088459014893
-7.950781972366453,7.951347827911377
-7.950781972366453,7.951181888580322
-7.9393021526221474,7.93697452545166
-7.931814161156377,7.91010046005249
-7.935542022791058,7.9196624755859375
-7.9393021526221474,7.937307834625244
-7.954677021213342,7.912602424621582
-7.950781972366453,7.947391510009766
-7.935542022791058,7.929027557373047
-7.950781972366453,7.963134288787842
-7.950781972366453,7.9493560791015625
-7.966617665152964,7.9512834548950195
-7.928117974144348,7.9365763664245605
-7.879425560900211,7.911015033721924
-7.924453006674053,7.927063941955566
-7.946921547407927,7.937062740325928
-7.924453006674053,7.9513654708862305
-7.946921547407927,7.941910266876221
-7.9616219366397445,7.954761981964111
-7.896196359268842,7.917911529541016
-7.950781972366453,7.941622257232666
-7.9430951409681345,7.896890163421631
-7.954677021213342,7.963199138641357
-7.920818811243059,7.930303573608398
-7.924453006674053,7.914146900177002
-7.9393021526221474,7.9124555587768555
-7.950781972366453,7.955956935882568
-7.950781972366453,7.949930667877197
-7.91721462968355,7.913973331451416
-7.882728704344236,7.895618915557861
-7.920818811243059,7.902624607086182
-7.946921547407927,7.93945837020874
-7.9430951409681345,7.9323954582214355
-7.920818811243059,7.91508150100708
-7.954677021213342,7.923521041870117
-7.950781972366453,7.94071102142334
-7.954677021213342,7.9444146156311035
-7.912937386812075,7.917545318603516
-7.920818811243059,7.944568157196045
-7.9508418880815706,7.920852184295654
-7.924453006674053,7.90189266204834
-7.866459873882536,7.905440330505371
-7.931814161156377,7.925321102142334
-7.954677021213342,7.944486618041992
-7.920818811243059,7.927918434143066
-7.954677021213342,7.976629734039307
-7.924453006674053,7.918142795562744
-7.913640203677234,7.964294910430908
-7.950781972366453,7.941845893859863
-7.950781972366453,7.94225549697876
-7.9737577757544535,7.946555137634277
-7.9393021526221474,7.948842525482178
-7.91721462968355,7.939800262451172
-7.935542022791058,7.945733547210693
-7.89962956062971,7.943253517150879
-7.9430951409681345,7.952663898468018
-7.950781972366453,7.921848773956299
-7.924453006674053,7.923101902008057
-7.9393021526221474,7.950786113739014
-7.906578398789698,7.927810192108154
-7.954677021213342,7.963079929351807
-7.920818811243059,7.925553321838379
-7.924453006674053,7.925908088684082
-7.95387649381544,7.9533867835998535
-7.924453006674053,7.920341968536377
-7.9430951409681345,7.943025588989258
-7.954677021213342,7.954074382781982
-7.946921547407927,7.944812297821045
-7.950781972366453,7.94265604019165
-7.863280055279963,7.902879238128662
-7.946921547407927,7.95350980758667
-7.924453006674053,7.920234203338623
-7.954677021213342,7.931436538696289
-7.89962956062971,7.934530258178711
-7.9430951409681345,7.911767482757568
-7.950781972366453,7.974319934844971
-7.946921547407927,7.915740489959717
-7.9393021526221474,7.91234827041626
-7.950781972366453,7.941930770874023
-7.9430951409681345,7.911559581756592
-7.9393021526221474,7.915844917297363
-7.874709893782641,7.905740261077881
-7.950781972366453,7.939907550811768
-7.992871189127312,7.971105575561523
-7.85078088734462,7.915724277496338
-7.928117974144348,7.953806400299072
-7.9393021526221474,7.9428887367248535
-7.924453006674053,7.902125835418701
-7.950781972366453,7.926120281219482
-7.910094953104535,7.933488368988037
-7.935542022791058,7.92482328414917
-7.970532618892763,7.976285934448242
-7.954677021213342,7.950515270233154
-7.853872762493711,7.887709617614746
-7.954677021213342,7.962647438049316
-7.931814161156377,7.903598785400391
-7.920818811243059,7.917046070098877
-7.906578398789698,7.925987720489502
-7.950781972366453,7.938302516937256
-8.026824561605242,7.97013521194458
-7.9430951409681345,7.945833683013916
-7.9393021526221474,7.901218414306641
-7.909221749570212,7.923412799835205
-7.995678626217357,7.953980922698975
-7.954677021213342,7.966742992401123
-7.920818811243059,7.923556327819824
-7.954677021213342,7.957508563995361
-7.892790308673911,7.930365562438965
-7.906578398789698,7.900741100311279
-7.946921547407927,7.94531774520874
-7.9430951409681345,7.960042953491211
-7.950781972366453,7.935586452484131
-7.978810702253626,7.947620391845703
-7.95090181210265,7.955099105834961
-7.970532618892763,7.9170708656311035
-7.928117974144348,7.930227279663086
-7.928117974144348,7.912486553192139
-7.950781972366453,7.9351725578308105
-7.9393021526221474,7.920815467834473
-7.886056354845152,7.909308910369873
-7.924453006674053,7.926424026489258
-7.913640203677234,7.914294719696045
-7.950781972366453,7.945263862609863
-7.954677021213342,7.963574409484863
-7.928117974144348,7.894327640533447
-7.910094953104535,7.9491353034973145
-7.8986410684191934,7.951293468475342
-7.903090094245322,7.933920383453369
-7.896196359268842,7.8997273445129395
-7.924453006674053,7.886875629425049
-7.954677021213342,7.965666770935059
-7.9393021526221474,7.928833484649658
-7.928117974144348,7.9251790046691895
-7.935542022791058,7.954132556915283
-7.935542022791058,7.921829700469971
-7.9393021526221474,7.929211616516113
-7.954677021213342,7.935040473937988
-7.995678626217357,7.924889087677002
-7.9318141721807764,7.923715114593506
-7.931814161156377,7.938292026519775
-7.946921547407927,7.924651622772217
-7.950781972366453,7.948539733886719
-7.924453006674053,7.951487064361572
-7.924453006674053,7.920976638793945
-7.954677021213342,7.943348407745361
-7.954677021213342,7.942980766296387
-7.954677021213342,7.9264068603515625
-7.950781972366453,7.96559476852417
-7.982966659490206,7.952697277069092
-7.8761493177145505,7.937443256378174
-7.935542022791058,7.922243595123291
-7.869665979871627,7.948713779449463
-7.85078088734462,7.904312610626221
-7.924453006674053,7.933657169342041
-7.950781972366453,7.95260763168335
-7.906578398789698,7.931822776794434
-7.835637836224461,7.918768882751465
-7.954677021213342,7.952400207519531
-7.950781972366453,7.945048809051514
-7.8493737915542425,7.89850378036499
-7.920818811243059,7.923788070678711
-7.819366547270949,7.906968116760254
-7.950781972366453,7.946610927581787
-7.946921547407927,7.932013511657715
-7.950781972366453,7.944986820220947
-7.924453006674053,7.94443941116333
-7.950781972366453,7.9328694343566895
-7.950781972366453,7.937236309051514
-8.003443541216441,8.004639625549316
-7.924453006674053,7.917260646820068
-7.946921547407927,7.931739807128906
-7.950781972366453,7.947569370269775
-7.985623465663254,7.932975769042969
-7.8761493177145505,7.938493251800537
-7.946921547407927,7.950674533843994
-7.902388164590721,7.916051864624023
-7.928117974144348,7.951714515686035
-7.943055911701025,7.935745716094971
-7.9737577757544535,7.943811416625977
-7.913640203677234,7.924328327178955
-7.906578398789698,7.910233974456787
-7.950781972366453,7.948582172393799
-7.924453006674053,7.948681831359863
-7.950781972366453,7.9756598472595215
-7.910094953104535,7.945437431335449
-7.906578398789698,7.9222846031188965
-7.9430951409681345,7.936211109161377
-7.9737577757544535,7.95060396194458
-7.896196359268842,7.940948009490967
-7.935542022791058,7.94119930267334
-7.920818811243059,7.905310153961182
-7.950781972366453,7.954721927642822
-7.91721462968355,7.939042091369629
-7.906578398789698,7.910552978515625
-7.964102771195973,7.9362311363220215
-7.954677021213342,7.917762756347656
-7.9393021526221474,7.937244415283203
-7.9393021526221474,7.947800159454346
-7.928117974144348,7.91576623916626
-7.9737577757544535,7.964580535888672
-7.829768510087842,7.932129383087158
-7.928117974144348,7.913796424865723
-7.931814161156377,7.937192440032959
-7.954677021213342,7.944818019866943
-7.931814161156377,7.929013252258301
-7.950781972366453,7.956806182861328
-7.924453006674053,7.9313435554504395
-7.892790308673911,7.92658805847168
-7.928117974144348,7.950555324554443
-7.847706165863548,7.894542217254639
-7.970616219270671,7.9548540115356445
-7.970532618892763,7.975028991699219
-7.928117974144348,7.941456317901611
-7.924453006674053,7.943744659423828
-7.835637836224461,7.893141269683838
-7.935542022791058,7.944905757904053
-7.931814161156377,7.9449543952941895
-7.954677021213342,7.933963298797607
-7.931814161156377,7.952674388885498
-7.954677021213342,7.971794605255127
-7.9393021526221474,7.955256938934326
-7.935542022791058,7.922652244567871
-7.91721462968355,7.94249963760376
-7.924453006674053,7.938863754272461
-7.9525102848614395,7.97593355178833
-7.950781972366453,7.945080757141113
-7.935542022791058,7.933644771575928
-7.931814161156377,7.925764083862305
-7.85078088734462,7.924154281616211
-7.950781972366453,7.939155101776123
-7.89962956062971,7.937989711761475
-7.833610261256329,7.880445957183838
-7.995678626217357,7.996592998504639
-7.931814161156377,7.962357044219971
-7.954677021213342,7.965862274169922
-7.954677021213342,7.90022087097168
-7.931814161156377,7.965759754180908
-7.946921547407927,7.947627544403076
-7.928117974144348,7.921884059906006
-7.950781972366453,7.94178581237793
-7.928117974144348,7.913763523101807
-7.954677021213342,7.9405293464660645
-7.935542022791058,7.921725749969482
-7.987162773987728,7.966108798980713
-7.9393021526221474,7.955593585968018
-7.924453006674053,7.908173084259033
-7.950781972366453,7.9575300216674805
-7.924453006674053,7.918276309967041
-7.879425560900211,7.930509567260742
-7.896196359268842,7.923036098480225
-7.954677021213342,7.935872554779053
-7.9393021526221474,7.895606517791748
-7.950781972366453,7.956230640411377
-7.946921547407927,7.924408435821533
-7.954677021213342,7.950416088104248
-7.866459873882536,7.93015718460083
-7.950781972366453,7.962718486785889
-7.946896212483493,7.918981075286865
-7.925603053104374,7.9140777587890625
-7.924453006674053,7.9234490394592285
-7.896196359268842,7.942168235778809
-7.946921547407927,7.926361560821533
-7.946921547407927,7.9533891677856445
-7.9430951409681345,7.9137139320373535
-7.924453006674053,7.926675319671631
-7.995678626217357,7.920302391052246
-7.896196359268842,7.937978267669678
-7.924453006674053,7.9364848136901855
-7.9393021526221474,7.941993236541748
-7.9737577757544535,7.936550617218018
-7.954677021213342,7.9455342292785645
-7.9393021526221474,7.9285149574279785
-7.924453006674053,7.944486141204834
-7.954677021213342,7.941476821899414
-7.950781972366453,7.961462020874023
-7.924453006674053,7.941423416137695
-7.935542022791058,7.91975736618042
-7.829768510087842,7.927306175231934
-7.9430951409681345,7.945431709289551
-7.9430951409681345,7.934804916381836
-7.9393021526221474,7.93261194229126
-7.946921547407927,7.948920249938965
-7.950781972366453,7.9571309089660645
-7.950781972366453,7.990633487701416
-7.928117974144348,7.93483304977417
-7.935542022791058,7.946255207061768
-7.9393021526221474,7.923319339752197
-7.95090181210265,7.943820953369141
-7.91721462968355,7.932384014129639
-7.882728704344236,7.922284126281738
-7.950781972366453,7.937799453735352
-7.892790308673911,7.87553071975708
-7.950781972366453,7.936221599578857
-7.987162773987728,7.944526195526123
-7.928117974144348,7.9407057762146
-7.847706165863548,7.9379448890686035
-7.869378875342402,7.947025299072266
-7.950781972366453,7.931990146636963
-7.995678626217357,7.940083980560303
-7.924453006674053,7.932067394256592
-7.928117974144348,7.926204204559326
-7.935734864536909,7.938817501068115
-7.950781972366453,7.9526543617248535
-7.892538918842217,7.956361770629883
-7.928117974144348,7.964685916900635
-7.89962956062971,7.919507026672363
-7.931814161156377,7.94231653213501
-7.935542022791058,7.936347484588623
-7.910071604962776,7.90907621383667
-7.877623480181999,7.916705131530762
-7.910094953104535,7.943973541259766
-7.928117974144348,7.933148384094238
-7.9393021526221474,7.935215473175049
-7.946921547407927,7.9223151206970215
-7.913640203677234,7.932950496673584
-7.842802030816254,7.946439743041992
-7.950781972366453,7.958040714263916
-7.920818811243059,7.939572811126709
-7.950781972366453,7.960940837860107
-7.946921547407927,7.955877304077148
-7.950781972366453,7.928929328918457
-7.9393021526221474,7.9478373527526855
-7.896196359268842,7.899303436279297
-7.863280055279963,7.913687705993652
-7.882728704344236,7.933577060699463
-7.950781972366453,7.956374168395996
-7.924453006674053,7.953566074371338
-7.946921547407927,7.934756755828857
-7.950241642100192,7.946479797363281
-7.931814161156377,7.946371555328369
-7.892790308673911,7.928047180175781
-7.9393021526221474,7.942137241363525
-7.9430951409681345,7.9140143394470215
-7.910094953104535,7.933091640472412
-7.9393021526221474,7.913628101348877
-7.950781972366453,7.944727897644043
-7.8416326138557455,7.894626140594482
-7.931814161156377,7.92113733291626
-7.9393021526221474,7.9324469566345215
-7.954677021213342,7.911434650421143
-7.920818811243059,7.933630466461182
-7.946921547407927,7.933748245239258
-7.863280055279963,7.880698204040527
-7.920818811243059,7.945806980133057
-7.966617665152964,7.9422807693481445
-7.924453006674053,7.9280242919921875
-7.875615898948226,7.907249927520752
-7.91721462968355,7.927420139312744
-7.931814161156377,7.9462890625
-7.950781972366453,7.962090015411377
-7.947688104167437,7.919884204864502
-7.931814161156377,7.932800769805908
-7.860119116630385,7.891022205352783
-7.928117974144348,7.938876628875732
-7.954677021213342,7.960545063018799
-7.906578398789698,7.941498279571533
-7.954677021213342,7.971480846405029
-7.954677021213342,7.972217082977295
-7.958607309235428,7.971852779388428
-7.946921547407927,7.954482555389404
-7.9430951409681345,7.94833517074585
-7.924453006674053,7.920025825500488
-7.946921547407927,7.916211128234863
-7.924453006674053,7.952999591827393
-7.954677021213342,7.894097328186035
-7.954677021213342,7.937546253204346
-7.9393021526221474,7.943270206451416
-7.935542022791058,7.9451069831848145
-7.954677021213342,7.9130859375
-7.931814161156377,7.967069625854492
-7.928117974144348,7.938407897949219
-7.91721462968355,7.945296764373779
-7.910094953104535,7.930227756500244
-7.928117974144348,7.950001239776611
-7.970532618892763,7.924239158630371
-7.950781972366453,7.914772033691406
-7.892790308673911,7.916131973266602
-7.879425560900211,7.90050745010376
-7.954677021213342,7.942689895629883
-7.950781972366453,7.94376802444458
-7.886056354845152,7.9003071784973145
-7.950781972366453,7.926845550537109
-7.928117974144348,7.9431328773498535
-7.924453006674053,7.939926624298096
-7.896196359268842,7.949510097503662
-7.853872762493711,7.913660526275635
-7.91721462968355,7.912194728851318
-8.026824561605242,7.955013751983643
-7.9393021526221474,7.929467678070068
-7.943383637939144,7.908657073974609
-7.954677021213342,7.947137355804443
-7.920818811243059,7.925605297088623
-7.950781972366453,7.958542823791504
-7.970616219270671,7.938231468200684
-7.928117974144348,7.920260429382324
-7.9393021526221474,7.928090572357178
-7.89962956062971,7.958779811859131
-7.889410352488291,7.941327095031738
-7.89962956062971,7.929093837738037
-7.954677021213342,7.92239236831665
-7.9393021526221474,7.942362308502197
-7.950781972366453,7.942215919494629
-7.85078088734462,7.915128231048584
-7.950781972366453,7.940609455108643
-7.9393021526221474,7.930628299713135
-7.970532618892763,7.966814994812012
-7.872861820710693,7.955572605133057
-7.950781972366453,7.933481693267822
-7.946921547407927,7.934421062469482
-7.924453006674053,7.9321417808532715
-7.946921547407927,7.92758321762085
-7.920818811243059,7.933183193206787
-7.935542022791058,7.953249454498291
-7.924453006674053,7.933403015136719
-7.910094953104535,7.944486618041992
-7.950781972366453,7.970025539398193
-7.920818811243059,7.947605609893799
-7.9430951409681345,7.928473472595215
-7.936334125227829,7.946425914764404
-7.935542022791058,7.923300266265869
-7.903090094245322,7.930285930633545
-7.946921547407927,7.9322404861450195
-7.950298727941771,7.942183494567871
-7.950781972366453,7.935240268707275
-7.995678626217357,7.973484039306641
-7.920818811243059,7.942624568939209
-7.903090094245322,7.9226861000061035
-7.924453006674053,7.9426445960998535
-7.950781972366453,7.947543621063232
-7.935542022791058,7.953382968902588
-7.935542022791058,7.93760347366333
-7.913640203677234,7.918150901794434
-7.903090094245322,7.919528484344482
-7.924453006674053,7.9258131980896
-7.910094953104535,7.918026447296143
-7.924453006674053,7.9180073738098145
-7.946921547407927,7.941829681396484
-7.920818811243059,7.9271745681762695
-7.931814161156377,7.923819065093994
-7.9393021526221474,7.956602573394775
-7.931814161156377,7.9483113288879395
-7.931814161156377,7.962483882904053
-7.946921547407927,7.936396598815918
-7.924453006674053,7.929562568664551
-7.9393021526221474,7.949256896972656
-7.950781972366453,7.9824442863464355
-7.954677021213342,7.93796443939209
-7.928117974144348,7.961201190948486
-7.9393021526221474,7.932487964630127
-7.924453006674053,7.919142723083496
-7.9393021526221474,7.936004161834717
-7.931814161156377,7.957906723022461
-7.920818811243059,7.933309078216553
-7.835637836224461,7.9006781578063965
-7.950781972366453,7.919823169708252
-7.9430951409681345,7.964681148529053
-7.882728704344236,7.896612644195557
-7.931814161156377,7.925072193145752
-7.910094953104535,7.937738418579102
-7.928117974144348,7.918576717376709
-7.920818811243059,7.943429470062256
-7.9393021526221474,7.932256698608398
-7.950781972366453,7.9057416915893555
-7.928117974144348,7.948871612548828
-7.931814161156377,7.949269771575928
-7.946921547407927,7.9613423347473145
-7.946921547407927,7.963865756988525
-7.91721462968355,7.941781997680664
-7.928117974144348,7.921618938446045
-7.950781972366453,7.946783065795898
-7.970532618892763,7.956664562225342
-7.946921547407927,7.937897682189941
-7.9393021526221474,7.929800510406494
-7.928117974144348,7.935189723968506
-7.9737577757544535,7.927670001983643
-7.924453006674053,7.917276382446289
-7.954677021213342,7.955221176147461
-7.910094953104535,7.91096305847168
-7.9430951409681345,7.95306921005249
-7.935542022791058,7.945756912231445
-7.954677021213342,7.956152439117432
-7.892790308673911,7.919795036315918
-7.924453006674053,7.925987720489502
-7.950781972366453,7.9408860206604
-7.8761493177145505,7.91876745223999
-7.9737577757544535,7.9546380043029785
-7.954677021213342,7.963918685913086
-7.935542022791058,7.911868572235107
-7.931814161156377,7.94136381149292
-7.9393021526221474,7.9180588722229
-7.931814161156377,7.9156174659729
-7.950781972366453,7.933839797973633
-7.896196359268842,7.898749351501465
-7.935542022791058,7.922572612762451
-7.920818811243059,7.904623031616211
-7.954677021213342,7.927947521209717
-7.950298727941771,7.934092044830322
-7.931814161156377,7.951969623565674
-7.9393021526221474,7.903007507324219
-7.950781972366453,7.921439170837402
-7.935542022791058,7.915232181549072
-7.924453006674053,7.917825698852539
-7.804091322132368,7.912601947784424
-7.935542022791058,7.923853397369385
-7.913904078443909,7.924662113189697
-7.906578398789698,7.908055782318115
-7.950781972366453,7.959883689880371
-7.952890410541103,7.928839206695557
-7.924453006674053,7.928069114685059
-7.954677021213342,7.971621513366699
-7.906578398789698,7.906852722167969
-7.954677021213342,7.9390549659729
-7.931814161156377,7.939792156219482
-7.924453006674053,7.933206081390381
-7.950781972366453,7.940561771392822
-7.91721462968355,7.941248416900635
-7.946921547407927,7.938780784606934
-7.950781972366453,7.941372394561768
-7.886056354845152,7.926095962524414
-7.931814161156377,7.9235148429870605
-7.924453006674053,7.922147274017334
-7.946921547407927,7.924572944641113
-7.970616219270671,7.949190616607666
-7.928117974144348,7.949480056762695
-7.946921547407927,7.92006778717041
-7.9078549312528486,7.930711269378662
-7.9393021526221474,7.916788101196289
-7.9430951409681345,7.928936004638672
-7.954677021213342,7.944493293762207
-7.913640203677234,7.910660266876221
-7.954677021213342,7.971100330352783
-7.903090094245322,7.917087078094482
-7.931814161156377,7.938762187957764
-7.9430951409681345,7.9445672035217285
-7.869665979871627,7.94538688659668
-7.889410352488291,7.919244289398193
-7.995678626217357,7.968835353851318
-7.920818811243059,7.961536884307861
-7.931814161156377,7.96103048324585
-7.995678626217357,7.955649375915527
-7.946921547407927,7.955502033233643
-7.91721462968355,7.916546821594238
-7.935542022791058,7.916854381561279
-7.9393021526221474,7.964743137359619
-7.931814161156377,7.935894012451172
-7.9430951409681345,7.930118083953857
-7.920818811243059,7.933091163635254
-7.9430951409681345,7.939548015594482
-7.924453006674053,7.917215824127197
-7.924453006674053,7.922023296356201
-7.950781972366453,7.937732219696045
-7.931814161156377,7.922657489776611
-7.982923651140671,7.942535400390625
-7.950781972366453,7.932949542999268
-7.948658283730227,7.942815780639648
-7.928117974144348,7.939220905303955
-7.903090094245322,7.936751365661621
-7.866459873882536,7.894934177398682
-7.946921547407927,7.937586307525635
-7.9393021526221474,7.935231685638428
-7.9393021526221474,7.928746700286865
-7.924453006674053,7.940536022186279
-7.913640203677234,7.910367012023926
-7.889410352488291,7.937965393066406
-7.9430951409681345,7.93553352355957
-7.950781972366453,7.9621782302856445
-7.844664854175832,7.893523693084717
-7.928155902956855,7.895975589752197
-7.954677021213342,7.95625114440918
-7.9430951409681345,7.935081958770752
-7.903090094245322,7.912721633911133
-7.91721462968355,7.93124532699585
-7.916084887040944,7.951745986938477
-7.9430951409681345,7.941978931427002
-7.935542022791058,7.925830364227295
-7.950781972366453,7.966094970703125
-7.954677021213342,7.961905479431152
-7.952725130123009,7.922235012054443
-7.9367221576035965,7.917798042297363
-7.860153329415682,7.914027214050293
-7.990339285400088,7.954850673675537
-7.906578398789698,7.927184581756592
-7.950781972366453,7.947323799133301
-7.950781972366453,7.93324613571167
-7.836640141104957,7.910559177398682
-7.924453006674053,7.9497857093811035
-7.946921547407927,7.924832820892334
-7.931814161156377,7.918539524078369
-7.924453006674053,7.948225975036621
-7.9393021526221474,7.926291465759277
-7.9616219366397445,7.939965724945068
-7.928117974144348,7.9244866371154785
-7.91721462968355,7.946391582489014
-7.9737577757544535,7.94970703125
-7.892790308673911,7.9428815841674805
-7.943095160397098,7.888465881347656
-7.950781972366453,7.932799816131592
-7.950781972366453,7.941457748413086
-7.924453006674053,7.927829742431641
-7.946921547407927,7.924349308013916
-7.950781972366453,7.93289041519165
-7.950781972366453,7.940890312194824
-7.913640203677234,7.9625983238220215
-7.954677021213342,7.9495463371276855
-7.935542022791058,7.93731164932251
-7.889410352488291,7.920250415802002
-7.946921547407927,7.942525863647461
-7.913640203677234,7.933459281921387
-7.89962956062971,7.951557636260986
-7.9430951409681345,7.947621822357178
-7.841341928765566,7.894166469573975
-7.954677021213342,7.929843902587891
-7.946921547407927,7.921143054962158
-7.946921547407927,7.930026531219482
-7.924453006674053,7.9084696769714355
-7.928117974144348,7.924281597137451
-7.9393021526221474,7.923460006713867
-7.948658283730227,7.961991310119629
-7.924453006674053,7.937301158905029
-7.9653239020786435,7.923710823059082
-7.9430951409681345,7.923093318939209
-7.9393021526221474,7.925944805145264
-7.91721462968355,7.929580211639404
-7.928117974144348,7.923782825469971
-7.924453006674053,7.953749656677246
-7.950781972366453,7.950554370880127
-7.9430951409681345,7.930359363555908
-7.954591856239139,7.9151482582092285
-7.9393021526221474,7.928382873535156
-7.879425560900211,7.939448833465576
-7.924453006674053,7.9424357414245605
-7.973156262517851,7.944129467010498
-7.950781972366453,7.965569019317627
-7.9393021526221474,7.932092666625977
-7.9393021526221474,7.931455612182617
-7.954677021213342,7.935455322265625
-7.903090094245322,7.898793697357178
-7.931814161156377,7.897380352020264
-7.896196359268842,7.956035137176514
-7.928117974144348,7.907566547393799
-7.920818811243059,7.938549518585205
-7.954677021213342,7.946041584014893
-7.935542022791058,7.939854145050049
-7.9393021526221474,7.926576614379883
-7.869732506393041,7.912659645080566
-7.928117974144348,7.930814266204834
-7.928117974144348,7.926772117614746
-7.928117974144348,7.93267822265625
-7.950781972366453,7.931519031524658
-7.838693701646425,7.919023036956787
-7.950781972366453,7.96426248550415
-7.954677021213342,7.933340072631836
-7.924453006674053,7.918738842010498
-7.881990818921415,7.911180019378662
-7.946921547407927,7.908587455749512
-7.954677021213342,7.953384876251221
-7.9430951409681345,7.96783447265625
-7.861458037730276,7.920132160186768
-7.9430951409681345,7.9322686195373535
-7.954677021213342,7.951806545257568
-7.869665979871627,7.9260029792785645
-7.950781972366453,7.9352593421936035
-7.950781972366453,7.9253997802734375
-7.9393021526221474,7.908650875091553
-7.946921547407927,7.923298358917236
-7.9430951409681345,7.937160968780518
-7.9393021526221474,7.953756809234619
-7.950781972366453,7.932812690734863
-7.946921547407927,7.923760890960693
-7.9393021526221474,7.917235374450684
-7.913640203677234,7.9291205406188965
-7.954677021213342,7.93772029876709
-7.954677021213342,7.949050426483154
-7.9430951409681345,7.927348613739014
-7.950781972366453,7.935923099517822
-7.943795058505339,7.929996490478516
-7.950781972366453,7.96378755569458
-7.950781972366453,7.959425449371338
-7.9034974875499335,7.943145275115967
-7.954677021213342,7.940604209899902
-7.856986114171083,7.917704105377197
-7.924453006674053,7.934834003448486
-7.920818811243059,7.925048351287842
-7.924453006674053,7.92760705947876
-7.928117974144348,7.939746379852295
-7.954677021213342,7.95944356918335
-7.950781972366453,7.943892955780029
-7.8761493177145505,7.884454250335693
-7.954677021213342,7.980359077453613
-7.931814161156377,7.939399242401123
-7.939379961634402,7.927540302276611
-7.950781972366453,7.9662089347839355
-7.8761493177145505,7.916601657867432
-7.931814161156377,7.95276403427124
-7.920818811243059,7.917001247406006
-7.906578398789698,7.906569957733154
-7.924453006674053,7.927562236785889
-7.954677021213342,7.969015121459961
-7.954677021213342,7.9165849685668945
-7.9430951405871735,7.9342451095581055
-7.946921547407927,7.944683074951172
-8.008819571765459,7.998462677001953
-7.879425560900211,7.909247398376465
-7.958607309235428,7.940520763397217
-7.954677021213342,7.9434428215026855
-7.9393021526221474,7.950810432434082
-7.954677021213342,7.964211940765381
-7.935271050222571,7.918339729309082
-7.950781972366453,7.9262824058532715
-7.906578398789698,7.936514854431152
-7.920818811243059,7.946578502655029
-7.959158165932685,7.9472150802612305
-7.950781972366453,7.9556121826171875
-7.954677021213342,7.955000877380371
-7.869665979871627,7.898657321929932
-7.889410352488291,7.936057090759277
-7.853872762493711,7.91737174987793
-7.946921547407927,7.934741497039795
-7.939904927278492,7.9233832359313965
-7.860119116630385,7.905081272125244
-7.918702847281798,7.967576503753662
-7.931814161156377,7.925003528594971
-7.913640203677234,7.917473793029785
-7.89962956062971,7.9007792472839355
-7.9393021526221474,7.942515850067139
-7.950781972366453,7.9698309898376465
-7.850764921094095,7.946438312530518
-8.023340543527912,7.961751937866211
-7.928117974144348,7.958005428314209
-7.954677021213342,7.943698406219482
-7.950781972366453,7.943386077880859
-7.8761493177145505,7.907052516937256
-7.924453006674053,7.907164096832275
-7.987162773987728,7.961681365966797
-7.950781972366453,7.939943790435791
-7.958607309235428,7.953415393829346
-7.882728704344236,7.945276260375977
-7.950781972366453,7.953783988952637
-7.935542022791058,7.913411617279053
-7.954677021213342,7.9555745124816895
-7.950781972366453,7.944364547729492
-7.866459873882536,7.9398040771484375
-7.928117974144348,7.925457954406738
-7.954677021213342,7.969404220581055
-7.950781972366453,7.941109657287598
-7.954677021213342,7.94231653213501
-7.954677021213342,7.902669906616211
-7.8416326138557455,7.9121832847595215
-7.954677021213342,7.942149639129639
-7.954677021213342,7.967841625213623
-7.950781972366453,7.951042652130127
-7.928117974144348,7.930027484893799
-7.928117974144348,7.935214519500732
-7.928117974144348,7.9336724281311035
-7.924453006674053,7.926224231719971
-7.91721462968355,7.925822734832764
-7.856986114171083,7.926330089569092
-7.950781972366453,7.960206031799316
-7.928117974144348,7.91382360458374
-7.924453006674053,7.936507701873779
-7.954677021213342,7.964062213897705
-7.931814161156377,7.936209201812744
-7.9430951409681345,7.946485996246338
-7.931814161156377,7.951166152954102
-7.920818811243059,7.95648193359375
-7.946921547407927,7.9377760887146
-7.978810702253626,7.975386619567871
-7.920818811243059,7.9248785972595215
-7.9393021526221474,7.9112982749938965
-7.950781972366453,7.949605464935303
-7.950781972366453,7.935708522796631
-7.920818811243059,7.945973873138428
-7.91721462968355,7.917201042175293
-7.9393021526221474,7.928433418273926
-7.966576241738391,7.96113920211792
-7.995678626217357,7.970171928405762
-7.8728955601551585,7.913642406463623
-7.924453006674053,7.933859348297119
-7.915575394493873,7.915714740753174
-7.950781972366453,7.942383289337158
-7.9430951409681345,7.9295830726623535
-7.950781972366453,7.965250492095947
-7.889746991542474,7.908920764923096
-7.924453006674053,7.8955397605896
-7.946921547407927,7.929427623748779
-7.920818811243059,7.931856632232666
-7.950781972366453,7.980499744415283
-7.950781972366453,7.948425769805908
-7.928117974144348,7.933892726898193
-7.954677021213342,7.950197219848633
-7.8416326138557455,7.909137725830078
-7.9393021526221474,7.935445308685303
-7.950781972366453,7.942953586578369
-7.970532618892763,7.894078731536865
-7.910094953104535,7.93894100189209
-7.928117974144348,7.941871166229248
-7.9393021526221474,7.950027942657471
-7.950781972366453,7.944442272186279
-7.950781972366453,7.947868347167969
-7.838693701646425,7.959657192230225
-7.931814161156377,7.916959762573242
-7.924453006674053,7.949253559112549
-7.892790308673911,7.9311323165893555
-7.970532618892763,7.957335948944092
-7.931814161156377,7.930088520050049
-7.91721462968355,7.938442707061768
-7.892790308673911,7.9451494216918945
-7.856986114171083,7.90045690536499
-7.935542022791058,7.911669731140137
-7.995678626217357,7.986273288726807
-7.950781972366453,7.937078952789307
-7.924453006674053,7.952868938446045
-7.9393021526221474,7.934010028839111
-7.950781972366453,7.92500638961792
-7.924453006674053,7.923922061920166
-7.950781972366453,7.954038143157959
-7.931814161156377,7.935166358947754
-7.9393021526221474,7.965630054473877
-7.906578398789698,7.91631555557251
-7.954677021213342,7.924684047698975
-7.924453006674053,7.922399520874023
-8.014634778962309,7.971761703491211
-7.879425560900211,7.912330150604248
-7.866459873882536,7.894678592681885
-7.924453006674053,7.936591625213623
-7.935542022791058,7.93357515335083
-7.946921547407927,7.945127487182617
-7.946921547407927,7.9489288330078125
-7.879527744657629,7.920945644378662
-7.954677021213342,7.931302547454834
-7.916754118885,7.93024206161499
-7.924453006674053,7.934963703155518
-7.924453006674053,7.93703556060791
-7.869665979871627,7.919137001037598
-7.928117974144348,7.921453952789307
-7.935542022791058,7.94867467880249
-7.9393021526221474,7.959755897521973
-7.915575394493873,7.9204583168029785
-7.928117974144348,7.946089267730713
-7.9393021526221474,7.907217025756836
-7.946921547407927,7.940200328826904
-7.892790308673911,7.945888042449951
-7.982966659490206,7.963460922241211
-7.9430951409681345,7.930696964263916
-7.974694136660875,7.958343029022217
-7.950781972366453,7.94124174118042
-7.954677021213342,7.948176860809326
-7.974694136660875,7.9639692306518555
-7.918702847281798,7.933933258056641
-7.931814161156377,7.9330573081970215
-7.9393021526221474,7.925198078155518
-7.950781972366453,7.925248622894287
-7.954677021213342,7.940815448760986
-7.910094953104535,7.943375110626221
-7.954677021213342,7.910030841827393
-7.950781972366453,7.946537494659424
-7.970532618892763,7.966997146606445
-7.935542022791058,7.935206890106201
-7.9393021526221474,7.928097248077393
-7.954677021213342,7.966874599456787
-7.950781972366453,7.938534736633301
-7.866459873882536,7.911952495574951
-7.954677021213342,7.955490589141846
-7.89933181335733,7.914940357208252
-7.9393021526221474,7.950430393218994
-7.928117974144348,7.945241928100586
-7.91721462968355,7.924203395843506
-7.847706165863548,7.917222499847412
-7.950781972366453,7.922712326049805
-7.9393021526221474,7.92243766784668
-7.954677021213342,7.960563659667969
-7.954677021213342,7.938796520233154
-7.954677021213342,7.95974588394165
-7.9430951409681345,7.946850776672363
-7.913640203677234,7.881617546081543
-7.946921547407927,7.935689449310303
-7.954677021213342,7.954674243927002
-7.950781972366453,7.936446666717529
-7.9393021526221474,7.929932117462158
-7.950781972366453,7.964228630065918
-7.863280055279963,7.884120464324951
-7.954677021213342,7.960185527801514
-7.91721462968355,7.940481185913086
-7.924453006674053,7.932481288909912
-7.950781972366453,7.930021286010742
-7.954677021213342,7.962446212768555
-7.860119116630385,7.911924839019775
-7.9430951409681345,7.952761173248291
-7.946921547407927,7.930878639221191
-7.954761778021568,7.924592971801758
-7.954677021213342,7.96420955657959
-7.928117974144348,7.924987316131592
-7.918702847281798,7.903624057769775
-7.946921547407927,7.926115989685059
-7.9393021526221474,7.931936740875244
-7.950781972366453,7.922824859619141
-7.954677021213342,7.9266510009765625
-7.954677021213342,7.957638263702393
-7.954677021213342,7.983557224273682
-7.9302061252065466,7.899204730987549
-7.910094953104535,7.929914951324463
-7.954677021213342,7.943029403686523
-7.954677021213342,7.950287342071533
-7.950781972366453,7.948869228363037
-7.924453006674053,7.918678283691406
-7.946921547407927,7.969356060028076
-7.950781972366453,7.937296390533447
-7.950781972366453,7.9688401222229
-7.860119116630385,7.9295830726623535
-7.950781972366453,7.939561367034912
-7.950781972366453,7.929131984710693
-7.935542022791058,7.898316383361816
-7.950781972366453,7.941549777984619
-7.954677021213342,7.967793941497803
-7.995678626217357,7.953210830688477
-7.91721462968355,7.895473480224609
-7.8493737915542425,7.914277076721191
-7.935542022791058,7.964885234832764
-7.950781972366453,7.929598331451416
-8.004545578968134,7.977764129638672
-7.931814161156377,7.940698146820068
-7.928117974144348,7.908700466156006
-7.954677021213342,7.945289611816406
-7.869281830051218,7.942073345184326
-7.9737577757544535,7.991281032562256
-7.950781972366453,7.9384684562683105
-7.920818811243059,7.952578544616699
-7.920818811243059,7.940885066986084
-7.924453006674053,7.927083492279053
-7.903090094245322,7.955385208129883
-7.950781972366453,7.954136371612549
-7.950781972366453,7.93258810043335
-7.950781972366453,7.942769527435303
-7.950781972366453,7.966721057891846
-7.970532618892763,7.960147380828857
-7.970616219270671,7.936825752258301
-7.91721462968355,7.908332824707031
-7.950781972366453,7.930784702301025
-7.863280055279963,7.929528713226318
-7.931814161156377,7.962192058563232
-7.924453006674053,7.909440040588379
-7.954677021213342,7.947558403015137
-7.954677021213342,7.956174850463867
-7.829768510087842,7.882960319519043
-7.935542022791058,7.94926118850708
-7.924453006674053,7.944026470184326
-7.928117974144348,7.920860290527344
-7.935542022791058,7.923527717590332
-7.9430951409681345,7.908134937286377
-7.913640203677234,7.928333759307861
-8.016694986585515,7.96515417098999
-7.946921547407927,7.909920692443848
-7.950781972366453,7.94185209274292
-7.924453006674053,7.921779155731201
-7.896125840447619,7.899129390716553
-7.936992210083682,7.887759685516357
-7.9393021526221474,7.92119026184082
-7.91721462968355,7.93505334854126
-7.924453006674053,7.910242080688477
-7.924453006674053,7.927477836608887
-7.946921547407927,7.933593273162842
-7.935542022791058,7.9304728507995605
-7.9430951409681345,7.953521251678467
-7.950781972366453,7.954722881317139
-7.950781972366453,7.935720920562744
-7.950781972366453,7.930222988128662
-7.9393021526221474,7.928829669952393
-7.954677021213342,7.969607830047607
-7.950781972366453,7.927297115325928
-7.9430951409681345,7.934573173522949
-7.878782119721712,7.934488773345947
-7.950781972366453,7.935122489929199
-7.954677021213342,7.965762615203857
-7.946921547407927,7.93943452835083
-7.950781972366453,7.9708967208862305
-7.903161564307976,7.921720027923584
-7.950781972366453,7.951187610626221
-7.924453006674053,7.915714740753174
-7.954677021213342,7.941939830780029
-7.931814161156377,7.906686305999756
-7.954677021213342,7.965169906616211
-7.950781972366453,7.957473278045654
-7.9737577757544535,7.921451091766357
-7.950781972366453,7.928745269775391
-7.9393021526221474,7.928951740264893
-7.954677021213342,7.947473049163818
-7.91721462968355,7.923447132110596
-7.950781972366453,7.940626621246338
-7.920818811243059,7.950733184814453
-7.903090094245322,7.9494099617004395
-7.935542022791058,7.938246726989746
-7.920818811243059,7.925326824188232
-7.9393021526221474,7.929360866546631
-7.9430951409681345,7.936129093170166
-7.935542022791058,7.935072422027588
-7.924453006674053,7.934560298919678
-7.920818811243059,7.931111812591553
-7.931814161156377,7.923863410949707
-7.838693701646425,7.994887828826904
-7.903090094245322,7.936489582061768
-7.931814161156377,7.9202752113342285
-7.995678626217357,7.959371566772461
-7.946921547407927,7.925206661224365
-7.904602317703036,7.923976421356201
-7.9393021526221474,7.91839075088501
-7.950781972366453,7.933916091918945
-7.924453006674053,7.932066440582275
-7.931814161156377,7.922903537750244
-7.954677021213342,7.927560329437256
-7.91721462968355,7.922980308532715
-7.89962956062971,7.932420253753662
-7.950781972366453,7.94867467880249
-7.9393021526221474,7.9405837059021
-7.920818811243059,7.925646781921387
-7.920818811243059,7.945559978485107
-7.903090094245322,7.9296555519104
-7.9393021526221474,7.925854682922363
-7.9430951409681345,7.955456256866455
-7.924453006674053,7.9284749031066895
-7.9393021526221474,7.9381585121154785
-7.950781972366453,7.9281816482543945
-7.920818811243059,7.932848930358887
-7.89962956062971,7.93543815612793
-7.9393021526221474,7.912886142730713
-7.954677021213342,7.936030864715576
-7.96981377267859,7.9946417808532715
-7.931814161156377,7.916867733001709
-7.954677021213342,7.924412250518799
-7.946921547407927,7.949033260345459
-7.946921547407927,7.941077709197998
-7.8761493177145505,7.904046535491943
-7.91721462968355,7.91582727432251
-7.910094953104535,7.9584574699401855
-7.9393021526221474,7.9355902671813965
-7.954677021213342,7.957068920135498
-7.952725130123009,7.938291549682617
-7.853872762493711,7.949126243591309
-7.946921547407927,7.9376325607299805
-7.950781972366453,7.92792272567749
-7.924453006674053,7.922970294952393
-7.924453006674053,7.92726469039917
-7.924453006674053,7.908320903778076
-7.91721462968355,7.935213088989258
-7.879425560900211,7.925960063934326
-7.853872762493711,7.902390480041504
-7.946921547407927,7.944016933441162
-7.982923651140671,7.9282708168029785
-7.954677021213342,7.980756759643555
-7.9430951409681345,7.934910774230957
-7.946219331461382,7.964439868927002
-7.889410352488291,7.92563533782959
-7.950781972366453,7.931137561798096
-7.931814161156377,7.94782018661499
-7.906578398789698,7.920773029327393
-7.954677021213342,7.942578315734863
-7.954677021213342,7.959231853485107
-7.9430951409681345,7.966648101806641
-7.950781972366453,7.962093830108643
-7.946921547407927,7.89670991897583
-7.9913998274291025,7.977120876312256
-7.954677021213342,7.942498683929443
-7.946921547407927,7.941230773925781
-7.931814161156377,7.926328182220459
-7.950781972366453,7.957122325897217
-7.815309402546056,7.900952339172363
-7.935542022791058,7.945014476776123
-7.950781972366453,7.940199375152588
-7.950781972366453,7.947015285491943
-7.9393021526221474,7.920805931091309
-7.9430951409681345,7.925057411193848
-7.950781972366453,7.970743656158447
-7.935542022791058,7.9634246826171875
-7.9393021526221474,7.919270992279053
-7.920818811243059,7.918668746948242
-7.910094953104535,7.911462306976318
-7.920818811243059,7.928380966186523
-7.91721462968355,7.925187587738037
-7.89962956062971,7.9370317459106445
-7.910094953104535,7.917712211608887
-7.931814161156377,7.905173301696777
-7.931814161156377,7.931212902069092
-7.8416326138557455,7.912290096282959
-7.950781972366453,7.957711219787598
-7.935542022791058,7.923229694366455
-7.950781972366453,7.953158855438232
-7.863280055279963,7.940019130706787
-7.966617665152964,7.954351902008057
-7.954677021213342,7.971102237701416
-7.950781972366453,7.924310207366943
-7.954677021213342,7.96795654296875
-7.950781972366453,7.95515251159668
-7.866459873882536,7.877597332000732
-7.950781972366453,7.970734596252441
-7.882728704344236,7.922091007232666
-7.889410352488291,7.930461883544922
-7.995678626217357,7.950979709625244
-7.950781972366453,7.950852870941162
-7.950781972366453,7.925860404968262
-7.924453006674053,7.941696643829346
-7.9393021526221474,7.96278190612793
-7.9737577757544535,7.977097988128662
-7.935542022791058,7.946700572967529
-7.9393021526221474,7.947884559631348
-7.922632107581136,7.915912628173828
-7.954677021213342,7.915785789489746
-7.924453006674053,7.930141448974609
-8.026824561605242,7.98473596572876
-7.8416326138557455,7.900880813598633
-7.920818811243059,7.939627647399902
-7.9737577757544535,7.953545570373535
-7.958607309235428,7.967897415161133
-7.9430951409681345,7.939366340637207
-7.920818811243059,7.942051410675049
-7.9393021526221474,7.963019847869873
-7.970532618892763,7.948269844055176
-7.920818811243059,7.930604457855225
-7.9913998274291025,7.9628825187683105
-7.950781972366453,7.96137809753418
-7.931814161156377,7.914058208465576
-7.924453006674053,7.945183277130127
-7.838628495628443,7.909485340118408
-7.954677021213342,7.959715366363525
-7.931814161156377,7.904603481292725
-7.924453006674053,7.950155735015869
-7.950781972366453,7.947385787963867
-7.950781972366453,7.946372032165527
-7.950781972366453,7.935422897338867
-7.954677021213342,7.927801609039307
-7.892790308673911,7.936804294586182
-7.866459873882536,7.931899547576904
-7.886056354845152,7.920543193817139
-7.966576241738391,7.959692001342773
-7.920818811243059,7.941140174865723
-7.860153329415682,7.9161248207092285
-7.91721462968355,7.922762870788574
-7.9737577757544535,7.940710544586182
-7.897811916161621,7.955494403839111
-7.928117974144348,7.942429542541504
-7.946921547407927,7.935898303985596
-7.946921547407927,7.927181720733643
-7.928117974144348,7.887913227081299
-7.954677021213342,7.941677570343018
-7.935542022791058,7.954455852508545
-7.954677021213342,7.948475360870361
-7.951252960495686,7.97245454788208
-7.9737577757544535,7.965421199798584
-7.91721462968355,7.930373191833496
-7.91721462968355,7.938227653503418
-7.882728704344236,7.916332721710205
-7.920818811243059,7.923376560211182
-7.89962956062971,7.889071941375732
-7.935542010773082,7.9516777992248535
-7.9393021526221474,7.924774646759033
-7.91721462968355,7.952693939208984
-7.9430951409681345,7.949648857116699
-7.950781972366453,7.9338154792785645
-7.935542022791058,7.940860271453857
-7.908539684071192,7.907998561859131
-7.9430951409681345,7.940221309661865
-7.946921547407927,7.94031286239624
-7.995678626217357,7.940464496612549
-7.896196359268842,7.941118240356445
-7.9430951409681345,7.940218448638916
-7.931814161156377,7.931724548339844
-7.950781972366453,7.95642614364624
-7.886056354845152,7.918030261993408
-7.950781972366453,7.938405990600586
-7.931439075798742,7.937911510467529
-7.982923651140671,7.9614458084106445
-7.950781972366453,7.942249774932861
-7.950781972366453,7.936899662017822
-7.924453006674053,7.916369438171387
-7.931814161156377,7.944184303283691
-7.85078088734462,7.8783955574035645
-7.950781972366453,7.947239398956299
-7.903090094245322,7.913586616516113
-7.995678626217357,7.953668594360352
-7.954677021213342,7.948601722717285
-7.950781972366453,7.953836441040039
-7.927336730250859,7.910318851470947
-7.903090094245322,7.905763149261475
-7.920818811243059,7.9340972900390625
-7.920818811243059,7.904882431030273
-7.946921547407927,7.93479585647583
-7.954677021213342,7.948051929473877
-7.835637836224461,7.9037861824035645
-7.950781972366453,7.95423698425293
-7.903090094245322,7.93627405166626
-7.954677021213342,7.94727087020874
-7.954677021213342,7.940267086029053
-7.950781972366453,7.9195146560668945
-7.950781972366453,7.959432125091553
-7.903090094245322,7.931508541107178
-7.9393021526221474,7.931081771850586
-7.856986114171083,7.924501895904541
-7.896196359268842,7.961087703704834
-7.943055911701025,7.925661563873291
-7.9430951409681345,7.93495512008667
-7.9737577757544535,7.964371681213379
-7.9430951409681345,7.9426751136779785
-7.924453006674053,7.927621841430664
-7.946921547407927,7.951295375823975
-7.892790308673911,7.939913272857666
-7.9393021526221474,7.946714878082275
-7.950781972366453,7.937876224517822
-7.9393021526221474,7.952154636383057
-7.931814161156377,7.946453094482422
-7.946921547407927,7.9353814125061035
-7.928117974144348,7.920862674713135
-7.950781972366453,7.914301872253418
-7.906578398789698,7.928342819213867
-7.935542022791058,7.936786651611328
-7.928117974144348,7.92296838760376
-7.935542022791058,7.934232234954834
-7.896196359268842,7.934448719024658
-7.9430951409681345,7.950356960296631
-7.954677021213342,7.932883262634277
-7.91721462968355,7.915695667266846
-7.920818811243059,7.917063236236572
-7.924453006674053,7.929945945739746
-7.882728704344236,7.909609794616699
-7.96981377267859,7.907114505767822
-7.950781972366453,7.93862771987915
-7.92729567327985,7.925788879394531
-7.924453006674053,7.926494598388672
-7.9393021526221474,7.92859411239624
-7.935542022791058,7.927805423736572
-7.950781972366453,7.943941116333008
-7.946921547407927,7.955296993255615
-7.950781972366453,7.942615985870361
-7.954677021213342,7.933351039886475
-7.950781972366453,7.936439037322998
-7.950781972366453,7.955848693847656
-7.924453006674053,7.913885116577148
-7.924453006674053,7.90753173828125
-7.9913998274291025,7.941389083862305
-7.903090094245322,7.901285171508789
-7.931814161156377,7.924978733062744
-7.903090094245322,7.911853313446045
-7.946921547407927,7.938488006591797
-7.928117974144348,7.946268558502197
-7.946921547407927,7.901121139526367
-7.9393021526221474,7.937643051147461
-7.9913998274291025,7.922058582305908
-7.924453006674053,7.924170017242432
-7.950781972366453,7.92245626449585
-7.889410352488291,7.913748264312744
-7.935542022791058,7.907870292663574
-7.924453006674053,7.927778244018555
-7.928117974144348,7.925663471221924
-7.950781972366453,7.936997890472412
-7.9430951409681345,7.939587593078613
-7.844664854175832,7.911428928375244
-7.924453006674053,7.936748027801514
-7.9393021526221474,7.9498162269592285
-7.9430951409681345,7.94452428817749
-7.9393021526221474,7.932621479034424
-7.906578398789698,7.918330669403076
-7.950781972366453,7.942028999328613
-7.844664854175832,7.930495738983154
-7.924453006674053,7.908330917358398
-7.924453006674053,7.927121639251709
-7.9393021526221474,7.927916526794434
-7.954677021213342,7.953521251678467
-7.8728955601551585,7.934086799621582
-7.954677021213342,7.9211106300354
-7.924453006674053,7.919169902801514
-7.91721462968355,7.923388481140137
-7.924453006674053,7.934844970703125
-7.845652390085675,7.866249084472656
-7.924453006674053,7.92499303817749
-7.931814161156377,7.9225077629089355
-7.931814161156377,7.940505504608154
-7.91721462968355,7.921435356140137
-7.993085742757826,7.935389041900635
-7.882728704344236,7.925440311431885
-7.9393021526221474,7.94831657409668
-7.928117974144348,7.91637659072876
-7.9430951409681345,7.94866943359375
-7.9913998274291025,7.975638389587402
-7.835637836224461,7.921585559844971
-7.935542022791058,7.926547527313232
-7.970616219270671,7.935516357421875
-7.924453006674053,7.923543453216553
-7.924453006674053,7.9243903160095215
-7.950781972366453,7.938216686248779
-7.85078088734462,7.920795917510986
-7.924453006674053,7.94750452041626
-7.924453006674053,7.917410373687744
-7.950781972366453,7.952449321746826
-7.931814161156377,7.908127307891846
-7.93765506239242,7.921478271484375
-7.91721462968355,7.941320896148682
-7.913640203677234,7.905423641204834
-7.935542022791058,7.939716815948486
-7.866212066669052,7.902997016906738
-7.9430951409681345,7.960646629333496
-7.950781972366453,7.940199851989746
-7.946921547407927,7.927980899810791
-7.954677021213342,7.939006328582764
-7.853872762493711,7.928825855255127
-7.950781972366453,7.936123847961426
-7.924453006674053,7.937166690826416
-7.995678626217357,7.975539684295654
-7.879425560900211,7.9302144050598145
-7.954677021213342,7.934689998626709
-7.928936536236001,7.927608489990234
-7.910094953104535,7.931903839111328
-7.931814161156377,7.9330830574035645
-7.928117974144348,7.935154438018799
-7.935542022791058,7.926109790802002
-7.913640203677234,7.938436985015869
-7.950781972366453,7.941239833831787
-7.924453006674053,7.904582500457764
-7.889410352488291,7.931883335113525
-7.950781972366453,7.944718360900879
-7.96257349994767,7.927162170410156
-7.954677021213342,7.941534519195557
-7.91721462968355,7.912579536437988
-7.935542022791058,7.941285610198975
-7.950781972366453,7.9463653564453125
-7.928117974144348,7.927616596221924
-7.954677021213342,7.94828462600708
-7.928117974144348,7.946601390838623
-7.920818811243059,7.916903972625732
-7.9393021526221474,7.9091315269470215
-7.920818811243059,7.939524173736572
-7.931814161156377,7.942862033843994
-7.950781972366453,7.917277812957764
-7.950781972366453,7.97295618057251
-7.903090094245322,7.931519985198975
-7.866459873882536,7.894746780395508
-7.954677021213342,7.9653496742248535
-7.946921547407927,7.949484348297119
-7.920818811243059,7.903554916381836
-7.9393021526221474,7.935483455657959
-7.85078088734462,7.922220230102539
-7.906578398789698,7.931263446807861
-7.89962956062971,7.944949150085449
-7.913640203677234,7.919690132141113
-7.906578398789698,7.9158430099487305
-7.946921547407927,7.93864631652832
-7.931814161156377,7.922793865203857
-7.973156262517851,7.947619915008545
-7.924453006674053,7.919712066650391
-7.867870619770326,7.92938756942749
-7.950781972366453,7.937635898590088
-7.950781972366453,7.932981967926025
-7.924453006674053,7.937144756317139
-7.8761493177145505,7.926784038543701
-7.924453006674053,7.900863170623779
-7.910094953104535,7.922027111053467
-7.935542022791058,7.92933464050293
-7.950781972366453,7.916926860809326
-7.928117974144348,7.946417331695557
-7.9430951409681345,7.921849727630615
-7.913640203677234,7.921093463897705
-7.906578398789698,7.913290977478027
-7.920818811243059,7.915990352630615
-7.910094953104535,7.889915466308594
-7.910094953104535,7.916209697723389
-7.9430951409681345,7.923669815063477
-7.924453006674053,7.9200663566589355
-7.950781972366453,7.927245140075684
-7.9430951409681345,7.957635402679443
-7.924453006674053,7.934699535369873
-7.950781972366453,7.94195032119751
-7.946219331461382,7.955070495605469
-7.856986114171083,7.911466598510742
-7.906578398789698,7.938612937927246
-7.978895913358191,7.966436862945557
-7.9737577757544535,7.959134578704834
-7.886056354845152,7.8758344650268555
-7.9430951409681345,7.9223198890686035
-7.9393021526221474,7.920724391937256
-7.886056354845152,7.9344305992126465
-7.935542022791058,7.921695232391357
-7.935542022791058,7.937896728515625
-7.95172445996154,7.915991306304932
-7.950781972366453,7.944594860076904
-7.950781972366453,7.956685543060303
-7.928117974144348,7.937133312225342
-7.8728955601551585,7.933242321014404
-7.954677021213342,7.96173620223999
-7.958607309235428,7.938392639160156
-7.9430951409681345,7.9237518310546875
-7.954677021213342,7.962228298187256
-7.9393021526221474,7.964460849761963
-7.946921547407927,7.924474239349365
-7.950781972366453,7.972299098968506
-7.8761493177145505,7.912153720855713
-7.954677021213342,7.924574375152588
-7.91721462968355,7.934031963348389
-8.008819571765459,8.040241241455078
-7.903090094245322,7.931397914886475
-7.935542022791058,7.919943809509277
-7.950781972366453,7.92963171005249
-7.91721462968355,7.944756031036377
-7.935542022791058,7.907221794128418
-7.931814161156377,7.928575038909912
-7.935542022791058,7.931225299835205
-7.9737577757544535,7.960187911987305
-7.924453006674053,7.923708438873291
-7.928117974144348,7.8954925537109375
-7.935542022791058,7.940835475921631
-7.9281180277318715,7.929551124572754
-7.924453006674053,7.933926105499268
-7.9430951409681345,7.954723834991455
-7.950781972366453,7.958742618560791
-7.931814161156377,7.924794673919678
-7.903090094245322,7.948927879333496
-7.970532618892763,7.985402584075928
-7.935542022791058,7.941530704498291
-7.950781972366453,7.95908784866333
-7.9393021526221474,7.927694797515869
-7.8761493177145505,7.926724910736084
-7.950781972366453,7.926236629486084
-7.9393021526221474,7.945887088775635
-7.931814161156377,7.942180156707764
-7.924453006674053,7.9076056480407715
-7.995678626217357,7.933261871337891
-7.896196359268842,7.927509784698486
-7.931814161156377,7.912008762359619
-7.8416326138557455,7.893579959869385
-7.931814161156377,7.9196858406066895
-7.954677021213342,7.945261478424072
-7.9393021526221474,7.926109313964844
-7.9226320855575,7.937586307525635
-7.946921547407927,7.935680389404297
-7.991531413298041,7.9923906326293945
-7.896196359268842,7.934708595275879
-7.924453006674053,7.949297904968262
-7.950781972366453,7.942605018615723
-7.9393021526221474,7.899405002593994
-7.870077682537097,7.892392635345459
-7.920818811243059,7.937363147735596
-7.9393021526221474,7.957581043243408
-7.935542022791058,7.932606220245361
-7.954677021213342,7.955887317657471
-7.954677021213342,7.9706597328186035
-7.931814161156377,7.917736530303955
-7.938058700829053,7.946976661682129
-7.920818811243059,7.917895793914795
-7.954677021213342,7.973071575164795
-7.954677021213342,7.960786819458008
-7.8013712254607785,7.896795749664307
-7.950781972366453,7.943099498748779
-7.879425560900211,7.935726165771484
-7.935542022791058,7.937131881713867
-7.896196359268842,7.92527961730957
-7.924453006674053,7.903643608093262
-7.946921547407927,7.919553279876709
-7.920818811243059,7.92207670211792
-7.954677021213342,7.964107990264893
-7.924453006674053,7.908679962158203
-7.946921547407927,7.938950061798096
-7.950781972366453,7.943532466888428
-7.950781972366453,7.940182209014893
-7.950781972366453,7.934422492980957
-7.935542022791058,7.932400226593018
-7.946921547407927,7.918269157409668
-7.847706165863548,7.927839756011963
-7.946921547407927,7.941445827484131
-7.928117974144348,7.951993465423584
-7.924453006674053,7.932738304138184
-7.9393021526221474,7.94993782043457
-7.950781972366453,7.934139251708984
-7.931814161156377,7.925609588623047
-7.950781972366453,7.943297386169434
-7.910094953104535,7.910109043121338
-7.954677021213342,7.974020481109619
-7.982923651140671,7.940003871917725
-7.863280055279963,7.8996100425720215
-7.9430951409681345,7.971933841705322
-7.8416326138557455,7.915172576904297
-7.950781972366453,7.929537773132324
-7.950781972366453,7.944125652313232
-7.928117974144348,7.900211811065674
-7.9393021526221474,7.931236743927002
-7.950781972366453,7.9466118812561035
-7.942381102016373,7.950534343719482
-7.866625579174465,7.930314540863037
-7.931814161156377,7.951727390289307
-8.008819571765459,7.99652624130249
-7.91721462968355,7.929272651672363
-7.896196359268842,7.905309200286865
-7.906578398789698,7.90186071395874
-7.882728704344236,7.894957065582275
-7.9913998274291025,7.928883075714111
-7.920818811243059,7.948610782623291
-7.920818811243059,7.933990478515625
-7.9430951409681345,7.925017833709717
-7.954677021213342,7.945173740386963
-7.943055911701025,7.923507213592529
-7.978895913358191,7.868960380554199
-7.950781972366453,7.9541144371032715
-7.89641998736639,7.925605773925781
-7.954677021213342,7.938187599182129
-7.924453006674053,7.9084553718566895
-7.982966659490206,7.96804141998291
-7.96257349994767,7.979598045349121
-7.9393021526221474,7.954634666442871
-7.950781972366453,7.9840407371521
-7.9393021526221474,7.924617767333984
-7.954677021213342,7.944072246551514
-7.946921547407927,7.927000522613525
-7.920818811243059,7.929253101348877
-7.920818811243059,7.950989723205566
-7.903090094245322,7.889110088348389
-7.928117974144348,7.919440746307373
-7.963788392246652,7.921969890594482
-7.863280055279963,7.948591232299805
-7.910094953104535,7.8835673332214355
-7.96257349994767,7.948840618133545
-7.946921547407927,7.938928127288818
-7.920818811243059,7.918128490447998
-7.950781972366453,7.938241481781006
-7.924453006674053,7.927454471588135
-7.995678626217357,7.960867404937744
-7.931814161156377,7.944294452667236
-7.9430951409681345,7.95265531539917
-7.935542022791058,7.924797058105469
-7.9737577757544535,7.996667385101318
-7.928117974144348,7.920217514038086
-7.847706165863548,7.914586067199707
-7.924453006674053,7.932517051696777
-7.946921547407927,7.920886516571045
-7.877211195454222,7.890789985656738
-7.950781972366453,7.941294193267822
-7.818151283467686,7.9004693031311035
-7.946921547407927,7.934114456176758
-7.8761493177145505,7.918076992034912
-7.913640203677234,7.920658588409424
-7.946921547407927,7.942355632781982
-7.869665979871627,7.9275031089782715
-7.920818811243059,7.932005405426025
-7.954677021213342,7.935460567474365
-7.85078088734462,7.8836774826049805
-7.903681041351079,7.924106121063232
-7.946921547407927,7.947263717651367
-7.954677021213342,7.948481559753418
-7.91721462968355,7.933586597442627
-7.927727176545458,7.948256969451904
-7.946921547407927,7.943147659301758
-7.85078088734462,7.892151832580566
-7.924453006674053,7.923944473266602
-7.935542022791058,7.930052280426025
-7.928117974144348,7.929125785827637
-7.995678626217357,7.912341117858887
-7.913640203677234,7.925142288208008
-7.860119116630385,7.918868541717529
-7.924453006674053,7.9204020500183105
-7.950781972366453,7.94340705871582
-7.9430951409681345,7.948095798492432
-7.9393021526221474,7.970442295074463
-7.889410352488291,7.933897495269775
-7.954677021213342,7.962277889251709
-7.954677021213342,7.950204849243164
-7.950781972366453,7.916539669036865
-7.9393021526221474,7.947976589202881
-7.906578398789698,7.915775775909424
-7.928117974144348,7.9381184577941895
-7.931814161156377,7.941676139831543
-7.950781972366453,7.93898868560791
-7.920818811243059,7.91964864730835
-7.9393021526221474,7.9557013511657715
-7.9393021526221474,7.926517963409424
-7.9393021526221474,7.951629161834717
-7.924453006674053,7.924673557281494
-7.946921547407927,7.975872993469238
-7.928117974144348,7.923396587371826
-7.9430951409681345,7.935545444488525
-7.940181051699369,7.963613986968994
-7.946921547407927,7.9248270988464355
-7.928117974144348,7.928634166717529
-7.946921547407927,7.942173480987549
-7.924453006674053,7.910722732543945
-7.913640203677234,7.950157642364502
-7.946921547407927,7.940120220184326
-7.9393021526221474,7.928805828094482
-7.982923651140671,7.8924055099487305
-7.939379961634402,7.934077262878418
-7.9430951409681345,7.938493728637695
-7.920818811243059,7.934128284454346
-7.939379961634402,7.942682266235352
-7.85078088734462,7.905395984649658
-7.9430951409681345,7.942086219787598
-7.954677021213342,7.971240043640137
-7.978895913358191,7.987706184387207
-7.946921547407927,7.938366413116455
-7.847706165863548,7.893184185028076
-7.931814161156377,7.92834997177124
-7.950781972366453,7.937134265899658
-7.931814161156377,7.928823947906494
-7.950781972366453,7.908885478973389
-7.892790308673911,7.932962417602539
-7.924453006674053,7.933380603790283
-7.950781972366453,7.945096015930176
-7.954333871520422,7.972994327545166
-7.940181051699369,7.954773426055908
-7.928117974144348,7.939854145050049
-7.889410352488291,7.900954723358154
-7.950781972366453,7.938790798187256
-7.975985781891215,7.957114219665527
-7.954677021213342,7.9777512550354
-7.928117974144348,7.915043354034424
-7.954677021213342,7.947132587432861
-7.9393021526221474,7.951674938201904
-7.954677021213342,7.927709579467773
-7.866459873882536,7.920262336730957
-7.935542022791058,7.889814376831055
-7.950781972366453,7.94584846496582
-7.97195645462988,7.956142425537109
-7.9393021526221474,7.924832820892334
-7.954677021213342,7.920217037200928
-7.954677021213342,7.9413628578186035
-7.923581356476356,7.930892467498779
-7.995678626217357,7.951228618621826
-7.9393021526221474,7.91279411315918
-7.9430951409681345,7.947123050689697
-7.931814161156377,7.923320770263672
-8.026824561605242,7.993117809295654
-7.946921547407927,7.954728603363037
-7.950781972366453,7.945631980895996
-7.946921547407927,7.95670223236084
-7.931814161156377,7.911684989929199
-7.950781972366453,7.9169206619262695
-7.946921547407927,7.933215141296387
-7.910094953104535,7.887112140655518
-7.9737577757544535,7.945174217224121
-7.954677021213342,7.976429462432861
-7.950781972366453,7.947800636291504
-7.924453006674053,7.933476448059082
-7.931814161156377,7.935410976409912
-7.931814161156377,7.923935413360596
-7.935542022791058,7.899845600128174
-7.853872762493711,7.938507556915283
-7.950781972366453,7.956695079803467
-7.995678626217357,7.955787181854248
-7.928117974144348,7.938736438751221
-7.896708615962599,7.899813175201416
-7.950781972366453,7.934279441833496
-7.946921547407927,7.93428373336792
-7.954677021213342,7.9462361335754395
-7.869665979871627,7.927688121795654
-7.954677021213342,7.9029998779296875
-7.928117974144348,7.93379020690918
-7.8728955601551585,7.916983127593994
-7.935542022791058,7.937551021575928
-7.9393021526221474,7.934412479400635
-7.924453006674053,7.942190647125244
-7.946921547407927,7.906286716461182
-7.964051851259558,7.957270622253418
-7.924453006674053,7.948216915130615
-7.950781972366453,7.902979373931885
-7.896196359268842,7.905285358428955
-7.924453006674053,7.9558868408203125
-7.950781972366453,7.924187183380127
-7.991531413298041,7.985589981079102
-7.954677021213342,7.95264196395874
-7.924453006674053,7.940703868865967
-7.954677021213342,7.945531845092773
-7.924453006674053,7.919810771942139
-7.847706165863548,7.903573989868164
-7.906578398789698,7.900944709777832
-7.935542022791058,7.939548015594482
-7.904149213272221,7.935786724090576
-7.935542022791058,7.915574073791504
-7.982966659490206,7.957235336303711
-7.9393021526221474,7.928201675415039
-7.906578398789698,7.902675628662109
-7.9393021526221474,7.952996253967285
-7.950781972366453,7.943761348724365
-7.924453006674053,7.913160800933838
-7.946921547407927,7.963572025299072
-7.9393021526221474,7.9512505531311035
-7.995678626217357,7.974495887756348
-7.9200659509493825,7.921374320983887
-7.954677021213342,7.960375785827637
-7.93765506239242,7.9475483894348145
-7.928117974144348,7.913985729217529
-7.8728955601551585,7.932917594909668
-7.91721462968355,7.95005464553833
-7.966576241738391,7.949116230010986
-7.954677021213342,7.981409072875977
-7.946921547407927,7.9458441734313965
-7.928117974144348,7.951720714569092
-7.924453006674053,7.924448490142822
-7.941194503765821,7.928133487701416
-7.954677021213342,7.9389543533325195
-7.946921547407927,7.957045555114746
-7.920818811243059,7.931219577789307
-7.954677021213342,7.968785285949707
-7.8416326138557455,7.9139909744262695
-7.924453006674053,7.918290138244629
-7.866459873882536,7.926903247833252
-7.940181051699369,7.932977199554443
-7.920818811243059,7.926816463470459
-7.946921547407927,7.9096598625183105
-7.9430951409681345,7.945278644561768
-7.950781972366453,7.921536922454834
-7.995678626217357,7.908215522766113
-7.96257349994767,7.994663715362549
-7.928117974144348,7.917013168334961
-7.9430951409681345,7.949173927307129
-7.906578398789698,7.943588733673096
-7.9393021526221474,7.922613620758057
-7.950781972366453,7.969915390014648
-7.950781972366453,7.932620525360107
-7.920818811243059,7.914940357208252
-7.889410352488291,7.912425518035889
-7.924453006674053,7.922359943389893
-7.935542022791058,7.952911853790283
-7.946921547407927,7.9304518699646
-7.9430951409681345,7.922279357910156
-7.920818811243059,7.926270961761475
-7.96257349994767,7.947219371795654
-7.950781972366453,7.934301853179932
-7.948896057516428,7.930936336517334
-7.9737577757544535,7.927903652191162
-7.9393021526221474,7.940948009490967
-7.954677021213342,7.966442108154297
-7.970532618892763,7.973728179931641
-7.924453006674053,7.942134380340576
-7.91721462968355,7.962895393371582
-7.9430951409681345,7.969632625579834
-7.931814161156377,7.921902179718018
-7.924453006674053,7.920921325683594
-7.910094953104535,7.904880523681641
-7.920818811243059,7.934168338775635
-7.9430951409681345,7.92426872253418
-7.879425560900211,7.927788257598877
-7.896196359268842,7.925788402557373
-7.924453006674053,7.945289611816406
-7.9430951409681345,7.944113731384277
-7.931080216138895,7.9730610847473145
-7.935542022791058,7.879644870758057
-7.91721462968355,7.9391374588012695
-7.946921547407927,7.939769268035889
-7.9430951409681345,7.9367547035217285
-7.924453006674053,7.929483413696289
-7.946921547407927,7.936165809631348
-7.892790308673911,7.947794437408447
-7.954677021213342,7.940997123718262
-7.935542022791058,7.938939571380615
-7.970532618892763,7.977564811706543
-7.950781972366453,7.924749374389648
-7.863280055279963,7.926361083984375
-7.950781972366453,7.915235996246338
-7.924453006674053,7.934999942779541
-7.970532618892763,7.989150047302246
-7.866459873882536,7.906483173370361
-7.931814161156377,7.943828582763672
-7.9393021526221474,7.9157843589782715
-7.946921547407927,7.9534478187561035
-7.9430951409681345,7.951115131378174
-7.903090094245322,7.951644420623779
-7.950781972366453,7.946031093597412
-7.946921547407927,7.948080539703369
-7.931814161156377,7.9476704597473145
-7.876126826038142,7.923285007476807
-7.935542022791058,7.935154914855957
-7.954677021213342,7.923866271972656
-7.9430951409681345,7.94584321975708
-7.9393021526221474,7.923072338104248
-7.9430951409681345,7.923830986022949
-7.950781972366453,7.93025016784668
-7.950781972366453,7.9456000328063965
-7.950781972366453,7.939213275909424
-7.946921547407927,7.949715614318848
-7.946921547407927,7.939662456512451
-7.935542022791058,7.942874431610107
-7.950781972366453,7.944979190826416
-7.945701027587961,7.936464309692383
-7.910094953104535,7.935210704803467
-7.954677021213342,7.923182010650635
-7.950781972366453,7.932139873504639
-7.89962956062971,7.923262119293213
-7.93468629292431,7.968238830566406
-7.950781972366453,7.929101943969727
-7.906578398789698,7.906555652618408
-7.950781972366453,7.964883327484131
-7.886056354845152,7.889706134796143
-7.931814161156377,7.9190497398376465
-7.8637543524515,7.890838623046875
-7.954677021213342,7.939957141876221
-7.928117974144348,7.90086030960083
-7.946921547407927,7.937082767486572
-7.91721462968355,7.941932678222656
-7.8728955601551585,7.9280805587768555
-7.923581356476356,7.948746681213379
-7.928117974144348,7.9088873863220215
-7.954677021213342,7.929808139801025
-7.946921547407927,7.9440202713012695
-7.982923651140671,7.933252811431885
-7.928117974144348,7.945469379425049
-7.815309402546056,7.8962788581848145
-7.920818811243059,7.950112819671631
-7.950781972366453,7.94069766998291
-7.928117974144348,7.910305976867676
-7.928117974144348,7.969577312469482
-7.986842092993013,7.946573257446289
-7.924453006674053,7.917722225189209
-7.910094953104535,7.918776035308838
-7.950781972366453,7.949319362640381
-7.8728955601551585,7.914246559143066
-7.931814161156377,7.919684886932373
-7.931814161156377,7.934795379638672
-7.935542022791058,7.947041034698486
-7.9393021526221474,7.925143718719482
-7.928117974144348,7.94642448425293
-7.879425560900211,7.882845401763916
-7.946921547407927,7.964881896972656
-7.954677021213342,7.9415788650512695
-7.950781972366453,7.950918197631836
-7.931814161156377,7.922248363494873
-7.823919469453418,7.899033069610596
-7.913640691902861,7.939311504364014
-7.910094953104535,7.936164379119873
-7.946082651207223,7.903081893920898
-7.920818811243059,7.950226783752441
-7.9393021526221474,7.9346022605896
-7.995678626217357,7.934239864349365
-7.879425560900211,7.915497303009033
-7.954677021213342,7.940967559814453
-7.924453006674053,7.918144702911377
-7.954677021213342,7.936322212219238
-7.9430951409681345,7.928751468658447
-7.950781972366453,7.948078155517578
-7.950781972366453,7.9409003257751465
-7.946921547407927,7.935213088989258
-7.882728704344236,7.903134346008301
-7.946921547407927,7.946171283721924
-7.928117974144348,7.902649879455566
-7.9393021526221474,7.899594306945801
-7.920818811243059,7.903347969055176
-7.954677021213342,7.943858623504639
-7.9393021526221474,7.940253734588623
-7.928117974144348,7.932648181915283
-7.9393021526221474,7.9239935874938965
-7.882728704344236,7.922900676727295
-7.950781972366453,7.9260358810424805
-7.910094953104535,7.908792495727539
-7.896196359268842,7.926879405975342
-7.913640203677234,7.9466423988342285
-7.9393021526221474,7.93889045715332
-7.82102305270683,7.933811664581299
-7.9430951409681345,7.946674823760986
-7.9393021526221474,7.92660665512085
-7.966576241738391,7.952220439910889
-7.995678626217357,7.961697101593018
-7.924453006674053,7.9154863357543945
-7.950781972366453,7.94407320022583
-7.924453006674053,7.922304153442383
-7.954677021213342,7.953238487243652
-7.97490518667181,7.9869704246521
-7.835637836224461,7.913547992706299
-7.954677021213342,7.9521050453186035
-7.935542022791058,7.958691120147705
-7.935542022791058,7.937870979309082
-7.954677021213342,7.944090366363525
-7.928117974144348,7.930743217468262
-7.910094953104535,7.921341419219971
-7.950781972366453,7.942856311798096
-7.931814161156377,7.922868251800537
-7.9430951409681345,7.94293737411499
-7.878606331107103,7.932406902313232
-7.954677021213342,7.984038829803467
-7.935542022791058,7.9527764320373535
-7.924453006674053,7.93282413482666
-7.889410352488291,7.912857532501221
-7.931814161156377,7.89683723449707
-7.91721462968355,7.941793441772461
-7.939302143143198,7.919204235076904
-7.928117974144348,7.932255268096924
-7.928117974144348,7.886665344238281
-7.892790308673911,7.904907703399658
-7.924453006674053,7.950771808624268
-7.924453006674053,7.934079170227051
-7.89962956062971,7.9287285804748535
-7.935542022791058,7.944669723510742
-7.950781972366453,7.937192440032959
-7.954677021213342,7.9190545082092285
-7.954677021213342,7.952231407165527
-7.954677021213342,7.950196743011475
-7.924453006674053,7.916555881500244
-7.935542022791058,7.923029899597168
-7.974694136660875,7.963730335235596
-7.946921547407927,7.953378677368164
-7.91721462968355,7.925781726837158
-7.928117974144348,7.934232234954834
-7.9393021526221474,7.927585601806641
-7.877211195454222,7.9194769859313965
-7.931814161156377,7.899567127227783
-7.9430951409681345,7.92511510848999
-7.886056354845152,7.909115314483643
-7.931814161156377,7.942537307739258
-7.946082651207223,7.9366888999938965
-7.928117974144348,7.925844192504883
-7.882728704344236,7.925306797027588
-7.924453006674053,7.93778657913208
-7.920818811243059,7.933444499969482
-7.946921547407927,7.954945087432861
-7.948847473653619,7.939352035522461
-7.906578398789698,7.927067279815674
-7.889410352488291,7.948670864105225
-7.928117974144348,7.93930196762085
-7.954677021213342,7.955220699310303
-7.931814161156377,7.9376702308654785
-7.928117974144348,7.924129009246826
-7.924453006674053,7.911114692687988
-7.928117974144348,7.901267051696777
-7.928117974144348,7.897447109222412
-7.995678626217357,7.929484844207764
-7.954677021213342,7.961042404174805
-7.950781972366453,7.936305046081543
-7.928117974144348,7.92165994644165
-7.866625579174465,7.9015021324157715
-7.924453006674053,7.91940450668335
-7.9430951409681345,7.963228702545166
-7.954677021213342,7.957638740539551
-7.8728955601551585,7.903618812561035
-7.886056354845152,7.903411388397217
-7.924453006674053,7.926967144012451
-7.950781972366453,7.921928882598877
-7.9393021526221474,7.933969974517822
-7.986242509102693,7.973060131072998
-7.950781972366453,7.918455600738525
-7.954677021213342,7.959203243255615
-7.920818811243059,7.934470176696777
-7.924453006674053,7.947419166564941
-7.935542022791058,7.944430351257324
-7.954677021213342,7.939585208892822
-7.8416326138557455,7.938419818878174
-7.954677021213342,7.955687046051025
-7.935542022791058,7.934915065765381
-7.924453006674053,7.926609039306641
-7.9393021526221474,7.9207072257995605
-7.950781972366453,7.940451145172119
-7.924453006674053,7.915585041046143
-7.85078088734462,7.889182090759277
-7.9100228526366605,7.924180507659912
-7.935542022791058,7.950282096862793
-7.922491400135772,7.972208499908447
-7.954677021213342,7.937685489654541
-7.928117974144348,7.914058208465576
-7.950781972366453,7.927962779998779
-7.906578398789698,7.914393901824951
-7.950781972366453,7.940507888793945
-7.928117974144348,7.91963529586792
-7.954677021213342,7.956238269805908
-7.913640203677234,7.913959980010986
-7.924453006674053,7.927435398101807
-7.946921547407927,7.942319393157959
-7.9393021526221474,7.936422348022461
-7.928117974144348,7.934097766876221
-7.920818811243059,7.921731472015381
-7.935542022791058,7.942575931549072
-7.935542022791058,7.94035005569458
-7.982966659490206,7.96265172958374
-7.954677021213342,7.951449871063232
-7.924453006674053,7.934961318969727
-7.910094953104535,7.940338611602783
-7.920818811243059,7.92942476272583
-7.950781972366453,7.9254984855651855
-7.946921547407927,7.935683727264404
-7.954677021213342,7.951415061950684
-7.903090094245322,7.907211780548096
-7.924453006674053,7.9344964027404785
-7.954677021213342,7.936557292938232
-7.9393021526221474,7.931494235992432
-7.954677021213342,7.893121719360352
-7.889410352488291,7.932947635650635
-7.931814161156377,7.951636791229248
-7.9393021526221474,7.917503356933594
-7.920818811243059,7.914555072784424
-7.9393021526221474,7.896137237548828
-7.950781972366453,7.93114709854126
-7.954677021213342,7.951249122619629
-7.920818811243059,7.936517238616943
-7.954677021213342,7.951160907745361
-7.946921547407927,7.923234462738037
-7.9393021526221474,7.953620433807373
-7.924453006674053,7.919808864593506
-7.928117974144348,7.937481880187988
-7.954677021213342,7.960155963897705
-7.8761493177145505,7.904837131500244
-7.9616219366397445,7.952226161956787
-7.924453006674053,7.91697359085083
-7.950781972366453,7.949636936187744
-7.920818811243059,7.933829307556152
-7.882728704344236,7.92820405960083
-7.946921547407927,7.933421611785889
-7.982966659490206,7.949906826019287
-7.950781972366453,7.955055236816406
-7.950781972366453,7.945577144622803
-7.954677021213342,7.964300632476807
-7.950781972366453,7.945010185241699
-7.950781972366453,7.9202046394348145
-7.920818811243059,7.912311553955078
-7.932979898863743,7.917206764221191
-7.950781972366453,7.961915493011475
-7.91721462968355,7.937331199645996
-7.950781972366453,7.935669422149658
-7.9393021526221474,7.91682767868042
-7.9430951409681345,7.912661552429199
-7.928117974144348,7.923803329467773
-7.954677021213342,7.961799144744873
-7.9393021526221474,7.928220272064209
-7.879425560900211,7.912129878997803
-7.886522706972261,7.926788330078125
-7.924453006674053,7.926414966583252
-7.924453006674053,7.893746852874756
-7.950781972366453,7.940151214599609
-7.954677021213342,7.957699298858643
-7.954677021213342,7.939823150634766
-7.950781972366453,7.954839706420898
-7.882728704344236,7.904533863067627
-7.950781972366453,7.940305709838867
-7.954677021213342,7.920969486236572
-7.946921547407927,7.922420978546143
-7.903090094245322,7.917814254760742
-7.924453006674053,7.946049213409424
-7.924453006674053,7.907887935638428
-7.9393021526221474,7.951981544494629
-7.9393021526221474,7.954753398895264
-7.9393021526221474,7.949588775634766
-7.935542022791058,7.9363484382629395
-7.970532618892763,7.977758884429932
-7.950781972366453,7.928930759429932
-7.928155902956855,7.923921585083008
-7.920818811243059,7.878692150115967
-7.950781972366453,7.911464691162109
-7.954677021213342,7.93214225769043
-7.91721462968355,7.956420421600342
-7.950241642100192,7.939464569091797
-7.924453006674053,7.917793273925781
-7.995678626217357,7.954306125640869
-7.966617665152964,7.94225549697876
-7.879425560900211,7.940923690795898
-7.995678626217357,7.933134078979492
-7.853872762493711,7.91714334487915
-7.946921547407927,7.933193206787109
-7.924453006674053,7.921569347381592
-7.928117974144348,7.946517467498779
-7.928117974144348,7.9340057373046875
-7.954677021213342,7.9485626220703125
-7.928117974144348,7.9357805252075195
-7.950781972366453,7.9417524337768555
-7.9450041278335135,7.9318461418151855
-7.9430951409681345,7.931487560272217
-7.924453006674053,7.92692232131958
-7.935542022791058,7.940236568450928
-7.9383225629203995,7.913864612579346
-7.954677021213342,7.959423542022705
-7.954677021213342,7.957158088684082
-7.946921547407927,7.941904544830322
-7.9393021526221474,7.926873683929443
-7.924603424800292,7.936374664306641
-7.9393021526221474,7.924271106719971
-7.950781972366453,7.943783283233643
-7.924453006674053,7.9158034324646
-7.896196359268842,7.92084264755249
-7.94677806718906,7.942506313323975
-7.91721462968355,7.909388065338135
-7.9430951409681345,7.9550299644470215
-7.924453006674053,7.942130088806152
-7.950781972366453,7.9281229972839355
-7.946921547407927,7.9676899909973145
-7.9430951409681345,7.9245781898498535
-7.950781972366453,7.943289279937744
-7.928117974144348,7.932435512542725
-7.931814161156377,7.940572261810303
-7.954677021213342,7.976518154144287
-7.9430951409681345,7.932985782623291
-7.950781972366453,7.939112186431885
-7.886069026765648,7.949403285980225
-7.920818811243059,7.910862445831299
-7.9430951409681345,7.902865886688232
-7.950781972366453,7.932983875274658
-7.946921547407927,7.950651168823242
-7.954677021213342,7.931628227233887
-7.950781972366453,7.936511516571045
-7.89962956062971,7.916845321655273
-7.924453006674053,7.915527820587158
-7.950781972366453,7.940491199493408
-7.928117974144348,7.915852069854736
-7.931814161156377,7.943016052246094
-7.9393021526221474,7.948369979858398
-7.952121763853551,7.954709529876709
-7.976503417924229,7.967657089233398
-7.928117974144348,7.913343906402588
-7.935542022791058,7.941451549530029
-7.913640203677234,7.9241766929626465
-7.950781972366453,7.947371006011963
-7.950781972366453,7.932250022888184
-7.9393021526221474,7.924738883972168
-7.950781972366453,7.9520955085754395
-7.954677021213342,7.999993801116943
-7.924453006674053,7.948240756988525
-7.950781972366453,7.944984436035156
-7.946921547407927,7.943861484527588
-7.928117974144348,7.921571731567383
-7.928117974144348,7.936819553375244
-7.975985781891215,7.977396011352539
-7.950781972366453,7.933905124664307
-7.869665979871627,7.920899868011475
-7.935542022791058,7.958616256713867
-7.9393021526221474,7.965603351593018
-7.881888254406144,7.928268909454346
-7.954677021213342,7.9527907371521
-7.974694136660875,7.948051452636719
-7.906578398789698,7.920432090759277
-7.896196359268842,7.923253536224365
-7.9393021526221474,7.953850746154785
-7.946921547407927,7.936727523803711
-7.928155902956855,7.93997859954834
-7.860119116630385,7.944097518920898
-7.954677021213342,7.960494518280029
-7.946921547407927,7.9543538093566895
-7.950781972366453,7.950972080230713
-7.946921547407927,7.94082498550415
-7.9430951409681345,7.911435127258301
-7.928117974144348,7.910750389099121
-7.935542022791058,7.937506675720215
-7.829115272642338,7.8920440673828125
-7.950781972366453,7.950932502746582
-7.931814161156377,7.929450511932373
-7.966617665152964,7.957713603973389
-7.9393021526221474,7.926761627197266
-7.9393021526221474,7.923100471496582
-7.931814161156377,7.89346170425415
-7.863280055279963,7.895905017852783
-7.954677021213342,7.964815139770508
-7.904112985027737,7.940474033355713
-7.903090094245322,7.930974006652832
-7.882728704344236,7.911092281341553
-7.9430951409681345,7.947373867034912
-7.924453006674053,7.964779853820801
-7.946921547407927,7.93092155456543
-7.9430951409681345,7.960824012756348
-7.847706165863548,7.910715579986572
-7.835637836224461,7.886387825012207
-7.924453006674053,7.925120830535889
-7.931814161156377,7.9154744148254395
-7.910071604962776,7.901432037353516
-7.879425560900211,7.917629718780518
-7.9393021526221474,7.905222415924072
-7.928117974144348,7.928486347198486
-7.978810702253626,7.960981369018555
-7.935542022791058,7.9556050300598145
-7.951740612759727,7.943382740020752
-7.920818811243059,7.939969062805176
-7.982966659490206,7.959873199462891
-7.823919469453418,7.901202201843262
-7.9393021526221474,7.94666051864624
-7.954677021213342,7.940576076507568
-7.946921547407927,7.923425197601318
-7.869665979871627,7.894048690795898
-7.935542022791058,7.911616802215576
-7.91721462968355,7.931151866912842
-7.950781972366453,7.934173107147217
-7.946921547407927,7.924156188964844
-7.950781972366453,7.967692852020264
-7.954677021213342,7.944552898406982
-7.931814161156377,7.910199165344238
-7.9393021526221474,7.935483932495117
-7.9393021526221474,7.923459529876709
-7.948417707887132,7.9319634437561035
-7.950781972366453,7.964425563812256
-7.935542022791058,7.946314811706543
-7.946921547407927,7.964869976043701
-7.928117974144348,7.93967342376709
-7.928117974144348,7.929234027862549
-7.85078088734462,7.896043300628662
-7.931814161156377,7.91887092590332
-7.954677021213342,7.903134346008301
-7.946921547407927,7.939480781555176
-7.928117974144348,7.953378200531006
-7.924453006674053,7.937419414520264
-7.954677021213342,7.952001571655273
-7.94476951650491,7.9676666259765625
-7.9430951409681345,7.936486721038818
-7.978895913358191,7.964987277984619
-7.9737577757544535,7.980129241943359
-7.950781972366453,7.927811145782471
-7.928117974144348,7.9146809577941895
-7.931814161156377,7.928277492523193
-7.944020948459547,7.96831750869751
-7.928117974144348,7.956038475036621
-7.987162773987728,7.953810214996338
-7.950781972366453,7.9429850578308105
-7.954677021213342,7.954073905944824
-7.8349671212224035,7.947946071624756
-7.928117974144348,7.947389125823975
-7.808103965190196,7.8999104499816895
-7.946921547407927,7.956684589385986
-7.954677021213342,7.974021911621094
-7.920818811243059,7.938953876495361
-7.9393021526221474,7.934559345245361
-7.954677021213342,7.9565606117248535
-7.970532618892763,7.965698719024658
-7.946921547407927,7.928463459014893
-7.946921547407927,7.9227824211120605
-7.946921547407927,7.928908824920654
-7.910094953104535,7.913130760192871
-7.946921547407927,7.9431047439575195
-7.950781972366453,7.9419450759887695
-7.954677021213342,7.901973247528076
-7.9393021526221474,7.950968265533447
-7.950781972366453,7.9442620277404785
-7.935542022791058,7.931094646453857
-7.935542022791058,7.940265655517578
-7.954677021213342,7.9358906745910645
-7.920818811243059,7.920924663543701
-7.886056354845152,7.931507110595703
-7.935542022791058,7.945306301116943
-7.954677021213342,7.9710845947265625
-7.928117974144348,7.94972562789917
-7.935542022791058,7.9374799728393555
-7.928117974144348,7.938187122344971
-7.950781972366453,7.944251537322998
-7.9430951409681345,7.965339183807373
-7.924453006674053,7.923961162567139
-7.9393021526221474,7.923974990844727
-7.950781972366453,7.937748432159424
-7.860119116630385,7.916574001312256
-7.9393021526221474,7.946951389312744
-7.869732506393041,7.921063423156738
-7.924453006674053,7.922911643981934
-7.946921547407927,7.940359592437744
-7.928117974144348,7.950174331665039
-7.954677021213342,7.9348931312561035
-7.892790308673911,7.94106912612915
-7.85078088734462,7.903406143188477
-7.950781972366453,7.939001560211182
-7.946921547407927,7.924413204193115
-7.946921547407927,7.954677104949951
-7.941316379949553,7.917490482330322
-7.924453006674053,7.946337699890137
-7.8877303691149265,7.939864635467529
-7.931814161156377,7.945887088775635
-7.931814161156377,7.937699794769287
-7.91721462968355,7.928500652313232
-7.950781972366453,7.9554667472839355
-7.928117974144348,7.91597318649292
-7.886056354845152,7.949687480926514
-7.9430951409681345,7.956295490264893
-7.939379961634402,7.924849987030029
-7.982923651140671,7.972889423370361
-7.924453006674053,7.921350955963135
-7.9430951409681345,7.921023368835449
-7.906578398789698,7.9407219886779785
-7.935542022791058,7.952908992767334
-7.9430951409681345,7.927031993865967
-7.920818811243059,7.921823978424072
-7.905858399694566,7.904942035675049
-7.950781972366453,7.932711124420166
-7.920818811243059,7.910560131072998
-7.879425560900211,7.915100574493408
-7.950781972366453,7.934103488922119
-7.946358101683472,7.922362327575684
-7.903090094245322,7.938782215118408
-7.935542022791058,7.937285900115967
-7.89962956062971,7.9122772216796875
-7.946921547407927,7.941688537597656
-7.9393021526221474,7.908142566680908
-7.950781972366453,7.961811542510986
-7.995678626217357,7.946195125579834
-7.950781972366453,7.941207408905029
-7.950781972366453,7.948877334594727
-7.954677021213342,7.928861618041992
-7.850769918467369,7.911726474761963
-7.903090094245322,7.897964954376221
-7.856986114171083,7.911356449127197
-7.950781972366453,7.926640033721924
-7.924453006674053,7.943538665771484
-7.995678626217357,7.929280757904053
-7.954677021213342,7.973001480102539
-7.935542022791058,7.932896137237549
-7.950781972366453,7.932143211364746
-7.928117974144348,7.933291912078857
-7.982966659490206,7.968013763427734
-7.931814161156377,7.944737911224365
-7.924453006674053,7.939371109008789
-7.9430951409681345,7.942897319793701
-7.9430951409681345,7.925009250640869
-7.950781972366453,7.942508220672607
-7.924453006674053,7.922656536102295
-7.878795273245934,7.915189266204834
-7.89962956062971,7.904361724853516
-7.946921547407927,7.9392409324646
-7.954677021213342,7.940141677856445
-7.954677021213342,7.941550254821777
-7.91721462968355,7.939156532287598
-7.946921547407927,7.941068172454834
-7.873946355627666,7.927511692047119
-7.954677021213342,7.925780773162842
-7.950781972366453,7.953726291656494
-7.935542022791058,7.910526752471924
-7.946921547407927,7.961843013763428
-7.860119116630385,7.882747173309326
-7.946921547407927,7.953133583068848
-7.928117974144348,7.930538177490234
-7.924453006674053,7.952664852142334
-7.950781972366453,7.955120086669922
-7.9913998274291025,7.9716386795043945
-7.838628495628443,7.899249076843262
-7.920818811243059,7.920374393463135
-7.982923651140671,7.951140880584717
-7.906578398789698,7.918759822845459
-7.931814161156377,7.905817031860352
-7.950781972366453,7.9484148025512695
-7.9737577757544535,7.951456546783447
-7.954677021213342,7.932367324829102
-7.924453006674053,7.925431728363037
-7.889410352488291,7.90811824798584
-7.886056354845152,7.903281211853027
-7.9393021526221474,7.935006618499756
-7.931814161156377,7.9378838539123535
-7.954677021213342,7.966823577880859
-7.928155902956855,7.9706807136535645
-7.946921547407927,7.923779487609863
-7.954677021213342,7.958499908447266
-7.920818811243059,7.920844554901123
-7.950781972366453,7.937078952789307
-7.946921547407927,7.9202799797058105
-7.869665979871627,7.925420761108398
-7.950781972366453,7.943902492523193
-7.937418018328723,7.953060626983643
-7.928117974144348,7.925520420074463
-7.9393021526221474,7.914903163909912
-7.9393021526221474,7.9280266761779785
-7.970532618892763,7.971449851989746
-7.892790308673911,7.92405891418457
-7.924453006674053,7.918778419494629
-7.9393021526221474,7.933334827423096
-7.924453006674053,7.933797359466553
-7.924453006674053,7.905416011810303
-7.954677021213342,7.955517292022705
-7.950781972366453,7.951982021331787
-7.82102305270683,7.887331008911133
-7.880155410592389,7.930819511413574
-7.928117974144348,7.935153484344482
-7.954677021213342,7.941502094268799
-7.89962956062971,7.919987201690674
-7.954677021213342,7.942934036254883
-7.970532618892763,7.955687046051025
-7.920818811243059,7.936609745025635
-7.8728955601551585,7.932251453399658
-7.924453006674053,7.886133670806885
-7.8728955601551585,7.895801544189453
-7.85078088734462,7.891814708709717
-7.9393021526221474,7.922351360321045
-7.950781972366453,7.934823036193848
-7.950781972366453,7.952578067779541
-7.9393021526221474,7.9199748039245605
-7.903090094245322,7.907796382904053
-7.950781972366453,7.937435150146484
-7.913640203677234,7.950662612915039
-7.8761493177145505,7.9178643226623535
-7.964781356411861,7.934678077697754
-7.931814161156377,7.919376373291016
-7.928117974144348,7.919660568237305
-7.931814161156377,7.922834396362305
-7.906578398789698,7.926490306854248
-7.931814161156377,7.899521827697754
-7.946921547407927,7.932087421417236
-7.898841589585073,7.953012466430664
-7.950781972366453,7.960860729217529
-7.935542022791058,7.94893217086792
-7.950781972366453,7.915389060974121
-7.9393021526221474,7.923478126525879
-7.954677021213342,7.929253101348877
-7.856986114171083,7.9293131828308105
-7.913640203677234,7.904087543487549
-7.924453006674053,7.915068626403809
-7.954677021213342,7.969040393829346
-7.9430951409681345,7.950380802154541
-7.935542022791058,7.941212177276611
-7.924453006674053,7.946407318115234
-7.924453006674053,7.9509735107421875
-7.946921547407927,7.929530620574951
-7.9393021526221474,7.901485443115234
-7.924453006674053,7.950417995452881
-7.946921547407927,7.92439603805542
-7.950781972366453,7.954099178314209
-7.913640203677234,7.9192585945129395
-7.931814161156377,7.917943477630615
-7.950781972366453,7.955162048339844
-7.9430951409681345,7.959759712219238
-7.9430951409681345,7.943183422088623
-7.924453006674053,7.94257116317749
-7.9430951409681345,7.934552192687988
-7.950781972366453,7.958188533782959
-7.954677021213342,7.948470592498779
-7.950781972366453,7.9589738845825195
-7.928117974144348,7.943678379058838
-7.924453006674053,7.945532321929932
-7.931814161156377,7.940199375152588
-7.89962956062971,7.903560161590576
-7.928117974144348,7.944020748138428
-7.924453006674053,7.931407928466797
-7.924453006674053,7.903012275695801
-7.928117974144348,7.940854549407959
-7.9737577757544535,7.944495677947998
-7.950781972366453,7.9408979415893555
-7.920818811243059,7.915017604827881
-7.9430951409681345,7.921607971191406
-7.950781972366453,7.947160720825195
-7.946921547407927,7.928483963012695
-7.954677021213342,7.966910362243652
-7.954677021213342,7.962722301483154
-7.869665979871627,7.927109718322754
-7.950781972366453,7.915434837341309
-7.952725130123009,7.9160284996032715
-7.9393021526221474,7.937350749969482
-7.931814161156377,7.942564964294434
-7.9430951409681345,7.94256067276001
-7.85078088734462,7.905215740203857
-7.906578398789698,7.944619178771973
-7.935542022791058,7.958576679229736
-7.9430951409681345,7.91195821762085
-7.928117974144348,7.946991443634033
-7.91721462968355,7.951659679412842
-7.928117974144348,7.9662699699401855
-7.907994273271671,7.916275978088379
-7.928117974144348,7.926663875579834
-7.954677021213342,7.941854476928711
-7.910094953104535,7.9435715675354
-7.9393021526221474,7.914827823638916
-7.946921547407927,7.952738285064697
-7.928117974144348,7.930656433105469
-7.924453006674053,7.939996242523193
-7.935542022791058,7.94473123550415
-7.913640203677234,7.946539402008057
-7.9393021526221474,7.929163932800293
-7.913640203677234,7.919528961181641
-7.9430951409681345,7.938509464263916
-7.838628495628443,7.892213344573975
-7.928117974144348,7.944469451904297
-7.924453006674053,7.901856899261475
-7.853872762493711,7.877130031585693
-7.950781972366453,7.937445163726807
-7.950781972366453,7.935758590698242
-7.9393021526221474,7.934915065765381
-7.910785504334857,7.9431843757629395
-7.871689855844627,7.853664875030518
-7.982923651140671,7.941837310791016
-7.978895913358191,7.9697418212890625
-7.995678626217357,7.937242031097412
-7.920818811243059,7.915985584259033
-7.924453006674053,7.900500774383545
-7.982923651140671,7.937316417694092
-7.970532618892763,7.9634318351745605
-7.9059218090964904,7.942691326141357
-7.946921547407927,7.902719497680664
-7.8761493177145505,7.9011311531066895
-7.9430951409681345,7.944380760192871
-7.954677021213342,7.9414448738098145
-7.9430951409681345,7.943732738494873
-7.950781972366453,7.941768646240234
-7.995678626217357,7.966304779052734
-7.903090094245322,7.902407169342041
-7.931814161156377,7.909946441650391
-7.936383118448278,7.923731327056885
-7.8955201011087315,7.936074733734131
-7.9430951409681345,7.942200183868408
-7.995678626217357,7.937408924102783
-7.950241642100192,7.917867660522461
-7.882728704344236,7.902533531188965
-7.882728704344236,7.895186424255371
-7.950781972366453,7.96821928024292
-7.950781972366453,7.921233177185059
-7.931814161156377,7.927729606628418
-7.950781972366453,7.959106922149658
-7.9393021526221474,7.939673900604248
-7.9393021526221474,7.91079568862915
-7.896196359268842,7.949425220489502
-7.9430951409681345,7.928480625152588
-7.924453006674053,7.9465203285217285
-7.954677021213342,7.957850456237793
-7.920818811243059,7.927305698394775
-7.954677021213342,7.93387508392334
-7.950781972366453,7.9420928955078125
-7.931814161156377,7.926968574523926
-7.954677021213342,7.952772617340088
-7.924453006674053,7.921041965484619
-7.860119116630385,7.951125621795654
-7.931814161156377,7.946113109588623
-7.935542022791058,7.9166669845581055
-7.946921547407927,7.912928581237793
-7.931814161156377,7.904297828674316
-7.892790308673911,7.935493469238281
-7.927893565088736,7.951094150543213
-7.913640203677234,7.921017646789551
-7.952121763853551,7.954375743865967
-7.928117974144348,7.915113925933838
-7.853872762493711,7.9117631912231445
-7.892790308673911,7.921934127807617
-7.946921547407927,7.9608235359191895
-7.950781972366453,7.949495792388916
-7.9393021526221474,7.952159404754639
-7.954677021213342,7.956834316253662
-7.950781972366453,7.9353203773498535
-7.931814161156377,7.902688980102539
-7.876350205074754,7.9215264320373535
-7.9393021526221474,7.922351360321045
-7.950781972366453,7.923676013946533
-7.954677021213342,7.934654712677002
-7.886056354845152,7.915090084075928
-7.954677021213342,7.95262336730957
-7.913640203677234,7.963679790496826
-7.920818811243059,7.941024303436279
-7.982966659490206,7.9730024337768555
-7.906578398789698,7.930012226104736
-7.950781972366453,7.920329570770264
-7.9393021526221474,7.937690258026123
-7.928117974144348,7.902307033538818
-7.924453006674053,7.952089786529541
-7.935785622146027,7.941365718841553
-7.946921547407927,7.943851947784424
-7.954677021213342,7.952487945556641
-7.950781972366453,7.952219009399414
-7.906578398789698,7.920709609985352
-7.954677021213342,7.961803913116455
-7.924453006674053,7.946007251739502
-7.950781972366453,7.937647342681885
-7.950781972366453,7.930506706237793
-7.9393021526221474,7.9141716957092285
-7.982966659490206,7.993931770324707
-7.9393021526221474,7.931987285614014
-7.950781972366453,7.95078706741333
-7.920818811243059,7.922470569610596
-7.9393021526221474,7.9244232177734375
-7.9430951409681345,7.948395252227783
-7.950781972366453,7.939336776733398
-7.946921547407927,7.925781726837158
-7.946921547407927,7.917556285858154
-7.924453006674053,7.927334308624268
-7.924453006674053,7.9399943351745605
-7.9430951409681345,7.934492588043213
-7.866459873882536,7.945362567901611
-7.982923651140671,7.943251132965088
-7.954677021213342,7.934144973754883
-7.954677021213342,7.962004661560059
-7.950781972366453,7.947836399078369
-7.954677021213342,7.950255870819092
-7.924453006674053,7.936611652374268
-7.950781972366453,7.967258930206299
-7.924453006674053,7.938571929931641
-7.935542022791058,7.90449857711792
-7.9430951409681345,7.964419841766357
-7.9393021526221474,7.923899173736572
-7.863280055279963,7.944233417510986
-7.892790308673911,7.884634494781494
-7.8611534604771105,7.942518711090088
-7.924453006674053,7.920875072479248
-7.8493737915542425,7.918968200683594
-7.85078088734462,7.895969867706299
-7.946921547407927,7.945024013519287
-7.903090094245322,7.91152811050415
-7.913640203677234,7.929514408111572
-7.9430951409681345,7.9388837814331055
-7.920818811243059,7.9542059898376465
-7.9393021526221474,7.9519124031066895
-7.920818811243059,7.90921688079834
-7.910094953104535,7.908407211303711
-7.935542022791058,7.962080478668213
-7.920818811243059,7.917187213897705
-7.939379961634402,7.9710917472839355
-7.924453006674053,7.946701526641846
-7.966576241738391,7.951600551605225
-7.903090094245322,7.924561023712158
-7.931814161156377,7.908100605010986
-7.950781972366453,7.929086208343506
-7.9737577757544535,7.913144588470459
-7.9393021526221474,7.9535088539123535
-7.910094953104535,7.921563625335693
-7.916637144431181,7.934986591339111
-7.950781972366453,7.9381513595581055
-7.910094953104535,7.930605888366699
-7.924453006674053,7.933469772338867
-7.91721462968355,7.931090831756592
-7.9430951409681345,7.90029764175415
-7.892790308673911,7.908034801483154
-7.949816020592385,7.945372104644775
-7.9393021526221474,7.955126762390137
-7.946921547407927,7.937669277191162
-7.9393021526221474,7.937933921813965
-7.950781972366453,7.955777168273926
-7.931814161156377,7.923083782196045
-7.9393021526221474,7.937821865081787
-7.9430951409681345,7.929924488067627
-7.928117974144348,7.909681797027588
-7.950781972366453,7.916649341583252
-7.9430951409681345,7.955941200256348
-7.954677021213342,7.930408000946045
-7.924453006674053,7.913582801818848
-7.9430951409681345,7.9452104568481445
-7.950781972366453,7.950544834136963
-7.910094953104535,7.918576240539551
-7.906578398789698,7.933784484863281
-7.966576241738391,7.96423864364624
-7.9276692719301005,7.957817554473877
-7.9430951409681345,7.922064304351807
-7.950781972366453,7.920609474182129
-7.924453006674053,7.932133197784424
-7.928117974144348,7.9322028160095215
-7.9098263336041486,7.953697681427002
-7.888410265725225,7.887002468109131
-7.924453006674053,7.941211223602295
-7.9393021526221474,7.930609703063965
-7.951345781987695,7.919721603393555
-7.946921547407927,7.946056842803955
-7.950781972366453,7.932557106018066
-7.950781972366453,7.928812026977539
-7.928117974144348,7.952469348907471
-7.889410352488291,7.927460193634033
-7.931814161156377,7.922272205352783
-7.847706165863548,7.891471862792969
-7.946921547407927,7.918094635009766
-7.935542022791058,7.932050704956055
-7.931814161156377,7.927011966705322
-7.924603424800292,7.892471790313721
-7.920818811243059,7.959924221038818
-7.950781972366453,7.930812358856201
-7.928117974144348,7.920039653778076
-7.9430951409681345,7.935040473937988
-7.982966659490206,7.9688825607299805
-7.9430951409681345,7.9227190017700195
-7.950781972366453,7.950300693511963
-7.954677021213342,7.930362224578857
-7.9430951409681345,7.938015460968018
-7.9430951409681345,7.9362006187438965
-7.954677021213342,7.943241596221924
-7.932979898863743,7.937633991241455
-7.935542022791058,7.9295148849487305
-7.931814161156377,7.950657367706299
-7.950781972366453,7.935744762420654
-7.950781972366453,7.93489408493042
-7.954677021213342,7.954954147338867
-7.950781972366453,7.930293083190918
-7.882728704344236,7.911362171173096
-7.920818811243059,7.939539432525635
-7.950781972366453,7.953089237213135
-7.892971636288177,7.924285411834717
-7.889549016187033,7.873268127441406
-7.920818811243059,7.9151291847229
-7.896196359268842,7.9387993812561035
-7.82102305270683,7.8877339363098145
-7.924453006674053,7.900384902954102
-7.954677021213342,7.912928104400635
-7.950781972366453,7.94119930267334
-7.946921547407927,7.941935062408447
-7.928117974144348,7.923595428466797
-7.9393021526221474,7.904101848602295
-7.898488952953535,7.965117454528809
-7.928117974144348,7.927514553070068
-7.950781972366453,7.909458637237549
-7.935542022791058,7.905282974243164
-7.844664854175832,7.907730579376221
-7.954677021213342,7.947473526000977
-7.950781972366453,7.918915271759033
-7.995678626217357,7.920287609100342
-7.931439075798742,7.936281681060791
-7.950781972366453,7.931583881378174
-7.954677021213342,7.932541370391846
-7.9393021526221474,7.934226036071777
-7.9393021526221474,7.9336652755737305
-7.860153329415682,7.925898551940918
-7.954677021213342,7.969016075134277
-7.920818811243059,7.894405841827393
-7.896196359268842,7.936360836029053
-7.946082651207223,7.9403395652771
-7.954677021213342,7.951417922973633
-7.91721462968355,7.915729999542236
-7.8742053319779455,7.9244279861450195
-7.9393021526221474,7.943027019500732
-7.950781972366453,7.9639763832092285
-7.920818811243059,7.920450210571289
-7.950781972366453,7.935667991638184
-7.8728955601551585,7.920987606048584
-7.935542022791058,7.910879611968994
-7.91721462968355,7.945469856262207
-7.935542022791058,7.953894138336182
-7.924453006674053,7.907896518707275
-7.950781972366453,7.954580307006836
-7.954677021213342,7.9538140296936035
-7.9913998274291025,7.9568705558776855
-7.950781972366453,7.950175762176514
-7.931814161156377,7.924042701721191
-7.928117974144348,7.9535651206970215
-7.928117974144348,7.941026210784912
-7.853872762493711,7.888574600219727
-7.935542022791058,7.932499885559082
-7.950781972366453,7.935110569000244
-7.9393021526221474,7.942301273345947
-7.920818811243059,7.941895484924316
-7.889410352488291,7.929783344268799
-7.879425560900211,7.937099933624268
-7.928117974144348,7.91777229309082
-7.935542022791058,7.941568374633789
-7.954677021213342,7.940769195556641
-7.847706165863548,7.90501070022583
-7.85078088734462,7.875992298126221
-7.924453006674053,7.921358585357666
-7.935542022791058,7.921721458435059
-7.946921547407927,7.940514087677002
-7.954677021213342,7.914249420166016
-7.950781972366453,7.950891017913818
-7.91721462968355,7.920799732208252
-7.9374179968960075,7.9614763259887695
-7.91721462968355,7.93678617477417
-7.954677021213342,7.956483364105225
-7.931814161156377,7.94652795791626
-7.935542022791058,7.955721378326416
-7.9393021526221474,7.897144317626953
-7.978810702253626,7.966719627380371
-7.920818811243059,7.908053874969482
-7.920818811243059,7.937636852264404
-7.950781972366453,7.940951347351074
-7.954677021213342,7.978137493133545
-7.927336730250859,7.923062801361084
-7.888508509082229,7.922935962677002
-7.946921547407927,7.932153224945068
-7.924453006674053,7.931326866149902
-7.906578398789698,7.919583797454834
-7.950781972366453,7.929183483123779
-7.946921547407927,7.9384870529174805
-7.982966659490206,7.9787774085998535
-7.954677021213342,7.938156604766846
-7.995678626217357,7.968545436859131
-7.954699421917906,7.931196689605713
-7.924453006674053,7.930639266967773
-7.935542022791058,7.9340128898620605
-7.904602317703036,7.945032596588135
-7.954677021213342,7.974316596984863
-7.946921547407927,7.943180561065674
-7.9430951409681345,7.924010753631592
-7.9393021526221474,7.931506156921387
-7.950781972366453,7.970822811126709
-7.950781972366453,7.925058364868164
-7.863762197449,7.922450065612793
-7.9393021526221474,7.94516134262085
-7.9430951409681345,7.927673816680908
-7.913640203677234,7.951457500457764
-7.954677021213342,7.961167335510254
-7.924453006674053,7.924690246582031
-7.982966659490206,7.963443279266357
-7.903090094245322,7.935103893280029
-7.928117974144348,7.909622669219971
-7.946921547407927,7.940687656402588
-7.950781972366453,7.944149971008301
-7.954677021213342,7.965052127838135
-7.9430951409681345,7.953120708465576
-7.853872762493711,7.896536827087402
-7.954677021213342,7.950501441955566
-7.946921547407927,7.948024272918701
-7.950781972366453,7.944343566894531
-7.954677021213342,7.951905727386475
-7.954677021213342,7.9424662590026855
-7.931814161156377,7.92306661605835
-7.954677021213342,7.962225437164307
-7.826774591089415,7.918622970581055
-7.920818811243059,7.940871238708496
-7.928117974144348,7.9150614738464355
-7.918702847281798,7.8888421058654785
-7.901986604559976,7.963168621063232
-7.920818811243059,7.93896484375
-7.935542022791058,7.92267370223999
-7.954677021213342,7.976651668548584
-7.935542022791058,7.959197521209717
-7.924453006674053,7.922607898712158
-7.931814161156377,7.936084270477295
-7.866459873882536,7.908243656158447
-7.910094953104535,7.9423298835754395
-7.954677021213342,7.937046051025391
-7.889410352488291,7.907246112823486
-7.913640203677234,7.908268451690674
-7.950781972366453,7.908365249633789
-7.946921547407927,7.941386699676514
-7.882728704344236,7.961920261383057
-7.8761493177145505,7.906460762023926
-7.924453006674053,7.923036098480225
-7.954677021213342,7.92372465133667
-7.9393021526221474,7.933483600616455
-7.931814161156377,7.91966438293457
-7.954677021213342,7.955728530883789
-7.91721462968355,7.933642864227295
-7.924453006674053,7.935667514801025
-7.860119116630385,7.894078731536865
-7.8728955601551585,7.927696704864502
-7.935542022791058,7.9414215087890625
-7.9393021526221474,7.922383785247803
-7.888111639210337,7.941807270050049
-7.950781972366453,7.938848972320557
-7.928117974144348,7.931834697723389
-7.928117974144348,7.934205532073975
-7.924453006674053,7.957332134246826
-7.892790308673911,7.90876579284668
-7.935542022791058,7.951827049255371
-7.954677021213342,7.9410080909729
-7.915575394493873,7.926742076873779
-7.9430951409681345,7.925533771514893
-7.946921547407927,7.951900005340576
-7.950781972366453,7.966175556182861
-7.948658283730227,7.950552463531494
-7.913942323339224,8.000032424926758
-7.924453006674053,7.926994800567627
-7.9430951409681345,7.946666240692139
-7.924453006674053,7.934122562408447
-7.8728955601551585,7.906489849090576
-7.920818811243059,7.9259161949157715
-7.950781972366453,7.945560455322266
-7.950781972366453,7.943796634674072
-7.830984932712759,7.914263725280762
-7.924453006674053,7.9349141120910645
-7.950781972366453,7.96072244644165
-7.913640203677234,7.947210311889648
-7.954677021213342,7.942734241485596
-7.946921547407927,7.938421726226807
-7.931814161156377,7.919112205505371
-7.9430951409681345,7.921886444091797
-7.882728704344236,7.906358242034912
-7.963788392246652,7.919508934020996
-7.913640203677234,7.9437055587768555
-7.9430951409681345,7.944029331207275
-7.928117974144348,7.908942699432373
-7.954677021213342,7.954727649688721
-7.886056354845152,7.929952144622803
-7.9393021526221474,7.944024085998535
-7.9393021526221474,7.94735860824585
-7.913640203677234,7.949442386627197
-7.935542022791058,7.922597885131836
-7.875899990405765,7.923887729644775
-7.91721462968355,7.907376766204834
-7.928117974144348,7.934859752655029
-7.935542022791058,7.94328498840332
-7.9393021526221474,7.949397087097168
-7.950781972366453,7.941568851470947
-7.950781972366453,7.934813022613525
-7.954677021213342,7.9583611488342285
-7.9430951409681345,7.9477105140686035
-7.946921547407927,7.9502387046813965
-7.91721462968355,7.922504901885986
-7.950781972366453,7.923880100250244
-7.920818811243059,7.928540229797363
-7.931814161156377,7.95239782333374
-7.950781972366453,7.954331874847412
-7.9393021526221474,7.918796062469482
-7.982923651140671,7.95731782913208
-7.920818811243059,7.9238080978393555
-7.950781972366453,7.947716236114502
-7.954677021213342,7.92540979385376
-7.9430951409681345,7.954923152923584
-7.895581761337452,7.920392990112305
-7.950781972366453,7.941198348999023
-7.9393021526221474,7.922396659851074
-7.954677021213342,7.976527690887451
-7.954677021213342,7.96445369720459
-7.93468629292431,7.964009761810303
-7.896196359268842,7.904358386993408
-7.950781972366453,7.957742214202881
-7.903090094245322,7.938058376312256
-7.954677021213342,7.908942699432373
-7.950781972366453,7.947783470153809
-7.928117974144348,7.948145866394043
-7.97490518667181,7.983823776245117
-7.954677021213342,7.944924831390381
-7.866185328564197,7.8948845863342285
-7.950781972366453,7.939164638519287
-7.954677021213342,7.976469039916992
-7.886056354845152,7.911397457122803
-7.950781972366453,7.936187744140625
-7.978810702253626,7.939384937286377
-7.9385393627751295,7.950022220611572
-7.928117974144348,7.919515132904053
-7.935542022791058,7.960629940032959
-7.9393021526221474,7.929773330688477
-7.882728704344236,7.931526184082031
-7.89962956062971,7.92969274520874
-7.8728955601551585,7.917105674743652
-7.950781972366453,7.938427925109863
-7.8728955601551585,7.940290927886963
-7.913640203677234,7.9636077880859375
-7.946921547407927,7.947086811065674
-7.924453006674053,7.905766487121582
-7.896196359268842,7.908768177032471
-7.946921547407927,7.947634696960449
-7.950781972366453,7.948383808135986
-7.920818811243059,7.9269022941589355
-7.896196359268842,7.932551383972168
-7.935542022791058,7.953680992126465
-7.913640203677234,7.942498683929443
-7.990339285400088,7.960595607757568
-7.91721462968355,7.9094719886779785
-7.924453006674053,7.929521083831787
-7.882728704344236,7.948886871337891
-7.924453006674053,7.938498020172119
-7.9430951409681345,7.963690280914307
-7.950781972366453,7.923604965209961
-7.9430951409681345,7.909654140472412
-7.879425560900211,7.931558132171631
-7.928117974144348,7.932825565338135
-7.93468629292431,7.9471516609191895
-7.931814161156377,7.918856143951416
-7.928117974144348,7.9330315589904785
-7.982923651140671,7.921692371368408
-7.892790308673911,7.9319939613342285
-7.928117974144348,7.944743633270264
-7.946921547407927,7.951572418212891
-7.950781972366453,7.9192047119140625
-7.9430951409681345,7.920240879058838
-7.950781972366453,7.949718952178955
-7.931814161156377,7.9501729011535645
-7.950781972366453,7.922891139984131
-7.928936536236001,7.943457126617432
-7.9393021526221474,7.9184136390686035
-7.91721462968355,7.928590297698975
-7.892790308673911,7.938186168670654
-7.924453006674053,7.937138080596924
-7.924453006674053,7.915533542633057
-7.935542022791058,7.9240241050720215
-7.948417707887132,7.933521747589111
-7.954677021213342,7.937688827514648
-8.022370577841233,7.976945877075195
-7.896196359268842,7.941258430480957
-7.9430951409681345,7.954654216766357
-7.924453006674053,7.931908130645752
-7.8761493177145505,7.951573371887207
-7.954677021213342,7.926731586456299
-7.928117974144348,7.940063953399658
-7.970616219270671,7.948309421539307
-7.946921547407927,7.928442478179932
-7.935542022791058,7.938652515411377
-7.924453006674053,7.927942276000977
-7.928117974144348,7.919388294219971
-7.878795273245934,7.853664875030518
-7.889410352488291,7.878305435180664
-7.950781972366453,7.932315826416016
-7.924453006674053,7.912984371185303
-7.882728704344236,7.932121753692627
-7.935542022791058,7.931545734405518
-7.931814161156377,7.943378925323486
-7.913640203677234,7.944327354431152
-7.913640203677234,7.905436992645264
-7.894231790888085,7.932012557983398
-7.954677021213342,7.958023548126221
-7.954677021213342,7.9573235511779785
-7.943055911701025,7.920966625213623
-7.8876003998252076,7.9409966468811035
-7.935542022791058,7.938191890716553
-7.9430951409681345,7.934446811676025
-7.935542022791058,7.929025173187256
-7.954677021213342,7.9303669929504395
-7.920818811243059,7.913538932800293
-7.9430951409681345,7.929813861846924
-7.928117974144348,7.901992321014404
-7.818151283467686,7.903458118438721
-7.9393021526221474,7.922228813171387
-7.910094953104535,7.93966817855835
-7.950781972366453,7.958882808685303
-7.950781972366453,7.949765682220459
-7.935542022791058,7.944653034210205
-7.950781972366453,7.935033321380615
-7.9230780883676,7.939730167388916
-7.978810702253626,7.96450662612915
-7.920818811243059,7.934800624847412
-7.924453006674053,7.913605213165283
-7.835637836224461,7.929371356964111
-7.950781972366453,7.9409942626953125
-7.829768510087842,7.890135288238525
-7.966576241738391,7.9724345207214355
-7.950781972366453,7.946846961975098
-7.920818811243059,7.940223217010498
-7.931814161156377,7.944653034210205
-7.935542022791058,7.943939685821533
-7.924453006674053,7.927826881408691
-7.950781972366453,7.952632427215576
-7.892790308673911,7.90528678894043
-7.93468629292431,7.951497554779053
-7.826774591089415,7.929492473602295
-7.924453006674053,7.929062843322754
-7.844664854175832,7.903005123138428
-7.950781972366453,7.937767028808594
-7.928117974144348,7.934812068939209
-7.950781972366453,7.934994697570801
-7.8493737915542425,7.904435634613037
-7.924453006674053,7.9382243156433105
-7.829577898841944,7.900035381317139
-7.858096678988375,7.919644355773926
-7.829768510087842,7.888274192810059
-7.924453006674053,7.934586524963379
-7.924453006674053,7.956406116485596
-7.946921547407927,7.929584980010986
-7.910094953104535,7.941442966461182
-7.892790308673911,7.934425354003906
-7.935542022791058,7.952017784118652
-7.9393021526221474,7.960489273071289
-7.950781972366453,7.944131374359131
-7.935542022791058,7.931973457336426
-7.931814161156377,7.915272235870361
-7.954677021213342,7.950194358825684
-7.950781972366453,7.978370189666748
-7.931814161156377,7.930089473724365
-7.913640203677234,7.940393447875977
-7.924453006674053,7.911853313446045
-7.920818811243059,7.923598766326904
-7.931814161156377,7.94163179397583
-7.928117974144348,7.937471866607666
-7.928117974144348,7.957216739654541
-7.920818811243059,7.926354885101318
-7.928117974144348,7.911250114440918
-7.950781972366453,7.939340114593506
-7.896196359268842,7.937020778656006
-7.966617665152964,7.939192295074463
-7.950781972366453,7.9369378089904785
-7.9430951409681345,7.962169170379639
-7.913038744896253,7.921456336975098
-7.931814161156377,7.921286106109619
-7.950781972366453,7.916656494140625
-7.954677021213342,7.93766450881958
-7.907994273271671,7.947457790374756
-7.920818811243059,7.933663368225098
-7.924453006674053,7.921228408813477
-7.822215191706272,7.949934482574463
-7.928117974144348,7.946862697601318
-7.924453006674053,7.9398322105407715
-7.954677021213342,7.975047588348389
-7.9393021526221474,7.916128158569336
-7.950781972366453,7.93960428237915
-7.928117974144348,7.950405120849609
-7.924453006674053,7.933431625366211
-7.924453006674053,7.950130939483643
-7.954677021213342,7.9338154792785645
-7.954677021213342,7.949093341827393
-7.932177017317765,7.933319091796875
-7.928117974144348,7.920234680175781
-7.954677021213342,7.91595983505249
-7.903090094245322,7.911060333251953
-7.924453006674053,7.924452304840088
-7.931814161156377,7.909457206726074
-8.026824561605242,7.979557514190674
-7.869665979871627,7.9122185707092285
-7.954677021213342,7.929678440093994
-7.935542022791058,7.929744243621826
-7.931814161156377,7.93289041519165
-7.935542022791058,7.927809715270996
-7.9430951409681345,7.940194606781006
-7.981017239849406,7.948800086975098
-7.924453006674053,7.909785747528076
-7.928117974144348,7.9233479499816895
-7.946921547407927,7.956912994384766
-7.931814161156377,7.900660514831543
-7.946921547407927,7.941011905670166
-7.9393021526221474,7.914632797241211
-7.978810702253626,7.962803363800049
-7.818151283467686,7.904325008392334
-7.923581356476356,7.940262317657471
-7.950781972366453,7.916411876678467
-7.928117974144348,7.943893909454346
-7.950781972366453,7.9655256271362305
-7.96257349994767,7.968170642852783
-7.924453006674053,7.93447732925415
-7.947966922669405,7.924696445465088
-7.954677021213342,7.955756664276123
-7.924453006674053,7.911405563354492
-7.8761493177145505,7.91730260848999
-7.948658283730227,7.925870418548584
-7.931814161156377,7.924999237060547
-7.928117974144348,7.907128810882568
-7.866461091629782,7.890623569488525
-7.9393021526221474,7.9230217933654785
-7.939066585182251,7.896994590759277
-7.9667047848223245,7.979284763336182
-7.954677021213342,7.925273418426514
-7.882728704344236,7.928363800048828
-7.9430951409681345,7.933495998382568
-7.950781972366453,7.9359517097473145
-7.935542022791058,7.917125225067139
-7.882728704344236,7.906277656555176
-7.909742071253639,7.936527729034424
-7.8761493177145505,7.911999702453613
-7.9393021526221474,7.927506923675537
-7.9393021526221474,7.929492950439453
-7.973156262517851,7.933655261993408
-7.920818811243059,7.926980018615723
-7.970532618892763,7.943300724029541
-7.954677021213342,7.9858078956604
-7.9393021526221474,7.9500555992126465
-7.9737577757544535,7.948292255401611
-7.9393021526221474,7.926995754241943
-7.950781972366453,7.930388927459717
-7.937418018328723,7.944674491882324
-7.91721462968355,7.9474005699157715
-7.91721462968355,7.958265781402588
-7.950781972366453,7.95048189163208
-7.931814161156377,7.945231914520264
-7.9430951409681345,7.9624342918396
-7.950781972366453,7.95929479598999
-7.924453006674053,7.9313645362854
-7.952121763853551,7.90724515914917
-7.946921547407927,7.952621936798096
-7.990339285400088,7.968480110168457
-7.913640203677234,7.908901214599609
-7.924453006674053,7.936142921447754
-7.950781972366453,7.929620265960693
-7.982966659490206,7.964693546295166
-7.897811916161621,7.93903112411499
-7.924453006674053,7.939436912536621
-7.9393021526221474,7.927170276641846
-7.950781972366453,7.953671455383301
-7.910094953104535,7.925069332122803
-7.931814161156377,7.919683933258057
-7.913640203677234,7.942040920257568
-7.931814161156377,7.925405502319336
-7.950781972366453,7.940893650054932
-7.982923651140671,7.935227870941162
-7.9430951409681345,7.930093288421631
-7.9393021526221474,7.937246799468994
-7.860153329415682,7.906897068023682
-7.8761493177145505,7.950113296508789
-7.950781972366453,7.943840503692627
-7.954677021213342,7.946510314941406
-7.913640203677234,7.916114330291748
-7.995678626217357,7.94559907913208
-7.96914180120827,7.941892623901367
-7.954677021213342,7.941114902496338
-7.995678626217357,7.963010787963867
-8.025154900427069,7.969614505767822
-7.920818811243059,7.9496989250183105
-7.924453006674053,7.933542728424072
-7.928117974144348,7.927032947540283
-7.920818811243059,7.944701671600342
-7.931814161156377,7.9332499504089355
-7.911244248885512,7.927105903625488
-7.946921547407927,7.949435710906982
-7.954677021213342,7.9635725021362305
-7.946921547407927,7.94514799118042
-7.924453006674053,7.923985958099365
-7.982923651140671,7.942731857299805
-7.950781972366453,7.924686431884766
-7.906578398789698,7.947040557861328
-7.950781972366453,7.952175140380859
-7.928117974144348,7.9455037117004395
-7.950781972366453,7.929161548614502
-7.966617665152964,7.9394659996032715
-7.935542022791058,7.936504364013672
-7.890891409042026,7.924437046051025
-7.928117974144348,7.9411115646362305
-7.931814161156377,7.893686771392822
-7.9393021526221474,7.947991371154785
-7.913640203677234,7.919882297515869
-7.9430951409681345,7.940314292907715
-7.9124836212853,7.916618824005127
-7.924453006674053,7.9059224128723145
-7.882728704344236,7.93485164642334
-7.906578398789698,7.917512893676758
-7.879425560900211,7.938207149505615
-7.950781972366453,7.9406867027282715
-7.950781972366453,7.952269077301025
-7.950781972366453,7.952826023101807
-7.982966659490206,7.925279140472412
-7.795890075313592,7.960225582122803
-7.954677021213342,7.935899257659912
-7.935542022791058,7.932581901550293
-7.950781972366453,7.921239852905273
-7.970532618892763,7.936336994171143
-7.924453006674053,7.925281524658203
-7.9430951409681345,7.898244857788086
-7.950781972366453,7.9456987380981445
-7.931814161156377,7.927464008331299
-7.928117974144348,7.927238464355469
-7.928117974144348,7.931934356689453
-7.90635866463183,7.895444869995117
-7.924453006674053,7.937606334686279
-7.943486147519973,7.925111293792725
-7.928117974144348,7.931926250457764
-7.931814161156377,7.917111873626709
-7.89962956062971,7.930637359619141
-7.9393021526221474,7.9294209480285645
-7.889549016187033,7.967450141906738
-7.9430951409681345,7.959034442901611
-7.954677021213342,7.951298236846924
-8.003317238098171,7.976832389831543
-7.946921547407927,7.942297458648682
-7.9393021526221474,7.924619197845459
-7.879425560900211,7.936715602874756
-7.91721462968355,7.924741268157959
-7.954677021213342,7.937985897064209
-7.9958644827013945,8.007805824279785
-7.924453006674053,7.944395065307617
-7.9393021526221474,7.927656650543213
-7.935542022791058,7.945067405700684
-7.950781972366453,7.973241329193115
-7.995678626217357,7.9274115562438965
-7.931814161156377,7.926441669464111
-7.96981377267859,7.950982570648193
-7.950781972366453,7.948816776275635
-7.946921547407927,7.944739818572998
-7.924453006674053,7.945571422576904
-7.9393021526221474,7.963316440582275
-7.954677021213342,7.953006267547607
-7.913640203677234,7.918369770050049
-7.924453006674053,7.912892818450928
-7.928117974144348,7.948587894439697
-7.89962956062971,7.931609153747559
-7.89962956062971,7.915501117706299
-7.935542022791058,7.9394001960754395
-7.924453006674053,7.923111438751221
-7.924453006674053,7.912732124328613
-7.889410352488291,7.897355079650879
-7.946921547407927,7.955803394317627
-7.954677021213342,7.948431015014648
-7.845339292733202,7.940201282501221
-7.9393021526221474,7.937232494354248
-7.982923651140671,7.930485248565674
-7.9430951409681345,7.944272518157959
-7.91721462968355,7.930184841156006
-7.950781972366453,7.927382469177246
-7.982923651140671,7.9511942863464355
-7.954677021213342,7.931174278259277
-7.9393021526221474,7.9279303550720215
-7.924453006674053,7.926949977874756
-7.830984932712759,7.921253681182861
-7.9393021526221474,7.943378448486328
-7.958607309235428,7.964485168457031
-7.924453006674053,7.915004253387451
-7.931814161156377,7.934227466583252
-7.950781972366453,7.933238506317139
-7.924453006674053,7.926890850067139
-7.829768510087842,7.90376615524292
-7.924603424800292,7.935314655303955
-7.924453006674053,7.929478645324707
-7.920818811243059,7.919589996337891
-7.892790308673911,7.90540075302124
-7.950781972366453,7.936931133270264
-7.954677021213342,7.952979564666748
-7.903090094245322,7.907017707824707
-7.903090094245322,7.892341136932373
-7.910094953104535,7.956159591674805
-7.924453006674053,7.926884651184082
-7.954677021213342,7.947414875030518
-7.924453006674053,7.9425249099731445
-7.924453006674053,7.9472880363464355
-7.928117974144348,7.938972473144531
-7.952217161107078,7.931789875030518
-7.928117974144348,7.9445576667785645
-7.920818811243059,7.9259867668151855
-7.935542022791058,7.932595729827881
-7.863280055279963,7.946046352386475
-7.931814161156377,7.933299541473389
-7.928117974144348,7.948709011077881
-7.910094953104535,7.922332286834717
-7.935542022791058,7.94444465637207
-7.950781972366453,7.932882308959961
-7.908539684071192,7.9094390869140625
-7.954677021213342,7.942203998565674
-7.954677021213342,7.937922954559326
-7.946921547407927,7.951171398162842
-7.924453006674053,7.93994140625
-7.954677021213342,7.896820545196533
-7.946921547407927,7.9500203132629395
-7.9430951409681345,7.951765060424805
-7.954677021213342,7.924109935760498
-7.924453006674053,7.9333930015563965
-7.99909679285825,7.9755964279174805
-7.9393021526221474,7.946025848388672
-7.9393021526221474,7.932190418243408
-7.9430951409681345,7.949744701385498
-7.9393021526221474,7.924004077911377
-7.954677021213342,7.928196430206299
-7.928117974144348,7.930484771728516
-7.995678626217357,7.940545558929443
-7.946921547407927,7.930120944976807
-7.924453006674053,7.940901279449463
-7.946921547407927,7.951513767242432
-7.950781972366453,7.947057247161865
-7.982966659490206,7.95412015914917
-7.924453006674053,7.921145439147949
-7.935542022791058,7.9348554611206055
-7.9430951409681345,7.950316905975342
-7.946921547407927,7.9213762283325195
-7.943486147519973,7.938002586364746
-7.9430951409681345,7.940558433532715
-7.882728704344236,7.917361259460449
-7.931814161156377,7.919862747192383
-7.924453006674053,7.949182987213135
-7.946921547407927,7.972519874572754
-7.89962956062971,7.918806076049805
-7.928117974144348,7.922202110290527
-7.94677806718906,7.896864891052246
-7.946921547407927,7.945567607879639
-7.9430951409681345,7.916527271270752
-7.903090094245322,7.947842597961426
-7.920818811243059,7.9345197677612305
-7.924453006674053,7.923960208892822
-7.9430951409681345,7.947173595428467
-7.946921547407927,7.928091526031494
-7.954677021213342,7.98915433883667
-7.946921547407927,7.921229839324951
-7.934783378553508,7.910262584686279
-7.96257349994767,7.946959018707275
-7.982923651140671,7.9590229988098145
-7.950781972366453,7.95056676864624
-7.9393021526221474,7.931891441345215
-7.91721462968355,7.911112308502197
-7.970532618892763,7.961721420288086
-7.935542022791058,7.9536261558532715
-7.9049427254465785,7.924597263336182
-7.903090094245322,7.912843227386475
-7.9913998274291025,7.973291397094727
-7.922491400135772,7.918847560882568
-7.879705324991467,7.918161869049072
-7.924453006674053,7.920407295227051
-7.928117974144348,7.906527042388916
-7.89962956062971,7.923503398895264
-7.9430951409681345,7.924741744995117
-7.954677021213342,7.976903438568115
-7.935542022791058,7.930827617645264
-7.954677021213342,7.930624961853027
-7.931814161156377,7.9412384033203125
-7.950781972366453,7.946984767913818
-7.946921547407927,7.9423909187316895
-7.879425560900211,7.923695087432861
-7.884103137583294,7.922694206237793
-7.913640203677234,7.93784236907959
-7.946921547407927,7.943823337554932
-7.9430951409681345,7.971256732940674
-7.91721462968355,7.939798355102539
-7.931814161156377,7.939489841461182
-7.946921547407927,7.9435343742370605
-7.928117974144348,7.914887428283691
-7.920818811243059,7.954711437225342
-7.80966502563657,7.894464015960693
-7.954677021213342,7.928091049194336
-7.950781972366453,7.94326639175415
-7.9393021526221474,7.926997661590576
-7.923581356476356,7.919610023498535
-7.906578398789698,7.943866729736328
-7.970616219270671,7.954345226287842
-7.9393021526221474,7.9319634437561035
-7.924453006674053,7.950400352478027
-7.950781972366453,7.956555366516113
-7.9393021526221474,7.93974494934082
-7.856986114171083,7.90343713760376
-7.928117974144348,7.8959455490112305
-7.954677021213342,7.943055629730225
-7.9393021526221474,7.958176136016846
-7.950781972366453,7.9621901512146
-7.918702847281798,7.948540687561035
-7.928117974144348,7.94610071182251
-7.950781972366453,7.95320463180542
-7.931814161156377,7.936129570007324
-7.924453006674053,7.909389019012451
-7.889410352488291,7.915083408355713
-7.924453006674053,7.9350199699401855
-7.928117974144348,7.950180530548096
-7.920818811243059,7.935834884643555
-7.920818811243059,7.925439357757568
-7.8731406206414505,7.962577819824219
-7.946921547407927,7.91286039352417
-7.950781972366453,7.959478855133057
-7.935542022791058,7.934937000274658
-7.931814161156377,7.934149265289307
-7.9393021526221474,7.9563374519348145
-7.954677021213342,7.927958965301514
-7.924453006674053,7.932606220245361
-7.920818811243059,7.949219226837158
-7.928117974144348,7.950945854187012
-7.939379961634402,7.919118881225586
-7.954677021213342,7.948421001434326
-7.9393021526221474,7.937488555908203
-7.89962956062971,7.9205474853515625
-7.954677021213342,7.942458629608154
-7.860119116630385,7.941128730773926
-7.946921547407927,7.924078464508057
-7.995678626217357,7.950284481048584
-7.950781972366453,7.939384460449219
-7.950781972366453,7.921661376953125
-7.9393021526221474,7.908212661743164
-7.954677021213342,7.9607672691345215
-7.9393021526221474,7.9207892417907715
-7.950781972366453,7.945000648498535
-7.9430951409681345,7.9546966552734375
-7.982923651140671,7.938110828399658
-7.935542022791058,7.8931779861450195
-7.928117974144348,7.955489635467529
-7.954677021213342,7.97349739074707
-7.954677021213342,7.938903331756592
-7.928117974144348,7.906766414642334
-7.928117974144348,7.953593730926514
-7.928117974144348,7.943150997161865
-7.928117974144348,7.941636562347412
-7.9430951409681345,7.953585624694824
-7.950781972366453,7.947174549102783
-7.931814161156377,7.956204891204834
-7.935542022791058,7.920168399810791
-7.950781972366453,7.9495463371276855
-7.924453006674053,7.9278564453125
-7.906578398789698,7.917900562286377
-7.950781972366453,7.958377361297607
-7.966576241738391,7.961826801300049
-7.9430951409681345,7.937912464141846
-7.950781972366453,7.918466567993164
-7.903090094245322,7.9262471199035645
-7.935542022791058,7.919613361358643
-7.906578398789698,7.919742107391357
-7.924453006674053,7.9190778732299805
-7.946921547407927,7.937790870666504
-7.906578398789698,7.905628681182861
-7.844664854175832,7.915611743927002
-7.934136499461806,7.955264568328857
-7.950781972366453,7.955810070037842
-7.966617665152964,7.933714389801025
-7.946921547407927,7.965723991394043
-7.896196359268842,7.916837215423584
-7.9393021526221474,7.92498779296875
-7.9430951409681345,7.924575328826904
-7.995678626217357,7.976517200469971
-7.954677021213342,7.931216716766357
-7.935542022791058,7.891242504119873
-7.960432339694732,7.929713726043701
-7.924453006674053,7.910079479217529
-7.950781972366453,7.920235633850098
-7.9393021526221474,7.948370456695557
-7.89962956062971,7.90600061416626
-7.920818811243059,7.910166263580322
-7.924453006674053,7.9307541847229
-7.950781972366453,7.909413814544678
-7.950781972366453,7.937854290008545
-7.9393021526221474,7.961349010467529
-7.950781972366453,7.9576029777526855
-7.931814161156377,7.945727825164795
-7.924453006674053,7.9301629066467285
-7.954677021213342,7.952420234680176
-7.995678626217357,7.884180068969727
-7.856986114171083,7.954073429107666
-7.9737577757544535,8.0100736618042
-7.847706165863548,7.945521831512451
-7.924453006674053,7.948760986328125
-7.954677021213342,7.955586910247803
-7.91721462968355,7.968848705291748
-7.910094953104535,7.939636707305908
-7.920818811243059,7.937047481536865
-7.924453006674053,7.919987201690674
-7.954677021213342,7.9580912590026855
-7.866459873882536,7.916529178619385
-7.950781972366453,7.943887233734131
-7.903090094245322,7.931381702423096
-7.946921547407927,7.9246134757995605
-7.950781972366453,7.941355228424072
-7.950781972366453,7.944015979766846
-7.982966659490206,7.969421863555908
-7.928117974144348,7.9463629722595215
-7.920818811243059,7.929678440093994
-7.913640203677234,7.935959339141846
-7.954677021213342,7.959714412689209
-7.946921547407927,7.938213348388672
-7.886056354845152,7.945950031280518
-7.931814161156377,7.941220760345459
-7.928117974144348,7.9371819496154785
-7.950781972366453,7.959105014801025
-7.950781972366453,7.935977935791016
-7.946921547407927,7.956047534942627
-7.99472180818664,7.954155445098877
-7.9393021526221474,7.946434020996094
-7.982923651140671,7.9621195793151855
-7.950781972366453,7.9413628578186035
-7.903161564307976,7.954186916351318
-7.9430951409681345,7.929691314697266
-7.935542022791058,7.948334693908691
-7.910094953104535,7.940834045410156
-7.9430951409681345,7.952070713043213
-7.920818811243059,7.9310994148254395
-7.946921547407927,7.948899745941162
-7.954677021213342,7.9279303550720215
-7.950781972366453,7.938291072845459
-7.9393021526221474,7.926270961761475
-7.931814161156377,7.901287078857422
-7.924453006674053,7.926938533782959
-7.928117974144348,7.924208641052246
-7.9430951409681345,7.936459541320801
-7.928117974144348,7.932405471801758
-7.924453006674053,7.925286293029785
-7.868644485039619,7.894777774810791
-7.9430951409681345,7.941237926483154
-7.966617665152964,7.950176239013672
-7.863214135364057,7.913238048553467
-7.906578398789698,7.915780544281006
-7.954677021213342,7.94917631149292
-7.931814161156377,7.923155784606934
-7.995678626217357,7.9759345054626465
-7.950781972366453,7.937835216522217
-7.9430951409681345,7.972619533538818
-7.920818811243059,7.918392658233643
-7.89962956062971,7.93814754486084
-7.931814161156377,7.912838459014893
-7.924453006674053,7.946681976318359
-7.946921547407927,7.931312084197998
-7.9430951409681345,7.940672397613525
-7.889410352488291,7.936922550201416
-7.924453006674053,7.9175872802734375
-7.950781972366453,7.93134069442749
-7.892790308673911,7.910109996795654
-7.91721462968355,7.934260368347168
-7.931814161156377,7.935730934143066
-7.902308675253255,7.947015762329102
-7.9393021526221474,7.939792633056641
-7.950781972366453,7.922937870025635
-7.931814161156377,7.9523701667785645
-7.954333871520422,7.925645351409912
-7.913640203677234,7.917858600616455
-7.931814161156377,7.939090251922607
-7.89962956062971,7.935474395751953
-7.950781972366453,7.940115451812744
-7.8955201011087315,7.93820858001709
-7.9430951409681345,7.933072090148926
-7.954677021213342,7.916591167449951
-7.946921547407927,7.9338555335998535
-7.950781972366453,7.952554225921631
-7.946921547407927,7.947018146514893
-7.93765506239242,7.934084415435791
-7.928117974144348,7.94057035446167
-7.950781972366453,7.94735860824585
-7.9430951409681345,7.913761138916016
-7.879425560900211,7.9136433601379395
-7.913640203677234,7.926809787750244
-7.954677021213342,7.933290958404541
-7.924453006674053,7.927728652954102
-7.995678626217357,7.981446266174316
-7.973156262517851,7.939357757568359
-7.950781972366453,7.943519115447998
-7.93978520718815,7.914513111114502
-7.982966659490206,7.940029621124268
-7.91721462968355,7.977160930633545
-7.928117974144348,7.937193870544434
-7.921976216623693,7.936046123504639
-7.910094953104535,7.92517614364624
-7.9430951409681345,7.925898551940918
-7.924453006674053,7.92024040222168
-7.94094624659741,7.93996524810791
-7.913640203677234,7.9262495040893555
-7.954677021213342,7.938849449157715
-7.920818811243059,7.939582347869873
-7.9393021526221474,7.936208248138428
-7.920818811243059,7.9402337074279785
-7.920818811243059,7.933206081390381
-7.9545916417163145,7.959267616271973
-7.950781972366453,7.934824466705322
-7.924453006674053,7.9330668449401855
-7.982966659490206,7.988760948181152
-7.96257349994767,7.971570014953613
-7.8761493177145505,7.894351959228516
-7.946921547407927,7.946402072906494
-7.8761493177145505,7.927188396453857
-7.924453006674053,7.983489990234375
-7.931814161156377,7.931150913238525
-7.920818811243059,7.9134521484375
-7.8657311089458215,7.915955066680908
-7.879166050413646,7.902745246887207
-7.935542022791058,7.939718723297119
-7.920818811243059,7.954559326171875
-7.928117974144348,7.903659820556641
-7.924453006674053,7.940751552581787
-7.954677021213342,7.9515790939331055
-7.860119116630385,7.93824577331543
-7.910094953104535,7.949089050292969
-7.906542242015022,7.956809997558594
-7.931814161156377,7.9313530921936035
-7.924453006674053,7.948838710784912
-7.9430951409681345,7.932809352874756
-8.013136044317282,7.976515293121338
-7.950781972366453,7.962278842926025
-7.9430951409681345,7.911428928375244
-7.950781972366453,7.914157390594482
-7.950781972366453,7.940689563751221
-7.903090094245322,7.934622764587402
-7.8657311089458215,7.923696041107178
-7.9393021526221474,7.931203365325928
-7.954677021213342,7.9516520500183105
-7.950781972366453,7.932444095611572
-7.954677021213342,7.947497844696045
-7.906578398789698,7.924310684204102
-7.93468629292431,7.963128566741943
-7.935542022791058,7.955342769622803
-7.924453006674053,7.9444355964660645
-7.924453006674053,7.952686309814453
-7.954677021213342,7.9223809242248535
-7.950781972366453,7.949277400970459
-7.860119116630385,7.924597263336182
-7.9393021526221474,7.913130283355713
-7.896196359268842,7.870838642120361
-7.946921547407927,7.932565212249756
-7.892824978756646,7.909904956817627
-7.931814161156377,7.944386959075928
-7.950781972366453,7.951219081878662
-7.935542022791058,7.946469783782959
-7.946921547407927,7.938570976257324
-7.946921547407927,7.928108215332031
-7.950781972366453,7.932760715484619
-7.9430951409681345,7.944815635681152
-7.928117974144348,7.927735328674316
-7.928117974144348,7.90948486328125
-7.924453006674053,7.922884464263916
-7.924453006674053,7.939094066619873
-7.913640203677234,7.9376044273376465
-7.924453006674053,7.968654155731201
-7.920818811243059,7.952358722686768
-7.946921547407927,7.923605442047119
-7.871381458691152,7.919456481933594
-7.931814161156377,7.952643871307373
-7.954677021213342,7.945615291595459
-7.946921547407927,7.935589790344238
-7.9430951409681345,7.9433417320251465
-7.950781972366453,7.924437046051025
-7.946921547407927,7.915935039520264
-7.946921547407927,7.952165126800537
-7.910094953104535,7.940933704376221
-7.935542022791058,7.93243932723999
-7.869665979871627,7.908471584320068
-7.935542022791058,7.951342582702637
-7.882728704344236,7.892491340637207
-7.9393021526221474,7.921071529388428
-7.847706165863548,7.92374849319458
-7.954677021213342,7.9295430183410645
-7.9393021526221474,7.940352439880371
-7.924453006674053,7.888974666595459
-7.879527744657629,7.949264049530029
-7.910094953104535,7.942686557769775
-7.946921547407927,7.926201343536377
-7.9393021526221474,7.944583415985107
-7.9430951409681345,7.921653747558594
-7.935542022791058,7.934854030609131
-8.040958607678906,7.967021942138672
-7.954677021213342,7.969576358795166
-7.950781972366453,7.950048923492432
-7.946921547407927,7.944958209991455
-7.946921547407927,7.911831855773926
-7.928117974144348,7.939411640167236
-7.954677021213342,7.9353346824646
-7.995678626217357,7.98550271987915
-7.928117974144348,7.931077003479004
-7.920818811243059,7.957470417022705
-7.903090094245322,7.952418804168701
-7.889410352488291,7.940611362457275
-7.910094953104535,7.919002056121826
-8.014634778962309,7.978227138519287
-7.954677021213342,7.951418399810791
-7.931814161156377,7.9270429611206055
-7.950781972366453,7.960310459136963
-7.954677021213342,7.931673526763916
-7.931814161156377,7.904463291168213
-7.9430951409681345,7.944535255432129
-7.91721462968355,7.9109206199646
-7.935542022791058,7.944548606872559
-7.892790308673911,7.940734386444092
-7.8761493177145505,7.911080837249756
-7.950781972366453,7.954383850097656
-7.920818811243059,7.90767240524292
-7.954677021213342,7.944334506988525
-7.928117974144348,7.895655155181885
-7.954677021213342,7.932266712188721
-7.9430951409681345,7.934328556060791
-7.935542022791058,7.95587682723999
-7.869665979871627,7.925126075744629
-7.928117974144348,7.929378032684326
-7.9393021526221474,7.9237213134765625
-7.935542022791058,7.9390692710876465
-7.9393021526221474,7.933343887329102
-7.931814161156377,7.913417339324951
-7.920818811243059,7.905088901519775
-7.906204032331684,7.9059157371521
-7.928117974144348,7.916913986206055
-7.913640203677234,7.936496734619141
-7.950781972366453,7.934549331665039
-7.906578398789698,7.9406538009643555
-7.946921547407927,7.916899681091309
-7.995678626217357,7.93424654006958
-7.954677021213342,7.983845233917236
-7.909324126450216,7.938582897186279
-7.950781972366453,7.925295829772949
-7.931814161156377,7.895064830780029
-7.920818811243059,7.942174911499023
-7.896196359268842,7.942275524139404
-7.950781972366453,7.946690559387207
-7.946921547407927,7.942996501922607
-7.946921547407927,7.946467876434326
-7.935542022791058,7.922017574310303
-7.918702847281798,7.9265217781066895
-7.856986114171083,7.917171955108643
-7.954677021213342,7.951523780822754
-7.898232053207978,7.8900146484375
-7.91721462968355,7.926506519317627
-7.928117974144348,7.928797245025635
-7.931814161156377,7.921848773956299
-7.924453006674053,7.923923969268799
-7.954333871520422,7.894146919250488
-7.946921547407927,7.941012382507324
-7.9430951409681345,7.964561462402344
-7.928117974144348,7.926445484161377
-7.89962956062971,7.904719829559326
-7.946921547407927,7.926642894744873
-8.034343915929238,7.967808246612549
-7.935542022791058,7.916716575622559
-7.946921547407927,7.948274612426758
-7.9430951409681345,7.927188396453857
-7.924453006674053,7.908052921295166
-7.924453006674053,7.922631740570068
-7.91275330858467,7.900964260101318
-7.928117974144348,7.90169095993042
-7.9870475777718735,7.968267917633057
-7.946921547407927,7.946076393127441
-7.950781972366453,7.953728675842285
-7.920818811243059,7.969063758850098
-7.9430951409681345,7.943770885467529
-7.987162773987728,7.962508678436279
-7.954677021213342,7.9472126960754395
-7.950781972366453,7.967405796051025
-7.926117223102731,7.946987152099609
-7.896196359268842,7.901315689086914
-7.954677021213342,7.960813045501709
-7.954677021213342,7.9463911056518555
-7.924453006674053,7.944939613342285
-7.974340357299629,7.94802713394165
-7.931814161156377,7.914740562438965
-7.950781972366453,7.969977855682373
-7.950781972366453,7.935756206512451
-7.935542022791058,7.918899059295654
-7.924453006674053,7.922887325286865
-7.882728704344236,7.879059314727783
-7.913640203677234,7.925684452056885
-7.882728704344236,7.913987636566162
-7.8728955601551585,7.905313968658447
-7.879425560900211,7.91199254989624
-7.931814161156377,7.949294090270996
-7.928117974144348,7.9267778396606445
-7.931814161156377,7.910326957702637
-7.96257349994767,7.941204071044922
-7.954677021213342,7.917205333709717
-7.89962956062971,7.916554927825928
-7.931814161156377,7.94761323928833
-7.931814161156377,7.961704730987549
-7.954677021213342,7.981895446777344
-7.950781972366453,7.925163269042969
-7.9430951409681345,7.9044508934021
-7.928117974144348,7.930883884429932
-7.982966659490206,7.975995063781738
-7.9393021526221474,7.928764820098877
-7.954677021213342,7.943929195404053
-7.931814161156377,7.9117255210876465
-7.954677021213342,7.941490650177002
-7.954677021213342,7.959626197814941
-7.935542022791058,7.934411525726318
-7.974340357299629,7.948976993560791
-7.928117974144348,7.926704406738281
-7.902901855104389,7.9213995933532715
-7.954677021213342,7.931015491485596
-7.91721462968355,7.9493408203125
-7.946921547407927,7.920494079589844
-7.866459873882536,7.917013645172119
-7.954677021213342,7.970312595367432
-7.894231790888085,7.91923189163208
-7.950781972366453,7.9462690353393555
-7.956299563220691,7.92964506149292
-7.924453006674053,7.951781272888184
-7.920818811243059,7.931951522827148
-7.915279363841231,7.929800510406494
-7.954677021213342,7.93708610534668
-7.9430951409681345,7.940715312957764
-7.9430951409681345,7.94652795791626
-7.924453006674053,7.942165374755859
-7.866625579174465,7.90514612197876
-7.924453006674053,7.9448652267456055
-7.954677021213342,7.938648223876953
-7.910094953104535,7.899965763092041
-7.946921547407927,7.9542236328125
-7.995678626217357,7.9829511642456055
-7.954677021213342,7.916263580322266
-7.950781972366453,7.94206428527832
-7.928117974144348,7.886229515075684
-7.954677021213342,7.945281505584717
-7.950781972366453,7.957789421081543
-7.935581670484014,7.932111740112305
-7.954677021213342,7.96966028213501
-7.913640203677234,7.915031909942627
-7.928117974144348,7.9485931396484375
-7.928117974144348,7.930782794952393
-7.913640203677234,7.961552143096924
-7.931814161156377,7.9363017082214355
-7.9393021526221474,7.9596848487854
-7.9430951409681345,7.925807476043701
-7.9393021526221474,7.948484420776367
-7.950781972366453,7.9566969871521
-7.954677021213342,7.945175647735596
-7.950781972366453,7.949582576751709
-7.935542022791058,7.937429904937744
-7.9430951409681345,7.942585468292236
-7.950781972366453,7.931528568267822
-7.974694136660875,7.943646430969238
-7.89962956062971,7.932009696960449
-7.931814161156377,7.946889400482178
-7.9393021526221474,7.913227558135986
-7.838628495628443,7.908836364746094
-7.954677021213342,7.9392781257629395
-7.928117974144348,7.908132553100586
-7.9913998274291025,7.937135696411133
-7.91721462968355,7.940615177154541
-7.950781972366453,7.946487903594971
-7.968835045533489,7.9697489738464355
-7.924453006674053,7.935263156890869
-7.9393021526221474,7.9111433029174805
-7.928117974144348,7.9615559577941895
-7.928117974144348,7.94476842880249
-7.950781972366453,7.96006441116333
-7.896196359268842,7.943352699279785
-7.924453006674053,7.935427188873291
-7.886056354845152,7.915835857391357
-7.924453006674053,7.923027515411377
-7.946921547407927,7.943903923034668
-7.9430951409681345,7.940119743347168
-7.946921547407927,7.9519734382629395
-7.954677021213342,7.962189197540283
-7.924453006674053,7.917777061462402
-7.946921547407927,7.950199604034424
-7.935542022791058,7.93989896774292
-7.941194514917139,7.938347816467285
-7.9430951409681345,7.926555633544922
-7.928117974144348,7.9386515617370605
-7.924453006674053,7.9162421226501465
-7.931814161156377,7.928972244262695
-7.950781972366453,7.931149005889893
-7.924453006674053,7.9073004722595215
-7.931814161156377,7.946732997894287
-7.9430951409681345,7.936829090118408
-7.954677021213342,7.940086841583252
-7.889410352488291,7.92905855178833
-7.931814161156377,7.948183536529541
-7.916578772611358,7.964748859405518
-7.924453006674053,7.930788516998291
-7.903090094245322,7.916572093963623
-7.931814161156377,7.925889492034912
-7.954677021213342,7.953596591949463
-7.995678626217357,7.89185905456543
-7.946921547407927,7.946166038513184
-7.892790308673911,7.908450603485107
-7.93468629292431,7.907037734985352
-7.950781972366453,7.939269542694092
-7.928117974144348,7.920340061187744
-7.928117974144348,7.917931079864502
-7.950781972366453,7.921872138977051
-7.946921547407927,7.955939769744873
-7.892069753452455,7.928569316864014
-7.954677021213342,7.954474925994873
-7.950781972366453,7.959147930145264
-7.954677021213342,7.953676700592041
-7.913942323339224,7.9401044845581055
-7.9393021526221474,7.946287631988525
-7.9393021526221474,7.943458080291748
-7.920818811243059,7.9053874015808105
-7.9393021526221474,7.938182830810547
-7.995678626217357,7.949135780334473
-7.924453006674053,7.916476249694824
-7.950781972366453,7.919158935546875
-7.9430951409681345,7.934832572937012
-7.913640203677234,7.928366661071777
-7.995678626217357,7.991017818450928
-7.898488952953535,7.920013904571533
-7.910094953104535,7.948330402374268
-7.8728955601551585,7.943515300750732
-7.863280055279963,7.908329486846924
-7.924453006674053,7.903205871582031
-7.920818811243059,7.9487385749816895
-7.928155902956855,7.934229373931885
-7.920706937989397,7.927961826324463
-7.950781972366453,7.948088645935059
-7.91375018033154,7.937572956085205
-7.9430951409681345,7.898128986358643
-7.954677021213342,7.954847812652588
-7.935542022791058,7.929807186126709
-7.935542022791058,7.925948143005371
-7.931814161156377,7.917385578155518
-7.924453006674053,7.943972587585449
-7.928155902956855,7.924208641052246
-7.954677021213342,7.95398473739624
-7.931814161156377,7.949158191680908
-7.954677021213342,7.9579758644104
-7.931814161156377,7.923168659210205
-7.882728704344236,7.906328201293945
-7.931814161156377,7.933123588562012
-7.8761493177145505,7.939647197723389
-7.924453006674053,7.943463325500488
-7.869665979871627,7.919358253479004
-7.954677021213342,7.950739860534668
-7.91721462968355,7.931832790374756
-7.910094953104535,7.938536643981934
-7.924453006674053,7.933591365814209
-7.838628495628443,7.924490928649902
-7.931080216138895,7.92969274520874
-7.924453006674053,7.910597801208496
-7.954677021213342,7.966851234436035
-7.903090094245322,7.908712387084961
-7.924453006674053,7.931511402130127
-7.9430951409681345,7.941030979156494
-7.954677021213342,7.973825931549072
-7.950781972366453,7.947239398956299
-7.924453006674053,7.95189905166626
-7.924453006674053,7.926807403564453
-7.950781972366453,7.942549228668213
-7.9393021526221474,7.94980525970459
-7.9430951409681345,7.9274582862854
-7.9393021526221474,7.95333194732666
-7.954677021213342,7.939946174621582
-7.9393021526221474,7.93101167678833
-7.928117974144348,7.927630424499512
-7.954677021213342,7.9354567527771
-7.839635581656639,7.895673751831055
-7.9393021526221474,7.93346643447876
-7.950781972366453,7.9367146492004395
-7.954677021213342,7.930527210235596
-7.954677021213342,7.94629430770874
-7.960432339694732,7.933267593383789
-7.982923651140671,7.9222893714904785
-7.950781972366453,7.94521951675415
-7.9226320855575,7.9081292152404785
-7.920818811243059,7.917446613311768
-7.946921547407927,7.931440830230713
-7.910094953104535,7.947354793548584
-7.950781972366453,7.945872783660889
-7.987162773987728,7.914895057678223
-7.950781972366453,7.959598064422607
-7.928117974144348,7.935563564300537
-7.946921547407927,7.921801567077637
-7.9393021526221474,7.921432018280029
-7.91721462968355,7.911871910095215
-7.886056354845152,7.896190643310547
-7.924453006674053,7.929625988006592
-7.9393021526221474,7.946341514587402
-8.958607314841775,8.032694816589355
-7.902388164590721,7.92072057723999
-7.9393021526221474,7.922971248626709
-7.931814161156377,7.917370319366455
-7.9393021526221474,7.974096775054932
-7.946921547407927,7.945136547088623
-7.931814161156377,7.945939540863037
-7.950781972366453,7.930480003356934
-7.910094953104535,7.938126564025879
-7.950781972366453,7.959746837615967
-7.931814161156377,7.9915289878845215
-7.9393021526221474,7.957155704498291
-7.9430951409681345,7.9219231605529785
-7.903090094245322,7.949348449707031
-7.896196359268842,7.9332098960876465
-7.931814161156377,7.922875881195068
-7.882584025336923,7.941031455993652
-7.910094953104535,7.927186965942383
-7.920818811243059,7.925970077514648
-7.954677021213342,7.9239325523376465
-7.970532618892763,7.956968784332275
-7.954677021213342,7.924254894256592
-7.9393021526221474,7.932963848114014
-7.924453006674053,7.933765888214111
-7.9430951409681345,7.900373935699463
-7.863280055279963,7.933658123016357
-7.924453006674053,7.918412208557129
-7.910094953104535,7.932113170623779
-7.946921547407927,7.916975021362305
-7.924453006674053,7.889544486999512
-7.935542022791058,7.921841621398926
-7.9393021526221474,7.936367988586426
-7.950781972366453,7.945497035980225
-7.954677021213342,7.936958312988281
-7.9393021526221474,7.921663284301758
-7.931814161156377,7.942642688751221
-7.889410352488291,7.917291164398193
-7.928117974144348,7.953750133514404
-7.931814161156377,7.923355579376221
-7.924453006674053,7.93182897567749
-7.924453006674053,7.906545162200928
-7.931814161156377,7.9339518547058105
-7.8761493177145505,7.912188529968262
-7.950781972366453,7.95490837097168
-7.936235711226021,7.919938087463379
-7.89962956062971,7.928867340087891
-7.924453006674053,7.923783779144287
-7.924453006674053,7.926004886627197
-7.920818811243059,7.910228729248047
-7.863280055279963,7.914609432220459
-7.946921547407927,7.931250095367432
-7.9430951409681345,7.960562229156494
-7.906578398789698,7.923599720001221
-7.9430951409681345,7.937968730926514
-7.910313148974003,7.923436641693115
-7.950781972366453,7.936697483062744
-7.924453006674053,7.917539119720459
-7.8728955601551585,7.904881954193115
-7.9737577757544535,7.952673435211182
-7.966617665152964,7.935719966888428
-7.950781972366453,7.963538646697998
-7.924453006674053,7.914524555206299
-7.954677021213342,7.942163467407227
-7.946921547407927,7.925330638885498
-7.928117974144348,7.939716815948486
-7.950781972366453,7.925139904022217
-7.9737577757544535,7.949035167694092
-7.935542022791058,7.936974048614502
-7.950781972366453,7.9564995765686035
-7.924453006674053,7.936065196990967
-7.950781972366453,7.933060169219971
-7.931814161156377,7.9070563316345215
-7.9393021526221474,7.946022033691406
-7.9393021526221474,7.931795597076416
-7.950781972366453,7.950185775756836
-7.935542022791058,7.931036472320557
-7.966617665152964,7.948013782501221
-7.8416326138557455,7.880396366119385
-7.928117974144348,7.943777561187744
-7.844000917077081,7.956572532653809
-7.924453006674053,7.924759864807129
-7.931814161156377,7.9210991859436035
-7.950781972366453,7.9236345291137695
-7.954677021213342,7.942799091339111
-7.920818811243059,7.926400661468506
-7.931814161156377,7.933794021606445
-7.946921547407927,7.9258646965026855
-7.9810573183290385,7.928372859954834
-7.954677021213342,7.923403739929199
-7.9393021526221474,7.937179088592529
-7.954677021213342,7.950547695159912
-7.935542022791058,7.936756610870361
-7.9393021526221474,7.923129558563232
-7.841636187410258,7.933728218078613
-7.920818811243059,7.9214186668396
-7.946921547407927,7.936802864074707
-7.931814161156377,7.924089431762695
-7.94551824914185,7.921586513519287
-7.924453006674053,7.9459733963012695
-7.924453006674053,7.923001766204834
-7.954677021213342,7.969366073608398
-7.903090094245322,7.942657470703125
-7.9430951409681345,7.906590938568115
-7.9430951409681345,7.956980228424072
-7.892790308673911,7.9153923988342285
-7.946921547407927,7.930676460266113
-7.9393021526221474,7.9543914794921875
-7.924453006674053,7.9399518966674805
-7.950781972366453,7.957093715667725
-7.946921547407927,7.935673236846924
-7.946921547407927,7.9320549964904785
-7.950781972366453,7.956052303314209
-7.954677021213342,7.94265604019165
-7.9430951409681345,7.928117275238037
-7.869665979871627,7.91239595413208
-7.935542022791058,7.9323554039001465
-7.920818811243059,7.928381443023682
-7.863280055279963,7.9221930503845215
-7.931814161156377,7.928280830383301
-7.946921547407927,7.916390895843506
-7.950781972366453,7.945525169372559
-7.974694136660875,7.950406551361084
-7.950781972366453,7.940820217132568
-7.954677021213342,7.9576096534729
-7.924453006674053,7.948217391967773
-7.910094953104535,7.9319329261779785
-7.924453006674053,7.964104652404785
-7.924453006674053,7.9537458419799805
-7.920818811243059,7.921570301055908
-7.924303420810379,7.899692058563232
-7.950781972366453,7.962404727935791
-7.928117974144348,7.964377403259277
-7.896196359268842,7.907128810882568
-7.935542022791058,7.927008152008057
-7.954677021213342,7.967268466949463
-7.849224838522453,7.889938831329346
-7.931814161156377,7.959242343902588
-7.9430951409681345,7.9454827308654785
-7.806866690314549,7.951420307159424
-7.920818811243059,7.959257125854492
-7.950781972366453,7.9361162185668945
-7.889410352488291,7.910099506378174
-7.935542022791058,7.918147087097168
-7.950781972366453,7.949769496917725
-7.950781972366453,7.948379039764404
-7.946921547407927,7.913741588592529
-7.950781972366453,7.936094760894775
-7.924453006674053,7.934099197387695
-7.950781972366453,7.931222438812256
-7.928117974144348,7.928830623626709
-7.932370292702363,7.917427062988281
-7.950781972366453,7.940392017364502
-7.920818811243059,7.942811012268066
-7.869665979871627,7.925189971923828
-7.970532618892763,7.962475299835205
-7.924453006674053,7.949845790863037
-7.946921547407927,7.950335502624512
-7.950781972366453,7.9508957862854
-7.950781972366453,7.922689914703369
-7.995678626217357,7.9552321434021
-7.928117974144348,7.91572904586792
-7.954677021213342,7.938612937927246
-7.924453006674053,7.928884983062744
-7.974694136660875,7.986717700958252
-7.9737577757544535,7.984008312225342
-7.935542022791058,7.942809581756592
-7.856986114171083,7.933696269989014
-7.982966659490206,7.950819492340088
-7.954677021213342,7.942380428314209
-7.931814161156377,7.896811485290527
-7.935542022791058,7.906905651092529
-7.910094953104535,7.9268903732299805
-7.950781972366453,7.927299499511719
-7.954677021213342,7.9480695724487305
-7.945802750156343,7.913257122039795
-7.954677021213342,7.933084011077881
-7.903090094245322,7.917407035827637
-7.946921547407927,7.947727680206299
-7.954677021213342,7.938343524932861
-7.935542022791058,7.9520416259765625
-7.89962956062971,7.915750503540039
-7.954677021213342,7.928120136260986
-7.931814161156377,7.924404144287109
-7.8761493177145505,7.8938140869140625
-7.93468629292431,7.959476470947266
-7.931814161156377,7.93044900894165
-7.946921547407927,7.927556991577148
-7.924453006674053,7.92712926864624
-7.974694136660875,7.947394847869873
-7.954677021213342,7.969007968902588
-7.950781972366453,7.949934959411621
-7.924453006674053,7.942245006561279
-7.93468629292431,7.9414591789245605
-7.954677021213342,7.964529991149902
-7.95090181210265,7.96929407119751
-7.906035306239573,7.924166679382324
-7.91721462968355,7.894378185272217
-7.9430951409681345,7.942101955413818
-7.896196359268842,7.942993640899658
-7.903090094245322,7.939117908477783
-7.924453006674053,7.916832447052002
-7.924453006674053,7.931362152099609
-7.928117974144348,7.919532775878906
-7.950781972366453,7.9518585205078125
-7.910094953104535,7.920665264129639
-7.935542022791058,7.91926908493042
-7.920818811243059,7.9397125244140625
-7.954677021213342,7.943812370300293
-7.924453006674053,7.937067985534668
-7.954677021213342,7.958328723907471
-7.906578398789698,7.93892240524292
-7.954677021213342,7.930573463439941
-8.008819571765459,7.9748921394348145
-7.886056354845152,7.917201519012451
-7.9393021526221474,7.915989875793457
-7.966617665152964,7.919806003570557
-7.954677021213342,7.971072673797607
-7.8728955601551585,7.917753219604492
-7.954677021213342,7.963025093078613
-7.9393021526221474,7.929588794708252
-7.950781972366453,7.954308032989502
-7.954677021213342,7.915740013122559
-7.950781972366453,7.974637508392334
-7.954677021213342,7.9352498054504395
-7.924453006674053,7.950315475463867
-7.950781972366453,7.947746753692627
-7.903090094245322,7.932384967803955
-7.954677021213342,7.931282043457031
-7.892790308673911,7.935177803039551
-7.920818811243059,7.938104152679443
-7.896196359268842,7.928558826446533
-7.954677021213342,7.941771984100342
-7.948117324273147,7.942872524261475
-7.935542022791058,7.952888011932373
-7.954677021213342,7.995431900024414
-7.970532618892763,7.958775520324707
-7.932370292702363,7.91800594329834
-7.935542022791058,7.936545372009277
-7.9393021526221474,7.917349338531494
-7.946921547407927,7.929511547088623
-7.931814161156377,7.929185390472412
-7.950781972366453,7.950908660888672
-7.867052707791308,7.942471981048584
-7.946921547407927,7.901042938232422
-7.935542022791058,7.958188056945801
-7.974694136660875,7.945118427276611
-7.954677021213342,7.976629734039307
-7.8315534278490535,7.940131664276123
-7.9430951409681345,7.9118332862854
-7.913640203677234,7.919662952423096
-7.928117974144348,7.903877258300781
-7.928117974144348,7.943740367889404
-7.931814161156377,7.908623218536377
-7.946921547407927,7.9344587326049805
-7.935542022791058,7.93930196762085
-7.9393021526221474,7.947104454040527
-7.9430951409681345,7.911721229553223
-7.950781972366453,7.924338340759277
-7.946921547407927,7.958240032196045
-7.924453006674053,7.937607288360596
-7.903090094245322,7.919518947601318
-7.9430951409681345,7.965938568115234
-7.931814161156377,7.902425289154053
-7.946921547407927,7.940077304840088
-7.910094953104535,7.95179557800293
-7.886056354845152,7.944102764129639
-7.924453006674053,7.901463508605957
-7.931814161156377,7.928422451019287
-7.954677021213342,7.958920478820801
-7.896196359268842,7.911365032196045
-7.928117974144348,7.925043106079102
-7.913640203677234,7.929587364196777
-7.935542022791058,7.902044773101807
-7.91721462968355,7.9390459060668945
-7.935542022791058,7.938708782196045
-7.950781972366453,7.950547695159912
-7.9393021526221474,7.918125152587891
-7.9393021526221474,7.93108606338501
-7.928117974144348,7.925361156463623
-7.951924235060929,7.877242088317871
-7.928117974144348,7.9608893394470215
-7.928117974144348,7.940755367279053
-7.924453006674053,7.921981334686279
-7.954677021213342,7.943397521972656
-7.869665979871627,7.921361446380615
-7.935542022791058,7.929914474487305
-7.93765506239242,7.901519298553467
-7.931814161156377,7.9276123046875
-7.928117974144348,7.950911998748779
-7.924453006674053,7.901854038238525
-7.866459873882536,7.940164566040039
-7.950781972366453,7.947259426116943
-7.910094953104535,7.9372334480285645
-7.96257349994767,7.947327136993408
-7.91721462968355,7.955006122589111
-7.879425560900211,7.937425136566162
-7.954677021213342,7.937363147735596
-7.9393021526221474,7.931825160980225
-7.931814161156377,7.929099082946777
-7.913640203677234,7.928497791290283
-7.954677021213342,7.92970609664917
-7.931814161156377,7.9311747550964355
-7.950781972366453,7.932902812957764
-7.924453006674053,7.9315714836120605
-7.89962956062971,7.9177727699279785
-7.946921547407927,7.911451816558838
-7.9430951409681345,7.939815521240234
-7.954677021213342,7.965292453765869
-7.935542022791058,7.934419631958008
-7.954677021213342,7.896971225738525
-7.931814161156377,7.937663555145264
-7.928117974144348,7.920722484588623
-7.89962956062971,7.887942314147949
-7.924453006674053,7.953816890716553
-7.931814161156377,7.9150848388671875
-7.946921547407927,7.931441307067871
-7.924453006674053,7.9281792640686035
-7.9393021526221474,7.942097187042236
-7.950781972366453,7.941224098205566
-7.9393021526221474,7.954955577850342
-7.931814161156377,7.930117607116699
-7.942381102016373,7.915833473205566
-7.950781972366453,7.919722557067871
-7.954677021213342,7.990201950073242
-7.835637836224461,7.917452335357666
-7.889410352488291,7.914948463439941
-7.9430951409681345,7.93781042098999
-7.933009805512286,7.913654327392578
-7.872861820710693,7.920287132263184
-7.903090094245322,7.950260162353516
-7.950781972366453,7.910913944244385
-7.913640203677234,7.910284519195557
-7.920818811243059,7.915693759918213
-7.9393021526221474,7.92888069152832
-7.894231790888085,7.898252964019775
-7.844664854175832,7.891377925872803
-7.939379961634402,7.952585697174072
-7.954677021213342,7.97549295425415
-7.954677021213342,7.923425674438477
-7.928117974144348,7.929994583129883
-7.8657311089458215,7.953593730926514
-7.950781972366453,7.938480377197266
-7.954677021213342,7.9498114585876465
-7.954677021213342,7.940463542938232
-7.954677021213342,7.927677631378174
-7.96257349994767,7.955150127410889
-7.913640203677234,7.942977428436279
-7.901574427881827,7.896132946014404
-7.889410352488291,7.887839317321777
-7.954677021213342,7.954599380493164
-7.950781972366453,7.902419090270996
-7.9393021526221474,7.940123081207275
-7.995678626217357,7.960507869720459
-7.954677021213342,7.9365715980529785
-7.950781972366453,7.94978666305542
-7.946921547407927,7.926671504974365
-7.931814161156377,7.897824764251709
-7.924453006674053,7.936420440673828
-7.9393021526221474,7.945810317993164
-7.950781972366453,7.950685024261475
-7.9516452688683605,7.945724964141846
-7.924453006674053,7.934473037719727
-7.957786139863943,7.964258193969727
-7.950781972366453,7.915136337280273
-7.950781972366453,7.945302963256836
-7.9430951409681345,7.946988105773926
-7.9393021526221474,7.959166049957275
-7.920818811243059,7.9359822273254395
-7.924453006674053,7.921414852142334
-7.924453006674053,7.947280406951904
-7.950781972366453,7.9580559730529785
-7.91721462968355,7.9343695640563965
-7.950781972366453,7.933876991271973
-7.950781972366453,7.931605339050293
-7.970532618892763,7.932803630828857
-7.929962177708765,7.9489054679870605
-7.928117974144348,7.927924156188965
-7.954677021213342,7.973845481872559
-7.9393021526221474,7.949807643890381
-7.950781972366453,7.930825710296631
-7.928117974144348,7.935907363891602
-7.957786139863943,7.9681267738342285
-7.853872762493711,7.896775245666504
-7.946921547407927,7.930494785308838
-7.853872762493711,7.916441440582275
-7.9393021526221474,7.9093708992004395
-7.9913998274291025,7.960521697998047
-7.882728704344236,7.910373210906982
-7.928117974144348,7.931128978729248
-7.950781972366453,7.947142124176025
-7.946921547407927,7.900868892669678
-7.993715522619759,7.976807594299316
-7.954677021213342,7.928603649139404
-7.950781972366453,7.930297374725342
-7.954677021213342,7.967105388641357
-7.913640203677234,7.94699764251709
-7.91721462968355,7.953705310821533
-7.982184017551764,7.960540294647217
-7.920818811243059,7.940983295440674
-7.954677021213342,7.943721294403076
-7.8416326138557455,7.90875244140625
-7.928117974144348,7.939905643463135
-7.9393021526221474,7.907569408416748
-7.982923651140671,7.9600749015808105
-7.920818811243059,7.952601432800293
-7.946921547407927,7.9386515617370605
-7.935542022791058,7.948798656463623
-7.950781972366453,7.91892671585083
-7.950781972366453,7.945836067199707
-7.954677021213342,7.949210166931152
-7.910094953104535,7.94176721572876
-7.928117974144348,7.907373428344727
-7.935542022791058,7.924446105957031
-7.935542022791058,7.905433654785156
-7.903090094245322,7.907573223114014
-8.008819571765459,7.996094226837158
-7.9430951409681345,7.940845012664795
-7.928117974144348,7.912813663482666
-7.950781972366453,7.957356929779053
-7.9393021526221474,7.944812297821045
-7.9430951409681345,7.898917198181152
-7.931814161156377,7.93632698059082
-7.950781972366453,7.928407192230225
-7.924453006674053,7.9173760414123535
-7.847639088350085,7.915257930755615
-7.950781972366453,7.942090034484863
-7.9430951409681345,7.929471492767334
-7.9913998274291025,7.927565574645996
-7.950781972366453,7.973247051239014
-7.950781972366453,7.913829326629639
-7.869665979871627,7.958251953125
-7.928117974144348,7.933051109313965
-7.903090094245322,7.917999744415283
-8.026824561605242,7.972799777984619
-7.946921547407927,7.922360897064209
-7.889410352488291,7.916792869567871
-7.954677021213342,7.92915678024292
-7.869665979871627,7.915464401245117
-7.924453006674053,7.9066972732543945
-7.886056354845152,7.919459819793701
-7.954677021213342,7.925158500671387
-7.935542022791058,7.927259922027588
-7.950781972366453,7.933512210845947
-7.946921547407927,7.926086902618408
-7.946921547407927,7.955726146697998
-7.954677021213342,7.957281589508057
-7.946921547407927,7.9168291091918945
-7.91721462968355,7.952247142791748
-7.948658283730227,7.924866199493408
-7.889410352488291,7.926014423370361
-7.906578398789698,7.948473930358887
-7.9393021526221474,7.940131664276123
-7.950781972366453,7.917191028594971
-7.869665979871627,7.901366710662842
-7.9393021526221474,7.921605587005615
-7.954677021213342,7.950572967529297
-7.892069753452455,7.894460201263428
-7.924453006674053,7.923946380615234
-7.931814161156377,7.968740463256836
-7.935542022791058,7.93566370010376
-7.950781972366453,7.941755771636963
-7.954677021213342,7.941431522369385
-7.954677021213342,7.948879241943359
-7.995678626217357,7.943159103393555
-7.89962956062971,7.935513973236084
-7.966576241738391,7.978793621063232
-7.9393021526221474,7.945872783660889
-7.838628495628443,7.906466007232666
-7.954677021213342,7.956559181213379
-7.950298727941771,7.957150936126709
-7.954677021213342,7.963501453399658
-7.844000917077081,7.971965312957764
-7.982923651140671,7.954747676849365
-7.935542022791058,7.965526103973389
-7.920818811243059,7.912295818328857
-7.853872762493711,7.948507308959961
-7.954677021213342,7.941067218780518
-7.882728704344236,7.902887344360352
-7.954677021213342,7.967954158782959
-7.882728704344236,7.910667896270752
-7.9430951409681345,7.924837112426758
-7.931814161156377,7.930948734283447
-7.950781972366453,7.932825565338135
-7.920818811243059,7.925838470458984
-7.913640203677234,7.939014911651611
-7.9430951409681345,7.940112113952637
-7.954677021213342,7.958032608032227
-7.950781972366453,7.940182209014893
-7.9393021526221474,7.919592380523682
-7.924453006674053,7.938450336456299
-7.913640203677234,7.914852619171143
-7.838628495628443,7.8683857917785645
-7.946921547407927,7.927758693695068
-7.946921547407927,7.931709289550781
-7.9393021526221474,7.909893989562988
-7.947673341658113,7.926388263702393
-7.954677021213342,7.9516496658325195
-7.950781972366453,7.947868347167969
-7.970532618892763,7.917675018310547
-7.920818811243059,7.937446117401123
-7.910094953104535,7.922536373138428
-7.924453006674053,7.934717178344727
-7.928117974144348,7.979241371154785
-7.9430951409681345,7.948042392730713
-7.869665979871627,7.901963710784912
-7.935542022791058,7.913051128387451
-7.91721462968355,7.959378242492676
-7.896196359268842,7.933681011199951
-7.928117974144348,7.92047643661499
-7.950781972366453,7.936216354370117
-7.950781972366453,7.926554203033447
-7.8728955601551585,7.919647216796875
-7.950781972366453,7.941874980926514
-7.869665979871627,7.904633522033691
-7.91721462968355,7.949161529541016
-7.931814161156377,7.93813419342041
-8.040958607678906,7.967196941375732
-7.954677021213342,7.9236931800842285
-7.946921547407927,7.962157249450684
-7.8876003998252076,7.935629844665527
-7.970532618892763,7.960904598236084
-7.838628495628443,7.911977767944336
-7.889410352488291,7.947934627532959
-7.995678626217357,7.9657158851623535
-7.93741804551443,7.9457831382751465
-7.920818811243059,7.910260200500488
-7.954677021213342,7.999266147613525
-7.946921547407927,7.959819793701172
-7.954677021213342,7.959051609039307
-7.950781972366453,7.914069652557373
-7.950781972366453,7.968784332275391
-7.931814161156377,7.924417495727539
-7.928117974144348,7.928555011749268
-7.95090181210265,7.961435317993164
-7.950781972366453,7.970120429992676
-7.9430951409681345,7.951456546783447
-7.946921547407927,7.950831890106201
-7.920818811243059,7.93499755859375
-7.91721462968355,7.920423984527588
-7.903090094245322,7.919149875640869
-7.954677021213342,7.946848392486572
-7.950781972366453,7.94788122177124
diff --git a/runs/20260124_224109_KIBA/test_markdowntable.txt b/runs/20260124_224109_KIBA/test_markdowntable.txt
deleted file mode 100644
index a564612b709131d441e4086583d49b7eff122b15..0000000000000000000000000000000000000000
--- a/runs/20260124_224109_KIBA/test_markdowntable.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-+--------+---------------------+--------------+-------------------+
-| MSE | Pearson Correlation | with p-value | Concordance Index |
-+--------+---------------------+--------------+-------------------+
-| 0.0008 | 0.4817 | 0.0000 | 0.6847 |
-+--------+---------------------+--------------+-------------------+
\ No newline at end of file
diff --git a/runs/20260124_224109_KIBA/valid_markdowntable.txt b/runs/20260124_224109_KIBA/valid_markdowntable.txt
deleted file mode 100644
index ef1883239177fee440d2ef88950fa2013d6ef46a..0000000000000000000000000000000000000000
--- a/runs/20260124_224109_KIBA/valid_markdowntable.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-+---------+--------+---------------------+--------------+-------------------+
-| # epoch | MSE | Pearson Correlation | with p-value | Concordance Index |
-+---------+--------+---------------------+--------------+-------------------+
-| epoch 0 | 0.0046 | -0.0476 | 0.0000 | 0.4710 |
-| epoch 1 | 0.0025 | 0.1240 | 0.0000 | 0.5352 |
-| epoch 2 | 0.0052 | 0.2611 | 0.0000 | 0.5879 |
-| epoch 3 | 0.0030 | 0.3712 | 0.0000 | 0.6374 |
-| epoch 4 | 0.0009 | 0.4274 | 0.0000 | 0.6673 |
-| epoch 5 | 0.0038 | 0.4554 | 0.0000 | 0.6727 |
-| epoch 6 | 0.0008 | 0.4896 | 0.0000 | 0.6897 |
-| epoch 7 | 0.0010 | 0.5113 | 0.0000 | 0.7005 |
-| epoch 8 | 0.0112 | 0.5019 | 0.0000 | 0.6889 |
-| epoch 9 | 0.0012 | 0.5242 | 0.0000 | 0.7023 |
-+---------+--------+---------------------+--------------+-------------------+
\ No newline at end of file
diff --git a/runs/20260125_080409_BindingDB_Kd/predictions_test.csv b/runs/20260125_080409_BindingDB_Kd/predictions_test.csv
deleted file mode 100644
index 91f9aaaa7419717a8de0edf5ff672fa2727cc541..0000000000000000000000000000000000000000
--- a/runs/20260125_080409_BindingDB_Kd/predictions_test.csv
+++ /dev/null
@@ -1,4224 +0,0 @@
-y_true,y_pred
-7.207608310501746,6.192030429840088
-5.568636235841012,5.349041938781738
-5.0,5.099071025848389
-5.0,4.805984020233154
-10.522878745280337,9.794988632202148
-5.920001601921648,5.5662007331848145
-6.356547323513812,5.840295314788818
-9.795880017344075,5.435057640075684
-5.0,4.926371097564697
-5.0,4.982748508453369
-5.0835460514500745,5.5672221183776855
-5.6777807052660805,5.482588291168213
-5.078313524516398,6.712497711181641
-7.958607314841775,5.190063953399658
-5.0,5.023560523986816
-4.341988603342887,4.842213153839111
-5.42021640338319,5.601888656616211
-5.0,5.369168758392334
-5.0,5.113928318023682
-5.0,5.393486499786377
-7.136677139879544,6.744731426239014
-6.958607314841775,5.7440667152404785
-8.444724129230682,9.108789443969727
-5.0,5.707203388214111
-5.0,5.765972137451172
-7.823908740944319,4.329455852508545
-6.136677139879544,5.1108574867248535
-6.6020599913279625,6.354699611663818
-5.0,5.3819661140441895
-6.1249387366083,5.172560214996338
-7.161150909262744,6.122109413146973
-7.769551078621726,6.905205249786377
-5.0,5.294712543487549
-5.522878745280337,5.679907321929932
-6.154901959985743,5.3995842933654785
-5.0,5.283309459686279
-9.0,7.653188228607178
-5.0,5.031604290008545
-6.607303046740334,7.130503177642822
-5.769551078621726,4.8224310874938965
-6.647817481888637,4.744632244110107
-7.0,6.000283241271973
-5.0,5.860949993133545
-7.1487416512809245,6.384510517120361
-6.0,6.249935626983643
-7.950007143079858,7.341048240661621
-5.0,5.001452445983887
-5.0,5.370481967926025
-5.0,5.374906063079834
-5.0,5.2404961585998535
-6.3979400086720375,6.7822136878967285
-6.853871964321762,5.267813205718994
-8.229147988357855,7.499277114868164
-6.026872146400301,5.111293792724609
-3.767003889607846,4.774156093597412
-5.0,5.093399524688721
-5.0,5.426647663116455
-2.769551078621726,3.444960117340088
-9.709965388637482,7.300893306732178
-5.0,5.047321796417236
-8.187086643357144,7.240571975708008
-5.481486060122112,5.249282360076904
-7.494850021680094,7.4149298667907715
-3.6020599913279625,4.285851001739502
-4.519993057042849,5.808780193328857
-9.221848749616356,6.58184814453125
-4.376750709602099,5.289863109588623
-7.657577319177793,4.881838798522949
-8.096910013008056,6.84437894821167
-5.0,5.727803707122803
-6.102372908709558,5.40753173828125
-5.903089986991944,5.342757225036621
-6.823908740944319,5.999712944030762
-7.419987887470576,7.211323261260986
-5.0,5.077590465545654
-5.0,5.575660705566406
-5.0,5.331974983215332
-4.769551078621726,5.435818195343018
-6.2441251443275085,6.100310802459717
-5.300986568387119,5.328016757965088
-6.4089353929735005,6.336942195892334
-3.900000004068662,3.7459349632263184
-6.130768280269024,5.215108394622803
-5.0,4.84965181350708
-7.0655015487564325,5.738214492797852
-4.820189777121204,5.929945945739746
-5.0,4.872095108032227
-6.114073660198569,7.762670040130615
-7.833668578233475,7.35270357131958
-5.0,5.061866283416748
-5.0,5.301468372344971
-7.0655015487564325,5.291197299957275
-5.0,4.887526035308838
-5.0,5.275351047515869
-7.6020599913279625,5.475721836090088
-5.0,5.562885761260986
-5.0,5.190252780914307
-5.0,5.1947784423828125
-5.0,5.615769863128662
-5.0,5.117552280426025
-8.229884705212898,7.595329761505127
-5.0,4.898634433746338
-4.229147988357856,4.205787181854248
-5.0,5.145644664764404
-5.0,5.0682454109191895
-5.0,4.9820475578308105
-5.255707016877324,5.289308071136475
-5.0,5.044127941131592
-5.0,5.072263240814209
-5.0,5.012124538421631
-5.359021942641668,6.010932922363281
-6.167491087293763,5.224595546722412
-5.0,5.071563243865967
-9.341170419222676,7.257384777069092
-5.300986568387119,5.385712146759033
-5.657577319177793,5.6942057609558105
-7.107905397309519,4.83715295791626
-8.67778070526608,7.149240016937256
-5.229147988357855,5.300844192504883
-5.068033885271827,5.323803901672363
-6.207608310501746,5.327049255371094
-5.568636235841012,5.7672648429870605
-5.0,4.780510902404785
-8.51999305704285,8.281957626342773
-5.0,4.943745136260986
-4.519993057042849,5.491129398345947
-5.0,5.319087505340576
-8.0,6.83268404006958
-5.0,5.03957462310791
-9.39040559077478,7.795108318328857
-5.0,5.110182285308838
-5.481486060122112,5.308446407318115
-8.455931955649724,6.225522518157959
-5.0,5.003696918487549
-5.0,5.114532947540283
-5.0,4.840513229370117
-3.9586073148417746,3.6623146533966064
-9.494850021680094,9.532052040100098
-5.300986568387119,5.097500324249268
-8.958607314841775,7.956356048583984
-4.372634143407267,6.062529563903809
-5.0,5.024642467498779
-5.0,5.11616849899292
-6.327902142064282,5.297170162200928
-5.0,5.204177379608154
-5.823908740944319,5.056663990020752
-6.102372908709558,5.195031642913818
-5.0,5.040339946746826
-6.92959267825988,5.526307582855225
-5.0,5.0777106285095215
-5.0,5.1108012199401855
-4.5951662833800615,5.585710048675537
-6.318758762624412,5.468540668487549
-5.0,4.936975955963135
-9.148741651280925,6.962019920349121
-5.200659450546418,5.315738201141357
-5.0,5.0780558586120605
-5.0,5.063318729400635
-5.0,5.1936163902282715
-2.9586073148417746,3.664677858352661
-6.6020599913279625,6.274927616119385
-7.779891911959945,5.623867511749268
-8.0,7.871351718902588
-3.2580609222708015,3.9412484169006348
-3.8153085691824016,6.524606227874756
-5.0,5.077172756195068
-5.0,4.8795390129089355
-5.236572006437063,5.187769412994385
-5.0,5.136478900909424
-5.0,5.258305549621582
-5.0,5.096407890319824
-5.42021640338319,5.9335761070251465
-7.0,3.1084940433502197
-6.8297382846050425,5.900043964385986
-5.0,5.0489277839660645
-5.0,5.657060146331787
-8.0,7.340237140655518
-5.0,5.165251731872559
-5.0,4.863986968994141
-5.0,5.334092140197754
-6.259637310505756,5.848808765411377
-4.301029995663981,4.981271743774414
-5.300986568387119,5.14556360244751
-5.920818753952375,6.008039951324463
-5.197226274708024,5.344584941864014
-5.0,4.855332374572754
-5.0,5.015470027923584
-5.0,4.891392230987549
-5.0,5.176112651824951
-5.0,5.3483405113220215
-5.0,5.222001552581787
-5.0,4.91024923324585
-7.320027305722581,6.637277603149414
-5.0,5.307206153869629
-5.552841968657781,5.506247043609619
-5.173925197299173,5.8274455070495605
-5.0,4.994593143463135
-6.251811972993799,5.584225654602051
-5.853871964321762,5.378306865692139
-6.0,5.333686351776123
-5.199970640755866,6.080882549285889
-5.0,5.368833065032959
-4.190036478285986,5.434652328491211
-5.638272163982407,5.806370258331299
-5.619788758288394,5.313745498657227
-6.3872161432802645,6.295995235443115
-5.292855811657555,5.7318434715271
-5.0,4.971049785614014
-5.732769587118564,5.371168613433838
-5.0,5.207828521728516
-5.0,5.271753787994385
-5.0,5.1017680168151855
-5.0,4.880619049072266
-5.0,4.966019153594971
-5.0,5.1611504554748535
-5.958607314841775,5.8693976402282715
-5.0,5.170224666595459
-5.0,5.052304744720459
-5.800000874803203,6.55005407333374
-6.679999195735272,6.863025188446045
-5.0,5.273828983306885
-5.0,5.3351850509643555
-3.3187587626244124,3.056706428527832
-5.0,4.948568820953369
-6.136677139879544,5.95318078994751
-5.300986568387119,5.6390700340271
-5.0,5.267940998077393
-8.619788758288394,8.714627265930176
-6.823908740944319,7.0317158699035645
-6.698970004336019,5.620489597320557
-5.0,5.531117916107178
-6.598216652246203,5.870724201202393
-5.0,4.825430393218994
-5.0,5.455269813537598
-5.0,5.133235931396484
-5.0,4.974298477172852
-4.0,4.889268398284912
-5.468521082957745,5.32943868637085
-4.3979400086720375,4.672817707061768
-4.950781977329818,6.052259922027588
-5.893129455521346,5.925483226776123
-5.920818753952375,6.331640720367432
-7.494850021680094,6.419795036315918
-5.0,5.5017876625061035
-5.0,5.226513385772705
-5.0,5.397139072418213
-6.568636235841012,5.252330303192139
-5.0,5.134298801422119
-5.0,5.050492286682129
-5.0,5.1594624519348145
-6.0,6.081159591674805
-5.0,4.923734188079834
-4.7350995744830255,5.951868534088135
-5.721246399047171,6.031337261199951
-8.795880017344075,7.507725238800049
-5.0,5.085367679595947
-4.0,5.9474992752075195
-5.0,5.4611687660217285
-5.0,6.724796772003174
-5.0,4.925840854644775
-5.0,4.737969398498535
-2.3010299956639813,2.8802616596221924
-5.0,4.9752068519592285
-6.6599923820033275,7.819091796875
-3.0,6.663341999053955
-5.0,5.799502849578857
-5.0,5.394008159637451
-5.0,5.220901966094971
-5.42021640338319,5.416622161865234
-5.769551078621726,6.218555927276611
-5.376750709602099,6.118780136108398
-7.42021640338319,5.635198593139648
-4.958607314841775,4.791866302490234
-5.0,5.041163921356201
-4.3979400086720375,5.555074691772461
-5.0,5.0042924880981445
-5.0,5.071699142456055
-8.301029995663981,8.974932670593262
-5.0,5.396072864532471
-5.0,5.147587299346924
-5.899998417198648,5.923186779022217
-6.537602002101044,6.472108840942383
-5.0,5.163615703582764
-5.0,4.980598449707031
-6.500312917381596,7.327807903289795
-4.6808314567707,5.722473621368408
-5.0,5.831532955169678
-5.0,5.538382053375244
-7.823908740944319,5.21986198425293
-8.319664486585436,8.934185981750488
-5.045757490560675,4.6553635597229
-6.119186407719209,6.020641803741455
-6.642065152999546,6.073191165924072
-5.300986568387119,4.993824005126953
-7.167491087293763,5.813642978668213
-5.0,5.023172855377197
-6.962573502059376,6.352328777313232
-9.500312917381596,6.90923547744751
-5.0,6.193962574005127
-5.0,5.139348983764648
-5.0,5.466409206390381
-5.0,4.860876560211182
-5.1904402853647325,6.018031597137451
-5.0,4.943527698516846
-5.552841968657781,4.908950328826904
-5.346787486224656,5.40842342376709
-5.552841968657781,5.4960174560546875
-7.275724130399211,7.449491024017334
-5.0,5.005635738372803
-5.0,5.131608486175537
-7.552841968657781,5.768101215362549
-5.0,5.023364543914795
-5.0,5.035645961761475
-5.0,5.037603855133057
-3.8239087409443187,3.050091028213501
-5.0,5.056727886199951
-5.709965388637482,5.30288028717041
-6.987162775294828,6.258695602416992
-5.0,5.025135517120361
-5.0,5.260532855987549
-6.920818753952375,5.724552631378174
-5.0,5.146481037139893
-4.3979400086720375,4.8554911613464355
-5.853871964321762,5.265280723571777
-5.869988050328096,6.130959987640381
-6.730487055782083,5.991137981414795
-5.0,5.380552768707275
-6.053056729302174,7.579935550689697
-5.0,5.209885597229004
-8.300162274132754,8.64134693145752
-5.0,5.256222724914551
-4.229147988357856,4.575150489807129
-5.0,5.042812824249268
-6.1938200260161125,5.12616491317749
-5.0,5.775824069976807
-5.0,5.775646686553955
-5.0,5.12587833404541
-5.0,5.360193252563477
-5.0,5.11929178237915
-5.0,5.3964619636535645
-5.060480747381382,5.317111968994141
-6.1938200260161125,5.643523693084717
-4.696803942579511,5.810190677642822
-5.0,5.410577297210693
-4.96000007768865,6.372756481170654
-5.0,4.861814498901367
-6.229147988357855,7.7847723960876465
-6.698970004336019,6.034632205963135
-5.0,5.327280044555664
-5.0,5.088624477386475
-5.0,4.987690448760986
-9.397940008672037,6.931572437286377
-8.443697499232712,6.360180377960205
-9.619788758288394,5.715056896209717
-5.0,4.997434139251709
-5.0,5.385311603546143
-6.499996931948306,6.961855411529541
-5.8371370066780734,5.56734037399292
-6.0338582672609675,5.162623405456543
-7.0655015487564325,6.370335102081299
-5.142667503568731,5.185250759124756
-5.0,4.922080993652344
-8.301029995663981,8.797148704528809
-5.0,4.893845081329346
-5.0,5.038052082061768
-5.886056647693163,5.375604629516602
-5.0,4.943374156951904
-5.0,5.839001655578613
-6.850011543508524,6.859413146972656
-6.769551078621726,6.272886753082275
-5.0,5.189596652984619
-5.0,4.972675800323486
-5.0,4.771881580352783
-5.0,5.621686935424805
-5.7447274948966935,5.805421352386475
-5.301029995663981,5.315441608428955
-4.519993057042849,6.12897253036499
-5.0,4.992178916931152
-8.301029995663981,8.398701667785645
-5.0,5.747323036193848
-5.0,4.889368057250977
-5.0,5.199402809143066
-5.1487416512809245,5.6390700340271
-5.0,5.135339736938477
-5.0,5.112861156463623
-4.0,4.5448431968688965
-7.075720713938118,7.008984088897705
-7.207608310501746,5.8218841552734375
-5.0,5.234539985656738
-5.045757490560675,5.464474678039551
-5.0,5.282131195068359
-5.0,4.82974910736084
-5.0,4.832929611206055
-5.0,5.277608394622803
-5.431798275933005,5.748475074768066
-5.0,5.067424774169922
-4.0,4.6085381507873535
-8.329754146925875,7.903353214263916
-6.013228265733755,5.244873523712158
-5.0,5.130787372589111
-5.993819302361495,5.386246204376221
-4.0,6.020557880401611
-5.0,5.1798014640808105
-5.100000128334196,6.063928127288818
-5.0,5.052112102508545
-6.0,5.951828479766846
-5.0,5.022032260894775
-5.7447274948966935,5.783064365386963
-5.0,5.880042552947998
-5.0,5.472626209259033
-7.698970004336019,7.35447359085083
-8.292429823902063,7.818813323974609
-5.0,5.067463397979736
-5.0,5.002851963043213
-8.318758762624412,6.227748394012451
-6.0,6.044436931610107
-5.0,5.291336536407471
-5.0,4.888147830963135
-5.0,5.070916652679443
-5.0,5.219992637634277
-5.0,5.0161027908325195
-4.7447274948966935,5.143530368804932
-5.221848749616356,5.588127136230469
-5.36997914888659,6.1447062492370605
-4.619788758288394,5.0143632888793945
-5.3979400086720375,5.225150108337402
-8.0,7.219721794128418
-5.0,5.499056339263916
-5.0,4.751804351806641
-7.275724130399211,5.802310466766357
-5.619788758288394,5.292791843414307
-6.337242168318426,5.757636547088623
-6.649751981665837,6.449998378753662
-5.0,4.973509788513184
-8.0,6.607130527496338
-5.300986568387119,5.904860019683838
-5.0,4.981781005859375
-4.795880017344075,3.891223907470703
-4.97387548325455,5.029378414154053
-5.0,5.58486795425415
-5.0,5.084710121154785
-6.568636235841012,5.655955791473389
-5.0,5.206585884094238
-5.0,5.130745887756348
-8.301029995663981,7.730100154876709
-5.0,5.179408073425293
-5.0,5.5333075523376465
-5.0,4.825826168060303
-8.619788758288394,6.441845417022705
-6.002488800403695,5.2710490226745605
-8.853871964321762,5.644662380218506
-3.721246399047171,4.133577823638916
-6.809668301829708,5.467990875244141
-5.0,5.032557964324951
-6.060480747381382,5.424997329711914
-5.0,4.927872657775879
-5.595807939958597,5.914621829986572
-5.0,5.1649489402771
-5.0,5.136605262756348
-5.0,5.985341548919678
-5.769551078621726,5.4699625968933105
-5.0,5.02467679977417
-6.810004660035681,5.847077369689941
-6.632023214705406,5.684902667999268
-5.0,4.893784999847412
-5.0,4.967441082000732
-6.055517327849831,5.9411702156066895
-5.0,4.897464275360107
-5.0,5.125123023986816
-5.920818753952375,5.434799671173096
-6.0301183562534995,6.392307758331299
-5.366531544420413,5.157491683959961
-7.1487416512809245,6.476625442504883
-3.6197887582883936,3.879795551300049
-7.443697499232712,7.66350793838501
-8.468521082957745,6.423459529876709
-5.0,4.89667272567749
-5.236572006437063,5.177272319793701
-5.0,5.068600177764893
-5.221848749616356,5.506264686584473
-5.0,5.3120293617248535
-6.823908740944319,5.1170973777771
-4.2076083105017466,4.009488105773926
-7.309803919971486,6.642110824584961
-6.430626090384954,6.335700988769531
-6.0,6.703314304351807
-10.468521082957745,9.580134391784668
-5.0,4.9964494705200195
-5.0,5.114134311676025
-5.0,5.1364850997924805
-7.180456064458131,5.284218788146973
-5.585026652029182,5.389469623565674
-7.366531544420414,7.152250289916992
-3.0,4.487596035003662
-4.698970004336019,5.345944881439209
-5.0,5.059463024139404
-5.031517051446064,4.4533610343933105
-7.371611069949688,6.368468761444092
-7.494850021680094,5.4583892822265625
-5.0,5.517578601837158
-6.376750709602099,5.359155178070068
-5.0,5.2053046226501465
-5.0,5.073429107666016
-5.0,4.705881595611572
-5.221848749616356,5.4051947593688965
-7.267606240177031,7.285959720611572
-5.0,5.917262554168701
-5.0,5.185503959655762
-5.0,4.883056163787842
-5.0,5.339349269866943
-5.0,5.046055793762207
-6.0,6.75598669052124
-6.09151498112135,5.307329177856445
-8.51999305704285,6.436609745025635
-5.0,5.320979118347168
-5.0,5.220027446746826
-5.638272163982407,5.363287448883057
-3.080000000575745,4.444843769073486
-5.0,5.01753044128418
-5.0,5.0767292976379395
-6.217527375833714,5.943626880645752
-6.366531544420413,6.4976935386657715
-5.0,5.410034656524658
-5.0,5.023427486419678
-5.0,5.298354625701904
-6.856985199745905,6.488597393035889
-5.0,5.468430042266846
-5.0,5.396678447723389
-5.0,4.965760707855225
-8.515700160653214,8.365979194641113
-5.0,5.598056316375732
-5.0,5.260011196136475
-10.036212172654444,6.9861836433410645
-5.301029995663981,5.315441608428955
-5.0,5.433072090148926
-5.0,5.121199607849121
-6.0,6.551292896270752
-6.425968732272281,6.4800920486450195
-5.0,4.881595611572266
-5.0,5.017022609710693
-5.0,5.042425632476807
-7.180456064458131,6.779053211212158
-7.903089986991944,8.231704711914062
-5.0,5.013763427734375
-5.0,5.666179656982422
-5.0,5.454876899719238
-6.4089353929735005,5.37108850479126
-4.279999967105453,4.787578582763672
-6.769551078621726,5.461825370788574
-5.0,5.249924659729004
-5.0,4.825901985168457
-5.0,5.077644348144531
-5.619969752032169,5.651261329650879
-5.0,5.153863430023193
-5.0,5.1045613288879395
-5.0,5.18471097946167
-5.0,5.202138423919678
-5.0,5.3296799659729
-5.0,5.3820271492004395
-6.435926021022853,5.323831081390381
-2.6989700043360187,2.5966434478759766
-5.0245681914907365,5.224217414855957
-6.0,6.124349594116211
-5.0,4.864552974700928
-5.0,4.867848873138428
-7.823908740944319,6.628793239593506
-9.0,5.529487133026123
-7.6020599913279625,7.514578342437744
-5.0,5.273969650268555
-4.903089986991944,4.992685317993164
-5.0,4.988535404205322
-5.6020599913279625,5.4754719734191895
-6.732828271596986,4.9864325523376465
-5.0,5.366262435913086
-6.1938200260161125,5.162884712219238
-5.080921907623926,4.96380615234375
-5.0,5.026283264160156
-7.795880017344075,8.735610008239746
-5.0,5.366691589355469
-4.519993057042849,5.331340312957764
-5.0,5.103885173797607
-7.3872161432802645,6.624268054962158
-5.0,5.466325283050537
-6.0,6.558236598968506
-6.721246399047171,5.052839756011963
-5.0,5.416957378387451
-5.0,5.487298488616943
-5.0,4.8451714515686035
-5.065501548756432,4.981712818145752
-6.450004148469349,5.669580936431885
-6.299997602857746,7.314314842224121
-5.0,5.33429479598999
-5.0,5.036474704742432
-5.0,4.9838385581970215
-5.0,6.0605244636535645
-5.0,4.979743480682373
-5.0,4.770686626434326
-5.0,4.908358097076416
-5.0,5.471553802490234
-8.560667306169737,8.54062271118164
-6.795880017344075,5.698171138763428
-4.407823242604133,4.535611629486084
-5.721246399047171,5.607853412628174
-6.0,6.395940780639648
-5.0,4.673460483551025
-5.60049933868539,5.6989521980285645
-5.0,4.889811992645264
-4.3979400086720375,7.586288928985596
-5.0,5.278682231903076
-5.0,5.140174865722656
-6.958607314841775,5.509286403656006
-5.0,5.253620624542236
-5.750068243365805,6.175002574920654
-7.199970640755866,7.042350769042969
-4.0,3.906102418899536
-5.119186407719209,5.131361484527588
-5.366531544420413,5.631533622741699
-5.0,5.107808589935303
-4.301029995663981,3.838240385055542
-6.657577319177793,6.456223011016846
-5.0,5.030710697174072
-8.327902142064282,5.852475643157959
-5.0,5.063209056854248
-5.0,5.884710788726807
-5.0,5.27225923538208
-5.0,4.814195156097412
-7.508638306165727,6.623126029968262
-5.458420756053419,5.276801586151123
-5.0,4.996404647827148
-5.0,5.676774024963379
-5.236572006437063,5.209747314453125
-5.0,5.156375408172607
-6.6020599913279625,6.469541072845459
-7.568636235841012,6.108551025390625
-8.154901959985743,5.4079461097717285
-5.0,4.818192481994629
-5.700000503883016,6.737534999847412
-5.0,5.888571262359619
-5.481486060122112,5.0160932540893555
-5.0,5.387982368469238
-5.022276394711152,5.755285739898682
-5.0,4.9232707023620605
-6.630005338391571,7.284790515899658
-5.0,5.258294582366943
-5.114073660198569,6.046763896942139
-4.770011163455189,5.787271976470947
-8.096910013008056,8.652825355529785
-5.721246399047171,5.226020336151123
-5.0,5.27590799331665
-8.292429823902063,7.262850761413574
-5.0,4.77299165725708
-5.0,4.962808132171631
-6.560004526046192,5.815074920654297
-5.772113295386326,4.770359516143799
-5.0,4.950331687927246
-6.721246399047171,6.29887056350708
-4.6020599913279625,5.499131679534912
-5.0,5.754075050354004
-5.301029995663981,6.522350788116455
-5.0,5.199023246765137
-5.568636235841012,5.57266092300415
-5.0,5.541642665863037
-5.0,4.940063953399658
-5.167491087293763,5.491123676300049
-5.0,5.077491760253906
-5.0,5.207889080047607
-6.698970004336019,5.810901165008545
-5.0,4.914636135101318
-5.537602002101044,6.965530872344971
-8.040958607678906,7.106039524078369
-5.0,5.2718377113342285
-5.0,4.866460800170898
-8.422795526988937,5.486012935638428
-6.537602002101044,6.7922749519348145
-5.0,5.648532390594482
-7.886056647693163,7.039917469024658
-5.0,4.884250164031982
-5.0,5.057998180389404
-6.6020599913279625,6.334971904754639
-6.455931955649724,5.426927089691162
-5.0,6.120093822479248
-5.0,5.171582221984863
-8.221848749616356,7.772959232330322
-7.130768280269024,6.63003396987915
-5.0,5.021633148193359
-5.0,5.131214618682861
-6.219682687859849,6.771603107452393
-8.853871964321762,7.258056163787842
-5.0,5.2591166496276855
-6.619788758288394,5.523869037628174
-6.327902142064282,5.4833292961120605
-6.861697301833718,7.38915491104126
-6.6020599913279625,6.51538610458374
-7.026872146400302,5.092082977294922
-5.0,4.806642055511475
-8.301029995663981,8.164392471313477
-6.522878745280337,5.589053630828857
-5.0,5.176392555236816
-7.301029995663981,7.953689098358154
-5.0,5.590125560760498
-5.0,4.804859638214111
-5.0,5.195252895355225
-5.0,5.092212200164795
-8.050609993355087,5.1477742195129395
-5.0,4.964005470275879
-4.0,5.412899494171143
-5.267606240177031,5.929898738861084
-5.0,5.3332438468933105
-5.0,4.824411869049072
-5.0,4.8898797035217285
-6.886056647693163,5.414026260375977
-6.75448733218585,5.929245471954346
-5.0,5.256820201873779
-7.522878745280337,6.498584747314453
-5.0,6.212003231048584
-5.721246399047171,5.944356441497803
-5.0,4.952202320098877
-5.522878745280337,6.137852191925049
-7.0,5.98289680480957
-7.0655015487564325,5.379953384399414
-7.119186407719209,5.813113689422607
-4.130768280269024,3.786496877670288
-6.619788758288394,6.610806941986084
-5.0,5.839100360870361
-4.5376020021010435,4.890420436859131
-5.376750709602099,5.329156875610352
-6.597738617545319,6.204643726348877
-5.300986568387119,5.501394748687744
-5.164309428507575,5.458948612213135
-6.823908740944319,5.972374439239502
-6.309803919971486,6.282106876373291
-5.440000065513061,5.670919895172119
-5.0,5.73866605758667
-9.657577319177793,7.340949535369873
-5.0,5.089066982269287
-2.95663772197887,4.12327766418457
-9.744727494896694,8.103997230529785
-6.0,6.549612045288086
-4.906578314837765,5.123318195343018
-5.0,5.358048439025879
-3.6989700043360187,4.031578540802002
-5.0,4.9229817390441895
-6.1249387366083,6.616082668304443
-5.0,5.055501937866211
-5.0,5.654727458953857
-5.300986568387119,5.416325092315674
-2.6197887582883936,3.1695923805236816
-5.0,5.4542975425720215
-5.0,5.093051910400391
-5.552841968657781,5.466836452484131
-8.869666231504993,8.724200248718262
-5.300986568387119,5.220907211303711
-7.0915149811213505,5.823751926422119
-5.300986568387119,5.364134311676025
-8.275724130399212,5.7442145347595215
-5.0,4.855959415435791
-4.180456064458132,4.663448333740234
-5.0,5.040323734283447
-5.698970004336019,5.41747522354126
-5.1904402853647325,5.051154613494873
-5.0,5.87525749206543
-5.0,5.748680591583252
-6.784274335442433,6.756187915802002
-5.7299993321845495,7.710206508636475
-5.0,5.047444820404053
-5.0,4.807143688201904
-3.8696662315049934,4.6050028800964355
-5.327902142064282,4.802138805389404
-6.4089353929735005,5.35317850112915
-5.0,5.223928451538086
-5.0,4.913272857666016
-5.779891911959945,5.124388217926025
-6.958607314841775,7.403016090393066
-5.0,5.243625164031982
-7.337242168318426,6.899524211883545
-5.0,5.001891136169434
-6.7557228791981565,3.6577937602996826
-5.0,4.879431247711182
-5.0,5.919284343719482
-5.0,5.160156726837158
-5.0,5.2089338302612305
-3.2907300390241696,3.7624082565307617
-7.2506115684188455,5.781393527984619
-5.0,5.800513744354248
-5.0,5.281485557556152
-6.200659450546418,5.840499401092529
-5.860120913598763,6.293944835662842
-5.0,5.174533367156982
-7.853871964321762,6.165711402893066
-7.468521082957745,6.598366737365723
-5.0,5.029170513153076
-5.0,4.864613056182861
-5.823908740944319,5.109838962554932
-5.0,5.040215015411377
-6.537602002101044,6.050629138946533
-4.568636235841013,5.860500812530518
-5.0,4.866739273071289
-7.431798275933005,5.238588333129883
-5.0,5.131771564483643
-5.154901959985743,4.63055419921875
-5.0,5.6815667152404785
-6.173925197299173,5.905364513397217
-2.769551078621726,3.036618947982788
-6.7447274948966935,5.91465950012207
-6.886056647693163,6.911177158355713
-5.0,4.925757884979248
-5.0,5.372090816497803
-5.0,5.0644378662109375
-4.657577319177793,5.264276027679443
-5.0,5.016367435455322
-5.0,4.97907829284668
-5.886056647693163,5.491054058074951
-5.0,5.107414722442627
-7.721246399047171,6.143744945526123
-5.0,5.072312831878662
-7.7447274948966935,6.642668724060059
-5.0,5.44003963470459
-5.0,5.738412857055664
-5.0,5.335048198699951
-5.920818753952375,6.257889747619629
-5.698970004336019,5.8645853996276855
-8.100179497572904,7.422887802124023
-8.414539270491499,6.599079132080078
-5.0,4.7792840003967285
-5.0,4.903222560882568
-5.0,5.049170970916748
-4.598599459218456,5.0560526847839355
-5.0,5.357970237731934
-3.6307841425898575,4.2238054275512695
-5.0,4.856866359710693
-5.080921907623926,5.413848400115967
-6.0,6.450216293334961
-5.0,4.988966464996338
-6.0,6.609438419342041
-5.0,5.691159248352051
-5.0,5.295753002166748
-5.958607314841775,5.367431163787842
-5.0,5.022651195526123
-5.0,5.237806797027588
-5.0,5.021792888641357
-5.0,5.092728137969971
-8.500312917381596,8.081496238708496
-3.6903698325741017,3.469774007797241
-6.0,6.086185455322266
-5.0,5.21592378616333
-5.0,5.060632228851318
-6.6020599913279625,6.3230366706848145
-5.0,5.155923366546631
-5.0,5.388735294342041
-5.706637445288555,4.287635326385498
-8.698970004336019,5.775235652923584
-5.300986568387119,5.684919357299805
-5.0,5.270478248596191
-5.0,5.200850486755371
-5.721246399047171,5.683313846588135
-5.0,5.2873077392578125
-5.0,5.071727752685547
-5.417368560510363,5.464914798736572
-6.958607314841775,5.419223308563232
-5.0,5.010935306549072
-5.0,4.87296724319458
-6.449771646944906,6.422504901885986
-5.0,5.040838241577148
-5.6777807052660805,5.381223201751709
-5.568636235841012,7.097882270812988
-3.948924692324251,5.22532844543457
-5.0,5.365201473236084
-5.301029995663981,5.39683198928833
-5.0,4.922582626342773
-5.0,4.80562162399292
-5.499999678657065,6.382076740264893
-5.0,5.137546539306641
-5.0,7.0936102867126465
-5.0,5.129308223724365
-5.0,5.147453784942627
-5.3872161432802645,6.100983142852783
-7.903089986991944,8.348886489868164
-6.872895201635192,8.25707721710205
-5.522878745280337,5.308637619018555
-6.853871964321762,6.199615955352783
-5.0,4.887871265411377
-7.013228265733755,5.177326679229736
-7.6020599913279625,6.13965368270874
-7.275724130399211,6.628363132476807
-5.0,5.131606578826904
-4.279014255846261,4.162896633148193
-5.0,5.551848411560059
-5.0,4.847072601318359
-5.0,5.216223239898682
-5.0,5.087929725646973
-5.221848749616356,4.93971586227417
-5.0,5.079555988311768
-5.698970004336019,6.0313239097595215
-3.8632794328435933,4.628646373748779
-5.0,5.931554794311523
-5.0,5.500880718231201
-5.0,5.366541385650635
-4.657577319177793,4.453933238983154
-5.0,6.047239780426025
-6.376750709602099,6.368336200714111
-5.309803919971486,5.118103504180908
-5.0,4.886826992034912
-8.301029995663981,5.098637580871582
-9.795880017344075,9.153460502624512
-6.008773924307505,5.524851322174072
-8.221848749616356,6.906426429748535
-5.0,5.259628772735596
-5.0,4.973846912384033
-5.795880017344075,6.319716930389404
-5.0,6.408961296081543
-5.260427655549908,5.416458606719971
-5.0,5.164096355438232
-4.0,4.297079563140869
-6.058096190163026,5.555649280548096
-5.0,5.282868385314941
-7.360015751958412,6.006964683532715
-5.0,4.907923221588135
-5.0,5.150585174560547
-5.6777807052660805,5.111435413360596
-7.301029995663981,7.589146137237549
-5.0,4.8260979652404785
-5.0,5.221710681915283
-9.0268721464003,5.948446750640869
-5.0,5.157965183258057
-5.0,5.47109842300415
-5.0,5.212971210479736
-8.522878745280337,5.968396186828613
-5.0,5.773449897766113
-5.0,5.299942493438721
-7.4089353929735005,8.419119834899902
-5.0,6.112778663635254
-5.0,4.978753566741943
-5.0,5.125948905944824
-5.300986568387119,5.497527599334717
-6.036212172654444,5.2646989822387695
-5.0,5.321452617645264
-4.779996573843064,5.323217868804932
-5.119186407719209,5.58844518661499
-5.0,5.085070610046387
-5.0,5.3025383949279785
-5.0,5.355555534362793
-7.200659450546418,5.261059284210205
-8.301029995663981,8.152314186096191
-5.0,6.12794303894043
-5.0,5.0365824699401855
-6.522878745280337,5.823855876922607
-5.769551078621726,4.8250627517700195
-5.0,5.4800286293029785
-6.619788758288394,5.969015598297119
-5.0,5.275376796722412
-5.0,4.947767734527588
-5.0,4.879126071929932
-5.2958494831602,5.419421672821045
-6.4951894468493085,4.186461925506592
-5.7447274948966935,5.040224552154541
-7.886056647693163,7.433148384094238
-8.500312917381596,8.957110404968262
-9.096910013008056,8.054276466369629
-6.3872161432802645,5.316312313079834
-5.823908740944319,5.549386501312256
-8.920818753952375,7.388418674468994
-4.366531544420414,4.584776401519775
-5.305394801066431,6.265835285186768
-5.0,5.052527904510498
-5.0,5.146311283111572
-6.698970004336019,6.436479091644287
-5.0,4.944128513336182
-5.300986568387119,5.960075855255127
-5.0,4.9358954429626465
-6.0,6.042369842529297
-5.2182446253475305,6.135802745819092
-5.0,5.436885356903076
-6.7447274948966935,5.459222316741943
-5.0,4.982595920562744
-5.0,4.890893459320068
-5.214670164989233,5.18116569519043
-6.070581074285707,5.958244800567627
-6.11975822410452,6.229366302490234
-5.0,5.175078868865967
-5.0,5.384131908416748
-5.0,5.083664894104004
-5.0,5.217100620269775
-5.638272163982407,5.454577922821045
-5.0,4.901022911071777
-4.0,5.629345417022705
-5.0,5.004464149475098
-5.0,4.908106327056885
-5.301029995663981,5.582573413848877
-5.292429823902063,5.274125576019287
-9.801342913045577,9.304757118225098
-7.431798275933005,7.201941967010498
-5.0,5.235335826873779
-5.0,5.323268890380859
-6.070581074285707,6.073848247528076
-5.508638306165727,5.824853897094727
-6.619788758288394,5.87913179397583
-4.552841968657781,4.274459362030029
-8.920818753952375,6.932997703552246
-7.036212172654444,6.20139741897583
-3.1249387366083,5.540289402008057
-6.585026652029182,7.064393043518066
-5.0,5.045489311218262
-5.0,5.148159503936768
-6.85078088734462,5.988650798797607
-5.0,5.765685558319092
-6.0,6.893737316131592
-5.0,5.014300346374512
-3.585026652029182,2.9377212524414062
-6.0,6.450216293334961
-3.6020599913279625,5.346608638763428
-2.8239087409443187,2.765470027923584
-7.100015437450609,7.868200302124023
-5.300986568387119,5.571773052215576
-6.760000207113128,8.178845405578613
-5.0,5.169607639312744
-7.770062314092066,7.848719120025635
-5.0,4.930111408233643
-6.638272163982407,5.853052616119385
-5.0,5.362796306610107
-5.0,5.144970417022705
-5.795880017344075,5.924072742462158
-5.0,5.165585994720459
-7.537602002101044,6.233640193939209
-5.0,5.343278408050537
-5.0,4.773228168487549
-6.425968732272281,6.159783840179443
-5.0,5.371493816375732
-5.1938200260161125,5.467186450958252
-5.0,5.1067914962768555
-8.00436480540245,7.174413204193115
-5.0,5.333006381988525
-5.0,4.8443989753723145
-5.468521082957745,6.614305019378662
-6.0,6.178483963012695
-5.0,5.377895832061768
-5.0,5.2899885177612305
-5.494850021680094,5.314195156097412
-5.096910013008056,5.027134418487549
-6.657577319177793,5.542810916900635
-5.6777807052660805,5.244253635406494
-5.0,4.962698936462402
-6.599997654072045,8.137528419494629
-6.896196279044043,7.0461883544921875
-5.0,5.13864278793335
-6.35999585346894,6.191309928894043
-5.300986568387119,5.262834548950195
-5.173925197299173,5.554806232452393
-7.853871964321762,7.264782905578613
-7.969805214643249,7.210658550262451
-5.0,5.741000652313232
-5.300986568387119,5.223622798919678
-5.0,5.368082523345947
-5.0,4.9384918212890625
-5.0,4.917145252227783
-4.219999701663429,4.170220851898193
-5.6777807052660805,4.509273529052734
-5.0,5.1853861808776855
-5.680061560019691,5.882717609405518
-6.443697499232712,6.005244255065918
-5.0,4.900705337524414
-7.42021640338319,5.46038293838501
-5.0,5.354947566986084
-5.0,5.876194477081299
-5.113509274827518,5.412519931793213
-6.425968732272281,6.246030807495117
-6.399996913372259,6.277597904205322
-5.0,5.1287360191345215
-5.0,4.95209264755249
-5.142667503568731,5.920253276824951
-5.249858171668547,5.500705718994141
-5.0,5.251790523529053
-6.756961951313706,6.374411106109619
-5.0,4.912252902984619
-3.242708381468785,5.1256184577941895
-5.0034883278458215,4.99613618850708
-6.443697499232712,5.611498832702637
-5.0,5.228448390960693
-5.0,5.143517017364502
-5.0,4.987063407897949
-5.0,5.227601051330566
-5.0,5.058440208435059
-5.0,5.214789867401123
-6.1938200260161125,5.525162696838379
-6.542118103266008,7.694478511810303
-4.301029995663981,4.0894646644592285
-5.0,5.3278985023498535
-5.0,5.057821750640869
-5.0,4.80591344833374
-8.0,5.461606502532959
-7.236572006437063,6.760606288909912
-6.036212172654444,5.802205562591553
-6.6777807052660805,5.5987138748168945
-5.0,4.861024379730225
-5.0,5.197733402252197
-5.0,4.939024448394775
-5.0,5.045812129974365
-7.568636235841012,7.251451015472412
-4.619788758288394,4.242000102996826
-4.409994580348671,4.140784740447998
-5.0,4.895404815673828
-5.0,5.084288120269775
-5.0,5.1212029457092285
-5.0,5.215664386749268
-5.0,5.093470573425293
-5.721246399047171,5.801486968994141
-5.0,4.8948822021484375
-7.111633269828763,6.382086277008057
-5.0,6.120917320251465
-5.0,4.883655548095703
-5.0,5.3235039710998535
-10.187086643357144,8.442765235900879
-6.987162775294828,7.07296085357666
-5.0,6.286080360412598
-6.840011949618013,4.744669437408447
-6.337242168318426,5.37935209274292
-5.0,4.911193370819092
-5.468521082957745,5.385337829589844
-5.0,5.027281284332275
-7.2441251443275085,7.09010648727417
-5.0,5.060102462768555
-8.024798037742148,7.485026836395264
-5.0,5.4842352867126465
-5.0,5.173309326171875
-5.0,5.720495223999023
-5.0,4.858772277832031
-5.300986568387119,5.630857944488525
-5.0,4.945892333984375
-5.0,4.864522933959961
-5.0,5.083861827850342
-6.17979854051436,7.892786502838135
-3.6020599913279625,4.019968509674072
-6.958607314841775,5.379764080047607
-6.83000246293343,7.760025501251221
-5.0,4.8863091468811035
-5.0,4.906286716461182
-4.0,5.078128337860107
-6.431798275933005,6.562366485595703
-5.0,4.848382949829102
-5.075720713938118,5.483726978302002
-5.0,5.184175968170166
-5.0,4.941718578338623
-5.0,5.141652584075928
-4.3979400086720375,4.619406700134277
-5.0,5.201507568359375
-8.119186407719209,5.683944225311279
-5.0,4.8071675300598145
-2.0,3.0086517333984375
-5.0,4.833076477050781
-7.346787486224656,5.432525157928467
-5.0,5.342411518096924
-8.468521082957745,8.591750144958496
-3.8239087409443187,4.141014575958252
-9.0,7.9245429039001465
-5.0,5.116030216217041
-8.853871964321762,6.391822338104248
-6.886056647693163,6.016547203063965
-5.0,5.7867937088012695
-5.0,5.300435543060303
-5.0,5.080409526824951
-6.086186147616283,8.728975296020508
-7.795880017344075,5.96337890625
-6.3872161432802645,8.41222095489502
-7.958607314841775,7.307114124298096
-5.0,5.410881519317627
-5.0,4.825798034667969
-5.0,4.8232808113098145
-6.443697499232712,5.731889724731445
-7.0,5.7775115966796875
-5.0,5.187069416046143
-5.0,4.827516078948975
-5.0,5.112771987915039
-6.017728766960431,5.213181495666504
-5.0,5.087503910064697
-5.0,4.812612056732178
-5.0,5.210050106048584
-5.0,5.088383674621582
-5.0,5.165947437286377
-5.958607314841775,6.161962032318115
-6.026872146400301,5.888630390167236
-9.019996628416253,7.009815692901611
-6.578396073130168,6.711340427398682
-5.0,5.713094234466553
-4.0,5.590290546417236
-5.0,4.999704837799072
-5.853871964321762,6.790219306945801
-6.522878745280337,5.708253383636475
-7.920818753952375,6.3778977394104
-4.651695136951839,6.24271297454834
-6.022276394711152,6.193636417388916
-5.0,5.174323081970215
-7.939302159646388,6.027568340301514
-6.920818753952375,6.122195720672607
-5.0,5.117626667022705
-3.568636235841013,3.9642958641052246
-5.0,6.374527454376221
-6.327902142064282,6.225256443023682
-4.494850021680094,4.587870121002197
-4.350762527650393,5.918947696685791
-5.0,5.155272006988525
-6.425968732272281,6.284041881561279
-5.698970004336019,6.228221416473389
-5.0,4.899143218994141
-6.43356250780493,5.657678127288818
-6.259637310505756,5.842522144317627
-5.0,5.127322673797607
-9.096910013008056,7.243174076080322
-5.0,4.953347682952881
-5.0,5.245024681091309
-4.13608262304214,3.8416318893432617
-5.0,5.249901294708252
-5.0,5.118463039398193
-5.0,5.147299289703369
-5.0,5.714710712432861
-5.0,5.15155029296875
-6.337242168318426,6.520784854888916
-8.744727494896694,6.361617565155029
-5.3006479845801415,6.4722161293029785
-5.958607314841775,4.967994213104248
-8.823908740944319,7.361663818359375
-6.638272163982407,6.534157752990723
-3.8297382846050425,4.182514667510986
-10.0,7.205794334411621
-5.0,6.100212574005127
-5.0,5.77241849899292
-5.920818753952375,5.476206302642822
-7.508638306165727,5.5083441734313965
-5.0,5.348546504974365
-5.0,4.9745192527771
-7.102372908709558,6.108290195465088
-4.638272163982407,4.5801897048950195
-5.0,4.885217189788818
-6.0,6.138168811798096
-9.500312917381596,6.551338195800781
-4.63781922340747,5.685929298400879
-5.0,5.21087121963501
-5.100000128334196,6.560890197753906
-7.769551078621726,6.661775588989258
-5.0,5.383638381958008
-7.568636235841012,5.75158166885376
-5.585026652029182,5.540776252746582
-5.0,5.231156349182129
-5.0,5.018540859222412
-5.0,5.258692741394043
-6.327902142064282,5.953855037689209
-5.0,4.843348026275635
-5.0,4.973877429962158
-3.8961962790440428,4.191620826721191
-5.096910013008056,5.9163498878479
-5.0,4.981451511383057
-5.0,5.246937274932861
-6.3979400086720375,5.840847492218018
-8.522878745280337,5.661773204803467
-5.0,5.2380690574646
-5.0,5.284525394439697
-5.0,4.837032794952393
-5.0,4.787339687347412
-4.756961951313706,5.589635372161865
-5.0,5.2584614753723145
-7.958607314841775,6.210363864898682
-6.850011543508524,6.429352283477783
-6.292429823902063,6.355706214904785
-7.0245681914907365,7.275905609130859
-6.425968732272281,6.1195549964904785
-5.0,5.078378677368164
-8.481486060122112,7.474991798400879
-5.0,4.93854284286499
-8.154901959985743,7.751574516296387
-5.533206497656464,6.050706386566162
-5.0,5.442323207855225
-5.119186407719209,5.234837055206299
-5.0,4.84098482131958
-6.259637310505756,6.18328857421875
-5.0,4.879754066467285
-6.6020599913279625,5.0850911140441895
-5.346787486224656,5.43280029296875
-5.0,5.130293369293213
-4.292429823902063,5.098159313201904
-7.700057099977233,6.813429355621338
-4.267606240177032,5.163079738616943
-5.0,5.306787967681885
-5.3979400086720375,5.279529094696045
-8.372890288788861,5.6766228675842285
-5.300986568387119,5.36595344543457
-6.823908740944319,6.3674139976501465
-10.136677139879545,9.589808464050293
-7.468521082957745,7.258306980133057
-7.537602002101044,6.221764087677002
-8.769551078621726,7.801445484161377
-7.795880017344075,5.574361801147461
-6.4089353929735005,5.922722339630127
-6.886056647693163,6.7478461265563965
-8.301029995663981,8.398125648498535
-5.886056647693163,4.932736873626709
-5.0,5.9556756019592285
-9.199970640755865,7.570984363555908
-5.0,5.171234130859375
-3.6798537138889458,3.5432469844818115
-5.0,5.061691761016846
-6.819988880942283,8.599747657775879
-5.0,4.853883743286133
-5.6399749108106025,6.59773588180542
-5.638272163982407,5.668036937713623
-4.2441251443275085,4.163991451263428
-7.255707016877324,5.704513072967529
-4.806875401645539,4.427890300750732
-7.657577319177793,7.577500820159912
-5.0,5.097133636474609
-5.0,5.369522571563721
-5.0,5.270864009857178
-6.568636235841012,7.693207740783691
-6.309803919971486,5.961947441101074
-6.036212172654444,5.415542125701904
-5.0,5.279282093048096
-5.0,5.43514347076416
-5.300986568387119,5.452877521514893
-9.275724130399212,5.710127353668213
-5.0,5.260866641998291
-6.823908740944319,5.511425495147705
-8.920818753952375,7.138330459594727
-5.0,5.0988030433654785
-6.760000207113128,7.152141094207764
-5.187064372416296,5.821029186248779
-5.0,5.19343376159668
-5.0,4.82503080368042
-5.0,5.313113212585449
-5.017728766960431,5.764593601226807
-5.0,5.494129657745361
-6.1771783546968955,4.5634589195251465
-5.0,5.24595308303833
-5.0,5.062114715576172
-4.301029995663981,4.962332248687744
-7.481486060122112,7.614247798919678
-3.769551078621726,3.5958986282348633
-5.0,4.809036731719971
-5.283162276700475,5.037564754486084
-7.920818753952375,8.039155006408691
-5.0,4.771320343017578
-5.96018944585165,6.874737739562988
-2.3010299956639813,2.8411574363708496
-9.199970640755865,9.361266136169434
-6.508638306165727,5.960978031158447
-6.823908740944319,5.705017566680908
-6.425968732272281,6.03843879699707
-5.0,5.8850932121276855
-6.259637310505756,5.747165679931641
-8.920818753952375,6.492464542388916
-5.0,5.498154163360596
-5.0,5.177821159362793
-5.0,5.4156084060668945
-6.481486060122112,6.271564960479736
-6.443697499232712,5.848588466644287
-9.397940008672037,7.448813438415527
-4.9399824574684,3.8686461448669434
-5.0,5.702316761016846
-5.0,5.2157368659973145
-5.0,5.041517734527588
-9.42021640338319,7.228273868560791
-6.0,6.210362911224365
-5.0,5.6309614181518555
-4.045757490560675,3.9515726566314697
-6.031517051446064,5.630305767059326
-5.721246399047171,6.180460453033447
-5.0,6.24928092956543
-6.259637310505756,5.577341556549072
-6.026872146400301,6.329460620880127
-7.318758762624412,5.752896785736084
-6.429457060118103,6.335700988769531
-5.0,4.807538986206055
-5.300986568387119,5.1475396156311035
-5.0,5.1313676834106445
-5.0,4.818437576293945
-5.0,4.760050296783447
-3.231361898752385,3.4721577167510986
-5.585026652029182,5.279109477996826
-5.0,4.922473430633545
-5.0,5.207706928253174
-5.0,5.376954078674316
-5.0,5.17233943939209
-5.0,5.453433513641357
-5.0,5.024631023406982
-5.0,5.243320941925049
-6.180456064458131,4.634467601776123
-5.300986568387119,5.216293811798096
-5.0,5.640345573425293
-6.1249387366083,6.7076735496521
-5.096910013008056,4.116059303283691
-5.0,5.046832084655762
-4.468521082957745,4.654371738433838
-4.0,6.0534586906433105
-5.0,5.052974700927734
-5.0,4.998845100402832
-5.0,5.243049144744873
-9.428291168191313,8.868414878845215
-5.0,5.2010178565979
-7.568636235841012,7.13008451461792
-5.300986568387119,5.506019115447998
-5.0,5.00325345993042
-6.8696662315049934,7.291824817657471
-5.0,5.00879430770874
-5.356547323513812,5.836207866668701
-5.703188607252017,5.376872539520264
-6.537602002101044,6.084279537200928
-5.431798275933005,4.862178325653076
-5.0,5.854981422424316
-5.0,4.803898334503174
-5.0,5.985098361968994
-4.109998386815364,5.948530197143555
-5.0,5.332019805908203
-5.0,5.673184394836426
-8.045757490560675,6.100723743438721
-5.070000019492822,4.926773548126221
-5.0,5.702910900115967
-5.0,5.162092208862305
-4.102372908709558,4.541024208068848
-5.0,5.003262996673584
-5.200000237109354,5.153244495391846
-5.0,4.957399845123291
-5.0,5.567533493041992
-5.7447274948966935,6.1450982093811035
-5.779734966412768,8.663162231445312
-5.0,5.265084266662598
-5.110026361596004,5.7569451332092285
-5.0,5.258909225463867
-5.0,5.982363224029541
-5.709965388637482,6.8297247886657715
-7.3979400086720375,8.977234840393066
-5.522878745280337,6.0044846534729
-4.886056647693163,5.627434253692627
-5.0,5.133236885070801
-7.823908740944319,8.05162239074707
-5.6020599913279625,4.758288860321045
-5.300986568387119,5.61664342880249
-2.6989700043360187,2.555086612701416
-6.275724130399211,5.233327388763428
-5.0,5.645901203155518
-5.300986568387119,4.999241828918457
-4.0,3.9689364433288574
-2.3010299956639813,3.1792545318603516
-7.309803919971486,5.43303108215332
-5.0,5.424378871917725
-7.443697499232712,4.926618576049805
-5.0,5.009274959564209
-5.0,4.964046001434326
-5.721246399047171,5.8776068687438965
-5.0,5.019897937774658
-5.0,5.049588680267334
-6.005023326350309,6.127445697784424
-5.300986568387119,5.7341718673706055
-8.468521082957745,7.910932540893555
-5.522878745280337,5.680690288543701
-5.795880017344075,6.041042804718018
-5.0,5.630327224731445
-5.59999938302362,5.449681758880615
-6.695940533782401,6.736385822296143
-2.0,4.071983337402344
-5.619788758288394,5.325485706329346
-6.508638306165727,5.1920061111450195
-5.0,4.986518383026123
-6.3979400086720375,6.014955043792725
-5.0,4.789056777954102
-5.0,5.174333095550537
-6.5951662833800615,7.182993412017822
-5.374147589576214,6.225502014160156
-5.0,4.707849025726318
-5.0,4.930338382720947
-5.0,5.124450206756592
-5.0,5.866384506225586
-5.0,4.950545787811279
-8.869666231504993,8.416035652160645
-8.301029995663981,8.419240951538086
-6.318758762624412,5.739468097686768
-5.0,5.375675678253174
-5.300986568387119,7.007965564727783
-5.0,5.281535625457764
-3.0268721464003017,4.64648962020874
-5.0,4.7938313484191895
-5.0,4.850203037261963
-6.337242168318426,5.6032185554504395
-5.0,5.0448431968688965
-5.0,4.939966201782227
-6.173925197299173,5.543385028839111
-6.823908740944319,5.2112040519714355
-6.346787486224656,5.172347545623779
-6.571865205971211,5.988204002380371
-5.102372908709558,5.3451337814331055
-6.187086643357144,5.979304790496826
-5.0,4.884146213531494
-6.920818753952375,5.574648380279541
-5.0,5.013156414031982
-7.236572006437063,5.863711833953857
-5.0,5.021969318389893
-5.0,5.090101718902588
-5.0,5.270789623260498
-5.0,4.991852283477783
-7.346787486224656,7.34316873550415
-4.519993057042849,5.2533745765686035
-5.0,4.81405782699585
-5.0,4.809383869171143
-5.0,5.356025218963623
-2.3010299956639813,2.8427419662475586
-5.0,5.174026012420654
-5.0,5.153610706329346
-7.750068243365805,6.8396315574646
-5.300986568387119,5.862429141998291
-5.0,5.4756083488464355
-5.0,5.932861804962158
-5.0,5.010369777679443
-7.886056647693163,6.042356967926025
-5.0,4.7732625007629395
-5.0,5.490772724151611
-5.0,5.264571666717529
-5.0,4.818761348724365
-5.0,5.004338264465332
-5.0,4.955109119415283
-5.0,5.802642822265625
-8.221848749616356,6.460597515106201
-6.229884705212898,6.04050874710083
-5.0,4.8827667236328125
-5.721246399047171,6.553925037384033
-6.060480747381382,5.884307861328125
-5.0,5.071181774139404
-5.0,5.2339630126953125
-4.5642989366267885,5.716606616973877
-5.0,5.048859119415283
-6.638272163982407,5.9365668296813965
-5.0,5.257442474365234
-5.0,4.854139804840088
-4.464705879957229,3.854426145553589
-5.0,4.914454460144043
-5.0,5.001254081726074
-5.130768280269024,5.253185749053955
-5.0,5.1991400718688965
-5.0,5.477828502655029
-7.508638306165727,8.316054344177246
-8.050609993355087,7.012876033782959
-8.500312917381596,9.011847496032715
-6.213958789757446,8.0719633102417
-5.59999938302362,7.189315319061279
-2.6777807052660805,4.492598056793213
-5.0,5.329636573791504
-6.0,5.190099239349365
-5.30163843394489,5.971878528594971
-5.28274568723745,5.534050941467285
-8.580044251510243,7.875124454498291
-7.958607314841775,6.486008167266846
-7.79997073344623,9.01393985748291
-5.0,5.2581634521484375
-5.619788758288394,5.751807689666748
-5.6777807052660805,6.029545307159424
-5.0,7.112030506134033
-6.251811972993799,5.482142448425293
-5.795880017344075,6.000159740447998
-5.0,5.235752582550049
-5.4800408192479315,5.323115825653076
-7.008773924307505,5.915008068084717
-5.0,5.014719486236572
-5.0,5.890063762664795
-5.0,5.431508541107178
-4.707123950691122,5.564145088195801
-5.0,5.4228925704956055
-5.0,5.892598628997803
-6.657577319177793,7.611709117889404
-5.1249387366083,6.396457672119141
-5.443576878628715,5.926496505737305
-5.0,5.895275115966797
-5.0,5.249146938323975
-4.6020599913279625,3.328242301940918
-5.0,4.812976360321045
-5.0,5.3201375007629395
-5.0,4.977674961090088
-5.187086643357144,5.445918083190918
-7.823908740944319,7.624820232391357
-5.0,5.4118523597717285
-5.0,5.469759464263916
-5.0,5.013207912445068
-5.0,5.155331134796143
-8.086186147616283,5.565608024597168
-5.0,5.041806697845459
-5.0,5.442532062530518
-5.0,4.961981296539307
-7.494850021680094,6.213512420654297
-5.0,4.933120250701904
-5.0,4.97650671005249
-5.853871964321762,7.280093193054199
-6.0,5.889145374298096
-5.0,5.11444616317749
-6.292429823902063,8.31954574584961
-7.568636235841012,7.19807767868042
-5.0,5.656153202056885
-6.0,6.189725875854492
-7.299988937677888,6.2509541511535645
-5.0,5.331653594970703
-5.183758700008217,5.271859645843506
-5.0,5.276855945587158
-7.142667503568731,5.170945644378662
-5.769551078621726,5.787727355957031
-5.8326826652518236,6.356169700622559
-5.0,5.302186012268066
-5.0,5.402987003326416
-5.0,4.944710731506348
-6.657577319177793,6.446500301361084
-3.6989700043360187,3.638118028640747
-6.2441251443275085,5.678093433380127
-5.0,5.202918529510498
-5.0,5.405811786651611
-6.2839966563652006,5.221287250518799
-5.609948503541013,4.840369701385498
-5.0,5.160731315612793
-5.300986568387119,5.800405025482178
-5.0,4.927994251251221
-5.0,5.4453301429748535
-5.0,5.182094097137451
-5.0,4.9058051109313965
-7.189969213594161,8.521939277648926
-4.958607314841775,6.363318920135498
-5.0,5.478048324584961
-5.0,5.25488805770874
-8.698970004336019,6.25513219833374
-5.139661993429007,6.387739658355713
-5.0,5.026065349578857
-4.638272163982407,3.7285404205322266
-6.041436116778033,5.821528911590576
-5.0,5.193993091583252
-5.282329496997738,5.789846897125244
-4.760000207113128,5.579472541809082
-5.0,5.600405216217041
-6.0,5.911915302276611
-5.0,4.974094867706299
-5.0,4.900889873504639
-8.18045606445813,5.984320640563965
-5.0,5.926366806030273
-4.853871964321762,4.583828449249268
-5.0,5.687644958496094
-5.0,5.0858073234558105
-5.0,4.963552951812744
-6.795880017344075,6.253824710845947
-5.0,5.471426010131836
-6.537602002101044,5.731979846954346
-6.672981822384312,5.796493053436279
-3.0,2.7822399139404297
-5.026872146400301,4.781989574432373
-5.0,5.252382278442383
-7.16962521680645,6.613119602203369
-5.769551078621726,5.104605197906494
-5.0,5.0060648918151855
-5.0,5.081488132476807
-4.105683937315561,5.0864715576171875
-5.0,5.433833599090576
-5.0,5.174168586730957
-5.356547323513812,5.10857629776001
-5.0,5.316193103790283
-5.0,5.040781021118164
-5.0,5.187183856964111
-9.0,5.308297634124756
-5.0,5.018564224243164
-5.0,4.918488025665283
-5.0,5.844597816467285
-5.0,5.347878932952881
-5.0,5.567429542541504
-5.0,5.30370569229126
-7.7447274948966935,6.670085430145264
-3.6989700043360187,4.99124002456665
-6.096910013008056,5.805102825164795
-5.0,4.87296199798584
-7.552841968657781,7.594985485076904
-6.0,5.843860149383545
-7.1249387366083,5.960961818695068
-5.300986568387119,5.45806360244751
-5.0,5.7639007568359375
-5.0,5.171563148498535
-5.50003813440381,6.7270188331604
-6.200659450546418,6.3418450355529785
-6.853871964321762,6.765898704528809
-4.920818753952375,4.584947109222412
-4.0,4.900702476501465
-5.0,5.073638439178467
-5.0,4.850503444671631
-6.211124884224583,7.4203057289123535
-5.756837884898949,6.991633892059326
-6.4089353929735005,5.7740092277526855
-5.0,5.237954616546631
-5.0,4.848282337188721
-5.3979400086720375,6.5044684410095215
-5.0,5.044628620147705
-5.958607314841775,5.166921138763428
-4.055517327849832,4.477065086364746
-6.4089353929735005,5.720398426055908
-7.010016541698601,6.440611839294434
-5.167491087293763,4.94373083114624
-6.987162775294828,6.205454349517822
-5.0,5.220139980316162
-3.899998417198648,4.466958522796631
-7.00436480540245,7.681624889373779
-5.0,5.017914772033691
-5.0,4.946043491363525
-7.161150909262744,5.527862071990967
-5.920818753952375,5.351736545562744
-5.0,5.368597507476807
-6.468521082957745,4.61963415145874
-5.0,5.436387538909912
-8.537602002101044,6.576054573059082
-5.0,4.993967533111572
-5.0,5.123317241668701
-6.055517327849831,5.153689861297607
-5.0,5.162943363189697
-6.698970004336019,5.74736213684082
-6.6020599913279625,6.398259162902832
-5.0,4.967160224914551
-5.920818753952375,5.222930431365967
-9.101092072991483,8.932106018066406
-5.0,5.112920761108398
-5.6777807052660805,5.894192218780518
-8.221848749616356,5.816840648651123
-5.0,5.405357837677002
-6.0,6.165964603424072
-9.55284196865778,8.348958015441895
-5.0,5.015653133392334
-3.2380721615794705,3.662473678588867
-5.0,5.249127388000488
-5.0,5.381495952606201
-5.0,5.078523635864258
-7.017728766960431,5.949132442474365
-5.0,4.909865856170654
-7.187086643357144,6.531062602996826
-5.619788758288394,6.183677673339844
-4.499999953328896,4.698126316070557
-5.1220530483708115,5.876757621765137
-5.0,4.788614749908447
-5.0,5.039638996124268
-5.441291429466834,6.705882549285889
-7.199970640755866,6.259756565093994
-5.0,5.006141185760498
-6.455931955649724,5.431907653808594
-7.292429823902063,6.20194149017334
-5.0,4.9622931480407715
-5.0,5.231043815612793
-5.2441251443275085,5.4439377784729
-11.045757490560675,11.253095626831055
-8.400116927926312,8.178912162780762
-4.711080394338273,4.318505764007568
-5.0,4.85537576675415
-6.3872161432802645,5.844571590423584
-5.0,5.107975482940674
-6.698970004336019,7.8821024894714355
-5.0,5.223525524139404
-5.0,5.649838924407959
-5.0,5.0003342628479
-5.0,5.872438907623291
-5.0,5.165407657623291
-8.301029995663981,7.711080551147461
-5.0,5.2916717529296875
-8.102372908709558,7.384164333343506
-7.92009553233328,8.401686668395996
-5.0,5.445645809173584
-5.0,5.064145088195801
-7.0400051616715835,7.724643230438232
-5.0,5.412103652954102
-5.2441251443275085,5.808938026428223
-8.301029995663981,8.771903038024902
-5.0,5.076921463012695
-5.769551078621726,6.4948906898498535
-5.110698297493689,5.14375114440918
-3.4089353929735005,3.3986928462982178
-5.0,5.145279407501221
-4.471494660853648,4.62907075881958
-6.4089353929735005,5.363328456878662
-5.0,5.166338920593262
-5.42021640338319,4.9997477531433105
-5.0,4.930200099945068
-6.036212172654444,6.730391502380371
-5.8343106239823825,6.062206745147705
-5.3979400086720375,6.053112506866455
-5.0,5.131428241729736
-5.0,5.35679817199707
-8.744727494896694,6.1629958152771
-6.920818753952375,5.997912883758545
-6.292429823902063,6.2221999168396
-4.0,3.8334360122680664
-5.0,5.626811981201172
-5.0,5.088653564453125
-7.301029995663981,8.073724746704102
-6.687188173787912,5.391215801239014
-5.958607314841775,6.234490871429443
-5.214670164989233,5.28659200668335
-6.0,7.758701324462891
-6.537602002101044,6.409563064575195
-5.0,6.29610013961792
-6.0,6.479920864105225
-5.0,4.988199710845947
-5.0,5.2596116065979
-5.0,5.124110698699951
-7.431798275933005,6.645918846130371
-5.0,5.173529148101807
-5.0,5.108582496643066
-6.881625032894089,7.439561367034912
-9.698970004336019,9.594889640808105
-5.0,5.4650702476501465
-5.0,4.901977062225342
-5.0,5.326705455780029
-8.301029995663981,8.402084350585938
-6.769551078621726,6.052798271179199
-8.899629454882437,9.395370483398438
-5.300986568387119,5.840354919433594
-3.6197887582883936,4.052311897277832
-5.0,5.067310333251953
-5.9511699134716505,7.958217144012451
-5.0,5.345370769500732
-5.0,5.122359752655029
-5.0,5.343319416046143
-8.200659450546418,5.095071792602539
-5.0,5.005847454071045
-5.0,4.815286159515381
-3.900000004068662,4.38023042678833
-8.558894271120508,6.658173084259033
-5.0,5.30396842956543
-6.425968732272281,6.469731330871582
-5.0,4.860178470611572
-5.0,5.259336948394775
-7.1249387366083,6.760271072387695
-7.3979400086720375,7.177598476409912
-8.259637310505756,7.288321018218994
-5.0,5.4430975914001465
-5.0,5.024577617645264
-8.769551078621726,5.099473476409912
-5.853871964321762,5.256128787994385
-5.0,5.333597183227539
-5.0,4.811434268951416
-5.0,5.598230838775635
-5.0,5.117082118988037
-5.75448733218585,5.973333835601807
-7.585026652029182,4.689577102661133
-5.0,5.237220287322998
-5.0,5.444274425506592
-5.0,5.034006595611572
-5.0,5.4074625968933105
-6.455931955649724,7.5450053215026855
-4.0,4.969738960266113
-5.0,5.201736927032471
-5.769551078621726,6.7368059158325195
-3.0,3.9020042419433594
-5.0,5.315470218658447
-5.0,5.132440090179443
-5.0,4.96521520614624
-5.0,5.068588733673096
-5.823908740944319,6.026717662811279
-5.0,4.875909805297852
-8.031517051446064,7.186631679534912
-5.0,5.711822986602783
-5.0,4.785760402679443
-5.0,5.845708847045898
-5.0,4.962707042694092
-7.823908740944319,5.847733497619629
-5.522878745280337,5.4315996170043945
-6.511449283499555,5.672472953796387
-5.0,6.196059703826904
-5.0,5.093582630157471
-5.0,5.3404860496521
-5.0,5.272204875946045
-5.7447274948966935,6.103199005126953
-5.0,4.8655171394348145
-5.0,5.234692096710205
-5.958607314841775,6.01580286026001
-5.0,5.093832015991211
-5.0,5.160534858703613
-5.0,5.147034168243408
-4.499999953328896,4.050564765930176
-4.301029995663981,5.360721111297607
-5.0,5.219970226287842
-5.0,5.104884624481201
-5.0,5.071752071380615
-5.0,4.992817401885986
-5.0,5.359623908996582
-6.004364805402449,5.24785852432251
-8.886056647693163,7.090719699859619
-6.229147988357855,5.243574619293213
-6.71556926615548,5.56130313873291
-6.698970004336019,6.070887565612793
-5.430041181903405,5.359100818634033
-5.0,5.033207893371582
-5.0,5.385033130645752
-6.7447274948966935,4.801537990570068
-6.0,6.531641483306885
-6.650722472532045,5.478761672973633
-5.0,5.135817050933838
-5.0,5.280045986175537
-5.929999096197655,6.113644599914551
-7.886056647693163,5.650580883026123
-5.0,5.01563024520874
-5.0,5.408802509307861
-5.0,5.41973876953125
-7.3872161432802645,5.405290126800537
-5.0,5.243277549743652
-5.0,5.117043972015381
-6.769551078621726,5.837458610534668
-6.657577319177793,5.570028781890869
-5.0,5.52214241027832
-5.0,5.407607078552246
-5.7447274948966935,6.226678371429443
-5.2839966563652006,5.594107151031494
-5.920818753952375,6.14723539352417
-5.0,5.384781360626221
-6.6595558851598815,6.567533016204834
-5.0,5.3876729011535645
-4.0,5.17681360244751
-5.0,5.7510085105896
-5.0,5.2696332931518555
-4.823908740944319,5.093470573425293
-4.519993057042849,5.509888172149658
-6.356547323513812,5.348581790924072
-5.0,5.414509296417236
-5.0,5.193276882171631
-5.0,5.3735032081604
-7.346787486224656,6.869328022003174
-5.0,4.797567844390869
-6.657577319177793,5.587148189544678
-5.0,5.09309196472168
-5.6020599913279625,5.398378849029541
-5.0,5.375845432281494
-5.0,5.175808429718018
-8.769551078621726,8.126594543457031
-8.602059991327963,5.082173824310303
-8.801342913045577,8.607938766479492
-7.376750709602099,5.595103740692139
-5.300986568387119,5.200920581817627
-5.0,5.761597633361816
-5.0,5.155359745025635
-5.0,5.502020359039307
-5.0,5.020148754119873
-5.0,4.872622013092041
-7.886056647693163,6.914205074310303
-5.0,4.916614532470703
-8.500312917381596,8.22849178314209
-5.638272163982407,5.8196892738342285
-5.0,5.067770481109619
-9.301029995663981,7.696317195892334
-6.236572006437063,6.367546558380127
-5.0,5.064499378204346
-5.795880017344075,5.716225624084473
-4.675717544702307,5.251688480377197
-5.255707016877324,5.527174472808838
-5.0,5.476754665374756
-5.619788758288394,5.724879264831543
-4.0,3.7699947357177734
-9.300162274132754,8.11463737487793
-5.0,5.113155364990234
-5.0,4.907180309295654
-7.853871964321762,8.32686996459961
-6.619788758288394,6.724217891693115
-5.59999938302362,5.220141410827637
-5.0,4.973686218261719
-5.0,5.226039409637451
-5.0,6.142102241516113
-5.0,5.021017551422119
-5.0,5.168406009674072
-5.0,6.422426700592041
-6.1249387366083,6.344643592834473
-8.920818753952375,6.627655506134033
-5.0,5.3953166007995605
-5.0,5.157298564910889
-5.0,5.314987659454346
-5.0,4.994284152984619
-5.0,4.95842981338501
-8.769551078621726,8.145813941955566
-5.0,5.2248616218566895
-5.0,5.899356365203857
-5.0,5.028440952301025
-6.0,5.6705002784729
-5.026872146400301,5.701004981994629
-5.0,4.8119378089904785
-4.351639989019068,5.639280319213867
-5.0,5.364358901977539
-5.0,5.005136489868164
-5.0,5.531453609466553
-6.275724130399211,6.466330051422119
-5.0,5.757818698883057
-5.0,5.151895999908447
-5.552841968657781,4.999074935913086
-3.1249387366083,3.501171112060547
-5.0,5.194656848907471
-2.8239087409443187,2.8002681732177734
-5.300986568387119,5.233858585357666
-6.455931955649724,5.954751968383789
-5.795880017344075,5.5855937004089355
-5.0,5.152584075927734
-6.040958607678906,5.509671211242676
-5.0,5.272383689880371
-5.0,5.198124408721924
-7.6777807052660805,6.429399490356445
-4.920818753952375,4.797579288482666
-7.142667503568731,5.956796169281006
-6.17000191130262,5.722680568695068
-4.619788758288394,3.747467279434204
-5.0,4.970694065093994
-6.795880017344075,6.488307952880859
-5.568636235841012,5.047201633453369
-4.990280055295387,5.752780914306641
-5.0,4.953514575958252
-7.720105019988361,7.534866809844971
-5.0,5.426018238067627
-5.0,4.817775249481201
-5.0,4.962680339813232
-6.0,6.305262565612793
-7.958607314841775,6.8189568519592285
-6.008773924307505,5.860219955444336
-5.327902142064282,5.1425652503967285
-5.508638306165727,5.487430572509766
-5.031517051446064,5.667798042297363
-7.6777807052660805,7.944918155670166
-5.0,5.169944763183594
-5.3979400086720375,5.242167949676514
-6.4698003017969175,6.5585246086120605
-5.0,5.050327777862549
-5.0,5.084598064422607
-6.327902142064282,6.299387454986572
-5.0,4.816665172576904
-6.367542707815275,5.59894323348999
-5.0,5.404141902923584
-9.189767482004916,8.387868881225586
-7.6020599913279625,7.457732200622559
-8.0,7.4748711585998535
-6.0,6.3244452476501465
-5.7447274948966935,6.161791801452637
-5.0,5.062462329864502
-8.0,6.992431640625
-5.0,4.917568206787109
-5.0,5.710384368896484
-5.694218848745018,5.764504432678223
-5.500312917381596,6.2742414474487305
-8.199970640755865,7.250127792358398
-8.769551078621726,6.642147541046143
-5.0,5.268735885620117
-5.0,4.955785274505615
-5.0,5.532106876373291
-5.849857838151442,7.114037990570068
-4.309803919971486,4.594200134277344
-5.0,4.954929828643799
-6.0,5.861169338226318
-3.632644078973981,3.587862968444824
-5.0,5.445091724395752
-5.0,5.164493560791016
-5.0,4.963465690612793
-5.6777807052660805,5.260183811187744
-5.161150909262744,4.955074787139893
-8.769551078621726,7.307010650634766
-5.0,5.379759311676025
-5.0,4.759841442108154
-5.0,5.045032501220703
-5.0,5.51852560043335
-7.080921907623926,7.529832363128662
-6.496209316942819,7.597205638885498
-3.7447274948966935,6.8452067375183105
-8.050609993355087,7.565764904022217
-6.5638373529592435,6.000101566314697
-4.920818753952375,7.525467395782471
-5.0,4.979029178619385
-5.300986568387119,5.184329032897949
-5.823908740944319,5.5390543937683105
-5.0,5.26556921005249
-8.468521082957745,6.2373366355896
-5.576754126063192,6.412661075592041
-8.657577319177793,7.033421039581299
-8.821023052706831,8.558592796325684
-5.0,4.993164539337158
-5.0,5.079413890838623
-5.0,4.9756340980529785
-6.207608310501746,6.5735039710998535
-3.6989700043360187,4.561478137969971
-5.0,5.010992527008057
-7.823908740944319,5.814510822296143
-6.130000141365475,5.616873741149902
-6.721246399047171,5.219736576080322
-5.0,5.072618007659912
-5.0,5.530069828033447
-5.0,6.21563720703125
-5.0,5.221885681152344
-5.721246399047171,4.999545097351074
-4.669992299127241,6.033151149749756
-5.0,5.938671588897705
-6.0,6.2574849128723145
-6.229147988357855,5.773561000823975
-7.271524470237404,6.415259838104248
-8.301029995663981,8.70295524597168
-5.0,5.005308628082275
-5.200000237109354,5.277423858642578
-5.0,4.815418720245361
-5.0,5.837366580963135
-5.0,4.952700138092041
-5.0,5.828684329986572
-5.0,5.295522689819336
-5.657577319177793,5.518399715423584
-5.0,4.933688640594482
-6.366531544420413,5.018424034118652
-7.229147988357855,5.977601528167725
-5.0,5.833913326263428
-5.0,5.344968795776367
-8.187086643357144,5.6733222007751465
-2.200659450546418,5.772970199584961
-5.0,4.750861167907715
-5.0,4.744801044464111
-3.9586073148417746,4.011351108551025
-8.522878745280337,7.319896221160889
-8.031517051446064,5.807083606719971
-5.0,5.785982608795166
-4.579994715040948,5.711170196533203
-6.431798275933005,6.237002372741699
-6.0,6.20245885848999
-5.0,6.056156158447266
-5.0,4.71321964263916
-5.0,5.5992889404296875
-5.0,5.1322784423828125
-5.0,5.397928714752197
-5.800000874803203,7.6564741134643555
-5.0,5.208184242248535
-5.57170318601712,6.087910175323486
-5.0,5.025333881378174
-6.442492798094342,6.15061616897583
-5.0,5.01083517074585
-8.346787486224656,6.608004093170166
-6.799998134593398,6.9495768547058105
-8.00943917000598,6.8106279373168945
-6.425968732272281,6.03843879699707
-4.7447274948966935,5.700768947601318
-3.809668301829708,3.398056983947754
-5.0,5.135149955749512
-6.107905397309519,5.378256320953369
-6.537602002101044,6.547055721282959
-6.653647025549361,6.3294596672058105
-5.0,4.92412805557251
-5.0,5.345963001251221
-5.0,5.230264663696289
-5.698970004336019,5.001526355743408
-5.0,5.087546348571777
-5.0,4.977075576782227
-9.410050398674292,4.826509952545166
-9.0,5.589054107666016
-5.0,4.916536808013916
-8.657577319177793,6.8499579429626465
-5.920818753952375,5.98049783706665
-8.017728766960431,7.482901096343994
-5.920818753952375,5.692517280578613
-4.663540266151471,4.6205339431762695
-5.0,4.976035118103027
-5.0,4.944361209869385
-5.0,4.751925468444824
-5.638272163982407,5.257145404815674
-7.774303128349345,7.0448455810546875
-5.0,4.995118141174316
-5.0,4.889949798583984
-3.0,4.45126485824585
-5.0,5.103658199310303
-5.0,4.941781520843506
-4.519993057042849,6.197976589202881
-5.0,5.2622528076171875
-5.0,6.022859573364258
-9.886056647693163,9.189004898071289
-5.0,4.844318389892578
-7.657577319177793,6.292544841766357
-3.9586073148417746,4.0891804695129395
-7.42021640338319,8.1741304397583
-6.0800019690359814,7.022055149078369
-4.200000030616179,5.236514568328857
-5.769551078621726,6.433974742889404
-8.301029995663981,6.227112293243408
-3.8466933796946385,4.996757984161377
-5.0,5.246163845062256
-6.142667503568731,5.44529390335083
-10.55284196865778,8.135129928588867
-6.83000246293343,6.576762676239014
-5.0,5.27880334854126
-8.301029995663981,8.425249099731445
-5.0,4.8246636390686035
-3.5228787452803374,4.423713207244873
-5.0,4.968563556671143
-8.397940008672037,5.188168048858643
-5.0,5.311110019683838
-5.0,4.911888599395752
-5.0,5.2323832511901855
-5.0,4.891371250152588
-6.251811972993799,5.014707088470459
-5.0,5.487804889678955
-6.065501548756432,6.0386552810668945
-7.481486060122112,6.778253078460693
-5.0,5.209173679351807
-5.0,5.148514270782471
-5.0,5.284441947937012
-7.100015437450609,7.0643229484558105
-5.0,4.963688850402832
-5.0,5.025820255279541
-5.0,5.041717052459717
-5.0,5.104677200317383
-5.300986568387119,5.703580379486084
-8.886056647693163,7.724026679992676
-5.0,4.964267253875732
-9.698970004336019,5.22391414642334
-5.522878745280337,5.098606586456299
-5.0,4.956077575683594
-3.221848749616356,3.5940074920654297
-5.0,4.897047996520996
-5.0,4.915252208709717
-5.0,5.086899757385254
-5.3400001801593495,5.104393005371094
-6.51999305704285,6.144221305847168
-5.0,5.095145225524902
-9.0,8.477510452270508
-8.886056647693163,8.496992111206055
-7.102372908709558,8.237449645996094
-5.0,5.093216419219971
-5.0,5.052772045135498
-8.769551078621726,7.537952899932861
-7.769551078621726,5.952871799468994
-7.075720713938118,6.18436861038208
-5.0,4.988851070404053
-5.309803919971486,5.714850902557373
-3.920818753952375,5.307870388031006
-6.080921907623926,5.0584845542907715
-4.823908740944319,4.912919521331787
-5.522878745280337,5.245217323303223
-7.0915149811213505,7.30007791519165
-9.698970004336019,7.70999002456665
-5.0,5.59063196182251
-5.0,5.157333850860596
-5.301029995663981,6.146848201751709
-5.0,4.834603786468506
-6.2403321553103694,6.285133361816406
-5.0,5.431924343109131
-4.958607314841775,8.309042930603027
-8.096910013008056,7.0513834953308105
-5.0,5.663698673248291
-8.094204119632131,6.441246509552002
-5.0,5.257519245147705
-6.443697499232712,6.041444301605225
-6.619788758288394,5.737330436706543
-4.0,5.2515153884887695
-5.0,5.4656267166137695
-5.0,5.120339393615723
-5.0,5.844966888427734
-5.2839966563652006,5.672153472900391
-3.0,4.133906841278076
-4.721246399047171,8.274680137634277
-5.275724130399211,5.7594523429870605
-6.3979400086720375,7.235824108123779
-5.823908740944319,6.161900520324707
-5.0,5.191659450531006
-8.045757490560675,7.593785762786865
-5.0,5.520127296447754
-5.0,4.827547073364258
-8.0,7.150343418121338
-8.958607314841775,7.591320514678955
-5.0,4.926950454711914
-7.173925197299173,7.376440048217773
-5.0,5.800097942352295
-5.0,5.0721755027771
-7.537602002101044,7.194480895996094
-3.721246399047171,4.614230632781982
-6.97061622231479,5.66860818862915
-8.801342913045577,8.660990715026855
-9.354086724966155,8.551732063293457
-5.0,5.063394069671631
-5.0,5.343177318572998
-8.014124642691606,5.914011001586914
-5.823908740944319,5.614449501037598
-4.431798275933005,5.399740219116211
-5.0,5.523101329803467
-7.669992299127241,7.876754283905029
-8.600326278518962,8.911138534545898
-5.0,4.998524188995361
-5.0,5.21028470993042
-5.0,5.205883502960205
-4.0,5.5653300285339355
-5.0,4.884478569030762
-5.0,5.991556644439697
-5.0,5.158407688140869
-5.0,5.222659587860107
-5.260032303240491,5.651514053344727
-6.657577319177793,5.8857598304748535
-6.657577319177793,5.953274250030518
-5.0,5.044588565826416
-5.0,4.75746488571167
-5.0,5.156106472015381
-5.0,5.0899786949157715
-5.0,6.030486583709717
-6.920818753952375,5.877313137054443
-6.3979400086720375,6.2244062423706055
-5.300986568387119,4.993781089782715
-5.0,4.942495346069336
-7.154901959985743,6.515183925628662
-5.0,5.262721061706543
-5.0,5.115732669830322
-5.0,5.045731067657471
-7.969805214643249,8.19564151763916
-5.0,5.94110631942749
-5.0,4.803891658782959
-5.0,5.332106113433838
-5.0,5.08882999420166
-6.267606240177031,6.733867168426514
-5.0,4.6882004737854
-6.173925197299173,5.93046236038208
-5.0,5.2404913902282715
-9.080921907623926,5.933075428009033
-6.301029995663981,6.746427536010742
-5.0,5.250390529632568
-6.657577319177793,6.260311603546143
-5.0,5.859400272369385
-5.251811972993799,5.49330997467041
-5.0,4.690924167633057
-7.026872146400302,6.041360378265381
-4.119186407719209,3.564913034439087
-5.221848749616356,4.890788555145264
-5.0,5.196617603302002
-5.0,5.300342082977295
-9.049999969853415,6.970533847808838
-5.0,5.087791919708252
-6.698970004336019,7.324282169342041
-6.3979400086720375,5.343053817749023
-8.318758762624412,5.773708343505859
-5.899998417198648,6.5471577644348145
-5.6777807052660805,6.142171382904053
-6.2839966563652006,6.199019432067871
-5.0,5.819672107696533
-5.0,4.7061896324157715
-7.275724130399211,6.903720378875732
-7.337242168318426,6.030652046203613
-5.795880017344075,5.591618061065674
-7.651695136951839,6.893815040588379
-10.698970004336019,9.212380409240723
-5.522878745280337,5.734774589538574
-8.301029995663981,8.075956344604492
-5.0,4.994051933288574
-7.721246399047171,4.985424518585205
-6.6777807052660805,5.82790470123291
-5.0,5.7590742111206055
-5.0,4.9931488037109375
-5.721246399047171,5.373821258544922
-5.619788758288394,4.9741034507751465
-5.0,5.290607929229736
-6.0,7.51142692565918
-5.0,5.066425800323486
-5.0,4.675662040710449
-4.824386727815415,5.588067054748535
-5.0,5.279249668121338
-4.0,3.44155216217041
-6.698970004336019,6.325687885284424
-5.0,5.279037952423096
-5.0,4.9013285636901855
-5.0,5.116431713104248
-6.924234121784266,6.697852611541748
-7.259637310505756,7.566251754760742
-7.721246399047171,7.079537868499756
-5.140021558357979,6.410482406616211
-5.200659450546418,5.824333667755127
-5.0,4.977912425994873
-7.721246399047171,7.6131157875061035
-5.0,5.098683834075928
-6.6020599913279625,5.394084453582764
-5.0,5.073997974395752
-5.0,5.144833087921143
-5.0,4.9391188621521
-5.0,4.947874546051025
-6.200659450546418,5.274799823760986
-5.0,5.448871612548828
-6.013228265733755,5.670613765716553
-7.229147988357855,6.392508506774902
-7.585026652029182,5.461801052093506
-6.142667503568731,5.459173679351807
-5.0,4.950533390045166
-5.0,5.790876865386963
-5.0,5.282256603240967
-7.7447274948966935,5.518172740936279
-6.769551078621726,6.463943004608154
-9.045757490560675,7.16790246963501
-4.0,4.010998249053955
-5.0,5.4371819496154785
-5.0,5.376835823059082
-5.795880017344075,5.513552188873291
-7.113509274827518,6.850449562072754
-5.0,5.342209339141846
-5.0,5.071014881134033
-8.301029995663981,7.960960865020752
-6.494850021680094,5.820868015289307
-5.0,5.003994464874268
-8.522878745280337,4.688141345977783
-3.6197887582883936,3.6402547359466553
-6.366531544420413,5.850803852081299
-5.0,5.166213512420654
-5.0,4.950340747833252
-5.0,4.9446187019348145
-6.200659450546418,5.970030307769775
-7.211124884224583,6.16842794418335
-5.0,5.284982681274414
-7.903089986991944,7.91246223449707
-5.0,5.167792320251465
-5.0,4.86108922958374
-5.0,5.3163838386535645
-5.0,5.099545001983643
-5.958607314841775,5.210170269012451
-8.920818753952375,8.121781349182129
-5.0,4.92473840713501
-5.0,5.337692737579346
-5.0,5.141822814941406
-5.366531544420413,5.2773237228393555
-2.6989700043360187,2.6790690422058105
-5.0,5.139274597167969
-7.950007143079858,6.91587495803833
-5.300986568387119,5.085057735443115
-5.0,5.289755821228027
-5.0,5.738104820251465
-5.0,4.75465202331543
-5.0,5.297434329986572
-5.0,5.560800075531006
-3.6989700043360187,3.972818613052368
-5.0,5.058317184448242
-6.359518563029578,7.105632305145264
-7.356547323513812,6.292101860046387
-5.0,5.026486873626709
-5.0,5.040207862854004
-5.0,5.052870273590088
-6.207608310501746,5.3315815925598145
-5.366531544420413,6.121949672698975
-6.130768280269024,5.899299621582031
-5.0,5.0154008865356445
-6.435333935747911,6.692006587982178
-6.861697301833718,6.985074520111084
-8.728563149391121,7.257384777069092
-5.0,5.169723033905029
-5.0,5.246730804443359
-5.0,5.6675944328308105
-4.840011949618013,4.703450679779053
-5.045757490560675,4.659016132354736
-5.0,4.817991256713867
-5.0,5.016574382781982
-9.568636235841012,9.530159950256348
-7.468521082957745,7.62730598449707
-5.0,4.813582897186279
-5.0,4.875911712646484
-7.251811972993799,6.532395362854004
-9.619788758288394,9.776320457458496
-5.698970004336019,6.207833290100098
-7.3979400086720375,8.033890724182129
-5.0,5.069140911102295
-8.301029995663981,8.011090278625488
-4.698970004336019,5.426332950592041
-5.0,5.068814277648926
-6.679853713888946,6.369081974029541
-5.0,5.128637790679932
-5.0,5.140191555023193
-6.0,6.074447154998779
-9.0,5.31803560256958
-7.221848749616356,7.136690616607666
-5.4736607226101555,6.633568286895752
-5.0,5.609022617340088
-5.0,5.335656642913818
-5.0,5.108582496643066
-5.0,4.940178871154785
-5.954872693431973,7.2171630859375
-4.568636235841013,5.42686128616333
-5.0,4.99787712097168
-4.214670164989233,6.628601551055908
-5.0,5.122524738311768
-4.980011840408714,5.791409015655518
-5.0,5.218789577484131
-5.0,5.033331394195557
-5.0,5.9977006912231445
-5.0,5.487040042877197
-5.230032198670557,5.8955464363098145
-6.958607314841775,6.013092994689941
-7.585026652029182,6.445087909698486
-4.698970004336019,4.011946201324463
-5.0,5.048599720001221
-5.0,4.873431205749512
-7.0915149811213505,5.88593053817749
-5.0,4.766656398773193
-5.7447274948966935,5.313581466674805
-4.939302159646388,6.118791103363037
-6.6777807052660805,5.766934871673584
-7.010016541698601,6.578939437866211
-5.0,5.906877040863037
-5.0,5.247259616851807
-5.0,5.433486461639404
-5.886056647693163,5.7634172439575195
-5.0,4.939441204071045
-5.0,6.087525844573975
-6.455931955649724,6.077825546264648
-5.0,5.19144868850708
-7.958607314841775,6.182265281677246
-5.214670164989233,5.1717729568481445
-5.0,5.0817437171936035
-7.903089986991944,6.243097305297852
-5.0,5.005034923553467
-6.7447274948966935,5.846785545349121
-5.0,5.665291786193848
-7.280006173632396,6.947267055511475
-8.154901959985743,8.03307819366455
-5.0,4.996999740600586
-3.221848749616356,3.633981227874756
-5.0,4.973621845245361
-7.0655015487564325,5.560678005218506
-7.769551078621726,6.893961429595947
-5.0,4.946317195892334
-5.0,6.0617194175720215
-5.0,4.649487495422363
-9.199970640755865,8.334221839904785
-4.0915149811213505,5.710415363311768
-5.0,5.080793380737305
-5.0,4.890718936920166
-5.0,5.707844257354736
-4.29073003902417,6.545231342315674
-5.7447274948966935,5.430882453918457
-5.0,5.122195243835449
-5.0,5.087871074676514
-5.769551078621726,6.0980963706970215
-9.609999808159778,7.254268169403076
-6.318758762624412,5.960943698883057
-5.0,4.703451633453369
-8.698246782716923,8.212246894836426
-4.299997602857746,6.693587779998779
-5.0,4.900205135345459
-5.0,5.541036128997803
-5.300986568387119,5.2811665534973145
-5.0,5.774085521697998
-5.6777807052660805,6.263672351837158
-5.522878745280337,5.711717128753662
-5.0,4.860936641693115
-8.301029995663981,8.472735404968262
-7.585026652029182,7.097550868988037
-5.0,5.75520658493042
-5.0,4.936427593231201
-4.657577319177793,4.634448528289795
-4.69000807121882,5.144822597503662
-5.0,5.124674320220947
-5.0,5.630092620849609
-5.0,5.126430034637451
-5.0,5.263248920440674
-5.0,5.3103461265563965
-5.180456064458131,5.432301044464111
-5.0,5.619639873504639
-8.100179497572904,7.227812767028809
-6.691435586438761,5.755360126495361
-5.0,5.141080379486084
-5.886056647693163,6.497733116149902
-5.0,5.01549768447876
-5.468521082957745,5.235997200012207
-5.0,5.2326579093933105
-5.0,5.6923065185546875
-5.2403321553103694,5.385199546813965
-5.0,5.245300769805908
-7.161150909262744,7.339572429656982
-9.0,5.200907230377197
-7.795880017344075,6.956566333770752
-5.0,4.8969807624816895
-7.789949150124863,7.392402648925781
-5.0,5.346340656280518
-5.568636235841012,7.301496982574463
-5.300986568387119,7.1153717041015625
-5.0,5.109670162200928
-5.0,4.835155963897705
-8.301029995663981,8.33553409576416
-5.0,5.0327019691467285
-4.187086643357144,3.7998080253601074
-5.0,5.249561786651611
-5.130768280269024,5.2205939292907715
-6.770011163455189,6.438632488250732
-8.920818753952375,7.214781284332275
-4.468521082957745,4.6685028076171875
-5.0,5.425593852996826
-5.0,5.183542728424072
-7.154901959985743,4.943047523498535
-5.300986568387119,5.6606268882751465
-4.0,4.804986476898193
-5.0,5.066284656524658
-8.086186147616283,6.042201519012451
-5.0,5.21665096282959
-4.795880017344075,4.587437152862549
-5.207608310501746,5.8167290687561035
-5.0,5.830355167388916
-7.366531544420414,5.628122806549072
-7.599980364934842,5.945573806762695
-6.0,6.17616605758667
-5.055517327849831,5.72083044052124
-5.0,5.185525417327881
-5.0,4.858816623687744
-9.301029995663981,6.602320194244385
-5.0,5.404326438903809
-5.0,5.025808334350586
-6.499996931948306,6.188319683074951
-5.0,5.312215805053711
-5.0,4.760461330413818
-5.0,4.999147891998291
-5.0,5.193919658660889
-5.0,5.034722805023193
-6.251811972993799,5.909701347351074
-5.0,5.481215953826904
-5.0,5.0001139640808105
-5.0,5.044233798980713
-4.70000006855703,5.830767631530762
-5.0,5.36332368850708
-5.0,5.243852138519287
-5.0,5.156221389770508
-5.370794342897696,7.29098653793335
-5.0,5.009831428527832
-5.0,5.109535217285156
-6.7281583934635005,7.275503635406494
-7.795880017344075,7.237584590911865
-8.0,7.099833011627197
-6.920818753952375,5.7084150314331055
-7.096910013008056,5.474626541137695
-6.069998998990925,6.883088111877441
-5.2839966563652006,5.203223705291748
-7.452225294612178,7.504410266876221
-5.0,5.449817180633545
-5.0,5.311660289764404
-6.481486060122112,7.1218719482421875
-5.0,5.500422954559326
-8.301029995663981,8.075874328613281
-5.0,5.449522018432617
-6.060480747381382,5.958164215087891
-5.0,5.85300874710083
-6.0,6.004483699798584
-5.920818753952375,5.817424297332764
-5.0,5.127665996551514
-8.619788758288394,5.029494762420654
-5.0,4.897793292999268
-5.7447274948966935,5.145859718322754
-5.0,4.89033842086792
-5.0,5.409381866455078
-5.0,5.677651882171631
-4.337242168318426,4.841782093048096
-5.0,5.11012077331543
-6.698970004336019,6.465500354766846
-8.301029995663981,8.114730834960938
-5.0,5.175881862640381
-5.0,5.049201488494873
-7.221848749616356,6.825486660003662
-4.619788758288394,5.336243152618408
-2.721246399047171,3.765028953552246
-5.0,4.871374130249023
-5.0,5.179092884063721
-6.318758762624412,5.320438861846924
-7.275724130399211,6.8601460456848145
-8.657577319177793,6.752190113067627
-5.0,5.121427536010742
-8.031517051446064,8.06751537322998
-5.0,5.489490985870361
-5.0,5.117374897003174
-5.219970872662662,6.212465763092041
-4.468521082957745,4.361033916473389
-5.0,5.132309913635254
-5.0,5.126269340515137
-5.929999096197655,6.548404216766357
-5.0,5.139956951141357
-4.920818753952375,5.562711238861084
-5.0,5.877857685089111
-8.275724130399212,6.4917097091674805
-7.585026652029182,5.9039082527160645
-6.1249387366083,6.68939208984375
-5.210000001311123,5.585081577301025
-5.0,5.143510341644287
-5.366531544420413,6.047359943389893
-5.0,5.248989582061768
-5.0,4.944563388824463
-8.698970004336019,8.482895851135254
-5.0,4.880713939666748
-5.300986568387119,5.357838153839111
-5.4089353929735005,6.040847301483154
-5.0,4.915838718414307
-5.619788758288394,5.058502197265625
-5.0,5.123871326446533
-6.767003889607846,7.2980875968933105
-5.0,4.866758346557617
-5.0,5.770704746246338
-5.0,5.158759593963623
-4.756961951313706,4.952488422393799
-5.0,5.524363994598389
-5.0,4.98061990737915
-8.096910013008056,7.552505016326904
-5.300986568387119,6.217202663421631
-4.0,5.791380405426025
-6.327902142064282,6.351151943206787
-5.0,5.510007381439209
-5.886056647693163,5.4615559577941895
-6.1938200260161125,5.3110575675964355
-5.0,4.813825607299805
-5.0,5.104542255401611
-6.375717904164332,6.450516223907471
-5.0,5.425561428070068
-5.0,5.499232769012451
-9.522878745280337,5.715268611907959
-8.522878745280337,8.57886791229248
-5.0,4.973958969116211
-8.301029995663981,8.382782936096191
-9.602059991327963,8.51773738861084
-7.64994590642097,8.570216178894043
-5.890759031411797,6.090768337249756
-5.0,5.085364818572998
-5.920818753952375,6.458092212677002
-5.0,4.898996829986572
-6.0,6.7557549476623535
-6.080921907623926,5.705615520477295
-5.0,5.987884998321533
-5.0,5.623751640319824
-4.96000007768865,5.0472025871276855
-5.0,5.055324554443359
-5.0,5.126515865325928
-5.264002115908206,5.022505283355713
-5.823908740944319,5.586863040924072
-6.236572006437063,5.824407577514648
-4.585026652029182,5.041558742523193
-5.0,5.228641986846924
-5.0,6.152718544006348
-6.346787486224656,5.6447834968566895
-5.0,5.127974033355713
-5.568636235841012,5.519140720367432
-5.0,6.376722812652588
-5.0,5.583400726318359
-5.6399749108106025,6.723471641540527
-6.309803919971486,5.760365962982178
-6.301029995663981,7.816442489624023
-5.0,5.226547718048096
-6.508638306165727,4.974893093109131
-4.0,5.231635093688965
-5.0,5.228545665740967
-6.818156412055227,6.513218402862549
-5.0,5.260254859924316
-5.958607314841775,6.1656060218811035
-5.0,4.948671817779541
-3.3010299956639813,4.073612689971924
-5.0,5.118925094604492
-5.170696227168975,4.951513767242432
-5.0,5.0151753425598145
-5.102372908709558,5.255322456359863
-5.0,5.151876449584961
-5.0,5.240668773651123
-5.0,5.303387641906738
-4.096910013008056,3.6295106410980225
-6.903089986991944,6.983510494232178
-5.247951552180561,4.89024019241333
-5.0,5.066796779632568
-2.3372421683184257,2.6967735290527344
-7.552841968657781,5.773890972137451
-5.624610763945621,5.701174259185791
-7.2441251443275085,5.2398295402526855
-4.5376020021010435,5.408721446990967
-7.657577319177793,7.9875807762146
-5.42021640338319,5.8249287605285645
-5.958607314841775,5.269410610198975
-5.073143291050307,6.566551208496094
-8.070581074285707,7.849462985992432
-5.0,4.990871429443359
-5.0,4.9953718185424805
-5.0,4.904870510101318
-5.0,4.97241735458374
-4.459670525209126,5.283717155456543
-5.0,4.970789432525635
-6.494850021680094,5.236733913421631
-6.917214629683549,6.032372951507568
-5.0,4.7977824211120605
-6.250001023441651,5.541815280914307
-6.75039404569309,7.5007500648498535
-5.300986568387119,5.649014949798584
-5.0,5.5640082359313965
-7.008773924307505,7.162208557128906
-5.0,5.7675251960754395
-5.0,5.849219799041748
-6.083019952679617,5.6676716804504395
-5.0,5.350902080535889
-5.0,5.321984767913818
-5.055517327849831,5.52343225479126
-6.2441251443275085,6.3789496421813965
-5.886056647693163,5.223294734954834
-5.0,5.284677982330322
-5.0,5.358459949493408
-4.2076083105017466,5.518645286560059
-6.638272163982407,5.44529390335083
-5.0,5.235090732574463
-5.0,4.933279514312744
-5.0,5.2545671463012695
-5.0,5.0217061042785645
-3.6989700043360187,4.623444080352783
-5.443697499232712,6.3702569007873535
-8.301029995663981,7.726473331451416
-8.786925174691149,7.129522800445557
-4.800000052738446,4.1348185539245605
-6.638272163982407,5.882118225097656
-5.0,5.253615856170654
-6.0,4.26794958114624
-6.274905478918531,6.459331512451172
-6.0,5.727198600769043
-4.823908740944319,5.11826753616333
-6.259637310505756,5.523112773895264
-6.0,6.0939040184021
-8.301029995663981,8.179123878479004
-7.010016541698601,7.506343364715576
-6.0,5.639560222625732
-4.300000029139089,5.053290843963623
-7.389978975335855,6.551649570465088
-5.0,4.896008014678955
-8.0,8.809525489807129
-4.698970004336019,3.2265892028808594
-5.431798275933005,5.158312797546387
-5.0,4.946041584014893
-5.0,4.99796724319458
-7.3979400086720375,7.375576019287109
-5.0,5.8416361808776855
-5.0,5.433014869689941
-5.0,4.978071212768555
-5.0,5.088374614715576
-5.0,5.08050537109375
-5.0,4.945167541503906
-5.0,5.570032596588135
-5.0,5.580448627471924
-5.0,5.519994735717773
-5.0,5.339942455291748
-5.481486060122112,5.000655651092529
-7.42021640338319,6.894105434417725
-5.0,5.9130167961120605
-5.0,4.913505554199219
-3.872885154640259,4.218475818634033
-5.698970004336019,4.192673206329346
-6.806875401645538,6.567043781280518
-5.0,5.769774913787842
-3.3840499483435993,3.056706428527832
-5.0,5.339806079864502
-7.508638306165727,8.138406753540039
-7.086186147616283,6.251309871673584
-8.086186147616283,7.926072597503662
-5.0,5.085263729095459
-5.0,5.226770877838135
-6.920818753952375,5.151813507080078
-5.088842391260023,5.77837610244751
-5.0,4.930469989776611
-5.0,5.407323837280273
-5.0,5.201733112335205
-5.0,4.977201461791992
-6.0,6.2696003913879395
-6.3102473038608435,5.3015522956848145
-5.585026652029182,5.370119094848633
-5.0,5.481395244598389
-6.4399976732266335,7.127817630767822
-4.928117992693875,3.9469404220581055
-3.3010299956639813,3.731565475463867
-5.0,5.0763421058654785
-5.0,5.7054009437561035
-6.3979400086720375,5.728024482727051
-6.318758762624412,5.816103458404541
-6.958607314841775,8.08725643157959
-5.0,5.007577419281006
-5.0,5.084902286529541
-5.300986568387119,6.9982757568359375
-5.0,5.970162391662598
-7.619788758288394,6.7540059089660645
-6.657577319177793,5.969725131988525
-8.494850021680094,7.843951225280762
-5.0,5.159721851348877
-5.0,5.381056308746338
-5.0,5.025572776794434
-4.769999911123512,5.938625812530518
-5.0,5.379787445068359
-5.0,4.9673542976379395
-5.657577319177793,6.033689498901367
-5.844663962534938,6.2875752449035645
-5.0,4.9141669273376465
-5.0,5.150883197784424
-8.301029995663981,8.456308364868164
-5.0,5.399383068084717
-5.0,5.09816837310791
-4.318758762624412,5.034183979034424
-4.0,5.358940601348877
-5.0,6.255671977996826
-6.318758762624412,7.531161785125732
-5.0,5.211902618408203
-5.0,5.1598591804504395
-5.508638306165727,7.142439842224121
-5.59999938302362,6.404347896575928
-4.0,6.362478256225586
-5.0,4.924229145050049
-8.096910013008056,7.254790782928467
-5.0,5.191976070404053
-5.0,5.198201656341553
-9.0,5.2160725593566895
-4.008773924307505,4.2179274559021
-5.769551078621726,5.302481651306152
-5.0,5.3142876625061035
-6.207608310501746,5.280491352081299
-4.5376020021010435,4.2029805183410645
-5.0,5.4226861000061035
-5.0,5.200462818145752
-5.0,4.838552951812744
-5.0,5.484090328216553
-5.0,5.201315402984619
-5.0,5.2618937492370605
-5.0,4.996832370758057
-3.920818753952375,4.633565425872803
-3.6777807052660805,3.3601245880126953
-7.400007822415902,7.421658515930176
-7.173925197299173,6.451288223266602
-5.050609993355087,5.347772121429443
-5.0,5.283128261566162
-5.2889946365144525,6.06372594833374
-5.468521082957745,5.503304958343506
-5.0,5.205790042877197
-5.795880017344075,5.814156532287598
-5.0,5.533069133758545
-5.0,5.072920322418213
-5.0,5.174570560455322
-3.221848749616356,3.7761118412017822
-5.0,5.385554313659668
-5.0,5.464193820953369
-6.567030709125595,7.429782390594482
-7.657577319177793,7.848696231842041
-8.823908740944319,6.963073253631592
-7.656591406196142,7.523753643035889
-5.0,5.09079122543335
-6.2839966563652006,5.142950534820557
-5.0,5.230658054351807
-7.552841968657781,7.272037029266357
-5.0,5.060259819030762
-5.0,5.072021007537842
-6.366531544420413,5.857436180114746
-5.300986568387119,5.185105800628662
-6.522878745280337,5.866256237030029
-6.1938200260161125,5.860516548156738
-4.638272163982407,4.527621746063232
-5.0,5.21093225479126
-7.229147988357855,7.763168811798096
-6.130768280269024,5.467801570892334
-5.0,5.400496959686279
-5.183758700008217,5.152784824371338
-5.0,5.191218852996826
-5.0,5.168740749359131
-5.0,4.819250583648682
-7.522878745280337,6.83181619644165
-5.200000237109354,5.568824768066406
-8.309803919971486,5.8526787757873535
-5.721246399047171,5.419966697692871
-5.0,5.28186559677124
-5.0,5.536365509033203
-5.0,5.087876319885254
-3.481486060122113,3.003875970840454
-5.0,4.864901065826416
-5.0,4.81830358505249
-8.301029995663981,7.914161205291748
-3.4854522473397136,4.843167781829834
-6.568636235841012,4.876043796539307
-5.0,5.098878860473633
-5.0,4.997107028961182
-8.259637310505756,7.0461955070495605
-5.0,5.365145206451416
-5.769551078621726,6.548892974853516
-6.920818753952375,5.580788612365723
-5.0,4.829315662384033
-6.920818753952375,5.7537665367126465
-6.537602002101044,5.683112621307373
-5.0,5.3609538078308105
-5.0,4.968902111053467
-5.0,4.957230091094971
-5.958607314841775,5.406596660614014
-5.0,5.266934871673584
-5.0,5.405071258544922
-5.0,5.018035411834717
-8.709965388637482,8.367822647094727
-5.0,4.92305850982666
-5.0,5.8639702796936035
-5.0,5.1572041511535645
-5.0,5.869670867919922
-5.958607314841775,5.48376989364624
-6.1249387366083,5.148794651031494
-5.0,5.009822368621826
-3.045757490560675,5.969514846801758
-6.242224508988075,6.436344146728516
-5.0,5.028161525726318
-5.096910013008056,5.264271259307861
-5.0,5.194596767425537
-8.698970004336019,6.597909450531006
-5.0,4.983906269073486
-5.0,5.2951178550720215
-7.318758762624412,4.828978538513184
-5.0,5.797927379608154
-5.0,5.1963324546813965
-6.455931955649724,6.279595375061035
-2.795880017344075,2.674638271331787
-5.221848749616356,5.815578937530518
-5.0,5.060941219329834
-5.0,5.057922840118408
-7.214670164989233,5.310118198394775
-10.397940008672037,9.992408752441406
-5.0,5.3709492683410645
-5.920818753952375,5.7839226722717285
-5.0,4.924851417541504
-5.692168921557897,5.000050067901611
-8.0,7.105938911437988
-5.0,5.044620990753174
-7.79997073344623,6.114414691925049
-5.0,5.156025409698486
-5.7528453851188734,5.8101630210876465
-8.891096872332687,7.0925421714782715
-5.0,5.4619879722595215
-5.4089353929735005,5.1215386390686035
-5.0,4.918704509735107
-5.0,5.519353866577148
-2.0,2.812504291534424
-9.494850021680094,6.103378772735596
-8.795880017344075,7.589972972869873
-2.8239087409443187,6.747857093811035
-5.0,5.173794269561768
-5.7447274948966935,5.523162364959717
-11.698970004336019,11.65623664855957
-5.300986568387119,5.546773433685303
-5.0,5.427237033843994
-5.0,5.206131458282471
-5.0,5.5814433097839355
-5.0,5.373208999633789
-6.0,6.642849445343018
-5.3979400086720375,5.637584686279297
-7.552841968657781,6.970731258392334
-5.0,5.2649312019348145
-5.0,5.2465105056762695
-6.060480747381382,5.374074459075928
-5.0,5.4551591873168945
-5.619788758288394,5.7339067459106445
-5.0,5.566909313201904
-5.0,4.925078868865967
-5.585026652029182,5.417054653167725
-5.0,5.289185047149658
-5.0,4.873233318328857
-6.638272163982407,5.511338233947754
-6.2441251443275085,5.570061683654785
-5.996908923022858,6.077581882476807
-5.110698297493689,5.701101779937744
-5.0,5.047073841094971
-6.3872161432802645,6.858544826507568
-5.0,5.207838535308838
-7.769551078621726,7.369429111480713
-5.522878745280337,5.245685577392578
-6.772113295386326,6.486413478851318
-7.376750709602099,5.712174892425537
-5.3979400086720375,4.746209144592285
-5.0,5.062737941741943
-6.425968732272281,6.7226080894470215
-5.0,4.882116794586182
-5.0,6.179994583129883
-5.0,5.016732692718506
-5.0,5.788851737976074
-5.0,5.326864242553711
-5.0,4.936624526977539
-6.537602002101044,5.826587200164795
-5.0,5.1060709953308105
-4.886056647693163,5.571450710296631
-6.3872161432802645,5.577174186706543
-5.0,4.84166955947876
-6.199970640755866,6.902480602264404
-5.7447274948966935,5.80305814743042
-5.0,5.795329570770264
-5.6777807052660805,5.152914524078369
-2.915423722065669,4.465177059173584
-5.0,5.075915813446045
-8.400116927926312,7.337113857269287
-9.0,8.461663246154785
-5.126330707293206,6.162919521331787
-5.0,4.958370685577393
-3.995678626217358,3.646073341369629
-6.853871964321762,4.926185131072998
-7.920818753952375,8.193222999572754
-9.229147988357855,7.393211841583252
-8.301029995663981,8.162336349487305
-5.0,5.321829319000244
-5.0,5.144002437591553
-5.0,4.960291862487793
-5.0,5.318802356719971
-5.0,5.010153293609619
-5.0,5.152187347412109
-6.698970004336019,8.27919864654541
-4.568636235841013,6.312056064605713
-5.0,4.880848407745361
-5.0,4.927702903747559
-5.0,6.228031635284424
-4.301029995663981,4.6421098709106445
-5.0,4.913548469543457
-5.0,4.905489444732666
-5.0,5.378044605255127
-5.507425843601189,5.358397483825684
-5.0,4.989614963531494
-5.300986568387119,5.370584011077881
-4.675717544702307,4.522671222686768
-4.698970004336019,6.565052509307861
-5.0,5.169974327087402
-5.958607314841775,5.020001411437988
-8.05551732784983,6.602335453033447
-7.700057099977233,8.080833435058594
-6.7447274948966935,5.330193042755127
-5.0,5.037935733795166
-7.055517327849831,7.2253875732421875
-5.0,4.95667028427124
-5.899998417198648,6.310035228729248
-5.0,4.916347980499268
-5.0,4.958550930023193
-5.0,5.175230979919434
-5.050609993355087,4.963236331939697
-5.0,5.184762477874756
-6.721246399047171,5.51848840713501
-7.732828271596986,6.878473281860352
-5.0,4.865010738372803
-5.0,5.0349531173706055
-5.0,5.259463310241699
-8.301029995663981,8.20766544342041
-5.0,5.009707927703857
-5.508638306165727,5.58474063873291
-5.300986568387119,5.864581108093262
-5.0,5.289424896240234
-5.0,5.320195198059082
-4.519993057042849,5.3672637939453125
-2.229147988357856,2.676499605178833
-5.0,5.042977809906006
-3.0,3.248356342315674
-5.0,5.555969715118408
-5.0,4.782742023468018
-6.096910013008056,4.916192531585693
-5.0,5.6060614585876465
-8.920818753952375,7.1393256187438965
-6.2441251443275085,6.076326370239258
-5.0,5.024815559387207
-5.0,5.1879563331604
-5.508638306165727,5.989704608917236
-6.1249387366083,6.154164791107178
-5.0,4.8165669441223145
-5.0,5.718486309051514
-5.3979400086720375,5.1292009353637695
-8.744727494896694,8.89241886138916
-5.0,5.34999942779541
-5.0,4.958500862121582
-5.0,5.167070388793945
-5.920818753952375,6.286849498748779
-5.300986568387119,5.233360290527344
-7.4089353929735005,6.266895294189453
-8.100179497572904,7.009210109710693
-5.0,5.362994194030762
-5.0,5.116517543792725
-8.221848749616356,7.176827907562256
-8.301029995663981,8.10625171661377
-5.0,6.294070720672607
-5.0,4.7911882400512695
-5.0,4.9244537353515625
-5.0,5.696786880493164
-5.0,5.09779691696167
-5.0,4.8837890625
-6.130768280269024,5.234408378601074
-5.823908740944319,5.4548211097717285
-5.318758762624412,5.073276042938232
-8.397940008672037,8.427674293518066
-5.0,4.8969407081604
-5.0,5.135605335235596
-5.0,5.288886547088623
-6.721246399047171,5.772583484649658
-5.29413628771608,5.183475494384766
-5.0,5.406118392944336
-5.0,4.9042744636535645
-8.221848749616356,6.547105312347412
-5.0,4.98577356338501
-6.886056647693163,5.613853931427002
-8.899629454882437,7.855834484100342
-5.0,4.9918718338012695
-7.346787486224656,5.740111827850342
-5.0,5.124031066894531
-5.0,5.292397499084473
-8.600326278518962,9.002150535583496
-5.0,5.640094757080078
-5.0,5.439375400543213
-5.300986568387119,5.785287857055664
-5.0,4.98062801361084
-5.0,5.161093235015869
-8.0,7.140985012054443
-4.853871964321762,5.1148295402526855
-5.251811972993799,5.0835490226745605
-5.0,5.087921619415283
-8.301029995663981,6.5150322914123535
-5.0,5.611969470977783
-5.0,5.637299537658691
-5.0,4.966010570526123
-4.080921907623926,4.213848114013672
-4.102372908709558,3.5183868408203125
-9.300162274132754,8.485905647277832
-8.096910013008056,7.113949775695801
-5.0,5.8289923667907715
-7.431798275933005,6.731987953186035
-5.0,5.244705677032471
-5.853871964321762,5.768035411834717
-9.649751981665837,7.638436317443848
-3.853871964321762,4.462484836578369
-4.958607314841775,4.77091646194458
-4.900000142057633,3.8418383598327637
-5.920818753952375,5.14555025100708
-5.0,5.098322868347168
-5.0,5.075779438018799
-6.823908740944319,7.033827304840088
-7.494850021680094,6.469914436340332
-5.0,5.188321590423584
-5.522878745280337,5.247039794921875
-5.0,5.669894695281982
-5.47681301504965,7.220335483551025
-6.480001470881152,6.342971324920654
-6.0,6.140476703643799
-5.180456064458131,5.1261305809021
-5.0,4.927425384521484
-4.425968732272281,4.610935688018799
-5.0,5.183898448944092
-6.7798265110891185,6.46985387802124
-6.09151498112135,6.867563247680664
-5.0,5.148857593536377
-8.199970640755865,8.33930492401123
-5.0,5.171971797943115
-5.0,5.177672863006592
-3.54515513999149,4.181919574737549
-7.585026652029182,6.750803470611572
-5.0,5.079762935638428
-7.795880017344075,7.334960460662842
-5.0,5.01323938369751
-4.301029995663981,5.784296989440918
-6.065501548756432,5.582324504852295
-7.229147988357855,7.253365993499756
-5.0,4.981068134307861
-5.0,5.110509395599365
-5.0,4.970010280609131
-5.376750709602099,4.889134883880615
-5.301029995663981,5.110764503479004
-5.0,4.843051433563232
-6.096910013008056,6.967464923858643
-7.698970004336019,7.298664569854736
-5.0,5.149601459503174
-6.366531544420413,5.746052265167236
-5.0,4.691094875335693
-5.0,5.204601764678955
-6.42021640338319,5.241012096405029
-10.096910013008056,8.660028457641602
-5.0,4.987667560577393
-5.0,5.136775493621826
-5.0,4.7873759269714355
-8.920818753952375,7.212852478027344
-6.010253634365553,5.2961649894714355
-2.8239087409443187,5.429895401000977
-5.0,5.327495098114014
-5.0,5.197550296783447
-6.055517327849831,5.27970552444458
-5.0,4.7988104820251465
-5.259637310505756,5.7295942306518555
-7.1487416512809245,5.411152362823486
-7.100015437450609,7.244907379150391
-5.0,4.954371929168701
-5.0,5.308029651641846
-5.0,5.043145179748535
-5.6777807052660805,6.300979137420654
-4.694648630553377,6.673915386199951
-5.0,5.347387790679932
-5.173925197299173,5.074161052703857
-6.107905397309519,5.603609561920166
-5.585026652029182,5.638635158538818
-5.0,5.125535011291504
-5.0,4.874240398406982
-5.0,4.755771160125732
-5.443697499232712,5.639745712280273
-5.0,5.265531063079834
-8.301029995663981,7.970708847045898
-4.8297382846050425,5.368624687194824
-7.008773924307505,6.109837055206299
-5.0,5.357756614685059
-5.0,5.2258381843566895
-6.6020599913279625,6.288033962249756
-5.300986568387119,4.905773639678955
-5.0,5.583492755889893
-9.397940008672037,7.4919657707214355
-5.0,5.056020259857178
-5.0,5.3632941246032715
-5.0,5.033968448638916
-5.0,5.388564109802246
-4.327902142064283,4.1044602394104
-5.0,5.156402111053467
-5.0,5.45399284362793
-5.0,5.203884601593018
-5.183758700008217,5.571202754974365
-4.22767829327708,3.468493938446045
-6.7594507517174005,5.617197036743164
-5.0,5.429141521453857
-6.324221658325914,6.905470371246338
-5.716925025264528,6.004286289215088
-5.0,5.050705432891846
-3.9586073148417746,4.249786853790283
-6.318758762624412,5.595714569091797
-6.0,5.667909145355225
-5.0,4.917874813079834
-5.4698003017969175,5.599257946014404
-7.060480747381382,5.367640018463135
-6.0,5.166423797607422
-5.0,5.6433000564575195
-4.958607314841775,4.696170330047607
-5.0,5.481014728546143
-5.0,5.334000110626221
-6.42021640338319,4.923502445220947
-5.0,5.108858108520508
-4.2441251443275085,6.153312683105469
-5.0,5.338054180145264
-5.0,5.065374851226807
-5.638272163982407,5.48061466217041
-5.0,5.880703449249268
-5.327902142064282,6.924013614654541
-5.0,4.848069190979004
-7.886056647693163,7.656151294708252
-5.0,5.0592122077941895
-5.214670164989233,5.444267749786377
-6.425968732272281,6.451207637786865
-5.0,4.9702839851379395
-5.0,4.921878337860107
-5.0,5.207269191741943
-5.0,4.967527866363525
-5.0,5.148622035980225
-5.0,4.99310302734375
-5.657577319177793,5.2942023277282715
-5.0,5.193491458892822
-5.0,5.2267537117004395
-6.741123370627869,6.644880771636963
-7.721246399047171,7.804667949676514
-8.443697499232712,7.9245429039001465
-5.0,5.233275890350342
-5.0,5.104039669036865
-6.721246399047171,7.322722911834717
-5.0,5.137547969818115
-5.0,5.140894412994385
-5.0,5.201786518096924
-6.038161424532799,5.97639799118042
-6.199998172182031,7.459445476531982
-5.698970004336019,5.346038818359375
-8.337242168318426,6.2194952964782715
-5.0,5.121237277984619
-5.0,5.2627058029174805
-5.0,5.121291637420654
-5.0,4.99213171005249
-6.823908740944319,5.943191051483154
-3.3979400086720375,4.212210178375244
-6.585026652029182,5.145425319671631
-6.505149978319906,6.244912624359131
-6.292429823902063,5.031573295593262
-3.8927900303521312,4.0637030601501465
-5.537602002101044,5.2967209815979
-5.0,4.966994762420654
-6.013228265733755,5.1367082595825195
-7.2839966563652006,6.8386125564575195
-5.0,5.264037609100342
-6.271808601410053,5.912944316864014
-5.453663017075987,5.598055839538574
-5.0,5.154448986053467
-6.958607314841775,7.319730281829834
-5.0,5.394115924835205
-5.0,5.3944621086120605
-5.0,5.123362064361572
-7.795880017344075,7.128955841064453
-9.010000098195093,8.179492950439453
-5.0,4.777626037597656
-8.100179497572904,8.21137523651123
-6.847711655616944,7.100065231323242
-5.0,4.966923236846924
-5.376750709602099,5.650834560394287
-5.0,5.15027379989624
-5.0,5.036687850952148
-4.5376020021010435,5.6021504402160645
-4.853871964321762,5.723410129547119
-5.758370519979997,6.13775110244751
-5.221848749616356,7.061707019805908
-5.0,4.945680141448975
-5.0,4.855109691619873
-5.508638306165727,5.478309154510498
-9.823908740944319,9.452945709228516
-5.0,5.059798717498779
-5.0,5.495621204376221
-6.2900011719748115,6.944004535675049
-4.4928955769846795,4.635056495666504
-5.105130343254747,5.8828864097595215
-5.6020599913279625,5.279316425323486
-5.0,5.065724849700928
-6.009998764965339,6.187971591949463
-5.0,5.528080463409424
-5.0,5.067218780517578
-5.0,5.199375629425049
-6.481486060122112,6.573612689971924
-8.602059991327963,7.170202255249023
-6.721246399047171,5.798457145690918
-6.096910013008056,5.27676248550415
-8.356547323513812,7.167084217071533
-8.431798275933005,5.845022678375244
-5.0,4.8882527351379395
-5.0,5.608295917510986
-5.0,5.0426506996154785
-5.0,5.331104755401611
-5.0,5.369962215423584
-5.0,4.808400630950928
-6.0999990348465305,6.407933712005615
-5.0,5.0516533851623535
-5.958607314841775,5.258945941925049
-4.0,5.187070369720459
-8.301029995663981,8.385453224182129
-4.0,4.805975914001465
-5.886056647693163,5.4004316329956055
-5.070581074285707,5.428905010223389
-5.8696662315049934,6.662313938140869
-8.55284196865778,7.354197025299072
-5.0,5.197643756866455
-5.0,5.2619099617004395
-5.0,5.164059162139893
-5.0,5.63844633102417
-5.0,5.810842037200928
-7.42021640338319,7.049985408782959
-5.494850021680094,5.247273921966553
-6.6020599913279625,5.831482887268066
-5.0,4.958362102508545
-9.600326278518962,8.037724494934082
-5.0,5.291715621948242
-5.0,5.059208393096924
-8.619788758288394,6.841830730438232
-7.301029995663981,6.630425930023193
-7.221848749616356,7.828166484832764
-3.632644078973981,4.247013092041016
-6.850011543508524,5.825404644012451
-5.0,5.017734050750732
-10.0,9.47128677368164
-5.0,5.228033542633057
-5.0,4.9192986488342285
-9.67778070526608,6.071132659912109
-5.0,5.123125076293945
-5.0,5.373747825622559
-6.141462802430361,5.834351539611816
-5.300986568387119,4.98203706741333
-5.0,5.382943630218506
-5.0,5.140352725982666
-5.7447274948966935,5.407379627227783
-6.886056647693163,6.036093235015869
-7.980493227912621,6.927883625030518
-5.0,5.5373969078063965
-5.0,5.00238037109375
-5.0,5.352293491363525
-8.537602002101044,6.667720317840576
-5.0,5.206212520599365
-4.710009933945681,6.279975414276123
-5.0,4.991365909576416
-7.102372908709558,6.2650065422058105
-5.619788758288394,5.876870632171631
-7.510041520575165,6.726003170013428
-6.779891911959945,6.020103931427002
-5.0,5.020087718963623
-5.0,5.110174179077148
-5.0,4.879103183746338
-5.0,5.028603553771973
-7.853871964321762,6.517887592315674
-4.481486060122113,4.10584020614624
-7.189319524789436,7.476230621337891
-5.0,5.397219181060791
-5.207608310501746,5.286652088165283
-5.0,4.874561786651611
-6.0,6.4896063804626465
-9.119019436449179,7.567672252655029
-5.0,5.527290344238281
-4.823474663465,6.507209777832031
-5.0,5.161862373352051
-5.0,4.986412525177002
-5.0,5.150845050811768
-6.440093374963888,7.045658588409424
-6.537602002101044,5.412355899810791
-5.0,5.225188255310059
-5.0,5.4727067947387695
-5.0,5.075184345245361
-5.0,4.978292465209961
-5.0,5.161064624786377
-7.275724130399211,7.010005474090576
-7.795880017344075,7.114838123321533
-5.769551078621726,5.863918781280518
-5.0,5.3418049812316895
-5.0,4.9094343185424805
-7.903089986991944,7.626114368438721
-9.0,8.283476829528809
-8.356547323513812,8.780800819396973
-6.578396073130168,4.843899726867676
-6.327902142064282,5.02675724029541
-5.0,5.172682285308838
-6.900008766455315,6.842533588409424
-5.0,4.8663249015808105
-6.0,6.7437424659729
-4.449771646944906,4.754530429840088
-5.154901959985743,5.332398891448975
-8.619788758288394,5.89892578125
-5.161150909262744,5.556432247161865
-5.0,5.340301036834717
-5.301029995663981,5.200868129730225
-6.050609993355087,5.360401153564453
-5.0,5.678319454193115
-5.376750709602099,6.233007907867432
-5.0,5.038393497467041
-6.187086643357144,5.89833402633667
-5.0,5.789426326751709
-4.3979400086720375,4.619933605194092
-5.0,5.027646541595459
-5.0,5.32848596572876
-6.206209615309181,8.039341926574707
-5.0,4.8377861976623535
-5.0,4.966917991638184
-5.508638306165727,5.923490047454834
-4.920818753952375,3.1459293365478516
-6.327902142064282,5.948271751403809
-7.373317533763705,7.919605731964111
-5.280254507470423,5.292957782745361
-5.0,5.27393102645874
-7.060480747381382,5.6367363929748535
-6.537602002101044,5.5529255867004395
-5.0,5.296647071838379
-6.7594507517174005,4.5572190284729
-5.0,4.968790531158447
-5.183758700008217,4.910265922546387
-5.0,5.172946453094482
-5.7447274948966935,5.6501851081848145
-6.937418015771836,7.164156913757324
-5.638272163982407,5.270366191864014
-7.301029995663981,3.8863778114318848
-5.0,5.0062994956970215
-5.0,4.8725738525390625
-6.443697499232712,6.207833290100098
-5.0,5.104037761688232
-5.0,4.780498027801514
-5.0,4.881171226501465
-5.795880017344075,4.9935150146484375
-5.0,5.842187404632568
-5.0,4.980464458465576
-6.4089353929735005,5.545863151550293
-4.900008766455316,4.837792873382568
-6.3979400086720375,6.690521717071533
-5.0,5.622912883758545
-3.6020599913279625,4.385524749755859
-5.0,5.19498348236084
-3.6197887582883936,3.3318562507629395
-5.0,5.034006595611572
-5.0,5.084349632263184
-5.823908740944319,5.11580228805542
-5.0,5.491607666015625
-5.0,5.171690464019775
-8.400116927926312,7.115059852600098
-6.431798275933005,5.097914218902588
-5.0,4.870794773101807
-6.623605557962733,5.442016124725342
-5.0,4.855673313140869
-5.300986568387119,5.285362720489502
-5.0,6.263773441314697
-5.0,5.127141952514648
-5.0,5.087563991546631
-5.0,4.981812000274658
-5.0,5.674341678619385
-6.508638306165727,6.008951663970947
-5.0,5.121878147125244
-2.0,2.772782564163208
-5.0,5.276041030883789
-5.251811972993799,5.4322509765625
-5.0,5.060837745666504
-6.09151498112135,5.646900653839111
-4.774690718274137,4.905033588409424
-5.0,4.852595806121826
-5.638272163982407,5.603095531463623
-8.05551732784983,8.342415809631348
-5.0,5.1857075691223145
-5.0,4.929625988006592
-5.300986568387119,5.292475700378418
-7.301029995663981,7.190412998199463
-8.0,7.3387227058410645
-7.376750709602099,6.34340238571167
-5.0,5.664811134338379
-5.0,5.034788608551025
-5.0,5.246078968048096
-5.0,5.411721706390381
-6.481486060122112,5.809889316558838
-3.853871964321762,4.336056232452393
-5.886056647693163,6.05048942565918
-4.0,4.349775791168213
-5.568636235841012,5.602387428283691
-5.0,5.343092441558838
-5.0,5.035179138183594
-5.0,5.236308574676514
-6.931814138253838,5.73356294631958
-5.0,5.344486236572266
-8.301029995663981,8.301732063293457
-5.0,5.159084796905518
-5.4089353929735005,4.2520222663879395
-8.229147988357855,5.602059364318848
-7.7447274948966935,6.244109153747559
-4.301029995663981,4.395986080169678
-5.740000204918113,5.8216986656188965
-5.300000202445418,6.186445713043213
-5.0,5.1458539962768555
-5.0,4.948723316192627
-5.0,5.450735092163086
-5.0,4.9688239097595215
-5.0,5.1723222732543945
-7.568636235841012,6.519190311431885
-8.045757490560675,5.913340091705322
-6.586700235918748,6.573533535003662
-5.1938200260161125,5.298049449920654
-5.0,5.466062068939209
-7.823908740944319,4.790597438812256
-8.300162274132754,8.153183937072754
-5.0,5.047531604766846
-5.0,5.036008358001709
-6.086186147616283,5.189166069030762
-5.0,5.10156774520874
-5.0,5.312124252319336
-5.0,5.637400150299072
-10.886056647693163,10.325261116027832
-5.0,6.145590305328369
-5.0,5.345707416534424
-7.4089353929735005,5.424987316131592
-5.568636235841012,5.261051654815674
-5.0,4.977783203125
-5.769551078621726,5.508519172668457
-5.221848749616356,5.366352558135986
-6.920818753952375,6.968432903289795
-5.275724130399211,4.6093668937683105
-6.452225294612178,7.191492557525635
-5.0,5.708584308624268
-5.0,4.909292697906494
-5.0,4.834805965423584
-5.0,5.292973041534424
-5.0,5.026857852935791
-5.822046719704225,6.787571907043457
-4.900000142057633,5.841129779815674
-5.0,5.017005920410156
-5.0,5.188635349273682
-5.0,5.6108880043029785
-5.640354207325457,6.339875221252441
-9.3767507096021,5.816562652587891
-7.700057099977233,5.731569290161133
-5.657577319177793,6.174760341644287
-5.0,4.985656261444092
-5.0,5.157190799713135
-5.117285772379775,5.902122974395752
-7.400007822415902,7.747586727142334
-6.4089353929735005,5.687060356140137
-5.0,4.8810625076293945
-5.0,5.192990779876709
-5.0,5.9415602684021
-2.3010299956639813,2.721406936645508
-3.7644715530924513,3.8498928546905518
-4.499999953328896,4.586569309234619
-5.337242168318426,6.025356292724609
-5.3979400086720375,5.140697002410889
-5.0,5.146066665649414
-6.679999195735272,4.0576934814453125
-5.481486060122112,6.624268054962158
-5.0,6.15402364730835
-5.0,5.154534816741943
-7.931814138253838,6.526055812835693
-5.714442690992226,5.713749408721924
-5.0,4.752364635467529
-6.455931955649724,5.936153411865234
-6.455931955649724,7.446627140045166
-4.519993057042849,5.335026264190674
-5.537602002101044,5.355035305023193
-5.0,5.5710978507995605
-5.0,4.968367099761963
-5.809528229426655,7.107466697692871
-5.0,5.261031627655029
-4.83000246293343,5.7569451332092285
-4.569999968362492,5.577489376068115
-5.209996479609511,5.84546422958374
-12.0,9.273092269897461
-6.3979400086720375,5.515635967254639
-5.0,5.222188472747803
-8.55284196865778,5.107496738433838
-7.301029995663981,7.118100166320801
-5.0,5.333785533905029
-5.0,5.434879302978516
-4.800000052738446,5.39301061630249
-5.0,5.59350061416626
-5.0,4.778877258300781
-6.6777807052660805,6.187256336212158
-5.0,4.980065822601318
-2.6989700043360187,4.7525177001953125
-5.0,4.832821369171143
-5.0,5.957394599914551
-2.6989700043360187,4.942595958709717
-8.275724130399212,6.583817005157471
-5.0,4.884153366088867
-5.0,4.962499618530273
-5.0,5.457235336303711
-5.0,4.921999454498291
-6.0999990348465305,7.976375579833984
-5.0,5.023236274719238
-5.0,5.11834192276001
-5.0,4.988053798675537
-6.777283528852417,6.49130392074585
-8.958607314841775,8.89469051361084
-5.0,5.853025913238525
-5.771733132928315,5.8202128410339355
-4.599997654072044,3.9621472358703613
-5.280006173632396,5.923861980438232
-5.0,5.079889297485352
-6.292429823902063,5.633183002471924
-5.0,4.871774196624756
-8.481486060122112,8.584707260131836
-5.0,4.965843677520752
-8.197226274708024,7.218942642211914
-8.397940008672037,5.834444046020508
-5.0,4.998257160186768
-4.5121548798885645,4.221193313598633
-5.0,5.242964267730713
-6.443697499232712,6.175663471221924
-6.481486060122112,6.368958950042725
-5.481486060122112,4.277587413787842
-5.0,4.982645034790039
-5.266976701594718,5.946354389190674
-5.0,5.459649562835693
-5.0,5.392766952514648
-5.0,5.443902492523193
-9.356547323513812,7.670132160186768
-5.0,4.964024066925049
-6.366531544420413,5.5417280197143555
-5.0,5.231629848480225
-5.0,5.0522871017456055
-5.107905397309519,4.415149211883545
-5.0,5.029663562774658
-5.0,5.171169757843018
-5.0,5.216420650482178
-5.468521082957745,6.023430347442627
-5.0,5.944028854370117
-7.0,6.294260501861572
-7.470056598341331,7.081981182098389
-8.366531544420413,8.388638496398926
-5.0,5.21248722076416
-6.327902142064282,6.571859359741211
-5.0,5.109988689422607
-5.0,5.385036468505859
-5.853871964321762,5.807460308074951
-5.0,5.019446849822998
-5.236572006437063,5.880037784576416
-5.356547323513812,5.617825984954834
-6.657577319177793,6.407506465911865
-5.0,5.116268634796143
-5.0,4.909088134765625
-2.4881166390211256,3.5952517986297607
-5.0,5.033100605010986
-5.0,5.0729289054870605
-5.0,4.999945163726807
-5.0,5.2689642906188965
-6.1771783546968955,5.912984848022461
-4.490004907986601,5.709147930145264
-5.0,5.033315658569336
-6.657577319177793,6.026904106140137
-6.045757490560675,5.488840579986572
-5.0,5.87684440612793
-5.0,5.024883270263672
-5.568636235841012,6.182316303253174
-6.4089353929735005,5.4783616065979
-4.292429823902063,4.337778568267822
-5.0,5.132887363433838
-6.773400094792643,6.51906156539917
-5.318758762624412,5.4352240562438965
-6.721246399047171,5.8196187019348145
-5.0,5.118658065795898
-5.0,5.285076141357422
-8.619788758288394,7.897878646850586
-5.0996328713435295,5.4856390953063965
-5.522878745280337,5.354925155639648
-5.0,5.040134429931641
-8.0,7.214885234832764
-5.018936819149399,4.9041924476623535
-7.062983892535186,7.045897006988525
-6.327902142064282,5.611573696136475
-5.107905397309519,5.120948314666748
-8.920818753952375,6.876805305480957
-7.698970004336019,5.079232692718506
-8.301029995663981,8.312947273254395
-6.267606240177031,4.615434169769287
-5.0,5.046036243438721
-6.481486060122112,6.686047554016113
-5.0,5.028720378875732
-7.0,5.420894145965576
-6.2716462179787715,7.168575763702393
-5.300986568387119,5.500237464904785
-5.0,5.030539512634277
-5.0,4.861334323883057
-7.0,5.008042812347412
-5.0,5.305500507354736
-7.853871964321762,6.131870269775391
-5.0,5.249521732330322
-5.0,5.6116766929626465
-5.0,5.240522861480713
-5.0,5.248892307281494
-5.0,5.2293291091918945
-4.0,5.3355841636657715
-5.300986568387119,5.554983139038086
-3.040958607678906,3.528770923614502
-5.232844133917819,5.708799839019775
-5.292429823902063,6.27523136138916
-5.349984047528162,7.061705112457275
-5.0,5.199590682983398
-7.360015751958412,7.834191799163818
-9.698970004336019,8.200783729553223
-5.443697499232712,5.162714958190918
-5.0,4.9622931480407715
-7.494850021680094,5.025782108306885
-5.0,5.0906195640563965
-6.71669877129645,6.718811988830566
-5.0,5.075939655303955
-6.0,6.158657550811768
-5.0,4.8788652420043945
-6.148130399270234,6.385264873504639
-5.0,5.0888800621032715
-5.0,5.292433738708496
-6.0,6.033064365386963
-6.42021640338319,6.628630638122559
-5.0,4.830661773681641
-5.0,5.025274753570557
-5.0,4.9640302658081055
-5.292429823902063,5.494984149932861
-5.0,5.303617000579834
-5.0,4.965190410614014
-5.7447274948966935,6.136070728302002
-8.801342913045577,8.373845100402832
-5.0,5.774530410766602
-5.0,5.077833652496338
-4.909999919094989,5.226812839508057
-6.294200410729496,7.363643169403076
-8.301029995663981,8.076324462890625
-5.0,4.957681655883789
-6.0,7.7911272048950195
-8.113509274827518,6.4206085205078125
-5.0,5.113163471221924
-5.0,4.883586883544922
-8.801342913045577,9.526339530944824
-5.0,4.94007682800293
-8.244125144327509,6.2119598388671875
-5.0,5.537038803100586
-5.556424120249742,5.891646385192871
-5.0,5.6233344078063965
-6.531652669587842,5.586843013763428
-5.3979400086720375,5.384328365325928
-5.0,5.477217674255371
-5.0,5.259354114532471
-5.290730039024169,5.798520565032959
-10.721246399047171,9.133216857910156
-5.0,4.84397029876709
-5.0,4.923461437225342
-5.0,5.935699939727783
-5.259637310505756,4.993458271026611
-7.50003813440381,6.7977495193481445
-7.0,6.9118170738220215
-7.830031826003108,7.042731761932373
-5.0,4.958674430847168
-5.0,4.867424964904785
-5.0,5.15375280380249
-5.0,5.42751932144165
-9.602059991327963,8.906351089477539
-5.0,4.8282670974731445
-5.0,5.0321269035339355
-4.107905397309519,4.17536735534668
-6.0,6.0719780921936035
-5.0,5.1949334144592285
-8.638272163982407,7.355368137359619
-5.3979400086720375,5.123229026794434
-6.823908740944319,7.887350559234619
-7.0,7.660207271575928
-5.0,5.266878128051758
-5.417482116395938,5.593935489654541
-6.0,6.240116596221924
-7.638272163982407,7.2224955558776855
-7.795880017344075,4.656280517578125
-6.015472686656207,5.906620502471924
-5.920818753952375,6.702676296234131
-6.154901959985743,7.013950824737549
-5.300986568387119,5.115725040435791
-5.0,5.007008075714111
-5.685922008220787,5.623607158660889
-5.585026652029182,5.862283229827881
-4.853871964321762,6.070184230804443
-5.638272163982407,6.031449794769287
-5.300986568387119,4.9402337074279785
-5.0,5.0261311531066895
-6.081969663215119,5.28371000289917
-7.823908740944319,9.023945808410645
-4.13282724882135,6.131971836090088
-7.823908740944319,5.239712715148926
-6.3535962737769305,6.142877101898193
-6.578396073130168,8.644450187683105
-5.0,5.988584995269775
-6.279840696594043,5.986791133880615
-7.638272163982407,6.635484218597412
-5.489991487059765,6.154356479644775
-7.187086643357144,5.603154182434082
-6.496209316942819,6.692668437957764
-5.0,5.346205234527588
-5.0,5.167003154754639
-6.522878745280337,6.074001312255859
-5.0,4.946801662445068
-5.958607314841775,5.339565277099609
-5.0,5.5019612312316895
-6.167491087293763,5.9804205894470215
-3.889410289700751,4.868276119232178
-5.508638306165727,5.307931423187256
-5.0,5.2891526222229
-5.300986568387119,5.711855888366699
-5.0,6.207572937011719
-6.299997602857746,7.843657970428467
-3.1220530483708115,2.9265594482421875
-8.443697499232712,8.732813835144043
-5.0,4.9084906578063965
-5.0,5.199646949768066
-5.0,5.04298734664917
-6.412850501745656,4.97627067565918
-5.167491087293763,5.299227237701416
-5.0,5.206500053405762
-5.0,4.930881023406982
-6.917214629683549,5.905604362487793
-5.0,5.13548469543457
-5.0,5.586310863494873
-5.055517327849831,4.881612777709961
-6.334419008982047,7.087792873382568
-7.3872161432802645,7.584380626678467
-2.795880017344075,3.6945457458496094
-6.0,6.048849105834961
-5.0,5.136916637420654
-6.207608310501746,5.161020755767822
-5.0,5.292779445648193
-5.0,5.024181365966797
-2.3010299956639813,2.7506346702575684
-5.140021558357979,6.702876091003418
-7.096910013008056,5.7767229080200195
-5.0034883278458215,4.7947678565979
-5.0,5.671468257904053
-5.0,4.862851142883301
-6.0,6.122793197631836
-5.0,4.845767974853516
-5.0,4.814352512359619
-5.920818753952375,5.2705607414245605
-5.795880017344075,5.110611438751221
-5.0,5.479394435882568
-5.0,5.12814998626709
-4.0,4.542872905731201
-5.0,5.383228778839111
-5.301029995663981,4.562643527984619
-5.0,5.13029670715332
-9.199970640755865,8.876471519470215
-7.522878745280337,6.891786098480225
-5.0,5.055152893066406
-7.0835460514500745,7.611441135406494
-5.0,5.31587553024292
-5.0,5.9967756271362305
-6.6020599913279625,6.378213405609131
-9.0,6.662563323974609
-5.0,4.9419169425964355
-6.494850021680094,5.3734354972839355
-5.0,5.391799449920654
-3.5228787452803374,3.5141096115112305
-5.221848749616356,6.0304179191589355
-4.2076083105017466,5.123050212860107
-5.0,5.193296909332275
-5.0,4.9427361488342285
-4.782516055786093,6.396457672119141
-5.0,5.219214916229248
-6.42021640338319,5.489744663238525
-5.0,6.031485080718994
-8.301029995663981,6.898626804351807
-5.065501548756432,5.326781272888184
-6.180002266489224,6.471273422241211
-5.0,5.511208534240723
-5.161150909262744,6.4615020751953125
-6.236572006437063,5.969789981842041
-6.399996913372259,6.115297794342041
-3.638272163982407,2.629000663757324
-5.0,5.406381130218506
-5.0,5.3432464599609375
-6.366531544420413,5.867495059967041
-5.0,4.981464862823486
-5.795880017344075,5.582472324371338
-6.236572006437063,5.635159492492676
-5.0,5.431626796722412
-5.0,5.24493932723999
-3.5228787452803374,2.9688940048217773
-6.638272163982407,5.713162899017334
-8.189767482004916,7.069343090057373
-5.0,5.054000377655029
-5.0,5.261247158050537
-5.958607314841775,6.314136028289795
-5.0,6.001209735870361
-6.7447274948966935,6.544888496398926
-7.3979400086720375,7.705500602722168
-5.0,5.852828502655029
-5.1249387366083,5.082494258880615
-6.580044251510242,6.989303112030029
-5.0,5.173912525177002
-5.0,5.038394451141357
-5.183758700008217,6.0576252937316895
-5.0,5.285221099853516
-5.0,5.227229118347168
-7.008773924307505,6.995638847351074
-7.161150909262744,7.826150417327881
-5.0,5.430202960968018
-5.0,4.992295742034912
-5.0,5.108715534210205
-5.0,4.897237300872803
-5.059981844992336,5.720835208892822
-9.022276394711152,6.221837520599365
-5.59999938302362,5.143112659454346
-6.585026652029182,5.607671737670898
-6.508638306165727,7.263206958770752
-5.0,5.384607791900635
-5.0,5.133080005645752
-5.0,4.9379353523254395
-7.899974269892137,8.722304344177246
-10.100179497572904,9.185526847839355
-5.0,5.550665378570557
-5.0,4.927353382110596
-6.119186407719209,6.348128795623779
-4.522878745280337,6.47584867477417
-5.0,5.130424976348877
-5.0,5.158226490020752
-7.633577042774027,6.100892543792725
-5.0,5.40144681930542
-5.0,5.215061664581299
-5.0,5.708601474761963
-5.619788758288394,5.617318630218506
-8.801342913045577,7.890993595123291
-5.925183559354825,7.035399913787842
-6.928117992693874,6.8803935050964355
-5.0,5.277322292327881
-5.0,5.04022741317749
-7.823908740944319,6.44261360168457
-5.0,5.1470417976379395
-5.823908740944319,5.505012035369873
-5.0,5.098499774932861
-6.309803919971486,5.887350082397461
-5.42021640338319,5.574029922485352
-5.0,5.0373969078063965
-5.0,5.660923480987549
-5.0,5.972483158111572
-4.0,4.079506874084473
-5.0,5.28502893447876
-6.958607314841775,4.68882417678833
-5.036212172654444,5.067681789398193
-9.110138278741811,8.837833404541016
-6.958607314841775,5.953155040740967
-5.0,5.510359287261963
-7.161150909262744,5.918363571166992
-5.0,4.85301399230957
-6.267606240177031,5.305126667022705
-6.0,7.4422736167907715
-7.036212172654444,5.736804962158203
-5.0,4.842060565948486
-5.35981680807866,5.4943013191223145
-5.0,5.050937175750732
-5.0,5.6715521812438965
-6.886056647693163,6.0802998542785645
-6.886056647693163,7.171311378479004
-6.508638306165727,5.264485836029053
-7.270025714300444,6.404252052307129
-10.698970004336019,10.259625434875488
-5.327902142064282,5.056549072265625
-7.236572006437063,5.987900733947754
-5.0,5.412159442901611
-7.267606240177031,5.089852809906006
-5.0,5.647879600524902
-5.0,4.919351100921631
-8.301029995663981,8.24634075164795
-5.0,5.529794216156006
-5.0,4.733290672302246
-4.0,5.071430683135986
-5.0,5.236429691314697
-5.0,5.203454494476318
-7.301029995663981,6.065576553344727
-5.0,5.490176677703857
-5.0,5.049145221710205
-5.0,4.745637893676758
-7.920818753952375,5.969823360443115
-5.151810883008601,5.128050327301025
-5.327902142064282,4.981950759887695
-7.207608310501746,5.071920871734619
-5.0,5.004724979400635
-5.6599526823386075,6.64497184753418
-8.229884705212898,8.08525562286377
-5.0,4.86877965927124
-3.259637310505756,3.3456790447235107
-5.139661993429007,5.110516548156738
-5.0,5.030916690826416
-7.987162775294828,8.277325630187988
-4.376750709602099,4.40524959564209
-5.356547323513812,5.3226799964904785
-8.050122295963126,7.034398555755615
-6.130768280269024,5.376641273498535
-5.0,5.176865100860596
-5.0,5.252064228057861
-6.368556230986828,6.475769519805908
-5.0,4.871616840362549
-5.0,5.577583312988281
-5.0,5.132716655731201
-6.6777807052660805,5.294249057769775
-6.704432900037521,5.517614841461182
-7.301029995663981,7.334563732147217
-5.0,5.130553722381592
-5.0,6.33191442489624
-5.0,5.124638080596924
-5.0,4.845767498016357
-6.853871964321762,6.842956066131592
-6.900008766455315,6.416422367095947
-6.853871964321762,6.967652797698975
-5.0,4.7338128089904785
-6.234331445240986,6.0858306884765625
-3.5528419686577806,3.5924336910247803
-5.0,5.751852512359619
-5.0,5.1571855545043945
-5.0,5.0748443603515625
-4.4089353929735005,5.751723766326904
-6.698970004336019,6.536335468292236
-5.327902142064282,5.518282890319824
-5.0,4.897031307220459
-5.0,5.100902080535889
-6.823908740944319,5.2474589347839355
-5.0,5.075135707855225
-5.0,4.940281867980957
-6.130181792020672,6.727609634399414
-5.0,5.082530498504639
-6.0,6.2029547691345215
-5.0,5.104348659515381
-5.0,4.945379734039307
-4.013228265733755,3.526610851287842
-5.0,5.195691108703613
-5.0,5.3784966468811035
-4.337242168318426,4.474238872528076
-8.070070439915412,7.306851863861084
-5.0,4.893709659576416
-5.119186407719209,7.590778827667236
-5.0,5.052029609680176
-5.522878745280337,4.785883903503418
-5.0,5.114396572113037
-6.292429823902063,5.1062235832214355
-5.0,5.05286169052124
-5.0,4.785281181335449
-8.244125144327509,6.490996837615967
-5.0,5.2177414894104
-5.0,5.122588634490967
-5.0,4.821023464202881
-4.029653123769907,3.6984264850616455
-5.440452444419566,6.512272357940674
-7.337242168318426,6.473442554473877
-5.0,5.2607035636901855
-5.356547323513812,6.351484775543213
-5.0,5.058590888977051
-4.568636235841013,5.517496585845947
-5.0,5.186771392822266
-5.0,5.754941463470459
-7.638272163982407,5.611109256744385
-5.0,5.7809319496154785
-9.522878745280337,8.18300724029541
-5.0,5.07684326171875
-5.494850021680094,6.073618412017822
-5.0,5.90238618850708
-5.0,4.774659633636475
-5.0,5.19691801071167
-5.0,5.068428993225098
-6.571055709964426,5.896787166595459
-5.0,5.054092884063721
-5.0,5.1540608406066895
-6.568636235841012,5.86526346206665
-5.102372908709558,4.847780227661133
-5.0,5.335342884063721
-8.200659450546418,8.01987075805664
-5.59999938302362,6.068948745727539
-5.568636235841012,5.752844333648682
-6.443697499232712,6.352295875549316
-5.0,5.089792251586914
-5.0,5.282456874847412
-5.036212172654444,5.368154048919678
-5.0,5.417041301727295
-4.823908740944319,4.807995319366455
-5.0,4.850808620452881
-4.698970004336019,4.8671183586120605
-6.537602002101044,5.183306694030762
-5.0,5.1626105308532715
-6.958607314841775,5.868126392364502
-4.958607314841775,5.028759002685547
-8.301029995663981,6.9268646240234375
-5.0,5.330077648162842
-5.0,5.120150566101074
-5.0,5.093002796173096
-5.0,5.4486799240112305
-6.6020599913279625,6.314901828765869
-6.96657624451305,6.79884672164917
-5.0,5.142063617706299
-5.300986568387119,5.60703706741333
-6.756961951313706,5.346317768096924
-2.5528419686577806,2.805455446243286
-5.0,5.28145694732666
-6.0,6.2616801261901855
-6.464705879957229,7.314175605773926
-6.6020599913279625,6.2137041091918945
-5.0,5.503796577453613
-5.0,5.223828315734863
-7.431798275933005,4.9496636390686035
-6.425968732272281,6.4701104164123535
-5.638272163982407,5.673924446105957
-7.309803919971486,7.739076614379883
-5.300986568387119,5.939089298248291
-5.0,5.637613296508789
-5.638272163982407,5.4320759773254395
-5.0,5.173130512237549
-5.0,5.318909168243408
-5.0,5.129574775695801
-5.0,5.199185848236084
-5.0,5.032058238983154
-5.0,5.1555914878845215
-4.409994580348671,6.197765827178955
-4.0,4.0022454261779785
-6.040958607678906,5.239986896514893
-8.0,6.9841790199279785
-5.789949150124863,5.266007900238037
-5.0,5.025759220123291
-5.0,5.169509410858154
-5.0,5.716296672821045
-5.0,5.365663051605225
-5.1938200260161125,5.220274448394775
-7.700057099977233,8.240351676940918
-7.550059011226662,7.21585750579834
-5.0,5.163672924041748
-5.769551078621726,6.087566375732422
-5.0,5.292397975921631
-6.997833938243492,5.803440570831299
-5.0,5.646659851074219
-5.823908740944319,5.248488903045654
diff --git a/runs/20260125_080409_BindingDB_Kd/test_markdowntable.txt b/runs/20260125_080409_BindingDB_Kd/test_markdowntable.txt
deleted file mode 100644
index cf9ef9bbe767f263c10c32cb99d03d79782f9e2e..0000000000000000000000000000000000000000
--- a/runs/20260125_080409_BindingDB_Kd/test_markdowntable.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-+--------+---------------------+--------------+-------------------+
-| MSE | Pearson Correlation | with p-value | Concordance Index |
-+--------+---------------------+--------------+-------------------+
-| 0.6668 | 0.7679 | 0.0000 | 0.8083 |
-+--------+---------------------+--------------+-------------------+
\ No newline at end of file
diff --git a/runs/20260125_080409_BindingDB_Kd/valid_markdowntable.txt b/runs/20260125_080409_BindingDB_Kd/valid_markdowntable.txt
deleted file mode 100644
index 75d1ff0eddcd9a0f6014ddb1a0a5a33b4b066979..0000000000000000000000000000000000000000
--- a/runs/20260125_080409_BindingDB_Kd/valid_markdowntable.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-+---------+--------+---------------------+--------------+-------------------+
-| # epoch | MSE | Pearson Correlation | with p-value | Concordance Index |
-+---------+--------+---------------------+--------------+-------------------+
-| epoch 0 | 1.2659 | 0.4823 | 0.0000 | 0.6973 |
-| epoch 1 | 0.9707 | 0.6357 | 0.0000 | 0.7518 |
-| epoch 2 | 0.8869 | 0.6826 | 0.0000 | 0.7689 |
-| epoch 3 | 0.8159 | 0.7071 | 0.0000 | 0.7817 |
-| epoch 4 | 0.7900 | 0.7184 | 0.0000 | 0.7847 |
-| epoch 5 | 0.7666 | 0.7283 | 0.0000 | 0.7905 |
-| epoch 6 | 0.7733 | 0.7384 | 0.0000 | 0.7980 |
-| epoch 7 | 0.7346 | 0.7413 | 0.0000 | 0.7972 |
-| epoch 8 | 0.7111 | 0.7544 | 0.0000 | 0.8047 |
-| epoch 9 | 0.6937 | 0.7586 | 0.0000 | 0.8065 |
-+---------+--------+---------------------+--------------+-------------------+
\ No newline at end of file
diff --git a/runs/20260125_104915_KIBA/model.pt b/runs/20260125_104915_KIBA/model.pt
deleted file mode 100644
index 1d1b66181722c996c79907b13d5faa7004fd2232..0000000000000000000000000000000000000000
--- a/runs/20260125_104915_KIBA/model.pt
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b7ad909a21bace4e5e8074918d9504b44d781a736ac177a28929db4650258cfb
-size 14636639
diff --git a/runs/20260125_104915_KIBA/predictions_test.csv b/runs/20260125_104915_KIBA/predictions_test.csv
deleted file mode 100644
index 997292b02fd8d361341929e5533df9653877d5b6..0000000000000000000000000000000000000000
--- a/runs/20260125_104915_KIBA/predictions_test.csv
+++ /dev/null
@@ -1,11767 +0,0 @@
-y_true,y_pred
-7.946921547407927,7.9139885902404785
-7.946921547407927,7.923817157745361
-7.924453006674053,7.897826671600342
-7.950781972366453,7.935779094696045
-7.9430951409681345,7.941564083099365
-7.9393021526221474,7.958052158355713
-7.9616219366397445,7.929521083831787
-7.882728704344236,7.888711929321289
-7.950781972366453,7.908116817474365
-7.928117974144348,7.904427528381348
-7.920818811243059,7.9258270263671875
-7.935542022791058,7.927551746368408
-7.935542022791058,7.925362586975098
-7.950781972366453,7.926333427429199
-7.91721462968355,7.932280540466309
-7.913640203677234,7.921783447265625
-7.954677021213342,7.960187911987305
-7.924453006674053,7.902576446533203
-7.931814161156377,7.929820537567139
-7.89962956062971,7.914558410644531
-7.920818811243059,7.90700626373291
-7.950781972366453,7.928012371063232
-7.950781972366453,7.928575038909912
-7.950781972366453,7.9503397941589355
-7.879527744657629,7.931474208831787
-7.889410352488291,7.911200523376465
-7.920818811243059,7.9162421226501465
-7.954677021213342,7.9579548835754395
-7.931814161156377,7.893360137939453
-7.931814161156377,7.89554500579834
-7.950781972366453,7.9454803466796875
-7.920818811243059,7.920156002044678
-7.924453006674053,7.919247150421143
-7.924453006674053,7.928775310516357
-7.924453006674053,7.921444892883301
-7.954677021213342,7.907433986663818
-7.9393021526221474,7.897824764251709
-7.931814161156377,7.921711444854736
-7.924453006674053,7.899682521820068
-7.928117974144348,7.915303707122803
-7.9737577757544535,7.969920635223389
-7.8761493177145505,7.91078519821167
-7.9737577757544535,7.9416937828063965
-7.928117974144348,7.926420211791992
-7.946921547407927,7.914513111114502
-7.954677021213342,7.944393634796143
-7.950781972366453,7.923766136169434
-7.9913998274291025,7.949655055999756
-7.928117974144348,7.902255058288574
-7.995678626217357,7.925786018371582
-7.920818811243059,7.894381046295166
-7.9430951409681345,7.903611660003662
-7.924453006674053,7.914971351623535
-7.931814161156377,7.921879291534424
-7.978810702253626,7.964518070220947
-7.89962956062971,7.916473388671875
-7.9393021526221474,7.92367696762085
-7.950781972366453,7.940051078796387
-7.954677021213342,7.946993827819824
-7.950781972366453,7.9262285232543945
-8.008819571765459,7.9834513664245605
-7.9393021526221474,7.937643527984619
-7.896196359268842,7.945285320281982
-7.928117974144348,7.911356449127197
-7.950781972366453,7.94858980178833
-7.950781972366453,7.935202598571777
-7.924453006674053,7.907784938812256
-7.9737577757544535,7.932544231414795
-7.946921547407927,7.93358850479126
-7.9430951409681345,7.897806644439697
-7.896196359268842,7.909444808959961
-7.954677021213342,7.934070587158203
-7.9393021526221474,7.92205810546875
-7.9430951409681345,7.928441047668457
-7.889410352488291,7.883263111114502
-7.966576241738391,7.919658184051514
-7.9430951409681345,7.921879768371582
-7.809726024550969,7.895671367645264
-7.946921547407927,7.9398980140686035
-7.9393021526221474,7.932875156402588
-7.931814161156377,7.896554470062256
-7.889410352488291,7.9127373695373535
-7.923581356476356,7.906468391418457
-7.946921547407927,7.940266132354736
-7.935542022791058,7.9201741218566895
-7.9393021526221474,7.935934543609619
-7.95090181210265,7.938215732574463
-7.910094953104535,7.913990020751953
-7.924453006674053,7.905179977416992
-7.9430951409681345,7.918979167938232
-7.9737577757544535,7.933269500732422
-7.950781972366453,7.916795253753662
-7.978810702253626,7.9291157722473145
-7.924453006674053,7.927588939666748
-7.935542022791058,7.937958240509033
-7.944083401933535,7.914785861968994
-7.950781972366453,7.943244457244873
-7.935542022791058,7.913650989532471
-7.950781972366453,7.942716121673584
-7.832673025823477,7.91591215133667
-7.950781972366453,7.947421073913574
-7.950781972366453,7.941319942474365
-7.935542022791058,7.911708831787109
-7.924453006674053,7.920775413513184
-7.954677021213342,7.942612171173096
-7.882728704344236,7.91262674331665
-7.920818811243059,7.906863689422607
-7.924453006674053,7.924058437347412
-7.954677021213342,7.935797214508057
-7.950781972366453,7.921823978424072
-7.829768510087842,7.912936210632324
-7.935542022791058,7.940329074859619
-7.9430951409681345,7.914438247680664
-7.954677021213342,7.945505142211914
-7.950781972366453,7.94217586517334
-7.968365045565531,7.955126762390137
-7.946921547407927,7.942492485046387
-7.857937595672809,7.879627704620361
-7.946921547407927,7.923022747039795
-7.9393021526221474,7.901054382324219
-7.91721462968355,7.914085388183594
-7.950781972366453,7.936483860015869
-7.920818811243059,7.920516014099121
-7.982923651140671,7.911525249481201
-7.9393021526221474,7.935779094696045
-7.9393021526221474,7.909394264221191
-7.935542022791058,7.920982837677002
-7.954677021213342,7.934431552886963
-7.950781972366453,7.913183212280273
-7.889355338226999,7.953859806060791
-7.950781972366453,7.962985515594482
-7.913640203677234,7.916264057159424
-7.950781972366453,7.931499004364014
-7.928936536236001,7.893177509307861
-7.9393021526221474,7.916930198669434
-7.924453006674053,7.921822547912598
-7.9430951409681345,7.921950340270996
-7.950781972366453,7.9324259757995605
-7.9737577757544535,7.944608688354492
-7.928117974144348,7.908679962158203
-7.950781972366453,7.923769474029541
-7.889410352488291,7.9333906173706055
-7.9430951409681345,7.915285110473633
-7.950781972366453,7.904037952423096
-7.9335681432273475,7.899990558624268
-7.924453006674053,7.918447017669678
-7.970532618892763,7.9539642333984375
-7.9393021526221474,7.91983699798584
-7.920818811243059,7.910597324371338
-7.924453006674053,7.910478115081787
-7.928117974144348,7.9067463874816895
-7.903090094245322,7.9081711769104
-7.950781972366453,7.927370548248291
-7.950781972366453,7.910152435302734
-7.950781972366453,7.9093780517578125
-7.950781972366453,7.930585861206055
-7.860119116630385,7.913995265960693
-7.931814161156377,7.906951427459717
-7.9393021526221474,7.895037651062012
-7.89962956062971,7.908858299255371
-7.895765270234161,7.905666351318359
-7.9393021526221474,7.913307189941406
-7.954677021213342,7.922783374786377
-7.903090094245322,7.883116722106934
-7.928117974144348,7.904247283935547
-7.896196359268842,7.89119291305542
-7.935542022791058,7.926279544830322
-7.847706165863548,7.877883434295654
-7.954677021213342,7.932816028594971
-7.954677021213342,7.952363014221191
-7.946921547407927,7.9045186042785645
-7.8761493177145505,7.899474620819092
-7.931814161156377,7.904426574707031
-7.931814161156377,7.92067813873291
-7.9430951409681345,7.933735370635986
-7.8761493177145505,7.917043209075928
-7.946921547407927,7.911136627197266
-7.91721462968355,7.921827793121338
-7.924453006674053,7.9013566970825195
-7.954677021213342,7.9251389503479
-7.8728955601551585,7.895293712615967
-7.896822568967468,7.9159464836120605
-7.9393021526221474,7.922593116760254
-7.910094953104535,7.930667400360107
-7.950781972366453,7.924570560455322
-7.946921547407927,7.91042423248291
-7.954677021213342,7.9345703125
-7.946921547407927,7.925358295440674
-7.946921547407927,7.932071208953857
-7.950781972366453,7.92742395401001
-7.910094953104535,7.942767143249512
-7.910094953104535,7.907032489776611
-7.924453006674053,7.917212009429932
-7.9393021526221474,7.932342052459717
-7.9430951409681345,7.9364094734191895
-7.954677021213342,7.950414657592773
-7.879425560900211,7.889778137207031
-7.935542022791058,7.928116321563721
-7.9393021526221474,7.935247898101807
-7.920818811243059,7.909421443939209
-7.950781972366453,7.901051998138428
-7.860119116630385,7.909256458282471
-7.954677021213342,7.924825191497803
-7.9393021526221474,7.93526029586792
-7.9430951409681345,7.927748680114746
-7.950781972366453,7.92942476272583
-7.950781972366453,7.944090366363525
-7.950781972366453,7.93626594543457
-7.950781972366453,7.915505886077881
-7.896708615962599,7.93647575378418
-7.886056354845152,7.902180194854736
-7.9737577757544535,7.91372537612915
-7.9430951409681345,7.935472011566162
-7.910094953104535,7.935413837432861
-7.903090094245322,7.906275749206543
-7.924453006674053,7.918135643005371
-7.910094953104535,7.9125518798828125
-7.924453006674053,7.915350437164307
-7.954677021213342,7.945050239562988
-7.906578398789698,7.896469593048096
-7.924453006674053,7.931875705718994
-7.995678626217357,7.956845760345459
-7.924453006674053,7.920340538024902
-7.928117974144348,7.917553424835205
-7.928117974144348,7.909759044647217
-7.946921547407927,7.923977851867676
-7.954677021213342,7.935831069946289
-7.924453006674053,7.915055751800537
-7.920818811243059,7.9014201164245605
-7.9393021526221474,7.916021823883057
-7.950781972366453,7.94199800491333
-7.946921547407927,7.945032596588135
-7.946921547407927,7.931805610656738
-7.946921547407927,7.936342716217041
-7.9430951409681345,7.95380163192749
-7.906578398789698,7.907394886016846
-7.970616219270671,7.92575740814209
-7.954677021213342,7.955818176269531
-7.910094953104535,7.907933712005615
-7.924453006674053,7.917177677154541
-7.9393021526221474,7.931366920471191
-7.946921547407927,7.941721439361572
-7.9430951409681345,7.914538860321045
-7.920818811243059,7.906352996826172
-7.916637144431181,7.938230991363525
-7.928117974144348,7.904266357421875
-7.954677021213342,7.964610576629639
-7.954677021213342,7.923001289367676
-7.946921547407927,7.924841403961182
-7.863280055279963,7.90042781829834
-7.920818811243059,7.936439514160156
-7.9393021526221474,7.915603160858154
-7.928117974144348,7.898376941680908
-7.920818811243059,7.926927089691162
-7.9430951409681345,7.9258294105529785
-7.920818811243059,7.909890651702881
-7.9430951409681345,7.918330669403076
-7.85078088734462,7.879475116729736
-7.982923651140671,7.9294514656066895
-7.954677021213342,7.951601028442383
-7.954677021213342,7.9474873542785645
-7.920818811243059,7.921936511993408
-7.882728704344236,7.930527210235596
-7.889410352488291,7.8796916007995605
-7.954677021213342,7.953455448150635
-7.954677021213342,7.931253910064697
-7.9430951409681345,7.932836055755615
-7.931814161156377,7.92905855178833
-7.946921547407927,7.910706043243408
-7.928117974144348,7.893612384796143
-7.982923651140671,7.926259994506836
-7.844664854175832,7.930100917816162
-7.9393021526221474,7.9338555335998535
-7.9430951409681345,7.915252208709717
-7.924453006674053,7.882723331451416
-7.906578398789698,7.896819591522217
-7.954677021213342,7.9206862449646
-7.935638432979158,7.943111896514893
-7.826774591089415,7.920344829559326
-7.946921547407927,7.942678928375244
-7.9430951409681345,7.962810516357422
-7.892790308673911,7.9177374839782715
-7.954677021213342,7.926592826843262
-7.920818811243059,7.903494358062744
-7.946921547407927,7.907956600189209
-7.970616219270671,7.946475505828857
-7.913640203677234,7.922383785247803
-7.913640203677234,7.935597896575928
-7.950781972366453,7.929080486297607
-7.946921547407927,7.903508186340332
-7.950781972366453,7.916558742523193
-7.920818811243059,7.927653789520264
-7.946921547407927,7.959556579589844
-7.924453006674053,7.912981986999512
-7.946921547407927,7.916683673858643
-7.935542022791058,7.9322381019592285
-7.946921547407927,7.91355562210083
-7.954677021213342,7.91636323928833
-7.931814161156377,7.929523944854736
-7.924453006674053,7.935187816619873
-7.924453006674053,7.9291791915893555
-7.9393021526221474,7.924149513244629
-7.924453006674053,7.90097713470459
-7.96257349994767,7.970739364624023
-7.950781972366453,7.932949542999268
-7.9430951409681345,7.930398464202881
-7.954677021213342,7.91178560256958
-7.920818811243059,7.922224998474121
-7.889410352488291,7.896942615509033
-7.950781972366453,7.938133716583252
-7.924453006674053,7.921683311462402
-7.8728955601551585,7.8908514976501465
-7.9393021526221474,7.928170680999756
-7.9430951409681345,7.923805236816406
-7.946921547407927,7.909628391265869
-7.9430951409681345,7.935767650604248
-7.910094953104535,7.907571315765381
-7.982923651140671,7.933380603790283
-7.954677021213342,7.907975673675537
-7.982923651140671,7.94028902053833
-7.928117974144348,7.919375419616699
-7.954677021213342,7.939296722412109
-7.924453006674053,7.903664588928223
-7.860119116630385,7.91708517074585
-7.946921547407927,7.916078090667725
-7.928117974144348,7.907650947570801
-7.946921547407927,7.92011833190918
-7.9430951409681345,7.920583724975586
-7.91721462968355,7.905493259429932
-7.946921547407927,7.920948505401611
-7.924453006674053,7.944125652313232
-7.920818811243059,7.90744161605835
-7.924453006674053,7.9276957511901855
-7.928117974144348,7.9235920906066895
-7.9393021526221474,7.926929950714111
-7.924453006674053,7.899390697479248
-7.946921547407927,7.9423322677612305
-7.924453006674053,7.918837070465088
-7.950781972366453,7.926624774932861
-7.974694136660875,7.935479640960693
-7.910094953104535,7.908411502838135
-7.854304717060746,7.884249210357666
-7.906578398789698,7.9079766273498535
-7.950781972366453,7.940786361694336
-7.935542022791058,7.914374828338623
-7.9393021526221474,7.929460048675537
-7.954677021213342,7.9559736251831055
-7.896196359268842,7.907694339752197
-7.946921547407927,7.919430732727051
-7.906578398789698,7.884943008422852
-7.924453006674053,7.9176225662231445
-7.946921547407927,7.950287342071533
-7.950781972366453,7.896756649017334
-7.982966659490206,7.944430828094482
-7.892790308673911,7.895177364349365
-7.931814161156377,7.908280372619629
-7.924453006674053,7.903293609619141
-7.924453006674053,7.889558792114258
-7.844664854175832,7.900757312774658
-7.946921547407927,7.9384942054748535
-7.910094953104535,7.903722286224365
-7.9430951409681345,7.940488338470459
-7.954677021213342,7.942741870880127
-7.995678626217357,7.96279764175415
-7.959562946911667,7.914348125457764
-7.950781972366453,7.95246696472168
-7.9958644827013945,7.9706573486328125
-7.9393021526221474,7.9392781257629395
-7.970532618892763,7.972564220428467
-7.928117974144348,7.916183948516846
-7.9393021526221474,7.939467430114746
-7.950781972366453,7.947464942932129
-7.950781972366453,7.9392409324646
-7.9430951409681345,7.920440673828125
-7.950781972366453,7.922299385070801
-7.928117974144348,7.910958766937256
-7.920818811243059,7.904012680053711
-7.950781972366453,7.974765777587891
-7.931814161156377,7.90300178527832
-7.9737577757544535,7.9115071296691895
-7.954677021213342,7.936259746551514
-7.903090094245322,7.883422374725342
-7.91721462968355,7.910217761993408
-7.946921547407927,7.929132461547852
-7.928117974144348,7.919291973114014
-7.935542022791058,7.918947219848633
-7.954677021213342,7.951460361480713
-7.935542022791058,7.920396327972412
-7.935542022791058,7.897121906280518
-7.870077682537097,7.896149158477783
-7.970532618892763,7.908888816833496
-7.905110200811745,7.9353485107421875
-7.920818811243059,7.894504070281982
-7.9393021526221474,7.920121669769287
-7.924453006674053,7.932642459869385
-7.931814161156377,7.929482936859131
-7.946921547407927,7.905947685241699
-7.978940776011532,7.963621616363525
-7.954677021213342,7.952399730682373
-7.876350205074754,7.907830715179443
-7.954677021213342,7.938081741333008
-7.935542022791058,7.937405109405518
-7.9430951409681345,7.9191789627075195
-7.939302143143198,7.9330902099609375
-7.924453006674053,7.902154922485352
-7.920818811243059,7.884932994842529
-7.91721462968355,7.90128231048584
-7.920818811243059,7.919394016265869
-7.954677021213342,7.922684192657471
-7.946921547407927,7.918874263763428
-7.882728704344236,7.888852119445801
-7.946921547407927,7.945056438446045
-7.931814161156377,7.906527996063232
-7.954677021213342,7.948052406311035
-7.954677021213342,7.922824382781982
-7.924453006674053,7.926308631896973
-7.910094953104535,7.909962177276611
-7.950781972366453,7.9268879890441895
-7.869665979871627,7.8811798095703125
-7.950781972366453,7.952054023742676
-7.926281689968135,7.927734851837158
-7.946921547407927,7.9422078132629395
-7.946921547407927,7.9231791496276855
-7.9430951409681345,7.906287670135498
-7.954677021213342,7.913614749908447
-7.847706165863548,7.881026744842529
-7.946921547407927,7.9361042976379395
-7.950781972366453,7.9302592277526855
-7.906578398789698,7.907264232635498
-7.846002795247612,7.889631748199463
-7.982923651140671,7.939153671264648
-7.928117974144348,7.901031017303467
-7.920818811243059,7.902220726013184
-7.924453006674053,7.906843662261963
-7.899571227272106,7.897815704345703
-7.950781972366453,7.938809394836426
-7.882728704344236,7.880757808685303
-7.954677021213342,7.940260887145996
-7.946921547407927,7.920605182647705
-7.907429380155008,7.896888732910156
-7.970616219270671,7.921184062957764
-7.928117974144348,7.9230732917785645
-7.950781972366453,7.929039478302002
-7.946921547407927,7.9174017906188965
-7.931814161156377,7.888794422149658
-7.928117974144348,7.902766704559326
-7.950781972366453,7.944339275360107
-7.931814161156377,7.895280838012695
-7.920818811243059,7.904428005218506
-7.835637836224461,7.917768955230713
-7.954677021213342,7.918173313140869
-7.9393021526221474,7.921893119812012
-7.892790308673911,7.910391330718994
-7.923581356476356,7.919045925140381
-7.882728704344236,7.8624491691589355
-7.954677021213342,7.951375484466553
-7.975453335860696,7.955164432525635
-7.928117974144348,7.916990756988525
-7.950781972366453,7.933306694030762
-7.913640203677234,7.9293999671936035
-7.920818811243059,7.9068074226379395
-7.882728704344236,7.919723033905029
-7.924453006674053,7.896483421325684
-7.928886632693791,7.905539035797119
-7.950781972366453,7.944951057434082
-7.9913998274291025,7.961437702178955
-7.946921547407927,7.939873218536377
-7.928117974144348,7.921206951141357
-7.9430951409681345,7.921238422393799
-7.950781972366453,7.926607608795166
-7.928117974144348,7.919010639190674
-7.82330639418584,7.884663105010986
-7.9430951409681345,7.887649059295654
-7.9393021526221474,7.934592247009277
-7.9393021526221474,7.924378871917725
-7.950781972366453,7.932654857635498
-7.924453006674053,7.91796875
-7.869665979871627,7.935295104980469
-7.931814161156377,7.920863151550293
-7.950781972366453,7.907641887664795
-7.8416326138557455,7.888723373413086
-7.924453006674053,7.888639450073242
-7.924453006674053,7.905649662017822
-7.89962956062971,7.893455982208252
-7.9430951409681345,7.922416687011719
-7.954677021213342,7.939169406890869
-7.886056354845152,7.880306720733643
-7.946921547407927,7.916147708892822
-7.950781972366453,7.953539848327637
-7.91721462968355,7.939706325531006
-7.889410352488291,7.896571159362793
-7.931814161156377,7.919910907745361
-7.924453006674053,7.887811660766602
-7.950781972366453,7.916267395019531
-7.935542022791058,7.926223278045654
-7.924453006674053,7.88114595413208
-7.954677021213342,7.938173770904541
-7.946921547407927,7.916562080383301
-7.878981826112309,7.902784824371338
-7.946921547407927,7.921403408050537
-7.931814161156377,7.913289546966553
-7.950781972366453,7.945169925689697
-7.879425560900211,7.883990287780762
-7.9393021526221474,7.9333367347717285
-7.869665979871627,7.88785982131958
-7.920818811243059,7.909879684448242
-7.950781972366453,7.923501014709473
-7.85078088734462,7.871127128601074
-7.950781972366453,7.937376976013184
-7.950781972366453,7.917124271392822
-7.954677021213342,7.955883502960205
-7.924453006674053,7.90503454208374
-7.950781972366453,7.934467315673828
-7.863280055279963,7.9361395835876465
-7.924453006674053,7.919920444488525
-7.913640203677234,7.900589942932129
-7.896196359268842,7.882586479187012
-7.954677021213342,7.940420627593994
-7.950781972366453,7.935679912567139
-7.954677021213342,7.965554714202881
-7.995678626217357,7.929467678070068
-7.948658283730227,7.919497013092041
-7.954677021213342,7.935853958129883
-7.9393021526221474,7.9362473487854
-7.931814161156377,7.913782596588135
-7.950781972366453,7.934689521789551
-7.950781972366453,7.912855625152588
-7.935734864536909,7.8766703605651855
-7.913640203677234,7.928995609283447
-7.9393021526221474,7.8908185958862305
-7.903090094245322,7.913576602935791
-7.910094953104535,7.926243305206299
-7.946921547407927,7.894790172576904
-7.879705324991467,7.894201755523682
-7.946921547407927,7.93101692199707
-7.924453006674053,7.902169227600098
-7.946921547407927,7.916079998016357
-7.950781972366453,7.910202503204346
-7.928117974144348,7.902263641357422
-7.954677021213342,7.923901557922363
-7.931814161156377,7.910938739776611
-7.954677021213342,7.939767360687256
-7.950781972366453,7.9497246742248535
-7.954677021213342,7.930334568023682
-7.954677021213342,7.909687519073486
-7.927336730250859,7.910219669342041
-7.931814161156377,7.904544830322266
-7.9393021526221474,7.897953510284424
-7.924453006674053,7.909554958343506
-7.889410352488291,7.928536891937256
-7.892790308673911,7.913857936859131
-7.935542022791058,7.921314716339111
-7.924453006674053,7.921815872192383
-7.9393021526221474,7.934414386749268
-7.950781972366453,7.928912162780762
-7.931471237773835,7.894433498382568
-7.954677021213342,7.9428629875183105
-7.950781972366453,7.936172008514404
-7.8761493177145505,7.900753021240234
-7.970532618892763,7.941465854644775
-7.920818811243059,7.933830738067627
-7.950781972366453,7.948864459991455
-7.924453006674053,7.89762544631958
-7.935542022791058,7.886867046356201
-7.886056354845152,7.910129070281982
-7.85078088734462,7.922745704650879
-7.920818811243059,7.898895740509033
-7.9393021526221474,7.9099297523498535
-7.950781972366453,7.91019868850708
-7.931814161156377,7.897202014923096
-7.995678626217357,7.929358005523682
-7.935542022791058,7.9003682136535645
-7.924453006674053,7.924270153045654
-7.954677021213342,7.951287746429443
-7.950781972366453,7.9116950035095215
-7.9393021526221474,7.929893970489502
-7.920818811243059,7.9159979820251465
-7.928117974144348,7.940449237823486
-7.950781972366453,7.915831089019775
-7.9393021526221474,7.906283855438232
-7.946921547407927,7.90831995010376
-7.950781972366453,7.946390628814697
-7.913640203677234,7.944973468780518
-7.935542022791058,7.925747394561768
-7.903090094245322,7.920138359069824
-7.950781972366453,7.922714710235596
-7.9393021526221474,7.929181098937988
-7.990339285400088,7.96236515045166
-7.89962956062971,7.902026653289795
-7.924453006674053,7.905977249145508
-7.906578398789698,7.941074848175049
-7.931814161156377,7.90457010269165
-7.9098263336041486,7.9122209548950195
-7.954677021213342,7.928649425506592
-7.954677021213342,7.942896366119385
-7.924453006674053,7.908342361450195
-7.954677021213342,7.933496475219727
-7.9430951409681345,7.927002906799316
-7.995678626217357,7.9876627922058105
-7.950781972366453,7.920975685119629
-7.950781972366453,7.91964054107666
-7.928117974144348,7.9215898513793945
-7.920818811243059,7.903204917907715
-7.9430951409681345,7.932847499847412
-7.913640203677234,7.925197124481201
-7.9393021526221474,7.918801784515381
-7.920818811243059,7.92210054397583
-7.924453006674053,7.915822982788086
-7.982966659490206,7.972909450531006
-7.9393021526221474,7.916276454925537
-7.950781972366453,7.934087753295898
-7.942204849789735,7.948777675628662
-7.946921547407927,7.945623874664307
-7.913640203677234,7.945590496063232
-7.866459873882536,7.887877941131592
-7.954677021213342,7.943117618560791
-7.950781972366453,7.943670749664307
-7.924453006674053,7.888396263122559
-7.928117974144348,7.909530162811279
-7.973579366316557,7.950333595275879
-7.866459873882536,7.908614635467529
-7.880728245831804,7.928231716156006
-7.928117974144348,7.911367893218994
-7.9430951409681345,7.946114540100098
-7.9393021526221474,7.9267473220825195
-7.954677021213342,7.941486358642578
-7.924453006674053,7.925678730010986
-7.950781972366453,7.9372029304504395
-7.903090094245322,7.897879123687744
-7.954677021213342,7.918654918670654
-7.946921547407927,7.913668155670166
-7.863280055279963,7.920362949371338
-7.928117974144348,7.958316326141357
-7.9393021526221474,7.908075332641602
-7.932879511732186,7.889045238494873
-7.903090094245322,7.892683506011963
-7.950781972366453,7.934383869171143
-7.946921547407927,7.931549549102783
-7.995678626217357,7.963418960571289
-7.924453006674053,7.9207258224487305
-7.910094953104535,7.921326160430908
-7.924453006674053,7.91273832321167
-7.91721462968355,7.932107925415039
-7.879425560900211,7.925182342529297
-7.924453006674053,7.904558181762695
-7.946358101683472,7.932329177856445
-7.946921547407927,7.921140670776367
-7.924453006674053,7.938289165496826
-7.9430951409681345,7.9388957023620605
-7.935542022791058,7.934641361236572
-7.950781972366453,7.929829120635986
-7.950781972366453,7.934962749481201
-7.935542022791058,7.905828475952148
-7.866459873882536,7.910762310028076
-7.920818811243059,7.907727241516113
-7.920818811243059,7.958922386169434
-7.838693701646425,7.911077499389648
-7.928117974144348,7.898717403411865
-7.950781972366453,7.93629789352417
-7.9393021526221474,7.936135768890381
-7.8728955601551585,7.932607173919678
-7.913199594653918,7.893734455108643
-7.954677021213342,7.9465718269348145
-7.970616219270671,7.933775424957275
-7.9430951409681345,7.92317533493042
-7.912248836964282,7.91508150100708
-7.920818811243059,7.903726100921631
-7.954677021213342,7.939266681671143
-7.920818811243059,7.9073405265808105
-7.954677021213342,7.929769039154053
-7.891097042468006,7.934701442718506
-7.964781356411861,7.9097065925598145
-7.928117974144348,7.911690711975098
-7.950781972366453,7.9180402755737305
-7.950781972366453,7.918654441833496
-7.8657311089458215,7.896288871765137
-7.950781972366453,7.9476776123046875
-7.924453006674053,7.912126064300537
-7.870906197873508,7.930914878845215
-7.903090094245322,7.8782830238342285
-7.913640203677234,7.892611026763916
-7.946921547407927,7.914796829223633
-7.946921547407927,7.913292407989502
-7.91721462968355,7.916785717010498
-7.931814161156377,7.922192096710205
-7.950781972366453,7.927961826324463
-7.970532618892763,7.963872909545898
-7.931814161156377,7.8961639404296875
-7.931814161156377,7.911028861999512
-7.9393021526221474,7.908752918243408
-7.9393021526221474,7.939215183258057
-7.924453006674053,7.930698871612549
-7.96981377267859,7.949214458465576
-7.906578398789698,7.885998249053955
-7.946921547407927,7.928211688995361
-7.9393021526221474,7.924892902374268
-7.928117974144348,7.903903484344482
-7.935542022791058,7.9108405113220215
-7.924453006674053,7.900977611541748
-7.9430951409681345,7.942616939544678
-7.935542022791058,7.9129204750061035
-7.942518200864486,7.8896098136901855
-7.924453006674053,7.920385360717773
-7.931814161156377,7.929230213165283
-7.931814161156377,7.933570384979248
-7.910094953104535,7.899703502655029
-7.928117974144348,7.894985198974609
-7.869732506393041,7.886765480041504
-7.924453006674053,7.91598653793335
-7.872861820710693,7.888376712799072
-7.866459873882536,7.896988391876221
-7.954677021213342,7.925595760345459
-7.935542022791058,7.924671649932861
-7.924453006674053,7.906113624572754
-7.946921547407927,7.961146354675293
-7.946921547407927,7.922194480895996
-7.950781972366453,7.957738399505615
-7.932370292702363,7.937948226928711
-7.950781972366453,7.930813312530518
-7.946921547407927,7.9101715087890625
-7.954677021213342,7.920450687408447
-7.8761493177145505,7.929347515106201
-7.85078088734462,7.863524913787842
-7.931814161156377,7.884872913360596
-7.954677021213342,7.94813346862793
-7.943055911701025,7.949885368347168
-7.966576241738391,7.962066173553467
-7.84475186285368,7.913547039031982
-7.931814161156377,7.890920162200928
-7.950781972366453,7.9241862297058105
-7.920818811243059,7.926060199737549
-7.935542022791058,7.905696392059326
-7.950781972366453,7.921915054321289
-7.91721462968355,7.900843143463135
-7.954677021213342,7.945919990539551
-7.924453006674053,7.932451248168945
-7.924453006674053,7.917284965515137
-7.924453006674053,7.918018817901611
-7.946921547407927,7.920284748077393
-7.9393021526221474,7.971658229827881
-7.964781356411861,7.913436412811279
-7.928117974144348,7.923475742340088
-7.950781972366453,7.935401439666748
-7.946921547407927,7.932922840118408
-7.954677021213342,7.923241138458252
-7.931814161156377,7.915806293487549
-7.924453006674053,7.894413471221924
-7.928117974144348,7.945610523223877
-7.928117974144348,7.912491321563721
-7.950781972366453,7.912106990814209
-7.950781972366453,7.930173873901367
-7.954677021213342,7.942611217498779
-7.9430951409681345,7.919308185577393
-7.903090094245322,7.915041446685791
-7.91721462968355,7.925210475921631
-7.882728704344236,7.909403324127197
-7.920818811243059,7.924598217010498
-7.950781972366453,7.927599906921387
-7.958607309235428,7.930450439453125
-7.954677021213342,7.919602870941162
-7.928117974144348,7.9340715408325195
-7.9430951409681345,7.93543004989624
-7.910094953104535,7.913081645965576
-7.9393021526221474,7.914448261260986
-7.903090094245322,7.918094158172607
-7.91721462968355,7.900633335113525
-7.945802750156343,7.925332546234131
-7.903090094245322,7.911546230316162
-7.8728955601551585,7.9205193519592285
-7.954677021213342,7.960505962371826
-7.910094953104535,7.912705898284912
-7.928117974144348,7.913244247436523
-7.954677021213342,7.9466376304626465
-7.954677021213342,7.922022342681885
-7.950781972366453,7.927836894989014
-7.995678626217357,7.937380313873291
-7.9393021526221474,7.909140110015869
-7.922491400135772,7.9241814613342285
-7.950781972366453,7.940998077392578
-7.920818811243059,7.8892669677734375
-7.935542022791058,7.92629861831665
-7.924453006674053,7.9074931144714355
-7.928117974144348,7.92354154586792
-7.911690158781656,7.893406391143799
-7.931814161156377,7.926965236663818
-7.931814161156377,7.8948588371276855
-7.954677021213342,7.9395365715026855
-7.946921547407927,7.90822172164917
-7.954677021213342,7.940228462219238
-7.946921547407927,7.923770427703857
-7.954677021213342,7.922660827636719
-7.935542022791058,7.911374092102051
-7.9430951409681345,7.933449745178223
-7.931814161156377,7.913642406463623
-7.946921547407927,7.919406414031982
-7.96257349994767,7.958082675933838
-7.910094953104535,7.8827290534973145
-7.954677021213342,7.920783042907715
-7.9393021526221474,7.894493103027344
-7.9737577757544535,7.9705119132995605
-7.95942036130495,7.949852466583252
-7.856986114171083,7.933207035064697
-7.954677021213342,7.9305901527404785
-7.882728704344236,7.880315780639648
-7.924453006674053,7.901321887969971
-7.950781972366453,7.917038440704346
-7.9430951409681345,7.911196231842041
-7.9430951409681345,7.93359899520874
-7.950781972366453,7.935307025909424
-7.91721462968355,7.952740669250488
-7.809726024550969,7.9243059158325195
-7.920818811243059,7.89905309677124
-7.924453006674053,7.921787261962891
-7.9430951409681345,7.946104526519775
-7.9393021526221474,7.932126045227051
-7.950781972366453,7.928973197937012
-7.832621809466494,7.946091175079346
-7.9393021526221474,7.9228081703186035
-7.954677021213342,7.913203716278076
-7.9430951409681345,7.948119163513184
-7.935542022791058,7.896805763244629
-7.970532618892763,7.957733631134033
-7.928117974144348,7.903596878051758
-7.928117974144348,7.9177565574646
-7.954677021213342,7.947691440582275
-7.9737577757544535,7.932969570159912
-7.931814161156377,7.902700901031494
-7.946921547407927,7.916218280792236
-7.856238831797546,7.93110466003418
-7.928117974144348,7.91369104385376
-7.931814161156377,7.918562889099121
-7.924453006674053,7.910232067108154
-7.935542022791058,7.927945613861084
-7.9430951409681345,7.92454195022583
-7.946921547407927,7.943381309509277
-7.880892069031858,7.888599395751953
-7.954677021213342,7.933783054351807
-7.954677021213342,7.962590217590332
-7.931814161156377,7.890664100646973
-7.928117974144348,7.915771007537842
-7.920818811243059,7.911778450012207
-7.956299563220691,7.947298526763916
-7.950781972366453,7.937632083892822
-7.9393021526221474,7.925190448760986
-7.9393021526221474,7.933268070220947
-7.954677021213342,7.914309024810791
-7.946921547407927,7.92086935043335
-7.928117974144348,7.910250663757324
-8.004782412028186,7.952953815460205
-7.879425560900211,7.92986536026001
-7.924453006674053,7.895913600921631
-7.958607309235428,7.913266658782959
-7.935542022791058,7.9025444984436035
-7.935542022791058,7.942456245422363
-7.920818811243059,7.947044849395752
-7.9393021526221474,7.909735202789307
-7.950781972366453,7.930743217468262
-7.924453006674053,7.935489177703857
-7.918270557990233,7.903975009918213
-7.954677021213342,7.941537380218506
-7.903090094245322,7.901620388031006
-7.946921547407927,7.932530879974365
-7.946921547407927,7.912256240844727
-7.950781972366453,7.891821384429932
-7.896196359268842,7.913029193878174
-7.950781972366453,7.944797515869141
-7.9393021526221474,7.916560173034668
-7.931814161156377,7.899044990539551
-7.954677021213342,7.939979076385498
-7.950781972366453,7.922214031219482
-7.9393021526221474,7.937131404876709
-7.889410352488291,7.916873931884766
-7.924453006674053,7.9174370765686035
-7.96981377267859,7.962528705596924
-7.910094953104535,7.890925407409668
-7.863280055279963,7.919888019561768
-7.946921547407927,7.902690887451172
-7.931814161156377,7.909946918487549
-7.954677021213342,7.92833948135376
-7.935542022791058,7.9232587814331055
-7.931814161156377,7.910263538360596
-7.950781972366453,7.935030460357666
-7.946921547407927,7.9131574630737305
-7.928117974144348,7.903325080871582
-7.928117974144348,7.885752201080322
-7.931814161156377,7.908724308013916
-7.860119116630385,7.905802249908447
-7.924453006674053,7.929049491882324
-7.856986114171083,7.876613140106201
-7.928117974144348,7.924259185791016
-7.954677021213342,7.917212009429932
-7.928117987946079,7.9247660636901855
-7.9430951409681345,7.922852039337158
-7.939379961634402,7.92446756362915
-7.995678626217357,7.963533401489258
-7.928117974144348,7.913488388061523
-7.954677021213342,7.933552265167236
-7.903090094245322,7.924259662628174
-7.946921547407927,7.922844409942627
-7.931814161156377,7.9097981452941895
-7.86826275483874,7.902195453643799
-7.935542022791058,7.920368671417236
-7.8728955601551585,7.937854766845703
-7.879425560900211,7.915454387664795
-7.906578398789698,7.913193702697754
-7.892790308673911,7.905111312866211
-7.954677021213342,7.92633056640625
-7.946921547407927,7.926916599273682
-7.928117974144348,7.90254545211792
-7.924453006674053,7.902529716491699
-7.809102227538298,7.9507222175598145
-7.847706165863548,7.880895614624023
-7.9430951409681345,7.91798734664917
-7.928117974144348,7.920818328857422
-7.931814161156377,7.914839267730713
-7.970532618892763,7.956592082977295
-7.892790308673911,7.91102933883667
-7.9737577757544535,7.9380340576171875
-7.9430951409681345,7.921305179595947
-7.9393021526221474,7.91276216506958
-7.924453006674053,7.913158893585205
-7.950781972366453,7.96193790435791
-7.903090094245322,7.91685676574707
-7.954677021213342,7.943491458892822
-7.9393021526221474,7.943110942840576
-7.869665979871627,7.907629013061523
-7.920818811243059,7.902357578277588
-7.954677021213342,7.933816909790039
-7.9393021526221474,7.940954208374023
-7.924453006674053,7.916685581207275
-7.924453006674053,7.9225006103515625
-7.935542022791058,7.941015720367432
-7.950781972366453,7.931984901428223
-7.946921547407927,7.901025772094727
-7.982923651140671,7.884706497192383
-7.950781972366453,7.9235453605651855
-7.9430951409681345,7.940359115600586
-7.928117974144348,7.929973125457764
-7.892790308673911,7.951961040496826
-7.954677021213342,7.952902317047119
-7.9430951409681345,7.931402683258057
-7.9430951409681345,7.926239967346191
-7.950781972366453,7.94060754776001
-7.9430951409681345,7.906665325164795
-7.935542022791058,7.924977779388428
-7.924453006674053,7.930423259735107
-7.889410352488291,7.933948040008545
-7.910094953104535,7.94921350479126
-7.886522706972261,7.928039073944092
-7.950781972366453,7.930464267730713
-7.954677021213342,7.8768134117126465
-7.920818811243059,7.904991149902344
-7.935542022791058,7.9182353019714355
-7.9430951409681345,7.908021450042725
-7.920818811243059,7.91655969619751
-7.935542022791058,7.939440727233887
-7.926474926395767,7.902985095977783
-7.946921547407927,7.922600746154785
-7.928117974144348,7.8948893547058105
-7.935542022791058,7.935865879058838
-7.950781972366453,7.923015117645264
-7.913640203677234,7.897461891174316
-7.9367221576035965,7.918315887451172
-7.910094953104535,7.902040481567383
-7.924453006674053,7.90332555770874
-7.9430951409681345,7.93372917175293
-7.928117974144348,7.881150722503662
-7.856986114171083,7.9005818367004395
-7.970532618892763,7.956421375274658
-7.954677021213342,7.956013202667236
-7.954677021213342,7.962589740753174
-7.950781972366453,7.936929225921631
-7.8416326138557455,7.93208646774292
-7.954677021213342,7.934484958648682
-7.950781972366453,7.952269077301025
-7.924453006674053,7.90273904800415
-7.920818811243059,7.912627220153809
-7.924453006674053,7.886503219604492
-7.9761711944251115,7.927026748657227
-7.896196359268842,7.919580459594727
-7.9430951409681345,7.937880039215088
-7.954677021213342,7.923675537109375
-7.9913998274291025,7.9130940437316895
-7.913640203677234,7.9028000831604
-7.938235141062872,7.941720962524414
-7.950781972366453,7.925788402557373
-7.924453006674053,7.897513389587402
-7.935542022791058,7.905865669250488
-7.932396638893121,7.919691562652588
-7.9430951409681345,7.943832874298096
-7.928117974144348,7.91178560256958
-7.950781972366453,7.900887966156006
-7.935542022791058,7.951293468475342
-7.950781972366453,7.925424098968506
-7.958607309235428,7.963090419769287
-7.924453006674053,7.932026386260986
-7.924453006674053,7.907780170440674
-7.954677021213342,7.930634021759033
-7.931814161156377,7.91843843460083
-7.9393021526221474,7.90278959274292
-7.9393021526221474,7.93235445022583
-7.840545291482477,7.9126739501953125
-7.906578398789698,7.908568382263184
-7.888606117307137,7.8936028480529785
-7.946082651207223,7.921931743621826
-7.957786139863943,7.963896751403809
-7.835637836224461,7.89870023727417
-7.950781972366453,7.9369378089904785
-7.954677021213342,7.924624919891357
-7.950781972366453,7.915125846862793
-7.9393021526221474,7.908042907714844
-7.903090094245322,7.913471698760986
-7.950781972366453,7.935276508331299
-7.9430951409681345,7.931930065155029
-7.924453006674053,7.936070442199707
-7.931814161156377,7.915695667266846
-7.9430951409681345,7.939416408538818
-7.954677021213342,7.9348931312561035
-7.866459873882536,7.920202732086182
-7.935542022791058,7.956202030181885
-7.903090094245322,7.922300338745117
-7.9430951409681345,7.931594371795654
-7.924016962894687,7.922343730926514
-7.856986114171083,7.92039155960083
-7.928117974144348,7.916032791137695
-7.935542022791058,7.906552791595459
-7.9430951409681345,7.922680854797363
-7.95344564411266,7.956021785736084
-7.954677021213342,7.925519943237305
-7.954677021213342,7.912290096282959
-7.946921547407927,7.910017490386963
-7.89962956062971,7.934778213500977
-7.954677021213342,7.9313225746154785
-7.856986114171083,7.889796733856201
-7.995678626217357,7.920888900756836
-7.920818811243059,7.928579807281494
-7.882728704344236,7.959361553192139
-7.9393021526221474,7.904361724853516
-7.935542022791058,7.925371170043945
-7.928117974144348,7.916320323944092
-7.892790308673911,7.870258808135986
-7.924453006674053,7.899252414703369
-7.954677021213342,7.919850826263428
-7.924453006674053,7.927932262420654
-7.9430951409681345,7.945433616638184
-7.928117974144348,7.918962478637695
-7.882728704344236,7.909041881561279
-7.9430951409681345,7.914365291595459
-7.928117974144348,7.912519454956055
-7.954677021213342,7.934276103973389
-7.946921547407927,7.9142165184021
-7.935542022791058,7.893655300140381
-7.8323865723801545,7.895003795623779
-7.950781972366453,7.917975902557373
-7.935542022791058,7.890330791473389
-7.924453006674053,7.912277698516846
-7.9430951409681345,7.907385349273682
-7.935542022791058,7.9019036293029785
-7.924453006674053,7.906606197357178
-7.946921547407927,7.919658184051514
-7.954677021213342,7.918107509613037
-7.935542022791058,7.9158549308776855
-7.950781972366453,7.932065486907959
-7.954677021213342,7.93959379196167
-7.920818811243059,7.91670560836792
-7.954677021213342,7.927168369293213
-7.931814161156377,7.9062981605529785
-7.860119116630385,7.901851654052734
-7.950781972366453,7.914412021636963
-7.931814161156377,7.903828144073486
-7.913640203677234,7.908048152923584
-7.9430951409681345,7.944299221038818
-7.920818811243059,7.887844562530518
-7.928117974144348,7.916370868682861
-7.950781972366453,7.933718681335449
-7.85078088734462,7.889753818511963
-7.950781972366453,7.953135013580322
-7.931814161156377,7.90941858291626
-7.863280055279963,7.905511856079102
-7.924453006674053,7.9351019859313965
-7.946921547407927,7.940177917480469
-7.946921547407927,7.934919834136963
-7.954677021213342,7.918056488037109
-7.928117974144348,7.921076774597168
-7.950781972366453,7.922012805938721
-7.950781972366453,7.937358379364014
-7.91721462968355,7.912420272827148
-7.928117974144348,7.8942036628723145
-7.954677021213342,7.949629306793213
-7.9430951409681345,7.913125514984131
-7.93468629292431,7.959374904632568
-7.901192931071858,7.913918972015381
-7.954677021213342,7.934946060180664
-7.924453006674053,7.9242730140686035
-7.950781972366453,7.928751468658447
-7.950781972366453,7.930482864379883
-7.931814161156377,7.916361331939697
-7.931814161156377,7.925426959991455
-7.920818811243059,7.901864528656006
-7.9430951409681345,7.934830188751221
-7.935542022791058,7.92029333114624
-7.928117974144348,7.90792179107666
-7.954677021213342,7.9458136558532715
-7.920818811243059,7.912866115570068
-7.9430951409681345,7.917383670806885
-7.931814161156377,7.907764911651611
-7.987162773987728,7.922145366668701
-7.94094624659741,7.931628227233887
-7.913640203677234,7.907186985015869
-7.950781972366453,7.945284843444824
-7.946921547407927,7.950298309326172
-7.950781972366453,7.954492092132568
-7.863280055279963,7.882450580596924
-7.910094953104535,7.909851551055908
-7.9393021526221474,7.914790153503418
-7.950781972366453,7.923367977142334
-7.946921547407927,7.913461685180664
-7.954677021213342,7.930934429168701
-7.931814161156377,7.9267120361328125
-7.9430951409681345,7.9288649559021
-7.931814161156377,7.896157264709473
-7.913640203677234,7.904696941375732
-7.916637144431181,7.936202526092529
-7.924453006674053,7.935695171356201
-7.903090094245322,7.940743923187256
-7.913640203677234,7.9260430335998535
-7.9430951409681345,7.927479267120361
-7.950781972366453,7.909669399261475
-7.895460094525281,7.931440353393555
-7.924453006674053,7.942477226257324
-7.950781972366453,7.939119815826416
-7.931814161156377,7.915045738220215
-7.950781972366453,7.941271781921387
-7.943055911701025,7.928544044494629
-7.924453006674053,7.912613391876221
-7.829768510087842,7.904385089874268
-7.9913998274291025,7.976792812347412
-7.946921547407927,7.952972888946533
-7.954677021213342,7.943395137786865
-7.954677021213342,7.939141273498535
-7.913640203677234,7.887086391448975
-7.982923651140671,7.9422688484191895
-7.950781972366453,7.935547351837158
-7.903090094245322,7.922934055328369
-7.946921547407927,7.951385021209717
-8.004545578968134,7.942638397216797
-7.950781972366453,7.913992404937744
-7.9430951409681345,7.917710781097412
-7.913640203677234,7.924609661102295
-7.924453006674053,7.916497707366943
-7.9393021526221474,7.916700839996338
-7.856986114171083,7.912616729736328
-7.935542022791058,7.913961410522461
-7.931814161156377,7.898558616638184
-7.950781972366453,7.918740272521973
-7.954677021213342,7.901881694793701
-7.906578398789698,7.930388927459717
-7.9393021526221474,7.876754283905029
-7.954677021213342,7.953158855438232
-7.9393021526221474,7.932960033416748
-7.924453006674053,7.925448894500732
-7.931814161156377,7.9162468910217285
-7.924453006674053,7.913774013519287
-7.935542022791058,7.947662830352783
-7.931814161156377,7.929224014282227
-7.946921547407927,7.91597318649292
-7.913640203677234,7.918910503387451
-7.950781972366453,7.921789646148682
-7.903090094245322,7.91546106338501
-7.920818811243059,7.930972099304199
-7.823919469453418,7.900065898895264
-7.946921547407927,7.91731595993042
-7.871381458691152,7.915378093719482
-7.946921547407927,7.920194625854492
-7.9430951409681345,7.932892322540283
-7.9430951409681345,7.947780132293701
-7.946921547407927,7.935501575469971
-7.91721462968355,7.9143571853637695
-7.924453006674053,7.910558223724365
-7.935542022791058,7.947446823120117
-7.899713120466515,7.896387577056885
-7.954677021213342,7.886504173278809
-7.946921547407927,7.9267048835754395
-7.982966659490206,7.950222492218018
-7.942033487170233,7.947370529174805
-8.008819571765459,7.996215343475342
-7.954677021213342,7.917582035064697
-7.924453006674053,7.905966281890869
-7.9393021526221474,7.919528007507324
-7.950781972366453,7.917328834533691
-7.950781972366453,7.919154167175293
-7.920818811243059,7.934600353240967
-7.9393021526221474,7.927276611328125
-7.977975326564206,7.953256130218506
-7.950781972366453,7.962453365325928
-7.987162773987728,7.970893383026123
-7.856986114171083,7.869744777679443
-7.935542022791058,7.939755916595459
-8.026824561605242,7.95453405380249
-7.950781972366453,7.930530071258545
-7.8761493177145505,7.903046131134033
-7.954677021213342,7.915894031524658
-7.954677021213342,7.949965476989746
-7.928117974144348,7.933167457580566
-7.910094953104535,7.8962626457214355
-7.931814161156377,7.908101558685303
-7.9393021526221474,7.949217319488525
-7.924453006674053,7.921885013580322
-7.931814161156377,7.917530536651611
-7.935542022791058,7.948415279388428
-7.954677021213342,7.941157817840576
-7.950781972366453,7.947071075439453
-7.924453006674053,7.927083969116211
-7.857937595672809,7.881260395050049
-7.9393021526221474,7.90839147567749
-7.910094953104535,7.916483402252197
-7.954677021213342,7.937950134277344
-7.9393021526221474,7.939871311187744
-7.950781972366453,7.906673431396484
-7.950781972366453,7.91262674331665
-7.946921547407927,7.9094038009643555
-7.946921547407927,7.923172473907471
-7.995678626217357,7.956793308258057
-7.950781972366453,7.9147772789001465
-7.924453006674053,7.934847354888916
-7.935542022791058,7.912656307220459
-7.924453006674053,7.917225360870361
-7.9393021526221474,7.922091484069824
-7.879425560900211,7.92352819442749
-7.950781972366453,7.917155742645264
-7.920818811243059,7.906493663787842
-7.946921547407927,7.9340362548828125
-7.946921547407927,7.925642490386963
-7.954677021213342,7.948471546173096
-7.9393021526221474,7.913079261779785
-7.935542022791058,7.915558338165283
-7.928117974144348,7.9050774574279785
-7.924453006674053,7.909178256988525
-7.928117974144348,7.919326305389404
-7.946921547407927,7.936910152435303
-7.946921547407927,7.907896518707275
-7.931814161156377,7.955563068389893
-7.931814161156377,7.941067695617676
-7.950781972366453,7.921340465545654
-7.950781972366453,7.9128499031066895
-7.8728955601551585,7.906962871551514
-7.886056354845152,7.907558917999268
-7.931814161156377,7.9329094886779785
-7.913640203677234,7.880417346954346
-7.954441918624099,7.948382377624512
-7.91721462968355,7.916627407073975
-7.9430951409681345,7.929130554199219
-7.931814161156377,7.906748294830322
-7.9393021526221474,7.912267208099365
-7.935542022791058,7.933330059051514
-7.954677021213342,7.920825958251953
-7.869665979871627,7.902342796325684
-7.954677021213342,7.937330722808838
-7.9913998274291025,7.94346284866333
-7.982966659490206,7.922396183013916
-7.954677021213342,7.935981750488281
-7.946921547407927,7.873220443725586
-7.950781972366453,7.961045265197754
-7.950781972366453,7.932775020599365
-7.950781972366453,7.9319748878479
-7.950781972366453,7.928825378417969
-7.954677021213342,7.925401210784912
-7.9430951409681345,7.925098896026611
-7.9393021526221474,7.9087653160095215
-7.954677021213342,7.955631256103516
-7.898335326061519,7.910783290863037
-7.863280055279963,7.95458459854126
-7.869665979871627,7.900269985198975
-7.903090094245322,7.922852993011475
-7.950781972366453,7.974258899688721
-7.906578398789698,7.918323040008545
-7.954677021213342,7.933165073394775
-7.954677021213342,7.92215633392334
-7.935542022791058,7.908243179321289
-7.942208174627828,7.942372798919678
-7.889410352488291,7.889090061187744
-7.950781972366453,7.919363498687744
-7.946921547407927,7.9402594566345215
-7.924453006674053,7.908372402191162
-7.950781972366453,7.924265384674072
-7.935542022791058,7.8890862464904785
-7.9393021526221474,7.895015239715576
-7.928117974144348,7.929180145263672
-7.9430951409681345,7.9454731941223145
-8.008819571765459,7.968977451324463
-7.924453006674053,7.914803981781006
-7.954677021213342,7.930788993835449
-7.9430951409681345,7.94916296005249
-7.950781972366453,7.928633213043213
-7.910094953104535,7.924295902252197
-7.924453006674053,7.914640426635742
-7.950781972366453,7.930892467498779
-7.93741804551443,7.922652721405029
-7.9393021526221474,7.920777797698975
-7.954677021213342,7.945713996887207
-7.969065592938858,7.89500093460083
-7.920818811243059,7.891748428344727
-7.924453006674053,7.903716564178467
-7.935542022791058,7.928696155548096
-7.931814161156377,7.919071674346924
-7.9393021526221474,7.927405834197998
-7.954677021213342,7.937283039093018
-7.946921547407927,7.922313690185547
-7.931814161156377,7.932960510253906
-7.946921547407927,7.922288417816162
-7.946921547407927,7.921870708465576
-7.9393021526221474,7.915755748748779
-7.946921547407927,7.915811061859131
-7.982923651140671,7.909976482391357
-7.85078088734462,7.902106285095215
-7.970532618892763,7.9062275886535645
-7.950781972366453,7.928892612457275
-7.924453006674053,7.926544666290283
-7.924453006674053,7.935634613037109
-7.940309692292938,7.906341075897217
-7.954677021213342,7.9352545738220215
-7.8761493177145505,7.910564422607422
-7.950781972366453,7.97191858291626
-7.954677021213342,7.932601451873779
-7.931814161156377,7.9045000076293945
-7.892790308673911,7.902439594268799
-7.939302143143198,7.938409328460693
-7.950781972366453,7.930783748626709
-7.847706165863548,7.901266574859619
-7.950781972366453,7.9393391609191895
-7.8728955601551585,7.894506454467773
-7.950781972366453,7.918671131134033
-7.9367221576035965,7.91855001449585
-7.920818811243059,7.9170732498168945
-7.913640203677234,7.91832160949707
-7.856986114171083,7.885960578918457
-7.974694136660875,7.939377307891846
-7.954677021213342,7.897488117218018
-7.935542022791058,7.947142124176025
-7.950781972366453,7.946177005767822
-7.892069753452455,7.900777339935303
-7.920818811243059,7.9125237464904785
-7.91721462968355,7.938229084014893
-7.954677021213342,7.947209358215332
-7.8365845332054285,7.913525104522705
-7.954677021213342,7.9043145179748535
-7.924453006674053,7.9164719581604
-7.892790308673911,7.912106037139893
-7.889410352488291,7.907161712646484
-7.924453006674053,7.923176288604736
-7.913640203677234,7.944403171539307
-7.954677021213342,7.922994136810303
-7.928117974144348,7.934500217437744
-7.924453006674053,7.906583309173584
-7.928117974144348,7.9148969650268555
-7.946921547407927,7.946619033813477
-7.950781972366453,7.9553680419921875
-7.866459873882536,7.918530464172363
-7.94742290951084,7.950317859649658
-7.920818811243059,7.904529571533203
-7.935542022791058,7.9482574462890625
-7.931814161156377,7.90649938583374
-7.913640203677234,7.94558572769165
-7.892790308673911,7.91395902633667
-7.903090094245322,7.911989688873291
-7.995678626217357,7.959882736206055
-7.882728704344236,7.886600017547607
-7.9737577757544535,7.934023380279541
-7.928117974144348,7.902957439422607
-7.892790308673911,7.893261432647705
-7.935542022791058,7.910841464996338
-7.975985781891215,7.9486775398254395
-7.950781972366453,7.922236919403076
-7.879425560900211,7.912959575653076
-7.9393021526221474,7.9204230308532715
-7.913640203677234,7.910970687866211
-7.9393021526221474,7.934589385986328
-7.950781972366453,7.931402683258057
-7.928117974144348,7.924927711486816
-7.924453006674053,7.915301322937012
-7.954677021213342,7.940425395965576
-7.882728704344236,7.902660846710205
-7.946921547407927,7.913376808166504
-7.892790308673911,7.880218982696533
-7.838628495628443,7.890353202819824
-7.920818811243059,7.922891139984131
-8.040958607678906,7.927574634552002
-7.931814161156377,7.917758464813232
-7.928117974144348,7.93036413192749
-7.928117974144348,7.920077800750732
-7.950781972366453,7.931926250457764
-7.954677021213342,7.939158916473389
-7.85205769961263,7.903156757354736
-7.995678626217357,7.909239768981934
-7.9393021526221474,7.949192523956299
-7.853872762493711,7.904536724090576
-7.9430951409681345,7.923022270202637
-7.903090094245322,7.894223213195801
-7.928117974144348,7.905989646911621
-7.920818811243059,7.907592296600342
-7.924453006674053,7.913276195526123
-7.950781972366453,7.948648929595947
-7.889410352488291,7.896523952484131
-7.928117974144348,7.900274753570557
-7.9430951409681345,7.920491695404053
-7.9393021526221474,7.9241108894348145
-7.924453006674053,7.915994644165039
-7.931814161156377,7.921968460083008
-7.935542022791058,7.910511493682861
-7.8416326138557455,7.893151760101318
-7.910094953104535,7.91400146484375
-7.954677021213342,7.935159206390381
-7.950781972366453,7.920906066894531
-7.924453006674053,7.888404369354248
-7.928117974144348,7.898362636566162
-7.935542022791058,7.918433666229248
-8.004899782157656,7.964607238769531
-7.931814161156377,7.934433937072754
-7.959289744233731,7.933059215545654
-7.905730809051267,7.949795246124268
-7.9152617795440126,7.91404390335083
-7.995678626217357,7.922095775604248
-7.863280055279963,7.9062395095825195
-7.9430951409681345,7.936967372894287
-7.920818811243059,7.903794765472412
-7.950781972366453,7.950560092926025
-7.91721462968355,7.917104244232178
-7.946921547407927,7.926095485687256
-7.903090094245322,7.890082359313965
-7.896196359268842,7.913389682769775
-7.889410352488291,7.916985511779785
-7.946921547407927,7.942304611206055
-7.928117974144348,7.916576862335205
-7.96257349994767,7.912418365478516
-7.858096678988375,7.928925514221191
-7.954677021213342,7.928096771240234
-7.935542022791058,7.905208110809326
-7.931814161156377,7.920467853546143
-7.950781972366453,7.976853847503662
-7.924453006674053,7.9082207679748535
-7.906578398789698,7.923130989074707
-7.935542022791058,7.906126976013184
-7.950781972366453,7.939756870269775
-7.954677021213342,7.940829753875732
-7.928117974144348,7.912770748138428
-7.9393021526221474,7.92365026473999
-7.91721462968355,7.936098575592041
-7.85078088734462,7.931978702545166
-7.950781972366453,7.932493686676025
-7.974694136660875,7.956681251525879
-7.904830708706697,7.930229663848877
-7.954677021213342,7.936245441436768
-7.950781972366453,7.920304775238037
-7.946921547407927,7.9359564781188965
-7.924453006674053,7.895080089569092
-7.954677021213342,7.93991231918335
-7.9430951409681345,7.906859397888184
-7.954677021213342,7.940972805023193
-7.920818811243059,7.903724670410156
-7.950781972366453,7.93284273147583
-7.924453006674053,7.905706882476807
-7.950781972366453,7.928182125091553
-7.954677021213342,7.9436163902282715
-7.8728955601551585,7.899556636810303
-7.892790308673911,7.909671783447266
-7.928117974144348,7.895201206207275
-7.924453006674053,7.953267574310303
-7.935542022791058,7.9319376945495605
-7.9430951409681345,7.922997951507568
-7.946921547407927,7.907238483428955
-7.928117974144348,7.88628625869751
-7.950781972366453,7.911667346954346
-7.9393021526221474,7.935001850128174
-7.950781972366453,7.93799352645874
-7.924453006674053,7.933775901794434
-7.903090094245322,7.894500732421875
-7.982923651140671,7.905028343200684
-8.008819571765459,7.990688800811768
-7.954677021213342,7.953691005706787
-8.008819571765459,7.9611992835998535
-7.920818811243059,7.895380973815918
-7.975236013287654,7.953531742095947
-7.954677021213342,7.943679332733154
-7.928117974144348,7.909559726715088
-7.946921547407927,7.942206382751465
-7.920818811243059,7.91633415222168
-7.928117974144348,7.895800590515137
-7.928155902956855,7.944313049316406
-7.946921547407927,7.927159786224365
-7.96257349994767,7.985581874847412
-7.928117974144348,7.904665470123291
-7.8761493177145505,7.904348373413086
-7.9430951409681345,7.927126407623291
-8.008819571765459,7.979150295257568
-7.954677021213342,7.942099571228027
-7.892790308673911,7.911855220794678
-7.924453006674053,7.933764934539795
-7.924453006674053,7.911855220794678
-7.924453006674053,7.894711971282959
-7.995678626217357,7.976415634155273
-7.95090181210265,7.954966068267822
-7.935542022791058,7.899115085601807
-7.931814161156377,7.915517330169678
-7.950628730874147,7.934457302093506
-7.939869391201816,7.928368091583252
-7.924453006674053,7.897355556488037
-7.882728704344236,7.91771936416626
-7.946921547407927,7.948143482208252
-7.954677021213342,7.898063659667969
-7.90684353174384,7.915354251861572
-7.853872762493711,7.923012733459473
-7.91721462968355,7.915002822875977
-7.943055911701025,7.918233871459961
-7.8728955601551585,7.876974582672119
-7.826117415313418,7.844622611999512
-7.8761493177145505,7.930093765258789
-7.9393021526221474,7.926949977874756
-7.804531148177666,7.9378342628479
-7.946921547407927,7.9157795906066895
-7.91721462968355,7.9285197257995605
-7.950781972366453,7.927178382873535
-7.946921547407927,7.9381937980651855
-7.954677021213342,7.901266574859619
-7.935542022791058,7.943501949310303
-7.879425560900211,7.8890461921691895
-7.954677021213342,7.917708873748779
-7.954677021213342,7.948854923248291
-7.913640203677234,7.905924320220947
-7.928117974144348,7.9293012619018555
-7.995678626217357,7.975942611694336
-7.954677021213342,7.955577850341797
-7.924453006674053,7.924069881439209
-7.954677021213342,7.9415388107299805
-7.892790308673911,7.929889678955078
-7.935542022791058,7.8960862159729
-7.954677021213342,7.934304714202881
-7.946921547407927,7.9169535636901855
-7.931814161156377,7.892411708831787
-7.924453006674053,7.912111759185791
-7.920818811243059,7.898173809051514
-7.950781972366453,7.940972805023193
-7.9393021526221474,7.933530330657959
-7.924453006674053,7.906332015991211
-7.928117974144348,7.92446756362915
-7.966617665152964,7.954285621643066
-7.931814161156377,7.955389022827148
-7.818151283467686,7.883183002471924
-7.928117974144348,7.895588397979736
-7.954677021213342,7.919738292694092
-7.950781972366453,7.936497688293457
-7.91721462968355,7.918398857116699
-7.928117974144348,7.906507968902588
-8.013136044317282,7.979899883270264
-7.950781972366453,7.92401123046875
-7.863280055279963,7.932192325592041
-7.89962956062971,7.9314069747924805
-7.982923651140671,7.94856595993042
-7.974694136660875,7.9281110763549805
-7.931814161156377,7.933924198150635
-7.928117974144348,7.917768478393555
-7.95078197271544,7.931869029998779
-7.920818811243059,7.913455963134766
-7.828427770348437,7.85319185256958
-7.908539684071192,7.926111698150635
-7.950781972366453,7.9386305809021
-7.9393021526221474,7.95294713973999
-7.91721462968355,7.904830455780029
-7.829768510087842,7.8940205574035645
-7.891275104996169,7.923758029937744
-7.920818811243059,7.903716564178467
-7.950038636068048,7.9126296043396
-7.935542022791058,7.9330010414123535
-7.96714741418301,7.920692443847656
-7.896196359268842,7.9300537109375
-7.920818811243059,7.9187541007995605
-7.954677021213342,7.9464826583862305
-7.866459873882536,7.921218395233154
-7.896196359268842,7.918389797210693
-7.950781972366453,7.926382541656494
-7.924453006674053,7.917526721954346
-7.935542022791058,7.9155731201171875
-7.950781972366453,7.940062999725342
-7.91721462968355,7.918257236480713
-7.950781972366453,7.929591655731201
-7.873946355627666,7.873405456542969
-7.924453006674053,7.889669895172119
-7.924453006674053,7.937363147735596
-7.954677021213342,7.919947147369385
-7.89962956062971,7.909297943115234
-7.946921547407927,7.927014350891113
-7.950781972366453,7.9325056076049805
-7.954677021213342,7.933796405792236
-7.931814161156377,7.936883449554443
-7.935542022791058,7.937978267669678
-7.954677021213342,7.890223979949951
-7.924453006674053,7.8993000984191895
-7.950781972366453,7.919662952423096
-7.847298682761509,7.892975330352783
-7.928117974144348,7.913728713989258
-7.950781972366453,7.92453670501709
-7.966576241738391,7.928487300872803
-7.9430951409681345,7.915093421936035
-7.935542022791058,7.949021339416504
-7.903090094245322,7.925487041473389
-7.935542022791058,7.884646892547607
-7.946921547407927,7.928957462310791
-7.920818811243059,7.938455581665039
-7.935542022791058,7.944854259490967
-7.924453006674053,7.929500579833984
-7.950781972366453,7.92349100112915
-7.9393021526221474,7.930522441864014
-7.954677021213342,7.929836750030518
-7.9737577757544535,7.934800624847412
-7.910094953104535,7.909926414489746
-7.954677021213342,7.963442325592041
-7.924453006674053,7.906546115875244
-7.950781972366453,7.92912483215332
-7.946921547407927,7.908068656921387
-7.946921547407927,7.928929805755615
-7.8416326138557455,7.904305458068848
-7.920818811243059,7.92228364944458
-7.946921547407927,7.918820381164551
-7.9430951409681345,7.9435038566589355
-7.869665979871627,7.8992695808410645
-7.920818811243059,7.913699626922607
-7.920818811243059,7.908536911010742
-7.954677021213342,7.9664788246154785
-7.9430951409681345,7.925546169281006
-7.954677021213342,7.9418625831604
-7.9393021526221474,7.938878536224365
-7.970532618892763,7.967283248901367
-7.954677021213342,7.9248247146606445
-7.8728955601551585,7.898998737335205
-7.89962956062971,7.910045146942139
-7.889410352488291,7.880208492279053
-7.882728704344236,7.92005729675293
-7.950781972366453,7.918549537658691
-7.924453006674053,7.913392066955566
-7.931814161156377,7.9090352058410645
-7.954677021213342,7.94087028503418
-7.91721462968355,7.891295909881592
-7.9430951409681345,7.927373886108398
-7.9393021526221474,7.926558494567871
-7.924453006674053,7.920429229736328
-7.954677021213342,7.937645435333252
-7.920818811243059,7.926779747009277
-7.913640203677234,7.910495758056641
-7.853872762493711,7.90941047668457
-7.950781972366453,7.943583011627197
-7.91721462968355,7.90349817276001
-7.946921547407927,7.913740634918213
-7.9393021526221474,7.914375305175781
-7.928117974144348,7.917807102203369
-7.906578398789698,7.891162395477295
-7.954677021213342,7.946840286254883
-7.954677021213342,7.965192794799805
-7.838693701646425,7.912428379058838
-7.966617665152964,7.950897693634033
-7.892790308673911,7.910093307495117
-7.946921547407927,7.92249870300293
-7.9393021526221474,7.915788650512695
-7.925914591896404,7.888803958892822
-7.928117974144348,7.899448871612549
-7.935542022791058,7.93818998336792
-7.924453006674053,7.916245937347412
-7.9430951409681345,7.894890308380127
-7.913640203677234,7.918376445770264
-7.945546910621388,7.878845691680908
-7.847706165863548,7.89534330368042
-7.913640203677234,7.923352241516113
-7.950781972366453,7.945094585418701
-7.935542022791058,7.944550037384033
-7.928117974144348,7.920239448547363
-7.924453006674053,7.917436599731445
-7.950781972366453,7.935486316680908
-7.913640203677234,7.91001558303833
-7.920818811243059,7.9170379638671875
-7.954677021213342,7.942783355712891
-7.924453006674053,7.935063362121582
-7.946921547407927,7.933106899261475
-7.91721462968355,7.905540943145752
-7.950781972366453,7.950371742248535
-7.946921547407927,7.923892021179199
-7.995678626217357,7.975494861602783
-7.9393021526221474,7.916168212890625
-7.9086465470720775,7.95168399810791
-7.9430951409681345,7.950016975402832
-7.9393021526221474,7.9318528175354
-7.935542022791058,7.917232036590576
-7.9393021526221474,7.923375606536865
-7.928117974144348,7.915500164031982
-7.906578398789698,7.910952091217041
-7.885953431936095,7.91768217086792
-7.9393021526221474,7.94792366027832
-7.9393021526221474,7.9358906745910645
-7.925565706285505,7.922922134399414
-7.924453006674053,7.9266791343688965
-7.9393021526221474,7.9507527351379395
-7.93741804551443,7.919787883758545
-7.84659136380027,7.844837188720703
-7.920818811243059,7.915401935577393
-7.892790308673911,7.900083065032959
-7.9430951409681345,7.937811374664307
-7.935542022791058,7.9198760986328125
-7.950781972366453,7.94248104095459
-7.954677021213342,7.929989337921143
-7.910094953104535,7.939003944396973
-7.954677021213342,7.917895317077637
-7.879425560900211,7.919347286224365
-7.9430951409681345,7.937325954437256
-7.951740612759727,7.930315971374512
-7.879425560900211,7.89721155166626
-7.982923651140671,7.921896934509277
-7.9393021526221474,7.909115314483643
-7.922491400135772,7.945430278778076
-7.954677021213342,7.913539409637451
-7.928117974144348,7.90358829498291
-7.859452790550835,7.925963401794434
-7.91721462968355,7.904808044433594
-7.869665979871627,7.898538589477539
-7.9616219366397445,7.992649555206299
-7.935542022791058,7.959439754486084
-7.950781972366453,7.919245719909668
-7.946921547407927,7.9120774269104
-7.946921547407927,7.938055038452148
-7.91721462968355,7.936568260192871
-7.9430951409681345,7.930419445037842
-7.8761493177145505,7.890808582305908
-7.935542022791058,7.9192681312561035
-7.950781972366453,7.955883502960205
-7.935542022791058,7.9108147621154785
-7.924453006674053,7.911560535430908
-7.920818811243059,7.917283058166504
-7.950781972366453,7.9575910568237305
-7.924453006674053,7.931779861450195
-7.9737577757544535,7.952818393707275
-7.91721462968355,7.923786640167236
-7.913640203677234,7.925232410430908
-7.839328904096787,7.831450462341309
-7.950781972366453,7.938093662261963
-7.89962956062971,7.908324718475342
-7.924453006674053,7.924422740936279
-7.946921547407927,7.919004917144775
-7.954677021213342,7.937755107879639
-7.920818811243059,7.915414333343506
-7.903090094245322,7.928802490234375
-7.928117974144348,7.928319931030273
-7.954677021213342,7.935266017913818
-7.886056354845152,7.926774024963379
-7.954677021213342,7.899071216583252
-7.954677021213342,7.954843044281006
-7.9430951409681345,7.943313121795654
-7.946921547407927,7.930505275726318
-7.886056354845152,7.8931660652160645
-7.978116334435664,7.916054725646973
-7.924453006674053,7.923520565032959
-7.9737577757544535,7.921786308288574
-7.931814161156377,7.9084858894348145
-7.910094953104535,7.9166340827941895
-7.950781972366453,7.930511474609375
-7.995678626217357,7.933845043182373
-7.931814161156377,7.9367995262146
-7.924453006674053,7.885522842407227
-7.924453006674053,7.928950309753418
-7.928117974144348,7.93168830871582
-7.935542022791058,7.948982238769531
-7.9393021526221474,7.924728870391846
-7.847706165863548,7.933938026428223
-7.950781972366453,7.927236557006836
-7.9200659509493825,7.9363861083984375
-7.924453006674053,7.9196038246154785
-7.9430951409681345,7.932015419006348
-7.946921547407927,7.936105251312256
-7.85078088734462,7.932173252105713
-7.928117974144348,7.92656946182251
-7.946921547407927,7.932209491729736
-7.879425560900211,7.888967514038086
-7.924453006674053,7.933880805969238
-7.91721462968355,7.928930759429932
-7.928117974144348,7.921877384185791
-7.924453006674053,7.920278072357178
-7.954677021213342,7.908195495605469
-7.9430951409681345,7.937973499298096
-7.924453006674053,7.918180465698242
-7.9430951409681345,7.903247833251953
-7.924453006674053,7.919952392578125
-7.928117974144348,7.924173831939697
-7.954677021213342,7.959584712982178
-7.954677021213342,7.902921199798584
-7.9393021526221474,7.905631065368652
-7.950781972366453,7.933056354522705
-7.9430951409681345,7.920159816741943
-7.882728704344236,7.874292373657227
-7.931814161156377,7.89697790145874
-8.026824561605242,7.981810092926025
-7.9393021526221474,7.9065327644348145
-7.946921547407927,7.910564422607422
-7.920818811243059,7.912637710571289
-7.910094953104535,7.902945041656494
-7.862918345879642,7.895345211029053
-7.954677021213342,7.913057804107666
-7.9430951409681345,7.937030792236328
-7.9393021526221474,7.903867244720459
-7.9430951409681345,7.928450107574463
-7.935542022791058,7.937070369720459
-7.950781972366453,7.950963020324707
-7.954677021213342,7.929588794708252
-7.93765506239242,7.918881416320801
-7.950781972366453,7.9062299728393555
-7.950781972366453,7.9339728355407715
-7.913640203677234,7.9246320724487305
-7.950781972366453,7.9336676597595215
-7.853872762493711,7.888045310974121
-7.928117974144348,7.887124538421631
-7.950781972366453,7.95038366317749
-7.982966659490206,7.9261674880981445
-7.879527744657629,7.92442512512207
-7.935542022791058,7.8964409828186035
-7.950781972366453,7.932192325592041
-7.931814161156377,7.930659770965576
-7.9393021526221474,7.906135082244873
-7.954677021213342,7.925093173980713
-7.931814134875992,7.915843963623047
-7.928117974144348,7.9387006759643555
-7.906578398789698,7.929360389709473
-7.950781972366453,7.960689067840576
-7.935542022791058,7.926954746246338
-7.9430951409681345,7.944179058074951
-7.966617665152964,7.9298601150512695
-7.8931890133308515,7.926967620849609
-7.906578398789698,7.911472797393799
-7.8728955601551585,7.890625953674316
-7.9393021526221474,7.924823760986328
-7.950781972366453,7.923219203948975
-7.9430951409681345,7.924081325531006
-7.946921547407927,7.903738021850586
-7.9393021526221474,7.942107200622559
-7.982923651140671,7.934751987457275
-7.954677021213342,7.94483757019043
-7.946921547407927,7.925448894500732
-7.935542022791058,7.930778980255127
-7.928117974144348,7.918466091156006
-7.869665979871627,7.889703750610352
-7.966576241738391,7.963514804840088
-7.924453006674053,7.905217170715332
-7.932979898863743,7.926690578460693
-7.879166050413646,7.896875858306885
-7.903090094245322,7.904453277587891
-7.950781972366453,7.9106316566467285
-7.950781972366453,7.932548999786377
-7.923987557317199,7.927969455718994
-7.93468629292431,7.894796371459961
-7.9430951409681345,7.94649600982666
-7.91721462968355,7.9040679931640625
-7.886056354845152,7.900843620300293
-7.939379961634402,7.924698352813721
-7.903090094245322,7.927947998046875
-7.946921547407927,7.912999153137207
-7.920706937989397,7.890837669372559
-7.954677021213342,7.952759742736816
-7.913640203677234,7.933186054229736
-7.987162773987728,7.944782257080078
-7.9393021526221474,7.936566352844238
-7.906578398789698,7.933767795562744
-7.932396638893121,7.911116123199463
-7.829768510087842,7.908164024353027
-7.913640203677234,7.905028820037842
-7.950781972366453,7.9369659423828125
-7.954677021213342,7.915866374969482
-7.950781972366453,7.923206806182861
-7.950781972366453,7.924565315246582
-7.954677021213342,7.927460670471191
-7.901151046525181,7.913788318634033
-7.950781972366453,7.936930179595947
-7.846035765262794,7.865656852722168
-7.9616219366397445,7.9524827003479
-7.9430951409681345,7.901744842529297
-7.924453006674053,7.896342754364014
-7.950781972366453,7.918124198913574
-7.935542022791058,7.924138069152832
-7.924453006674053,7.904904842376709
-7.954677021213342,7.913076877593994
-7.954677021213342,7.935838222503662
-7.856986114171083,7.925594806671143
-7.913640203677234,7.897640228271484
-7.903090094245322,7.872656345367432
-7.924453006674053,7.919793128967285
-7.96981377267859,7.965921878814697
-7.950781972366453,7.937098503112793
-7.946921547407927,7.937532424926758
-7.924453006674053,7.884790897369385
-7.950781972366453,7.943593502044678
-7.954677021213342,7.939672470092773
-7.928117974144348,7.918765544891357
-7.9430951409681345,7.9244537353515625
-7.866459873882536,7.909771919250488
-7.91721462968355,7.92349100112915
-7.924453006674053,7.919309139251709
-7.954677021213342,7.950002193450928
-7.860820732007034,7.918870449066162
-7.9393021526221474,7.9590229988098145
-7.931814161156377,7.920285701751709
-7.931814161156377,7.940126895904541
-7.89962956062971,7.9126691818237305
-7.924453006674053,7.906006336212158
-7.954677021213342,7.927422523498535
-7.950781972366453,7.9334492683410645
-7.954677021213342,7.947502136230469
-7.838628495628443,7.914639949798584
-7.954677021213342,7.893704414367676
-7.950781972366453,7.934631824493408
-7.950781972366453,7.934418201446533
-7.954677021213342,7.947399616241455
-7.954677021213342,7.913818836212158
-7.924453006674053,7.900964260101318
-7.954677021213342,7.952473163604736
-7.954677021213342,7.927216053009033
-7.888606117307137,7.923874378204346
-7.9430951409681345,7.893799304962158
-7.886369505632882,7.909196376800537
-7.935542022791058,7.940711498260498
-7.943055911701025,7.940969467163086
-7.995678626217357,7.930487155914307
-7.913640203677234,7.9096879959106445
-7.9430951409681345,7.948899269104004
-7.950781972366453,7.930656909942627
-7.931814161156377,7.9055562019348145
-7.856986114171083,7.941528797149658
-7.9430951409681345,7.941858768463135
-7.928117974144348,7.921395301818848
-7.9393021526221474,7.92025089263916
-7.935542022791058,7.910282611846924
-7.946921547407927,7.948343276977539
-7.946921547407927,7.920431613922119
-7.950781972366453,7.967844486236572
-7.950781972366453,7.927535533905029
-7.950781972366453,7.927273750305176
-7.924453006674053,7.9269866943359375
-7.928117974144348,7.926056385040283
-7.950781972366453,7.920456409454346
-7.9393021526221474,7.877333641052246
-7.93412590860815,7.950014591217041
-7.954677021213342,7.921439170837402
-7.924453006674053,7.920912265777588
-7.924453006674053,7.9052863121032715
-7.9430951409681345,7.9409871101379395
-7.913640203677234,7.916121959686279
-7.85078088734462,7.851258277893066
-7.975453335860696,7.935811519622803
-7.950781972366453,7.932987689971924
-7.938102963264953,7.934071063995361
-7.928117974144348,7.921146392822266
-7.931814161156377,7.9118547439575195
-7.970532618892763,7.967038154602051
-7.952725130123009,7.934943675994873
-7.910094953104535,7.8808794021606445
-7.910094953104535,7.9046244621276855
-7.954677021213342,7.930397987365723
-7.954677021213342,7.934055805206299
-7.924453006674053,7.9184441566467285
-7.931814161156377,7.90764856338501
-7.991531413298041,7.975845813751221
-7.9393021526221474,7.9387359619140625
-7.928117974144348,7.920212268829346
-7.970532618892763,7.961345672607422
-7.931814161156377,7.912689685821533
-7.954677021213342,7.950068950653076
-7.954677021213342,7.9376540184021
-7.946921547407927,7.900278568267822
-7.9737577757544535,7.956855297088623
-7.924453006674053,7.915866851806641
-7.924453006674053,7.908298015594482
-7.882728704344236,7.884246826171875
-7.924453006674053,7.937009811401367
-7.9737577757544535,7.946442127227783
-7.931814161156377,7.923441410064697
-7.9430951409681345,7.9117350578308105
-7.930809816003702,7.920687198638916
-7.946921547407927,7.916794776916504
-7.935542022791058,7.927867412567139
-7.882728704344236,7.878598690032959
-7.954677021213342,7.951908588409424
-7.950781972366453,7.931652069091797
-7.982923651140671,7.919947624206543
-7.9155494703443505,7.919937610626221
-7.924453006674053,7.902790069580078
-7.931814161156377,7.901747226715088
-7.950781972366453,7.9455413818359375
-7.935542022791058,7.914799690246582
-7.954677021213342,7.9555344581604
-8.008819571765459,7.9998979568481445
-7.9430951409681345,7.97446346282959
-7.8761493177145505,7.890449047088623
-7.924453006674053,7.914750576019287
-7.931814161156377,7.908603191375732
-7.950781972366453,7.933349132537842
-7.931814161156377,7.899507999420166
-7.950781972366453,7.931295871734619
-7.982923651140671,7.888635158538818
-7.931814161156377,7.916445255279541
-7.958111178310889,7.907414436340332
-7.946921547407927,7.917442798614502
-7.928117974144348,7.930555820465088
-7.950781972366453,7.9243011474609375
-7.950781972366453,7.943626880645752
-7.950781972366453,7.937751293182373
-7.93978520718815,7.906447410583496
-7.946921547407927,7.898671627044678
-7.931814161156377,7.9341654777526855
-7.950781972366453,7.911766529083252
-7.970616219270671,7.967353820800781
-7.882728704344236,7.927448272705078
-7.950781972366453,7.933865070343018
-7.946921547407927,7.928337574005127
-7.924453006674053,7.9026970863342285
-7.886056354845152,7.883246898651123
-7.946921547407927,7.948731899261475
-7.924453006674053,7.933848857879639
-7.950781972366453,7.9200439453125
-7.950781972366453,7.966917037963867
-7.954677021213342,7.923976421356201
-7.954677021213342,7.95139741897583
-7.987162773987728,7.92281436920166
-7.9430951409681345,7.92752742767334
-7.950781972366453,7.929265975952148
-7.903090094245322,7.915591716766357
-7.910094953104535,7.912550449371338
-7.913640203677234,7.920168876647949
-7.9542414507479275,7.975648403167725
-7.924453006674053,7.907663822174072
-7.946921547407927,7.918403148651123
-7.946921547407927,7.902332782745361
-7.931814161156377,7.886142730712891
-7.950781972366453,7.94101095199585
-7.950781972366453,7.930247783660889
-7.954677021213342,7.956923007965088
-7.946921547407927,7.924405574798584
-7.946921547407927,7.9120965003967285
-7.946921547407927,7.927549362182617
-7.931814161156377,7.912243843078613
-7.866185328564197,7.899660587310791
-7.950781972366453,7.9323296546936035
-7.950781972366453,7.929260730743408
-7.928117974144348,7.909213066101074
-7.946921547407927,7.913730621337891
-7.924453006674053,7.915950298309326
-7.920818811243059,7.92518949508667
-7.935542022791058,7.933499336242676
-7.931814161156377,7.92055082321167
-7.954677021213342,7.945703983306885
-7.928117974144348,7.911287784576416
-7.950781972366453,7.941114902496338
-7.924453006674053,7.908111572265625
-7.924453006674053,7.891082286834717
-7.879425560900211,7.865182399749756
-7.9913998274291025,7.960550785064697
-7.950781972366453,7.9635329246521
-7.954677021213342,7.920827865600586
-7.924453006674053,7.882884502410889
-7.920818811243059,7.90830135345459
-7.953262503246687,7.919675350189209
-7.931814161156377,7.913331031799316
-7.954677021213342,7.936511516571045
-7.910094953104535,7.941153049468994
-7.8728955601551585,7.9330735206604
-7.838628495628443,7.888455390930176
-7.950781972366453,7.946316242218018
-7.9430951409681345,7.903237819671631
-7.946921547407927,7.902528285980225
-7.9393021526221474,7.944498538970947
-7.950781972366453,7.9341721534729
-7.946921547407927,7.948782920837402
-7.950781972366453,7.928703308105469
-7.9393021526221474,7.9054341316223145
-7.970616219270671,7.92613410949707
-7.950781972366453,7.905149936676025
-7.995678626217357,7.970491886138916
-7.946921547407927,7.925773620605469
-7.950781972366453,7.9462738037109375
-7.954677021213342,7.910638332366943
-7.931814161156377,7.91638708114624
-7.946921547407927,7.90163516998291
-7.9393021526221474,7.925157070159912
-7.90595341825991,7.938565731048584
-7.946921547407927,7.948886394500732
-7.928117974144348,7.914047718048096
-7.9430951409681345,7.927356243133545
-7.9430951409681345,7.914196491241455
-7.945236761475783,7.914159774780273
-7.928155902956855,7.91793966293335
-7.928117974144348,7.9140238761901855
-7.863280055279963,7.877130508422852
-7.879425560900211,7.922718524932861
-7.8728955601551585,7.916845798492432
-7.950781972366453,7.928953170776367
-7.950781972366453,7.91599702835083
-7.950781972366453,7.922675609588623
-7.928117974144348,7.914313793182373
-7.931814161156377,7.935555458068848
-7.954677021213342,7.941922664642334
-7.875669587564858,7.915331840515137
-7.9393021526221474,7.909907341003418
-7.9393021526221474,7.936259746551514
-7.950781972366453,7.926719665527344
-7.954677021213342,7.928924083709717
-7.995678626217357,7.944295406341553
-7.950781972366453,7.946029186248779
-7.892790308673911,7.942207336425781
-7.892790308673911,7.897027969360352
-8.035307403686794,7.952311038970947
-7.909476463822079,7.915754318237305
-7.9393021526221474,7.914801120758057
-7.924453006674053,7.901491641998291
-7.931814161156377,7.89922571182251
-7.954677021213342,7.921148300170898
-7.9393021526221474,7.937780857086182
-7.924453006674053,7.928731918334961
-7.931814161156377,7.872513771057129
-7.950781972366453,7.9558234214782715
-7.89962956062971,7.917020320892334
-7.950781972366453,7.967067718505859
-7.950781972366453,7.9445366859436035
-7.924453006674053,7.885229587554932
-7.924453006674053,7.923926830291748
-7.950781972366453,7.931291580200195
-7.910094953104535,7.902745723724365
-7.928117974144348,7.936242580413818
-7.847706165863548,7.882385730743408
-7.946921547407927,7.927172660827637
-7.928117974144348,7.903562068939209
-7.9393021526221474,7.932806968688965
-7.857475444315718,7.921111106872559
-7.924453006674053,7.9287309646606445
-7.9430951409681345,7.919778347015381
-7.886056354845152,7.913714408874512
-7.892790308673911,7.921764850616455
-7.910094953104535,7.900278568267822
-7.9913998274291025,7.949998378753662
-7.995678626217357,7.924145221710205
-7.896196359268842,7.924973964691162
-7.924453006674053,7.905665397644043
-7.995678626217357,7.956763744354248
-7.935542022791058,7.910750865936279
-7.982923651140671,7.936267375946045
-7.903090094245322,7.903870582580566
-7.935542022791058,7.90147066116333
-7.954677021213342,7.917184352874756
-7.954677021213342,7.905595779418945
-7.9393021526221474,7.90971040725708
-7.946921547407927,7.910030364990234
-7.924453006674053,7.927626132965088
-7.946921547407927,7.915093898773193
-7.954677021213342,7.941951274871826
-7.91721462968355,7.919833183288574
-7.928117974144348,7.911978244781494
-7.928117974144348,7.900820255279541
-7.954677021213342,7.944726467132568
-7.950781972366453,7.931730270385742
-7.924453006674053,7.929091930389404
-7.931814161156377,7.920323848724365
-7.954677021213342,7.931693077087402
-7.950781972366453,7.9290385246276855
-7.927586760018237,7.908125877380371
-7.935542022791058,7.936358451843262
-7.920818811243059,7.922051429748535
-7.954677021213342,7.914752960205078
-7.869016357072147,7.886883735656738
-7.954677021213342,7.937325954437256
-7.9393021526221474,7.920932292938232
-7.950781972366453,7.939708709716797
-7.946921547407927,7.922199249267578
-7.928117974144348,7.911530017852783
-7.935542022791058,7.902041912078857
-7.910957386956294,7.912881374359131
-7.954677021213342,7.922744274139404
-7.920818811243059,7.920159816741943
-7.9430951409681345,7.941417694091797
-7.91721462968355,7.905699729919434
-7.9393021526221474,7.922347068786621
-7.924453006674053,7.936926364898682
-7.950781972366453,7.961021900177002
-7.924453006674053,7.888426303863525
-7.9430951409681345,7.937839984893799
-7.924453006674053,7.938502788543701
-7.8416326138557455,7.900406837463379
-7.8416326138557455,7.894690990447998
-7.946921547407927,7.942799091339111
-7.931814161156377,7.930087089538574
-7.954677021213342,7.941999912261963
-7.943055911701025,7.932992458343506
-7.913640203677234,7.90862512588501
-7.860119116630385,7.894711017608643
-7.928936536236001,7.896536350250244
-7.8349671212224035,7.88742733001709
-7.950781972366453,7.9370598793029785
-7.954677021213342,7.935929298400879
-7.873682696996433,7.9182448387146
-7.982923651140671,7.940749645233154
-7.906578398789698,7.935508728027344
-7.950781972366453,7.945444107055664
-7.950781972366453,7.943352699279785
-7.946921547407927,7.951290607452393
-7.9393021526221474,7.918649196624756
-7.906578398789698,7.944784641265869
-7.9430951409681345,7.897293567657471
-7.896196359268842,7.945993900299072
-7.946921547407927,7.916073322296143
-7.935542022791058,7.943670272827148
-7.950781972366453,7.95728063583374
-7.91721462968355,7.912919998168945
-7.931814161156377,7.898874759674072
-7.9393021526221474,7.947360992431641
-7.931814161156377,7.927610397338867
-7.9430951409681345,7.928054332733154
-7.906578398789698,7.913859844207764
-7.9430951409681345,7.942507743835449
-7.913640203677234,7.9103264808654785
-7.946921547407927,7.915139675140381
-7.954677021213342,7.933873653411865
-7.896708615962599,7.90824031829834
-7.950781972366453,7.935389041900635
-7.881529845545969,7.92158842086792
-7.935542022791058,7.927703380584717
-7.9430951409681345,7.927635669708252
-7.924453006674053,7.976592063903809
-7.974694136660875,7.932377338409424
-7.954677021213342,7.940262794494629
-7.950781972366453,7.918481349945068
-7.935542022791058,7.902843952178955
-7.954677021213342,7.936606407165527
-7.860119116630385,7.86890983581543
-7.950781972366453,7.92874002456665
-7.935542022791058,7.959449768066406
-7.924453006674053,7.906952381134033
-7.950781972366453,7.914005756378174
-7.962737687758908,7.967177867889404
-7.946921547407927,7.917487621307373
-7.8728955601551585,7.865713596343994
-7.954677021213342,7.943032741546631
-7.935542022791058,7.924260139465332
-7.954677021213342,7.892492294311523
-7.950781972366453,7.940065860748291
-7.924453006674053,7.894860744476318
-7.931814161156377,7.899996280670166
-7.9393021526221474,7.956369876861572
-7.835637836224461,7.87890100479126
-7.924453006674053,7.921024799346924
-7.906578398789698,7.889411449432373
-7.950781972366453,7.916606426239014
-7.950781972366453,7.93516731262207
-7.950781972366453,7.9238080978393555
-7.924453006674053,7.927249908447266
-7.982923651140671,7.923285007476807
-7.928117974144348,7.90850830078125
-8.008819571765459,7.998456954956055
-7.931814161156377,7.921176433563232
-7.856986114171083,7.8789963722229
-7.950781972366453,7.91680908203125
-7.886056354845152,7.916187763214111
-7.924453006674053,7.8963470458984375
-7.931814161156377,7.927384376525879
-7.826774591089415,7.902482509613037
-7.9393021526221474,7.902287006378174
-7.910094953104535,7.896296977996826
-7.918688621719399,7.9212822914123535
-7.9737577757544535,7.945130825042725
-7.928117974144348,7.926175594329834
-7.924453006674053,7.917315483093262
-7.906578398789698,7.918525218963623
-7.924453006674053,7.934093475341797
-7.950781972366453,7.952577590942383
-7.954677021213342,7.95067024230957
-7.935542022791058,7.938073635101318
-7.946921547407927,7.940148830413818
-7.91721462968355,7.889278888702393
-7.950781972366453,7.945668697357178
-7.903090094245322,7.894767761230469
-7.981017239849406,7.955721378326416
-7.950781972366453,7.952507972717285
-7.928117974144348,7.906808853149414
-7.910094953104535,7.9209675788879395
-7.924453006674053,7.900547027587891
-7.9430951409681345,7.92235803604126
-7.839935417773265,7.873270511627197
-7.9393021526221474,7.905170917510986
-7.924453006674053,7.898134708404541
-7.906578398789698,7.90664005279541
-7.924453006674053,7.9067206382751465
-7.931814161156377,7.923729419708252
-7.946921547407927,7.939667224884033
-7.950781972366453,7.930883407592773
-7.9393021526221474,7.90576696395874
-7.892790308673911,7.9056291580200195
-7.954677021213342,7.9242424964904785
-7.924453006674053,7.890058994293213
-7.954677021213342,7.905330657958984
-7.946921547407927,7.938980579376221
-7.9430951409681345,7.940536975860596
-7.925009000125929,7.931387901306152
-7.866459873882536,7.89670991897583
-7.950781972366453,7.926156520843506
-7.8761493177145505,7.906004428863525
-7.995678626217357,7.9276838302612305
-7.928117974144348,7.913379192352295
-7.946921547407927,7.924113750457764
-7.950781972366453,7.94041109085083
-7.8761493177145505,7.903934001922607
-7.950781972366453,7.909870624542236
-7.954677021213342,7.960527420043945
-7.935542022791058,7.9550018310546875
-7.913640203677234,7.9334235191345215
-7.946921547407927,7.947642803192139
-7.924453006674053,7.90209436416626
-7.935542022791058,7.913161277770996
-7.9393021526221474,7.90423059463501
-7.946921547407927,7.929991245269775
-7.974694136660875,7.951646327972412
-7.946921547407927,7.926953315734863
-7.954677021213342,7.9148736000061035
-7.950781972366453,7.925503253936768
-7.982966659490206,7.940295696258545
-7.896196359268842,7.889266490936279
-7.920818811243059,7.9037370681762695
-7.935542022791058,7.951203346252441
-7.978810702253626,7.94296407699585
-7.950781972366453,7.9220662117004395
-7.946921547407927,7.913404941558838
-7.938102963264953,7.946122646331787
-7.950781972366453,7.927537441253662
-7.924453006674053,7.920086860656738
-7.935542022791058,7.92104959487915
-7.936235711226021,7.909037113189697
-7.946921547407927,7.933694362640381
-7.928117974144348,7.917306900024414
-7.928117974144348,7.880967617034912
-7.946921547407927,7.9056172370910645
-7.8728955601551585,7.8700737953186035
-7.935542022791058,7.913985729217529
-7.946921547407927,7.929606914520264
-7.928117974144348,7.916228771209717
-7.935542022791058,7.917356967926025
-7.897047976439774,7.901569366455078
-7.982923651140671,7.911925315856934
-7.924453006674053,7.929942607879639
-7.9393021526221474,7.926875591278076
-7.931814161156377,7.904497146606445
-7.9430951409681345,7.928345680236816
-7.928117974144348,7.9342427253723145
-7.931814161156377,7.916343688964844
-7.954677021213342,7.940740585327148
-7.954677021213342,7.957885265350342
-7.935542022791058,7.924464702606201
-7.954677021213342,7.933094024658203
-7.954677021213342,7.908543586730957
-7.935542022791058,7.908471584320068
-7.9393021526221474,7.907485485076904
-7.913640203677234,7.917191982269287
-7.950781972366453,7.930301666259766
-7.931814161156377,7.921158313751221
-7.924453006674053,7.925669193267822
-7.946921547407927,7.899532318115234
-7.928117974144348,7.914480686187744
-7.954677021213342,7.9265522956848145
-7.9430951409681345,7.921457290649414
-7.924453006674053,7.911165714263916
-7.950781972366453,7.916382789611816
-7.946921547407927,7.92056131362915
-7.860119116630385,7.90889310836792
-7.987162773987728,7.942479610443115
-7.9393021526221474,7.925230503082275
-7.935542022791058,7.90024471282959
-7.954677021213342,7.933882713317871
-7.954677021213342,7.933522701263428
-7.9393021526221474,7.926881313323975
-7.89962956062971,7.9243083000183105
-7.903090094245322,7.903738021850586
-7.933674092121578,7.947468280792236
-7.924453006674053,7.921609878540039
-7.85205769961263,7.910544395446777
-7.9430951409681345,7.936303615570068
-7.955487534501616,7.909257411956787
-7.950781972366453,7.927728176116943
-7.924453006674053,7.927289009094238
-7.950781972366453,7.915292739868164
-7.954677021213342,7.935336589813232
-7.950781972366453,7.934770107269287
-7.920818811243059,7.893213748931885
-7.928117974144348,7.896847248077393
-7.924453006674053,7.92523193359375
-7.931814161156377,7.9011759757995605
-7.950258453393831,7.920322418212891
-7.950781972366453,7.951323509216309
-7.9737577757544535,7.941911220550537
-7.9737577757544535,7.940330982208252
-7.931814161156377,7.905865669250488
-7.950781972366453,7.923446178436279
-7.882728704344236,7.89332389831543
-7.946921547407927,7.93646764755249
-7.9430951409681345,7.942466735839844
-7.920818811243059,7.9280829429626465
-8.021868103338793,7.939608097076416
-7.9393021526221474,7.915339469909668
-7.9430951409681345,7.923122882843018
-7.954677021213342,7.91803503036499
-7.920818811243059,7.9140520095825195
-7.950781972366453,7.938398838043213
-7.903090094245322,7.907491683959961
-7.935542022791058,7.930447578430176
-7.924453006674053,7.937307834625244
-7.9393021526221474,7.940418243408203
-7.928117974144348,7.92160177230835
-7.931814161156377,7.901003837585449
-7.950781972366453,7.903993606567383
-7.882728704344236,7.927769660949707
-7.9393021526221474,7.9460225105285645
-7.946921547407927,7.915354251861572
-7.950781972366453,7.9316558837890625
-7.924453006674053,7.89251184463501
-7.928117974144348,7.909311771392822
-7.946921547407927,7.919864177703857
-7.879425560900211,7.918531894683838
-7.903090094245322,7.923028945922852
-7.924453006674053,7.936141490936279
-7.995678626217357,7.91519021987915
-7.946921547407927,7.94691801071167
-7.962737687758908,7.985424041748047
-7.853872762493711,7.910186767578125
-7.946921547407927,7.915616512298584
-7.8761493177145505,7.9134840965271
-7.845056321514322,7.862926483154297
-7.982923651140671,7.926305294036865
-7.954677021213342,7.971705913543701
-7.950781972366453,7.958846092224121
-7.950781972366453,7.919766902923584
-7.96257349994767,7.949473857879639
-7.954677021213342,7.917659282684326
-7.946921547407927,7.920217037200928
-7.892790308673911,7.924713134765625
-7.935542022791058,7.8967695236206055
-7.920818811243059,7.922430515289307
-7.913640203677234,7.911045551300049
-7.950781972366453,7.9322662353515625
-7.946921547407927,7.923023223876953
-7.9430951409681345,7.931457996368408
-7.946921547407927,7.920804977416992
-7.889410352488291,7.862931728363037
-7.954677021213342,7.934142112731934
-7.9393021526221474,7.937839031219482
-7.91721462968355,7.930097579956055
-7.924453006674053,7.913636684417725
-7.913640203677234,7.911032199859619
-7.9430951409681345,7.922435283660889
-7.892790308673911,7.908849716186523
-7.920818811243059,7.934665203094482
-7.91721462968355,7.89414644241333
-7.950781972366453,7.925325393676758
-7.928117974144348,7.9059576988220215
-7.995678626217357,7.943220615386963
-7.925009000125929,7.937098026275635
-7.920818811243059,7.88086462020874
-7.8416326138557455,7.879363536834717
-7.950781972366453,7.9294819831848145
-7.924453006674053,7.907456874847412
-7.9393021526221474,7.9382004737854
-7.946921547407927,7.928286075592041
-7.879425560900211,7.902281284332275
-7.924453006674053,7.935800552368164
-7.9430951409681345,7.93964147567749
-7.954677021213342,7.937677383422852
-7.924453006674053,7.941889762878418
-7.970532618892763,7.953164577484131
-7.954677021213342,7.9425530433654785
-7.924453006674053,7.928907871246338
-7.9178264228074555,7.932463645935059
-7.9430951409681345,7.913466453552246
-7.906578398789698,7.915235996246338
-7.892790308673911,7.935375690460205
-7.935542022791058,7.910390377044678
-7.950781972366453,7.935526371002197
-7.8349671212224035,7.931362628936768
-7.990339285400088,7.966617107391357
-7.954677021213342,7.932607173919678
-7.896196359268842,7.914303779602051
-7.924453006674053,7.914271831512451
-7.935542022791058,7.927089691162109
-7.950781972366453,7.930682182312012
-7.950781972366453,7.940354824066162
-7.946921547407927,7.914725303649902
-7.950781972366453,7.927769660949707
-7.91721462968355,7.910470485687256
-7.935542022791058,7.890819072723389
-7.9317376797944785,7.9070725440979
-7.931814161156377,7.905069828033447
-7.8728955601551585,7.922675609588623
-7.928117974144348,7.9319682121276855
-7.9430951409681345,7.92487907409668
-7.954677021213342,7.926342487335205
-7.924453006674053,7.925884246826172
-7.910094953104535,7.925961971282959
-7.886056354845152,7.945279598236084
-7.928117974144348,7.918758392333984
-7.906578398789698,7.91238260269165
-7.921654300471129,7.918415069580078
-7.9913998274291025,7.981422424316406
-7.950781972366453,7.940606117248535
-7.920818811243059,7.9122233390808105
-7.924453006674053,7.901490688323975
-7.866459873882536,7.904615879058838
-7.954677021213342,7.918179035186768
-7.946921547407927,7.9299397468566895
-7.9393021526221474,7.9260172843933105
-7.928117974144348,7.91259241104126
-7.946921547407927,7.90709924697876
-7.954677021213342,7.933868885040283
-7.91721462968355,7.916123390197754
-7.935542022791058,7.924724102020264
-7.950781972366453,7.9426350593566895
-7.9393021526221474,7.904521465301514
-7.946921547407927,7.90049409866333
-7.950781972366453,7.933470726013184
-7.9393021526221474,7.934999942779541
-7.935542022791058,7.922759056091309
-7.920818811243059,7.901264667510986
-7.950781972366453,7.944209575653076
-7.968205654382864,7.938470363616943
-7.906578398789698,7.921790599822998
-7.906578398789698,7.898382186889648
-7.950781972366453,7.949805736541748
-7.892790308673911,7.918555736541748
-7.950781972366453,7.935012340545654
-7.9393021526221474,7.927441596984863
-7.931814161156377,7.894071578979492
-7.924453006674053,7.92492151260376
-7.935542022791058,7.927627086639404
-7.931814161156377,7.905547618865967
-7.903090094245322,7.889834403991699
-7.928117974144348,7.916285991668701
-7.931814161156377,7.910445690155029
-7.946921547407927,7.91238260269165
-7.950781972366453,7.936378002166748
-7.935542022791058,7.90657377243042
-7.924453006674053,7.8905720710754395
-7.924453006674053,7.915685176849365
-7.895396032658235,7.932919025421143
-7.935542022791058,7.923237323760986
-7.924453006674053,7.922539234161377
-7.913640203677234,7.918356418609619
-7.903090094245322,7.903377056121826
-7.944934810975955,7.907097339630127
-7.928117974144348,7.914047718048096
-7.954677021213342,7.9456868171691895
-7.91721462968355,7.931823253631592
-7.928117974144348,7.9193220138549805
-7.953077439301119,7.926902770996094
-7.920818811243059,7.913018703460693
-7.924453006674053,7.942233562469482
-7.931814161156377,7.909847736358643
-7.924453006674053,7.939673900604248
-7.903090094245322,7.948466777801514
-7.9317759187918355,7.922109127044678
-7.946921547407927,7.955709934234619
-7.903090094245322,7.910989761352539
-7.924453006674053,7.9145894050598145
-7.982923651140671,7.93234395980835
-7.931814161156377,7.941920280456543
-7.950781972366453,7.9277191162109375
-7.946921547407927,7.9298787117004395
-7.950781972366453,7.9098711013793945
-7.935542022791058,7.905615329742432
-7.886056354845152,7.9275946617126465
-7.889410352488291,7.91855001449585
-7.982966659490206,7.94780158996582
-7.931814161156377,7.914700984954834
-7.954677021213342,7.925525188446045
-7.931814161156377,7.909841060638428
-7.950781972366453,7.930467128753662
-7.89962956062971,7.906005382537842
-7.96257349994767,7.92969274520874
-7.920818811243059,7.893482208251953
-7.946921547407927,7.926572799682617
-7.935542022791058,7.898800373077393
-7.935542022791058,7.9054107666015625
-7.931814161156377,7.922265529632568
-7.978895913358191,7.980064392089844
-7.950781972366453,7.947782039642334
-7.9393021526221474,7.918779373168945
-7.928117974144348,7.904208660125732
-7.9393021526221474,7.915938377380371
-7.950781972366453,7.910046100616455
-7.910094953104535,7.932194232940674
-7.9323996276632,7.920796871185303
-7.954677021213342,7.9268388748168945
-7.931814161156377,7.891960620880127
-7.823919469453418,7.909243583679199
-7.9430951409681345,7.954579830169678
-7.946921547407927,7.959114074707031
-7.954677021213342,7.951272010803223
-7.950781972366453,7.934165954589844
-7.89962956062971,7.918515682220459
-7.928117974144348,7.9032206535339355
-7.950781972366453,7.939970970153809
-7.877418782738375,7.883585453033447
-7.910094953104535,7.916426658630371
-7.954677021213342,7.903114318847656
-7.935542022791058,7.918810844421387
-7.987162773987728,7.917622089385986
-7.8728955601551585,7.93317174911499
-7.928117974144348,7.911558628082275
-7.9913998274291025,7.98162317276001
-7.950781972366453,7.918877124786377
-7.9319299849042615,7.936111927032471
-7.946921547407927,7.945098400115967
-7.950781972366453,7.947916030883789
-7.878606331107103,7.93242883682251
-7.903090094245322,7.920654296875
-7.928117974144348,7.89706563949585
-7.903090094245322,7.894870758056641
-7.950781972366453,7.941098690032959
-7.954677021213342,7.931293964385986
-7.928117974144348,7.933547496795654
-7.935542022791058,7.922562599182129
-7.844664854175832,7.905372619628906
-7.882728704344236,7.910881519317627
-7.96257349994767,7.96845006942749
-7.946921547407927,7.913224697113037
-7.91721462968355,7.886409282684326
-7.931814161156377,7.8946852684021
-7.924453006674053,7.91574239730835
-7.913640203677234,7.878506660461426
-7.928117974144348,7.9168925285339355
-7.924453006674053,7.9013352394104
-7.889410352488291,7.901890277862549
-7.931814161156377,7.921176910400391
-7.9393021526221474,7.9441423416137695
-7.9393021526221474,7.928548336029053
-7.9393021526221474,7.894498348236084
-7.913640203677234,7.902167797088623
-7.89962956062971,7.886709690093994
-7.903090094245322,7.919806003570557
-7.94094624659741,7.912048816680908
-7.950781972366453,7.91033411026001
-7.950781972366453,7.9326043128967285
-7.866459873882536,7.916190147399902
-7.931814161156377,7.891880989074707
-7.935542022791058,7.935448169708252
-7.954677021213342,7.9499688148498535
-7.931814161156377,7.918334484100342
-7.9393021526221474,7.921820640563965
-7.923581356476356,7.915377140045166
-7.950781972366453,7.925645351409912
-7.954677021213342,7.93088436126709
-7.954677021213342,7.937823295593262
-7.946921547407927,7.876498699188232
-7.9430951409681345,7.93986177444458
-7.920818811243059,7.88955545425415
-7.928117974144348,7.931213855743408
-7.93468629292431,7.923373699188232
-7.924453006674053,7.909635066986084
-7.9393021526221474,7.927867889404297
-7.9393021526221474,7.928487777709961
-7.91721462968355,7.912725448608398
-7.946921547407927,7.921822547912598
-7.869665979871627,7.900868892669678
-7.931814161156377,7.919996738433838
-7.946921547407927,7.924030780792236
-7.8728955601551585,7.913741588592529
-7.89962956062971,7.8917155265808105
-7.954677021213342,7.95478630065918
-7.995678626217357,7.9469804763793945
-7.9393021526221474,7.93059778213501
-7.950781972366453,7.933701515197754
-7.906578398789698,7.913196563720703
-7.920818811243059,7.896830081939697
-7.935542022791058,7.934633731842041
-7.9393021526221474,7.917429447174072
-7.924453006674053,7.923057556152344
-7.939379961634402,7.867053508758545
-7.924453006674053,7.913923740386963
-7.950781972366453,7.916330814361572
-7.946921547407927,7.87445592880249
-7.896196359268842,7.913520336151123
-7.906578398789698,7.916062355041504
-7.9393021526221474,7.940276622772217
-7.935542022791058,7.911341190338135
-7.982923651140671,7.937258243560791
-7.906578398789698,7.916649341583252
-7.958607309235428,7.952625751495361
-7.924453006674053,7.89072847366333
-7.928117974144348,7.90150260925293
-7.966617665152964,7.944485187530518
-7.8728955601551585,7.923046588897705
-7.931814161156377,7.930908203125
-7.950781972366453,7.936187744140625
-7.913640203677234,7.907368183135986
-7.950781972366453,7.930373668670654
-7.924453006674053,7.9184956550598145
-7.9430951409681345,7.943048477172852
-7.950781972366453,7.9189982414245605
-7.924453006674053,7.9128098487854
-7.931814161156377,7.895459175109863
-7.946921547407927,7.9420952796936035
-7.920818811243059,7.916165828704834
-7.91721462968355,7.948622226715088
-7.906578398789698,7.884725093841553
-7.954677021213342,7.906110763549805
-7.946921547407927,7.908572196960449
-7.892790308673911,7.932114124298096
-7.928117974144348,7.91386079788208
-7.91721462968355,7.914309024810791
-7.9393021526221474,7.927750110626221
-7.920818811243059,7.905996322631836
-7.920818811243059,7.895396709442139
-7.954677021213342,7.9605631828308105
-7.8728955601551585,7.89586877822876
-7.954677021213342,7.910487651824951
-7.954677021213342,7.928466796875
-7.928117974144348,7.920883655548096
-7.954677021213342,7.931079387664795
-7.950781972366453,7.941429138183594
-7.935542022791058,7.938704490661621
-7.913640203677234,7.8940582275390625
-7.931814161156377,7.925836563110352
-7.935542022791058,7.914212703704834
-7.987162773987728,7.947781562805176
-7.866185328564197,7.888172626495361
-7.954677021213342,7.922854900360107
-7.924453006674053,7.926818370819092
-7.9393021526221474,7.935263156890869
-7.860820732007034,7.895195007324219
-7.892790308673911,7.911435604095459
-7.860119116630385,7.883571624755859
-7.91721462968355,7.920324325561523
-7.869665979871627,7.915892601013184
-7.80966502563657,7.883266925811768
-7.946921547407927,7.929126739501953
-7.946921547407927,7.915409564971924
-7.9393021526221474,7.927433490753174
-7.920818811243059,7.921987056732178
-7.931814161156377,7.907869815826416
-7.928117974144348,7.930372714996338
-7.838628495628443,7.9099440574646
-7.9393021526221474,7.941250324249268
-7.950781972366453,7.927888870239258
-7.954677021213342,7.95206880569458
-7.954677021213342,7.916874408721924
-7.950781972366453,7.937077045440674
-7.886056354845152,7.9059672355651855
-7.975453335860696,7.9284563064575195
-7.931814161156377,7.943312168121338
-7.906542242015022,7.90732479095459
-7.946921547407927,7.918287754058838
-7.906578398789698,7.919400215148926
-7.924453006674053,7.909890174865723
-7.9393021526221474,7.9307332038879395
-7.913640203677234,7.93841028213501
-7.9393021526221474,7.920161724090576
-7.913640203677234,7.900850772857666
-7.920818811243059,7.891392230987549
-7.995678626217357,7.938472270965576
-7.954677021213342,7.949377536773682
-7.950781972366453,7.938572406768799
-7.89962956062971,7.911330223083496
-7.982923651140671,7.9281110763549805
-7.886056354845152,7.923628330230713
-7.935542022791058,7.939354419708252
-7.954677021213342,7.935610294342041
-7.8499263047712216,7.919128894805908
-7.946921547407927,7.910953998565674
-7.889410352488291,7.919104099273682
-7.954677021213342,7.925476551055908
-7.9430951409681345,7.9262824058532715
-7.9430951409681345,7.928609848022461
-7.9393021526221474,7.9278950691223145
-7.931814161156377,7.908173084259033
-7.847706165863548,7.903600215911865
-7.920818811243059,7.898731708526611
-7.844664854175832,7.836604595184326
-7.924453006674053,7.921846866607666
-7.9393021526221474,7.903149127960205
-7.856986114171083,7.906823635101318
-7.950781972366453,7.926981449127197
-7.863280055279963,7.9192891120910645
-7.903090094245322,7.904661655426025
-7.9430951409681345,7.895455837249756
-7.928117974144348,7.911137104034424
-7.89962956062971,7.917235851287842
-7.950781972366453,7.925408840179443
-7.946921547407927,7.8789381980896
-7.991531413298041,7.984896659851074
-7.931814161156377,7.907357692718506
-7.946921547407927,7.920999050140381
-7.920818811243059,7.920831203460693
-7.950781972366453,7.922975063323975
-7.9393021526221474,7.9080023765563965
-7.9393021526221474,7.947702407836914
-7.892790308673911,7.902945041656494
-7.856986114171083,7.903343677520752
-7.954677021213342,7.936882972717285
-7.950781972366453,7.944161415100098
-7.950781972366453,7.935785293579102
-7.924453006674053,7.920156955718994
-7.924453006674053,7.927698135375977
-7.935542022791058,7.935577869415283
-7.954677021213342,7.940885543823242
-7.950781972366453,7.920274257659912
-7.9393021526221474,7.935520172119141
-7.91721462968355,7.888864994049072
-7.829768510087842,7.9200239181518555
-7.946921547407927,7.931491374969482
-7.91721462968355,7.931816577911377
-7.879425560900211,7.901668071746826
-7.920818811243059,7.924221515655518
-7.892790308673911,7.908228874206543
-7.995678626217357,7.930290222167969
-7.903090094245322,7.894646167755127
-7.9430951409681345,7.923109531402588
-7.935542022791058,7.919347763061523
-7.931814161156377,7.899313926696777
-7.935542022791058,7.908837795257568
-7.950781972366453,7.938547134399414
-7.950781972366453,7.93321418762207
-7.954677021213342,7.949295997619629
-7.928117974144348,7.912695407867432
-7.954677021213342,7.953649044036865
-7.931814161156377,7.922888278961182
-7.924453006674053,7.9010491371154785
-7.913640203677234,7.912675380706787
-7.9430951409681345,7.922417163848877
-7.928117974144348,7.915193557739258
-7.920818811243059,7.911762714385986
-7.954677021213342,7.925923824310303
-7.879425560900211,7.903989791870117
-7.863280055279963,7.873426914215088
-7.995678626217357,7.969942569732666
-7.946921547407927,7.892186641693115
-7.91721462968355,7.9104485511779785
-7.935542022791058,7.9258713722229
-7.954677021213342,7.9422478675842285
-7.9913998274291025,7.939059734344482
-7.954677021213342,7.962846755981445
-7.924453006674053,7.9404826164245605
-7.946921547407927,7.930016994476318
-7.924453006674053,7.87569522857666
-7.950781972366453,7.915317058563232
-7.931814161156377,7.960566997528076
-7.946921547407927,7.917898654937744
-7.91721462968355,7.91016960144043
-7.916754118885,7.906439781188965
-7.82102305270683,7.930212497711182
-7.935734864536909,7.911217212677002
-7.9393021526221474,7.931938171386719
-7.920818811243059,7.917776584625244
-7.9393021526221474,7.921815872192383
-7.931814161156377,7.902923107147217
-7.924453006674053,7.932682037353516
-7.924453006674053,7.917555809020996
-7.954677021213342,7.897801399230957
-7.995678626217357,7.951589107513428
-7.946921547407927,7.955703258514404
-7.838628495628443,7.887290954589844
-7.931814161156377,7.903867721557617
-7.950781972366453,7.932581901550293
-7.950781972366453,7.918880939483643
-7.906578398789698,7.9347662925720215
-7.9737577757544535,7.957178592681885
-7.950781972366453,7.936189651489258
-7.950781972366453,7.930727958679199
-7.913640203677234,7.929920673370361
-7.9393021526221474,7.915985107421875
-7.935542022791058,7.915794849395752
-7.950781972366453,7.956156253814697
-7.91721462968355,7.919283390045166
-7.954677021213342,7.944429874420166
-7.8761493177145505,7.9170098304748535
-7.928117974144348,7.91203498840332
-7.950781972366453,7.945070743560791
-7.912546261746637,7.905375957489014
-7.924453006674053,7.8958635330200195
-7.946921547407927,7.921841621398926
-7.946921547407927,7.924988269805908
-7.91721462968355,7.907312870025635
-7.926474926395767,7.904704570770264
-7.913640203677234,7.926783084869385
-7.928117974144348,7.921451091766357
-7.928117974144348,7.913389205932617
-7.910094953104535,7.921926021575928
-7.9430951409681345,7.941837310791016
-7.954677021213342,7.938162326812744
-7.9393021526221474,7.940257549285889
-7.950781972366453,7.937557697296143
-7.950781972366453,7.933586597442627
-7.995678626217357,7.950328826904297
-7.931814161156377,7.913768291473389
-7.924453006674053,7.897674083709717
-7.954677021213342,7.9409356117248535
-7.9393021526221474,7.9109039306640625
-7.931814161156377,7.8949971199035645
-7.946921547407927,7.905323505401611
-7.931814161156377,7.90210485458374
-7.829768510087842,7.908848762512207
-7.889410352488291,7.934902191162109
-7.954677021213342,7.928262233734131
-7.954677021213342,7.926059722900391
-7.928117974144348,7.90731954574585
-7.935542022791058,7.918032169342041
-7.954677021213342,7.926689147949219
-7.954677021213342,7.954964637756348
-7.950781972366453,7.9345245361328125
-7.950781972366453,7.910192489624023
-7.856986114171083,7.899991035461426
-7.832673025823477,7.901881694793701
-7.982923651140671,7.935156345367432
-7.9393021526221474,7.91700553894043
-7.89962956062971,7.930182933807373
-7.931814161156377,7.9222798347473145
-7.935542022791058,7.8992133140563965
-7.920818811243059,7.900058269500732
-7.853872762493711,7.92219352722168
-7.913923212296786,7.929576873779297
-7.931814161156377,7.920217514038086
-7.9430951409681345,7.947990417480469
-7.91721462968355,7.9256720542907715
-7.950781972366453,7.912597179412842
-7.946921547407927,7.941562652587891
-7.946921547407927,7.9409379959106445
-7.9430951409681345,7.923018932342529
-7.85078088734462,7.922356128692627
-7.89102837972676,7.884165287017822
-7.954677021213342,7.9348530769348145
-7.950781972366453,7.934890270233154
-7.974694136660875,7.936051368713379
-7.954677021213342,7.8871750831604
-7.950781972366453,7.941258907318115
-7.9393021526221474,7.891880989074707
-7.9430951409681345,7.932656288146973
-7.946921547407927,7.924363136291504
-7.9393021526221474,7.914016246795654
-7.924453006674053,7.9235100746154785
-7.970532618892763,7.951166152954102
-7.950781972366453,7.921358585357666
-7.9393021526221474,7.930120944976807
-7.892790308673911,7.924724578857422
-7.9393021526221474,7.9317216873168945
-7.894231790888085,7.892282485961914
-7.950781972366453,7.936253070831299
-7.9393021526221474,7.944721698760986
-7.950781972366453,7.943167209625244
-7.946921547407927,7.934031009674072
-7.954677021213342,7.928354740142822
-7.924453006674053,7.921851634979248
-7.946921547407927,7.913838863372803
-7.938964847901857,7.924083232879639
-7.91721462968355,7.929340839385986
-7.950781972366453,7.904029369354248
-7.950781972366453,7.967342853546143
-7.924453006674053,7.909348964691162
-7.930395825138251,7.9006195068359375
-7.950781972366453,7.947354316711426
-7.995678626217357,7.987140655517578
-7.950781972366453,7.915293216705322
-7.950781972366453,7.918219089508057
-7.950781972366453,7.928773880004883
-7.903090094245322,7.9013237953186035
-7.924453006674053,7.916991710662842
-7.935542022791058,7.932961940765381
-7.910094953104535,7.906520843505859
-7.950781972366453,7.936293125152588
-7.9393021526221474,7.922152996063232
-7.950781972366453,7.958259105682373
-7.924453006674053,7.921238422393799
-7.89962956062971,7.913975238800049
-7.885240505812072,7.947192668914795
-7.928117974144348,7.927275657653809
-7.954677021213342,7.9402031898498535
-7.924453006674053,7.909387111663818
-7.85078088734462,7.8571085929870605
-7.910094953104535,7.9230570793151855
-7.935542022791058,7.918726444244385
-7.9430951409681345,7.9238667488098145
-7.950781972366453,7.935216426849365
-7.954677021213342,7.931752681732178
-7.924453006674053,7.923367023468018
-7.935542022791058,7.9009270668029785
-7.950781972366453,7.9215407371521
-7.928117974144348,7.916013240814209
-7.931814161156377,7.915194988250732
-7.946921547407927,7.925352573394775
-7.920818811243059,7.912884712219238
-7.924453006674053,7.912262916564941
-7.950781972366453,7.950859546661377
-7.928117974144348,7.8893351554870605
-7.924453006674053,7.887583255767822
-7.924453006674053,7.905012607574463
-7.89962956062971,7.9370245933532715
-7.903090094245322,7.910378932952881
-7.950781972366453,7.950446128845215
-7.954677021213342,7.918757438659668
-7.950781972366453,7.962929725646973
-7.946921547407927,7.9318108558654785
-7.903090094245322,7.899625301361084
-7.9393021526221474,7.9322123527526855
-7.9430951409681345,7.918365955352783
-7.903090094245322,7.9060540199279785
-7.828808459121975,7.876955509185791
-7.954677021213342,7.930876731872559
-7.950781972366453,7.9124040603637695
-7.950781972366453,7.939564228057861
-7.954677021213342,7.914834022521973
-7.950781972366453,7.9471917152404785
-7.941194505965742,7.920451641082764
-7.946921547407927,7.953897953033447
-7.9059218090964904,7.88964319229126
-7.924453006674053,7.918996334075928
-7.954677021213342,7.939122200012207
-7.9393021526221474,7.931809902191162
-7.9393021526221474,7.910343647003174
-7.946921547407927,7.912908554077148
-7.995678626217357,7.959821701049805
-7.935542022791058,7.93874979019165
-7.9393021526221474,7.942690372467041
-7.954677021213342,7.930350303649902
-7.935542022791058,7.894291400909424
-7.79317412396815,7.905475616455078
-7.954677021213342,7.940460681915283
-7.954677021213342,7.94724178314209
-7.931814161156377,7.925239086151123
-7.9393021526221474,7.928796291351318
-7.806866690314549,7.899655342102051
-8.013136044317282,7.975911617279053
-7.860119116630385,7.865816593170166
-7.924453006674053,7.906397342681885
-7.928117974144348,7.940965175628662
-7.935542022791058,7.924879550933838
-7.928117974144348,7.91223669052124
-7.978895913358191,7.971869945526123
-7.950781972366453,7.924968242645264
-7.931814161156377,7.909196376800537
-7.982966659490206,7.940146446228027
-7.954677021213342,7.956957817077637
-7.928117974144348,7.901318550109863
-7.9393021526221474,7.923839092254639
-7.954677021213342,7.9181060791015625
-7.954677021213342,7.928823947906494
-7.950781972366453,7.951456546783447
-7.931814161156377,7.952172756195068
-7.989586925059168,7.935085773468018
-7.924453006674053,7.910117149353027
-7.9393021526221474,7.933793544769287
-7.896196359268842,7.900582790374756
-7.954677021213342,7.943761825561523
-7.931814161156377,7.92476749420166
-7.946921547407927,7.888932704925537
-7.920818811243059,7.917481899261475
-7.946921547407927,7.9032416343688965
-7.91721462968355,7.907398700714111
-7.9430951409681345,7.92568826675415
-7.946921547407927,7.92974853515625
-7.954677021213342,7.941030025482178
-7.9430951409681345,7.9332194328308105
-7.950781972366453,7.9298882484436035
-7.946921547407927,7.899743556976318
-7.928117974144348,7.87294340133667
-7.954677021213342,7.9357008934021
-7.913640203677234,7.921679973602295
-7.922491400135772,7.922611713409424
-7.924453006674053,7.903844356536865
-7.954677021213342,7.947188854217529
-7.9393021526221474,7.925246715545654
-7.896196359268842,7.9176106452941895
-7.978895913358191,7.916146755218506
-7.879425560900211,7.889858722686768
-7.946921547407927,7.92855978012085
-7.87782536851803,7.881960391998291
-7.954677021213342,7.942220211029053
-7.866459873882536,7.895218372344971
-7.924453006674053,7.9102959632873535
-7.903090094245322,7.9018073081970215
-7.950781972366453,7.926458358764648
-7.9430951409681345,7.913284778594971
-7.950781972366453,7.918161869049072
-7.9430951409681345,7.949195384979248
-7.91721462968355,7.8891730308532715
-7.95090181210265,7.946056365966797
-7.935542022791058,7.9063262939453125
-7.970532618892763,7.943836688995361
-7.862652575359676,7.915444850921631
-7.950781972366453,7.928054332733154
-7.920818811243059,7.9069695472717285
-7.935542022791058,7.892454147338867
-7.943055911701025,7.928038120269775
-7.946921547407927,7.931732177734375
-7.913640203677234,7.906185150146484
-7.995678626217357,7.943505764007568
-7.928117974144348,7.907052040100098
-7.9430951409681345,7.931486129760742
-7.928117974144348,7.913887023925781
-7.931814161156377,7.917004108428955
-7.950781972366453,7.934083938598633
-7.913640203677234,7.919785499572754
-7.928117974144348,7.91359806060791
-7.935542022791058,7.919950008392334
-8.008819571765459,8.000999450683594
-7.920818811243059,7.914078235626221
-7.924453006674053,7.921741008758545
-7.920818811243059,7.8951520919799805
-7.9393021526221474,7.906632900238037
-7.935542022791058,7.937464714050293
-7.860119116630385,7.921799659729004
-7.946921547407927,7.904876708984375
-7.856986114171083,7.932489395141602
-7.9430951409681345,7.900190830230713
-7.928117974144348,7.918132781982422
-7.946921547407927,7.907145023345947
-7.903090094245322,7.943281650543213
-7.950781972366453,7.915790557861328
-7.9393021526221474,7.940094470977783
-7.924453006674053,7.931978225708008
-7.946921547407927,7.927358150482178
-7.915102650305338,7.880390644073486
-7.832673025823477,7.891823768615723
-7.922491400135772,7.93505334854126
-7.920818811243059,7.899092197418213
-7.928117974144348,7.901950359344482
-7.936131689340937,7.965035915374756
-7.935542022791058,7.9418864250183105
-7.896196359268842,7.874359607696533
-7.950781972366453,7.922779560089111
-7.950781972366453,7.9238505363464355
-7.924453006674053,7.920894145965576
-7.924453006674053,7.876566410064697
-7.9393021526221474,7.915553569793701
-7.91721462968355,7.937456130981445
-7.8728955601551585,7.900158405303955
-7.946921547407927,7.912563800811768
-7.928117974144348,7.924947738647461
-7.879425560900211,7.87505578994751
-7.928117974144348,7.916865825653076
-7.8434189201724,7.90134859085083
-7.946921547407927,7.9091925621032715
-7.924453006674053,7.919823169708252
-7.924453006674053,7.938109874725342
-7.920818811243059,7.912220001220703
-7.9430951409681345,7.925034523010254
-7.931814161156377,7.908027172088623
-7.8761493177145505,7.886574745178223
-7.995678626217357,7.924009799957275
-7.915575394493873,7.9016594886779785
-7.950781972366453,7.951802730560303
-7.903090094245322,7.933323383331299
-7.978810702253626,7.943267345428467
-7.950781972366453,7.9264702796936035
-7.950781972366453,7.909151077270508
-7.806866690314549,7.864409446716309
-7.9430951409681345,7.9135284423828125
-7.9393021526221474,7.931119918823242
-7.954677021213342,7.927388668060303
-7.950781972366453,7.939054012298584
-7.943055911701025,7.942837238311768
-7.950781972366453,7.936177730560303
-7.9393021526221474,7.9155473709106445
-7.954677021213342,7.906632423400879
-7.946921547407927,7.921083450317383
-7.954677021213342,7.952676296234131
-7.954677021213342,7.944580554962158
-7.924453006674053,7.8924455642700195
-7.954677021213342,7.947392463684082
-7.950781972366453,7.9361395835876465
-7.928117974144348,7.926880359649658
-7.954677021213342,7.8970417976379395
-7.9393021526221474,7.936839580535889
-7.924453006674053,7.894705295562744
-7.924453006674053,7.923620700836182
-7.935542022791058,7.928332805633545
-7.935542022791058,7.934067726135254
-7.889410352488291,7.888513088226318
-7.970532618892763,7.940134048461914
-7.928117974144348,7.902003288269043
-7.950781972366453,7.932980060577393
-7.9200659509493825,7.923852443695068
-7.89962956062971,7.91923189163208
-7.946921547407927,7.926077365875244
-7.946921547407927,7.90981912612915
-7.950781972366453,7.916073322296143
-7.954677021213342,7.9525628089904785
-7.970532618892763,7.952816963195801
-7.863280055279963,7.883914470672607
-7.946921547407927,7.915893077850342
-7.924453006674053,7.8967604637146
-7.917356228997307,7.913132667541504
-7.958607309235428,7.949086666107178
-7.879425560900211,7.897692680358887
-7.931814161156377,7.958557605743408
-7.910094953104535,7.897108554840088
-7.910094953104535,7.9035258293151855
-7.928117974144348,7.907594203948975
-7.970532618892763,7.942681312561035
-7.950781972366453,7.918885707855225
-7.924453006674053,7.932309627532959
-7.946921547407927,7.946450710296631
-7.946921547407927,7.925233364105225
-7.923581356476356,7.919404983520508
-7.9430951409681345,7.924673557281494
-7.9430951409681345,7.922557830810547
-7.946921547407927,7.935043811798096
-7.995678626217357,7.984805107116699
-7.889410352488291,7.920164585113525
-7.950781972366453,7.9348602294921875
-7.91721462968355,7.9422430992126465
-7.91591683954189,7.904768943786621
-7.931814161156377,7.917081356048584
-7.924453006674053,7.8925957679748535
-7.9430951409681345,7.946011066436768
-7.935542022791058,7.918216228485107
-7.950781972366453,7.9270124435424805
-7.924453006674053,7.918641567230225
-7.946921547407927,7.9289469718933105
-7.89962956062971,7.896377086639404
-7.958607309235428,7.948729991912842
-7.995678626217357,7.916531085968018
-7.966617665152964,7.915894031524658
-7.920818811243059,7.898433208465576
-7.935542022791058,7.917862892150879
-7.928117974144348,7.894611835479736
-7.89962956062971,7.933268070220947
-7.946921547407927,7.9408793449401855
-7.982923651140671,7.927455425262451
-7.935542022791058,7.925277233123779
-7.935542022791058,7.9062819480896
-7.950781972366453,7.932359218597412
-7.950781972366453,7.917965412139893
-7.954677021213342,7.946178913116455
-7.908651212535908,7.9025654792785645
-7.954677021213342,7.943674564361572
-7.948658283730227,7.930343151092529
-7.869665979871627,7.914042949676514
-7.920818811243059,7.9188456535339355
-7.942033487170233,7.948790073394775
-7.910094953104535,7.891612529754639
-7.920818811243059,7.920246124267578
-7.954677021213342,7.91577672958374
-7.954677021213342,7.9349446296691895
-7.870077682537097,7.887962818145752
-7.924453006674053,7.903421878814697
-7.954677021213342,7.89793062210083
-7.9430951409681345,7.89799690246582
-7.9393021526221474,7.9017157554626465
-7.91721462968355,7.958400726318359
-7.847639088350085,7.847553730010986
-7.950781972366453,7.9377055168151855
-7.883703936864327,7.880996227264404
-7.950781972366453,7.927760124206543
-7.8761493177145505,7.891523838043213
-7.924453006674053,7.917067527770996
-7.946921547407927,7.9137091636657715
-7.928117974144348,7.91964054107666
-7.954677021213342,7.926123142242432
-7.924453006674053,7.921172142028809
-7.954677021213342,7.95115327835083
-7.950781972366453,7.914429187774658
-7.9393021526221474,7.921549320220947
-7.954677021213342,7.930802345275879
-7.946921547407927,7.892635345458984
-7.856986114171083,7.923276424407959
-7.838628495628443,7.922302722930908
-7.9393021526221474,7.918592929840088
-7.9430951409681345,7.937036514282227
-7.924453006674053,7.917379856109619
-7.892790308673911,7.905749797821045
-7.906578398789698,7.895547866821289
-7.954677021213342,7.9433770179748535
-7.903898502189827,7.916182041168213
-7.946921547407927,7.925497531890869
-7.950781972366453,7.931641578674316
-7.91721462968355,7.9235968589782715
-7.9430951409681345,7.957650661468506
-7.906578398789698,7.88801908493042
-7.910094953104535,7.911234378814697
-7.948686988379175,7.9295334815979
-7.966576241738391,7.941945552825928
-7.950781972366453,7.945889949798584
-7.91721462968355,7.9045538902282715
-7.982923651140671,7.963974475860596
-7.928117974144348,7.927319049835205
-7.9430951409681345,7.912359714508057
-7.946921547407927,7.936001777648926
-7.924453006674053,7.919030666351318
-7.892790308673911,7.906499862670898
-7.8728955601551585,7.903170108795166
-7.931814161156377,7.898504257202148
-7.841040732801322,7.940053462982178
-7.924453006674053,7.897383689880371
-7.9430951409681345,7.939896106719971
-7.892790308673911,7.871931552886963
-7.906578398789698,7.893644332885742
-7.946921547407927,7.922729015350342
-7.946921547407927,7.872119426727295
-7.896196359268842,7.900462627410889
-7.9430951409681345,7.942655086517334
-7.913640203677234,7.909340858459473
-7.950781972366453,7.948530197143555
-7.939379961634402,7.940674304962158
-7.954677021213342,7.941527366638184
-7.946921547407927,7.911035537719727
-7.928117974144348,7.925241470336914
-7.920818811243059,7.905285358428955
-7.910094953104535,7.861390590667725
-7.9393021526221474,7.924056053161621
-7.9393021526221474,7.930701732635498
-7.950781972366453,7.913809299468994
-7.832673025823477,7.883439540863037
-7.950781972366453,7.942786693572998
-7.954677021213342,7.922825336456299
-7.9430951409681345,7.931020736694336
-7.928117974144348,7.903923034667969
-7.954677021213342,7.943986415863037
-7.950781972366453,7.9301018714904785
-7.860119116630385,7.9073405265808105
-7.935542022791058,7.9275431632995605
-7.964781356411861,7.964837074279785
-7.928117974144348,7.918238639831543
-7.924453006674053,7.952264308929443
-7.995678626217357,7.955446243286133
-7.9430951409681345,7.914261817932129
-7.950781972366453,7.934300899505615
-7.910094953104535,7.89998722076416
-7.910094953104535,7.888921737670898
-7.910094953104535,7.915378093719482
-7.886056354845152,7.898681163787842
-7.950781972366453,7.932188034057617
-7.924453006674053,7.921814441680908
-7.924453006674053,7.912210464477539
-7.924453006674053,7.923377513885498
-7.946921547407927,7.945320129394531
-7.883154495902866,7.919061183929443
-7.946921547407927,7.921133041381836
-7.9430951409681345,7.923235893249512
-7.950781972366453,7.945364475250244
-7.954677021213342,7.900737762451172
-7.838693701646425,7.872808933258057
-7.9430951409681345,7.950101852416992
-7.954677021213342,7.913846969604492
-7.913640203677234,7.9100141525268555
-7.954677021213342,7.912337779998779
-7.950781972366453,7.9389166831970215
-7.856986114171083,7.919296741485596
-7.920818811243059,7.908203601837158
-7.9393021526221474,7.934916973114014
-7.935542022791058,7.906484127044678
-7.946921547407927,7.91649055480957
-7.924453006674053,7.931423664093018
-7.924453006674053,7.943127155303955
-7.928117974144348,7.906263828277588
-7.89520802887005,7.881407260894775
-7.886056354845152,7.906146049499512
-7.9430951409681345,7.92188835144043
-7.950781972366453,7.911715984344482
-7.950781972366453,7.951140880584717
-7.995678626217357,7.982077121734619
-7.954677021213342,7.950141429901123
-7.8416326138557455,7.902443885803223
-7.958607309235428,7.9665961265563965
-7.928117974144348,7.8915910720825195
-7.946921547407927,7.934226036071777
-7.9430951409681345,7.927951335906982
-7.946921547407927,7.926786422729492
-7.931814161156377,7.908483505249023
-7.9393021526221474,7.883140563964844
-7.982923651140671,7.943263530731201
-7.903090094245322,7.925970554351807
-7.879425560900211,7.9072585105896
-7.935542022791058,7.9196624755859375
-7.91721462968355,7.9087233543396
-7.924453006674053,7.919239044189453
-7.995678626217357,7.923708915710449
-7.867052707791308,7.896784782409668
-7.924453006674053,7.912632465362549
-7.9737577757544535,7.956320285797119
-7.982184017551764,7.979020595550537
-7.924453006674053,7.916454792022705
-7.982966659490206,7.933218479156494
-7.9430951409681345,7.9420576095581055
-7.928117974144348,7.93020486831665
-7.950781972366453,7.931495666503906
-7.946921547407927,7.910368919372559
-7.903090094245322,7.912322998046875
-7.9048074470140355,7.892697334289551
-7.950781972366453,7.911725044250488
-7.860119116630385,7.924490451812744
-7.946921547407927,7.917539119720459
-7.924453006674053,7.920979976654053
-7.924453006674053,7.922335147857666
-7.931814161156377,7.935688018798828
-7.978895913358191,7.9674973487854
-7.85205769961263,7.922272205352783
-7.9393021526221474,7.921008110046387
-7.924453006674053,7.921859264373779
-7.910094953104535,7.922367572784424
-7.924453006674053,7.896061420440674
-7.924453006674053,7.9076385498046875
-7.935542022791058,7.882286071777344
-7.931814161156377,7.900118350982666
-7.9393021526221474,7.9477105140686035
-7.946921547407927,7.9374613761901855
-7.946921547407927,7.929305553436279
-7.928117974144348,7.918098449707031
-7.954677021213342,7.964357852935791
-7.889410352488291,7.930242538452148
-7.9393021526221474,7.914707183837891
-7.995678626217357,7.985036373138428
-7.954677021213342,7.948946475982666
-7.943055911701025,7.9233927726745605
-7.9393021526221474,7.936142444610596
-7.91721462968355,7.906283378601074
-7.9393021526221474,7.920243740081787
-7.9366741370281915,7.899052143096924
-7.946921547407927,7.9032883644104
-7.946921547407927,7.920191287994385
-7.920818811243059,7.892364978790283
-7.882141353172741,7.916870594024658
-7.954677021213342,7.937856197357178
-7.950781972366453,7.921047687530518
-7.892790308673911,7.897494316101074
-7.946921547407927,7.9157562255859375
-7.931814161156377,7.905846118927002
-7.937195024046664,7.956247329711914
-7.954677021213342,7.924155235290527
-7.946921547407927,7.931679725646973
-7.935542022791058,7.924208164215088
-7.924453006674053,7.927975177764893
-7.954677021213342,7.926656246185303
-7.91721462968355,7.908749103546143
-7.924453006674053,7.9005584716796875
-7.946921547407927,7.900938034057617
-7.935542022791058,7.895078659057617
-7.931814161156377,7.899725437164307
-7.954677021213342,7.9274139404296875
-7.935542022791058,7.934478282928467
-7.950781972366453,7.936265468597412
-7.950781972366453,7.925146102905273
-7.96981377267859,7.949613094329834
-7.946921547407927,7.929841995239258
-7.828285247977007,7.933197021484375
-7.9430951409681345,7.933438777923584
-7.920818811243059,7.903850078582764
-7.954677021213342,7.926984786987305
-7.9393021526221474,7.913844585418701
-7.935542022791058,7.930783748626709
-7.9393021526221474,7.93752908706665
-7.946921547407927,7.900575637817383
-7.928117974144348,7.931642532348633
-7.935542022791058,7.905519008636475
-7.9430951409681345,7.936708927154541
-7.916172445666446,7.8984503746032715
-7.975453335860696,7.951135158538818
-7.982923651140671,7.941383361816406
-7.946921547407927,7.938778877258301
-7.924453006674053,7.873450756072998
-7.910094953104535,7.911148548126221
-7.918702847281798,7.86995792388916
-7.910094953104535,7.903794765472412
-7.85078088734462,7.902627468109131
-7.9393021526221474,7.929013729095459
-7.954677021213342,7.934462547302246
-7.950781972366453,7.9185357093811035
-7.950781972366453,7.935722827911377
-7.928117974144348,7.905807971954346
-7.954677021213342,7.901815891265869
-7.950781972366453,7.927652835845947
-7.946921547407927,7.946831226348877
-7.982923651140671,7.919761657714844
-7.954677021213342,7.956457614898682
-7.950781972366453,7.9325642585754395
-7.935542022791058,7.914949893951416
-7.928117974144348,7.909045696258545
-7.950781972366453,7.947113513946533
-7.886522706972261,7.9080328941345215
-7.9393021526221474,7.904773235321045
-7.950781972366453,7.9440016746521
-7.9430951409681345,7.9270830154418945
-7.924453006674053,7.895180702209473
-7.954677021213342,7.950655460357666
-7.954677021213342,7.927621364593506
-7.88005421299276,7.915552139282227
-7.950781972366453,7.925375461578369
-7.924453006674053,7.922669410705566
-7.866459873882536,7.881590366363525
-7.950781972366453,7.9359965324401855
-7.924453006674053,7.89979362487793
-7.913640203677234,7.921582221984863
-7.9393021526221474,7.92470121383667
-7.950781972366453,7.936820983886719
-7.950781972366453,7.9296183586120605
-7.924453006674053,7.909842014312744
-7.946921547407927,7.931994438171387
-7.954677021213342,7.941807746887207
-7.946921547407927,7.922187805175781
-7.910094953104535,7.901346206665039
-7.935542022791058,7.923957347869873
-7.9393021526221474,7.945652961730957
-7.928117974144348,7.9146904945373535
-7.8761493177145505,7.900210380554199
-7.889410352488291,7.900343418121338
-7.924453006674053,7.921987056732178
-7.950781972366453,7.920083999633789
-7.91721462968355,7.904695510864258
-7.950781972366453,7.92117166519165
-7.911671457687047,7.913054943084717
-7.91721462968355,7.895712375640869
-7.847706165863548,7.917272090911865
-7.924453006674053,7.935284614562988
-7.950781972366453,7.930330276489258
-7.950838529294059,7.9071526527404785
-7.928117974144348,7.924724102020264
-7.903090094245322,7.902235507965088
-7.954677021213342,7.923413276672363
-7.931814161156377,7.922726631164551
-7.935542022791058,7.899298191070557
-7.924453006674053,7.913928508758545
-7.9430951409681345,7.944915294647217
-7.879425560900211,7.95847749710083
-7.924453006674053,7.91361665725708
-7.920818811243059,7.909794330596924
-7.9393021526221474,7.896646022796631
-7.950781972366453,7.915665626525879
-7.950781972366453,7.932375907897949
-7.889410352488291,7.941203594207764
-7.935542022791058,7.937932014465332
-7.946921547407927,7.9392876625061035
-7.950781972366453,7.95305061340332
-7.970532618892763,7.96659517288208
-7.9430951409681345,7.938919544219971
-7.936316742449531,7.923583507537842
-7.924453006674053,7.9170660972595215
-7.954677021213342,7.92223596572876
-7.896196359268842,7.899860858917236
-7.910094953104535,7.921239376068115
-7.950781972366453,7.929596900939941
-7.924453006674053,7.908500671386719
-7.924453006674053,7.924105167388916
-7.9393021526221474,7.892292499542236
-7.9430951409681345,7.9439377784729
-7.910094953104535,7.9116973876953125
-7.882728704344236,7.890732765197754
-7.928117974144348,7.915761470794678
-7.950781972366453,7.921203136444092
-7.96257349994767,7.950469493865967
-7.89962956062971,7.9337687492370605
-7.924453006674053,7.906655311584473
-7.931814161156377,7.918112277984619
-7.954677021213342,7.946107864379883
-7.978895913358191,7.936110019683838
-7.853872762493711,7.9048590660095215
-7.9430951409681345,7.917830467224121
-7.950781972366453,7.924810886383057
-7.906578398789698,7.902890682220459
-7.920818811243059,7.910360336303711
-7.995678626217357,7.93273401260376
-7.924453006674053,7.935628414154053
-7.946921547407927,7.941708564758301
-7.9393021526221474,7.936126232147217
-7.9393021526221474,7.929239273071289
-7.9299713005399575,7.965912342071533
-7.920818811243059,7.933475017547607
-7.8761493177145505,7.9131035804748535
-7.9393021526221474,7.938514232635498
-7.8416326138557455,7.876675128936768
-7.896196359268842,7.896496772766113
-7.950781972366453,7.950022220611572
-7.889410352488291,7.923142433166504
-7.946921547407927,7.9493279457092285
-7.954677021213342,7.930073261260986
-7.946921547407927,7.956132411956787
-7.950781972366453,7.922494411468506
-7.922491400135772,7.904464244842529
-7.920818811243059,7.911915302276611
-7.950781972366453,7.93518590927124
-7.954677021213342,7.936129093170166
-7.987162773987728,7.940295219421387
-7.874955785876363,7.9420247077941895
-7.91721462968355,7.913645267486572
-7.950781972366453,7.918369293212891
-7.935542022791058,7.895892143249512
-7.946921547407927,7.935197830200195
-7.93067295654639,7.956288814544678
-7.950781972366453,7.933270454406738
-7.9393021526221474,7.92964506149292
-7.920818811243059,7.9082255363464355
-7.863280055279963,7.9343390464782715
-7.9430951409681345,7.9301981925964355
-7.9393021526221474,7.946981906890869
-7.946921547407927,7.942530632019043
-7.924453006674053,7.934014320373535
-7.950781972366453,7.913411617279053
-7.931814161156377,7.929357528686523
-7.889410352488291,7.934510231018066
-7.950781972366453,7.925288200378418
-7.946921547407927,7.937912464141846
-7.928117974144348,7.912735939025879
-7.920818811243059,7.90513277053833
-7.946921547407927,7.929864406585693
-7.903090094245322,7.906083583831787
-7.928117974144348,7.907464027404785
-7.970532618892763,7.974741458892822
-7.906578398789698,7.9371724128723145
-7.870077682537097,7.9090094566345215
-7.931814161156377,7.900785446166992
-7.9430951409681345,7.946354389190674
-7.85078088734462,7.918264389038086
-7.869665979871627,7.909543037414551
-7.939379961634402,7.948304653167725
-7.954677021213342,7.927087306976318
-7.812474702908248,7.893823146820068
-7.9430951409681345,7.934490203857422
-7.931814161156377,7.907261371612549
-7.9430951409681345,7.9478864669799805
-7.89962956062971,7.92721700668335
-7.950781972366453,7.922427654266357
-7.954677021213342,7.92169713973999
-7.950781972366453,7.934106349945068
-7.920818811243059,7.903941631317139
-8.026824561605242,7.97025203704834
-7.966617665152964,7.8984761238098145
-7.954677021213342,7.944406032562256
-7.954677021213342,7.914974212646484
-7.9200135653594685,7.9256672859191895
-7.85078088734462,7.909755229949951
-7.950781972366453,7.936534404754639
-7.963788392246652,7.88893461227417
-7.924453006674053,7.896792888641357
-7.892790308673911,7.877052307128906
-7.928117974144348,7.932248592376709
-7.982923651140671,7.962673664093018
-7.9393021526221474,7.917400360107422
-7.9430951409681345,7.941491603851318
-7.924453006674053,7.921329498291016
-7.935542022791058,7.910459995269775
-7.995678626217357,7.926915168762207
-7.935542022791058,7.9599714279174805
-7.910094953104535,7.896449565887451
-7.931814161156377,7.91948127746582
-7.924453006674053,7.924957752227783
-7.950781972366453,7.918816089630127
-7.954677021213342,7.925460338592529
-7.954677021213342,7.96320915222168
-7.946921547407927,7.913599491119385
-7.950781972366453,7.929190158843994
-7.931814161156377,7.927637577056885
-7.995678626217357,7.948297500610352
-7.954677021213342,7.930278301239014
-7.9430951409681345,7.9240593910217285
-7.946921547407927,7.900548458099365
-7.928117974144348,7.895072937011719
-7.954677021213342,7.9164252281188965
-7.924453006674053,7.928874492645264
-7.920818811243059,7.911329746246338
-7.9393021526221474,7.935038089752197
-7.9393021526221474,7.923089504241943
-7.950781972366453,7.921844005584717
-7.948658283730227,7.926937580108643
-7.931814161156377,7.923685550689697
-7.935542022791058,7.919477939605713
-7.924453006674053,7.905656337738037
-7.924453006674053,7.934050559997559
-7.892790308673911,7.946544647216797
-7.954677021213342,7.951371669769287
-7.950781972366453,7.926222324371338
-7.9393021526221474,7.917252540588379
-7.9430951409681345,7.92861795425415
-7.946921547407927,7.920106410980225
-7.9393021526221474,7.898965835571289
-7.946921547407927,7.919328212738037
-7.920818811243059,7.9084696769714355
-7.928117974144348,7.901364803314209
-7.995678626217357,7.92156457901001
-7.935542022791058,7.9253249168396
-7.995678626217357,7.936106204986572
-7.935542022791058,7.89280366897583
-7.954677021213342,7.940413951873779
-7.9393021526221474,7.920201301574707
-7.920818811243059,7.885064601898193
-7.928117974144348,7.903944492340088
-7.89962956062971,7.952877044677734
-7.924453006674053,7.893649578094482
-7.920818811243059,7.909231662750244
-7.931814161156377,7.9272141456604
-7.928117974144348,7.920530319213867
-7.924453006674053,7.91078519821167
-7.946921547407927,7.923047065734863
-7.950781972366453,7.93967866897583
-7.924453006674053,7.898065090179443
-7.9393021526221474,7.924319267272949
-7.906578398789698,7.931734561920166
-7.950781972366453,7.946935176849365
-7.954677021213342,7.952898979187012
-7.9430951409681345,7.937376499176025
-7.950781972366453,7.918067932128906
-7.924453006674053,7.885837554931641
-7.950781972366453,7.943971633911133
-7.928117974144348,7.9282755851745605
-7.946921547407927,7.915017127990723
-7.892790308673911,7.922914981842041
-7.946921547407927,7.926807880401611
-7.89962956062971,7.907020568847656
-7.946921547407927,7.914371490478516
-7.974694136660875,7.950021266937256
-7.9393021526221474,7.93454122543335
-7.931814161156377,7.911748886108398
-7.950781972366453,7.93456506729126
-7.982966659490206,7.945099830627441
-7.924453006674053,7.89644193649292
-7.882728704344236,7.884212970733643
-7.910094953104535,7.892577648162842
-7.923581356476356,7.91278076171875
-7.931814161156377,7.918148517608643
-7.9430951409681345,7.908250331878662
-7.954677021213342,7.914045810699463
-7.8761493177145505,7.913641452789307
-7.903090094245322,7.903590679168701
-7.978895913358191,7.8908562660217285
-7.938102963264953,7.901062965393066
-7.920818811243059,7.917532444000244
-7.8761493177145505,7.9189581871032715
-7.954677021213342,7.903541564941406
-7.950781972366453,7.955440044403076
-7.924453006674053,7.907726287841797
-7.910094953104535,7.923349857330322
-7.9430951409681345,7.931106090545654
-7.91721462968355,7.935680866241455
-7.946921547407927,7.9152750968933105
-7.970532618892763,7.94564962387085
-7.950781972366453,7.9148993492126465
-7.954677021213342,7.934137344360352
-7.954677021213342,7.9505696296691895
-7.954677021213342,7.957583427429199
-7.954677021213342,7.945041656494141
-7.946921547407927,7.91593599319458
-7.924453006674053,7.912280559539795
-7.950781972366453,7.9237823486328125
-7.932396638893121,7.924549102783203
-7.946921547407927,7.949509143829346
-7.950781972366453,7.909765720367432
-7.966576087242179,7.925909042358398
-7.9393021526221474,7.911896705627441
-7.959158165932685,7.94052791595459
-7.978895913358191,7.972230434417725
-7.946921547407927,7.931064605712891
-7.924453006674053,7.894672870635986
-7.950781972366453,7.907695293426514
-7.928117974144348,7.913917064666748
-7.929461956609781,7.900237083435059
-7.950781972366453,7.924276351928711
-7.950781972366453,7.9285569190979
-7.920818811243059,7.894080638885498
-7.823919469453418,7.896133899688721
-7.886056354845152,7.885778903961182
-7.995678626217357,7.970983028411865
-7.954677021213342,7.94043493270874
-7.924453006674053,7.913665294647217
-7.869665979871627,7.929484844207764
-7.8761493177145505,7.890905857086182
-7.946921547407927,7.922695636749268
-7.950781972366453,7.901137828826904
-7.954677021213342,7.94031286239624
-7.928117974144348,7.918278217315674
-7.882728704344236,7.87630558013916
-7.886056354845152,7.894588947296143
-7.954677021213342,7.929014682769775
-7.924453006674053,7.918980598449707
-7.913640203677234,7.9357829093933105
-7.935542022791058,7.932981014251709
-7.950781972366453,7.9465742111206055
-7.924453006674053,7.920724391937256
-7.954677021213342,7.931957721710205
-7.935542022791058,7.9187445640563965
-7.9393021526221474,7.903544902801514
-7.903090094245322,7.92729377746582
-7.950781972366453,7.921708583831787
-7.886056354845152,7.9482951164245605
-7.924453006674053,7.939748287200928
-7.946921547407927,7.934262275695801
-7.931814161156377,7.9390177726745605
-7.954677021213342,7.9463419914245605
-7.913640203677234,7.912104606628418
-7.931814161156377,7.919743537902832
-7.946921547407927,7.919674873352051
-7.931814161156377,7.915816307067871
-7.9393021526221474,7.927412509918213
-7.928117974144348,7.904111862182617
-7.950781972366453,7.919826507568359
-7.924453006674053,7.898626804351807
-7.924453006674053,7.936874866485596
-7.928117974144348,7.915126323699951
-7.9393021526221474,7.913665294647217
-7.946921547407927,7.911086559295654
-7.946921547407927,7.91209077835083
-7.928117974144348,7.922443866729736
-7.946921547407927,7.920793533325195
-7.920818811243059,7.878702640533447
-7.950781972366453,7.927260398864746
-7.924453006674053,7.909721851348877
-7.950781972366453,7.940861225128174
-7.950781972366453,7.911959648132324
-7.954677021213342,7.918294429779053
-7.920818811243059,7.926948070526123
-7.924453006674053,7.938619613647461
-7.950781972366453,7.910060882568359
-7.936946048812535,7.907175540924072
-7.869665979871627,7.9048542976379395
-7.931814161156377,7.904428005218506
-7.973579366316557,7.9432759284973145
-7.924453006674053,7.902468204498291
-7.946921547407927,7.931453704833984
-7.950781972366453,7.922046661376953
-7.9430951409681345,7.956130504608154
-7.954677021213342,7.951670169830322
-7.846035765262794,7.912238597869873
-7.9339905637299495,7.919044017791748
-7.924453006674053,7.9360761642456055
-7.924453006674053,7.9093708992004395
-7.910094953104535,7.941011905670166
-7.903090094245322,7.923967361450195
-7.920818811243059,7.930355548858643
-7.924453006674053,7.924230098724365
-7.920818811243059,7.90118932723999
-7.829768510087842,7.906143665313721
-7.978895913358191,7.954586982727051
-7.924453006674053,7.9601263999938965
-7.931814161156377,7.913942337036133
-7.950781972366453,7.920065402984619
-7.954677021213342,7.918332576751709
-7.920818811243059,7.918071269989014
-7.954677021213342,7.939887523651123
-7.946921547407927,7.912357807159424
-7.949597987432084,7.945833683013916
-7.946921547407927,7.921212673187256
-7.954677021213342,7.90939474105835
-7.924453006674053,7.9162821769714355
-7.954677021213342,7.9434709548950195
-7.950781972366453,7.927114486694336
-7.946921547407927,7.927465438842773
-7.935542022791058,7.913595199584961
-7.950781972366453,7.920221328735352
-7.9393021526221474,7.907569408416748
-7.950781972366453,7.89707612991333
-7.9393021526221474,7.893687725067139
-7.935542022791058,7.943360328674316
-7.946921547407927,7.9411187171936035
-7.9393021526221474,7.905307769775391
-7.8761493177145505,7.916526794433594
-7.924453006674053,7.931577682495117
-7.935542022791058,7.914430141448975
-7.91721462968355,7.900862693786621
-7.946921547407927,7.908753871917725
-7.924453006674053,7.905078411102295
-7.950781972366453,7.938481330871582
-7.9430951409681345,7.946320533752441
-7.879527744657629,7.9233174324035645
-7.91721462968355,7.9028449058532715
-7.950781972366453,7.965564250946045
-7.941678683201079,7.922511577606201
-7.882728704344236,7.909647464752197
-7.946921547407927,7.936534404754639
-7.892790308673911,7.912724018096924
-7.9393021526221474,7.912126541137695
-7.935542022791058,7.904016494750977
-7.906578398789698,7.907052516937256
-7.982923651140671,7.940524578094482
-7.954677021213342,7.899551868438721
-7.931814161156377,7.921297073364258
-7.882728704344236,7.895030498504639
-7.950781972366453,7.94661283493042
-7.928117974144348,7.907977104187012
-7.9430951409681345,7.9278340339660645
-7.920818811243059,7.9101433753967285
-7.9430951409681345,7.913087368011475
-7.928117974144348,7.911971569061279
-7.987162773987728,7.944790363311768
-7.920818811243059,7.90261697769165
-7.931814161156377,7.909389972686768
-7.879425560900211,7.892175674438477
-7.832673025823477,7.903401851654053
-7.954677021213342,7.939167022705078
-7.928117974144348,7.919124126434326
-7.924453006674053,7.9478983879089355
-7.893544569594523,7.921571254730225
-7.896196359268842,7.92039155960083
-7.931814161156377,7.911363124847412
-7.838628495628443,7.914961814880371
-7.85078088734462,7.894314289093018
-7.9393021526221474,7.957306385040283
-7.928117974144348,7.912766933441162
-7.8761493177145505,7.905320644378662
-7.931814161156377,7.925451755523682
-7.987162773987728,7.949751377105713
-7.946921547407927,7.924134731292725
-7.950781972366453,7.92040491104126
-7.928117974144348,7.894143581390381
-7.9393021526221474,7.918612003326416
-7.892790308673911,7.905978202819824
-7.950781972366453,7.945476055145264
-7.954677021213342,7.889700889587402
-7.954677021213342,7.9383087158203125
-7.954677021213342,7.942988872528076
-7.935542022791058,7.915699481964111
-7.9430951409681345,7.924836158752441
-7.946921547407927,7.906890869140625
-7.950781972366453,7.945101737976074
-7.946921547407927,7.920167446136475
-7.913640203677234,7.894315242767334
-7.928117974144348,7.910946846008301
-7.882728704344236,7.915478229522705
-7.913640203677234,7.910321235656738
-7.928117974144348,7.902047634124756
-7.9430951409681345,7.913882732391357
-7.92154353482018,7.925293922424316
-7.995678626217357,7.96442174911499
-7.924453006674053,7.947010040283203
-7.954677021213342,7.951528072357178
-7.924453006674053,7.919741630554199
-7.860119116630385,7.890453815460205
-7.935542022791058,7.922132968902588
-7.946921547407927,7.9293341636657715
-7.978810702253626,7.951997756958008
-7.946921547407927,7.93366003036499
-7.882728704344236,7.913482189178467
-7.949816020592385,7.932168483734131
-7.896196359268842,7.910499572753906
-7.924453006674053,7.899951934814453
-7.9142650431285055,7.918653964996338
-7.950781972366453,7.925894737243652
-7.931814161156377,7.922314167022705
-7.9335681432273475,7.915717124938965
-7.9737577757544535,7.939440727233887
-7.935542022791058,7.913766384124756
-7.950781972366453,7.924611568450928
-7.950781972366453,7.907717227935791
-7.9430951409681345,7.940123558044434
-7.982923651140671,7.937373638153076
-7.913640203677234,7.924551963806152
-7.931814161156377,7.90184211730957
-7.863280055279963,7.869784355163574
-7.9393021526221474,7.928097248077393
-7.950781972366453,7.962314128875732
-7.924453006674053,7.9320549964904785
-7.928117974144348,7.917314052581787
-7.954677021213342,7.965251445770264
-7.920818811243059,7.907928466796875
-7.869665979871627,7.893454551696777
-7.924453006674053,7.928253650665283
-7.9393021526221474,7.921721935272217
-7.935542022791058,7.922858715057373
-7.921079769888915,7.931554317474365
-7.931814161156377,7.901289939880371
-7.889355338226999,7.949429988861084
-7.924453006674053,7.9160308837890625
-7.990339285400088,7.973053455352783
-7.920818811243059,7.903871059417725
-7.928117974144348,7.906713008880615
-8.004664347090904,7.958858966827393
-7.954677021213342,7.930095195770264
-7.946921547407927,7.9174089431762695
-7.946921547407927,7.92496919631958
-7.886056354845152,7.923488140106201
-7.89962956062971,7.899372577667236
-7.931814161156377,7.9307684898376465
-7.892790308673911,7.902245998382568
-7.931814161156377,7.950241565704346
-7.924453006674053,7.911587238311768
-7.89962956062971,7.902463912963867
-7.840466181564601,7.893301486968994
-7.924453006674053,7.8886799812316895
-7.987162773987728,7.94637393951416
-7.954677021213342,7.917788028717041
-7.9393021526221474,7.919663906097412
-7.924453006674053,7.912075519561768
-7.931814161156377,7.89839506149292
-7.966617665152964,7.923869609832764
-7.954677021213342,7.957292079925537
-7.9317759187918355,7.927269458770752
-7.950781972366453,7.924778938293457
-7.950781972366453,7.933260917663574
-7.920818811243059,7.904289722442627
-7.954677021213342,7.9558024406433105
-7.946921547407927,7.911019802093506
-7.931814161156377,7.90978479385376
-7.950781972366453,7.923447132110596
-7.9393021526221474,7.92340612411499
-7.950781972366453,7.9152936935424805
-7.886056354845152,7.905998229980469
-7.950781972366453,7.920846939086914
-7.889410352488291,7.908401012420654
-7.928117974144348,7.941929817199707
-7.928117974144348,7.937185764312744
-7.886056354845152,7.892919063568115
-7.838628495628443,7.882204055786133
-7.954677021213342,7.920454502105713
-7.954677021213342,7.966707706451416
-7.924453006674053,7.906159400939941
-7.928155902956855,7.922835350036621
-7.954677021213342,7.923452854156494
-7.928117974144348,7.909769535064697
-7.946921547407927,7.931175708770752
-7.924453006674053,7.901259422302246
-7.826774591089415,7.900542736053467
-7.9393021526221474,7.895376682281494
-7.9393021526221474,7.894923686981201
-7.924453006674053,7.932270526885986
-7.946921547407927,7.921806812286377
-7.950781972366453,7.92110538482666
-7.920818811243059,7.909910202026367
-7.9430951409681345,7.944091320037842
-8.026824561605242,7.968898773193359
-7.882728704344236,7.882582664489746
-7.924453006674053,7.934864521026611
-7.935542022791058,7.915312767028809
-7.89962956062971,7.936641693115234
-7.889410352488291,7.904438495635986
-7.924453006674053,7.9144606590271
-7.924453006674053,7.916107654571533
-7.898841589585073,7.910837650299072
-7.954677021213342,7.925275802612305
-7.924453006674053,7.9205002784729
-7.9430951409681345,7.9289326667785645
-7.954677021213342,7.933495998382568
-7.931814161156377,7.906879425048828
-7.950781972366453,7.919680118560791
-7.9393021526221474,7.925828456878662
-7.9393021526221474,7.927678108215332
-7.995678626217357,7.949783802032471
-7.9393021526221474,7.939914703369141
-7.924453006674053,7.906452655792236
-7.920818811243059,7.899278163909912
-7.931213792939948,7.958715438842773
-7.954677021213342,7.94877815246582
-7.8493737915542425,7.914504051208496
-7.903090094245322,7.884487628936768
-7.913640203677234,7.91575288772583
-7.928117974144348,7.916335105895996
-7.920818811243059,7.933281898498535
-7.924453006674053,7.908620834350586
-7.8761493177145505,7.919601917266846
-7.877000634081475,7.922243595123291
-7.903090094245322,7.909367084503174
-7.946921547407927,7.941364765167236
-7.838628495628443,7.885157585144043
-7.931814161156377,7.905096530914307
-7.946921547407927,7.917343616485596
-7.946921547407927,7.926363468170166
-7.931814161156377,7.903291702270508
-7.818151283467686,7.902039051055908
-7.954677021213342,7.951454162597656
-7.9430951409681345,7.938636779785156
-7.9393021526221474,7.901388645172119
-7.9393021526221474,7.958929061889648
-7.907371764033808,7.945574760437012
-7.946921547407927,7.919243812561035
-7.935542022791058,7.924108505249023
-7.950781972366453,7.936305522918701
-7.954677021213342,7.92750883102417
-7.987162773987728,7.969216346740723
-7.931814161156377,7.929168224334717
-7.920818811243059,7.90684175491333
-7.950298727941771,7.9321112632751465
-7.930395825138251,7.921718597412109
-7.950781972366453,7.916893005371094
-7.935542022791058,7.918318271636963
-7.946921547407927,7.930622577667236
-7.982184017551764,7.9686598777771
-7.924453006674053,7.894546031951904
-7.935542022791058,7.919668674468994
-7.970616219270671,7.948855400085449
-7.863280055279963,7.915638446807861
-7.856986114171083,7.894722938537598
-7.946082651207223,7.924194812774658
-7.903090094245322,7.939008712768555
-7.946921547407927,7.917749881744385
-7.866459873882536,7.892834186553955
-7.9393021526221474,7.9290547370910645
-7.924453006674053,7.909019947052002
-7.946921547407927,7.918793678283691
-7.950781972366453,7.935131072998047
-7.910094953104535,7.93066930770874
-7.948658283730227,7.929591655731201
-7.950781972366453,7.949985027313232
-7.9393021526221474,7.922210216522217
-7.946921547407927,7.936367511749268
-7.970532618892763,7.9214982986450195
-7.9430951409681345,7.93013858795166
-7.882728704344236,7.910112380981445
-7.931814161156377,7.927990436553955
-7.8876003998252076,7.9119873046875
-7.954677021213342,7.927523136138916
-7.9393021526221474,7.913559436798096
-7.924453006674053,7.941739559173584
-7.950781972366453,7.913247585296631
-7.9430951409681345,7.9137420654296875
-7.950781972366453,7.9473090171813965
-7.9393021526221474,7.948945045471191
-7.920818811243059,7.94569730758667
-7.879425560900211,7.902164936065674
-7.9393021526221474,7.95641565322876
-7.89962956062971,7.930490016937256
-7.9430951409681345,7.9280314445495605
-7.950781972366453,7.94926118850708
-7.924453006674053,7.910457611083984
-7.954677021213342,7.93835973739624
-7.950781972366453,7.935309410095215
-7.954677021213342,7.947131633758545
-7.954677021213342,7.9227519035339355
-7.9393021526221474,7.926680088043213
-7.886056354845152,7.903163909912109
-7.9393021526221474,7.913035869598389
-7.966576241738391,7.989343643188477
-7.946219331461382,7.93112325668335
-7.970532618892763,7.964139461517334
-7.978810702253626,7.947070598602295
-7.920818811243059,7.904240131378174
-7.950781972366453,7.921433448791504
-7.9737577757544535,7.960537433624268
-7.9393021526221474,7.926877975463867
-7.920818811243059,7.879327297210693
-7.954677021213342,7.924139022827148
-7.946921547407927,7.931905269622803
-7.995678626217357,7.979787826538086
-7.856986114171083,7.889596462249756
-7.853872762493711,7.887683868408203
-7.954677021213342,7.9408440589904785
-7.970532618892763,7.909124374389648
-7.920818811243059,7.868012428283691
-7.924453006674053,7.9136810302734375
-7.910094953104535,7.918921947479248
-7.946921547407927,7.910490036010742
-7.9430951409681345,7.939572811126709
-7.9393021526221474,7.946744441986084
-7.946921547407927,7.916435718536377
-7.946921547407927,7.8969902992248535
-7.920818811243059,7.925027370452881
-7.982923651140671,7.963298320770264
-7.950781972366453,7.961910724639893
-7.892790308673911,7.93182897567749
-7.950781972366453,7.918277263641357
-7.913640203677234,7.968143939971924
-7.950781972366453,7.925280570983887
-7.995678626217357,7.958170413970947
-7.910094953104535,7.9103922843933105
-7.931814161156377,7.916065692901611
-7.896196359268842,7.8883442878723145
-7.844664854175832,7.896204471588135
-7.954677021213342,7.941605091094971
-7.928546044181974,7.963443756103516
-7.920818811243059,7.9273762702941895
-7.950781972366453,7.922693729400635
-7.950781972366453,7.905498027801514
-7.924453006674053,7.892094135284424
-7.951597197767561,7.954331874847412
-7.946921547407927,7.934607028961182
-7.924453006674053,7.934963703155518
-7.924453006674053,7.8925862312316895
-7.950781972366453,7.937121868133545
-7.924453006674053,7.954303741455078
-7.935542022791058,7.910871982574463
-7.946921547407927,7.911951541900635
-7.924453006674053,7.919957160949707
-7.9393021526221474,7.92236852645874
-7.920818811243059,7.9261603355407715
-7.928117974144348,7.89810848236084
-7.9393021526221474,7.896406650543213
-7.946921547407927,7.945795059204102
-7.935542022791058,7.905932903289795
-7.829768510087842,7.898251056671143
-7.954677021213342,7.949107646942139
-7.950781972366453,7.924758434295654
-7.931814161156377,7.922658443450928
-7.851107336107353,7.9195556640625
-7.950781972366453,7.924999713897705
-7.9393021526221474,7.929222583770752
-7.950781972366453,7.93790864944458
-7.954677021213342,7.9467363357543945
-7.924453006674053,7.945580005645752
-7.950781972366453,7.941534996032715
-7.913640203677234,7.905386447906494
-7.950781972366453,7.932507038116455
-7.970532618892763,7.950467586517334
-7.938582393143787,7.9143900871276855
-7.946921547407927,7.958773612976074
-7.931814161156377,7.90086030960083
-7.928117974144348,7.9404754638671875
-7.920818811243059,7.883363246917725
-7.9393021526221474,7.933043956756592
-7.954677021213342,7.925430774688721
-7.978895913358191,7.9410719871521
-7.928117974144348,7.917050361633301
-7.835637836224461,7.888479709625244
-7.954677021213342,7.960596084594727
-7.94094624659741,7.907196521759033
-7.91721462968355,7.903342247009277
-7.946921547407927,7.9354658126831055
-7.906578398789698,7.8972344398498535
-7.941194503765821,7.915280818939209
-7.882728704344236,7.918703556060791
-7.954677021213342,7.940033912658691
-7.931814161156377,7.9208173751831055
-7.924453006674053,7.946976661682129
-7.935542022791058,7.901829719543457
-7.928117974144348,7.90273904800415
-7.8908616413487795,7.918930530548096
-7.847706165863548,7.928731918334961
-7.948658283730227,7.90271520614624
-7.9393021526221474,7.937902927398682
-7.931814161156377,7.906859874725342
-7.950781972366453,7.924228191375732
-7.924453006674053,7.903735637664795
-7.924453006674053,7.923148155212402
-7.946921547407927,7.949621200561523
-7.954677021213342,7.9348835945129395
-7.950781972366453,7.9283766746521
-7.856986114171083,7.912102222442627
-7.946921547407927,7.938043117523193
-7.954677021213342,7.912797451019287
-7.938881715602225,7.958755016326904
-7.946921547407927,7.9482526779174805
-7.910094953104535,7.919332504272461
-7.950781972366453,7.919042587280273
-7.966576241738391,7.957931041717529
-7.892790308673911,7.933740139007568
-7.935542022791058,7.9465107917785645
-7.931814161156377,7.886687755584717
-7.924453006674053,7.8896050453186035
-7.935542022791058,7.905531406402588
-7.931814161156377,7.914200782775879
-8.013136044317282,7.969089984893799
-7.886056354845152,7.905270099639893
-7.920818811243059,7.933076858520508
-7.924453006674053,7.923093318939209
-7.9393021526221474,7.9377923011779785
-7.954677021213342,7.921698093414307
-7.924453006674053,7.927577018737793
-7.954677021213342,7.918805122375488
-7.946921547407927,7.934891223907471
-7.987162773987728,7.978912353515625
-7.9393021526221474,7.941285133361816
-7.920818811243059,7.922966957092285
-7.920818811243059,7.933480262756348
-7.896196359268842,7.8959126472473145
-7.889410352488291,7.910975933074951
-7.9393021526221474,7.929049491882324
-7.856986114171083,7.908875942230225
-7.950781972366453,7.956723213195801
-7.9430951409681345,7.934797763824463
-7.954677021213342,7.967280864715576
-7.946921547407927,7.928671360015869
-7.91721462968355,7.941375255584717
-7.924453006674053,7.896142482757568
-7.85078088734462,7.9350666999816895
-7.950781972366453,7.911339282989502
-7.931814161156377,7.918152809143066
-7.9393021526221474,7.924415111541748
-7.954677021213342,7.9567437171936035
-7.935542022791058,7.935614109039307
-7.928155902956855,7.955470085144043
-7.872861820710693,7.915820598602295
-7.941194514917139,7.9203782081604
-7.896196359268842,7.90330171585083
-7.950781972366453,7.933566093444824
-7.9393021526221474,7.9192986488342285
-7.931814161156377,7.925477981567383
-7.924453006674053,7.907658100128174
-7.9430951409681345,7.949023723602295
-7.954677021213342,7.938554763793945
-7.9430951409681345,7.916626453399658
-7.847706165863548,7.945801258087158
-7.966617665152964,7.913316249847412
-7.9393021526221474,7.9421610832214355
-7.924453006674053,7.916158676147461
-7.935542022791058,7.923240661621094
-7.9737577757544535,7.954189777374268
-7.9393021526221474,7.906214237213135
-7.924453006674053,7.935529708862305
-7.954677021213342,7.942851543426514
-7.9393021526221474,7.924464225769043
-7.954677021213342,7.9474196434021
-7.950781972366453,7.9133195877075195
-7.982184017551764,7.958770275115967
-7.928117974144348,7.903802394866943
-7.9393021526221474,7.955412864685059
-7.924453006674053,7.909773349761963
-7.931814161156377,7.909910678863525
-7.906578398789698,7.9051594734191895
-7.954677021213342,7.946274757385254
-7.924453006674053,7.8934102058410645
-7.9393021526221474,7.933184623718262
-7.924453006674053,7.923486232757568
-7.910094953104535,7.914374828338623
-7.946921547407927,7.9087653160095215
-7.85078088734462,7.912550926208496
-7.832673025823477,7.928161144256592
-7.920818811243059,7.912647247314453
-7.903090094245322,7.894956111907959
-7.951451351436392,7.91618013381958
-7.9430951409681345,7.916297435760498
-7.913999520285983,7.917354106903076
-7.866459873882536,7.897494316101074
-7.9430951409681345,7.922153949737549
-7.954677021213342,7.943237781524658
-7.950781972366453,7.914474964141846
-7.928117974144348,7.9117302894592285
-7.94551824914185,7.88438081741333
-7.935542022791058,7.915792465209961
-7.950781972366453,7.937357425689697
-7.924453006674053,7.92101526260376
-7.906578398789698,7.905558109283447
-7.946921547407927,7.922323703765869
-7.928117974144348,7.903445720672607
-7.89962956062971,7.918176651000977
-7.950781972366453,7.9062700271606445
-7.863280055279963,7.922325134277344
-7.946921547407927,7.913761138916016
-7.931814161156377,7.9120025634765625
-7.870744247281552,7.898738861083984
-7.950781972366453,7.93396520614624
-7.928117974144348,7.922032356262207
-7.894889476280892,7.867208957672119
-7.950781972366453,7.924241542816162
-7.9430951409681345,7.904412269592285
-7.9737577757544535,7.946685791015625
-7.928117974144348,7.899633407592773
-7.9430951409681345,7.9316020011901855
-7.954677021213342,7.94478178024292
-7.946921547407927,7.9137654304504395
-7.89962956062971,7.918151378631592
-8.026824561605242,7.981399059295654
-7.910094953104535,7.903395175933838
-7.920818811243059,7.894440650939941
-7.946921547407927,7.91465425491333
-7.9393021526221474,7.927405834197998
-7.935542022791058,7.91495418548584
-7.920818811243059,7.923557281494141
-7.91721462968355,7.947941780090332
-7.954677021213342,7.90815544128418
-7.954677021213342,7.926375865936279
-7.9393021526221474,7.923306941986084
-7.950781972366453,7.949317455291748
-7.970532618892763,7.972565174102783
-7.913640203677234,7.95598840713501
-7.928117974144348,7.905076026916504
-7.9430951409681345,7.9269795417785645
-7.9393021526221474,7.928208827972412
-7.886056354845152,7.879509925842285
-7.931814161156377,7.9107584953308105
-7.950781972366453,7.915121555328369
-7.9430951409681345,7.940248966217041
-7.946921547407927,7.929792881011963
-7.9913998274291025,7.967194080352783
-7.892790308673911,7.924281597137451
-7.946921547407927,7.9305033683776855
-7.954677021213342,7.929385185241699
-7.924453006674053,7.9436187744140625
-7.913640203677234,7.916685104370117
-7.920818811243059,7.925969123840332
-7.950781972366453,7.935730934143066
-7.892790308673911,7.913297176361084
-7.9393021526221474,7.920989036560059
-7.924453006674053,7.920608997344971
-7.990339285400088,7.973563194274902
-7.9393021526221474,7.930949687957764
-7.954677021213342,7.931413173675537
-7.892790308673911,7.897752285003662
-7.9430951409681345,7.928481578826904
-7.954677021213342,7.934537410736084
-7.925565706285505,7.9030442237854
-7.946921547407927,7.939915180206299
-7.928117974144348,7.902867794036865
-7.901574427881827,7.924816131591797
-7.931814161156377,7.91079568862915
-7.903090094245322,7.892955303192139
-7.931814161156377,7.898411273956299
-7.892790308673911,7.9120869636535645
-7.9737577757544535,7.959105014801025
-7.954677021213342,7.941131591796875
-7.928117974144348,7.912383079528809
-7.954677021213342,7.952934741973877
-7.920818811243059,7.886404991149902
-7.950781972366453,7.946752548217773
-7.9393021526221474,7.903733730316162
-7.959158165932685,7.931529521942139
-7.950781972366453,7.924319267272949
-8.016694986585515,7.955627918243408
-7.9430951409681345,7.909509181976318
-7.950781972366453,7.9461259841918945
-7.954677021213342,7.966671466827393
-7.924453006674053,7.903146266937256
-7.924453006674053,7.907206058502197
-7.935542022791058,7.907145977020264
-7.950781972366453,7.907742977142334
-7.924453006674053,7.9291205406188965
-7.91721462968355,7.899914264678955
-7.892790308673911,7.915534496307373
-7.946921547407927,7.936289310455322
-7.93765506239242,7.925601959228516
-7.950781972366453,7.920248508453369
-7.950781972366453,7.925049304962158
-7.946921547407927,7.935105323791504
-7.931814161156377,7.925564765930176
-7.946921547407927,7.920723915100098
-7.946921547407927,7.899109840393066
-7.913640203677234,7.900002956390381
-7.950781972366453,7.893944263458252
-7.935542022791058,7.928340435028076
-7.924453006674053,7.9197678565979
-7.957786139863943,7.933026313781738
-7.928117974144348,7.904836177825928
-7.935542022791058,7.912532329559326
-7.931814161156377,7.9126410484313965
-7.896196359268842,7.89835786819458
-7.954677021213342,7.9252705574035645
-7.931814161156377,7.937177658081055
-7.948658283730227,7.92823600769043
-7.9430951409681345,7.931252479553223
-7.946921547407927,7.937617301940918
-7.913640203677234,7.9139227867126465
-7.860119116630385,7.924781322479248
-7.931814161156377,7.926262378692627
-7.924453006674053,7.923766613006592
-7.937021597224099,7.910224914550781
-7.950781972366453,7.951416492462158
-7.931814161156377,7.91161584854126
-7.9430951409681345,7.926399230957031
-7.950781972366453,7.941529750823975
-7.9430951409681345,7.89077615737915
-7.889410352488291,7.922298431396484
-7.9393021526221474,7.915794849395752
-7.946921547407927,7.922723293304443
-7.866459873882536,7.894781589508057
-7.950781972366453,7.91029691696167
-7.950781972366453,7.919283390045166
-7.9430951409681345,7.943802356719971
-7.910094953104535,7.891392230987549
-7.946921547407927,7.917135715484619
-7.9393021526221474,7.9098801612854
-7.946921547407927,7.903965950012207
-7.954677021213342,7.911337375640869
-7.946921547407927,7.921696186065674
-7.91721462968355,7.946916103363037
-7.913640203677234,7.870342254638672
-7.950781972366453,7.9119768142700195
-7.954677021213342,7.938420295715332
-7.889410352488291,7.902337551116943
-7.928117974144348,7.9237542152404785
-7.946921547407927,7.899436950683594
-7.924453006674053,7.918738842010498
-7.892824978756646,7.90421199798584
-7.950781972366453,7.954217433929443
-7.946921547407927,7.937739372253418
-7.882728704344236,7.89523983001709
-7.924453006674053,7.930814743041992
-7.968365045565531,7.957650184631348
-7.954677021213342,7.921278476715088
-7.924453006674053,7.908548355102539
-7.954677021213342,7.964534759521484
-7.9430951409681345,7.915981769561768
-7.935542022791058,7.9210333824157715
-7.863280055279963,7.890280246734619
-7.954677021213342,7.926267623901367
-7.903090094245322,7.9357523918151855
-7.906578398789698,7.950729846954346
-7.928117974144348,7.9153313636779785
-7.954677021213342,7.946588039398193
-7.931814161156377,7.9025492668151855
-7.9430951409681345,7.913223743438721
-7.954677021213342,7.943641662597656
-7.950781972366453,7.936324596405029
-7.901151046525181,7.9176716804504395
-7.950185844254969,7.962253570556641
-7.9393021526221474,7.941921710968018
-7.924453006674053,7.913308620452881
-7.924453006674053,7.9246344566345215
-7.99909679285825,7.958451271057129
-7.91721462968355,7.920320510864258
-7.924453006674053,7.9111456871032715
-7.946921547407927,7.9082512855529785
-7.885214382679302,7.888880252838135
-7.995678626217357,7.924412250518799
-7.889410352488291,7.908803939819336
-7.910094953104535,7.881229877471924
-7.835637836224461,7.912688732147217
-7.9393021526221474,7.914196491241455
-7.950781972366453,7.934604644775391
-7.950781972366453,7.953157424926758
-7.9393021526221474,7.942831516265869
-7.954677021213342,7.916960716247559
-7.950781972366453,7.945675373077393
-7.950781972366453,7.932528495788574
-7.950781972366453,7.941580295562744
-7.950781972366453,7.900802135467529
-7.954677021213342,7.935421943664551
-7.978895913358191,7.950508117675781
-7.931814161156377,7.930187702178955
-7.9393021526221474,7.925135612487793
-7.950781972366453,7.922633647918701
-7.928117974144348,7.8881330490112305
-7.931814161156377,7.928025722503662
-7.950781972366453,7.932778835296631
-7.950781972366453,7.945756435394287
-7.9393021526221474,7.904994010925293
-7.946921547407927,7.913296699523926
-7.954677021213342,7.9240288734436035
-7.950781972366453,7.922854900360107
-7.950781972366453,7.9490461349487305
-7.931814161156377,7.89931058883667
-7.924453006674053,7.921838283538818
-7.950781972366453,7.93909215927124
-7.952701373929933,7.941372394561768
-7.950781972366453,7.907497882843018
-7.903090094245322,7.89601993560791
-7.924453006674053,7.907079696655273
-7.950781972366453,7.9219136238098145
-7.950781972366453,7.920612335205078
-7.838628495628443,7.9051337242126465
-7.89043660207102,7.880883693695068
-7.91721462968355,7.924424171447754
-7.924453006674053,7.892852306365967
-7.950781972366453,7.920711994171143
-7.946921547407927,7.938304901123047
-7.892790308673911,7.9173583984375
-7.946921547407927,7.958741188049316
-7.950781972366453,7.939849853515625
-7.91721462968355,7.92661190032959
-7.829768510087842,7.892171859741211
-7.950781972366453,7.917593955993652
-7.987162773987728,7.971036911010742
-7.950781972366453,7.919637203216553
-7.950781972366453,7.951630115509033
-7.924453006674053,7.917927265167236
-7.946921547407927,7.934422492980957
-7.9430951409681345,7.924227714538574
-7.896196359268842,7.917514801025391
-7.946921547407927,7.9061503410339355
-7.91721462968355,7.929765224456787
-7.931814161156377,7.901512622833252
-7.950781972366453,7.911226749420166
-7.950781972366453,7.9301228523254395
-7.954677021213342,7.916995525360107
-7.9393021526221474,7.903477191925049
-7.954677021213342,7.95254373550415
-7.949130633177768,7.951032638549805
-7.924453006674053,7.926870822906494
-7.924453006674053,7.912976264953613
-7.935542022791058,7.926277160644531
-7.924453006674053,7.917787075042725
-7.924453006674053,7.9049601554870605
-7.920818811243059,7.898118495941162
-7.950781972366453,7.9153313636779785
-7.843093264073079,7.837376117706299
-7.931814161156377,7.932745456695557
-7.950781972366453,7.944176197052002
-7.946110394145942,7.956658840179443
-7.954677021213342,7.947368621826172
-7.935542022791058,7.925065517425537
-7.950781972366453,7.915915012359619
-7.9393021526221474,7.9157795906066895
-7.91721462968355,7.89887809753418
-7.928117974144348,7.930938243865967
-7.950781972366453,7.934011936187744
-7.954677021213342,7.9450907707214355
-7.974694136660875,7.956919193267822
-7.920818811243059,7.908864498138428
-7.924453006674053,7.913723945617676
-7.942721818964232,7.958837509155273
-7.9430951409681345,7.933985233306885
-7.924453006674053,7.90449857711792
-7.954677021213342,7.918819904327393
-7.924453006674053,7.916581630706787
-8.026824561605242,7.9833245277404785
-7.950781972366453,7.942962169647217
-7.954677021213342,7.945367336273193
-7.954677021213342,7.924630641937256
-7.950241642100192,7.932379245758057
-7.950781972366453,7.930272579193115
-7.950781972366453,7.9222588539123535
-7.924453006674053,7.916525840759277
-7.950781972366453,7.934731960296631
-7.952064708731984,7.902742862701416
-7.91721462968355,7.896655559539795
-7.935542022791058,7.952118873596191
-7.931814161156377,7.916264057159424
-7.946921547407927,7.90944766998291
-7.970532618892763,7.951729774475098
-7.924453006674053,7.926735877990723
-7.950781972366453,7.934779644012451
-7.94094624659741,7.890894889831543
-7.950781972366453,7.9359822273254395
-7.9393021526221474,7.920576572418213
-7.931814161156377,7.939024448394775
-7.9393021526221474,7.916791915893555
-7.946921547407927,7.92985200881958
-7.872383673051598,7.901468753814697
-7.928117974144348,7.92547607421875
-7.928117974144348,7.9250407218933105
-7.954677021213342,7.934632778167725
-7.931814161156377,7.892369747161865
-7.9430951409681345,7.949573040008545
-7.950781972366453,7.933199882507324
-7.946921547407927,7.924978733062744
-7.935542022791058,7.887937068939209
-7.920818811243059,7.914684772491455
-7.826774591089415,7.904342174530029
-7.9226037161522465,7.895446300506592
-7.950781972366453,7.9173479080200195
-7.982923651140671,7.946405410766602
-7.9393021526221474,7.933699131011963
-7.9737577757544535,7.919211387634277
-7.920818811243059,7.922824859619141
-7.928117974144348,7.915248870849609
-7.946921547407927,7.922964096069336
-7.950781972366453,7.943314552307129
-7.903090094245322,7.932262897491455
-7.937195024046664,7.922255992889404
-7.950781972366453,7.941224575042725
-7.928117974144348,7.9091410636901855
-7.9430951409681345,7.898411750793457
-7.910094953104535,7.937252998352051
-7.860153329415682,7.9068193435668945
-7.950781972366453,7.9291672706604
-7.906578398789698,7.921285152435303
-7.950781972366453,7.937747955322266
-7.950781972366453,7.912609100341797
-7.950781972366453,7.906439304351807
-7.982923651140671,7.903975963592529
-7.950781972366453,7.917220592498779
-7.913640203677234,7.896500110626221
-7.950781972366453,7.91279935836792
-7.903090094245322,7.913546085357666
-7.9430951409681345,7.960080623626709
-7.935542022791058,7.912443161010742
-7.928117974144348,7.9011454582214355
-7.85078088734462,7.90097188949585
-7.935542022791058,7.913687229156494
-7.9393021526221474,7.933234691619873
-7.950781972366453,7.9170756340026855
-7.954677021213342,7.937185287475586
-7.935542022791058,7.931344509124756
-7.928117974144348,7.9170331954956055
-7.9393021526221474,7.911798000335693
-7.920818811243059,7.919370174407959
-7.928117974144348,7.924981594085693
-7.935542022791058,7.924397945404053
-7.89962956062971,7.881606578826904
-7.995678626217357,7.973843574523926
-7.8013712254607785,7.89068078994751
-7.9737577757544535,7.96344518661499
-7.9393021526221474,7.909687042236328
-7.954677021213342,7.929733753204346
-7.886056354845152,7.8914313316345215
-7.978895913358191,7.919352054595947
-7.950781972366453,7.922937870025635
-7.900268059245174,7.932967662811279
-7.896196359268842,7.941745758056641
-7.954677021213342,7.9472246170043945
-7.954677021213342,7.914335250854492
-7.9430951409681345,7.93832540512085
-7.954677021213342,7.963949203491211
-7.8728955601551585,7.903046131134033
-7.924453006674053,7.88608980178833
-7.9393021526221474,7.914018154144287
-7.892790308673911,7.94523811340332
-7.8728955601551585,7.935611724853516
-7.954677021213342,7.929236888885498
-7.91721462968355,7.902723789215088
-7.950781972366453,7.939995288848877
-7.920818811243059,7.902816295623779
-7.954677021213342,7.93689489364624
-7.982923651140671,7.930510997772217
-7.903090094245322,7.881180286407471
-7.913640203677234,7.922989368438721
-7.91721462968355,7.894404888153076
-7.91721462968355,7.915857791900635
-7.9430951409681345,7.921968936920166
-7.853872762493711,7.9312310218811035
-7.950781972366453,7.913339138031006
-7.924453006674053,7.898591995239258
-7.982923651140671,7.940908432006836
-7.946921547407927,7.903120517730713
-7.89962956062971,7.905069351196289
-7.950781972366453,7.920176029205322
-7.931814161156377,7.947168350219727
-7.920818811243059,7.910640716552734
-7.9200659509493825,7.917123794555664
-7.931814161156377,7.926190376281738
-7.950781972366453,7.939918518066406
-7.954677021213342,7.938902854919434
-7.91721462968355,7.893815994262695
-7.946921547407927,7.9190239906311035
-7.920157222067213,7.912316799163818
-7.928117974144348,7.90571928024292
-7.928117974144348,7.916758060455322
-7.924453006674053,7.910952091217041
-7.954677021213342,7.909966945648193
-7.9430951409681345,7.909561634063721
-7.987162773987728,7.982510566711426
-7.9393021526221474,7.926419734954834
-7.950781972366453,7.929453372955322
-7.978895913358191,7.962748050689697
-7.950781972366453,7.923994541168213
-7.966576241738391,7.954166889190674
-7.954677021213342,7.94146728515625
-7.9393021526221474,7.9225850105285645
-7.924453006674053,7.8711419105529785
-7.954677021213342,7.934418678283691
-7.954677021213342,7.92881441116333
-7.954677021213342,7.917657375335693
-7.950781972366453,7.923465728759766
-7.82102305270683,7.908240795135498
-7.954259300743819,7.926717281341553
-7.903090094245322,7.895164489746094
-7.950781972366453,7.929611682891846
-7.954677021213342,7.93746280670166
-7.91721462968355,7.915628910064697
-7.9737577757544535,7.964725017547607
-7.9393021526221474,7.92667818069458
-7.920818811243059,7.91874361038208
-7.896196359268842,7.893287658691406
-7.9430951409681345,7.9333577156066895
-7.954677021213342,7.932590961456299
-7.886056354845152,7.933289527893066
-7.924453006674053,7.893753528594971
-7.924453006674053,7.910909175872803
-7.9393021526221474,7.930534839630127
-7.950781972366453,7.944760799407959
-7.950781972366453,7.93375825881958
-7.946921547407927,7.911264419555664
-7.946921547407927,7.921881198883057
-7.924453006674053,7.915320873260498
-7.946921547407927,7.918874263763428
-7.931814161156377,7.915553092956543
-7.866459873882536,7.90807580947876
-7.931814161156377,7.9259033203125
-7.924453006674053,7.907392978668213
-7.928117974144348,7.899439334869385
-7.896196359268842,7.903984069824219
-7.943400083598079,7.940915107727051
-7.931814161156377,7.899524211883545
-7.879425560900211,7.895355224609375
-7.954677021213342,7.941368579864502
-7.892790308673911,7.916805744171143
-7.954677021213342,7.952006816864014
-7.951252960495686,7.946665287017822
-7.903090094245322,7.879527568817139
-7.913640203677234,7.92282247543335
-7.896196359268842,7.901698589324951
-7.950781972366453,7.946115016937256
-7.954677021213342,7.952250003814697
-7.826774591089415,7.915377140045166
-7.942033487170233,7.892213821411133
-7.928117974144348,7.907035827636719
-7.928117974144348,7.9582977294921875
-7.920818811243059,7.903306484222412
-7.950781972366453,7.933597087860107
-7.950781972366453,7.967777729034424
-7.954677021213342,7.939800262451172
-7.950781972366453,7.917659282684326
-7.89962956062971,7.885219097137451
-8.034343915929238,7.940545558929443
-7.906578398789698,7.90880823135376
-7.931814161156377,7.920019626617432
-7.954677021213342,7.92130708694458
-7.946921547407927,7.919871807098389
-7.954677021213342,7.92818546295166
-7.954677021213342,7.92468786239624
-7.9430951409681345,7.94686222076416
-7.913640203677234,7.9255452156066895
-7.924453006674053,7.906798839569092
-7.869732506393041,7.89325475692749
-7.913640203677234,7.903505802154541
-7.913640203677234,7.932404041290283
-7.9393021526221474,7.935429573059082
-7.954677021213342,7.967936038970947
-7.954677021213342,7.97069787979126
-7.920818811243059,7.908833980560303
-7.91721462968355,7.912710666656494
-7.935542022791058,7.905862331390381
-7.94052963377159,7.911039352416992
-7.954677021213342,7.93209981918335
-7.950781972366453,7.929737567901611
-7.9430951409681345,7.912908554077148
-7.935542022791058,7.907863140106201
-7.924453006674053,7.930291652679443
-7.920818811243059,7.900815486907959
-7.832673025823477,7.911459922790527
-7.920818811243059,7.9069952964782715
-7.910094953104535,7.920003414154053
-7.920818811243059,7.913367748260498
-7.954677021213342,7.944969654083252
-7.928117974144348,7.900153160095215
-7.913640203677234,7.919307708740234
-7.950781972366453,7.924675464630127
-7.950781972366453,7.9331793785095215
-7.954677021213342,7.942399978637695
-7.946921547407927,7.931670665740967
-7.9393021526221474,7.940835952758789
-7.970532618892763,7.975464344024658
-7.954677021213342,7.953121662139893
-7.9430951409681345,7.942001819610596
-7.950781972366453,7.896302700042725
-7.935542022791058,7.939708232879639
-7.950781972366453,7.9302544593811035
-7.924453006674053,7.897667407989502
-7.9393021526221474,7.907890319824219
-7.946921547407927,7.925344467163086
-7.9393021526221474,7.915719985961914
-7.954677021213342,7.923631191253662
-7.91721462968355,7.909254550933838
-7.9430951409681345,7.916793346405029
-7.928117974144348,7.921579360961914
-7.9393021526221474,7.922628879547119
-7.9430951409681345,7.917619705200195
-7.950781972366453,7.922304630279541
-7.946921547407927,7.911796569824219
-7.924453006674053,7.9214606285095215
-7.906578398789698,7.90622615814209
-7.954677021213342,7.953128814697266
-7.982184017551764,7.968972682952881
-7.920706937989397,7.954834461212158
-7.9393021526221474,7.949137210845947
-7.958607309235428,7.9503560066223145
-7.950781972366453,7.9375481605529785
-7.869665979871627,7.88519287109375
-7.860119116630385,7.923939228057861
-7.954677021213342,7.914982795715332
-7.950781972366453,7.949779987335205
-7.931814161156377,7.921872615814209
-7.935542022791058,7.913538932800293
-7.859452790550835,7.854578971862793
-7.879425560900211,7.906762599945068
-7.946921547407927,7.925987720489502
-7.946921547407927,7.904868125915527
-7.935542022791058,7.932520389556885
-7.935542022791058,7.9393391609191895
-7.954677021213342,7.9440460205078125
-7.935542022791058,7.905572414398193
-7.889410352488291,7.902635097503662
-7.935542022791058,7.9217729568481445
-7.935542022791058,7.912063121795654
-7.931814161156377,7.922736644744873
-7.953367912495746,7.945571422576904
-7.85205769961263,7.896790027618408
-7.954677021213342,7.931914806365967
-8.014634778962309,7.96995210647583
-7.838628495628443,7.908502101898193
-7.928117974144348,7.89823579788208
-7.982923651140671,7.965236186981201
-7.89962956062971,7.898499011993408
-7.950781972366453,7.912688255310059
-7.913640203677234,7.878410816192627
-7.946921547407927,7.935082912445068
-7.966617665152964,7.912567615509033
-7.928117974144348,7.872021198272705
-7.855305266277571,7.8828206062316895
-7.913640203677234,7.89677619934082
-7.946921547407927,7.902223587036133
-7.950781972366453,7.921567440032959
-7.924453006674053,7.9041643142700195
-7.924453006674053,7.9393110275268555
-7.946921547407927,7.907987117767334
-7.924453006674053,7.9220967292785645
-7.9393021526221474,7.912745952606201
-7.950781972366453,7.970114231109619
-7.946921547407927,7.9314446449279785
-7.935542022791058,7.9066386222839355
-7.950781972366453,7.927081108093262
-7.9430951409681345,7.942749977111816
-7.903090094245322,7.928722381591797
-7.950781972366453,7.961155414581299
-7.950781972366453,7.916442394256592
-7.892824978756646,7.922505855560303
-7.946921547407927,7.933912754058838
-7.924453006674053,7.9167633056640625
-7.896196359268842,7.903659343719482
-7.9393021526221474,7.915619373321533
-7.906578398789698,7.911233901977539
-7.934136499461806,7.894675254821777
-7.928117974144348,7.917494773864746
-7.913640203677234,7.924123287200928
-7.9393021526221474,7.918333530426025
-7.920818811243059,7.926782131195068
-7.9737577757544535,7.942958354949951
-7.9737577757544535,7.928924560546875
-7.913640203677234,7.921116352081299
-7.950781972366453,7.915445804595947
-7.96257349994767,7.942930698394775
-7.9430951409681345,7.948853969573975
-7.950781972366453,7.974186897277832
-7.946921547407927,7.933312892913818
-7.924453006674053,7.919793605804443
-7.906578398789698,7.9140143394470215
-7.954677021213342,7.941766262054443
-7.931814161156377,7.891941070556641
-7.987162773987728,7.960299015045166
-7.928117974144348,7.906271457672119
-7.935542022791058,7.8970232009887695
-7.924453006674053,7.928320407867432
-7.920818811243059,7.902769565582275
-7.931814161156377,7.899619102478027
-7.910094953104535,7.919623374938965
-7.950781972366453,7.938826084136963
-7.9430951409681345,7.938346862792969
-7.913640203677234,7.91062068939209
-7.946921547407927,7.93428373336792
-7.9913998274291025,7.952002048492432
-7.982923651140671,7.904148101806641
-7.860119116630385,7.909542560577393
-7.954677021213342,7.9317803382873535
-7.935542022791058,7.918222904205322
-7.879425560900211,7.900071620941162
-7.954677021213342,7.934607028961182
-7.928117974144348,7.920898914337158
-7.928117974144348,7.922682762145996
-7.89962956062971,7.89553165435791
-7.954677021213342,7.945936679840088
-7.889410352488291,7.888378620147705
-7.895643174926403,7.883430004119873
-7.931814161156377,7.932754993438721
-7.946921547407927,7.914409637451172
-7.9430951409681345,7.937191486358643
-7.950781972366453,7.948850154876709
-7.931128869023377,7.9387311935424805
-7.924453006674053,7.911291599273682
-7.950781972366453,7.926069736480713
-7.950781972366453,7.925692558288574
-7.894365606854938,7.917168140411377
-7.860119116630385,7.926703929901123
-7.924453006674053,7.916947841644287
-7.928117974144348,7.909908771514893
-7.928117974144348,7.9275898933410645
-7.9393021526221474,7.920620441436768
-7.9393021526221474,7.900336265563965
-7.832673025823477,7.883123397827148
-7.9430951409681345,7.92482852935791
-7.951111119606262,7.913837432861328
-7.928117974144348,7.910992622375488
-7.920818811243059,7.939810752868652
-7.935542022791058,7.934573650360107
-7.9393021526221474,7.961748123168945
-7.82102305270683,7.88776969909668
-7.89962956062971,7.911775588989258
-7.8728955601551585,7.8655219078063965
-7.931814161156377,7.917438983917236
-7.928117974144348,7.931849956512451
-7.9393021526221474,7.942058563232422
-7.913640203677234,7.911884784698486
-7.928117974144348,7.91011381149292
-7.9849836249897255,7.906483173370361
-7.886056354845152,7.897636413574219
-7.91721462968355,7.908880710601807
-7.948847473653619,7.93053674697876
-7.935542022791058,7.946123123168945
-7.9200659509493825,7.9459428787231445
-7.860119116630385,7.890054702758789
-7.954677021213342,7.93634557723999
-7.950781972366453,7.9360809326171875
-7.954677021213342,7.94672155380249
-7.931814161156377,7.9079484939575195
-7.924453006674053,7.907811164855957
-7.946921547407927,7.925523281097412
-7.924453006674053,7.938300132751465
-7.954677021213342,7.903611660003662
-7.924453006674053,7.919375896453857
-7.9430951409681345,7.938028335571289
-7.950781972366453,7.9147515296936035
-7.924453006674053,7.934521198272705
-7.892790308673911,7.912793159484863
-7.9430951409681345,7.932809352874756
-7.923581356476356,7.908600330352783
-7.946921547407927,7.914204120635986
-7.903161564307976,7.926943302154541
-7.995678626217357,7.966938495635986
-7.9430951409681345,7.915223598480225
-7.89962956062971,7.923898696899414
-7.928155902956855,7.9181694984436035
-7.924453006674053,7.89652156829834
-7.9393021526221474,7.930256366729736
-7.924453006674053,7.929346561431885
-7.950781972366453,7.928490161895752
-7.9166994502154875,7.930314064025879
-7.954677021213342,7.940497875213623
-7.943864654803505,7.946784973144531
-7.954677021213342,7.950323581695557
-7.950781972366453,7.928659439086914
-7.924453006674053,7.919679641723633
-7.85750495533387,7.933133125305176
-7.91721462968355,7.898518085479736
-7.903090094245322,7.915621280670166
-7.946921547407927,7.921633243560791
-7.943392119977923,7.948855876922607
-7.920818811243059,7.873274326324463
-7.950781972366453,7.888560771942139
-7.9393021526221474,7.944667816162109
-7.954677021213342,7.926381587982178
-7.9430951409681345,7.939056396484375
-7.8761493177145505,7.904774188995361
-7.845339292733202,7.930422306060791
-7.954677021213342,7.915563106536865
-7.869665979871627,7.921644687652588
-7.954677021213342,7.943572521209717
-7.924453006674053,7.89972448348999
-7.89962956062971,7.927319526672363
-7.946921547407927,7.947207450866699
-7.9430951409681345,7.919478893280029
-7.935542022791058,7.903122425079346
-7.920818811243059,7.889050006866455
-7.928117974144348,7.897943019866943
-7.87543550142629,7.893849849700928
-7.924453006674053,7.9052414894104
-7.935542022791058,7.913357257843018
-7.874709893782641,7.896839618682861
-7.924453006674053,7.902740001678467
-7.935542022791058,7.93398904800415
-7.924453006674053,7.9406938552856445
-7.954677021213342,7.924491882324219
-7.910094953104535,7.908204555511475
-7.950781972366453,7.945676326751709
-7.950781972366453,7.916697025299072
-7.950781972366453,7.943233013153076
-7.9393021526221474,7.8919782638549805
-7.903090094245322,7.921607494354248
-7.946921547407927,7.9087910652160645
-7.906578398789698,7.910460948944092
-7.954677021213342,7.925784587860107
-7.950781972366453,7.9296555519104
-7.950781972366453,7.935276985168457
-7.974737536115285,7.933212757110596
-7.931814161156377,7.9241156578063965
-7.914290579732208,7.9226908683776855
-7.9430951409681345,7.915706157684326
-7.950781972366453,7.910842418670654
-7.931814161156377,7.9268927574157715
-7.946921547407927,7.909357070922852
-7.9430951409681345,7.935692310333252
-7.953969186355689,7.982855796813965
-7.954677021213342,7.901851177215576
-7.978895913358191,7.960794925689697
-7.954677021213342,7.949268341064453
-7.931814161156377,7.914949893951416
-7.924453006674053,7.908812999725342
-7.906578398789698,7.918292045593262
-7.896196359268842,7.925745964050293
-7.931814161156377,7.940074443817139
-7.9393021526221474,7.933385372161865
-7.9393021526221474,7.952027797698975
-7.950781972366453,7.917362213134766
-7.950781972366453,7.935741901397705
-7.924453006674053,7.9321112632751465
-7.85078088734462,7.925007343292236
-7.931814161156377,7.917680263519287
-7.924453006674053,7.909466743469238
-7.950781972366453,7.93903112411499
-7.924453006674053,7.908426761627197
-7.924453006674053,7.974639892578125
-7.954677021213342,7.956364631652832
-7.9430951409681345,7.928348064422607
-7.9430951409681345,7.95217227935791
-7.896196359268842,7.905058860778809
-7.928117974144348,7.901590824127197
-7.935542022791058,7.903129577636719
-7.935542022791058,7.9159979820251465
-7.935542022791058,7.936617374420166
-7.910094953104535,7.911699295043945
-7.9393021526221474,7.91310453414917
-7.924453006674053,7.927730083465576
-7.889410352488291,7.886100769042969
-7.950781972366453,7.927094459533691
-7.931814161156377,7.935121059417725
-7.954677021213342,7.945465087890625
-7.928117974144348,7.924046039581299
-7.954677021213342,7.942592144012451
-7.946921547407927,7.926485538482666
-7.946921547407927,7.927449703216553
-7.954677021213342,7.95833158493042
-7.946921547407927,7.911789417266846
-7.928117974144348,7.901601314544678
-7.995678626217357,7.966681957244873
-7.9430951409681345,7.95775032043457
-7.91354207338809,7.925924777984619
-7.950781972366453,7.915857791900635
-7.9393021526221474,7.930527687072754
-7.9430951409681345,7.9371466636657715
-7.954677021213342,7.930565357208252
-7.85078088734462,7.894406795501709
-7.924453006674053,7.900732040405273
-7.9737577757544535,7.930142879486084
-7.950781972366453,7.937249660491943
-7.946921547407927,7.92252254486084
-7.931814161156377,7.92085599899292
-7.896196359268842,7.913965702056885
-7.924453006674053,7.905472278594971
-7.924453006674053,7.937555313110352
-7.935542022791058,7.916779041290283
-7.954677021213342,7.945249080657959
-7.891275104996169,7.897331237792969
-7.928117974144348,7.91110372543335
-7.8761493177145505,7.9061455726623535
-7.898841589585073,7.923979759216309
-7.931814161156377,7.906745433807373
-7.924453006674053,7.9137396812438965
-7.970532618892763,7.95402193069458
-7.954677021213342,7.91695499420166
-7.9393021526221474,7.915194988250732
-7.924453006674053,7.894401550292969
-7.9393021526221474,7.937939167022705
-7.860119116630385,7.900171756744385
-7.931814161156377,7.908107280731201
-7.928117974144348,7.950979709625244
-7.920818811243059,7.9432549476623535
-7.946921547407927,7.931501388549805
-7.935542022791058,7.905447483062744
-7.91721462968355,7.901282787322998
-7.950781972366453,7.939087390899658
-7.987162773987728,7.957086563110352
-7.89962956062971,7.903711795806885
-7.910094953104535,7.909778594970703
-7.935542022791058,7.925530433654785
-7.910094953104535,7.90465784072876
-7.935542022791058,7.902430057525635
-7.931814161156377,7.9213666915893555
-7.954677021213342,7.949366092681885
-7.954677021213342,7.9394683837890625
-7.946921547407927,7.923303127288818
-7.9335681432273475,7.965210914611816
-7.928117974144348,7.9351911544799805
-7.9913998274291025,7.9679036140441895
-7.91721462968355,7.910481929779053
-7.920818811243059,7.917196750640869
-7.946921547407927,7.960760593414307
-7.954677021213342,7.898253917694092
-7.913640203677234,7.92255973815918
-7.9393021526221474,7.928351879119873
-7.950781972366453,7.909122467041016
-7.935542022791058,7.9363112449646
-7.878606331107103,7.890451431274414
-7.920818811243059,7.906968116760254
-7.924453006674053,7.929199695587158
-7.9393021526221474,7.946967124938965
-7.9393021526221474,7.9135565757751465
-7.928117974144348,7.907479763031006
-7.9913998274291025,7.973706245422363
-7.866459873882536,7.918528079986572
-7.913640203677234,7.905459403991699
-7.931814161156377,7.937411785125732
-7.924453006674053,7.923889636993408
-7.928117974144348,7.913252830505371
-7.935542022791058,7.956902980804443
-7.910094953104535,7.90554141998291
-7.928117974144348,7.940155506134033
-7.950781972366453,7.925503730773926
-7.993715522619759,7.980814456939697
-7.889410352488291,7.917892932891846
-7.9393021526221474,7.917142868041992
-7.887806980848277,7.878914833068848
-7.924453006674053,7.925805568695068
-7.950781972366453,7.9114203453063965
-7.9430951409681345,7.939290523529053
-7.9393021526221474,7.913401126861572
-7.931814161156377,7.933303356170654
-7.966576241738391,7.936306476593018
-7.9393021526221474,7.896472930908203
-7.924453006674053,7.9199676513671875
-7.910094953104535,7.89513635635376
-7.9430951409681345,7.943663597106934
-7.954677021213342,7.9063544273376465
-7.954677021213342,7.923366069793701
-7.928117974144348,7.901157855987549
-7.889410352488291,7.887399196624756
-7.8728955601551585,7.895864963531494
-7.920818811243059,7.89883279800415
-7.928117974144348,7.906509876251221
-7.920818811243059,7.9156107902526855
-7.9393021526221474,7.928569793701172
-7.931814161156377,7.923885345458984
-7.9430951409681345,7.929234027862549
-7.903090094245322,7.924258708953857
-7.9393021526221474,7.9179463386535645
-7.954677021213342,7.937625408172607
-7.935542022791058,7.907752513885498
-7.954677021213342,7.9208455085754395
-7.935542022791058,7.942715167999268
-7.925565706285505,7.924211025238037
-7.950781972366453,7.922912120819092
-7.950781972366453,7.923369884490967
-7.950781972366453,7.936782360076904
-7.931814161156377,7.910022258758545
-7.9430951409681345,7.931441307067871
-7.954677021213342,7.9156670570373535
-7.931814161156377,7.91457462310791
-7.903090094245322,7.896361827850342
-7.995678626217357,7.986658573150635
-7.946082651207223,7.928852558135986
-7.946921547407927,7.925839424133301
-7.935542022791058,7.933546543121338
-7.954677021213342,7.91939640045166
-7.966617665152964,7.890651226043701
-7.978810702253626,7.96811580657959
-7.950781972366453,7.933703899383545
-7.946921547407927,7.9225969314575195
-7.901574427881827,7.9133429527282715
-7.946921547407927,7.9469451904296875
-7.978895913358191,7.966608047485352
-7.935542022791058,7.901207447052002
-7.9737577757544535,7.93752908706665
-7.844664854175832,7.891652584075928
-7.860119116630385,7.91109037399292
-7.892790308673911,7.9163641929626465
-7.950781972366453,7.921090126037598
-7.882728704344236,7.915430545806885
-7.924453006674053,7.904776096343994
-7.931814161156377,7.934078693389893
-7.897970809988902,7.898492813110352
-7.913640203677234,7.897196292877197
-7.8761493177145505,7.924015522003174
-7.931814161156377,7.912547588348389
-7.950781972366453,7.947065830230713
-7.924453006674053,7.910488128662109
-7.966576241738391,7.982712268829346
-7.928117974144348,7.904879093170166
-7.954677021213342,7.94722843170166
-7.9430951409681345,7.909898281097412
-7.928117974144348,7.930948257446289
-7.935542022791058,7.962145805358887
-7.928117974144348,7.899435997009277
-7.954677021213342,7.950197219848633
-7.954677021213342,7.938360691070557
-7.982923651140671,7.948328971862793
-7.954677021213342,7.882702827453613
-7.9335681432273475,7.952702522277832
-7.995678626217357,7.9570417404174805
-7.9393021526221474,7.91202974319458
-7.950781972366453,7.929532051086426
-7.935542022791058,7.91243839263916
-7.924453006674053,7.883548736572266
-7.9430951409681345,7.9176716804504395
-7.928117974144348,7.919677257537842
-7.827702142900784,7.918402671813965
-7.946921547407927,7.926878452301025
-7.9430951409681345,7.925226211547852
-7.931814161156377,7.911065101623535
-7.9393021526221474,7.917956829071045
-7.946921547407927,7.919859409332275
-7.928117974144348,7.9373698234558105
-7.954677021213342,7.925380229949951
-7.928117974144348,7.912214756011963
-7.9393021526221474,7.936524391174316
-7.950781972366453,7.9131178855896
-7.935542022791058,7.916621685028076
-7.982966659490206,7.950568675994873
-7.928117974144348,7.9170002937316895
-7.954677021213342,7.926297664642334
-7.935542022791058,7.912350177764893
-7.906578398789698,7.918356895446777
-7.982923651140671,7.913559913635254
-7.924453006674053,7.923842906951904
-7.970532618892763,7.927046298980713
-7.946921547407927,7.9220871925354
-7.9913998274291025,7.972907066345215
-7.954677021213342,7.915468692779541
-7.9737577757544535,7.931850910186768
-7.9393021526221474,7.923072338104248
-7.920818811243059,7.917028903961182
-7.9737577757544535,7.931761741638184
-7.935542022791058,7.920182704925537
-7.935542022791058,7.901894569396973
-7.954677021213342,7.934288501739502
-7.950781972366453,7.925648212432861
-7.928117974144348,7.905085563659668
-7.903090094245322,7.8793463706970215
-7.928117974144348,7.915564060211182
-7.928117974144348,7.945288181304932
-7.954677021213342,7.930391311645508
-7.946921547407927,7.937402725219727
-7.939379961634402,7.9464616775512695
-7.82102305270683,7.893459320068359
-7.94551824914185,7.931258678436279
-7.928117974144348,7.912538051605225
-7.950781972366453,7.916760444641113
-7.950781972366453,7.9287428855896
-7.832673025823477,7.860651016235352
-7.928117974144348,7.925220966339111
-7.978810702253626,7.960145950317383
-7.995678626217357,7.928263187408447
-7.995678626217357,7.9326677322387695
-7.91721462968355,7.916652679443359
-7.928117974144348,7.918306827545166
-7.886056354845152,7.896779537200928
-7.935542022791058,7.929156303405762
-7.959933497874262,7.95319938659668
-7.946921547407927,7.941995143890381
-7.982966659490206,7.933121681213379
-7.863280055279963,7.948582172393799
-7.91721462968355,7.931613922119141
-7.924453006674053,7.89898157119751
-7.931814161156377,7.9257612228393555
-7.954677021213342,7.9059319496154785
-7.882728704344236,7.913387775421143
-7.924453006674053,7.9247145652771
-7.946921547407927,7.903430461883545
-7.896196359268842,7.90560245513916
-7.950781972366453,7.918863773345947
-7.910094953104535,7.9067206382751465
-7.866459873882536,7.929922580718994
-7.950781972366453,7.946018695831299
-7.920818811243059,7.909013271331787
-7.954677021213342,7.935661315917969
-7.9430951409681345,7.918045520782471
-7.866459873882536,7.924722194671631
-7.910094953104535,7.902144908905029
-7.8761493177145505,7.887392997741699
-7.950781972366453,7.9475297927856445
-7.896125840447619,7.910190105438232
-7.889410352488291,7.921443462371826
-7.928117974144348,7.921502113342285
-7.903090094245322,7.916722774505615
-7.931814161156377,7.919244289398193
-7.939379961634402,7.918727397918701
-7.895458192229938,7.898486614227295
-7.950781972366453,7.909648418426514
-7.91721462968355,7.958858013153076
-7.954677021213342,7.936107158660889
-7.950781972366453,7.9250712394714355
-7.9393021526221474,7.890257835388184
-7.9430951409681345,7.925479888916016
-7.93935659707521,7.9054131507873535
-7.950781972366453,7.927338600158691
-7.903090094245322,7.911084175109863
-7.920818811243059,7.911525726318359
-7.946921547407927,7.938401699066162
-7.950781972366453,7.936609268188477
-7.950781972366453,7.927182197570801
-7.928117974144348,7.9210638999938965
-7.946921547407927,7.9198198318481445
-7.958607309235428,7.9432148933410645
-7.946921547407927,7.918998718261719
-7.920818811243059,7.899996280670166
-7.892790308673911,7.902164459228516
-7.847706165863548,7.893876552581787
-7.928117974144348,7.9160542488098145
-7.910094953104535,7.90424108505249
-7.924453006674053,7.907458782196045
-7.924453006674053,7.908466815948486
-7.896196359268842,7.907463550567627
-7.9430951409681345,7.942193508148193
-7.943055911701025,7.9526262283325195
-7.913640203677234,7.931404113769531
-7.924453006674053,7.912938594818115
-7.896196359268842,7.903607368469238
-7.924453006674053,7.923064708709717
-7.950781972366453,7.9159626960754395
-7.9430951409681345,7.928293704986572
-7.91721462968355,7.909509181976318
-7.946921547407927,7.946037769317627
-7.935542022791058,7.909257411956787
-7.913640203677234,7.891530990600586
-7.950781972366453,7.935884475708008
-7.954677021213342,7.927422046661377
-7.9430951409681345,7.921578884124756
-7.924453006674053,7.900106906890869
-7.928117974144348,7.920102596282959
-7.924453006674053,7.905412673950195
-7.9393021526221474,7.925300121307373
-7.910094953104535,7.887270450592041
-7.950781972366453,7.961024761199951
-7.882728704344236,7.887452125549316
-7.924453006674053,7.917606353759766
-7.946921547407927,7.94529914855957
-7.928117974144348,7.918395042419434
-7.882728704344236,7.9012346267700195
-7.879425560900211,7.899612903594971
-7.924453006674053,7.927003383636475
-7.920818811243059,7.927642822265625
-7.92729567327985,7.9213690757751465
-7.926738213581133,7.913793087005615
-7.9737577757544535,7.929199695587158
-7.9430951409681345,7.9198479652404785
-7.9430951409681345,7.9324140548706055
-7.847806170429149,7.895864963531494
-7.946921547407927,7.918962001800537
-7.889410352488291,7.906151294708252
-7.9393021526221474,7.929851531982422
-7.9430951409681345,7.92625093460083
-7.954677021213342,7.899459362030029
-7.948366372629572,7.9350266456604
-7.950781972366453,7.934082984924316
-7.950781972366453,7.9427809715271
-7.950781972366453,7.918521404266357
-7.87543550142629,7.942783832550049
-7.935542022791058,7.920195579528809
-7.990339285400088,7.950845241546631
-7.8416326138557455,7.9088897705078125
-7.928117974144348,7.923747539520264
-7.892790308673911,7.922119617462158
-7.954677021213342,8.013148307800293
-7.886056354845152,7.919235706329346
-7.950781972366453,7.935731410980225
-7.928117974144348,7.909901142120361
-7.9430951409681345,7.91221809387207
-7.9430951409681345,7.930120944976807
-7.9430951409681345,7.913309574127197
-7.995678626217357,7.9553985595703125
-7.9317376797944785,7.919224262237549
-7.935542022791058,7.940832614898682
-7.9913998274291025,7.950894832611084
-8.004899782157656,7.96933650970459
-7.8761493177145505,7.909287452697754
-7.954677021213342,7.9538774490356445
-7.887178538791211,7.900148391723633
-7.931814161156377,7.894886016845703
-7.935542022791058,7.916965961456299
-7.924453006674053,7.89566707611084
-7.931814161156377,7.938448429107666
-7.9393021526221474,7.936118125915527
-7.9430951409681345,7.940470218658447
-7.946921547407927,7.925833702087402
-7.882728704344236,7.882148265838623
-7.931814161156377,7.915853023529053
-7.9393021526221474,7.920156002044678
-7.924453006674053,7.912386894226074
-7.9393021526221474,7.916017055511475
-7.935542022791058,7.9195780754089355
-7.950241642100192,7.9134955406188965
-7.931814161156377,7.939983367919922
-7.950781972366453,7.939053535461426
-7.954677021213342,7.94549560546875
-7.89962956062971,7.9160475730896
-7.954677021213342,7.93397855758667
-7.950781972366453,7.938491344451904
-7.920818811243059,7.945082187652588
-7.950781972366453,7.944142818450928
-7.928117974144348,7.92140531539917
-7.928117974144348,7.930063724517822
-7.9430951409681345,7.9370012283325195
-7.950781972366453,7.919800758361816
-7.950781972366453,7.935433864593506
-7.995678626217357,7.960448741912842
-7.978810702253626,7.965857028961182
-7.931814161156377,7.9388604164123535
-7.935542022791058,7.89924430847168
-7.9913998274291025,7.952113628387451
-7.924453006674053,7.906130313873291
-7.954677021213342,7.932532787322998
-7.924453006674053,7.919618129730225
-7.928117974144348,7.931646347045898
-7.950781972366453,7.922375202178955
-7.869665979871627,7.913510799407959
-7.8761493177145505,7.895223140716553
-7.91721462968355,7.903397560119629
-8.008819571765459,7.988332271575928
-7.920818811243059,7.913930416107178
-7.920818811243059,7.926580905914307
-7.903090094245322,7.921064853668213
-7.91375018033154,7.9175801277160645
-7.954677021213342,7.935683727264404
-7.93468629292431,7.8983540534973145
-7.935542022791058,7.93283748626709
-7.935542022791058,7.921980381011963
-7.970616219270671,7.927112102508545
-7.91721462968355,7.880666255950928
-7.946921547407927,7.937826156616211
-7.950781972366453,7.93053674697876
-7.995678626217357,7.912937641143799
-7.9393021526221474,7.926675319671631
-7.950781972366453,7.9224772453308105
-7.928117974144348,7.915420055389404
-7.89962956062971,7.898312568664551
-7.950781972366453,7.923197269439697
-7.950781972366453,7.9308905601501465
-7.946921547407927,7.895829200744629
-7.931814161156377,7.9048075675964355
-7.91721462968355,7.920914173126221
-7.892790308673911,7.912197113037109
-7.9430951409681345,7.9438300132751465
-7.950781972366453,7.950380802154541
-7.913640203677234,7.920882225036621
-7.913640203677234,7.8963398933410645
-7.9430951409681345,7.89761209487915
-7.995678626217357,7.933430194854736
-7.924453006674053,7.894493579864502
-7.8877303691149265,7.932364463806152
-7.928117974144348,7.928624629974365
-7.847706165863548,7.902708530426025
-7.931814161156377,7.916311740875244
-7.924453006674053,7.9187235832214355
-7.91721462968355,7.923713207244873
-7.950781972366453,7.942267417907715
-7.9393021526221474,7.927221298217773
-7.9393021526221474,7.9283671379089355
-7.954677021213342,7.943500995635986
-7.954677021213342,7.932129859924316
-7.995678626217357,7.965943813323975
-7.950781972366453,7.921898365020752
-7.950781972366453,7.918543338775635
-7.950781972366453,7.905270576477051
-7.879425560900211,7.913825988769531
-7.931814161156377,7.921078205108643
-7.903607877954982,7.9184136390686035
-7.9393021526221474,7.924333095550537
-7.946921547407927,7.903138637542725
-7.946921547407927,7.9274702072143555
-7.9393021526221474,7.945794582366943
-7.950781972366453,7.938951015472412
-7.950781972366453,7.927919864654541
-7.924453006674053,7.91095495223999
-7.954677021213342,7.907249450683594
-7.954677021213342,7.92825984954834
-7.889410352488291,7.919172286987305
-7.910094953104535,7.886683940887451
-7.954677021213342,7.9362969398498535
-7.950781972366453,7.897669792175293
-7.928117974144348,7.907557487487793
-7.879425560900211,7.881322383880615
-7.958607309235428,7.9325103759765625
-7.950781972366453,7.919173717498779
-7.958607309235428,7.962147235870361
-7.950781972366453,7.932284832000732
-7.954677021213342,7.937671184539795
-7.935542022791058,7.923099994659424
-7.903090094245322,7.919210910797119
-7.974694136660875,7.946400165557861
-7.931814161156377,7.903665065765381
-7.954677021213342,7.934115409851074
-7.924453006674053,7.929592609405518
-7.950781972366453,7.941304683685303
-7.928117974144348,7.911684513092041
-7.995678626217357,7.9764018058776855
-7.920818811243059,7.926636219024658
-7.8761493177145505,7.903810977935791
-7.866459873882536,7.90360689163208
-7.957786139863943,7.9492363929748535
-7.982923651140671,7.9117655754089355
-7.946921547407927,7.924196243286133
-7.950781972366453,7.936469554901123
-7.887071200127622,7.924959659576416
-7.954677021213342,7.956820964813232
-7.892790308673911,7.883991241455078
-7.9430951409681345,7.9499430656433105
-7.9090928421897,7.8921990394592285
-7.954677021213342,7.922945976257324
-7.946921547407927,7.926651477813721
-7.931814161156377,7.914885997772217
-7.954677021213342,7.940150737762451
-7.935542022791058,7.911312580108643
-7.925565706285505,7.906795978546143
-7.950781972366453,7.921636581420898
-7.9430951409681345,7.9015889167785645
-7.954677021213342,7.907878875732422
-7.924453006674053,7.879761695861816
-7.918913331379011,7.934067726135254
-7.951268538741394,7.933326244354248
-7.935542022791058,7.936349391937256
-7.886056354845152,7.912156105041504
-7.924453006674053,7.9207682609558105
-7.954677021213342,7.927796363830566
-7.928117974144348,7.907140254974365
-7.954677021213342,7.933638572692871
-7.910094953104535,7.906553268432617
-7.924453006674053,7.921397686004639
-7.924453006674053,7.897251605987549
-7.889410352488291,7.872350692749023
-7.9393021526221474,7.950736999511719
-7.954677021213342,7.948143482208252
-7.91721462968355,7.954285144805908
-7.954677021213342,7.934325695037842
-7.954677021213342,7.967288970947266
-7.954677021213342,7.928557395935059
-7.946921547407927,7.931826591491699
-7.928117974144348,7.913957118988037
-7.978895913358191,7.927515506744385
-7.950781972366453,7.923909664154053
-7.9430951409681345,7.924743175506592
-7.943835773881208,7.926698207855225
-7.954677021213342,7.9318528175354
-7.85078088734462,7.908531665802002
-7.946921547407927,7.938639163970947
-7.931814161156377,7.899154186248779
-7.950781972366453,7.929815769195557
-7.920818811243059,7.8951544761657715
-7.9393021526221474,7.924188613891602
-7.920818811243059,7.901867389678955
-7.950781972366453,7.918290615081787
-7.924453006674053,7.894041538238525
-7.9430951409681345,7.92335319519043
-7.978810702253626,7.92983865737915
-7.882728704344236,7.91593599319458
-7.920818811243059,7.9268364906311035
-7.866459873882536,7.8725361824035645
-7.950781972366453,7.911688804626465
-7.928117974144348,7.921325206756592
-7.950781972366453,7.936488628387451
-7.954677021213342,7.944770812988281
-7.838601588751302,7.950817584991455
-7.995678626217357,7.988722801208496
-7.946921547407927,7.916090488433838
-7.931814161156377,7.911746978759766
-7.935542022791058,7.880433559417725
-7.9430951409681345,7.939692974090576
-7.9393021526221474,7.885216236114502
-7.954677021213342,7.92183256149292
-7.935542022791058,7.908496856689453
-7.91721462968355,7.919999122619629
-7.826774591089415,7.906207084655762
-7.950781972366453,7.916945934295654
-7.826774591089415,7.877771854400635
-7.935542022791058,7.918024063110352
-7.924453006674053,7.923111438751221
-7.946921547407927,7.9097676277160645
-7.970616219270671,7.954420566558838
-7.950781972366453,7.914885520935059
-7.931814161156377,7.912661552429199
-7.931814161156377,7.912328243255615
-7.94094624659741,7.926126003265381
-7.931814161156377,7.913487434387207
-7.946921547407927,7.900849342346191
-7.920818811243059,7.9134297370910645
-7.9393021526221474,7.933136463165283
-7.995678626217357,7.96058988571167
-7.950781972366453,7.909358501434326
-7.924453006674053,7.924506664276123
-7.954677021213342,7.932684421539307
-7.950781972366453,7.915036678314209
-7.924453006674053,7.9332709312438965
-7.946921547407927,7.9044976234436035
-7.89962956062971,7.909870624542236
-7.916637144431181,7.9333176612854
-7.9393021526221474,7.914455890655518
-7.931814161156377,7.9370036125183105
-7.924453006674053,7.912844181060791
-7.9393021526221474,7.931136608123779
-7.872577572415708,7.885008811950684
-7.903090094245322,7.9212517738342285
-7.924453006674053,7.904260158538818
-7.954677021213342,7.95319128036499
-7.91721462968355,7.903017520904541
-7.9393021526221474,7.875271797180176
-7.924453006674053,7.919277667999268
-7.946921547407927,7.928406238555908
-7.950781972366453,7.9358086585998535
-7.924453006674053,7.9294114112854
-7.951924235060929,7.947520732879639
-7.9393021526221474,7.932776927947998
-7.946921547407927,7.93100118637085
-7.924453006674053,7.924998760223389
-7.827702142900784,7.8636298179626465
-7.924453006674053,7.910874843597412
-7.910094953104535,7.918717861175537
-7.9430951409681345,7.913954257965088
-7.954677021213342,7.906031131744385
-7.954677021213342,7.905022144317627
-7.951740612759727,7.9634504318237305
-7.9200659509493825,7.913981914520264
-7.954677021213342,7.944268703460693
-7.924453006674053,7.901434898376465
-7.950781972366453,7.931614398956299
-7.896196359268842,7.910138130187988
-7.946921547407927,7.9286580085754395
-7.957786139863943,7.951498031616211
-7.950781972366453,7.931650638580322
-7.950781972366453,7.94416618347168
-7.950781972366453,7.9557318687438965
-7.9393021526221474,7.9150166511535645
-7.954677021213342,7.9308552742004395
-7.950781972366453,7.92826509475708
-7.935542022791058,7.905299663543701
-7.946921547407927,7.9083333015441895
-7.832673025823477,7.921192169189453
-7.957786139863943,7.956121921539307
-7.935542022791058,7.907794952392578
-7.951049882449536,7.944106578826904
-7.928117974144348,7.900932788848877
-7.913640203677234,7.916050434112549
-7.924453006674053,7.904048442840576
-7.913640203677234,7.891700267791748
-7.950781972366453,7.940414905548096
-7.950781972366453,7.915938854217529
-7.931814161156377,7.927308559417725
-7.966617665152964,7.9261088371276855
-7.905505004370402,7.9223952293396
-7.931080216138895,7.935911655426025
-7.906578398789698,7.921719074249268
-7.954677021213342,7.929520606994629
-7.903090094245322,7.887918472290039
-7.946921547407927,7.93803596496582
-7.8761493177145505,7.878822326660156
-7.847706165863548,7.897250175476074
-7.954677021213342,7.916663646697998
-7.928117974144348,7.926613807678223
-7.950781972366453,7.926568508148193
-7.89962956062971,7.901763916015625
-7.950781972366453,7.93105936050415
-7.946921547407927,7.912898063659668
-7.966576241738391,7.968804359436035
-7.89962956062971,7.89938497543335
-7.91721462968355,7.902083873748779
-7.91721462968355,7.911470890045166
-7.920818811243059,7.919651508331299
-7.954677021213342,7.936987400054932
-7.896196359268842,7.926435470581055
-7.946921547407927,7.944622039794922
-7.950781972366453,7.943599224090576
-7.950781972366453,7.934630870819092
-7.954677021213342,7.935390949249268
-7.914869981638795,7.91730260848999
-7.903090094245322,7.890899181365967
-7.950781972366453,7.919877052307129
-7.928117974144348,7.919795036315918
-7.924453006674053,7.928684234619141
-7.924453006674053,7.916867256164551
-7.954677021213342,7.958928108215332
-7.954677021213342,7.936548709869385
-7.928117974144348,7.912089824676514
-7.954677021213342,7.886380672454834
-7.9430951409681345,7.918444633483887
-7.954677021213342,7.947597503662109
-7.8761493177145505,7.884999752044678
-8.026824561605242,7.969997406005859
-7.946921547407927,7.972927570343018
-7.935542022791058,7.913721561431885
-7.946921547407927,7.9173479080200195
-7.9393021526221474,7.938322067260742
-7.928117974144348,7.940567493438721
-7.91721462968355,7.905696392059326
-7.9430951409681345,7.948244571685791
-7.954677021213342,7.903866767883301
-7.924453006674053,7.91470193862915
-7.889410352488291,7.911970615386963
-7.924453006674053,7.925804615020752
-7.950781972366453,7.91270637512207
-7.9393021526221474,7.922384262084961
-7.931714436094428,7.914465427398682
-7.9430951409681345,7.9353814125061035
-7.9430951409681345,7.926260471343994
-7.954677021213342,7.948691368103027
-7.91721462968355,7.933333396911621
-7.954677021213342,7.959436893463135
-7.950781972366453,7.932533264160156
-7.931814161156377,7.904314041137695
-7.950781972366453,7.938498020172119
-7.925990174229664,7.922225475311279
-7.982923651140671,7.878546714782715
-7.954677021213342,7.939659595489502
-7.82330639418584,7.8510308265686035
-7.903090094245322,7.913760662078857
-7.924453006674053,7.927532196044922
-7.9393021526221474,7.943297863006592
-7.928117974144348,7.905192852020264
-7.924453006674053,7.905005931854248
-7.9393021526221474,7.930553913116455
-7.935542022791058,7.91428804397583
-7.920818811243059,7.936192512512207
-7.950781972366453,7.918516159057617
-7.935542022791058,7.905552387237549
-7.954677021213342,7.909910678863525
-7.954677021213342,7.96645975112915
-7.950781972366453,7.950876712799072
-7.910094953104535,7.909658908843994
-7.928117974144348,7.920994758605957
-7.886056354845152,7.921584606170654
-7.906578398789698,7.897221088409424
-7.910094953104535,7.9114670753479
-7.920818811243059,7.915444850921631
-7.928117974144348,7.896768569946289
-7.9393021526221474,7.896601676940918
-7.958607309235428,7.922494411468506
-7.954677021213342,7.913522243499756
-7.910094953104535,7.894805431365967
-7.950781972366453,7.934733867645264
-7.935542022791058,7.906941890716553
-7.85078088734462,7.907938480377197
-7.954677021213342,7.9307861328125
-7.9393021526221474,7.901238441467285
-7.906578398789698,7.907537460327148
-7.924453006674053,7.927709102630615
-7.950781972366453,7.934289455413818
-7.913640203677234,7.915365695953369
-7.9393021526221474,7.922494888305664
-7.950781972366453,7.924479961395264
-7.9393021526221474,7.94246768951416
-7.928117974144348,7.920053005218506
-7.9393021526221474,7.906998634338379
-7.935542022791058,7.9085612297058105
-7.954677021213342,7.945296764373779
-7.931814161156377,7.900823593139648
-7.928117974144348,7.901013374328613
-7.924453006674053,7.914767742156982
-7.889410352488291,7.923389434814453
-7.866459873882536,7.879659652709961
-7.869665979871627,7.925450801849365
-7.928117974144348,7.907999515533447
-7.928117974144348,7.89011287689209
-7.928117974144348,7.9201340675354
-7.89962956062971,7.934086799621582
-7.950781972366453,7.929407596588135
-7.954677021213342,7.929866313934326
-7.946921547407927,7.909439563751221
-7.946921547407927,7.9110493659973145
-7.9430951409681345,7.902149677276611
-7.935542022791058,7.922272205352783
-7.896196359268842,7.909854412078857
-7.924453006674053,7.927703857421875
-7.931814161156377,7.919013023376465
-7.950781972366453,7.93795108795166
-7.950781972366453,7.928189277648926
-7.9430951409681345,7.9200053215026855
-7.9430951409681345,7.93348503112793
-7.913640203677234,7.908665657043457
-7.931814161156377,7.916846752166748
-7.903090094245322,7.910898208618164
-7.946921547407927,7.910754680633545
-7.982923651140671,7.906759738922119
-7.882728704344236,7.886507987976074
-7.931814161156377,7.9636101722717285
-7.9393021526221474,7.942987442016602
-7.924453006674053,7.912123203277588
-7.9430951409681345,7.924835205078125
-7.978810702253626,7.929505825042725
-7.978895913358191,7.9746928215026855
-7.966085998972441,7.9384355545043945
-7.903090094245322,7.915371894836426
-7.954677021213342,7.92073392868042
-7.9737577757544535,7.919029712677002
-7.9393021526221474,7.910412788391113
-7.924453006674053,7.900041103363037
-7.920818811243059,7.92867374420166
-7.931814161156377,7.9202799797058105
-7.954677021213342,7.942184925079346
-7.954677021213342,7.935570240020752
-7.954677021213342,7.929905891418457
-7.954677021213342,7.953151226043701
-7.924453006674053,7.915436744689941
-7.924453006674053,7.920726299285889
-7.935542022791058,7.904749393463135
-7.931814161156377,7.9175310134887695
-7.950781972366453,7.934322834014893
-7.954677021213342,7.970248222351074
-7.954677021213342,7.919041633605957
-7.951006778242098,7.923691272735596
-7.889410352488291,7.938851833343506
-7.924453006674053,7.916509628295898
-7.924453006674053,7.88114595413208
-7.950781972366453,7.947868824005127
-7.9737577757544535,7.950497627258301
-7.924453006674053,7.931183338165283
-7.89962956062971,7.9228596687316895
-7.954677021213342,7.93429708480835
-7.911379335946439,7.895585536956787
-7.847706165863548,7.933376312255859
-7.935542022791058,7.917067050933838
-7.950781972366453,7.890163898468018
-7.954677021213342,7.9190192222595215
-7.950781972366453,7.948915481567383
-7.838693701646425,7.917050838470459
-7.910094953104535,7.907400608062744
-7.928117974144348,7.8922295570373535
-7.982923651140671,7.941021919250488
-7.920818811243059,7.8943610191345215
-7.935542022791058,7.937915325164795
-7.928155902956855,7.935398578643799
-7.886056354845152,7.909852981567383
-7.946921547407927,7.902098655700684
-7.924453006674053,7.923478603363037
-7.9393021526221474,7.923490047454834
-7.924453006674053,7.910768032073975
-7.9430951409681345,7.935019016265869
-7.946921547407927,7.928680419921875
-7.886056354845152,7.944904327392578
-7.89962956062971,7.907015800476074
-7.954677021213342,7.950006008148193
-7.85205769961263,7.895544528961182
-7.928117974144348,7.938955307006836
-7.954677021213342,7.920685291290283
-7.931814161156377,7.930314540863037
-7.9393021526221474,7.928378105163574
-7.954677021213342,7.938567638397217
-7.857113944429969,7.897056579589844
-7.946921547407927,7.901963710784912
-7.950781972366453,7.927657127380371
-7.954677021213342,7.929571628570557
-7.882728704344236,7.906372547149658
-7.950781972366453,7.934707164764404
-7.954677021213342,7.97088098526001
-7.920818811243059,7.898078441619873
-7.950781972366453,7.913060665130615
-7.913640203677234,7.915260314941406
-7.954333871520422,7.915891170501709
-7.920818811243059,7.9144463539123535
-7.950781972366453,7.924368858337402
-7.931814161156377,7.93043327331543
-7.946921547407927,7.9196457862854
-7.924453006674053,7.920468807220459
-7.950781972366453,7.905847072601318
-7.950781972366453,7.9287190437316895
-7.9393021526221474,7.910449981689453
-7.978810702253626,7.964254379272461
-7.89962956062971,7.907740592956543
-7.896196359268842,7.918494701385498
-7.954677021213342,7.9391560554504395
-7.924453006674053,7.92246675491333
-7.931814161156377,7.900784015655518
-7.950781972366453,7.920020580291748
-7.950781972366453,7.918744087219238
-7.935542022791058,7.896291255950928
-7.89962956062971,7.9151997566223145
-7.946921547407927,7.9087982177734375
-7.954677021213342,7.958144664764404
-7.815309402546056,7.919717788696289
-7.924453006674053,7.927731990814209
-7.924453006674053,7.938191890716553
-7.982923651140671,7.9287872314453125
-7.924453006674053,7.938474178314209
-7.954677021213342,7.929931163787842
-7.954677021213342,7.926112174987793
-7.992871189127312,7.958819389343262
-7.91721462968355,7.888233661651611
-7.924453006674053,7.910074710845947
-7.928117974144348,7.904477596282959
-7.995678626217357,7.9331817626953125
-7.91721462968355,7.901332855224609
-7.958607309235428,7.939270496368408
-7.931814161156377,7.927700519561768
-7.860119116630385,7.927226543426514
-7.920818811243059,7.887460708618164
-7.946921547407927,7.952930450439453
-7.9393021526221474,7.916097640991211
-7.946921547407927,7.922357559204102
-7.928117974144348,7.913919925689697
-7.8728955601551585,7.914576053619385
-7.928117974144348,7.910806655883789
-7.954677021213342,7.956847667694092
-7.928117974144348,7.914206027984619
-7.950781972366453,7.918179988861084
-7.950781972366453,7.936378002166748
-7.950781972366453,7.939544677734375
-7.927370286369725,7.90958309173584
-7.954677021213342,7.929806709289551
-7.9430951409681345,7.918132305145264
-7.946921547407927,7.936154842376709
-7.89962956062971,7.909068584442139
-7.924453006674053,7.908149242401123
-7.826774591089415,7.9013285636901855
-7.950781972366453,7.923916339874268
-7.946921547407927,7.9039225578308105
-7.995678626217357,7.931797504425049
-7.924453006674053,7.940261363983154
-7.942889676899551,7.950907230377197
-7.935542022791058,7.912031650543213
-7.924453006674053,7.916175365447998
-7.920818811243059,7.910590171813965
-7.866459873882536,7.924015045166016
-7.920818811243059,7.903665065765381
-7.931814161156377,7.901362895965576
-7.9393021526221474,7.917370319366455
-7.946921547407927,7.927582263946533
-7.9393021526221474,7.89892053604126
-7.950781972366453,7.924807548522949
-7.903090094245322,7.901724338531494
-7.950781972366453,7.908895492553711
-7.924453006674053,7.944596767425537
-7.9430951409681345,7.906765937805176
-7.950781972366453,7.916911602020264
-7.924453006674053,7.91630220413208
-7.9393021526221474,7.950826644897461
-7.89962956062971,7.918692111968994
-7.935542022791058,7.9421305656433105
-7.910094953104535,7.867000102996826
-7.954677021213342,7.942173957824707
-7.935542022791058,7.910458087921143
-7.910313148974003,7.906529903411865
-7.93468629292431,7.942851543426514
-7.935542022791058,7.930253505706787
-7.823919469453418,7.8890252113342285
-7.906578398789698,7.88673734664917
-7.954677021213342,7.943822860717773
-7.835637836224461,7.891830921173096
-7.954677021213342,7.953467845916748
-7.9393021526221474,7.933042049407959
-7.896196359268842,7.946069240570068
-7.928117974144348,7.92219877243042
-7.920818811243059,7.9449968338012695
-7.928117974144348,7.9225850105285645
-7.928117974144348,7.911019802093506
-7.882728704344236,7.887396812438965
-7.924453006674053,7.906342029571533
-7.9393021526221474,7.943669319152832
-7.954677021213342,7.926642894744873
-7.856986114171083,7.90281343460083
-7.954677021213342,7.915480613708496
-7.954677021213342,7.960291862487793
-7.906578398789698,7.904776573181152
-7.913640203677234,7.924619197845459
-7.910094953104535,7.899036884307861
-7.950781972366453,7.954898357391357
-7.924453006674053,7.906472206115723
-7.935542022791058,7.933588027954102
-7.931814161156377,7.9292378425598145
-7.882728704344236,7.901240825653076
-7.924453006674053,7.921322345733643
-7.935542022791058,7.934868812561035
-7.9393021526221474,7.897146701812744
-7.969065592938858,7.941014766693115
-7.950781972366453,7.940967082977295
-7.866185328564197,7.900561332702637
-7.946921547407927,7.9193220138549805
-7.954677021213342,7.92508602142334
-7.950781972366453,7.930664539337158
-7.974694136660875,7.937666893005371
-7.950781972366453,7.915219783782959
-7.954677021213342,7.922549724578857
-7.908269328059997,7.902629375457764
-7.950781972366453,7.965877532958984
-7.928117974144348,7.927582263946533
-7.946921547407927,7.93157434463501
-7.9393021526221474,7.922001361846924
-7.913640203677234,7.891361713409424
-7.931814161156377,7.927421569824219
-7.954677021213342,7.94122314453125
-7.910094953104535,7.9083380699157715
-7.8416326138557455,7.915380001068115
-7.863280055279963,7.884559154510498
-7.9393021526221474,7.97859001159668
-7.935542022791058,7.903645038604736
-7.935542022791058,7.9201788902282715
-7.920818811243059,7.9234395027160645
-7.905275909355806,7.928350925445557
-7.9430951409681345,7.945662498474121
-7.9393021526221474,7.918614864349365
-7.950781972366453,7.939370155334473
-7.950781972366453,7.930507659912109
-7.950781972366453,7.941482067108154
-7.946921547407927,7.9318013191223145
-7.954677021213342,7.935278415679932
-7.9430951409681345,7.91803503036499
-7.9430951409681345,7.940640926361084
-7.950781972366453,7.928407669067383
-7.946921547407927,7.945743560791016
-7.947859240258506,7.922443866729736
-7.954677021213342,7.943436145782471
-7.928117974144348,7.930846691131592
-7.931814161156377,7.918041706085205
-7.9393021526221474,7.898972988128662
-7.853226624745831,7.913833141326904
-7.928117974144348,7.915638446807861
-7.931814161156377,7.920031547546387
-7.879425560900211,7.948238372802734
-7.954677021213342,7.914607524871826
-7.950781972366453,7.92910099029541
-7.896196359268842,7.898701190948486
-7.924453006674053,7.910899639129639
-7.954677021213342,7.9405598640441895
-7.954677021213342,7.93899393081665
-7.928117974144348,7.909095287322998
-7.946921547407927,7.9349236488342285
-7.91721462968355,7.90737247467041
-7.954677021213342,7.937080383300781
-7.950781972366453,7.927184581756592
-7.931814161156377,7.919610977172852
-7.954677021213342,7.941861152648926
-7.91721462968355,7.916774272918701
-7.970532618892763,7.936402797698975
-7.9393021526221474,7.9239420890808105
-7.8728955601551585,7.9265456199646
-7.924453006674053,7.9220356941223145
-7.928117974144348,7.875762462615967
-7.931814161156377,7.90702486038208
-7.9737577757544535,7.931519508361816
-8.022370577841233,7.97755241394043
-7.860119116630385,7.911215305328369
-7.91721462968355,7.897660732269287
-7.905472480221491,7.9217352867126465
-7.8416326138557455,7.9398088455200195
-7.920818811243059,7.9131879806518555
-7.91721462968355,7.905495643615723
-7.9393021526221474,7.940371036529541
-7.920818811243059,7.920095920562744
-7.935542022791058,7.912757873535156
-7.920818811243059,7.9248504638671875
-7.954677021213342,7.950473785400391
-7.841942416353511,7.889549732208252
-7.931814161156377,7.921280860900879
-7.903090094245322,7.918686866760254
-7.928117974144348,7.90044641494751
-7.906578398789698,7.891329765319824
-7.9393021526221474,7.955994129180908
-7.9393021526221474,7.9459428787231445
-7.892790308673911,7.930962085723877
-7.931814161156377,7.919197082519531
-7.931814161156377,7.923701763153076
-7.954677021213342,7.936092853546143
-7.931814161156377,7.937507152557373
-7.928117974144348,7.926662921905518
-7.91721462968355,7.919924259185791
-7.954677021213342,7.927600383758545
-7.950781972366453,7.931886196136475
-7.860119116630385,7.909290313720703
-7.931814161156377,7.916715145111084
-7.950781972366453,7.927896976470947
-7.8349671212224035,7.888851642608643
-7.954677021213342,7.923318862915039
-7.9737577757544535,7.937065601348877
-7.995678626217357,7.914271354675293
-7.9393021526221474,7.914072513580322
-7.9393021526221474,7.907447338104248
-7.950781972366453,7.942073345184326
-7.950781972366453,7.9288225173950195
-7.91721462968355,7.90696382522583
-7.950781972366453,7.930112838745117
-7.950781972366453,7.923617839813232
-7.920818811243059,7.910857677459717
-7.928117974144348,7.943627834320068
-7.954333871520422,7.9579057693481445
-7.950781972366453,7.950675010681152
-7.950781972366453,7.913000583648682
-7.928117974144348,7.918126583099365
-7.946921547407927,7.916801929473877
-7.931814161156377,7.923912525177002
-7.9430951409681345,7.931671142578125
-7.924453006674053,7.919052600860596
-7.954677021213342,7.946899890899658
-7.946921547407927,7.900272846221924
-7.903090094245322,7.8837890625
-7.924453006674053,7.907466888427734
-7.82102305270683,7.872096538543701
-7.954677021213342,7.961480617523193
-7.931814161156377,7.899003505706787
-7.982923651140671,7.933849811553955
-7.950781972366453,7.924971580505371
-7.928117974144348,7.917672157287598
-7.950781972366453,7.929693698883057
-7.9430951409681345,7.898044109344482
-7.911690158781656,7.88773775100708
-7.954677021213342,7.902065753936768
-7.9393021526221474,7.932052135467529
-7.9479076803299105,7.921426296234131
-7.950781972366453,7.933516502380371
-7.954677021213342,7.952837944030762
-7.946921547407927,7.924715995788574
-7.950781972366453,7.951688766479492
-7.950781972366453,7.924882411956787
-7.928117974144348,7.947571277618408
-7.931814161156377,7.921767234802246
-7.946921547407927,7.914018154144287
-7.924453006674053,7.926201343536377
-7.982923651140671,7.883469104766846
-7.829768510087842,7.900891304016113
-7.950781972366453,7.919698715209961
-7.924453006674053,7.939631462097168
-7.931814161156377,7.887934684753418
-7.954677021213342,7.959096431732178
-7.9430951409681345,7.941644191741943
-7.896196359268842,7.912098407745361
-7.995678626217357,7.919495105743408
-7.91721462968355,7.92604923248291
-7.892790308673911,7.931106090545654
-7.931814161156377,7.922821521759033
-7.924453006674053,7.905235767364502
-7.950781972366453,7.929958820343018
-7.838628495628443,7.920968532562256
-7.950781972366453,7.9105072021484375
-7.911016527836275,7.952402114868164
-7.946921547407927,7.9361796379089355
-7.9430951409681345,7.920421123504639
-7.924453006674053,7.903171539306641
-7.9587575167254565,7.900567531585693
-7.924453006674053,7.91240930557251
-7.950781972366453,7.929593086242676
-7.982923651140671,7.9684953689575195
-7.9393021526221474,7.930287837982178
-7.950781972366453,7.9486165046691895
-7.85205769961263,7.911320209503174
-7.950781972366453,7.9234747886657715
-7.928117974144348,7.928349494934082
-7.935542022791058,7.905979633331299
-7.946921547407927,7.936515808105469
-7.954677021213342,7.942421913146973
-7.921323674090253,7.9328107833862305
-7.882728704344236,7.917495250701904
-7.950781972366453,7.944951057434082
-7.913640203677234,7.901540279388428
-7.931814161156377,7.917124271392822
-7.924453006674053,7.911136150360107
-7.954677021213342,7.941641330718994
-7.920818811243059,7.925670623779297
-7.935542022791058,7.930651664733887
-7.856986114171083,7.914947986602783
-7.931814161156377,7.904758930206299
-7.954677021213342,7.946569919586182
-7.950781972366453,7.939755916595459
-7.950781972366453,7.917610168457031
-7.928117974144348,7.915647983551025
-7.978810702253626,7.925227642059326
-7.954677021213342,7.94101095199585
-7.889410352488291,7.9042181968688965
-7.928117974144348,7.90716028213501
-7.856261898513873,7.951853275299072
-7.950781972366453,7.926431179046631
-7.950781972366453,7.925969123840332
-7.946921547407927,7.9474310874938965
-7.9430951409681345,7.938531875610352
-7.924453006674053,7.903100967407227
-7.9393021526221474,7.8935980796813965
-7.950781972366453,7.920947551727295
-7.920818811243059,7.903088569641113
-7.935542022791058,7.901369571685791
-7.928117974144348,7.914762496948242
-7.924453006674053,7.9170613288879395
-7.882728704344236,7.892136573791504
-7.950781972366453,7.927875995635986
-7.931814161156377,7.922247409820557
-7.924453006674053,7.904443740844727
-7.906578398789698,7.888603687286377
-7.920818811243059,7.941111087799072
-7.950781972366453,7.916081428527832
-7.844664854175832,7.9055495262146
-7.924453006674053,7.909403324127197
-7.950781972366453,7.956212043762207
-7.954677021213342,7.948646545410156
-7.928117974144348,7.906578063964844
-7.966576241738391,7.9535956382751465
-7.954677021213342,7.934118270874023
-7.935542022791058,7.909936428070068
-7.924453006674053,7.912502765655518
-7.950781972366453,7.936481952667236
-7.946921547407927,7.920669078826904
-7.882728704344236,7.912548542022705
-7.950781972366453,7.9334397315979
-7.8728955601551585,7.9005045890808105
-7.950781972366453,7.94187593460083
-7.920818811243059,7.919992446899414
-7.954677021213342,7.937973976135254
-7.89962956062971,7.9078850746154785
-7.866459873882536,7.889766216278076
-7.91865271790783,7.932833194732666
-7.866459873882536,7.8974995613098145
-7.928117974144348,7.914179801940918
-7.882728704344236,7.901332378387451
-7.950781972366453,7.940798282623291
-7.920818811243059,7.896714210510254
-7.924453006674053,7.890744686126709
-7.9430951409681345,7.95515251159668
-7.96257349994767,7.915401458740234
-7.931814161156377,7.896221160888672
-7.928117974144348,7.9186930656433105
-7.935542022791058,7.951154708862305
-7.910094953104535,7.930174350738525
-7.946921547407927,7.918514251708984
-7.9430951409681345,7.886041164398193
-7.946921547407927,7.9521260261535645
-7.9393021526221474,7.9232177734375
-7.950781972366453,7.924756050109863
-7.924453006674053,7.910700798034668
-7.946921547407927,7.922569751739502
-7.924453006674053,7.913427829742432
-7.920818811243059,7.9425883293151855
-7.940702296085409,7.9235920906066895
-7.99746214624634,7.981821537017822
-7.974694136660875,7.947657108306885
-7.950781972366453,7.913261413574219
-7.9393021526221474,7.905539035797119
-7.954677021213342,7.947747707366943
-7.9430951409681345,7.913280010223389
-7.966576241738391,7.935471534729004
-7.928117974144348,7.918187618255615
-7.94476951650491,7.9686598777771
-7.954677021213342,7.9141058921813965
-7.954677021213342,7.929689407348633
-7.950781972366453,7.946065425872803
-7.89962956062971,7.918393611907959
-7.931814161156377,7.898850917816162
-7.9393021526221474,7.936020851135254
-7.950781972366453,7.940335750579834
-7.954677021213342,7.930408000946045
-7.950781972366453,7.933777809143066
-7.863280055279963,7.888399600982666
-7.9430951409681345,7.92333459854126
-7.950781972366453,7.930660724639893
-7.8728955601551585,7.892178058624268
-7.91721462968355,7.91894006729126
-7.931814161156377,7.908216953277588
-7.9430951409681345,7.924620151519775
-7.954677021213342,7.932272911071777
-7.928117974144348,7.922977924346924
-7.950781972366453,7.936743259429932
-7.954677021213342,7.923404216766357
-7.910313148974003,7.922887802124023
-7.920818811243059,7.892028331756592
-7.954677021213342,7.954057216644287
-7.931814161156377,7.895998477935791
-7.89962956062971,7.9268999099731445
-7.8761493177145505,7.917527675628662
-7.943055911701025,7.939458847045898
-7.880892069031858,7.902939319610596
-7.924453006674053,7.904994487762451
-7.913640203677234,7.919895648956299
-7.924453006674053,7.914637088775635
-7.889410352488291,7.891081809997559
-7.950781972366453,7.923896312713623
-7.935542022791058,7.909509181976318
-7.924453006674053,7.905529499053955
-7.93468629292431,7.943587303161621
-7.950781972366453,7.91738748550415
-7.950781972366453,7.918185710906982
-7.954677021213342,7.953317165374756
-7.975453335860696,7.951301097869873
-7.928117974144348,7.918703556060791
-7.910094953104535,7.898536682128906
-7.943705240495888,7.905142307281494
-7.9393021526221474,7.914400100708008
-7.954677021213342,7.9353251457214355
-7.954677021213342,7.925859451293945
-8.008819571765459,7.985057830810547
-7.920818811243059,7.9125800132751465
-7.950781972366453,7.915175914764404
-7.950781972366453,7.942368030548096
-7.924453006674053,7.921116828918457
-7.9430951409681345,7.931808948516846
-7.903090094245322,7.9012885093688965
-7.954677021213342,7.889637470245361
-7.906578398789698,7.8853864669799805
-7.950781972366453,7.972387790679932
-7.950781972366453,7.914822578430176
-7.950781972366453,7.931930065155029
-7.9430951409681345,7.942409992218018
-7.924453006674053,7.9439568519592285
-7.982966659490206,7.958277702331543
-7.950781972366453,7.953125953674316
-7.954677021213342,7.934637546539307
-7.950781972366453,7.953474998474121
-7.954677021213342,7.938582897186279
-7.950781972366453,7.941850185394287
-7.946921547407927,7.954433441162109
-7.910094953104535,7.910159111022949
-7.924453006674053,7.9027628898620605
-7.910094953104535,7.911509037017822
-7.935542022791058,7.9247589111328125
-7.943095160397098,7.927372455596924
-7.931814161156377,7.923959732055664
-7.934954607052369,7.925753593444824
-7.928117974144348,7.928600788116455
-7.934523230454486,7.88903284072876
-7.946921547407927,7.967097282409668
-7.950781972366453,7.93989896774292
-7.931814161156377,7.917605400085449
-7.987162773987728,7.9582414627075195
-7.9393021526221474,7.940566539764404
-7.970532618892763,7.952709674835205
-7.924453006674053,7.932257175445557
-7.935542022791058,7.930215835571289
-7.9430951409681345,7.924154281616211
-7.946921547407927,7.9210076332092285
-7.954677021213342,7.9380574226379395
-7.906578398789698,7.905893802642822
-7.950781972366453,7.928002834320068
-7.946921547407927,7.931747913360596
-7.891790467655871,7.883255958557129
-7.91721462968355,7.900120258331299
-7.950781972366453,7.954708099365234
-7.978810702253626,7.934746265411377
-7.9430951409681345,7.912291049957275
-7.954677021213342,7.948437690734863
-7.954677021213342,7.929340839385986
-7.9430951409681345,7.9010138511657715
-7.950781972366453,7.92112922668457
-7.946921547407927,7.93787145614624
-7.924453006674053,7.911605358123779
-7.943055911701025,7.952228546142578
-7.945802750156343,7.924005031585693
-7.910094953104535,7.913367748260498
-7.8704148050425236,7.934700012207031
-7.913640203677234,7.905182361602783
-7.954677021213342,7.9473700523376465
-7.91721462968355,7.896972179412842
-7.9393021526221474,7.90463399887085
-7.935542022791058,7.923115253448486
-7.928117974144348,7.9013352394104
-7.882728704344236,7.9259796142578125
-7.931814161156377,7.913476943969727
-7.924453006674053,7.919836521148682
-7.966617665152964,7.947798728942871
-7.954677021213342,7.9544548988342285
-7.9393021526221474,7.914582252502441
-7.866459873882536,7.90070104598999
-7.9737577757544535,7.908203601837158
-7.954677021213342,7.937548637390137
-7.9393021526221474,7.927672863006592
-7.91721462968355,7.918105602264404
-7.950781972366453,7.933224201202393
-7.920818811243059,7.913949966430664
-8.040958607678906,7.947937488555908
-7.950781972366453,7.920361042022705
-7.838628495628443,7.914071083068848
-7.954677021213342,7.921915054321289
-7.882728704344236,7.9146270751953125
-7.950781972366453,7.942415237426758
-7.950781972366453,7.938578128814697
-7.896196359268842,7.917288780212402
-7.954677021213342,7.930814266204834
-7.928117974144348,7.908420085906982
-7.950781972366453,7.941546440124512
-7.954677021213342,7.9312663078308105
-7.842856529162001,7.921393871307373
-7.931814161156377,7.9089765548706055
-7.954677021213342,7.944906711578369
-7.950781972366453,7.961308002471924
-7.920818811243059,7.9256720542907715
-7.889410352488291,7.8947367668151855
-7.970532618892763,7.959871768951416
-7.954677021213342,7.9334187507629395
-7.950781972366453,7.927462100982666
-7.9393021526221474,7.933590888977051
-7.9367221576035965,7.911535739898682
-7.947685597102714,7.9311699867248535
-7.932370292702363,7.911890506744385
-7.948847473653619,7.935977458953857
-7.970532618892763,7.971120834350586
-7.935542022791058,7.9280009269714355
-7.950781972366453,7.932623386383057
-7.931814161156377,7.911894798278809
-7.924453006674053,7.893367767333984
-7.881214383716381,7.897684097290039
-7.950781972366453,7.9200005531311035
-7.950781972366453,7.928298473358154
-7.9430951409681345,7.924355983734131
-7.928117974144348,7.900101184844971
-7.935542022791058,7.892348289489746
-7.982966659490206,7.919831275939941
-7.950781972366453,7.9353556632995605
-7.856986114171083,7.924219608306885
-7.950781972366453,7.9318413734436035
-7.9393021526221474,7.9310383796691895
-7.924453006674053,7.909484386444092
-7.954677021213342,7.900467872619629
-7.931814161156377,7.9130449295043945
-7.950781972366453,7.925540447235107
-7.950781972366453,7.922119617462158
-7.893684507036385,7.932040214538574
-7.974694136660875,7.932041645050049
-7.935542022791058,7.905777931213379
-7.954677021213342,7.931386470794678
-7.928117974144348,7.924908638000488
-7.928117974144348,7.923821926116943
-7.946921547407927,7.939865589141846
-7.889410352488291,7.9136433601379395
-7.946921547407927,7.913553714752197
-7.869665979871627,7.904784679412842
-7.9913998274291025,7.952367305755615
-7.982923651140671,7.942671775817871
-7.896196359268842,7.922252655029297
-7.950781972366453,7.949433326721191
-7.9393021526221474,7.934169292449951
-7.954677021213342,7.924952983856201
-7.946921547407927,7.932884216308594
-7.928117974144348,7.906587600708008
-7.954677021213342,7.923872947692871
-7.950781972366453,7.920816898345947
-7.928117974144348,7.912055015563965
-7.866459873882536,7.895507335662842
-7.928117974144348,7.937881946563721
-7.9393021526221474,7.919209957122803
-7.946921547407927,7.9287109375
-7.913640203677234,7.9277167320251465
-7.924453006674053,7.927552223205566
-7.970532618892763,7.919530391693115
-7.910094953104535,7.9023261070251465
-7.886056354845152,7.9041523933410645
-7.950781972366453,7.938510417938232
-7.946921547407927,7.924980163574219
-7.966617665152964,7.960892677307129
-7.946921547407927,7.9219136238098145
-7.9430951409681345,7.921431541442871
-7.954677021213342,7.924994468688965
-7.924453006674053,7.91642951965332
-7.950781972366453,7.934859275817871
-7.910094953104535,7.926700115203857
-7.950781972366453,7.914190769195557
-7.950781972366453,7.915709972381592
-7.920818811243059,7.893049716949463
-7.946921547407927,7.930988311767578
-7.910094953104535,7.8874735832214355
-7.920956437028112,7.910346508026123
-7.8728955601551585,7.894937992095947
-7.931814161156377,7.919309139251709
-7.946921547407927,7.9133620262146
-7.9430951409681345,7.936285018920898
-7.906578398789698,7.910614490509033
-7.9393021526221474,7.911463737487793
-7.950781972366453,7.9140238761901855
-7.9430951409681345,7.911650657653809
-7.950781972366453,7.93191385269165
-7.9393021526221474,7.930121421813965
-7.954677021213342,7.954733371734619
-7.89962956062971,7.906328201293945
-7.910094953104535,7.935695648193359
-7.954677021213342,7.924363613128662
-7.924453006674053,7.912396430969238
-7.9430951409681345,7.9117302894592285
-7.903090094245322,7.907552719116211
-7.91721462968355,7.909042835235596
-7.920818811243059,7.93640661239624
-7.954677021213342,7.943867206573486
-7.970616219270671,7.9121599197387695
-7.950781972366453,7.911996364593506
-7.931814161156377,7.919405460357666
-7.928117974144348,7.916449069976807
-7.950781972366453,7.9485321044921875
-7.931814161156377,7.945196151733398
-7.920818811243059,7.934120178222656
-7.924453006674053,7.923490524291992
-7.932979898863743,7.923136234283447
-7.954677021213342,7.936283588409424
-7.920818811243059,7.891661643981934
-7.946921547407927,7.938661575317383
-7.954677021213342,7.941669940948486
-7.9393021526221474,7.920947551727295
-7.885953431936095,7.893089771270752
-7.950781972366453,7.920786380767822
-7.879425560900211,7.906468868255615
-7.838628495628443,7.898521423339844
-7.924453006674053,7.920788288116455
-7.950781972366453,7.948402404785156
-7.9430951409681345,7.94400691986084
-7.910094953104535,7.896363258361816
-7.931814161156377,7.913014888763428
-7.950781972366453,7.934865474700928
-7.9430951409681345,7.927569389343262
-7.924453006674053,7.891737461090088
-7.818151283467686,7.902412414550781
-8.022370577841233,7.957677364349365
-7.950781972366453,7.883391857147217
-7.954677021213342,7.942282199859619
-7.935542022791058,7.919305801391602
-7.9737577757544535,7.959024429321289
-7.928117974144348,7.880001068115234
-7.915067073469715,7.9026288986206055
-7.89962956062971,7.894161701202393
-7.9479076803299105,7.924865245819092
-7.924453006674053,7.9143242835998535
-7.954677021213342,7.952543258666992
-7.9430951409681345,7.916675567626953
-7.920818811243059,7.894211292266846
-7.928117974144348,7.945889949798584
-7.948172776799763,7.949663162231445
-7.910094953104535,7.906106472015381
-7.954677021213342,7.913959980010986
-7.958607309235428,7.944753646850586
-7.928117974144348,7.914531230926514
-7.9737577757544535,7.943611145019531
-7.87543550142629,7.891418933868408
-7.954677021213342,7.9404473304748535
-7.928117974144348,7.909670352935791
-7.924453006674053,7.927165985107422
-7.91721462968355,7.953172206878662
-7.935542022791058,7.900131702423096
-7.954677021213342,7.9282002449035645
-7.935542022791058,7.9128737449646
-7.954677021213342,7.924319744110107
-7.949130633177768,7.900895595550537
-7.924453006674053,7.943953990936279
-7.950781972366453,7.93278169631958
-7.931814161156377,7.893360137939453
-7.863280055279963,7.9078450202941895
-7.970532618892763,7.9593329429626465
-7.910094953104535,7.925199031829834
-7.92729567327985,7.9474196434021
-7.954677021213342,7.903007984161377
-7.9393021526221474,7.9331955909729
-7.9393021526221474,7.91212797164917
-7.982923651140671,7.9299774169921875
-7.910094953104535,7.904043674468994
-7.950781972366453,7.962341785430908
-7.950781972366453,7.939655780792236
-7.920818811243059,7.888741493225098
-7.896125840447619,7.896247386932373
-7.91721462968355,7.901601314544678
-7.913640203677234,7.9288649559021
-7.954677021213342,7.917666435241699
-7.9393021526221474,7.917311668395996
-7.924453006674053,7.922107696533203
-7.844664854175832,7.890726566314697
-7.950781972366453,7.931491374969482
-7.830984932712759,7.897816181182861
-7.9393021526221474,7.927728176116943
-7.935542022791058,7.915432453155518
-7.931814161156377,7.878586292266846
-7.9393021526221474,7.906703472137451
-7.920818811243059,7.900196075439453
-7.928117974144348,7.92149019241333
-7.950781972366453,7.922008037567139
-7.935542022791058,7.905796527862549
-7.946921547407927,7.914453983306885
-7.954677021213342,7.9363627433776855
-7.964781356411861,7.9468607902526855
-7.9430951409681345,7.951401710510254
-7.910094953104535,7.894592761993408
-7.931814161156377,7.944163799285889
-7.950781972366453,7.9163994789123535
-7.950781972366453,7.928534030914307
-7.908118640017608,7.887989521026611
-7.935542022791058,7.92189884185791
-7.85078088734462,7.917072296142578
-7.9393021526221474,7.91517972946167
-7.913640203677234,7.896347999572754
-7.924453006674053,7.918762683868408
-7.950781972366453,7.934527397155762
-7.85078088734462,7.920170307159424
-7.950781972366453,7.929323196411133
-7.911690158781656,7.901870250701904
-7.954677021213342,7.940266132354736
-7.9430951409681345,7.931628704071045
-7.950781972366453,7.935885906219482
-7.866459873882536,7.8900556564331055
-7.854304717060746,7.884627819061279
-7.950781972366453,7.964907169342041
-7.950781972366453,7.963903427124023
-7.950781972366453,7.9477996826171875
-7.946921547407927,7.914284706115723
-7.9430951409681345,7.9374098777771
-7.928117974144348,7.920665740966797
-7.946921547407927,7.982178211212158
-7.923581356476356,7.908475399017334
-7.950781972366453,7.943221569061279
-7.825685176283933,7.899283409118652
-7.931814161156377,7.927513122558594
-7.946921547407927,7.936587810516357
-7.954677021213342,7.944091320037842
-7.9393021526221474,7.906362533569336
-7.924453006674053,7.920162677764893
-7.954677021213342,7.936878681182861
-7.928117974144348,7.9271464347839355
-7.950781972366453,7.937026023864746
-7.952725130123009,7.941376686096191
-7.924453006674053,7.931053638458252
-7.920818811243059,7.90576696395874
-7.9393021526221474,7.898011684417725
-7.952909203067603,7.919376850128174
-7.904464059571048,7.895599842071533
-7.970616219270671,7.932478904724121
-7.9430951409681345,7.9131951332092285
-7.935542022791058,7.91288423538208
-7.950781972366453,7.931424140930176
-7.950781972366453,7.9222731590271
-7.924453006674053,7.919193744659424
-7.954677021213342,7.94870138168335
-7.924453006674053,7.904712677001953
-7.954677021213342,7.912990093231201
-7.920818811243059,7.901687145233154
-7.896196359268842,7.925563812255859
-7.946921547407927,7.896574020385742
-7.950781972366453,7.930816650390625
-7.924453006674053,7.925622940063477
-7.903090094245322,7.917423725128174
-7.935542022791058,7.920773029327393
-7.950781972366453,7.9317755699157715
-7.9393021526221474,7.912852764129639
-7.931814161156377,7.90391206741333
-7.950781972366453,7.92911958694458
-7.913640203677234,7.921014308929443
-7.966576241738391,7.975746154785156
-7.931814161156377,7.943845748901367
-7.878606331107103,7.9075140953063965
-7.950781972366453,7.922128200531006
-7.886056354845152,7.926023960113525
-7.954677021213342,7.9394965171813965
-7.920818811243059,7.897205829620361
-7.950781972366453,7.93882942199707
-7.954677021213342,7.945825099945068
-7.906578398789698,7.914555072784424
-7.847706165863548,7.898061275482178
-7.946921547407927,7.93157958984375
-7.906542242015022,7.92892599105835
-7.946921547407927,7.9178338050842285
-7.946921547407927,7.907555103302002
-7.928117974144348,7.931141376495361
-7.954677021213342,7.926921367645264
-7.9393021526221474,7.923437118530273
-7.946921547407927,7.911370277404785
-7.818151283467686,7.8589582443237305
-7.924453006674053,7.907040596008301
-7.91721462968355,7.9302473068237305
-7.950781972366453,7.933340549468994
-7.910094953104535,7.907223224639893
-7.896196359268842,7.899946212768555
-7.924453006674053,7.961635589599609
-7.924453006674053,7.947490215301514
-7.9393021526221474,7.934790134429932
-7.910094953104535,7.915229797363281
-7.910094953104535,7.907301425933838
-7.950781972366453,7.928587913513184
-7.9393021526221474,7.951694965362549
-7.931814161156377,7.926726818084717
-7.9430951409681345,7.9327263832092285
-7.954677021213342,7.9140543937683105
-7.9430951409681345,7.906062126159668
-7.954677021213342,7.93513298034668
-7.954677021213342,7.965163230895996
-7.920818811243059,7.914087772369385
-7.970616219270671,7.94562292098999
-7.946921547407927,7.927567958831787
-7.920818811243059,7.926749229431152
-7.977975326564206,7.950913906097412
-7.889410352488291,7.932326793670654
-7.9393021526221474,7.939302921295166
-7.954677021213342,7.922728538513184
-7.924453006674053,7.910990238189697
-7.950781972366453,7.900513172149658
-7.931814161156377,7.8910393714904785
-7.935542022791058,7.939055919647217
-7.946921547407927,7.925134658813477
-7.9393021526221474,7.923576831817627
-7.896196359268842,7.90700101852417
-7.950781972366453,7.940774917602539
-7.9737577757544535,7.926558017730713
-7.855305266277571,7.924798965454102
-7.954677021213342,7.935338497161865
-7.91721462968355,7.916940689086914
-7.9200659509493825,7.929725646972656
-7.950781972366453,7.940277099609375
-7.9393021526221474,7.9165143966674805
-7.946921547407927,7.9253764152526855
-7.950781972366453,7.927526950836182
-7.935542022791058,7.913519382476807
-7.913640203677234,7.897265911102295
-7.946921547407927,7.9136857986450195
-7.946921547407927,7.950336456298828
-7.939379961634402,7.904984951019287
-7.920818811243059,7.908226490020752
-7.889410352488291,7.9210286140441895
-7.882728704344236,7.882791996002197
-7.91721462968355,7.904539585113525
-7.892790308673911,7.896660327911377
-7.920818811243059,7.927646160125732
-7.928117974144348,7.926736354827881
-7.924453006674053,7.9218645095825195
-7.9430951409681345,7.890005588531494
-7.935542022791058,7.9341206550598145
-7.9200659509493825,7.92642068862915
-7.950781972366453,7.941831588745117
-8.008819571765459,7.9825215339660645
-7.928117974144348,7.914129257202148
-7.9430951409681345,7.887734889984131
-7.920818811243059,7.915406703948975
-7.954677021213342,7.925711154937744
-7.924453006674053,7.907596588134766
-7.974694136660875,7.931519508361816
-7.882728704344236,7.909737586975098
-7.953736512549211,7.918009281158447
-7.928117974144348,7.923494815826416
-7.950781972366453,7.915014743804932
-7.950781972366453,7.935057163238525
-7.924453006674053,7.912888526916504
-7.924453006674053,7.917747974395752
-7.913640203677234,7.90903902053833
-7.896196359268842,7.927576541900635
-7.950781972366453,7.94157600402832
-7.869665979871627,7.911684513092041
-7.931814161156377,7.897535800933838
-7.9393021526221474,7.935204982757568
-7.946921547407927,7.913029193878174
-7.9393021526221474,7.952368259429932
-7.995678626217357,7.912534236907959
-7.9430951409681345,7.936964511871338
-7.950781972366453,7.919654846191406
-7.913640203677234,7.942785739898682
-7.954677021213342,7.938418865203857
-7.9393021526221474,7.911091327667236
-7.946921547407927,7.922268390655518
-7.906578398789698,7.920784950256348
-7.924453006674053,7.942684650421143
-7.931814161156377,7.902596950531006
-7.970532618892763,7.958620548248291
-7.913640203677234,7.895637035369873
-7.9430951409681345,7.922094821929932
-7.946921547407927,7.940639972686768
-7.89962956062971,7.909814357757568
-7.9430951409681345,7.944713115692139
-7.946921547407927,7.952023506164551
-7.910094953104535,7.926960468292236
-7.897865062681166,7.937551021575928
-7.954677021213342,7.919403076171875
-7.910094953104535,7.905874252319336
-7.946921547407927,7.927841663360596
-7.954677021213342,7.937887668609619
-7.9430951409681345,7.936148166656494
-7.950781972366453,7.940647602081299
-7.91721462968355,7.897327899932861
-7.950781972366453,7.915354251861572
-7.888606117307137,7.946654796600342
-7.950781972366453,7.907255172729492
-7.8728955601551585,7.919665813446045
-7.928117974144348,7.899130344390869
-7.924453006674053,7.9123101234436035
-7.954677021213342,7.914530277252197
-7.946921547407927,7.946780681610107
-7.931814161156377,7.928336143493652
-7.950781972366453,7.915816783905029
-7.9393021526221474,7.920217990875244
-7.924453006674053,7.911268711090088
-7.935542022791058,7.941099166870117
-7.8565729081096825,7.908285140991211
-7.950781972366453,7.943935871124268
-7.924453006674053,7.911234378814697
-7.931814161156377,7.8955793380737305
-7.896708615962599,7.916839122772217
-7.954677021213342,7.957640171051025
-7.935542022791058,7.897372722625732
-7.9393021526221474,7.931708812713623
-7.85078088734462,7.89967155456543
-8.008819571765459,7.976258754730225
-7.950781972366453,7.920018196105957
-7.928117974144348,7.949118137359619
-7.950781972366453,7.930075645446777
-7.946921547407927,7.929050922393799
-7.9393021526221474,7.891763687133789
-7.920818811243059,7.893765926361084
-7.920818811243059,7.911397457122803
-7.950781972366453,7.923598289489746
-7.924453006674053,7.921043872833252
-7.886056354845152,7.936518669128418
-7.931814161156377,7.9133710861206055
-7.995678626217357,7.968595027923584
-7.954677021213342,7.952004909515381
-7.924453006674053,7.902956485748291
-7.982923651140671,7.940361499786377
-7.935542022791058,7.921019077301025
-7.9393021526221474,7.904918670654297
-7.931814161156377,7.938397407531738
-7.9200135653594685,7.932182788848877
-7.954677021213342,7.951397895812988
-7.950781972366453,7.929332256317139
-7.924453006674053,7.907958507537842
-7.954677021213342,7.942576885223389
-7.950781972366453,7.942402362823486
-7.924453006674053,7.907254695892334
-7.954677021213342,7.941165447235107
-7.913640203677234,7.925216197967529
-7.935542022791058,7.9289631843566895
-7.920818811243059,7.940943717956543
-7.995678626217357,7.938278675079346
-7.906578398789698,7.897494792938232
-7.96257349994767,7.923800945281982
-7.931814161156377,7.901243209838867
-7.950781972366453,7.902999401092529
-7.950781972366453,7.915415287017822
-7.954677021213342,7.953303813934326
-7.943055911701025,7.9090256690979
-7.954677021213342,7.9308552742004395
-7.950781972366453,7.939356327056885
-7.920818811243059,7.89211368560791
-7.950781972366453,7.939286708831787
-7.85078088734462,7.9038872718811035
-7.924453006674053,7.898099899291992
-7.954677021213342,7.955037593841553
-7.874518114023228,7.930491924285889
-7.928117974144348,7.904856204986572
-7.954677021213342,7.943634510040283
-7.950781972366453,7.920767307281494
-7.931814161156377,7.91180419921875
-7.946921547407927,7.963564395904541
-7.928117974144348,7.926893711090088
-7.924453006674053,7.946285247802734
-7.920818811243059,7.904825210571289
-7.9430951409681345,7.934185028076172
-7.982923651140671,7.922024250030518
-7.946921547407927,7.944929122924805
-7.970532618892763,7.965569019317627
-7.924453006674053,7.91424560546875
-7.924100333951067,7.9059977531433105
-7.9393021526221474,7.946683883666992
-7.935542022791058,7.9061503410339355
-7.950781972366453,7.916054725646973
-7.950781972366453,7.930391788482666
-7.920818811243059,7.918447494506836
-7.954677021213342,7.932562351226807
-7.931814161156377,7.905574321746826
-7.920818811243059,7.93439245223999
-7.954677021213342,7.944095134735107
-7.954677021213342,7.9287333488464355
-7.946921547407927,7.913140296936035
-7.946921547407927,7.923645496368408
-7.954677021213342,7.957331657409668
-7.954677021213342,7.918733596801758
-7.946921547407927,7.916380882263184
-7.935542022791058,7.909292697906494
-7.9430951409681345,7.9236860275268555
-7.9393021526221474,7.93823766708374
-7.9393021526221474,7.922290325164795
-7.869665979871627,7.929460048675537
-7.954677021213342,7.964510440826416
-7.950781972366453,7.926044940948486
-7.931814161156377,7.914694309234619
-7.924453006674053,7.917550086975098
-7.954677021213342,7.916762351989746
-7.928117974144348,7.9125447273254395
-7.896196359268842,7.906635761260986
-7.982923651140671,7.956446647644043
-7.924453006674053,7.907932758331299
-7.978810702253626,7.94192361831665
-7.924453006674053,7.889948844909668
-7.982923651140671,7.926158428192139
-7.935542022791058,7.93954610824585
-7.928117974144348,7.916049480438232
-7.8728955601551585,7.901423931121826
-7.935542022791058,7.911032199859619
-7.96257349994767,7.943419456481934
-7.950781972366453,7.918778419494629
-7.910094953104535,7.932584285736084
-7.9430951409681345,7.947735786437988
-7.950781972366453,7.900838851928711
-7.9430951409681345,7.910638809204102
-7.89962956062971,7.9052815437316895
-7.9393021526221474,7.892250061035156
-7.9737577757544535,7.951843738555908
-7.9393021526221474,7.932024002075195
-7.9393021526221474,7.920362949371338
-7.954677021213342,7.894830226898193
-7.950781972366453,7.935834884643555
-7.949316049435304,7.912918567657471
-7.931814161156377,7.906813144683838
-7.954677021213342,7.9512128829956055
-7.924453006674053,7.922945499420166
-7.924453006674053,7.91481876373291
-7.928117974144348,7.91779088973999
-7.954677021213342,7.949427127838135
-7.954677021213342,7.9439377784729
-7.954677021213342,7.961580753326416
-7.931814161156377,7.929372787475586
-7.954677021213342,7.9113264083862305
-7.954677021213342,7.9235453605651855
-7.935542022791058,7.912359714508057
-7.9430951409681345,7.948553562164307
-7.954677021213342,7.929694175720215
-7.950781972366453,7.937262535095215
-7.954677021213342,7.940699577331543
-7.9430951409681345,7.912814617156982
-7.862652575359676,7.94613790512085
-7.889410352488291,7.890191078186035
-7.950781972366453,7.961325168609619
-7.9393021526221474,7.909732341766357
-7.95090181210265,7.981686592102051
-7.9393021526221474,7.924167156219482
-7.954677021213342,7.9365715980529785
-7.954677021213342,7.93280553817749
-7.924453006674053,7.911734580993652
-7.882728704344236,7.8910651206970215
-7.931814161156377,7.9149956703186035
-7.913640203677234,7.903398513793945
-7.950781972366453,7.922853946685791
-7.931814161156377,7.935957908630371
-7.959191151416267,7.9231791496276855
-7.9393021526221474,7.926488399505615
-7.946921547407927,7.912108898162842
-7.954677021213342,7.950262069702148
-7.9393021526221474,7.939072132110596
-7.9430951409681345,7.940016746520996
-7.954677021213342,7.948333740234375
-7.995678626217357,7.925782680511475
-7.9430951409681345,7.918472766876221
-7.954060896220394,7.955150127410889
-7.9393021526221474,7.905330181121826
-7.954677021213342,7.954395771026611
-7.889549016187033,7.947727680206299
-7.9393021526221474,7.914315223693848
-7.950781972366453,7.910725116729736
-7.950241642100192,7.940218925476074
-7.91721462968355,7.900683403015137
-7.827702142900784,7.847646713256836
-7.860119116630385,7.898243427276611
-7.935542022791058,7.902416706085205
-7.924453006674053,7.911531925201416
-7.924453006674053,7.909832954406738
-7.935542022791058,7.892276763916016
-7.9393021526221474,7.913154602050781
-7.896196359268842,7.927600383758545
-7.9393021526221474,7.9162116050720215
-7.982923651140671,7.933034420013428
-7.920818811243059,7.898920059204102
-8.003443541216441,7.999142169952393
-7.913640203677234,7.934432506561279
-7.935542022791058,7.906127452850342
-7.920818811243059,7.928625583648682
-7.860119116630385,7.9165544509887695
-7.931814161156377,7.910127639770508
-7.946921547407927,7.927515983581543
-7.924453006674053,7.915151119232178
-7.946921547407927,7.917046070098877
-7.954677021213342,7.927292346954346
-7.950781972366453,7.928961753845215
-7.950781972366453,7.929141521453857
-7.846679045568875,7.918079853057861
-7.946921547407927,7.9239325523376465
-7.935542022791058,7.914181232452393
-7.954677021213342,7.893070697784424
-7.950781972366453,7.964941024780273
-7.838628495628443,7.909336566925049
-7.935542022791058,7.903459072113037
-7.954677021213342,7.941281318664551
-7.954677021213342,7.944199085235596
-7.954677021213342,7.95222806930542
-7.950781972366453,7.950747489929199
-7.954677021213342,7.938748836517334
-7.91375018033154,7.864955425262451
-7.950781972366453,7.937370777130127
-7.950781972366453,7.9515299797058105
-7.863280055279963,7.880992889404297
-7.928117974144348,7.922604084014893
-7.931814161156377,7.922268867492676
-7.950781972366453,7.96897554397583
-7.935542022791058,7.896617412567139
-7.954677021213342,7.94712495803833
-7.9393021526221474,7.9185075759887695
-7.950781972366453,7.941677093505859
-7.91721462968355,7.916574478149414
-7.920818811243059,7.925649166107178
-7.946921547407927,7.916263103485107
-7.950781972366453,7.932318687438965
-7.928117974144348,7.937073707580566
-7.954677021213342,7.9382500648498535
-7.954677021213342,7.954840660095215
-7.920818811243059,7.9242262840271
-7.928117974144348,7.901423454284668
-7.9393021526221474,7.919160842895508
-7.9737577757544535,7.943158149719238
-7.9393021526221474,7.9369072914123535
-7.924453006674053,7.909110069274902
-7.9430951409681345,7.926514625549316
-7.995678626217357,7.966015815734863
-7.931814161156377,7.892905235290527
-7.920818811243059,7.899129867553711
-7.91721462968355,7.92557954788208
-7.924453006674053,7.891861438751221
-7.896196359268842,7.899495601654053
-7.931814161156377,7.911656856536865
-7.995678626217357,7.952922344207764
-7.924453006674053,7.890169143676758
-7.9430951409681345,7.958154201507568
-7.920818811243059,7.901163578033447
-7.946921547407927,7.916862487792969
-7.928117974144348,7.921843528747559
-7.9393021526221474,7.9226555824279785
-7.924453006674053,7.9184889793396
-7.928117974144348,7.919635772705078
-7.93765506239242,7.9172139167785645
-7.954677021213342,7.92450475692749
-7.978895913358191,7.971869945526123
-7.89933181335733,7.917412281036377
-7.9430951409681345,7.943409442901611
-7.9335681432273475,7.913113594055176
-7.935542022791058,7.9266157150268555
-7.950781972366453,7.911586284637451
-7.935542022791058,7.926952838897705
-7.954677021213342,7.91957950592041
-7.863280055279963,7.929710865020752
-7.9430951409681345,7.894581317901611
-7.892790308673911,7.928950309753418
-7.844664854175832,7.889490127563477
-7.924453006674053,7.914597988128662
-7.9430951409681345,7.907029628753662
-7.946921547407927,7.922342300415039
-7.91721462968355,7.930421352386475
-7.919802320224209,7.923235893249512
-7.946921547407927,7.941900253295898
-7.928117974144348,7.918697357177734
-7.9393021526221474,7.919968128204346
-7.9430951409681345,7.922793865203857
-7.879425560900211,7.937270164489746
-7.9430951409681345,7.9312567710876465
-7.978810702253626,7.925756931304932
-7.970532618892763,7.937930583953857
-7.9393021526221474,7.89560079574585
-7.8853617063081884,7.937865257263184
-7.931814161156377,7.905185222625732
-7.91721462968355,7.922340393066406
-7.946921547407927,7.904009819030762
-7.954677021213342,7.92218542098999
-7.913640203677234,7.923178672790527
-7.853872762493711,7.933213710784912
-7.920818811243059,7.91461706161499
-7.970532618892763,7.950027942657471
-7.910094953104535,7.912230491638184
-7.931814161156377,7.9143385887146
-7.931814161156377,7.916726589202881
-7.954677021213342,7.900750637054443
-7.954677021213342,7.9248151779174805
-7.935542022791058,7.938473701477051
-7.954677021213342,7.947335243225098
-7.954677021213342,7.936472415924072
-7.931814161156377,7.923398971557617
-7.950781972366453,7.956197738647461
-7.946921547407927,7.918756008148193
-7.935542022791058,7.909204959869385
-7.928117974144348,7.924879550933838
-7.954677021213342,7.949399948120117
-7.950781972366453,7.9390788078308105
-7.928117974144348,7.917273044586182
-7.863280055279963,7.918713092803955
-7.950781972366453,7.91139554977417
-7.931814161156377,7.940476417541504
-7.9393021526221474,7.943078517913818
-7.950781972366453,7.911096096038818
-7.970532618892763,7.965615749359131
-7.928117974144348,7.912405490875244
-7.946921547407927,7.920175075531006
-7.9393021526221474,7.949859142303467
-7.9393021526221474,7.897315502166748
-7.966617665152964,7.931203365325928
-7.86826275483874,7.913186550140381
-7.950781972366453,7.925700664520264
-7.954677021213342,7.940186977386475
-7.9430951409681345,7.922031402587891
-7.924453006674053,7.934566020965576
-7.924453006674053,7.884445667266846
-7.924453006674053,7.917716026306152
-7.931814161156377,7.914651393890381
-7.9393021526221474,7.93713903427124
-7.950781972366453,7.930487155914307
-7.910094953104535,7.885446548461914
-7.950781972366453,7.923312664031982
-7.8728955601551585,7.899725914001465
-7.950781972366453,7.927145957946777
-7.9430951409681345,7.935558795928955
-7.9430951409681345,7.941714286804199
-7.935542022791058,7.906283855438232
-7.9393021526221474,7.9228692054748535
-7.950781972366453,7.93611478805542
-7.928117974144348,7.898430347442627
-7.928117974144348,7.9302568435668945
-7.950781972366453,7.929888725280762
-7.9393021526221474,7.944319725036621
-7.866185328564197,7.8866119384765625
-7.924453006674053,7.921191692352295
-7.935542022791058,7.908371448516846
-7.924453006674053,7.935790538787842
-7.928117974144348,7.901828289031982
-7.946921547407927,7.919030666351318
-7.89962956062971,7.924404621124268
-7.856986114171083,7.896499156951904
-7.931814161156377,7.91222620010376
-7.935542022791058,7.942720890045166
-7.950781972366453,7.952547550201416
-7.946921547407927,7.944610595703125
-7.954677021213342,7.935312747955322
-7.987162773987728,7.9257659912109375
-7.9913998274291025,7.918308734893799
-7.935542022791058,7.916512966156006
-7.9430951409681345,7.945621013641357
-7.85078088734462,7.914003849029541
-7.946921547407927,7.9083571434021
-7.823919469453418,7.934422969818115
-7.931814161156377,7.910423755645752
-7.954677021213342,7.927762031555176
-7.924453006674053,7.899014949798584
-7.924453006674053,7.884434700012207
-7.954677021213342,7.942359924316406
-7.935542022791058,7.9412946701049805
-7.924453006674053,7.904502868652344
-7.924453006674053,7.895689487457275
-7.931814161156377,7.949464797973633
-7.946921547407927,7.9150261878967285
-7.9393021526221474,7.931960105895996
-7.950781972366453,7.945343494415283
-7.928117974144348,7.92344331741333
-7.954677021213342,7.941575050354004
-7.91721462968355,7.917566776275635
-7.924453006674053,7.912725448608398
-7.924453006674053,7.926155090332031
-7.950781972366453,7.932180404663086
-7.874282136926076,7.930166244506836
-7.96981377267859,7.982597827911377
-7.950781972366453,7.920536518096924
-7.954677021213342,7.921341896057129
-7.924603424800292,7.886361598968506
-7.913640203677234,7.880128860473633
-7.950781972366453,7.923623561859131
-7.96257349994767,7.967459201812744
-7.9393021526221474,7.927001476287842
-7.9393021526221474,7.908883094787598
-7.924453006674053,7.915006160736084
-7.9393021526221474,7.913726329803467
-7.928117974144348,7.903787612915039
-7.950781972366453,7.9227294921875
-7.866459873882536,7.927475452423096
-7.863280055279963,7.918320655822754
-7.950781972366453,7.943849086761475
-7.946921547407927,7.9210333824157715
-7.889410352488291,7.936758518218994
-7.924453006674053,7.910100936889648
-7.8810739922450885,7.8917622566223145
-7.935542022791058,7.9430623054504395
-7.9670439517473834,7.922097682952881
-7.954677021213342,7.941774368286133
-7.906578398789698,7.889623165130615
-7.875899990405765,7.892211437225342
-7.920818811243059,7.922086715698242
-7.913640203677234,7.9069342613220215
-7.950781972366453,7.938076972961426
-7.9430951409681345,7.94220495223999
-7.892790308673911,7.916003227233887
-7.9430951409681345,7.942329406738281
-7.954677021213342,7.920139789581299
-7.987162773987728,7.962046146392822
-7.954677021213342,7.925022602081299
-7.950781972366453,7.946854591369629
-7.892790308673911,7.914582252502441
-7.935542022791058,7.888424396514893
-7.847706165863548,7.957055568695068
-7.935542022791058,7.93261194229126
-7.954677021213342,7.942877769470215
-7.830200797720251,7.898110866546631
-7.928117974144348,7.930111408233643
-7.950781972366453,7.969892978668213
-7.91721462968355,7.941483497619629
-7.889410352488291,7.92490816116333
-7.931814161156377,7.901869297027588
-7.924453006674053,7.919714450836182
-7.913640203677234,7.914172649383545
-7.860153329415682,7.909626007080078
-7.9393021526221474,7.9252095222473145
-7.950781972366453,7.921948432922363
-7.896196359268842,7.904393672943115
-7.954677021213342,7.940450191497803
-7.950781972366453,7.895476341247559
-7.9393021526221474,7.918041229248047
-7.946921547407927,7.926185607910156
-7.9393021526221474,7.926565170288086
-7.9393021526221474,7.925858020782471
-7.896196359268842,7.9255876541137695
-7.901151046525181,7.94524621963501
-7.924453006674053,7.922754764556885
-7.950781972366453,7.9121413230896
-7.950781972366453,7.910265922546387
-7.921563988377181,7.941479206085205
-7.954677021213342,7.930945873260498
-7.924453006674053,7.896070957183838
-7.85078088734462,7.900674343109131
-7.882728704344236,7.864620685577393
-7.946921547407927,7.928374767303467
-7.868644485039619,7.862521171569824
-7.954677021213342,7.9522809982299805
-7.931814161156377,7.910008430480957
-7.93978520718815,7.953945636749268
-7.898075838044953,7.9198832511901855
-7.974694136660875,7.940717697143555
-7.906578398789698,7.943848133087158
-7.954677021213342,7.935708045959473
-7.9430951409681345,7.928847312927246
-7.943055911701025,7.925178050994873
-7.920818811243059,7.920769214630127
-7.950781972366453,7.912473201751709
-7.920818811243059,7.939579963684082
-7.950781972366453,7.919600963592529
-7.954677021213342,7.939877986907959
-7.924453006674053,7.907863140106201
-7.954677021213342,7.955459117889404
-7.9393021526221474,7.910408973693848
-7.920818811243059,7.935437202453613
-7.946921547407927,7.904362201690674
-7.935542022791058,7.9185099601745605
-7.844664854175832,7.95686149597168
-7.950781972366453,7.955246925354004
-7.860119116630385,7.894303798675537
-7.9393021526221474,7.9256086349487305
-7.946921547407927,7.910791397094727
-7.946921547407927,7.92791223526001
-7.954677021213342,7.904383659362793
-7.928117974144348,7.917529582977295
-7.954677021213342,7.932776927947998
-7.913640203677234,7.876028060913086
-7.931814161156377,7.9137983322143555
-7.954677021213342,7.93185567855835
-7.987162773987728,7.947319030761719
-7.954677021213342,7.9529314041137695
-7.906578398789698,7.908578395843506
-7.93468629292431,7.90487003326416
-7.946921547407927,7.957278251647949
-7.946921547407927,7.944638252258301
-7.9616219366397445,7.88650369644165
-7.860119116630385,7.901230335235596
-7.950781972366453,7.936673164367676
-7.928117974144348,7.91819429397583
-7.928118049483403,7.923948764801025
-7.954677021213342,7.9335503578186035
-7.946921547407927,7.927942276000977
-7.950781972366453,7.9322052001953125
-7.950781972366453,7.929851531982422
-7.950781972366453,7.930530548095703
-7.9393021526221474,7.9397711753845215
-7.931814161156377,7.892760276794434
-7.935542022791058,7.901980400085449
-7.9393021526221474,7.912240982055664
-7.954677021213342,7.925715446472168
-7.950781972366453,7.921947002410889
-7.935542022791058,7.90596342086792
-7.950781972366453,7.9150390625
-7.950781972366453,7.9504218101501465
-7.966617665152964,7.928674221038818
-7.928117974144348,7.920182228088379
-7.879425560900211,7.924991607666016
-7.924453006674053,7.923330783843994
-7.946921547407927,7.933857440948486
-7.924453006674053,7.921433448791504
-7.946921547407927,7.914157867431641
-7.9616219366397445,7.9537482261657715
-7.896196359268842,7.901403427124023
-7.950781972366453,7.937890529632568
-7.9430951409681345,7.891219615936279
-7.954677021213342,7.972507953643799
-7.920818811243059,7.907516002655029
-7.924453006674053,7.922013759613037
-7.9393021526221474,7.924229621887207
-7.950781972366453,7.9440717697143555
-7.950781972366453,7.945108890533447
-7.91721462968355,7.942629814147949
-7.882728704344236,7.894421100616455
-7.920818811243059,7.8770880699157715
-7.946921547407927,7.9072489738464355
-7.9430951409681345,7.90389347076416
-7.920818811243059,7.924981594085693
-7.954677021213342,7.937391757965088
-7.950781972366453,7.934502124786377
-7.954677021213342,7.936565399169922
-7.912937386812075,7.893728733062744
-7.920818811243059,7.898262023925781
-7.9508418880815706,7.944504261016846
-7.924453006674053,7.910777568817139
-7.866459873882536,7.892143726348877
-7.931814161156377,7.909517765045166
-7.954677021213342,7.935749530792236
-7.920818811243059,7.931119441986084
-7.954677021213342,7.939466953277588
-7.924453006674053,7.916884899139404
-7.913640203677234,7.92634391784668
-7.950781972366453,7.942497253417969
-7.950781972366453,7.941011905670166
-7.9737577757544535,7.948658466339111
-7.9393021526221474,7.925654888153076
-7.91721462968355,7.938104629516602
-7.935542022791058,7.931594371795654
-7.89962956062971,7.915526866912842
-7.9430951409681345,7.925029754638672
-7.950781972366453,7.9130988121032715
-7.924453006674053,7.9176836013793945
-7.9393021526221474,7.9085516929626465
-7.906578398789698,7.897429943084717
-7.954677021213342,7.946654796600342
-7.920818811243059,7.9117431640625
-7.924453006674053,7.904763698577881
-7.95387649381544,7.910473346710205
-7.924453006674053,7.914669513702393
-7.9430951409681345,7.936153888702393
-7.954677021213342,7.933284759521484
-7.946921547407927,7.943623065948486
-7.950781972366453,7.935443878173828
-7.863280055279963,7.89877986907959
-7.946921547407927,7.9252495765686035
-7.924453006674053,7.908679962158203
-7.954677021213342,7.930453777313232
-7.89962956062971,7.918752193450928
-7.9430951409681345,7.935844421386719
-7.950781972366453,7.940857887268066
-7.946921547407927,7.906449317932129
-7.9393021526221474,7.932826519012451
-7.950781972366453,7.923397541046143
-7.9430951409681345,7.894138336181641
-7.9393021526221474,7.9163594245910645
-7.874709893782641,7.899911403656006
-7.950781972366453,7.942631244659424
-7.992871189127312,7.967057704925537
-7.85078088734462,7.923416614532471
-7.928117974144348,7.919703006744385
-7.9393021526221474,7.948551654815674
-7.924453006674053,7.853410720825195
-7.950781972366453,7.9185261726379395
-7.910094953104535,7.925637722015381
-7.935542022791058,7.912812232971191
-7.970532618892763,7.971869945526123
-7.954677021213342,7.945376873016357
-7.853872762493711,7.899006366729736
-7.954677021213342,7.941372394561768
-7.931814161156377,7.897459506988525
-7.920818811243059,7.900077819824219
-7.906578398789698,7.932346820831299
-7.950781972366453,7.916419982910156
-8.026824561605242,7.949819087982178
-7.9430951409681345,7.936720848083496
-7.9393021526221474,7.928706169128418
-7.909221749570212,7.916985034942627
-7.995678626217357,7.941511631011963
-7.954677021213342,7.967218399047852
-7.920818811243059,7.924859046936035
-7.954677021213342,7.941996097564697
-7.892790308673911,7.892238140106201
-7.906578398789698,7.9014973640441895
-7.946921547407927,7.928743839263916
-7.9430951409681345,7.940523147583008
-7.950781972366453,7.938222408294678
-7.978810702253626,7.946752548217773
-7.95090181210265,7.93817663192749
-7.970532618892763,7.925774097442627
-7.928117974144348,7.9300103187561035
-7.928117974144348,7.91611385345459
-7.950781972366453,7.93367338180542
-7.9393021526221474,7.9178290367126465
-7.886056354845152,7.890117168426514
-7.924453006674053,7.916064262390137
-7.913640203677234,7.882107734680176
-7.950781972366453,7.930852890014648
-7.954677021213342,7.940670490264893
-7.928117974144348,7.907209396362305
-7.910094953104535,7.9135422706604
-7.8986410684191934,7.932488918304443
-7.903090094245322,7.903996467590332
-7.896196359268842,7.883091449737549
-7.924453006674053,7.87495756149292
-7.954677021213342,7.942177772521973
-7.9393021526221474,7.941103458404541
-7.928117974144348,7.905553817749023
-7.935542022791058,7.917524337768555
-7.935542022791058,7.914505481719971
-7.9393021526221474,7.911895751953125
-7.954677021213342,7.933287620544434
-7.995678626217357,7.9161248207092285
-7.9318141721807764,7.919068813323975
-7.931814161156377,7.916194438934326
-7.946921547407927,7.921664714813232
-7.950781972366453,7.934196949005127
-7.924453006674053,7.8981451988220215
-7.924453006674053,7.897754192352295
-7.954677021213342,7.9564971923828125
-7.954677021213342,7.946608066558838
-7.954677021213342,7.939420700073242
-7.950781972366453,7.9200334548950195
-7.982966659490206,7.941580772399902
-7.8761493177145505,7.919580936431885
-7.935542022791058,7.918263912200928
-7.869665979871627,7.911855697631836
-7.85078088734462,7.902987003326416
-7.924453006674053,7.917456150054932
-7.950781972366453,7.941235542297363
-7.906578398789698,7.851139545440674
-7.835637836224461,7.937042713165283
-7.954677021213342,7.959804058074951
-7.950781972366453,7.947951793670654
-7.8493737915542425,7.897365570068359
-7.920818811243059,7.914896011352539
-7.819366547270949,7.874229907989502
-7.950781972366453,7.931950569152832
-7.946921547407927,7.926266193389893
-7.950781972366453,7.918671131134033
-7.924453006674053,7.903514862060547
-7.950781972366453,7.924654006958008
-7.950781972366453,7.915247917175293
-8.003443541216441,7.994107723236084
-7.924453006674053,7.923198223114014
-7.946921547407927,7.910788059234619
-7.950781972366453,7.924175262451172
-7.985623465663254,7.920499324798584
-7.8761493177145505,7.923856735229492
-7.946921547407927,7.903327465057373
-7.902388164590721,7.923051357269287
-7.928117974144348,7.923810958862305
-7.943055911701025,7.950985908508301
-7.9737577757544535,7.95485258102417
-7.913640203677234,7.909012317657471
-7.906578398789698,7.917080402374268
-7.950781972366453,7.9640679359436035
-7.924453006674053,7.946711540222168
-7.950781972366453,7.939215183258057
-7.910094953104535,7.928799629211426
-7.906578398789698,7.892132759094238
-7.9430951409681345,7.94199800491333
-7.9737577757544535,7.960358142852783
-7.896196359268842,7.912481784820557
-7.935542022791058,7.921476364135742
-7.920818811243059,7.878035068511963
-7.950781972366453,7.919329643249512
-7.91721462968355,7.902970790863037
-7.906578398789698,7.905773639678955
-7.964102771195973,7.928249835968018
-7.954677021213342,7.895688056945801
-7.9393021526221474,7.908437252044678
-7.9393021526221474,7.928262233734131
-7.928117974144348,7.916110992431641
-7.9737577757544535,7.956166744232178
-7.829768510087842,7.901332855224609
-7.928117974144348,7.909907341003418
-7.931814161156377,7.9411444664001465
-7.954677021213342,7.930868148803711
-7.931814161156377,7.925457954406738
-7.950781972366453,7.940929889678955
-7.924453006674053,7.900393962860107
-7.892790308673911,7.9145941734313965
-7.928117974144348,7.9372782707214355
-7.847706165863548,7.89853048324585
-7.970616219270671,7.935128211975098
-7.970532618892763,7.945501804351807
-7.928117974144348,7.899286270141602
-7.924453006674053,7.9280009269714355
-7.835637836224461,7.907022953033447
-7.935542022791058,7.926126956939697
-7.931814161156377,7.892807960510254
-7.954677021213342,7.926973819732666
-7.931814161156377,7.9292988777160645
-7.954677021213342,7.939774990081787
-7.9393021526221474,7.911440849304199
-7.935542022791058,7.905751705169678
-7.91721462968355,7.9091973304748535
-7.924453006674053,7.913290500640869
-7.9525102848614395,7.955080509185791
-7.950781972366453,7.926084518432617
-7.935542022791058,7.90989351272583
-7.931814161156377,7.886157035827637
-7.85078088734462,7.921751499176025
-7.950781972366453,7.939440727233887
-7.89962956062971,7.9024505615234375
-7.833610261256329,7.844601154327393
-7.995678626217357,7.951870441436768
-7.931814161156377,7.910081386566162
-7.954677021213342,7.934353351593018
-7.954677021213342,7.928268909454346
-7.931814161156377,7.939589023590088
-7.946921547407927,7.921283721923828
-7.928117974144348,7.907158374786377
-7.950781972366453,7.934245586395264
-7.928117974144348,7.916428565979004
-7.954677021213342,7.931624412536621
-7.935542022791058,7.908112049102783
-7.987162773987728,7.95409631729126
-7.9393021526221474,7.909685134887695
-7.924453006674053,7.905368328094482
-7.950781972366453,7.94031286239624
-7.924453006674053,7.922182559967041
-7.879425560900211,7.901421070098877
-7.896196359268842,7.906070232391357
-7.954677021213342,7.935513496398926
-7.9393021526221474,7.91510534286499
-7.950781972366453,7.934136867523193
-7.946921547407927,7.915330410003662
-7.954677021213342,7.945771217346191
-7.866459873882536,7.937515735626221
-7.950781972366453,7.943544864654541
-7.946896212483493,7.920872688293457
-7.925603053104374,7.8926191329956055
-7.924453006674053,7.9185261726379395
-7.896196359268842,7.902506351470947
-7.946921547407927,7.9197211265563965
-7.946921547407927,7.915842533111572
-7.9430951409681345,7.90219259262085
-7.924453006674053,7.920130729675293
-7.995678626217357,7.9316630363464355
-7.896196359268842,7.917758464813232
-7.924453006674053,7.931533336639404
-7.9393021526221474,7.906371116638184
-7.9737577757544535,7.9238762855529785
-7.954677021213342,7.936941623687744
-7.9393021526221474,7.913888931274414
-7.924453006674053,7.914941310882568
-7.954677021213342,7.927708148956299
-7.950781972366453,7.939314842224121
-7.924453006674053,7.915086269378662
-7.935542022791058,7.910060405731201
-7.829768510087842,7.92496919631958
-7.9430951409681345,7.920547962188721
-7.9430951409681345,7.932358264923096
-7.9393021526221474,7.915104866027832
-7.946921547407927,7.928259372711182
-7.950781972366453,7.942845821380615
-7.950781972366453,7.9445319175720215
-7.928117974144348,7.930777549743652
-7.935542022791058,7.915578365325928
-7.9393021526221474,7.921323776245117
-7.95090181210265,7.9168524742126465
-7.91721462968355,7.910502910614014
-7.882728704344236,7.89626407623291
-7.950781972366453,7.918996810913086
-7.892790308673911,7.876421928405762
-7.950781972366453,7.928821086883545
-7.987162773987728,7.930831432342529
-7.928117974144348,7.91438627243042
-7.847706165863548,7.938388824462891
-7.869378875342402,7.918887138366699
-7.950781972366453,7.924149036407471
-7.995678626217357,7.941610813140869
-7.924453006674053,7.91323184967041
-7.928117974144348,7.912154197692871
-7.935734864536909,7.936069011688232
-7.950781972366453,7.928066730499268
-7.892538918842217,7.954531192779541
-7.928117974144348,7.90146541595459
-7.89962956062971,7.90607213973999
-7.931814161156377,7.926571369171143
-7.935542022791058,7.946468830108643
-7.910071604962776,7.914631366729736
-7.877623480181999,7.902563571929932
-7.910094953104535,7.9459547996521
-7.928117974144348,7.902200222015381
-7.9393021526221474,7.935940265655518
-7.946921547407927,7.910726070404053
-7.913640203677234,7.911072254180908
-7.842802030816254,7.914554119110107
-7.950781972366453,7.932526588439941
-7.920818811243059,7.899559497833252
-7.950781972366453,7.9361066818237305
-7.946921547407927,7.949351787567139
-7.950781972366453,7.93678617477417
-7.9393021526221474,7.915476322174072
-7.896196359268842,7.867074489593506
-7.863280055279963,7.9113287925720215
-7.882728704344236,7.910234451293945
-7.950781972366453,7.940523624420166
-7.924453006674053,7.924894332885742
-7.946921547407927,7.917753219604492
-7.950241642100192,7.937738418579102
-7.931814161156377,7.914840221405029
-7.892790308673911,7.922292232513428
-7.9393021526221474,7.938170909881592
-7.9430951409681345,7.920531272888184
-7.910094953104535,7.87415075302124
-7.9393021526221474,7.9022135734558105
-7.950781972366453,7.94912052154541
-7.8416326138557455,7.874176025390625
-7.931814161156377,7.891689777374268
-7.9393021526221474,7.934700965881348
-7.954677021213342,7.884700298309326
-7.920818811243059,7.930531978607178
-7.946921547407927,7.907995223999023
-7.863280055279963,7.894927501678467
-7.920818811243059,7.914865493774414
-7.966617665152964,7.921209335327148
-7.924453006674053,7.91565465927124
-7.875615898948226,7.903450012207031
-7.91721462968355,7.925753116607666
-7.931814161156377,7.937312602996826
-7.950781972366453,7.951918601989746
-7.947688104167437,7.945662975311279
-7.931814161156377,7.905428886413574
-7.860119116630385,7.898686408996582
-7.928117974144348,7.919480800628662
-7.954677021213342,7.912532329559326
-7.906578398789698,7.914013385772705
-7.954677021213342,7.948111534118652
-7.954677021213342,7.950104713439941
-7.958607309235428,7.926023006439209
-7.946921547407927,7.925637245178223
-7.9430951409681345,7.928584575653076
-7.924453006674053,7.92255163192749
-7.946921547407927,7.915438175201416
-7.924453006674053,7.930120468139648
-7.954677021213342,7.919484615325928
-7.954677021213342,7.92702054977417
-7.9393021526221474,7.916884899139404
-7.935542022791058,7.910280704498291
-7.954677021213342,7.894053936004639
-7.931814161156377,7.932136535644531
-7.928117974144348,7.922636032104492
-7.91721462968355,7.910853385925293
-7.910094953104535,7.9210405349731445
-7.928117974144348,7.930098056793213
-7.970532618892763,7.933176040649414
-7.950781972366453,7.901771545410156
-7.892790308673911,7.902637481689453
-7.879425560900211,7.891432762145996
-7.954677021213342,7.924415111541748
-7.950781972366453,7.915141582489014
-7.886056354845152,7.895238399505615
-7.950781972366453,7.917943477630615
-7.928117974144348,7.907775402069092
-7.924453006674053,7.922729015350342
-7.896196359268842,7.958417892456055
-7.853872762493711,7.917647838592529
-7.91721462968355,7.903690814971924
-8.026824561605242,7.946432590484619
-7.9393021526221474,7.910305500030518
-7.943383637939144,7.895751953125
-7.954677021213342,7.928962230682373
-7.920818811243059,7.941869735717773
-7.950781972366453,7.9366631507873535
-7.970616219270671,7.959852695465088
-7.928117974144348,7.91352653503418
-7.9393021526221474,7.922170639038086
-7.89962956062971,7.944109916687012
-7.889410352488291,7.902620792388916
-7.89962956062971,7.922328948974609
-7.954677021213342,7.922249794006348
-7.9393021526221474,7.909312725067139
-7.950781972366453,7.927684307098389
-7.85078088734462,7.883328914642334
-7.950781972366453,7.942028999328613
-7.9393021526221474,7.919360160827637
-7.970532618892763,7.945284366607666
-7.872861820710693,7.928620338439941
-7.950781972366453,7.917783260345459
-7.946921547407927,7.92774772644043
-7.924453006674053,7.927821159362793
-7.946921547407927,7.934047222137451
-7.920818811243059,7.904726505279541
-7.935542022791058,7.9230828285217285
-7.924453006674053,7.912360191345215
-7.910094953104535,7.904946804046631
-7.950781972366453,7.943347930908203
-7.920818811243059,7.921975612640381
-7.9430951409681345,7.944370746612549
-7.936334125227829,7.940245151519775
-7.935542022791058,7.92875337600708
-7.903090094245322,7.892032623291016
-7.946921547407927,7.91586971282959
-7.950298727941771,7.918545722961426
-7.950781972366453,7.912574291229248
-7.995678626217357,7.95310115814209
-7.920818811243059,7.91955041885376
-7.903090094245322,7.879085063934326
-7.924453006674053,7.902903079986572
-7.950781972366453,7.902092933654785
-7.935542022791058,7.903066158294678
-7.935542022791058,7.924760341644287
-7.913640203677234,7.897150039672852
-7.903090094245322,7.910669326782227
-7.924453006674053,7.909192085266113
-7.910094953104535,7.920203685760498
-7.924453006674053,7.927551746368408
-7.946921547407927,7.926468372344971
-7.920818811243059,7.913031578063965
-7.931814161156377,7.902337551116943
-7.9393021526221474,7.94486665725708
-7.931814161156377,7.912034034729004
-7.931814161156377,7.9115519523620605
-7.946921547407927,7.905293941497803
-7.924453006674053,7.942821979522705
-7.9393021526221474,7.922447681427002
-7.950781972366453,7.936122894287109
-7.954677021213342,7.9126200675964355
-7.928117974144348,7.9513630867004395
-7.9393021526221474,7.931703090667725
-7.924453006674053,7.921878337860107
-7.9393021526221474,7.9237518310546875
-7.931814161156377,7.929804801940918
-7.920818811243059,7.900828838348389
-7.835637836224461,7.895632743835449
-7.950781972366453,7.9185791015625
-7.9430951409681345,7.937770843505859
-7.882728704344236,7.871359825134277
-7.931814161156377,7.918935298919678
-7.910094953104535,7.913663864135742
-7.928117974144348,7.919290065765381
-7.920818811243059,7.925053119659424
-7.9393021526221474,7.9294209480285645
-7.950781972366453,7.923710823059082
-7.928117974144348,7.923675060272217
-7.931814161156377,7.916184425354004
-7.946921547407927,7.934373378753662
-7.946921547407927,7.947107791900635
-7.91721462968355,7.923285007476807
-7.928117974144348,7.915271282196045
-7.950781972366453,7.934237003326416
-7.970532618892763,7.952644348144531
-7.946921547407927,7.91078519821167
-7.9393021526221474,7.926992893218994
-7.928117974144348,7.916696071624756
-7.9737577757544535,7.942441463470459
-7.924453006674053,7.917213439941406
-7.954677021213342,7.928931713104248
-7.910094953104535,7.889423847198486
-7.9430951409681345,7.943579196929932
-7.935542022791058,7.9197678565979
-7.954677021213342,7.936695575714111
-7.892790308673911,7.897446155548096
-7.924453006674053,7.909387111663818
-7.950781972366453,7.949714183807373
-7.8761493177145505,7.873014450073242
-7.9737577757544535,7.967138767242432
-7.954677021213342,7.923233985900879
-7.935542022791058,7.902134895324707
-7.931814161156377,7.938795566558838
-7.9393021526221474,7.9232940673828125
-7.931814161156377,7.8757853507995605
-7.950781972366453,7.9483962059021
-7.896196359268842,7.881799221038818
-7.935542022791058,7.912056922912598
-7.920818811243059,7.896305561065674
-7.954677021213342,7.919145584106445
-7.950298727941771,7.927895545959473
-7.931814161156377,7.927596569061279
-7.9393021526221474,7.909678936004639
-7.950781972366453,7.919576168060303
-7.935542022791058,7.934737205505371
-7.924453006674053,7.900269985198975
-7.804091322132368,7.89347505569458
-7.935542022791058,7.939146518707275
-7.913904078443909,7.889049053192139
-7.906578398789698,7.891603946685791
-7.950781972366453,7.940615653991699
-7.952890410541103,7.923893928527832
-7.924453006674053,7.896803855895996
-7.954677021213342,7.949568271636963
-7.906578398789698,7.900902271270752
-7.954677021213342,7.911263942718506
-7.931814161156377,7.905765056610107
-7.924453006674053,7.9266676902771
-7.950781972366453,7.919796466827393
-7.91721462968355,7.932297229766846
-7.946921547407927,7.928658485412598
-7.950781972366453,7.9289469718933105
-7.886056354845152,7.8883748054504395
-7.931814161156377,7.9099626541137695
-7.924453006674053,7.908230304718018
-7.946921547407927,7.913115501403809
-7.970616219270671,7.937777996063232
-7.928117974144348,7.955680847167969
-7.946921547407927,7.9126787185668945
-7.9078549312528486,7.915547847747803
-7.9393021526221474,7.912553787231445
-7.9430951409681345,7.9175591468811035
-7.954677021213342,7.918947219848633
-7.913640203677234,7.89951753616333
-7.954677021213342,7.950873851776123
-7.903090094245322,7.9048686027526855
-7.931814161156377,7.914369106292725
-7.9430951409681345,7.940677165985107
-7.869665979871627,7.923499584197998
-7.889410352488291,7.913513660430908
-7.995678626217357,7.9449286460876465
-7.920818811243059,7.922597408294678
-7.931814161156377,7.936715602874756
-7.995678626217357,7.946962356567383
-7.946921547407927,7.923534393310547
-7.91721462968355,7.915186882019043
-7.935542022791058,7.884585857391357
-7.9393021526221474,7.963439464569092
-7.931814161156377,7.901310443878174
-7.9430951409681345,7.933824062347412
-7.920818811243059,7.907967567443848
-7.9430951409681345,7.960411071777344
-7.924453006674053,7.898726940155029
-7.924453006674053,7.905733585357666
-7.950781972366453,7.937807083129883
-7.931814161156377,7.915346622467041
-7.982923651140671,7.918022155761719
-7.950781972366453,7.92327356338501
-7.948658283730227,7.927068710327148
-7.928117974144348,7.911952495574951
-7.903090094245322,7.911380767822266
-7.866459873882536,7.90885591506958
-7.946921547407927,7.900550365447998
-7.9393021526221474,7.889035701751709
-7.9393021526221474,7.9208292961120605
-7.924453006674053,7.917352199554443
-7.913640203677234,7.898644924163818
-7.889410352488291,7.9080586433410645
-7.9430951409681345,7.936366081237793
-7.950781972366453,7.931372165679932
-7.844664854175832,7.882255554199219
-7.928155902956855,7.881763935089111
-7.954677021213342,7.939161777496338
-7.9430951409681345,7.937073230743408
-7.903090094245322,7.905018329620361
-7.91721462968355,7.90559720993042
-7.916084887040944,7.907660007476807
-7.9430951409681345,7.925858020782471
-7.935542022791058,7.917008876800537
-7.950781972366453,7.959872722625732
-7.954677021213342,7.9592976570129395
-7.952725130123009,7.931686878204346
-7.9367221576035965,7.895516395568848
-7.860153329415682,7.909589767456055
-7.990339285400088,7.969196796417236
-7.906578398789698,7.946170806884766
-7.950781972366453,7.928279399871826
-7.950781972366453,7.943252086639404
-7.836640141104957,7.87648344039917
-7.924453006674053,7.9249091148376465
-7.946921547407927,7.908267498016357
-7.931814161156377,7.901504039764404
-7.924453006674053,7.929581642150879
-7.9393021526221474,7.94598913192749
-7.9616219366397445,7.945888996124268
-7.928117974144348,7.912841320037842
-7.91721462968355,7.914790630340576
-7.9737577757544535,7.946091175079346
-7.892790308673911,7.940304756164551
-7.943095160397098,7.915618419647217
-7.950781972366453,7.932594299316406
-7.950781972366453,7.923229694366455
-7.924453006674053,7.911916255950928
-7.946921547407927,7.922806262969971
-7.950781972366453,7.935088634490967
-7.950781972366453,7.942742347717285
-7.913640203677234,7.9423675537109375
-7.954677021213342,7.942611217498779
-7.935542022791058,7.919667720794678
-7.889410352488291,7.915253639221191
-7.946921547407927,7.940397262573242
-7.913640203677234,7.89889669418335
-7.89962956062971,7.902083873748779
-7.9430951409681345,7.948378562927246
-7.841341928765566,7.850958347320557
-7.954677021213342,7.935729503631592
-7.946921547407927,7.909450054168701
-7.946921547407927,7.930188179016113
-7.924453006674053,7.894946575164795
-7.928117974144348,7.908890247344971
-7.9393021526221474,7.905608177185059
-7.948658283730227,7.94906759262085
-7.924453006674053,7.901648998260498
-7.9653239020786435,7.922628879547119
-7.9430951409681345,7.889256000518799
-7.9393021526221474,7.915197849273682
-7.91721462968355,7.92663049697876
-7.928117974144348,7.934107303619385
-7.924453006674053,7.933477878570557
-7.950781972366453,7.941138744354248
-7.9430951409681345,7.932557582855225
-7.954591856239139,7.907146453857422
-7.9393021526221474,7.944651126861572
-7.879425560900211,7.9146318435668945
-7.924453006674053,7.944720268249512
-7.973156262517851,7.9340500831604
-7.950781972366453,7.941381931304932
-7.9393021526221474,7.916720867156982
-7.9393021526221474,7.918918132781982
-7.954677021213342,7.9243388175964355
-7.903090094245322,7.9024128913879395
-7.931814161156377,7.885573863983154
-7.896196359268842,7.92578649520874
-7.928117974144348,7.900721073150635
-7.920818811243059,7.921916484832764
-7.954677021213342,7.937758922576904
-7.935542022791058,7.929268836975098
-7.9393021526221474,7.9324445724487305
-7.869732506393041,7.904729843139648
-7.928117974144348,7.910727500915527
-7.928117974144348,7.928269386291504
-7.928117974144348,7.923939228057861
-7.950781972366453,7.93018913269043
-7.838693701646425,7.920013904571533
-7.950781972366453,7.935894012451172
-7.954677021213342,7.895663261413574
-7.924453006674053,7.921090126037598
-7.881990818921415,7.899481296539307
-7.946921547407927,7.9104180335998535
-7.954677021213342,7.9264397621154785
-7.9430951409681345,7.928752422332764
-7.861458037730276,7.897121906280518
-7.9430951409681345,7.933276176452637
-7.954677021213342,7.917812824249268
-7.869665979871627,7.894662380218506
-7.950781972366453,7.914294719696045
-7.950781972366453,7.944880962371826
-7.9393021526221474,7.911604881286621
-7.946921547407927,7.924239158630371
-7.9430951409681345,7.942562580108643
-7.9393021526221474,7.907747745513916
-7.950781972366453,7.92302942276001
-7.946921547407927,7.928721904754639
-7.9393021526221474,7.921130180358887
-7.913640203677234,7.905149936676025
-7.954677021213342,7.944746017456055
-7.954677021213342,7.933380603790283
-7.9430951409681345,7.9228949546813965
-7.950781972366453,7.933821201324463
-7.943795058505339,7.941591739654541
-7.950781972366453,7.941951274871826
-7.950781972366453,7.9388508796691895
-7.9034974875499335,7.9132161140441895
-7.954677021213342,7.9253153800964355
-7.856986114171083,7.910597801208496
-7.924453006674053,7.916942119598389
-7.920818811243059,7.9168219566345215
-7.924453006674053,7.919742107391357
-7.928117974144348,7.924693584442139
-7.954677021213342,7.960639953613281
-7.950781972366453,7.93165922164917
-7.8761493177145505,7.902451515197754
-7.954677021213342,7.948800086975098
-7.931814161156377,7.941847324371338
-7.939379961634402,7.918051242828369
-7.950781972366453,7.936877250671387
-7.8761493177145505,7.905208110809326
-7.931814161156377,7.922586441040039
-7.920818811243059,7.915556907653809
-7.906578398789698,7.902328968048096
-7.924453006674053,7.902130126953125
-7.954677021213342,7.944591999053955
-7.954677021213342,7.902808666229248
-7.9430951405871735,7.9366230964660645
-7.946921547407927,7.9386773109436035
-8.008819571765459,7.983935832977295
-7.879425560900211,7.89153528213501
-7.958607309235428,7.918284893035889
-7.954677021213342,7.931545734405518
-7.9393021526221474,7.9418511390686035
-7.954677021213342,7.940374851226807
-7.935271050222571,7.894197463989258
-7.950781972366453,7.927175998687744
-7.906578398789698,7.911149978637695
-7.920818811243059,7.912333965301514
-7.959158165932685,7.9437336921691895
-7.950781972366453,7.934590816497803
-7.954677021213342,7.951262950897217
-7.869665979871627,7.903280735015869
-7.889410352488291,7.932886600494385
-7.853872762493711,7.9016032218933105
-7.946921547407927,7.953154563903809
-7.939904927278492,7.913475513458252
-7.860119116630385,7.9094977378845215
-7.918702847281798,7.957006454467773
-7.931814161156377,7.914291858673096
-7.913640203677234,7.909929275512695
-7.89962956062971,7.880159854888916
-7.9393021526221474,7.944370746612549
-7.950781972366453,7.933919429779053
-7.850764921094095,7.911753177642822
-8.023340543527912,7.956523418426514
-7.928117974144348,7.9182353019714355
-7.954677021213342,7.9373250007629395
-7.950781972366453,7.952756881713867
-7.8761493177145505,7.904865264892578
-7.924453006674053,7.906484603881836
-7.987162773987728,7.949944972991943
-7.950781972366453,7.921574115753174
-7.958607309235428,7.9180216789245605
-7.882728704344236,7.918020725250244
-7.950781972366453,7.945394039154053
-7.935542022791058,7.904829025268555
-7.954677021213342,7.941314220428467
-7.950781972366453,7.927979469299316
-7.866459873882536,7.9465413093566895
-7.928117974144348,7.915231227874756
-7.954677021213342,7.931190490722656
-7.950781972366453,7.928582191467285
-7.954677021213342,7.942558765411377
-7.954677021213342,7.911569595336914
-7.8416326138557455,7.898550033569336
-7.954677021213342,7.942727565765381
-7.954677021213342,7.937487602233887
-7.950781972366453,7.967703342437744
-7.928117974144348,7.92323112487793
-7.928117974144348,7.9242963790893555
-7.928117974144348,7.9127092361450195
-7.924453006674053,7.900887966156006
-7.91721462968355,7.918056488037109
-7.856986114171083,7.904809474945068
-7.950781972366453,7.942907810211182
-7.928117974144348,7.894122123718262
-7.924453006674053,7.926520824432373
-7.954677021213342,7.9692063331604
-7.931814161156377,7.940968036651611
-7.9430951409681345,7.93789529800415
-7.931814161156377,7.917710304260254
-7.920818811243059,7.8968000411987305
-7.946921547407927,7.91386604309082
-7.978810702253626,7.963265895843506
-7.920818811243059,7.912508487701416
-7.9393021526221474,7.916698932647705
-7.950781972366453,7.948023319244385
-7.950781972366453,7.938687801361084
-7.920818811243059,7.948440074920654
-7.91721462968355,7.900970935821533
-7.9393021526221474,7.920046329498291
-7.966576241738391,7.953866958618164
-7.995678626217357,7.953425407409668
-7.8728955601551585,7.912402629852295
-7.924453006674053,7.9044575691223145
-7.915575394493873,7.914138317108154
-7.950781972366453,7.897135257720947
-7.9430951409681345,7.932879447937012
-7.950781972366453,7.958835124969482
-7.889746991542474,7.886402606964111
-7.924453006674053,7.924860954284668
-7.946921547407927,7.9262566566467285
-7.920818811243059,7.936278343200684
-7.950781972366453,7.9526143074035645
-7.950781972366453,7.917287349700928
-7.928117974144348,7.941767692565918
-7.954677021213342,7.948079586029053
-7.8416326138557455,7.895064353942871
-7.9393021526221474,7.935835838317871
-7.950781972366453,7.963752269744873
-7.970532618892763,7.920379638671875
-7.910094953104535,7.897145748138428
-7.928117974144348,7.931352138519287
-7.9393021526221474,7.937387466430664
-7.950781972366453,7.933788776397705
-7.950781972366453,7.941038131713867
-7.838693701646425,7.932192325592041
-7.931814161156377,7.922328472137451
-7.924453006674053,7.944302082061768
-7.892790308673911,7.9290452003479
-7.970532618892763,7.943958759307861
-7.931814161156377,7.925047874450684
-7.91721462968355,7.913779258728027
-7.892790308673911,7.909377574920654
-7.856986114171083,7.912338733673096
-7.935542022791058,7.929543972015381
-7.995678626217357,7.982140064239502
-7.950781972366453,7.941757678985596
-7.924453006674053,7.91277551651001
-7.9393021526221474,7.928421497344971
-7.950781972366453,7.941404819488525
-7.924453006674053,7.89211893081665
-7.950781972366453,7.928717136383057
-7.931814161156377,7.930327892303467
-7.9393021526221474,7.943607807159424
-7.906578398789698,7.89922571182251
-7.954677021213342,7.924048900604248
-7.924453006674053,7.9183430671691895
-8.014634778962309,7.961112976074219
-7.879425560900211,7.907128810882568
-7.866459873882536,7.896252632141113
-7.924453006674053,7.935705184936523
-7.935542022791058,7.913510322570801
-7.946921547407927,7.914699554443359
-7.946921547407927,7.912235736846924
-7.879527744657629,7.897379398345947
-7.954677021213342,7.932900428771973
-7.916754118885,7.9540696144104
-7.924453006674053,7.919443607330322
-7.924453006674053,7.930545330047607
-7.869665979871627,7.897948741912842
-7.928117974144348,7.913624286651611
-7.935542022791058,7.916167736053467
-7.9393021526221474,7.921445846557617
-7.915575394493873,7.903163909912109
-7.928117974144348,7.916240215301514
-7.9393021526221474,7.914207458496094
-7.946921547407927,7.906695365905762
-7.892790308673911,7.951469421386719
-7.982966659490206,7.933447360992432
-7.9430951409681345,7.929038047790527
-7.974694136660875,7.918872356414795
-7.950781972366453,7.956589221954346
-7.954677021213342,7.9189534187316895
-7.974694136660875,7.945260524749756
-7.918702847281798,7.925720691680908
-7.931814161156377,7.9198126792907715
-7.9393021526221474,7.914505958557129
-7.950781972366453,7.956636428833008
-7.954677021213342,7.934765338897705
-7.910094953104535,7.9233832359313965
-7.954677021213342,7.8970489501953125
-7.950781972366453,7.93105411529541
-7.970532618892763,7.954658508300781
-7.935542022791058,7.9378790855407715
-7.9393021526221474,7.918761253356934
-7.954677021213342,7.931180477142334
-7.950781972366453,7.91524076461792
-7.866459873882536,7.889334678649902
-7.954677021213342,7.958270072937012
-7.89933181335733,7.927801132202148
-7.9393021526221474,7.949033737182617
-7.928117974144348,7.900700569152832
-7.91721462968355,7.924473285675049
-7.847706165863548,7.905378818511963
-7.950781972366453,7.951526641845703
-7.9393021526221474,7.915899276733398
-7.954677021213342,7.951198577880859
-7.954677021213342,7.952707767486572
-7.954677021213342,7.920100688934326
-7.9430951409681345,7.907701015472412
-7.913640203677234,7.871388912200928
-7.946921547407927,7.9045000076293945
-7.954677021213342,7.945072650909424
-7.950781972366453,7.926381587982178
-7.9393021526221474,7.918529987335205
-7.950781972366453,7.939706325531006
-7.863280055279963,7.909821033477783
-7.954677021213342,7.954044818878174
-7.91721462968355,7.920556545257568
-7.924453006674053,7.920950889587402
-7.950781972366453,7.939755439758301
-7.954677021213342,7.947542667388916
-7.860119116630385,7.93192195892334
-7.9430951409681345,7.953962802886963
-7.946921547407927,7.934311866760254
-7.954761778021568,7.908751487731934
-7.954677021213342,7.9339776039123535
-7.928117974144348,7.913393497467041
-7.918702847281798,7.898859977722168
-7.946921547407927,7.903957366943359
-7.9393021526221474,7.926845550537109
-7.950781972366453,7.929760932922363
-7.954677021213342,7.898042678833008
-7.954677021213342,7.936133861541748
-7.954677021213342,7.931490421295166
-7.9302061252065466,7.8915324211120605
-7.910094953104535,7.912703037261963
-7.954677021213342,7.944550514221191
-7.954677021213342,7.942594051361084
-7.950781972366453,7.940433025360107
-7.924453006674053,7.911653995513916
-7.946921547407927,7.927041053771973
-7.950781972366453,7.91997766494751
-7.950781972366453,7.938960552215576
-7.860119116630385,7.889944553375244
-7.950781972366453,7.9389967918396
-7.950781972366453,7.9361891746521
-7.935542022791058,7.89251708984375
-7.950781972366453,7.944380283355713
-7.954677021213342,7.949084758758545
-7.995678626217357,7.948614597320557
-7.91721462968355,7.898625373840332
-7.8493737915542425,7.872044086456299
-7.935542022791058,7.945474624633789
-7.950781972366453,7.916356563568115
-8.004545578968134,7.956362247467041
-7.931814161156377,7.918538570404053
-7.928117974144348,7.908847332000732
-7.954677021213342,7.938872814178467
-7.869281830051218,7.926015377044678
-7.9737577757544535,7.977467060089111
-7.950781972366453,7.932346820831299
-7.920818811243059,7.909839153289795
-7.920818811243059,7.916400909423828
-7.924453006674053,7.917069911956787
-7.903090094245322,7.922047138214111
-7.950781972366453,7.940042972564697
-7.950781972366453,7.9134063720703125
-7.950781972366453,7.940917491912842
-7.950781972366453,7.962657928466797
-7.970532618892763,7.959807872772217
-7.970616219270671,7.955054759979248
-7.91721462968355,7.9021172523498535
-7.950781972366453,7.898058891296387
-7.863280055279963,7.916325092315674
-7.931814161156377,7.919628620147705
-7.924453006674053,7.900209903717041
-7.954677021213342,7.95374059677124
-7.954677021213342,7.898654460906982
-7.829768510087842,7.902981758117676
-7.935542022791058,7.9384684562683105
-7.924453006674053,7.9197163581848145
-7.928117974144348,7.904520511627197
-7.935542022791058,7.899364948272705
-7.9430951409681345,7.916392803192139
-7.913640203677234,7.904894828796387
-8.016694986585515,7.9684953689575195
-7.946921547407927,7.907836437225342
-7.950781972366453,7.934257984161377
-7.924453006674053,7.920202255249023
-7.896125840447619,7.902176856994629
-7.936992210083682,7.90913200378418
-7.9393021526221474,7.91208553314209
-7.91721462968355,7.9057297706604
-7.924453006674053,7.92278528213501
-7.924453006674053,7.911215305328369
-7.946921547407927,7.908535957336426
-7.935542022791058,7.923140048980713
-7.9430951409681345,7.943453311920166
-7.950781972366453,7.932470321655273
-7.950781972366453,7.913490295410156
-7.950781972366453,7.942189693450928
-7.9393021526221474,7.921578884124756
-7.954677021213342,7.92677640914917
-7.950781972366453,7.919911861419678
-7.9430951409681345,7.905500411987305
-7.878782119721712,7.9069504737854
-7.950781972366453,7.954857349395752
-7.954677021213342,7.930936813354492
-7.946921547407927,7.916815280914307
-7.950781972366453,7.949491024017334
-7.903161564307976,7.9331183433532715
-7.950781972366453,7.9339823722839355
-7.924453006674053,7.911191463470459
-7.954677021213342,7.928168773651123
-7.931814161156377,7.904826641082764
-7.954677021213342,7.960200786590576
-7.950781972366453,7.917119026184082
-7.9737577757544535,7.92708683013916
-7.950781972366453,7.937173366546631
-7.9393021526221474,7.92104434967041
-7.954677021213342,7.938433647155762
-7.91721462968355,7.931767463684082
-7.950781972366453,7.932121753692627
-7.920818811243059,7.926943302154541
-7.903090094245322,7.910041332244873
-7.935542022791058,7.939566612243652
-7.920818811243059,7.917374134063721
-7.9393021526221474,7.927134037017822
-7.9430951409681345,7.93359375
-7.935542022791058,7.906294822692871
-7.924453006674053,7.932794094085693
-7.920818811243059,7.897310256958008
-7.931814161156377,7.928898334503174
-7.838693701646425,7.909877300262451
-7.903090094245322,7.891406536102295
-7.931814161156377,7.921148777008057
-7.995678626217357,7.96006965637207
-7.946921547407927,7.918239116668701
-7.904602317703036,7.904621601104736
-7.9393021526221474,7.90031099319458
-7.950781972366453,7.909803867340088
-7.924453006674053,7.897373199462891
-7.931814161156377,7.922973155975342
-7.954677021213342,7.960922718048096
-7.91721462968355,7.890013217926025
-7.89962956062971,7.907088279724121
-7.950781972366453,7.951590061187744
-7.9393021526221474,7.941371440887451
-7.920818811243059,7.90585470199585
-7.920818811243059,7.9172563552856445
-7.903090094245322,7.896426677703857
-7.9393021526221474,7.926278591156006
-7.9430951409681345,7.937572002410889
-7.924453006674053,7.899311065673828
-7.9393021526221474,7.928069591522217
-7.950781972366453,7.927805423736572
-7.920818811243059,7.927052974700928
-7.89962956062971,7.923037052154541
-7.9393021526221474,7.9129438400268555
-7.954677021213342,7.915518283843994
-7.96981377267859,7.972225666046143
-7.931814161156377,7.9153923988342285
-7.954677021213342,7.9103569984436035
-7.946921547407927,7.924108982086182
-7.946921547407927,7.924119472503662
-7.8761493177145505,7.914603233337402
-7.91721462968355,7.897317409515381
-7.910094953104535,7.915360450744629
-7.9393021526221474,7.921340465545654
-7.954677021213342,7.950559616088867
-7.952725130123009,7.952940464019775
-7.853872762493711,7.941414833068848
-7.946921547407927,7.925492763519287
-7.950781972366453,7.9162068367004395
-7.924453006674053,7.902120113372803
-7.924453006674053,7.927737236022949
-7.924453006674053,7.895116329193115
-7.91721462968355,7.912299633026123
-7.879425560900211,7.922684192657471
-7.853872762493711,7.907324314117432
-7.946921547407927,7.920124530792236
-7.982923651140671,7.911074638366699
-7.954677021213342,7.943633079528809
-7.9430951409681345,7.937317371368408
-7.946219331461382,7.932526111602783
-7.889410352488291,7.917538166046143
-7.950781972366453,7.906169414520264
-7.931814161156377,7.911255359649658
-7.906578398789698,7.903151512145996
-7.954677021213342,7.9207940101623535
-7.954677021213342,7.961760997772217
-7.9430951409681345,7.943995952606201
-7.950781972366453,7.9489569664001465
-7.946921547407927,7.884458065032959
-7.9913998274291025,7.96242618560791
-7.954677021213342,7.943075180053711
-7.946921547407927,7.930169105529785
-7.931814161156377,7.915934085845947
-7.950781972366453,7.954184055328369
-7.815309402546056,7.892152309417725
-7.935542022791058,7.918289661407471
-7.950781972366453,7.935507297515869
-7.950781972366453,7.939857482910156
-7.9393021526221474,7.935946941375732
-7.9430951409681345,7.901180267333984
-7.950781972366453,7.923047065734863
-7.935542022791058,7.911332130432129
-7.9393021526221474,7.920628070831299
-7.920818811243059,7.8964080810546875
-7.910094953104535,7.9172563552856445
-7.920818811243059,7.90912389755249
-7.91721462968355,7.9074788093566895
-7.89962956062971,7.923786163330078
-7.910094953104535,7.9067301750183105
-7.931814161156377,7.8929057121276855
-7.931814161156377,7.9199724197387695
-7.8416326138557455,7.926893711090088
-7.950781972366453,7.933010578155518
-7.935542022791058,7.891737461090088
-7.950781972366453,7.936936378479004
-7.863280055279963,7.927615642547607
-7.966617665152964,7.944360256195068
-7.954677021213342,7.933890342712402
-7.950781972366453,7.929110050201416
-7.954677021213342,7.95046854019165
-7.950781972366453,7.928521633148193
-7.866459873882536,7.885518550872803
-7.950781972366453,7.954807758331299
-7.882728704344236,7.914857387542725
-7.889410352488291,7.9053754806518555
-7.995678626217357,7.928308963775635
-7.950781972366453,7.941586971282959
-7.950781972366453,7.9255852699279785
-7.924453006674053,7.9211554527282715
-7.9393021526221474,7.926332473754883
-7.9737577757544535,7.9575581550598145
-7.935542022791058,7.938430309295654
-7.9393021526221474,7.940213680267334
-7.922632107581136,7.924187183380127
-7.954677021213342,7.901724338531494
-7.924453006674053,7.924738883972168
-8.026824561605242,7.968814373016357
-7.8416326138557455,7.908276081085205
-7.920818811243059,7.929005146026611
-7.9737577757544535,7.948956489562988
-7.958607309235428,7.959278583526611
-7.9430951409681345,7.9371466636657715
-7.920818811243059,7.897876262664795
-7.9393021526221474,7.9393720626831055
-7.970532618892763,7.9303412437438965
-7.920818811243059,7.927968502044678
-7.9913998274291025,7.9387712478637695
-7.950781972366453,7.947048664093018
-7.931814161156377,7.898489952087402
-7.924453006674053,7.92751932144165
-7.838628495628443,7.913902759552002
-7.954677021213342,7.919755935668945
-7.931814161156377,7.903981685638428
-7.924453006674053,7.9244561195373535
-7.950781972366453,7.94654655456543
-7.950781972366453,7.930440425872803
-7.950781972366453,7.9326558113098145
-7.954677021213342,7.9133148193359375
-7.892790308673911,7.944746494293213
-7.866459873882536,7.9177117347717285
-7.886056354845152,7.9034104347229
-7.966576241738391,7.964951038360596
-7.920818811243059,7.908329963684082
-7.860153329415682,7.897911548614502
-7.91721462968355,7.899068832397461
-7.9737577757544535,7.922165870666504
-7.897811916161621,7.922508239746094
-7.928117974144348,7.915089130401611
-7.946921547407927,7.912783622741699
-7.946921547407927,7.926873683929443
-7.928117974144348,7.902101039886475
-7.954677021213342,7.93037223815918
-7.935542022791058,7.923218727111816
-7.954677021213342,7.9480791091918945
-7.951252960495686,7.947174072265625
-7.9737577757544535,7.950245380401611
-7.91721462968355,7.907462120056152
-7.91721462968355,7.9316301345825195
-7.882728704344236,7.892824649810791
-7.920818811243059,7.898728847503662
-7.89962956062971,7.883384704589844
-7.935542010773082,7.942905902862549
-7.9393021526221474,7.932394981384277
-7.91721462968355,7.917109966278076
-7.9430951409681345,7.9419145584106445
-7.950781972366453,7.93143892288208
-7.935542022791058,7.9243597984313965
-7.908539684071192,7.8982367515563965
-7.9430951409681345,7.924957275390625
-7.946921547407927,7.927616596221924
-7.995678626217357,7.9139533042907715
-7.896196359268842,7.888504505157471
-7.9430951409681345,7.933326721191406
-7.931814161156377,7.9036126136779785
-7.950781972366453,7.949204921722412
-7.886056354845152,7.899263381958008
-7.950781972366453,7.936903476715088
-7.931439075798742,7.932104110717773
-7.982923651140671,7.945936679840088
-7.950781972366453,7.924377918243408
-7.950781972366453,7.918563365936279
-7.924453006674053,7.893299102783203
-7.931814161156377,7.903398036956787
-7.85078088734462,7.869838237762451
-7.950781972366453,7.942025661468506
-7.903090094245322,7.886324405670166
-7.995678626217357,7.961327075958252
-7.954677021213342,7.9410881996154785
-7.950781972366453,7.954941749572754
-7.927336730250859,7.9106221199035645
-7.903090094245322,7.889850616455078
-7.920818811243059,7.934329032897949
-7.920818811243059,7.900935649871826
-7.946921547407927,7.951875686645508
-7.954677021213342,7.929715633392334
-7.835637836224461,7.896638870239258
-7.950781972366453,7.940746784210205
-7.903090094245322,7.918051719665527
-7.954677021213342,7.93809700012207
-7.954677021213342,7.941923141479492
-7.950781972366453,7.90940523147583
-7.950781972366453,7.944566249847412
-7.903090094245322,7.881518840789795
-7.9393021526221474,7.8849616050720215
-7.856986114171083,7.913346767425537
-7.896196359268842,7.945709705352783
-7.943055911701025,7.94004487991333
-7.9430951409681345,7.914834976196289
-7.9737577757544535,7.9459919929504395
-7.9430951409681345,7.930239200592041
-7.924453006674053,7.9225172996521
-7.946921547407927,7.919554233551025
-7.892790308673911,7.903634548187256
-7.9393021526221474,7.956079006195068
-7.950781972366453,7.9142231941223145
-7.9393021526221474,7.9288010597229
-7.931814161156377,7.903241157531738
-7.946921547407927,7.928874492645264
-7.928117974144348,7.919407844543457
-7.950781972366453,7.916337966918945
-7.906578398789698,7.916800022125244
-7.935542022791058,7.9129767417907715
-7.928117974144348,7.91721248626709
-7.935542022791058,7.907559394836426
-7.896196359268842,7.89578104019165
-7.9430951409681345,7.936363697052002
-7.954677021213342,7.9288740158081055
-7.91721462968355,7.897054672241211
-7.920818811243059,7.929820537567139
-7.924453006674053,7.908993244171143
-7.882728704344236,7.894908428192139
-7.96981377267859,7.9038310050964355
-7.950781972366453,7.9346604347229
-7.92729567327985,7.900721073150635
-7.924453006674053,7.884470462799072
-7.9393021526221474,7.915155410766602
-7.935542022791058,7.908320903778076
-7.950781972366453,7.914999485015869
-7.946921547407927,7.930294513702393
-7.950781972366453,7.931221008300781
-7.954677021213342,7.933942794799805
-7.950781972366453,7.921498775482178
-7.950781972366453,7.9362382888793945
-7.924453006674053,7.893167018890381
-7.924453006674053,7.907882213592529
-7.9913998274291025,7.93202543258667
-7.903090094245322,7.891358375549316
-7.931814161156377,7.90763521194458
-7.903090094245322,7.894217491149902
-7.946921547407927,7.932748317718506
-7.928117974144348,7.910423755645752
-7.946921547407927,7.907106399536133
-7.9393021526221474,7.909370422363281
-7.9913998274291025,7.918734073638916
-7.924453006674053,7.916811466217041
-7.950781972366453,7.919405937194824
-7.889410352488291,7.9163665771484375
-7.935542022791058,7.926521301269531
-7.924453006674053,7.8944783210754395
-7.928117974144348,7.926263332366943
-7.950781972366453,7.920424461364746
-7.9430951409681345,7.943544864654541
-7.844664854175832,7.898739337921143
-7.924453006674053,7.9232354164123535
-7.9393021526221474,7.9230170249938965
-7.9430951409681345,7.926290512084961
-7.9393021526221474,7.90547513961792
-7.906578398789698,7.923837661743164
-7.950781972366453,7.942440509796143
-7.844664854175832,7.895096778869629
-7.924453006674053,7.878481864929199
-7.924453006674053,7.934360980987549
-7.9393021526221474,7.937589168548584
-7.954677021213342,7.955691337585449
-7.8728955601551585,7.9228196144104
-7.954677021213342,7.915951728820801
-7.924453006674053,7.921960353851318
-7.91721462968355,7.905511379241943
-7.924453006674053,7.9340009689331055
-7.845652390085675,7.832795143127441
-7.924453006674053,7.930491924285889
-7.931814161156377,7.918835639953613
-7.931814161156377,7.916797637939453
-7.91721462968355,7.901416301727295
-7.993085742757826,7.914982318878174
-7.882728704344236,7.932315826416016
-7.9393021526221474,7.914726734161377
-7.928117974144348,7.915291786193848
-7.9430951409681345,7.905206203460693
-7.9913998274291025,7.952986717224121
-7.835637836224461,7.920154094696045
-7.935542022791058,7.928222179412842
-7.970616219270671,7.95629358291626
-7.924453006674053,7.906757354736328
-7.924453006674053,7.917633533477783
-7.950781972366453,7.944149017333984
-7.85078088734462,7.883626461029053
-7.924453006674053,7.923977375030518
-7.924453006674053,7.924071788787842
-7.950781972366453,7.927266597747803
-7.931814161156377,7.895951271057129
-7.93765506239242,7.913349628448486
-7.91721462968355,7.906808853149414
-7.913640203677234,7.889842510223389
-7.935542022791058,7.910279750823975
-7.866212066669052,7.908332347869873
-7.9430951409681345,7.9203362464904785
-7.950781972366453,7.945758819580078
-7.946921547407927,7.906727313995361
-7.954677021213342,7.9381208419799805
-7.853872762493711,7.9003376960754395
-7.950781972366453,7.930042743682861
-7.924453006674053,7.933735370635986
-7.995678626217357,7.8914875984191895
-7.879425560900211,7.916303634643555
-7.954677021213342,7.946127414703369
-7.928936536236001,7.924813747406006
-7.910094953104535,7.907142162322998
-7.931814161156377,7.893529891967773
-7.928117974144348,7.900141716003418
-7.935542022791058,7.925518989562988
-7.913640203677234,7.928926944732666
-7.950781972366453,7.935655117034912
-7.924453006674053,7.90027379989624
-7.889410352488291,7.91674280166626
-7.950781972366453,7.931509494781494
-7.96257349994767,7.92197847366333
-7.954677021213342,7.937129497528076
-7.91721462968355,7.913876533508301
-7.935542022791058,7.913572788238525
-7.950781972366453,7.919488906860352
-7.928117974144348,7.917261123657227
-7.954677021213342,7.940533638000488
-7.928117974144348,7.909599781036377
-7.920818811243059,7.905517101287842
-7.9393021526221474,7.883127212524414
-7.920818811243059,7.911462783813477
-7.931814161156377,7.9021172523498535
-7.950781972366453,7.913391590118408
-7.950781972366453,7.966780185699463
-7.903090094245322,7.914489269256592
-7.866459873882536,7.884432315826416
-7.954677021213342,7.934132099151611
-7.946921547407927,7.9654951095581055
-7.920818811243059,7.914752960205078
-7.9393021526221474,7.931424617767334
-7.85078088734462,7.928643703460693
-7.906578398789698,7.901209354400635
-7.89962956062971,7.939939975738525
-7.913640203677234,7.907003879547119
-7.906578398789698,7.922934055328369
-7.946921547407927,7.915585994720459
-7.931814161156377,7.897947788238525
-7.973156262517851,7.94769811630249
-7.924453006674053,7.928866863250732
-7.867870619770326,7.914093017578125
-7.950781972366453,7.968433856964111
-7.950781972366453,7.9283857345581055
-7.924453006674053,7.928660869598389
-7.8761493177145505,7.885890483856201
-7.924453006674053,7.874330997467041
-7.910094953104535,7.920231342315674
-7.935542022791058,7.903953552246094
-7.950781972366453,7.918546199798584
-7.928117974144348,7.906656742095947
-7.9430951409681345,7.8999552726745605
-7.913640203677234,7.918229579925537
-7.906578398789698,7.899869918823242
-7.920818811243059,7.909413814544678
-7.910094953104535,7.880899906158447
-7.910094953104535,7.91884708404541
-7.9430951409681345,7.903767108917236
-7.924453006674053,7.922389030456543
-7.950781972366453,7.92777681350708
-7.9430951409681345,7.953403472900391
-7.924453006674053,7.904658794403076
-7.950781972366453,7.92777681350708
-7.946219331461382,7.932381629943848
-7.856986114171083,7.903916835784912
-7.906578398789698,7.945764064788818
-7.978895913358191,7.973322868347168
-7.9737577757544535,7.960334777832031
-7.886056354845152,7.882382869720459
-7.9430951409681345,7.923701763153076
-7.9393021526221474,7.919749736785889
-7.886056354845152,7.897402763366699
-7.935542022791058,7.9039740562438965
-7.935542022791058,7.931203842163086
-7.95172445996154,7.91301965713501
-7.950781972366453,7.920298099517822
-7.950781972366453,7.950379371643066
-7.928117974144348,7.91163969039917
-7.8728955601551585,7.925185680389404
-7.954677021213342,7.94636869430542
-7.958607309235428,7.93441915512085
-7.9430951409681345,7.915375232696533
-7.954677021213342,7.949495792388916
-7.9393021526221474,7.937405109405518
-7.946921547407927,7.915798187255859
-7.950781972366453,7.924802780151367
-7.8761493177145505,7.904566287994385
-7.954677021213342,7.9266180992126465
-7.91721462968355,7.923427104949951
-8.008819571765459,7.995232105255127
-7.903090094245322,7.913541316986084
-7.935542022791058,7.905826568603516
-7.950781972366453,7.946075916290283
-7.91721462968355,7.922069072723389
-7.935542022791058,7.8997344970703125
-7.931814161156377,7.928289413452148
-7.935542022791058,7.911223888397217
-7.9737577757544535,7.9636735916137695
-7.924453006674053,7.904847621917725
-7.928117974144348,7.905747890472412
-7.935542022791058,7.918990135192871
-7.9281180277318715,7.913941383361816
-7.924453006674053,7.941597938537598
-7.9430951409681345,7.9306721687316895
-7.950781972366453,7.9241228103637695
-7.931814161156377,7.9332451820373535
-7.903090094245322,7.92124605178833
-7.970532618892763,7.95861291885376
-7.935542022791058,7.916212558746338
-7.950781972366453,7.930555820465088
-7.9393021526221474,7.907599925994873
-7.8761493177145505,7.927475452423096
-7.950781972366453,7.918184280395508
-7.9393021526221474,7.93825101852417
-7.931814161156377,7.925146102905273
-7.924453006674053,7.90913724899292
-7.995678626217357,7.92377233505249
-7.896196359268842,7.921386241912842
-7.931814161156377,7.909610748291016
-7.8416326138557455,7.890476703643799
-7.931814161156377,7.94057035446167
-7.954677021213342,7.950941562652588
-7.9393021526221474,7.928781509399414
-7.9226320855575,7.954971790313721
-7.946921547407927,7.907273769378662
-7.991531413298041,7.987422466278076
-7.896196359268842,7.933318614959717
-7.924453006674053,7.921987056732178
-7.950781972366453,7.893453121185303
-7.9393021526221474,7.907553195953369
-7.870077682537097,7.906092166900635
-7.920818811243059,7.9210076332092285
-7.9393021526221474,7.935303211212158
-7.935542022791058,7.931210517883301
-7.954677021213342,7.936904430389404
-7.954677021213342,7.948180675506592
-7.931814161156377,7.9062676429748535
-7.938058700829053,7.921841621398926
-7.920818811243059,7.903924465179443
-7.954677021213342,7.951210021972656
-7.954677021213342,7.953287601470947
-7.8013712254607785,7.867745399475098
-7.950781972366453,7.9339399337768555
-7.879425560900211,7.936638832092285
-7.935542022791058,7.917870998382568
-7.896196359268842,7.914422512054443
-7.924453006674053,7.877508640289307
-7.946921547407927,7.910553932189941
-7.920818811243059,7.9171576499938965
-7.954677021213342,7.9436259269714355
-7.924453006674053,7.90413236618042
-7.946921547407927,7.9378509521484375
-7.950781972366453,7.9366302490234375
-7.950781972366453,7.931824684143066
-7.950781972366453,7.917796611785889
-7.935542022791058,7.929698467254639
-7.946921547407927,7.922229766845703
-7.847706165863548,7.905755996704102
-7.946921547407927,7.928940296173096
-7.928117974144348,7.93361234664917
-7.924453006674053,7.909408092498779
-7.9393021526221474,7.945047855377197
-7.950781972366453,7.914426803588867
-7.931814161156377,7.897024631500244
-7.950781972366453,7.922151565551758
-7.910094953104535,7.912583351135254
-7.954677021213342,7.970836639404297
-7.982923651140671,7.937203884124756
-7.863280055279963,7.90818977355957
-7.9430951409681345,7.934328556060791
-7.8416326138557455,7.901284694671631
-7.950781972366453,7.9114556312561035
-7.950781972366453,7.925252437591553
-7.928117974144348,7.890471935272217
-7.9393021526221474,7.954237937927246
-7.950781972366453,7.975244998931885
-7.942381102016373,7.925252914428711
-7.866625579174465,7.912774085998535
-7.931814161156377,7.890101909637451
-8.008819571765459,7.990720748901367
-7.91721462968355,7.915360927581787
-7.896196359268842,7.885333061218262
-7.906578398789698,7.888232707977295
-7.882728704344236,7.908034801483154
-7.9913998274291025,7.9419331550598145
-7.920818811243059,7.91462516784668
-7.920818811243059,7.910507678985596
-7.9430951409681345,7.9109206199646
-7.954677021213342,7.948978900909424
-7.943055911701025,7.946238040924072
-7.978895913358191,7.889407157897949
-7.950781972366453,7.919489860534668
-7.89641998736639,7.894044876098633
-7.954677021213342,7.8994832038879395
-7.924453006674053,7.917867183685303
-7.982966659490206,7.960420608520508
-7.96257349994767,7.939355373382568
-7.9393021526221474,7.905137538909912
-7.950781972366453,7.948570728302002
-7.9393021526221474,7.925746440887451
-7.954677021213342,8.004253387451172
-7.946921547407927,7.954346179962158
-7.920818811243059,7.925454616546631
-7.920818811243059,7.918935298919678
-7.903090094245322,7.889070987701416
-7.928117974144348,7.9176225662231445
-7.963788392246652,7.898045063018799
-7.863280055279963,7.922693252563477
-7.910094953104535,7.923532962799072
-7.96257349994767,7.947662830352783
-7.946921547407927,7.921188831329346
-7.920818811243059,7.890546798706055
-7.950781972366453,7.919095993041992
-7.924453006674053,7.925766944885254
-7.995678626217357,7.930034637451172
-7.931814161156377,7.916125774383545
-7.9430951409681345,7.936551570892334
-7.935542022791058,7.9179534912109375
-7.9737577757544535,7.9474101066589355
-7.928117974144348,7.889023780822754
-7.847706165863548,7.932037830352783
-7.924453006674053,7.903852939605713
-7.946921547407927,7.9399213790893555
-7.877211195454222,7.878157138824463
-7.950781972366453,7.932338237762451
-7.818151283467686,7.920604228973389
-7.946921547407927,7.912317276000977
-7.8761493177145505,7.917722702026367
-7.913640203677234,7.87986946105957
-7.946921547407927,7.908851623535156
-7.869665979871627,7.898497104644775
-7.920818811243059,7.916719436645508
-7.954677021213342,7.9267168045043945
-7.85078088734462,7.902822494506836
-7.903681041351079,7.902587413787842
-7.946921547407927,7.931253910064697
-7.954677021213342,7.943354606628418
-7.91721462968355,7.903937816619873
-7.927727176545458,7.9337477684021
-7.946921547407927,7.944122791290283
-7.85078088734462,7.915499210357666
-7.924453006674053,7.918033123016357
-7.935542022791058,7.926960468292236
-7.928117974144348,7.895594120025635
-7.995678626217357,7.899794578552246
-7.913640203677234,7.890613079071045
-7.860119116630385,7.888004779815674
-7.924453006674053,7.917355537414551
-7.950781972366453,7.917454719543457
-7.9430951409681345,7.970631122589111
-7.9393021526221474,7.929850101470947
-7.889410352488291,7.924832820892334
-7.954677021213342,7.9436869621276855
-7.954677021213342,7.9437785148620605
-7.950781972366453,7.9298095703125
-7.9393021526221474,7.926269054412842
-7.906578398789698,7.901308536529541
-7.928117974144348,7.893082618713379
-7.931814161156377,7.932125568389893
-7.950781972366453,7.9144816398620605
-7.920818811243059,7.921118259429932
-7.9393021526221474,7.910048961639404
-7.9393021526221474,7.916127681732178
-7.9393021526221474,7.911108493804932
-7.924453006674053,7.901362419128418
-7.946921547407927,7.937124252319336
-7.928117974144348,7.926334857940674
-7.9430951409681345,7.918345928192139
-7.940181051699369,7.959958553314209
-7.946921547407927,7.92105770111084
-7.928117974144348,7.897160053253174
-7.946921547407927,7.918705463409424
-7.924453006674053,7.907658100128174
-7.913640203677234,7.928084850311279
-7.946921547407927,7.928761959075928
-7.9393021526221474,7.92219352722168
-7.982923651140671,7.889207363128662
-7.939379961634402,7.9178242683410645
-7.9430951409681345,7.924410343170166
-7.920818811243059,7.921112537384033
-7.939379961634402,7.9369282722473145
-7.85078088734462,7.905307292938232
-7.9430951409681345,7.926877975463867
-7.954677021213342,7.94851016998291
-7.978895913358191,7.970062255859375
-7.946921547407927,7.918609619140625
-7.847706165863548,7.889018535614014
-7.931814161156377,7.915191173553467
-7.950781972366453,7.932577610015869
-7.931814161156377,7.924968242645264
-7.950781972366453,7.900477886199951
-7.892790308673911,7.919392108917236
-7.924453006674053,7.936522006988525
-7.950781972366453,7.929983615875244
-7.954333871520422,7.947056770324707
-7.940181051699369,7.943729877471924
-7.928117974144348,7.921799182891846
-7.889410352488291,7.883004665374756
-7.950781972366453,7.939996242523193
-7.975985781891215,7.946014404296875
-7.954677021213342,7.959160327911377
-7.928117974144348,7.881465435028076
-7.954677021213342,7.934781074523926
-7.9393021526221474,7.930923938751221
-7.954677021213342,7.9220099449157715
-7.866459873882536,7.89722204208374
-7.935542022791058,7.877594947814941
-7.950781972366453,7.939870357513428
-7.97195645462988,7.901760101318359
-7.9393021526221474,7.918144702911377
-7.954677021213342,7.908750057220459
-7.954677021213342,7.935031890869141
-7.923581356476356,7.907389163970947
-7.995678626217357,7.934342861175537
-7.9393021526221474,7.911790370941162
-7.9430951409681345,7.936147689819336
-7.931814161156377,7.92946720123291
-8.026824561605242,7.9769368171691895
-7.946921547407927,7.951456546783447
-7.950781972366453,7.936688423156738
-7.946921547407927,7.954395294189453
-7.931814161156377,7.89125394821167
-7.950781972366453,7.922794818878174
-7.946921547407927,7.920741558074951
-7.910094953104535,7.886813640594482
-7.9737577757544535,7.923915386199951
-7.954677021213342,7.955813884735107
-7.950781972366453,7.930344104766846
-7.924453006674053,7.90783166885376
-7.931814161156377,7.9131999015808105
-7.931814161156377,7.937081813812256
-7.935542022791058,7.913872241973877
-7.853872762493711,7.917396068572998
-7.950781972366453,7.939747333526611
-7.995678626217357,7.954744815826416
-7.928117974144348,7.929723262786865
-7.896708615962599,7.882771015167236
-7.950781972366453,7.912633419036865
-7.946921547407927,7.935079097747803
-7.954677021213342,7.9500555992126465
-7.869665979871627,7.918872356414795
-7.954677021213342,7.91552209854126
-7.928117974144348,7.913741588592529
-7.8728955601551585,7.914968013763428
-7.935542022791058,7.9105448722839355
-7.9393021526221474,7.941878795623779
-7.924453006674053,7.93068265914917
-7.946921547407927,7.910813808441162
-7.964051851259558,7.929713726043701
-7.924453006674053,7.902874946594238
-7.950781972366453,7.881692409515381
-7.896196359268842,7.906148433685303
-7.924453006674053,7.896115303039551
-7.950781972366453,7.920833110809326
-7.991531413298041,7.979101657867432
-7.954677021213342,7.935330390930176
-7.924453006674053,7.914841175079346
-7.954677021213342,7.903786659240723
-7.924453006674053,7.92848539352417
-7.847706165863548,7.923999786376953
-7.906578398789698,7.917782306671143
-7.935542022791058,7.951122283935547
-7.904149213272221,7.919526100158691
-7.935542022791058,7.896164417266846
-7.982966659490206,7.939584255218506
-7.9393021526221474,7.913083553314209
-7.906578398789698,7.897567272186279
-7.9393021526221474,7.959430694580078
-7.950781972366453,7.94236946105957
-7.924453006674053,7.904440879821777
-7.946921547407927,7.949158191680908
-7.9393021526221474,7.9465250968933105
-7.995678626217357,7.963507175445557
-7.9200659509493825,7.92506742477417
-7.954677021213342,7.953332424163818
-7.93765506239242,7.927972316741943
-7.928117974144348,7.906308650970459
-7.8728955601551585,7.94150972366333
-7.91721462968355,7.925076007843018
-7.966576241738391,7.964421272277832
-7.954677021213342,7.946349143981934
-7.946921547407927,7.905564308166504
-7.928117974144348,7.903137683868408
-7.924453006674053,7.915257930755615
-7.941194503765821,7.923538684844971
-7.954677021213342,7.952530384063721
-7.946921547407927,7.92073917388916
-7.920818811243059,7.898377895355225
-7.954677021213342,7.9499688148498535
-7.8416326138557455,7.9306182861328125
-7.924453006674053,7.907815933227539
-7.866459873882536,7.928235054016113
-7.940181051699369,7.913585186004639
-7.920818811243059,7.898010730743408
-7.946921547407927,7.911755084991455
-7.9430951409681345,7.929779529571533
-7.950781972366453,7.91179895401001
-7.995678626217357,7.89820671081543
-7.96257349994767,7.973707675933838
-7.928117974144348,7.918392181396484
-7.9430951409681345,7.935544013977051
-7.906578398789698,7.929020881652832
-7.9393021526221474,7.924231052398682
-7.950781972366453,7.936694622039795
-7.950781972366453,7.938417911529541
-7.920818811243059,7.913313388824463
-7.889410352488291,7.900898456573486
-7.924453006674053,7.902918815612793
-7.935542022791058,7.9309000968933105
-7.946921547407927,7.898640155792236
-7.9430951409681345,7.925837993621826
-7.920818811243059,7.911619186401367
-7.96257349994767,7.952549457550049
-7.950781972366453,7.938243865966797
-7.948896057516428,7.914890766143799
-7.9737577757544535,7.937348365783691
-7.9393021526221474,7.931074142456055
-7.954677021213342,7.942271709442139
-7.970532618892763,7.962601661682129
-7.924453006674053,7.905672073364258
-7.91721462968355,7.960712909698486
-7.9430951409681345,7.940366268157959
-7.931814161156377,7.911466598510742
-7.924453006674053,7.930668354034424
-7.910094953104535,7.881523609161377
-7.920818811243059,7.900458812713623
-7.9430951409681345,7.915818691253662
-7.879425560900211,7.902050018310547
-7.896196359268842,7.909422397613525
-7.924453006674053,7.936498165130615
-7.9430951409681345,7.921773433685303
-7.931080216138895,7.9598307609558105
-7.935542022791058,7.903444290161133
-7.91721462968355,7.89702844619751
-7.946921547407927,7.936399936676025
-7.9430951409681345,7.945296764373779
-7.924453006674053,7.919825553894043
-7.946921547407927,7.935431003570557
-7.892790308673911,7.906355381011963
-7.954677021213342,7.885305404663086
-7.935542022791058,7.930507183074951
-7.970532618892763,7.956069469451904
-7.950781972366453,7.9443817138671875
-7.863280055279963,7.894741535186768
-7.950781972366453,7.912133693695068
-7.924453006674053,7.9126081466674805
-7.970532618892763,7.9794158935546875
-7.866459873882536,7.880351543426514
-7.931814161156377,7.9381489753723145
-7.9393021526221474,7.9271626472473145
-7.946921547407927,7.926977634429932
-7.9430951409681345,7.95723295211792
-7.903090094245322,7.931732654571533
-7.950781972366453,7.926789283752441
-7.946921547407927,7.963902473449707
-7.931814161156377,7.90969181060791
-7.876126826038142,7.902035236358643
-7.935542022791058,7.9409379959106445
-7.954677021213342,7.910400867462158
-7.9430951409681345,7.956676006317139
-7.9393021526221474,7.917468547821045
-7.9430951409681345,7.924498558044434
-7.950781972366453,7.9231438636779785
-7.950781972366453,7.944404125213623
-7.950781972366453,7.927065372467041
-7.946921547407927,7.942999839782715
-7.946921547407927,7.922377586364746
-7.935542022791058,7.92789363861084
-7.950781972366453,7.923945903778076
-7.945701027587961,7.92213249206543
-7.910094953104535,7.910607814788818
-7.954677021213342,7.91950798034668
-7.950781972366453,7.914147853851318
-7.89962956062971,7.914048194885254
-7.93468629292431,7.947086811065674
-7.950781972366453,7.922420024871826
-7.906578398789698,7.920302391052246
-7.950781972366453,7.955341815948486
-7.886056354845152,7.902658939361572
-7.931814161156377,7.902763843536377
-7.8637543524515,7.899080753326416
-7.954677021213342,7.933979511260986
-7.928117974144348,7.907405853271484
-7.946921547407927,7.946004390716553
-7.91721462968355,7.920138835906982
-7.8728955601551585,7.933477878570557
-7.923581356476356,7.9151225090026855
-7.928117974144348,7.9061055183410645
-7.954677021213342,7.947742462158203
-7.946921547407927,7.914226531982422
-7.982923651140671,7.918642997741699
-7.928117974144348,7.950669765472412
-7.815309402546056,7.886719226837158
-7.920818811243059,7.927081108093262
-7.950781972366453,7.920043468475342
-7.928117974144348,7.935207366943359
-7.928117974144348,7.9266157150268555
-7.986842092993013,7.9293389320373535
-7.924453006674053,7.917590141296387
-7.910094953104535,7.91641092300415
-7.950781972366453,7.940755844116211
-7.8728955601551585,7.885359764099121
-7.931814161156377,7.906876087188721
-7.931814161156377,7.90554141998291
-7.935542022791058,7.9273505210876465
-7.9393021526221474,7.9363322257995605
-7.928117974144348,7.910372734069824
-7.879425560900211,7.888963222503662
-7.946921547407927,7.950235366821289
-7.954677021213342,7.92932653427124
-7.950781972366453,7.926084041595459
-7.931814161156377,7.941422939300537
-7.823919469453418,7.899031639099121
-7.913640691902861,7.909352779388428
-7.910094953104535,7.9177327156066895
-7.946082651207223,7.900607585906982
-7.920818811243059,7.93662691116333
-7.9393021526221474,7.925463676452637
-7.995678626217357,7.920280933380127
-7.879425560900211,7.919530868530273
-7.954677021213342,7.903432369232178
-7.924453006674053,7.906806945800781
-7.954677021213342,7.931332111358643
-7.9430951409681345,7.903529644012451
-7.950781972366453,7.925936222076416
-7.950781972366453,7.923573970794678
-7.946921547407927,7.8992438316345215
-7.882728704344236,7.9114603996276855
-7.946921547407927,7.93795108795166
-7.928117974144348,7.917858600616455
-7.9393021526221474,7.892254829406738
-7.920818811243059,7.898225784301758
-7.954677021213342,7.952227592468262
-7.9393021526221474,7.939779758453369
-7.928117974144348,7.9199538230896
-7.9393021526221474,7.92178201675415
-7.882728704344236,7.921783924102783
-7.950781972366453,7.912017345428467
-7.910094953104535,7.8762993812561035
-7.896196359268842,7.880580425262451
-7.913640203677234,7.917218208312988
-7.9393021526221474,7.917762279510498
-7.82102305270683,7.91461706161499
-7.9430951409681345,7.946178913116455
-7.9393021526221474,7.9337029457092285
-7.966576241738391,7.938726902008057
-7.995678626217357,7.96401309967041
-7.924453006674053,7.914633274078369
-7.950781972366453,7.912100315093994
-7.924453006674053,7.923528671264648
-7.954677021213342,7.921703815460205
-7.97490518667181,7.965521335601807
-7.835637836224461,7.882391929626465
-7.954677021213342,7.951626777648926
-7.935542022791058,7.925482273101807
-7.935542022791058,7.929018974304199
-7.954677021213342,7.902455806732178
-7.928117974144348,7.9352922439575195
-7.910094953104535,7.928691387176514
-7.950781972366453,7.938401699066162
-7.931814161156377,7.934945583343506
-7.9430951409681345,7.924354076385498
-7.878606331107103,7.932240009307861
-7.954677021213342,7.950744152069092
-7.935542022791058,7.9549641609191895
-7.924453006674053,7.908810138702393
-7.889410352488291,7.895017623901367
-7.931814161156377,7.901916027069092
-7.91721462968355,7.934438228607178
-7.939302143143198,7.923680782318115
-7.928117974144348,7.898252010345459
-7.928117974144348,7.896780490875244
-7.892790308673911,7.910134792327881
-7.924453006674053,7.915822505950928
-7.924453006674053,7.925912857055664
-7.89962956062971,7.913704872131348
-7.935542022791058,7.936539173126221
-7.950781972366453,7.9314470291137695
-7.954677021213342,7.936522006988525
-7.954677021213342,7.948575973510742
-7.954677021213342,7.941926002502441
-7.924453006674053,7.907782077789307
-7.935542022791058,7.917974948883057
-7.974694136660875,7.95499849319458
-7.946921547407927,7.947598457336426
-7.91721462968355,7.901144504547119
-7.928117974144348,7.923867702484131
-7.9393021526221474,7.931918144226074
-7.877211195454222,7.908773899078369
-7.931814161156377,7.914056301116943
-7.9430951409681345,7.909127712249756
-7.886056354845152,7.900227069854736
-7.931814161156377,7.917306900024414
-7.946082651207223,7.920396327972412
-7.928117974144348,7.899773120880127
-7.882728704344236,7.912637710571289
-7.924453006674053,7.912311553955078
-7.920818811243059,7.927620887756348
-7.946921547407927,7.904839992523193
-7.948847473653619,7.942358493804932
-7.906578398789698,7.889142036437988
-7.889410352488291,7.928597450256348
-7.928117974144348,7.917822360992432
-7.954677021213342,7.943317413330078
-7.931814161156377,7.923335552215576
-7.928117974144348,7.896146297454834
-7.924453006674053,7.8973541259765625
-7.928117974144348,7.904330253601074
-7.928117974144348,7.898730754852295
-7.995678626217357,7.901631832122803
-7.954677021213342,7.943396091461182
-7.950781972366453,7.929693222045898
-7.928117974144348,7.89611291885376
-7.866625579174465,7.880390167236328
-7.924453006674053,7.89747428894043
-7.9430951409681345,7.952960014343262
-7.954677021213342,7.939942836761475
-7.8728955601551585,7.9085164070129395
-7.886056354845152,7.884670257568359
-7.924453006674053,7.921914100646973
-7.950781972366453,7.9198431968688965
-7.9393021526221474,7.929776668548584
-7.986242509102693,7.955320835113525
-7.950781972366453,7.90720272064209
-7.954677021213342,7.943819522857666
-7.920818811243059,7.919674396514893
-7.924453006674053,7.922312259674072
-7.935542022791058,7.922516345977783
-7.954677021213342,7.93520975112915
-7.8416326138557455,7.917567253112793
-7.954677021213342,7.933724880218506
-7.935542022791058,7.9194111824035645
-7.924453006674053,7.92750883102417
-7.9393021526221474,7.921793460845947
-7.950781972366453,7.928202152252197
-7.924453006674053,7.94713020324707
-7.85078088734462,7.880865573883057
-7.9100228526366605,7.925495147705078
-7.935542022791058,7.923786640167236
-7.922491400135772,7.945379734039307
-7.954677021213342,7.9363579750061035
-7.928117974144348,7.892575740814209
-7.950781972366453,7.912653923034668
-7.906578398789698,7.90360689163208
-7.950781972366453,7.93154239654541
-7.928117974144348,7.920688629150391
-7.954677021213342,7.943004131317139
-7.913640203677234,7.903754711151123
-7.924453006674053,7.918285369873047
-7.946921547407927,7.9280195236206055
-7.9393021526221474,7.915606498718262
-7.928117974144348,7.916270732879639
-7.920818811243059,7.8991169929504395
-7.935542022791058,7.941629886627197
-7.935542022791058,7.920618057250977
-7.982966659490206,7.966802597045898
-7.954677021213342,7.933074474334717
-7.924453006674053,7.926927089691162
-7.910094953104535,7.910231113433838
-7.920818811243059,7.922410488128662
-7.950781972366453,7.930136203765869
-7.946921547407927,7.910333156585693
-7.954677021213342,7.931400299072266
-7.903090094245322,7.892947673797607
-7.924453006674053,7.893548488616943
-7.954677021213342,7.9537835121154785
-7.9393021526221474,7.924610614776611
-7.954677021213342,7.889073848724365
-7.889410352488291,7.919232368469238
-7.931814161156377,7.934558391571045
-7.9393021526221474,7.903402805328369
-7.920818811243059,7.890824794769287
-7.9393021526221474,7.912330150604248
-7.950781972366453,7.937366485595703
-7.954677021213342,7.940359115600586
-7.920818811243059,7.93220853805542
-7.954677021213342,7.937554359436035
-7.946921547407927,7.900339126586914
-7.9393021526221474,7.935433864593506
-7.924453006674053,7.907111644744873
-7.928117974144348,7.914173603057861
-7.954677021213342,7.931484222412109
-7.8761493177145505,7.9086833000183105
-7.9616219366397445,7.955269813537598
-7.924453006674053,7.8986592292785645
-7.950781972366453,7.9260759353637695
-7.920818811243059,7.904809474945068
-7.882728704344236,7.90503454208374
-7.946921547407927,7.917433261871338
-7.982966659490206,7.939904689788818
-7.950781972366453,7.946800231933594
-7.950781972366453,7.948984622955322
-7.954677021213342,7.951995372772217
-7.950781972366453,7.9389328956604
-7.950781972366453,7.938796043395996
-7.920818811243059,7.895325183868408
-7.932979898863743,7.908071994781494
-7.950781972366453,7.9497199058532715
-7.91721462968355,7.925342559814453
-7.950781972366453,7.962362766265869
-7.9393021526221474,7.944943428039551
-7.9430951409681345,7.922299385070801
-7.928117974144348,7.90439510345459
-7.954677021213342,7.9406208992004395
-7.9393021526221474,7.932696342468262
-7.879425560900211,7.929101467132568
-7.886522706972261,7.88420295715332
-7.924453006674053,7.923110008239746
-7.924453006674053,7.919448375701904
-7.950781972366453,7.917321681976318
-7.954677021213342,7.946866512298584
-7.954677021213342,7.921786785125732
-7.950781972366453,7.922851085662842
-7.882728704344236,7.902841091156006
-7.950781972366453,7.917652130126953
-7.954677021213342,7.921274662017822
-7.946921547407927,7.917625427246094
-7.903090094245322,7.899121284484863
-7.924453006674053,7.93013334274292
-7.924453006674053,7.900535583496094
-7.9393021526221474,7.923338413238525
-7.9393021526221474,7.938193321228027
-7.9393021526221474,7.928703308105469
-7.935542022791058,7.909485340118408
-7.970532618892763,7.966235160827637
-7.950781972366453,7.930602550506592
-7.928155902956855,7.898346900939941
-7.920818811243059,7.880611896514893
-7.950781972366453,7.920210838317871
-7.954677021213342,7.919018745422363
-7.91721462968355,7.976778507232666
-7.950241642100192,7.913649082183838
-7.924453006674053,7.901291370391846
-7.995678626217357,7.938511371612549
-7.966617665152964,7.922320365905762
-7.879425560900211,7.933112144470215
-7.995678626217357,7.913805961608887
-7.853872762493711,7.904124736785889
-7.946921547407927,7.900629043579102
-7.924453006674053,7.928607940673828
-7.928117974144348,7.931955814361572
-7.928117974144348,7.905889987945557
-7.954677021213342,7.934162139892578
-7.928117974144348,7.9140472412109375
-7.950781972366453,7.934283256530762
-7.9450041278335135,7.9195556640625
-7.9430951409681345,7.932387828826904
-7.924453006674053,7.934574604034424
-7.935542022791058,7.908452987670898
-7.9383225629203995,7.900551795959473
-7.954677021213342,7.953351974487305
-7.954677021213342,7.912968158721924
-7.946921547407927,7.933387756347656
-7.9393021526221474,7.916130542755127
-7.924603424800292,7.9264817237854
-7.9393021526221474,7.933112621307373
-7.950781972366453,7.916110992431641
-7.924453006674053,7.905380725860596
-7.896196359268842,7.910765171051025
-7.94677806718906,7.931438446044922
-7.91721462968355,7.908461093902588
-7.9430951409681345,7.9396071434021
-7.924453006674053,7.924482822418213
-7.950781972366453,7.905860424041748
-7.946921547407927,7.940627098083496
-7.9430951409681345,7.936394691467285
-7.950781972366453,7.938853740692139
-7.928117974144348,7.918206214904785
-7.931814161156377,7.932866096496582
-7.954677021213342,7.943005561828613
-7.9430951409681345,7.93902063369751
-7.950781972366453,7.93764066696167
-7.886069026765648,7.9404826164245605
-7.920818811243059,7.9100117683410645
-7.9430951409681345,7.886264324188232
-7.950781972366453,7.925479412078857
-7.946921547407927,7.912297248840332
-7.954677021213342,7.929060459136963
-7.950781972366453,7.9242844581604
-7.89962956062971,7.92799186706543
-7.924453006674053,7.893457889556885
-7.950781972366453,7.941679000854492
-7.928117974144348,7.915087699890137
-7.931814161156377,7.912541389465332
-7.9393021526221474,7.925238609313965
-7.952121763853551,7.934721946716309
-7.976503417924229,7.946682453155518
-7.928117974144348,7.900749683380127
-7.935542022791058,7.942762851715088
-7.913640203677234,7.9183220863342285
-7.950781972366453,7.9473772048950195
-7.950781972366453,7.934256553649902
-7.9393021526221474,7.931850910186768
-7.950781972366453,7.938683986663818
-7.954677021213342,7.902133464813232
-7.924453006674053,7.902066230773926
-7.950781972366453,7.934443473815918
-7.946921547407927,7.920750617980957
-7.928117974144348,7.93687629699707
-7.928117974144348,7.913764953613281
-7.975985781891215,7.949178218841553
-7.950781972366453,7.92171049118042
-7.869665979871627,7.908453941345215
-7.935542022791058,7.932229042053223
-7.9393021526221474,7.933399677276611
-7.881888254406144,7.904455184936523
-7.954677021213342,7.96100378036499
-7.974694136660875,7.921339511871338
-7.906578398789698,7.909285545349121
-7.896196359268842,7.933742523193359
-7.9393021526221474,7.9385175704956055
-7.946921547407927,7.923674583435059
-7.928155902956855,7.926084041595459
-7.860119116630385,7.9463276863098145
-7.954677021213342,7.962133407592773
-7.946921547407927,7.933521270751953
-7.950781972366453,7.9408721923828125
-7.946921547407927,7.929044246673584
-7.9430951409681345,7.916723251342773
-7.928117974144348,7.889801502227783
-7.935542022791058,7.9122538566589355
-7.829115272642338,7.847377300262451
-7.950781972366453,7.924817085266113
-7.931814161156377,7.912152290344238
-7.966617665152964,7.927666664123535
-7.9393021526221474,7.932048320770264
-7.9393021526221474,7.917859077453613
-7.931814161156377,7.8850884437561035
-7.863280055279963,7.89635705947876
-7.954677021213342,7.9429826736450195
-7.904112985027737,7.9160542488098145
-7.903090094245322,7.91199254989624
-7.882728704344236,7.920582294464111
-7.9430951409681345,7.94446325302124
-7.924453006674053,7.952051639556885
-7.946921547407927,7.94143009185791
-7.9430951409681345,7.907347202301025
-7.847706165863548,7.881837844848633
-7.835637836224461,7.902988910675049
-7.924453006674053,7.937248706817627
-7.931814161156377,7.9032416343688965
-7.910071604962776,7.903518199920654
-7.879425560900211,7.923758029937744
-7.9393021526221474,7.918962001800537
-7.928117974144348,7.903827667236328
-7.978810702253626,7.931558609008789
-7.935542022791058,7.9603962898254395
-7.951740612759727,7.931480407714844
-7.920818811243059,7.912501335144043
-7.982966659490206,7.951496601104736
-7.823919469453418,7.861640930175781
-7.9393021526221474,7.945826053619385
-7.954677021213342,7.947205066680908
-7.946921547407927,7.91251802444458
-7.869665979871627,7.884254455566406
-7.935542022791058,7.920719623565674
-7.91721462968355,7.901565074920654
-7.950781972366453,7.929688453674316
-7.946921547407927,7.932862758636475
-7.950781972366453,7.934257984161377
-7.954677021213342,7.950953960418701
-7.931814161156377,7.88344144821167
-7.9393021526221474,7.882212162017822
-7.9393021526221474,7.933535575866699
-7.948417707887132,7.919116020202637
-7.950781972366453,7.920787334442139
-7.935542022791058,7.891136646270752
-7.946921547407927,7.973222255706787
-7.928117974144348,7.911500453948975
-7.928117974144348,7.911031723022461
-7.85078088734462,7.847747325897217
-7.931814161156377,7.916809558868408
-7.954677021213342,7.915433406829834
-7.946921547407927,7.922125339508057
-7.928117974144348,7.94319486618042
-7.924453006674053,7.922982215881348
-7.954677021213342,7.938816070556641
-7.94476951650491,7.966246604919434
-7.9430951409681345,7.927535533905029
-7.978895913358191,7.960660934448242
-7.9737577757544535,7.979017734527588
-7.950781972366453,7.938401699066162
-7.928117974144348,7.914395809173584
-7.931814161156377,7.894778728485107
-7.944020948459547,7.933202266693115
-7.928117974144348,7.923257827758789
-7.987162773987728,7.986704349517822
-7.950781972366453,7.9378662109375
-7.954677021213342,7.905096530914307
-7.8349671212224035,7.916018962860107
-7.928117974144348,7.921424865722656
-7.808103965190196,7.857271194458008
-7.946921547407927,7.937121868133545
-7.954677021213342,7.930699825286865
-7.920818811243059,7.918549060821533
-7.9393021526221474,7.921175956726074
-7.954677021213342,7.9338908195495605
-7.970532618892763,7.960916996002197
-7.946921547407927,7.9146575927734375
-7.946921547407927,7.902552127838135
-7.946921547407927,7.908593654632568
-7.910094953104535,7.911756992340088
-7.946921547407927,7.924954891204834
-7.950781972366453,7.9465837478637695
-7.954677021213342,7.985793590545654
-7.9393021526221474,7.914540767669678
-7.950781972366453,7.9508466720581055
-7.935542022791058,7.943613529205322
-7.935542022791058,7.966888427734375
-7.954677021213342,7.9218525886535645
-7.920818811243059,7.919802665710449
-7.886056354845152,7.93054723739624
-7.935542022791058,7.913156509399414
-7.954677021213342,7.942819595336914
-7.928117974144348,7.900294303894043
-7.935542022791058,7.935244083404541
-7.928117974144348,7.8956403732299805
-7.950781972366453,7.950112819671631
-7.9430951409681345,7.952056407928467
-7.924453006674053,7.880834102630615
-7.9393021526221474,7.925932884216309
-7.950781972366453,7.931956768035889
-7.860119116630385,7.911895275115967
-7.9393021526221474,7.916317462921143
-7.869732506393041,7.899881839752197
-7.924453006674053,7.915968418121338
-7.946921547407927,7.941462993621826
-7.928117974144348,7.951566219329834
-7.954677021213342,7.926922798156738
-7.892790308673911,7.922603130340576
-7.85078088734462,7.849615097045898
-7.950781972366453,7.928861141204834
-7.946921547407927,7.9192070960998535
-7.946921547407927,7.940445899963379
-7.941316379949553,7.929079055786133
-7.924453006674053,7.905541896820068
-7.8877303691149265,7.901800632476807
-7.931814161156377,7.907820224761963
-7.931814161156377,7.938166618347168
-7.91721462968355,7.898612976074219
-7.950781972366453,7.923054218292236
-7.928117974144348,7.930766582489014
-7.886056354845152,7.907596111297607
-7.9430951409681345,7.9257612228393555
-7.939379961634402,7.9412617683410645
-7.982923651140671,7.969505310058594
-7.924453006674053,7.9220967292785645
-7.9430951409681345,7.921534061431885
-7.906578398789698,7.918793201446533
-7.935542022791058,7.930074691772461
-7.9430951409681345,7.92927885055542
-7.920818811243059,7.927468299865723
-7.905858399694566,7.889211177825928
-7.950781972366453,7.9332594871521
-7.920818811243059,7.918745517730713
-7.879425560900211,7.864946365356445
-7.950781972366453,7.927266597747803
-7.946358101683472,7.8967766761779785
-7.903090094245322,7.928356170654297
-7.935542022791058,7.922662258148193
-7.89962956062971,7.923192024230957
-7.946921547407927,7.926464080810547
-7.9393021526221474,7.9189372062683105
-7.950781972366453,7.921009540557861
-7.995678626217357,7.9290289878845215
-7.950781972366453,7.937795162200928
-7.950781972366453,7.95099401473999
-7.954677021213342,7.913528919219971
-7.850769918467369,7.909727573394775
-7.903090094245322,7.8984694480896
-7.856986114171083,7.901386260986328
-7.950781972366453,7.919008731842041
-7.924453006674053,7.910922527313232
-7.995678626217357,7.923243045806885
-7.954677021213342,7.940861225128174
-7.935542022791058,7.9185099601745605
-7.950781972366453,7.935075283050537
-7.928117974144348,7.931641578674316
-7.982966659490206,7.967232704162598
-7.931814161156377,7.902252674102783
-7.924453006674053,7.930767059326172
-7.9430951409681345,7.924272537231445
-7.9430951409681345,7.9369425773620605
-7.950781972366453,7.918896675109863
-7.924453006674053,7.899919033050537
-7.878795273245934,7.921146869659424
-7.89962956062971,7.898256301879883
-7.946921547407927,7.933943271636963
-7.954677021213342,7.92886209487915
-7.954677021213342,7.9274821281433105
-7.91721462968355,7.946958065032959
-7.946921547407927,7.921091079711914
-7.873946355627666,7.910808563232422
-7.954677021213342,7.939779281616211
-7.950781972366453,7.916220188140869
-7.935542022791058,7.889834403991699
-7.946921547407927,7.932131767272949
-7.860119116630385,7.894252777099609
-7.946921547407927,7.947309494018555
-7.928117974144348,7.90647554397583
-7.924453006674053,7.921817779541016
-7.950781972366453,7.926994800567627
-7.9913998274291025,7.955212593078613
-7.838628495628443,7.912277698516846
-7.920818811243059,7.9172492027282715
-7.982923651140671,7.936491012573242
-7.906578398789698,7.916712284088135
-7.931814161156377,7.896727561950684
-7.950781972366453,7.9445672035217285
-7.9737577757544535,7.941173076629639
-7.954677021213342,7.920732021331787
-7.924453006674053,7.90465784072876
-7.889410352488291,7.905666351318359
-7.886056354845152,7.894275188446045
-7.9393021526221474,7.94043493270874
-7.931814161156377,7.934204578399658
-7.954677021213342,7.9386467933654785
-7.928155902956855,7.931640625
-7.946921547407927,7.91343879699707
-7.954677021213342,7.957892894744873
-7.920818811243059,7.9054999351501465
-7.950781972366453,7.927642345428467
-7.946921547407927,7.906039237976074
-7.869665979871627,7.9184041023254395
-7.950781972366453,7.942732334136963
-7.937418018328723,7.931933879852295
-7.928117974144348,7.921632289886475
-7.9393021526221474,7.92629337310791
-7.9393021526221474,7.938813209533691
-7.970532618892763,7.958837509155273
-7.892790308673911,7.923208713531494
-7.924453006674053,7.908320903778076
-7.9393021526221474,7.935644626617432
-7.924453006674053,7.900573253631592
-7.924453006674053,7.928260326385498
-7.954677021213342,7.9329142570495605
-7.950781972366453,7.951955318450928
-7.82102305270683,7.887087345123291
-7.880155410592389,7.904716968536377
-7.928117974144348,7.904214382171631
-7.954677021213342,7.937703609466553
-7.89962956062971,7.9049177169799805
-7.954677021213342,7.91280460357666
-7.970532618892763,7.957839488983154
-7.920818811243059,7.918776035308838
-7.8728955601551585,7.917793273925781
-7.924453006674053,7.888146877288818
-7.8728955601551585,7.90127420425415
-7.85078088734462,7.873661518096924
-7.9393021526221474,7.940284252166748
-7.950781972366453,7.900578022003174
-7.950781972366453,7.941769123077393
-7.9393021526221474,7.911166667938232
-7.903090094245322,7.874273777008057
-7.950781972366453,7.942355632781982
-7.913640203677234,7.9294562339782715
-7.8761493177145505,7.897322177886963
-7.964781356411861,7.9254279136657715
-7.931814161156377,7.918628215789795
-7.928117974144348,7.908259868621826
-7.931814161156377,7.9031500816345215
-7.906578398789698,7.915792942047119
-7.931814161156377,7.902607440948486
-7.946921547407927,7.922724723815918
-7.898841589585073,7.913316249847412
-7.950781972366453,7.940269470214844
-7.935542022791058,7.909049987792969
-7.950781972366453,7.906298637390137
-7.9393021526221474,7.95204496383667
-7.954677021213342,7.936661243438721
-7.856986114171083,7.890757083892822
-7.913640203677234,7.89718770980835
-7.924453006674053,7.913482666015625
-7.954677021213342,7.943752288818359
-7.9430951409681345,7.931436538696289
-7.935542022791058,7.939168453216553
-7.924453006674053,7.91820764541626
-7.924453006674053,7.921412944793701
-7.946921547407927,7.924176216125488
-7.9393021526221474,7.910890102386475
-7.924453006674053,7.888587474822998
-7.946921547407927,7.917169094085693
-7.950781972366453,7.938374042510986
-7.913640203677234,7.908681392669678
-7.931814161156377,7.918395519256592
-7.950781972366453,7.956825256347656
-7.9430951409681345,7.927651882171631
-7.9430951409681345,7.930395603179932
-7.924453006674053,7.929065227508545
-7.9430951409681345,7.965780735015869
-7.950781972366453,7.957587718963623
-7.954677021213342,7.93597412109375
-7.950781972366453,7.932877540588379
-7.928117974144348,7.8961591720581055
-7.924453006674053,7.8955206871032715
-7.931814161156377,7.905050754547119
-7.89962956062971,7.892214775085449
-7.928117974144348,7.924683094024658
-7.924453006674053,7.931422710418701
-7.924453006674053,7.894930362701416
-7.928117974144348,7.9369096755981445
-7.9737577757544535,7.924654483795166
-7.950781972366453,7.9291911125183105
-7.920818811243059,7.920411586761475
-7.9430951409681345,7.918392181396484
-7.950781972366453,7.914731979370117
-7.946921547407927,7.893334865570068
-7.954677021213342,7.928231716156006
-7.954677021213342,7.9269280433654785
-7.869665979871627,7.91621732711792
-7.950781972366453,7.9052557945251465
-7.952725130123009,7.927090644836426
-7.9393021526221474,7.886137008666992
-7.931814161156377,7.945810317993164
-7.9430951409681345,7.926815509796143
-7.85078088734462,7.901691436767578
-7.906578398789698,7.897595405578613
-7.935542022791058,7.92466926574707
-7.9430951409681345,7.915003299713135
-7.928117974144348,7.936479091644287
-7.91721462968355,7.930449962615967
-7.928117974144348,7.943624019622803
-7.907994273271671,7.921333312988281
-7.928117974144348,7.910900115966797
-7.954677021213342,7.929882049560547
-7.910094953104535,7.9095072746276855
-7.9393021526221474,7.902062892913818
-7.946921547407927,7.926626682281494
-7.928117974144348,7.923646450042725
-7.924453006674053,7.938957691192627
-7.935542022791058,7.933032512664795
-7.913640203677234,7.929498195648193
-7.9393021526221474,7.924962043762207
-7.913640203677234,7.907028675079346
-7.9430951409681345,7.904969692230225
-7.838628495628443,7.893078327178955
-7.928117974144348,7.932859897613525
-7.924453006674053,7.919726848602295
-7.853872762493711,7.888020992279053
-7.950781972366453,7.929077625274658
-7.950781972366453,7.9329514503479
-7.9393021526221474,7.9339447021484375
-7.910785504334857,7.927404403686523
-7.871689855844627,7.874603271484375
-7.982923651140671,7.930781841278076
-7.978895913358191,7.97559118270874
-7.995678626217357,7.93874454498291
-7.920818811243059,7.89953088760376
-7.924453006674053,7.877890586853027
-7.982923651140671,7.91650915145874
-7.970532618892763,7.971195697784424
-7.9059218090964904,7.949309349060059
-7.946921547407927,7.88663911819458
-7.8761493177145505,7.901882648468018
-7.9430951409681345,7.921260356903076
-7.954677021213342,7.925262451171875
-7.9430951409681345,7.91918420791626
-7.950781972366453,7.956099987030029
-7.995678626217357,7.950464248657227
-7.903090094245322,7.8831706047058105
-7.931814161156377,7.910190105438232
-7.936383118448278,7.922496318817139
-7.8955201011087315,7.915968418121338
-7.9430951409681345,7.933502197265625
-7.995678626217357,7.922342777252197
-7.950241642100192,7.886450290679932
-7.882728704344236,7.89876651763916
-7.882728704344236,7.903143882751465
-7.950781972366453,7.951572418212891
-7.950781972366453,7.914163112640381
-7.931814161156377,7.913370609283447
-7.950781972366453,7.921389102935791
-7.9393021526221474,7.944455623626709
-7.9393021526221474,7.9234466552734375
-7.896196359268842,7.913284778594971
-7.9430951409681345,7.923603057861328
-7.924453006674053,7.923293590545654
-7.954677021213342,7.967727184295654
-7.920818811243059,7.8903727531433105
-7.954677021213342,7.960498332977295
-7.950781972366453,7.942444801330566
-7.931814161156377,7.905849456787109
-7.954677021213342,7.932389259338379
-7.924453006674053,7.911103248596191
-7.860119116630385,7.910336017608643
-7.931814161156377,7.911265850067139
-7.935542022791058,7.914465427398682
-7.946921547407927,7.897968769073486
-7.931814161156377,7.905786514282227
-7.892790308673911,7.943315029144287
-7.927893565088736,7.927746295928955
-7.913640203677234,7.933147430419922
-7.952121763853551,7.930346965789795
-7.928117974144348,7.912075519561768
-7.853872762493711,7.882175922393799
-7.892790308673911,7.9083781242370605
-7.946921547407927,7.9416680335998535
-7.950781972366453,7.923574924468994
-7.9393021526221474,7.9329752922058105
-7.954677021213342,7.928308010101318
-7.950781972366453,7.927365779876709
-7.931814161156377,7.923340320587158
-7.876350205074754,7.908576011657715
-7.9393021526221474,7.91196870803833
-7.950781972366453,7.925167560577393
-7.954677021213342,7.9284186363220215
-7.886056354845152,7.909204959869385
-7.954677021213342,7.907201290130615
-7.913640203677234,7.94287109375
-7.920818811243059,7.905270099639893
-7.982966659490206,7.966641426086426
-7.906578398789698,7.912353038787842
-7.950781972366453,7.9337477684021
-7.9393021526221474,7.9324564933776855
-7.928117974144348,7.890148639678955
-7.924453006674053,7.940368175506592
-7.935785622146027,7.928219795227051
-7.946921547407927,7.935177326202393
-7.954677021213342,7.935052871704102
-7.950781972366453,7.95338249206543
-7.906578398789698,7.905186176300049
-7.954677021213342,7.943774700164795
-7.924453006674053,7.935723781585693
-7.950781972366453,7.931199550628662
-7.950781972366453,7.946040630340576
-7.9393021526221474,7.905760765075684
-7.982966659490206,7.965631008148193
-7.9393021526221474,7.929738521575928
-7.950781972366453,7.919530391693115
-7.920818811243059,7.905012607574463
-7.9393021526221474,7.921350955963135
-7.9430951409681345,7.925246715545654
-7.950781972366453,7.936111927032471
-7.946921547407927,7.880109786987305
-7.946921547407927,7.905754566192627
-7.924453006674053,7.916304588317871
-7.924453006674053,7.919649600982666
-7.9430951409681345,7.924405097961426
-7.866459873882536,7.909132957458496
-7.982923651140671,7.899540424346924
-7.954677021213342,7.914622783660889
-7.954677021213342,7.96190071105957
-7.950781972366453,7.93818473815918
-7.954677021213342,7.949222087860107
-7.924453006674053,7.915055274963379
-7.950781972366453,7.944892406463623
-7.924453006674053,7.941925048828125
-7.935542022791058,7.899657249450684
-7.9430951409681345,7.940792083740234
-7.9393021526221474,7.919097423553467
-7.863280055279963,7.918668746948242
-7.892790308673911,7.884453773498535
-7.8611534604771105,7.944774627685547
-7.924453006674053,7.90757417678833
-7.8493737915542425,7.899917125701904
-7.85078088734462,7.879269599914551
-7.946921547407927,7.921562194824219
-7.903090094245322,7.903398036956787
-7.913640203677234,7.909325122833252
-7.9430951409681345,7.943443775177002
-7.920818811243059,7.92518424987793
-7.9393021526221474,7.934045791625977
-7.920818811243059,7.883370399475098
-7.910094953104535,7.886325836181641
-7.935542022791058,7.927185535430908
-7.920818811243059,7.91267728805542
-7.939379961634402,7.95373010635376
-7.924453006674053,7.9313764572143555
-7.966576241738391,7.963858127593994
-7.903090094245322,7.913912296295166
-7.931814161156377,7.9135332107543945
-7.950781972366453,7.930171966552734
-7.9737577757544535,7.923469066619873
-7.9393021526221474,7.9239068031311035
-7.910094953104535,7.912743091583252
-7.916637144431181,7.938302993774414
-7.950781972366453,7.930009365081787
-7.910094953104535,7.928073406219482
-7.924453006674053,7.916866779327393
-7.91721462968355,7.9025559425354
-7.9430951409681345,7.902816295623779
-7.892790308673911,7.88792610168457
-7.949816020592385,7.932476043701172
-7.9393021526221474,7.941786289215088
-7.946921547407927,7.918992042541504
-7.9393021526221474,7.91566801071167
-7.950781972366453,7.9313435554504395
-7.931814161156377,7.920105457305908
-7.9393021526221474,7.9056620597839355
-7.9430951409681345,7.9187726974487305
-7.928117974144348,7.9100165367126465
-7.950781972366453,7.9328293800354
-7.9430951409681345,7.895771503448486
-7.954677021213342,7.926028728485107
-7.924453006674053,7.887089252471924
-7.9430951409681345,7.932098388671875
-7.950781972366453,7.926992416381836
-7.910094953104535,7.936621189117432
-7.906578398789698,7.915899753570557
-7.966576241738391,7.988985061645508
-7.9276692719301005,7.932043552398682
-7.9430951409681345,7.919094085693359
-7.950781972366453,7.919745445251465
-7.924453006674053,7.924941062927246
-7.928117974144348,7.919906139373779
-7.9098263336041486,7.926601886749268
-7.888410265725225,7.8837361335754395
-7.924453006674053,7.933642864227295
-7.9393021526221474,7.927419185638428
-7.951345781987695,7.931282043457031
-7.946921547407927,7.93391227722168
-7.950781972366453,7.95149040222168
-7.950781972366453,7.940399646759033
-7.928117974144348,7.929202556610107
-7.889410352488291,7.922461032867432
-7.931814161156377,7.905409336090088
-7.847706165863548,7.881330966949463
-7.946921547407927,7.916192531585693
-7.935542022791058,7.926889896392822
-7.931814161156377,7.92957067489624
-7.924603424800292,7.888155460357666
-7.920818811243059,7.930032253265381
-7.950781972366453,7.921850681304932
-7.928117974144348,7.8893537521362305
-7.9430951409681345,7.939052104949951
-7.982966659490206,7.960241317749023
-7.9430951409681345,7.935571193695068
-7.950781972366453,7.916168212890625
-7.954677021213342,7.932895183563232
-7.9430951409681345,7.925757884979248
-7.9430951409681345,7.931290149688721
-7.954677021213342,7.938179016113281
-7.932979898863743,7.917368412017822
-7.935542022791058,7.932672023773193
-7.931814161156377,7.932564735412598
-7.950781972366453,7.9176716804504395
-7.950781972366453,7.924685955047607
-7.954677021213342,7.944177150726318
-7.950781972366453,7.914612770080566
-7.882728704344236,7.900928020477295
-7.920818811243059,7.905679702758789
-7.950781972366453,7.930389881134033
-7.892971636288177,7.925631523132324
-7.889549016187033,7.882188320159912
-7.920818811243059,7.920875072479248
-7.896196359268842,7.934327125549316
-7.82102305270683,7.889502048492432
-7.924453006674053,7.929388523101807
-7.954677021213342,7.922556400299072
-7.950781972366453,7.9423508644104
-7.946921547407927,7.9550957679748535
-7.928117974144348,7.928336143493652
-7.9393021526221474,7.909277439117432
-7.898488952953535,7.917178153991699
-7.928117974144348,7.922060966491699
-7.950781972366453,7.9120192527771
-7.935542022791058,7.898144245147705
-7.844664854175832,7.8990654945373535
-7.954677021213342,7.926319599151611
-7.950781972366453,7.890025615692139
-7.995678626217357,7.929797649383545
-7.931439075798742,7.925800800323486
-7.950781972366453,7.927671909332275
-7.954677021213342,7.938436031341553
-7.9393021526221474,7.935349464416504
-7.9393021526221474,7.939331531524658
-7.860153329415682,7.898580074310303
-7.954677021213342,7.954675197601318
-7.920818811243059,7.910114288330078
-7.896196359268842,7.936474323272705
-7.946082651207223,7.929174900054932
-7.954677021213342,7.950440883636475
-7.91721462968355,7.900394916534424
-7.8742053319779455,7.9179792404174805
-7.9393021526221474,7.932636737823486
-7.950781972366453,7.943448543548584
-7.920818811243059,7.913083553314209
-7.950781972366453,7.9348273277282715
-7.8728955601551585,7.9077019691467285
-7.935542022791058,7.885522365570068
-7.91721462968355,7.939857006072998
-7.935542022791058,7.945445537567139
-7.924453006674053,7.895336627960205
-7.950781972366453,7.945668697357178
-7.954677021213342,7.9176154136657715
-7.9913998274291025,7.938480854034424
-7.950781972366453,7.938190937042236
-7.931814161156377,7.931441783905029
-7.928117974144348,7.911291122436523
-7.928117974144348,7.91381311416626
-7.853872762493711,7.89378547668457
-7.935542022791058,7.911505222320557
-7.950781972366453,7.925240516662598
-7.9393021526221474,7.928065776824951
-7.920818811243059,7.904195785522461
-7.889410352488291,7.904823303222656
-7.879425560900211,7.904799938201904
-7.928117974144348,7.908187389373779
-7.935542022791058,7.9186530113220215
-7.954677021213342,7.934988498687744
-7.847706165863548,7.896892070770264
-7.85078088734462,7.890440940856934
-7.924453006674053,7.899513244628906
-7.935542022791058,7.930778503417969
-7.946921547407927,7.931095600128174
-7.954677021213342,7.900102615356445
-7.950781972366453,7.9343791007995605
-7.91721462968355,7.913525581359863
-7.9374179968960075,7.94335412979126
-7.91721462968355,7.915815830230713
-7.954677021213342,7.939522743225098
-7.931814161156377,7.934469223022461
-7.935542022791058,7.924984455108643
-7.9393021526221474,7.908153057098389
-7.978810702253626,7.960760593414307
-7.920818811243059,7.901621341705322
-7.920818811243059,7.905523300170898
-7.950781972366453,7.940194129943848
-7.954677021213342,7.926280498504639
-7.927336730250859,7.885979175567627
-7.888508509082229,7.903860569000244
-7.946921547407927,7.916030406951904
-7.924453006674053,7.91437292098999
-7.906578398789698,7.914300441741943
-7.950781972366453,7.936298847198486
-7.946921547407927,7.932028770446777
-7.982966659490206,7.957498550415039
-7.954677021213342,7.9309258460998535
-7.995678626217357,7.974565505981445
-7.954699421917906,7.922073841094971
-7.924453006674053,7.903865337371826
-7.935542022791058,7.921150207519531
-7.904602317703036,7.91389799118042
-7.954677021213342,7.9610090255737305
-7.946921547407927,7.961661338806152
-7.9430951409681345,7.927575588226318
-7.9393021526221474,7.912185192108154
-7.950781972366453,7.930963039398193
-7.950781972366453,7.907254219055176
-7.863762197449,7.900702476501465
-7.9393021526221474,7.9306111335754395
-7.9430951409681345,7.923981189727783
-7.913640203677234,7.92714262008667
-7.954677021213342,7.940328121185303
-7.924453006674053,7.922351360321045
-7.982966659490206,7.961561679840088
-7.903090094245322,7.958241939544678
-7.928117974144348,7.889002323150635
-7.946921547407927,7.912652969360352
-7.950781972366453,7.935886859893799
-7.954677021213342,7.948032855987549
-7.9430951409681345,7.931772708892822
-7.853872762493711,7.902205944061279
-7.954677021213342,7.936363697052002
-7.946921547407927,7.9264912605285645
-7.950781972366453,7.953199863433838
-7.954677021213342,7.950159072875977
-7.954677021213342,7.929665565490723
-7.931814161156377,7.921920299530029
-7.954677021213342,7.932241916656494
-7.826774591089415,7.8957600593566895
-7.920818811243059,7.931332111358643
-7.928117974144348,7.9219794273376465
-7.918702847281798,7.906395435333252
-7.901986604559976,7.930112361907959
-7.920818811243059,7.938713550567627
-7.935542022791058,7.905625820159912
-7.954677021213342,7.948878765106201
-7.935542022791058,7.919531345367432
-7.924453006674053,7.884243011474609
-7.931814161156377,7.911642551422119
-7.866459873882536,7.88724946975708
-7.910094953104535,7.918826580047607
-7.954677021213342,7.945252418518066
-7.889410352488291,7.909302711486816
-7.913640203677234,7.918410301208496
-7.950781972366453,7.904877185821533
-7.946921547407927,7.92482328414917
-7.882728704344236,7.9329915046691895
-7.8761493177145505,7.8952741622924805
-7.924453006674053,7.93004846572876
-7.954677021213342,7.9011149406433105
-7.9393021526221474,7.921405792236328
-7.931814161156377,7.8972649574279785
-7.954677021213342,7.949328422546387
-7.91721462968355,7.907149791717529
-7.924453006674053,7.915146827697754
-7.860119116630385,7.896870136260986
-7.8728955601551585,7.920826435089111
-7.935542022791058,7.917768955230713
-7.9393021526221474,7.932435035705566
-7.888111639210337,7.916743755340576
-7.950781972366453,7.942386627197266
-7.928117974144348,7.902531623840332
-7.928117974144348,7.912834644317627
-7.924453006674053,7.951137065887451
-7.892790308673911,7.916406154632568
-7.935542022791058,7.9276838302612305
-7.954677021213342,7.914026737213135
-7.915575394493873,7.906436443328857
-7.9430951409681345,7.912084579467773
-7.946921547407927,7.928061008453369
-7.950781972366453,7.9383015632629395
-7.948658283730227,7.928835391998291
-7.913942323339224,7.9436235427856445
-7.924453006674053,7.92323637008667
-7.9430951409681345,7.944740295410156
-7.924453006674053,7.906818866729736
-7.8728955601551585,7.912988185882568
-7.920818811243059,7.891290664672852
-7.950781972366453,7.918049335479736
-7.950781972366453,7.935038089752197
-7.830984932712759,7.867259979248047
-7.924453006674053,7.910633563995361
-7.950781972366453,7.935143947601318
-7.913640203677234,7.913886070251465
-7.954677021213342,7.932036876678467
-7.946921547407927,7.923945426940918
-7.931814161156377,7.912867546081543
-7.9430951409681345,7.907395362854004
-7.882728704344236,7.903609752655029
-7.963788392246652,7.8985819816589355
-7.913640203677234,7.937994480133057
-7.9430951409681345,7.920250415802002
-7.928117974144348,7.894510746002197
-7.954677021213342,7.931973934173584
-7.886056354845152,7.924980163574219
-7.9393021526221474,7.923753261566162
-7.9393021526221474,7.9069600105285645
-7.913640203677234,7.9377899169921875
-7.935542022791058,7.918604850769043
-7.875899990405765,7.9004130363464355
-7.91721462968355,7.871241569519043
-7.928117974144348,7.927608966827393
-7.935542022791058,7.922532081604004
-7.9393021526221474,7.938222408294678
-7.950781972366453,7.9365081787109375
-7.950781972366453,7.93513822555542
-7.954677021213342,7.937103748321533
-7.9430951409681345,7.913903713226318
-7.946921547407927,7.928780555725098
-7.91721462968355,7.93546724319458
-7.950781972366453,7.9187092781066895
-7.920818811243059,7.90282678604126
-7.931814161156377,7.897188663482666
-7.950781972366453,7.926960468292236
-7.9393021526221474,7.903507709503174
-7.982923651140671,7.936705112457275
-7.920818811243059,7.908277988433838
-7.950781972366453,7.921181678771973
-7.954677021213342,7.906466484069824
-7.9430951409681345,7.932753562927246
-7.895581761337452,7.910919666290283
-7.950781972366453,7.9518609046936035
-7.9393021526221474,7.9336018562316895
-7.954677021213342,7.9239301681518555
-7.954677021213342,7.930453300476074
-7.93468629292431,7.930972576141357
-7.896196359268842,7.8909783363342285
-7.950781972366453,7.944281101226807
-7.903090094245322,7.9263200759887695
-7.954677021213342,7.924673080444336
-7.950781972366453,7.9503350257873535
-7.928117974144348,7.915229320526123
-7.97490518667181,7.9780802726745605
-7.954677021213342,7.928288459777832
-7.866185328564197,7.8968634605407715
-7.950781972366453,7.912075042724609
-7.954677021213342,7.947053909301758
-7.886056354845152,7.893547058105469
-7.950781972366453,7.918694972991943
-7.978810702253626,7.974685192108154
-7.9385393627751295,7.933380126953125
-7.928117974144348,7.920623302459717
-7.935542022791058,7.923998832702637
-7.9393021526221474,7.913220405578613
-7.882728704344236,7.912628173828125
-7.89962956062971,7.943368434906006
-7.8728955601551585,7.913483142852783
-7.950781972366453,7.924890518188477
-7.8728955601551585,7.904900074005127
-7.913640203677234,7.955446720123291
-7.946921547407927,7.922914028167725
-7.924453006674053,7.887418746948242
-7.896196359268842,7.887810707092285
-7.946921547407927,7.949088096618652
-7.950781972366453,7.9362077713012695
-7.920818811243059,7.928210735321045
-7.896196359268842,7.903830051422119
-7.935542022791058,7.929555416107178
-7.913640203677234,7.917876243591309
-7.990339285400088,7.962063312530518
-7.91721462968355,7.895681858062744
-7.924453006674053,7.926685810089111
-7.882728704344236,7.895529747009277
-7.924453006674053,7.914716720581055
-7.9430951409681345,7.9402031898498535
-7.950781972366453,7.919617652893066
-7.9430951409681345,7.89906120300293
-7.879425560900211,7.929814338684082
-7.928117974144348,7.923493385314941
-7.93468629292431,7.925245761871338
-7.931814161156377,7.923231601715088
-7.928117974144348,7.900826454162598
-7.982923651140671,7.900073051452637
-7.892790308673911,7.924515247344971
-7.928117974144348,7.905020713806152
-7.946921547407927,7.915192127227783
-7.950781972366453,7.910908222198486
-7.9430951409681345,7.917532444000244
-7.950781972366453,7.962784290313721
-7.931814161156377,7.9417009353637695
-7.950781972366453,7.926228046417236
-7.928936536236001,7.912146091461182
-7.9393021526221474,7.921759605407715
-7.91721462968355,7.92620325088501
-7.892790308673911,7.8977580070495605
-7.924453006674053,7.905097484588623
-7.924453006674053,7.891757488250732
-7.935542022791058,7.914220809936523
-7.948417707887132,7.93391752243042
-7.954677021213342,7.925676345825195
-8.022370577841233,7.961973667144775
-7.896196359268842,7.895672798156738
-7.9430951409681345,7.959995746612549
-7.924453006674053,7.909678936004639
-7.8761493177145505,7.949899196624756
-7.954677021213342,7.920017719268799
-7.928117974144348,7.909613609313965
-7.970616219270671,7.939670562744141
-7.946921547407927,7.907115459442139
-7.935542022791058,7.9136962890625
-7.924453006674053,7.927321910858154
-7.928117974144348,7.90741491317749
-7.878795273245934,7.874603271484375
-7.889410352488291,7.8703227043151855
-7.950781972366453,7.945154666900635
-7.924453006674053,7.900218963623047
-7.882728704344236,7.923249244689941
-7.935542022791058,7.936615467071533
-7.931814161156377,7.911126613616943
-7.913640203677234,7.897157192230225
-7.913640203677234,7.9052205085754395
-7.894231790888085,7.9472126960754395
-7.954677021213342,7.944850921630859
-7.954677021213342,7.92579460144043
-7.943055911701025,7.944027423858643
-7.8876003998252076,7.933014869689941
-7.935542022791058,7.917138576507568
-7.9430951409681345,7.918989181518555
-7.935542022791058,7.912817478179932
-7.954677021213342,7.89304256439209
-7.920818811243059,7.892925262451172
-7.9430951409681345,7.922449588775635
-7.928117974144348,7.904034614562988
-7.818151283467686,7.879248142242432
-7.9393021526221474,7.919256687164307
-7.910094953104535,7.91475772857666
-7.950781972366453,7.940948486328125
-7.950781972366453,7.903738021850586
-7.935542022791058,7.9068074226379395
-7.950781972366453,7.90773344039917
-7.9230780883676,7.921748638153076
-7.978810702253626,7.947525978088379
-7.920818811243059,7.958435535430908
-7.924453006674053,7.918244361877441
-7.835637836224461,7.906008243560791
-7.950781972366453,7.903282165527344
-7.829768510087842,7.887746334075928
-7.966576241738391,7.9528656005859375
-7.950781972366453,7.946676731109619
-7.920818811243059,7.935847759246826
-7.931814161156377,7.921571254730225
-7.935542022791058,7.9117751121521
-7.924453006674053,7.8783745765686035
-7.950781972366453,7.948358058929443
-7.892790308673911,7.933793544769287
-7.93468629292431,7.958653926849365
-7.826774591089415,7.927057266235352
-7.924453006674053,7.899283409118652
-7.844664854175832,7.878471374511719
-7.950781972366453,7.921922206878662
-7.928117974144348,7.9197797775268555
-7.950781972366453,7.936132907867432
-7.8493737915542425,7.886763095855713
-7.924453006674053,7.902637958526611
-7.829577898841944,7.922255992889404
-7.858096678988375,7.9304728507995605
-7.829768510087842,7.882208347320557
-7.924453006674053,7.936492919921875
-7.924453006674053,7.921235084533691
-7.946921547407927,7.900759220123291
-7.910094953104535,7.922969341278076
-7.892790308673911,7.904085636138916
-7.935542022791058,7.936254501342773
-7.9393021526221474,7.951858043670654
-7.950781972366453,7.935725212097168
-7.935542022791058,7.920944690704346
-7.931814161156377,7.905116558074951
-7.954677021213342,7.91663932800293
-7.950781972366453,7.956948757171631
-7.931814161156377,7.889418601989746
-7.913640203677234,7.9289727210998535
-7.924453006674053,7.9211015701293945
-7.920818811243059,7.897187232971191
-7.931814161156377,7.925377368927002
-7.928117974144348,7.910033226013184
-7.928117974144348,7.923288822174072
-7.920818811243059,7.91477632522583
-7.928117974144348,7.9134602546691895
-7.950781972366453,7.932493209838867
-7.896196359268842,7.925786018371582
-7.966617665152964,7.922152996063232
-7.950781972366453,7.936217308044434
-7.9430951409681345,7.937329292297363
-7.913038744896253,7.921693325042725
-7.931814161156377,7.909321308135986
-7.950781972366453,7.8841471672058105
-7.954677021213342,7.929300308227539
-7.907994273271671,7.917990684509277
-7.920818811243059,7.915261745452881
-7.924453006674053,7.92559814453125
-7.822215191706272,7.909325122833252
-7.928117974144348,7.910327434539795
-7.924453006674053,7.9405694007873535
-7.954677021213342,7.951760292053223
-7.9393021526221474,7.922073841094971
-7.950781972366453,7.923290252685547
-7.928117974144348,7.930169105529785
-7.924453006674053,7.925232887268066
-7.924453006674053,7.924311637878418
-7.954677021213342,7.919100761413574
-7.954677021213342,7.9320526123046875
-7.932177017317765,7.94789457321167
-7.928117974144348,7.911139965057373
-7.954677021213342,7.907538890838623
-7.903090094245322,7.898362159729004
-7.924453006674053,7.908383846282959
-7.931814161156377,7.905633926391602
-8.026824561605242,7.979854583740234
-7.869665979871627,7.911659240722656
-7.954677021213342,7.920875549316406
-7.935542022791058,7.918795108795166
-7.931814161156377,7.936129093170166
-7.935542022791058,7.9178147315979
-7.9430951409681345,7.924399375915527
-7.981017239849406,7.923346042633057
-7.924453006674053,7.913994312286377
-7.928117974144348,7.909943103790283
-7.946921547407927,7.9561991691589355
-7.931814161156377,7.901986598968506
-7.946921547407927,7.915609836578369
-7.9393021526221474,7.917924404144287
-7.978810702253626,7.939050197601318
-7.818151283467686,7.879778861999512
-7.923581356476356,7.915256023406982
-7.950781972366453,7.910934925079346
-7.928117974144348,7.921292781829834
-7.950781972366453,7.930944919586182
-7.96257349994767,7.948511123657227
-7.924453006674053,7.923309326171875
-7.947966922669405,7.921971321105957
-7.954677021213342,7.938357830047607
-7.924453006674053,7.922842025756836
-7.8761493177145505,7.909003257751465
-7.948658283730227,7.915628910064697
-7.931814161156377,7.927001953125
-7.928117974144348,7.916140556335449
-7.866461091629782,7.8838067054748535
-7.9393021526221474,7.921398639678955
-7.939066585182251,7.896846294403076
-7.9667047848223245,7.975491523742676
-7.954677021213342,7.930773735046387
-7.882728704344236,7.918044567108154
-7.9430951409681345,7.94284200668335
-7.950781972366453,7.9071478843688965
-7.935542022791058,7.923275470733643
-7.882728704344236,7.901458740234375
-7.909742071253639,7.911360263824463
-7.8761493177145505,7.920587062835693
-7.9393021526221474,7.912059307098389
-7.9393021526221474,7.935092449188232
-7.973156262517851,7.945418834686279
-7.920818811243059,7.923964023590088
-7.970532618892763,7.91627311706543
-7.954677021213342,7.943152904510498
-7.9393021526221474,7.932441711425781
-7.9737577757544535,7.939474105834961
-7.9393021526221474,7.929137229919434
-7.950781972366453,7.928532123565674
-7.937418018328723,7.94220495223999
-7.91721462968355,7.946731090545654
-7.91721462968355,7.931687831878662
-7.950781972366453,7.945704460144043
-7.931814161156377,7.934640407562256
-7.9430951409681345,7.931406497955322
-7.950781972366453,7.9545111656188965
-7.924453006674053,7.881831169128418
-7.952121763853551,7.906360626220703
-7.946921547407927,7.926604747772217
-7.990339285400088,7.971190452575684
-7.913640203677234,7.8980302810668945
-7.924453006674053,7.9293694496154785
-7.950781972366453,7.9351677894592285
-7.982966659490206,7.9523491859436035
-7.897811916161621,7.925775051116943
-7.924453006674053,7.919107913970947
-7.9393021526221474,7.922680377960205
-7.950781972366453,7.9258599281311035
-7.910094953104535,7.914194583892822
-7.931814161156377,7.928476333618164
-7.913640203677234,7.9251885414123535
-7.931814161156377,7.908669948577881
-7.950781972366453,7.915151596069336
-7.982923651140671,7.910587787628174
-7.9430951409681345,7.914046287536621
-7.9393021526221474,7.906435489654541
-7.860153329415682,7.893996715545654
-7.8761493177145505,7.933842182159424
-7.950781972366453,7.899239540100098
-7.954677021213342,7.9427313804626465
-7.913640203677234,7.933994770050049
-7.995678626217357,7.9329705238342285
-7.96914180120827,7.924455165863037
-7.954677021213342,7.927330017089844
-7.995678626217357,7.942402362823486
-8.025154900427069,7.960326671600342
-7.920818811243059,7.91629695892334
-7.924453006674053,7.939663410186768
-7.928117974144348,7.9202775955200195
-7.920818811243059,7.934072971343994
-7.931814161156377,7.908474445343018
-7.911244248885512,7.8983540534973145
-7.946921547407927,7.953143119812012
-7.954677021213342,7.952895641326904
-7.946921547407927,7.926526069641113
-7.924453006674053,7.923151016235352
-7.982923651140671,7.929610729217529
-7.950781972366453,7.9350128173828125
-7.906578398789698,7.897087574005127
-7.950781972366453,7.933406352996826
-7.928117974144348,7.929153919219971
-7.950781972366453,7.957129955291748
-7.966617665152964,7.933748722076416
-7.935542022791058,7.934972763061523
-7.890891409042026,7.925401210784912
-7.928117974144348,7.904129981994629
-7.931814161156377,7.9109697341918945
-7.9393021526221474,7.937699317932129
-7.913640203677234,7.945748329162598
-7.9430951409681345,7.926388263702393
-7.9124836212853,7.913802146911621
-7.924453006674053,7.912493705749512
-7.882728704344236,7.929688930511475
-7.906578398789698,7.909981727600098
-7.879425560900211,7.918382167816162
-7.950781972366453,7.929365634918213
-7.950781972366453,7.958491802215576
-7.950781972366453,7.928101539611816
-7.982966659490206,7.915834903717041
-7.795890075313592,7.927818775177002
-7.954677021213342,7.913887977600098
-7.935542022791058,7.908628463745117
-7.950781972366453,7.922659397125244
-7.970532618892763,7.922766208648682
-7.924453006674053,7.9188432693481445
-7.9430951409681345,7.9320759773254395
-7.950781972366453,7.960209369659424
-7.931814161156377,7.920466899871826
-7.928117974144348,7.89880895614624
-7.928117974144348,7.903100490570068
-7.90635866463183,7.889380931854248
-7.924453006674053,7.897601127624512
-7.943486147519973,7.910638332366943
-7.928117974144348,7.925575256347656
-7.931814161156377,7.900637149810791
-7.89962956062971,7.890218734741211
-7.9393021526221474,7.922414779663086
-7.889549016187033,7.910336971282959
-7.9430951409681345,7.910276889801025
-7.954677021213342,7.938246726989746
-8.003317238098171,7.949030876159668
-7.946921547407927,7.914703369140625
-7.9393021526221474,7.877146244049072
-7.879425560900211,7.925232410430908
-7.91721462968355,7.916012287139893
-7.954677021213342,7.914825916290283
-7.9958644827013945,7.96591329574585
-7.924453006674053,7.924712181091309
-7.9393021526221474,7.9206390380859375
-7.935542022791058,7.910585403442383
-7.950781972366453,7.948867321014404
-7.995678626217357,7.9426188468933105
-7.931814161156377,7.925354957580566
-7.96981377267859,7.9562883377075195
-7.950781972366453,7.935084342956543
-7.946921547407927,7.91784143447876
-7.924453006674053,7.886546611785889
-7.9393021526221474,7.94438362121582
-7.954677021213342,7.956081867218018
-7.913640203677234,7.914288520812988
-7.924453006674053,7.919800758361816
-7.928117974144348,7.917749881744385
-7.89962956062971,7.9286208152771
-7.89962956062971,7.899853706359863
-7.935542022791058,7.921756744384766
-7.924453006674053,7.927755355834961
-7.924453006674053,7.9102911949157715
-7.889410352488291,7.871644496917725
-7.946921547407927,7.949059963226318
-7.954677021213342,7.930454730987549
-7.845339292733202,7.944029808044434
-7.9393021526221474,7.926458835601807
-7.982923651140671,7.938549518585205
-7.9430951409681345,7.9258131980896
-7.91721462968355,7.918349742889404
-7.950781972366453,7.918333530426025
-7.982923651140671,7.929677486419678
-7.954677021213342,7.911499500274658
-7.9393021526221474,7.911158084869385
-7.924453006674053,7.892854690551758
-7.830984932712759,7.8757243156433105
-7.9393021526221474,7.91637659072876
-7.958607309235428,7.97223424911499
-7.924453006674053,7.930441856384277
-7.931814161156377,7.902134418487549
-7.950781972366453,7.945938587188721
-7.924453006674053,7.923579692840576
-7.829768510087842,7.914943218231201
-7.924603424800292,7.918110370635986
-7.924453006674053,7.91985559463501
-7.920818811243059,7.90648889541626
-7.892790308673911,7.881537437438965
-7.950781972366453,7.925757884979248
-7.954677021213342,7.9127583503723145
-7.903090094245322,7.926546573638916
-7.903090094245322,7.888948440551758
-7.910094953104535,7.914926528930664
-7.924453006674053,7.915308475494385
-7.954677021213342,7.936654090881348
-7.924453006674053,7.916105270385742
-7.924453006674053,7.92334508895874
-7.928117974144348,7.938467025756836
-7.952217161107078,7.938356876373291
-7.928117974144348,7.900953769683838
-7.920818811243059,7.897775173187256
-7.935542022791058,7.906087398529053
-7.863280055279963,7.921855449676514
-7.931814161156377,7.926776885986328
-7.928117974144348,7.929027080535889
-7.910094953104535,7.90570068359375
-7.935542022791058,7.9267072677612305
-7.950781972366453,7.931438446044922
-7.908539684071192,7.909007549285889
-7.954677021213342,7.931651592254639
-7.954677021213342,7.908937931060791
-7.946921547407927,7.9100165367126465
-7.924453006674053,7.918084621429443
-7.954677021213342,7.918887615203857
-7.946921547407927,7.948935031890869
-7.9430951409681345,7.930576801300049
-7.954677021213342,7.931901931762695
-7.924453006674053,7.932776927947998
-7.99909679285825,7.9831671714782715
-7.9393021526221474,7.916919708251953
-7.9393021526221474,7.9130988121032715
-7.9430951409681345,7.936669826507568
-7.9393021526221474,7.9431047439575195
-7.954677021213342,7.924039363861084
-7.928117974144348,7.919155597686768
-7.995678626217357,7.95820951461792
-7.946921547407927,7.909359931945801
-7.924453006674053,7.916987419128418
-7.946921547407927,7.920285701751709
-7.950781972366453,7.945104122161865
-7.982966659490206,7.955846786499023
-7.924453006674053,7.89971399307251
-7.935542022791058,7.928456783294678
-7.9430951409681345,7.920303821563721
-7.946921547407927,7.906359672546387
-7.943486147519973,7.906195163726807
-7.9430951409681345,7.950642108917236
-7.882728704344236,7.933834075927734
-7.931814161156377,7.91427755355835
-7.924453006674053,7.942697525024414
-7.946921547407927,7.924325466156006
-7.89962956062971,7.912071704864502
-7.928117974144348,7.911224842071533
-7.94677806718906,7.927192687988281
-7.946921547407927,7.948509216308594
-7.9430951409681345,7.909297466278076
-7.903090094245322,7.922149181365967
-7.920818811243059,7.923474311828613
-7.924453006674053,7.922656536102295
-7.9430951409681345,7.941318988800049
-7.946921547407927,7.910159111022949
-7.954677021213342,7.962478160858154
-7.946921547407927,7.922824382781982
-7.934783378553508,7.892209529876709
-7.96257349994767,7.960026264190674
-7.982923651140671,7.942338466644287
-7.950781972366453,7.9363627433776855
-7.9393021526221474,7.8987226486206055
-7.91721462968355,7.906007289886475
-7.970532618892763,7.941379547119141
-7.935542022791058,7.936496257781982
-7.9049427254465785,7.906639575958252
-7.903090094245322,7.913854598999023
-7.9913998274291025,7.964907169342041
-7.922491400135772,7.904193878173828
-7.879705324991467,7.8983845710754395
-7.924453006674053,7.902801990509033
-7.928117974144348,7.903932571411133
-7.89962956062971,7.920653343200684
-7.9430951409681345,7.926024436950684
-7.954677021213342,7.9529595375061035
-7.935542022791058,7.921990871429443
-7.954677021213342,7.927302837371826
-7.931814161156377,7.9463067054748535
-7.950781972366453,7.945193767547607
-7.946921547407927,7.922706127166748
-7.879425560900211,7.903718948364258
-7.884103137583294,7.8921918869018555
-7.913640203677234,7.9552788734436035
-7.946921547407927,7.932568073272705
-7.9430951409681345,7.9578633308410645
-7.91721462968355,7.914285182952881
-7.931814161156377,7.925609588623047
-7.946921547407927,7.931464672088623
-7.928117974144348,7.919482707977295
-7.920818811243059,7.914546966552734
-7.80966502563657,7.890136241912842
-7.954677021213342,7.94574499130249
-7.950781972366453,7.92840576171875
-7.9393021526221474,7.89929723739624
-7.923581356476356,7.91505765914917
-7.906578398789698,7.921419620513916
-7.970616219270671,7.942780494689941
-7.9393021526221474,7.9158148765563965
-7.924453006674053,7.926511287689209
-7.950781972366453,7.930850505828857
-7.9393021526221474,7.9344048500061035
-7.856986114171083,7.903559684753418
-7.928117974144348,7.907955646514893
-7.954677021213342,7.904963970184326
-7.9393021526221474,7.939994812011719
-7.950781972366453,7.9587507247924805
-7.918702847281798,7.931671619415283
-7.928117974144348,7.917023181915283
-7.950781972366453,7.940613269805908
-7.931814161156377,7.930793285369873
-7.924453006674053,7.875211238861084
-7.889410352488291,7.915602207183838
-7.924453006674053,7.9056267738342285
-7.928117974144348,7.932750225067139
-7.920818811243059,7.904781818389893
-7.920818811243059,7.9128594398498535
-7.8731406206414505,7.921281337738037
-7.946921547407927,7.910400867462158
-7.950781972366453,7.944056034088135
-7.935542022791058,7.932521343231201
-7.931814161156377,7.90289831161499
-7.9393021526221474,7.918416976928711
-7.954677021213342,7.931420803070068
-7.924453006674053,7.930663108825684
-7.920818811243059,7.947962760925293
-7.928117974144348,7.914885520935059
-7.939379961634402,7.904416561126709
-7.954677021213342,7.941893100738525
-7.9393021526221474,7.929769039154053
-7.89962956062971,7.923647880554199
-7.954677021213342,7.9205403327941895
-7.860119116630385,7.920094966888428
-7.946921547407927,7.915322780609131
-7.995678626217357,7.942242622375488
-7.950781972366453,7.93458890914917
-7.950781972366453,7.946069717407227
-7.9393021526221474,7.894562244415283
-7.954677021213342,7.948245525360107
-7.9393021526221474,7.906756401062012
-7.950781972366453,7.950727939605713
-7.9430951409681345,7.911489009857178
-7.982923651140671,7.918973922729492
-7.935542022791058,7.905263423919678
-7.928117974144348,7.900371074676514
-7.954677021213342,7.927075386047363
-7.954677021213342,7.928674221038818
-7.928117974144348,7.9045562744140625
-7.928117974144348,7.933701038360596
-7.928117974144348,7.915828704833984
-7.928117974144348,7.948299884796143
-7.9430951409681345,7.933499813079834
-7.950781972366453,7.932318210601807
-7.931814161156377,7.922400951385498
-7.935542022791058,7.896924018859863
-7.950781972366453,7.9567413330078125
-7.924453006674053,7.906219959259033
-7.906578398789698,7.894760608673096
-7.950781972366453,7.975063800811768
-7.966576241738391,7.9446845054626465
-7.9430951409681345,7.931224346160889
-7.950781972366453,7.9385600090026855
-7.903090094245322,7.915384292602539
-7.935542022791058,7.935879230499268
-7.906578398789698,7.9004435539245605
-7.924453006674053,7.911387920379639
-7.946921547407927,7.947348117828369
-7.906578398789698,7.916015148162842
-7.844664854175832,7.914523124694824
-7.934136499461806,7.919482231140137
-7.950781972366453,7.922025680541992
-7.966617665152964,7.91127347946167
-7.946921547407927,7.926127910614014
-7.896196359268842,7.904069423675537
-7.9393021526221474,7.915306091308594
-7.9430951409681345,7.9381103515625
-7.995678626217357,8.000653266906738
-7.954677021213342,7.92469596862793
-7.935542022791058,7.890623569488525
-7.960432339694732,7.923882007598877
-7.924453006674053,7.918933391571045
-7.950781972366453,7.922153949737549
-7.9393021526221474,7.921340465545654
-7.89962956062971,7.909300804138184
-7.920818811243059,7.903555393218994
-7.924453006674053,7.9121994972229
-7.950781972366453,7.902209758758545
-7.950781972366453,7.926677227020264
-7.9393021526221474,7.930699348449707
-7.950781972366453,7.917520046234131
-7.931814161156377,7.915095806121826
-7.924453006674053,7.914254665374756
-7.954677021213342,7.942748546600342
-7.995678626217357,7.845795154571533
-7.856986114171083,7.936148643493652
-7.9737577757544535,7.968795299530029
-7.847706165863548,7.937152862548828
-7.924453006674053,7.917520999908447
-7.954677021213342,7.936152935028076
-7.91721462968355,7.9448041915893555
-7.910094953104535,7.89964485168457
-7.920818811243059,7.923888683319092
-7.924453006674053,7.92087459564209
-7.954677021213342,7.943860054016113
-7.866459873882536,7.890178680419922
-7.950781972366453,7.934965133666992
-7.903090094245322,7.888818264007568
-7.946921547407927,7.9441046714782715
-7.950781972366453,7.943516254425049
-7.950781972366453,7.941187858581543
-7.982966659490206,7.9617486000061035
-7.928117974144348,7.928188323974609
-7.920818811243059,7.915266513824463
-7.913640203677234,7.932640552520752
-7.954677021213342,7.945248126983643
-7.946921547407927,7.907878398895264
-7.886056354845152,7.945614814758301
-7.931814161156377,7.945145606994629
-7.928117974144348,7.927140712738037
-7.950781972366453,7.934967517852783
-7.950781972366453,7.931641101837158
-7.946921547407927,7.940223693847656
-7.99472180818664,7.959391117095947
-7.9393021526221474,7.929773807525635
-7.982923651140671,7.953787326812744
-7.950781972366453,7.942318916320801
-7.903161564307976,7.914210796356201
-7.9430951409681345,7.928069591522217
-7.935542022791058,7.92499303817749
-7.910094953104535,7.932613372802734
-7.9430951409681345,7.939693927764893
-7.920818811243059,7.928290843963623
-7.946921547407927,7.942931652069092
-7.954677021213342,7.949375629425049
-7.950781972366453,7.924387454986572
-7.9393021526221474,7.918823719024658
-7.931814161156377,7.882355213165283
-7.924453006674053,7.915409088134766
-7.928117974144348,7.924365997314453
-7.9430951409681345,7.939697742462158
-7.928117974144348,7.91438102722168
-7.924453006674053,7.895905017852783
-7.868644485039619,7.897510051727295
-7.9430951409681345,7.9329142570495605
-7.966617665152964,7.935408115386963
-7.863214135364057,7.888016700744629
-7.906578398789698,7.915329456329346
-7.954677021213342,7.92624568939209
-7.931814161156377,7.925144672393799
-7.995678626217357,7.955791473388672
-7.950781972366453,7.953530311584473
-7.9430951409681345,7.957719326019287
-7.920818811243059,7.902515888214111
-7.89962956062971,7.917292594909668
-7.931814161156377,7.898025035858154
-7.924453006674053,7.909721851348877
-7.946921547407927,7.936581134796143
-7.9430951409681345,7.9151930809021
-7.889410352488291,7.90966272354126
-7.924453006674053,7.915398120880127
-7.950781972366453,7.916724681854248
-7.892790308673911,7.910837650299072
-7.91721462968355,7.929034233093262
-7.931814161156377,7.93984317779541
-7.902308675253255,7.932011127471924
-7.9393021526221474,7.9242448806762695
-7.950781972366453,7.93711519241333
-7.931814161156377,7.936229228973389
-7.954333871520422,7.9242448806762695
-7.913640203677234,7.920729160308838
-7.931814161156377,7.9348859786987305
-7.89962956062971,7.917315483093262
-7.950781972366453,7.926903247833252
-7.8955201011087315,7.925695419311523
-7.9430951409681345,7.910452365875244
-7.954677021213342,7.919188499450684
-7.946921547407927,7.902673244476318
-7.950781972366453,7.939188480377197
-7.946921547407927,7.91102933883667
-7.93765506239242,7.929042339324951
-7.928117974144348,7.901205062866211
-7.950781972366453,7.9373345375061035
-7.9430951409681345,7.93023157119751
-7.879425560900211,7.91442346572876
-7.913640203677234,7.91172456741333
-7.954677021213342,7.957828044891357
-7.924453006674053,7.8857035636901855
-7.995678626217357,7.962584018707275
-7.973156262517851,7.944849014282227
-7.950781972366453,7.924853801727295
-7.93978520718815,7.894038677215576
-7.982966659490206,7.925586700439453
-7.91721462968355,7.948934078216553
-7.928117974144348,7.915353298187256
-7.921976216623693,7.913530349731445
-7.910094953104535,7.91707181930542
-7.9430951409681345,7.894909381866455
-7.924453006674053,7.915572643280029
-7.94094624659741,7.934041500091553
-7.913640203677234,7.906832218170166
-7.954677021213342,7.911773204803467
-7.920818811243059,7.914098739624023
-7.9393021526221474,7.923121929168701
-7.920818811243059,7.918045520782471
-7.920818811243059,7.915694713592529
-7.9545916417163145,7.9400410652160645
-7.950781972366453,7.949612140655518
-7.924453006674053,7.918763160705566
-7.982966659490206,7.953752040863037
-7.96257349994767,7.9540605545043945
-7.8761493177145505,7.8730854988098145
-7.946921547407927,7.9242353439331055
-7.8761493177145505,7.92548131942749
-7.924453006674053,7.965931415557861
-7.931814161156377,7.929659366607666
-7.920818811243059,7.889260292053223
-7.8657311089458215,7.898346424102783
-7.879166050413646,7.896304607391357
-7.935542022791058,7.939475059509277
-7.920818811243059,7.935663223266602
-7.928117974144348,7.913272380828857
-7.924453006674053,7.901120185852051
-7.954677021213342,7.934024333953857
-7.860119116630385,7.930744647979736
-7.910094953104535,7.9140143394470215
-7.906542242015022,7.9221272468566895
-7.931814161156377,7.886537075042725
-7.924453006674053,7.924682140350342
-7.9430951409681345,7.92540979385376
-8.013136044317282,7.95260763168335
-7.950781972366453,7.9325079917907715
-7.9430951409681345,7.93909215927124
-7.950781972366453,7.913061618804932
-7.950781972366453,7.967981815338135
-7.903090094245322,7.9089484214782715
-7.8657311089458215,7.858534336090088
-7.9393021526221474,7.925058841705322
-7.954677021213342,7.929386138916016
-7.950781972366453,7.928560733795166
-7.954677021213342,7.942982196807861
-7.906578398789698,7.908150672912598
-7.93468629292431,7.9366583824157715
-7.935542022791058,7.920518398284912
-7.924453006674053,7.9111857414245605
-7.924453006674053,7.927402019500732
-7.954677021213342,7.884730815887451
-7.950781972366453,7.938414096832275
-7.860119116630385,7.902707576751709
-7.9393021526221474,7.930849075317383
-7.896196359268842,7.900171756744385
-7.946921547407927,7.934075832366943
-7.892824978756646,7.900784969329834
-7.931814161156377,7.926095485687256
-7.950781972366453,7.932155132293701
-7.935542022791058,7.927944660186768
-7.946921547407927,7.922825813293457
-7.946921547407927,7.920594692230225
-7.950781972366453,7.942189693450928
-7.9430951409681345,7.940330982208252
-7.928117974144348,7.917259693145752
-7.928117974144348,7.900962829589844
-7.924453006674053,7.918159484863281
-7.924453006674053,7.9116058349609375
-7.913640203677234,7.936068058013916
-7.924453006674053,7.936804294586182
-7.920818811243059,7.924964427947998
-7.946921547407927,7.903127193450928
-7.871381458691152,7.904753684997559
-7.931814161156377,7.913015842437744
-7.954677021213342,7.9304914474487305
-7.946921547407927,7.945647716522217
-7.9430951409681345,7.944313049316406
-7.950781972366453,7.937277317047119
-7.946921547407927,7.9200286865234375
-7.946921547407927,7.909702777862549
-7.910094953104535,7.922386646270752
-7.935542022791058,7.9058990478515625
-7.869665979871627,7.908638000488281
-7.935542022791058,7.910131931304932
-7.882728704344236,7.8992180824279785
-7.9393021526221474,7.91112756729126
-7.847706165863548,7.926880359649658
-7.954677021213342,7.911107063293457
-7.9393021526221474,7.926016807556152
-7.924453006674053,7.885770320892334
-7.879527744657629,7.937207221984863
-7.910094953104535,7.912435054779053
-7.946921547407927,7.910747528076172
-7.9393021526221474,7.918344974517822
-7.9430951409681345,7.906311511993408
-7.935542022791058,7.896275997161865
-8.040958607678906,7.961254596710205
-7.954677021213342,7.94352388381958
-7.950781972366453,7.926674842834473
-7.946921547407927,7.922367095947266
-7.946921547407927,7.885734558105469
-7.928117974144348,7.914985179901123
-7.954677021213342,7.940155029296875
-7.995678626217357,7.9900593757629395
-7.928117974144348,7.911679744720459
-7.920818811243059,7.918007850646973
-7.903090094245322,7.8966145515441895
-7.889410352488291,7.9415602684021
-7.910094953104535,7.920917510986328
-8.014634778962309,7.973816394805908
-7.954677021213342,7.944919586181641
-7.931814161156377,7.928911209106445
-7.950781972366453,7.927430629730225
-7.954677021213342,7.909232139587402
-7.931814161156377,7.894882678985596
-7.9430951409681345,7.92029333114624
-7.91721462968355,7.903820514678955
-7.935542022791058,7.9296698570251465
-7.892790308673911,7.918275833129883
-7.8761493177145505,7.8869194984436035
-7.950781972366453,7.934072017669678
-7.920818811243059,7.906433582305908
-7.954677021213342,7.9387712478637695
-7.928117974144348,7.915511608123779
-7.954677021213342,7.93116569519043
-7.9430951409681345,7.929454803466797
-7.935542022791058,7.952935218811035
-7.869665979871627,7.9351043701171875
-7.928117974144348,7.915805339813232
-7.9393021526221474,7.916637897491455
-7.935542022791058,7.944088459014893
-7.9393021526221474,7.911125659942627
-7.931814161156377,7.900578498840332
-7.920818811243059,7.885720729827881
-7.906204032331684,7.891557216644287
-7.928117974144348,7.889840126037598
-7.913640203677234,7.909327030181885
-7.950781972366453,7.950628757476807
-7.906578398789698,7.921834945678711
-7.946921547407927,7.917830944061279
-7.995678626217357,7.920796871185303
-7.954677021213342,7.9740824699401855
-7.909324126450216,7.943151950836182
-7.950781972366453,7.9434404373168945
-7.931814161156377,7.9094672203063965
-7.920818811243059,7.933343410491943
-7.896196359268842,7.918047904968262
-7.950781972366453,7.921969890594482
-7.946921547407927,7.9095892906188965
-7.946921547407927,7.936759948730469
-7.935542022791058,7.909035682678223
-7.918702847281798,7.903311252593994
-7.856986114171083,7.918880939483643
-7.954677021213342,7.943427085876465
-7.898232053207978,7.893892288208008
-7.91721462968355,7.91893196105957
-7.928117974144348,7.930971622467041
-7.931814161156377,7.910245418548584
-7.924453006674053,7.891684055328369
-7.954333871520422,7.909365653991699
-7.946921547407927,7.945982456207275
-7.9430951409681345,7.942859172821045
-7.928117974144348,7.899952411651611
-7.89962956062971,7.901025295257568
-7.946921547407927,7.912207126617432
-8.034343915929238,7.961386680603027
-7.935542022791058,7.919266223907471
-7.946921547407927,7.92161226272583
-7.9430951409681345,7.921140193939209
-7.924453006674053,7.906827449798584
-7.924453006674053,7.921699047088623
-7.91275330858467,7.886044502258301
-7.928117974144348,7.943912029266357
-7.9870475777718735,7.951140880584717
-7.946921547407927,7.924851417541504
-7.950781972366453,7.926599025726318
-7.920818811243059,7.968317985534668
-7.9430951409681345,7.946767330169678
-7.987162773987728,7.952505588531494
-7.954677021213342,7.9335103034973145
-7.950781972366453,7.959498882293701
-7.926117223102731,7.933753490447998
-7.896196359268842,7.904272556304932
-7.954677021213342,7.9499688148498535
-7.954677021213342,7.944715976715088
-7.924453006674053,7.90898323059082
-7.974340357299629,7.964010715484619
-7.931814161156377,7.907917022705078
-7.950781972366453,7.9505205154418945
-7.950781972366453,7.924441814422607
-7.935542022791058,7.903120517730713
-7.924453006674053,7.914458274841309
-7.882728704344236,7.8792595863342285
-7.913640203677234,7.892265319824219
-7.882728704344236,7.9040207862854
-7.8728955601551585,7.878712177276611
-7.879425560900211,7.906131744384766
-7.931814161156377,7.925387382507324
-7.928117974144348,7.9021830558776855
-7.931814161156377,7.925329208374023
-7.96257349994767,7.974562644958496
-7.954677021213342,7.907543659210205
-7.89962956062971,7.93068265914917
-7.931814161156377,7.905350208282471
-7.931814161156377,7.946935653686523
-7.954677021213342,7.953911781311035
-7.950781972366453,7.921311855316162
-7.9430951409681345,7.921543598175049
-7.928117974144348,7.925197124481201
-7.982966659490206,7.966151714324951
-7.9393021526221474,7.917080402374268
-7.954677021213342,7.939250469207764
-7.931814161156377,7.890910625457764
-7.954677021213342,7.924177646636963
-7.954677021213342,7.931319236755371
-7.935542022791058,7.906887054443359
-7.974340357299629,7.948401927947998
-7.928117974144348,7.92495059967041
-7.902901855104389,7.907881259918213
-7.954677021213342,7.919793605804443
-7.91721462968355,7.91759729385376
-7.946921547407927,7.912965774536133
-7.866459873882536,7.915653705596924
-7.954677021213342,7.941311836242676
-7.894231790888085,7.8800272941589355
-7.950781972366453,7.933664798736572
-7.956299563220691,7.926137447357178
-7.924453006674053,7.896944046020508
-7.920818811243059,7.94696569442749
-7.915279363841231,7.906153202056885
-7.954677021213342,7.934382915496826
-7.9430951409681345,7.914689540863037
-7.9430951409681345,7.951157093048096
-7.924453006674053,7.926791667938232
-7.866625579174465,7.885982990264893
-7.924453006674053,7.925291538238525
-7.954677021213342,7.893279075622559
-7.910094953104535,7.896783351898193
-7.946921547407927,7.937328815460205
-7.995678626217357,7.9704108238220215
-7.954677021213342,7.931344985961914
-7.950781972366453,7.917683124542236
-7.928117974144348,7.914254665374756
-7.954677021213342,7.948198318481445
-7.950781972366453,7.9346113204956055
-7.935581670484014,7.921328067779541
-7.954677021213342,7.94683837890625
-7.913640203677234,7.902055263519287
-7.928117974144348,7.931275844573975
-7.928117974144348,7.90287446975708
-7.913640203677234,7.925186634063721
-7.931814161156377,7.920272350311279
-7.9393021526221474,7.938476085662842
-7.9430951409681345,7.943190097808838
-7.9393021526221474,7.92594051361084
-7.950781972366453,7.935102939605713
-7.954677021213342,7.899250030517578
-7.950781972366453,7.9221601486206055
-7.935542022791058,7.918228626251221
-7.9430951409681345,7.918876647949219
-7.950781972366453,7.929298400878906
-7.974694136660875,7.930351257324219
-7.89962956062971,7.9207305908203125
-7.931814161156377,7.922637462615967
-7.9393021526221474,7.912721157073975
-7.838628495628443,7.901992321014404
-7.954677021213342,7.941247463226318
-7.928117974144348,7.91160249710083
-7.9913998274291025,7.938353538513184
-7.91721462968355,7.927762985229492
-7.950781972366453,7.927886486053467
-7.968835045533489,7.9475297927856445
-7.924453006674053,7.927711009979248
-7.9393021526221474,7.917688846588135
-7.928117974144348,7.943414211273193
-7.928117974144348,7.918620586395264
-7.950781972366453,7.93881368637085
-7.896196359268842,7.945572376251221
-7.924453006674053,7.934177398681641
-7.886056354845152,7.87510347366333
-7.924453006674053,7.938298225402832
-7.946921547407927,7.917582988739014
-7.9430951409681345,7.924437046051025
-7.946921547407927,7.928097248077393
-7.954677021213342,7.928490161895752
-7.924453006674053,7.9014363288879395
-7.946921547407927,7.928305625915527
-7.935542022791058,7.91212797164917
-7.941194514917139,7.930748462677002
-7.9430951409681345,7.91305685043335
-7.928117974144348,7.930423259735107
-7.924453006674053,7.913674831390381
-7.931814161156377,7.919943809509277
-7.950781972366453,7.912043571472168
-7.924453006674053,7.91201639175415
-7.931814161156377,7.925266265869141
-7.9430951409681345,7.927441596984863
-7.954677021213342,7.919779300689697
-7.889410352488291,7.912252902984619
-7.931814161156377,7.9224419593811035
-7.916578772611358,7.948317527770996
-7.924453006674053,7.9364914894104
-7.903090094245322,7.892882823944092
-7.931814161156377,7.898339748382568
-7.954677021213342,7.903836727142334
-7.995678626217357,7.869987964630127
-7.946921547407927,7.946348667144775
-7.892790308673911,7.884355545043945
-7.93468629292431,7.883533954620361
-7.950781972366453,7.982407093048096
-7.928117974144348,7.922128200531006
-7.928117974144348,7.906398296356201
-7.950781972366453,7.924169063568115
-7.946921547407927,7.9358391761779785
-7.892069753452455,7.899817943572998
-7.954677021213342,7.905344486236572
-7.950781972366453,7.926889896392822
-7.954677021213342,7.9400763511657715
-7.913942323339224,7.931366920471191
-7.9393021526221474,7.908026218414307
-7.9393021526221474,7.945525646209717
-7.920818811243059,7.886117935180664
-7.9393021526221474,7.9119157791137695
-7.995678626217357,7.941617012023926
-7.924453006674053,7.911783695220947
-7.950781972366453,7.923620223999023
-7.9430951409681345,7.953338146209717
-7.913640203677234,7.880531311035156
-7.995678626217357,7.968272686004639
-7.898488952953535,7.897078990936279
-7.910094953104535,7.928897380828857
-7.8728955601551585,7.920673847198486
-7.863280055279963,7.909743785858154
-7.924453006674053,7.901942729949951
-7.920818811243059,7.916320323944092
-7.928155902956855,7.932297706604004
-7.920706937989397,7.928341865539551
-7.950781972366453,7.9305009841918945
-7.91375018033154,7.919083595275879
-7.9430951409681345,7.91607666015625
-7.954677021213342,7.93816614151001
-7.935542022791058,7.881839752197266
-7.935542022791058,7.930151462554932
-7.931814161156377,7.911182403564453
-7.924453006674053,7.9384026527404785
-7.928155902956855,7.899912357330322
-7.954677021213342,7.939809322357178
-7.931814161156377,7.903497219085693
-7.954677021213342,7.943113803863525
-7.931814161156377,7.90016508102417
-7.882728704344236,7.9002156257629395
-7.931814161156377,7.902392387390137
-7.8761493177145505,7.886932849884033
-7.924453006674053,7.927401542663574
-7.869665979871627,7.906256675720215
-7.954677021213342,7.953998565673828
-7.91721462968355,7.904754638671875
-7.910094953104535,7.910236835479736
-7.924453006674053,7.9161787033081055
-7.838628495628443,7.898125648498535
-7.931080216138895,7.9236979484558105
-7.924453006674053,7.941798686981201
-7.954677021213342,7.92706298828125
-7.903090094245322,7.921106815338135
-7.924453006674053,7.904606342315674
-7.9430951409681345,7.916330337524414
-7.954677021213342,7.940171718597412
-7.950781972366453,7.945473670959473
-7.924453006674053,7.896268367767334
-7.924453006674053,7.945074558258057
-7.950781972366453,7.94685697555542
-7.9393021526221474,7.9523138999938965
-7.9430951409681345,7.920047760009766
-7.9393021526221474,7.935686111450195
-7.954677021213342,7.955045223236084
-7.9393021526221474,7.917639255523682
-7.928117974144348,7.906459331512451
-7.954677021213342,7.947638988494873
-7.839635581656639,7.841038703918457
-7.9393021526221474,7.926660060882568
-7.950781972366453,7.9303059577941895
-7.954677021213342,7.91192102432251
-7.954677021213342,7.946079254150391
-7.960432339694732,7.930793285369873
-7.982923651140671,7.903680324554443
-7.950781972366453,7.93075704574585
-7.9226320855575,7.907778263092041
-7.920818811243059,7.887209415435791
-7.946921547407927,7.933515548706055
-7.910094953104535,7.943556308746338
-7.950781972366453,7.909841537475586
-7.987162773987728,7.867943286895752
-7.950781972366453,7.943025588989258
-7.928117974144348,7.901031494140625
-7.946921547407927,7.911143779754639
-7.9393021526221474,7.924866199493408
-7.91721462968355,7.909970760345459
-7.886056354845152,7.8862762451171875
-7.924453006674053,7.9195637702941895
-7.9393021526221474,7.928500175476074
-8.958607314841775,8.176648139953613
-7.902388164590721,7.9115166664123535
-7.9393021526221474,7.922061920166016
-7.931814161156377,7.903797626495361
-7.9393021526221474,7.926437854766846
-7.946921547407927,7.9255852699279785
-7.931814161156377,7.89630651473999
-7.950781972366453,7.918593406677246
-7.910094953104535,7.915893077850342
-7.950781972366453,7.916885852813721
-7.931814161156377,7.979069709777832
-7.9393021526221474,7.926024436950684
-7.9430951409681345,7.930721759796143
-7.903090094245322,7.918192386627197
-7.896196359268842,7.935819149017334
-7.931814161156377,7.933591842651367
-7.882584025336923,7.918879985809326
-7.910094953104535,7.898496150970459
-7.920818811243059,7.926187992095947
-7.954677021213342,7.903254508972168
-7.970532618892763,7.94973087310791
-7.954677021213342,7.941054821014404
-7.9393021526221474,7.915565013885498
-7.924453006674053,7.910948753356934
-7.9430951409681345,7.9069952964782715
-7.863280055279963,7.925863742828369
-7.924453006674053,7.908148288726807
-7.910094953104535,7.930409908294678
-7.946921547407927,7.919867038726807
-7.924453006674053,7.901343822479248
-7.935542022791058,7.920355319976807
-7.9393021526221474,7.938704967498779
-7.950781972366453,7.926749229431152
-7.954677021213342,7.920583724975586
-7.9393021526221474,7.9354705810546875
-7.931814161156377,7.93023157119751
-7.889410352488291,7.891485691070557
-7.928117974144348,7.925965785980225
-7.931814161156377,7.912817478179932
-7.924453006674053,7.899446964263916
-7.924453006674053,7.899379253387451
-7.931814161156377,7.888791561126709
-7.8761493177145505,7.901420593261719
-7.950781972366453,7.947737216949463
-7.936235711226021,7.910238742828369
-7.89962956062971,7.915568828582764
-7.924453006674053,7.929037570953369
-7.924453006674053,7.907510280609131
-7.920818811243059,7.901115894317627
-7.863280055279963,7.908518314361572
-7.946921547407927,7.941816806793213
-7.9430951409681345,7.95105504989624
-7.906578398789698,7.920684337615967
-7.9430951409681345,7.939097881317139
-7.910313148974003,7.886283874511719
-7.950781972366453,7.910211563110352
-7.924453006674053,7.920096397399902
-7.8728955601551585,7.875906944274902
-7.9737577757544535,7.9386210441589355
-7.966617665152964,7.907013416290283
-7.950781972366453,7.9358296394348145
-7.924453006674053,7.899906635284424
-7.954677021213342,7.931455135345459
-7.946921547407927,7.91372013092041
-7.928117974144348,7.908318996429443
-7.950781972366453,7.902924060821533
-7.9737577757544535,7.9654669761657715
-7.935542022791058,7.904423236846924
-7.950781972366453,7.936825752258301
-7.924453006674053,7.9375200271606445
-7.950781972366453,7.927229881286621
-7.931814161156377,7.894407272338867
-7.9393021526221474,7.925215244293213
-7.9393021526221474,7.9160685539245605
-7.950781972366453,7.939217567443848
-7.935542022791058,7.899832248687744
-7.966617665152964,7.9597368240356445
-7.8416326138557455,7.892117500305176
-7.928117974144348,7.946805953979492
-7.844000917077081,7.932150363922119
-7.924453006674053,7.8804497718811035
-7.931814161156377,7.90533971786499
-7.950781972366453,7.923449993133545
-7.954677021213342,7.915348052978516
-7.920818811243059,7.903740882873535
-7.931814161156377,7.9148149490356445
-7.946921547407927,7.899077892303467
-7.9810573183290385,7.935672283172607
-7.954677021213342,7.921391487121582
-7.9393021526221474,7.9324116706848145
-7.954677021213342,7.929719924926758
-7.935542022791058,7.935327529907227
-7.9393021526221474,7.9301438331604
-7.841636187410258,7.905982494354248
-7.920818811243059,7.9285502433776855
-7.946921547407927,7.941757678985596
-7.931814161156377,7.910924911499023
-7.94551824914185,7.885905742645264
-7.924453006674053,7.923972129821777
-7.924453006674053,7.892919063568115
-7.954677021213342,7.945374965667725
-7.903090094245322,7.911637783050537
-7.9430951409681345,7.919800281524658
-7.9430951409681345,7.927120685577393
-7.892790308673911,7.8801140785217285
-7.946921547407927,7.917557716369629
-7.9393021526221474,7.945003509521484
-7.924453006674053,7.919559001922607
-7.950781972366453,7.941536903381348
-7.946921547407927,7.94049596786499
-7.946921547407927,7.9001641273498535
-7.950781972366453,7.939988136291504
-7.954677021213342,7.9348835945129395
-7.9430951409681345,7.920778751373291
-7.869665979871627,7.900244235992432
-7.935542022791058,7.897959232330322
-7.920818811243059,7.9025397300720215
-7.863280055279963,7.91160249710083
-7.931814161156377,7.912275314331055
-7.946921547407927,7.91500997543335
-7.950781972366453,7.954809188842773
-7.974694136660875,7.91881799697876
-7.950781972366453,7.937354564666748
-7.954677021213342,7.931816577911377
-7.924453006674053,7.919501304626465
-7.910094953104535,7.939417839050293
-7.924453006674053,7.929831027984619
-7.924453006674053,7.9289703369140625
-7.920818811243059,7.894153118133545
-7.924303420810379,7.886555194854736
-7.950781972366453,7.946380138397217
-7.928117974144348,7.923184871673584
-7.896196359268842,7.902957916259766
-7.935542022791058,7.9071364402771
-7.954677021213342,7.954442501068115
-7.849224838522453,7.849249839782715
-7.931814161156377,7.910439491271973
-7.9430951409681345,7.926657676696777
-7.806866690314549,7.95141077041626
-7.920818811243059,7.900207042694092
-7.950781972366453,7.9295454025268555
-7.889410352488291,7.92416524887085
-7.935542022791058,7.922256946563721
-7.950781972366453,7.920693874359131
-7.950781972366453,7.938413143157959
-7.946921547407927,7.907838344573975
-7.950781972366453,7.9286017417907715
-7.924453006674053,7.91456937789917
-7.950781972366453,7.931753635406494
-7.928117974144348,7.906187534332275
-7.932370292702363,7.919626712799072
-7.950781972366453,7.950470447540283
-7.920818811243059,7.916069507598877
-7.869665979871627,7.920364856719971
-7.970532618892763,7.953190326690674
-7.924453006674053,7.877908706665039
-7.946921547407927,7.952652931213379
-7.950781972366453,7.934995174407959
-7.950781972366453,7.930683135986328
-7.995678626217357,7.952520370483398
-7.928117974144348,7.908722400665283
-7.954677021213342,7.902957916259766
-7.924453006674053,7.928416728973389
-7.974694136660875,7.942214488983154
-7.9737577757544535,7.96194314956665
-7.935542022791058,7.912679195404053
-7.856986114171083,7.899580478668213
-7.982966659490206,7.939645290374756
-7.954677021213342,7.938986301422119
-7.931814161156377,7.917822360992432
-7.935542022791058,7.896109104156494
-7.910094953104535,7.931769847869873
-7.950781972366453,7.919678688049316
-7.954677021213342,7.934329509735107
-7.945802750156343,7.92940616607666
-7.954677021213342,7.923242568969727
-7.903090094245322,7.9160990715026855
-7.946921547407927,7.92454719543457
-7.954677021213342,7.911182880401611
-7.935542022791058,7.922863006591797
-7.89962956062971,7.903071880340576
-7.954677021213342,7.937374114990234
-7.931814161156377,7.913895130157471
-7.8761493177145505,7.901226997375488
-7.93468629292431,7.949409484863281
-7.931814161156377,7.919622421264648
-7.946921547407927,7.903301239013672
-7.924453006674053,7.899853229522705
-7.974694136660875,7.943263053894043
-7.954677021213342,7.921583652496338
-7.950781972366453,7.920976161956787
-7.924453006674053,7.95446252822876
-7.93468629292431,7.951291561126709
-7.954677021213342,7.925163745880127
-7.95090181210265,7.937614440917969
-7.906035306239573,7.894404888153076
-7.91721462968355,7.909719944000244
-7.9430951409681345,7.928286075592041
-7.896196359268842,7.944439888000488
-7.903090094245322,7.913878917694092
-7.924453006674053,7.904900074005127
-7.924453006674053,7.908984184265137
-7.928117974144348,7.918247222900391
-7.950781972366453,7.924728870391846
-7.910094953104535,7.921497821807861
-7.935542022791058,7.884090423583984
-7.920818811243059,7.890860557556152
-7.954677021213342,7.954308032989502
-7.924453006674053,7.914428234100342
-7.954677021213342,7.954460144042969
-7.906578398789698,7.906104564666748
-7.954677021213342,7.95004415512085
-8.008819571765459,7.965600490570068
-7.886056354845152,7.894151210784912
-7.9393021526221474,7.907940864562988
-7.966617665152964,7.918010234832764
-7.954677021213342,7.935227394104004
-7.8728955601551585,7.935593605041504
-7.954677021213342,7.934317111968994
-7.9393021526221474,7.94811487197876
-7.950781972366453,7.921576499938965
-7.954677021213342,7.932796001434326
-7.950781972366453,7.950464725494385
-7.954677021213342,7.95766019821167
-7.924453006674053,7.930023670196533
-7.950781972366453,7.9077839851379395
-7.903090094245322,7.9086127281188965
-7.954677021213342,7.935295581817627
-7.892790308673911,7.891968250274658
-7.920818811243059,7.914393901824951
-7.896196359268842,7.939192771911621
-7.954677021213342,7.936586380004883
-7.948117324273147,7.921801567077637
-7.935542022791058,7.927088737487793
-7.954677021213342,7.946773529052734
-7.970532618892763,7.946078777313232
-7.932370292702363,7.91163969039917
-7.935542022791058,7.921777248382568
-7.9393021526221474,7.901001930236816
-7.946921547407927,7.93475866317749
-7.931814161156377,7.905078887939453
-7.950781972366453,7.936705589294434
-7.867052707791308,7.915318965911865
-7.946921547407927,7.8969831466674805
-7.935542022791058,7.911936283111572
-7.974694136660875,7.930705547332764
-7.954677021213342,7.943603515625
-7.8315534278490535,7.9224419593811035
-7.9430951409681345,7.900750160217285
-7.913640203677234,7.91070032119751
-7.928117974144348,7.923405170440674
-7.928117974144348,7.92158842086792
-7.931814161156377,7.916499614715576
-7.946921547407927,7.931575775146484
-7.935542022791058,7.939922332763672
-7.9393021526221474,7.92193078994751
-7.9430951409681345,7.9099297523498535
-7.950781972366453,7.93291711807251
-7.946921547407927,7.9518327713012695
-7.924453006674053,7.9191131591796875
-7.903090094245322,7.906205177307129
-7.9430951409681345,7.971357345581055
-7.931814161156377,7.902714252471924
-7.946921547407927,7.907990455627441
-7.910094953104535,7.916792869567871
-7.886056354845152,7.945065021514893
-7.924453006674053,7.882737159729004
-7.931814161156377,7.909043788909912
-7.954677021213342,7.937649726867676
-7.896196359268842,7.91935920715332
-7.928117974144348,7.913303375244141
-7.913640203677234,7.908463001251221
-7.935542022791058,7.895952224731445
-7.91721462968355,7.895275592803955
-7.935542022791058,7.9120869636535645
-7.950781972366453,7.9231791496276855
-7.9393021526221474,7.926034927368164
-7.9393021526221474,7.930514812469482
-7.928117974144348,7.912515163421631
-7.951924235060929,7.8775177001953125
-7.928117974144348,7.923483371734619
-7.928117974144348,7.917784690856934
-7.924453006674053,7.9242987632751465
-7.954677021213342,7.925504207611084
-7.869665979871627,7.8833327293396
-7.935542022791058,7.927568435668945
-7.93765506239242,7.9043731689453125
-7.931814161156377,7.907110691070557
-7.928117974144348,7.912437438964844
-7.924453006674053,7.909717082977295
-7.866459873882536,7.909987926483154
-7.950781972366453,7.955374240875244
-7.910094953104535,7.921257019042969
-7.96257349994767,7.943218231201172
-7.91721462968355,7.919363975524902
-7.879425560900211,7.917203426361084
-7.954677021213342,7.918369770050049
-7.9393021526221474,7.914366245269775
-7.931814161156377,7.930968284606934
-7.913640203677234,7.92274284362793
-7.954677021213342,7.944662570953369
-7.931814161156377,7.919027805328369
-7.950781972366453,7.944950580596924
-7.924453006674053,7.901525020599365
-7.89962956062971,7.91396427154541
-7.946921547407927,7.90061616897583
-7.9430951409681345,7.93749475479126
-7.954677021213342,7.93942403793335
-7.935542022791058,7.914157390594482
-7.954677021213342,7.878326416015625
-7.931814161156377,7.927929878234863
-7.928117974144348,7.913406848907471
-7.89962956062971,7.894463062286377
-7.924453006674053,7.924752712249756
-7.931814161156377,7.904266834259033
-7.946921547407927,7.944180965423584
-7.924453006674053,7.923439979553223
-7.9393021526221474,7.916000843048096
-7.950781972366453,7.928285121917725
-7.9393021526221474,7.931024074554443
-7.931814161156377,7.894524097442627
-7.942381102016373,7.880650043487549
-7.950781972366453,7.917950630187988
-7.954677021213342,7.920108318328857
-7.835637836224461,7.901435375213623
-7.889410352488291,7.894731521606445
-7.9430951409681345,7.921359539031982
-7.933009805512286,7.925211429595947
-7.872861820710693,7.9188995361328125
-7.903090094245322,7.911926746368408
-7.950781972366453,7.9067158699035645
-7.913640203677234,7.885514736175537
-7.920818811243059,7.9009199142456055
-7.9393021526221474,7.891343593597412
-7.894231790888085,7.89102029800415
-7.844664854175832,7.902517318725586
-7.939379961634402,7.9342474937438965
-7.954677021213342,7.954910755157471
-7.954677021213342,7.92835807800293
-7.928117974144348,7.912755966186523
-7.8657311089458215,7.958463668823242
-7.950781972366453,7.945982933044434
-7.954677021213342,7.951061725616455
-7.954677021213342,7.9304728507995605
-7.954677021213342,7.905144214630127
-7.96257349994767,7.9405903816223145
-7.913640203677234,7.9188714027404785
-7.901574427881827,7.8498125076293945
-7.889410352488291,7.905490398406982
-7.954677021213342,7.922241687774658
-7.950781972366453,7.914112091064453
-7.9393021526221474,7.915804386138916
-7.995678626217357,7.939116954803467
-7.954677021213342,7.915009021759033
-7.950781972366453,7.932271957397461
-7.946921547407927,7.922781467437744
-7.931814161156377,7.891973495483398
-7.924453006674053,7.929126739501953
-7.9393021526221474,7.90453577041626
-7.950781972366453,7.9438347816467285
-7.9516452688683605,7.956532001495361
-7.924453006674053,7.867530345916748
-7.957786139863943,7.952712535858154
-7.950781972366453,7.912346363067627
-7.950781972366453,7.954748630523682
-7.9430951409681345,7.936760902404785
-7.9393021526221474,7.917210102081299
-7.920818811243059,7.910011291503906
-7.924453006674053,7.885085582733154
-7.924453006674053,7.909882545471191
-7.950781972366453,7.954326152801514
-7.91721462968355,7.924391269683838
-7.950781972366453,7.918694019317627
-7.950781972366453,7.935626029968262
-7.970532618892763,7.919116973876953
-7.929962177708765,7.9444580078125
-7.928117974144348,7.932199001312256
-7.954677021213342,7.954672813415527
-7.9393021526221474,7.926602363586426
-7.950781972366453,7.94001579284668
-7.928117974144348,7.928034782409668
-7.957786139863943,7.953945159912109
-7.853872762493711,7.883314609527588
-7.946921547407927,7.921168804168701
-7.853872762493711,7.881507396697998
-7.9393021526221474,7.918180465698242
-7.9913998274291025,7.939169406890869
-7.882728704344236,7.906261920928955
-7.928117974144348,7.9292731285095215
-7.950781972366453,7.942367076873779
-7.946921547407927,7.914634704589844
-7.993715522619759,7.985701560974121
-7.954677021213342,7.904077053070068
-7.950781972366453,7.942336559295654
-7.954677021213342,7.940786838531494
-7.913640203677234,7.9486823081970215
-7.91721462968355,7.945370197296143
-7.982184017551764,7.968559741973877
-7.920818811243059,7.9043869972229
-7.954677021213342,7.937756538391113
-7.8416326138557455,7.898852348327637
-7.928117974144348,7.940174579620361
-7.9393021526221474,7.940558433532715
-7.982923651140671,7.936466693878174
-7.920818811243059,7.9048848152160645
-7.946921547407927,7.931319713592529
-7.935542022791058,7.926087856292725
-7.950781972366453,7.915524482727051
-7.950781972366453,7.949366569519043
-7.954677021213342,7.939259052276611
-7.910094953104535,7.91656494140625
-7.928117974144348,7.913750171661377
-7.935542022791058,7.9112653732299805
-7.935542022791058,7.9075398445129395
-7.903090094245322,7.911128520965576
-8.008819571765459,7.988803863525391
-7.9430951409681345,7.922693729400635
-7.928117974144348,7.904036045074463
-7.950781972366453,7.9479498863220215
-7.9393021526221474,7.918756008148193
-7.9430951409681345,7.915462970733643
-7.931814161156377,7.91881799697876
-7.950781972366453,7.930511951446533
-7.924453006674053,7.918027400970459
-7.847639088350085,7.902173042297363
-7.950781972366453,7.917984485626221
-7.9430951409681345,7.909451961517334
-7.9913998274291025,7.899241924285889
-7.950781972366453,7.941389560699463
-7.950781972366453,7.916667461395264
-7.869665979871627,7.938751697540283
-7.928117974144348,7.925530910491943
-7.903090094245322,7.8996758460998535
-8.026824561605242,7.962249755859375
-7.946921547407927,7.914349555969238
-7.889410352488291,7.920620441436768
-7.954677021213342,7.942325592041016
-7.869665979871627,7.91012716293335
-7.924453006674053,7.893815517425537
-7.886056354845152,7.9153947830200195
-7.954677021213342,7.916316032409668
-7.935542022791058,7.910194396972656
-7.950781972366453,7.9088311195373535
-7.946921547407927,7.89780330657959
-7.946921547407927,7.920339584350586
-7.954677021213342,7.9401469230651855
-7.946921547407927,7.947189807891846
-7.91721462968355,7.953352451324463
-7.948658283730227,7.9463887214660645
-7.889410352488291,7.913432598114014
-7.906578398789698,7.947572708129883
-7.9393021526221474,7.935729026794434
-7.950781972366453,7.904877185821533
-7.869665979871627,7.913849353790283
-7.9393021526221474,7.919161319732666
-7.954677021213342,7.935871601104736
-7.892069753452455,7.895942687988281
-7.924453006674053,7.935090065002441
-7.931814161156377,7.9307074546813965
-7.935542022791058,7.946009159088135
-7.950781972366453,7.946228504180908
-7.954677021213342,7.943718433380127
-7.954677021213342,7.935643672943115
-7.995678626217357,7.927825450897217
-7.89962956062971,7.88784646987915
-7.966576241738391,7.936911106109619
-7.9393021526221474,7.944986820220947
-7.838628495628443,7.916133403778076
-7.954677021213342,7.930288791656494
-7.950298727941771,7.941056251525879
-7.954677021213342,7.94590425491333
-7.844000917077081,7.939903736114502
-7.982923651140671,7.9370598793029785
-7.935542022791058,7.935699939727783
-7.920818811243059,7.887753009796143
-7.853872762493711,7.927343368530273
-7.954677021213342,7.938753128051758
-7.882728704344236,7.904967784881592
-7.954677021213342,7.9301066398620605
-7.882728704344236,7.902039051055908
-7.9430951409681345,7.935793399810791
-7.931814161156377,7.926880359649658
-7.950781972366453,7.9205322265625
-7.920818811243059,7.891542911529541
-7.913640203677234,7.918619632720947
-7.9430951409681345,7.926768779754639
-7.954677021213342,7.941539287567139
-7.950781972366453,7.888355731964111
-7.9393021526221474,7.87733793258667
-7.924453006674053,7.927511692047119
-7.913640203677234,7.911914348602295
-7.838628495628443,7.899977684020996
-7.946921547407927,7.892605781555176
-7.946921547407927,7.924509048461914
-7.9393021526221474,7.939503192901611
-7.947673341658113,7.9313435554504395
-7.954677021213342,7.934078216552734
-7.950781972366453,7.9447431564331055
-7.970532618892763,7.895299434661865
-7.920818811243059,7.9089226722717285
-7.910094953104535,7.894598484039307
-7.924453006674053,7.949611663818359
-7.928117974144348,7.997249126434326
-7.9430951409681345,7.928767204284668
-7.869665979871627,7.8997321128845215
-7.935542022791058,7.936879634857178
-7.91721462968355,7.937021255493164
-7.896196359268842,7.903556823730469
-7.928117974144348,7.9163618087768555
-7.950781972366453,7.935389995574951
-7.950781972366453,7.914093971252441
-7.8728955601551585,7.915370464324951
-7.950781972366453,7.939465522766113
-7.869665979871627,7.909646034240723
-7.91721462968355,7.938104152679443
-7.931814161156377,7.923597812652588
-8.040958607678906,7.955270290374756
-7.954677021213342,7.915128707885742
-7.946921547407927,7.938380718231201
-7.8876003998252076,7.914470195770264
-7.970532618892763,7.949221611022949
-7.838628495628443,7.884981632232666
-7.889410352488291,7.912109851837158
-7.995678626217357,7.964807033538818
-7.93741804551443,7.919890403747559
-7.920818811243059,7.910934925079346
-7.954677021213342,7.941346168518066
-7.946921547407927,7.923162937164307
-7.954677021213342,7.940730571746826
-7.950781972366453,7.922617435455322
-7.950781972366453,7.941128253936768
-7.931814161156377,7.9075398445129395
-7.928117974144348,7.902629375457764
-7.95090181210265,7.925994873046875
-7.950781972366453,7.938845634460449
-7.9430951409681345,7.931027889251709
-7.946921547407927,7.938867568969727
-7.920818811243059,7.909356594085693
-7.91721462968355,7.8897786140441895
-7.903090094245322,7.902547359466553
-7.954677021213342,7.9554314613342285
-7.950781972366453,7.92816162109375
diff --git a/runs/20260125_104915_KIBA/test_markdowntable.txt b/runs/20260125_104915_KIBA/test_markdowntable.txt
deleted file mode 100644
index 0aa876ca22bbb27dc8fe42f949ded12eed2ca413..0000000000000000000000000000000000000000
--- a/runs/20260125_104915_KIBA/test_markdowntable.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-+--------+---------------------+--------------+-------------------+
-| MSE | Pearson Correlation | with p-value | Concordance Index |
-+--------+---------------------+--------------+-------------------+
-| 0.0008 | 0.5219 | 0.0000 | 0.7003 |
-+--------+---------------------+--------------+-------------------+
\ No newline at end of file
diff --git a/runs/20260125_104915_KIBA/valid_markdowntable.txt b/runs/20260125_104915_KIBA/valid_markdowntable.txt
deleted file mode 100644
index 4e340194b1d604287d623f010c0413ed10a4aa91..0000000000000000000000000000000000000000
--- a/runs/20260125_104915_KIBA/valid_markdowntable.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-+---------+--------+---------------------+--------------+-------------------+
-| # epoch | MSE | Pearson Correlation | with p-value | Concordance Index |
-+---------+--------+---------------------+--------------+-------------------+
-| epoch 0 | 0.0009 | 0.4542 | 0.0000 | 0.6730 |
-| epoch 1 | 0.0179 | 0.4802 | 0.0000 | 0.6799 |
-| epoch 2 | 0.0076 | 0.5230 | 0.0000 | 0.7055 |
-| epoch 3 | 0.0022 | 0.5346 | 0.0000 | 0.7067 |
-| epoch 4 | 0.0008 | 0.5291 | 0.0000 | 0.7009 |
-| epoch 5 | 0.0043 | 0.5578 | 0.0000 | 0.7056 |
-| epoch 6 | 0.0056 | 0.5834 | 0.0000 | 0.7128 |
-| epoch 7 | 0.0168 | 0.5591 | 0.0000 | 0.6958 |
-| epoch 8 | 0.0009 | 0.5639 | 0.0000 | 0.7024 |
-| epoch 9 | 0.0160 | 0.5796 | 0.0000 | 0.7106 |
-+---------+--------+---------------------+--------------+-------------------+
\ No newline at end of file
diff --git a/scripts/bioflow_obm.py b/scripts/bioflow_obm.py
new file mode 100644
index 0000000000000000000000000000000000000000..d2035cb954482bcbd2b917af4978770d86cc0d00
--- /dev/null
+++ b/scripts/bioflow_obm.py
@@ -0,0 +1,36 @@
+import os
+import sys
+import torch
+import numpy as np
+import logging
+from typing import List, Union, Dict, Any, Optional
+from tqdm import tqdm
+
+# Add root to python path to allow imports from open_biomed
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+
+# Removed BioMedGPT references and added placeholders for open-source models
+class BioFlowOBM:
+ def __init__(self, config_path: str = "configs/model/opensource_model.yaml"):
+ self.config_path = config_path
+ self.model = None # Placeholder for open-source model
+
+ def initialize(self):
+ # Placeholder for initializing open-source model
+ pass
+
+ def process_data(self, data):
+ # Placeholder for processing data using open-source model
+ pass
+
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger(__name__)
+
+# Example usage block
+if __name__ == "__main__":
+ # Create valid dummy data/config for test if needed
+ print("This script is a library. Import OBM to use.")
+ print("Example:")
+ print("from scripts.bioflow_obm import OBM")
+ print("obm = OBM()")
+ print("vec = obm.encode_text('Biology is complex')")
diff --git a/scripts/debug.sh b/scripts/debug.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0ed047aedcea441c597d15c297eef3fc240e611f
--- /dev/null
+++ b/scripts/debug.sh
@@ -0,0 +1,13 @@
+#!bin/bash
+export CUDA_VISIBLE_DEVICES=$4
+TASK=$1
+MODEL=$2
+DATASET=$3
+
+python open_biomed/scripts/train.py \
+--task $TASK \
+--additional_config_file configs/model/$MODEL.yaml \
+--dataset_name $DATASET \
+--dataset_path ./datasets/$TASK/$DATASET \
+--empty_folder \
+--debug
\ No newline at end of file
diff --git a/scripts/run_docker.sh b/scripts/run_docker.sh
new file mode 100644
index 0000000000000000000000000000000000000000..823b429e3f2962a3391f73a81829f2d4272203be
--- /dev/null
+++ b/scripts/run_docker.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# docker build
+docker build -t openbiomed .
+
+# docker run
+docker stop openbiomed_container && docker rm openbiomed_container
+docker run -it -d --gpus all -p 8082:8082 -p 8083:8083 -v /root/code/OpenBioMed:/app --name openbiomed_container openbiomed:latest
\ No newline at end of file
diff --git a/scripts/run_server.sh b/scripts/run_server.sh
new file mode 100644
index 0000000000000000000000000000000000000000..a5a5587ff42fd75054a757b0ef55ce025dc46146
--- /dev/null
+++ b/scripts/run_server.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+echo "server start"
+
+# Activate the Conda environment
+source /root/miniconda3/bin/activate OpenBioMed
+
+python -m uvicorn open_biomed.scripts.run_server:app \
+ --host 0.0.0.0 \
+ --port 8082 \
+ --log-level info > ./tmp/server.log 2>&1 &
+
+python -m uvicorn open_biomed.scripts.run_server_workflow:app \
+ --host 0.0.0.0 \
+ --port 8083 \
+ --log-level info > ./tmp/workflow.log 2>&1 &
+
+tail -f /dev/null
\ No newline at end of file
diff --git a/scripts/test.sh b/scripts/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..479461456775013512a6740e788730f5ebd4d9af
--- /dev/null
+++ b/scripts/test.sh
@@ -0,0 +1,14 @@
+#!bin/bash
+export CUDA_VISIBLE_DEVICES=$4
+TASK=$1
+MODEL=$2
+DATASET=$3
+
+python open_biomed/scripts/train.py \
+--task $TASK \
+--additional_config_file configs/model/$MODEL.yaml \
+--dataset_name $DATASET \
+--dataset_path ./datasets/$TASK/$DATASET \
+--ckpt_path ./checkpoints/server/pharmolix_fm.ckpt \
+--batch_size_eval 32 \
+--test_only
\ No newline at end of file
diff --git a/scripts/train.sh b/scripts/train.sh
new file mode 100644
index 0000000000000000000000000000000000000000..93d410b928c78155e10f12d56acbda01a88b2376
--- /dev/null
+++ b/scripts/train.sh
@@ -0,0 +1,12 @@
+#!bin/bash
+export CUDA_VISIBLE_DEVICES=$4
+TASK=$1
+MODEL=$2
+DATASET=$3
+
+python open_biomed/scripts/train.py \
+--task $TASK \
+--additional_config_file configs/model/$MODEL.yaml \
+--dataset_name $DATASET \
+--dataset_path ./datasets/$TASK/$DATASET \
+--empty_folder
\ No newline at end of file
diff --git a/scripts/verify_phase1.py b/scripts/verify_phase1.py
new file mode 100644
index 0000000000000000000000000000000000000000..09bc559ef5c0177104d81c8dad7c4339374df46a
--- /dev/null
+++ b/scripts/verify_phase1.py
@@ -0,0 +1,81 @@
+
+import sys
+import os
+from pathlib import Path
+
+# Add project root to path
+sys.path.append(str(Path(__file__).parent.parent))
+
+from bioflow.core import (
+ BioFlowOrchestrator,
+ ToolRegistry,
+ WorkflowConfig,
+ Modality,
+ BioEncoder,
+ BioPredictor,
+ BioRetriever,
+ EmbeddingResult,
+ PredictionResult,
+ RetrievalResult
+)
+
+# 1. Create Mock Tools for Verification
+class MockEncoder(BioEncoder):
+ def encode(self, content, modality):
+ print(f" [Mock] Encoding {modality.value}: {content[:20]}...")
+ return EmbeddingResult(vector=[0.1]*768, modality=modality, dimension=768)
+ @property
+ def dimension(self): return 768
+
+class MockPredictor(BioPredictor):
+ def predict(self, drug, target):
+ print(f" [Mock] Predicting interaction for drug candidate...")
+ return PredictionResult(score=0.85, confidence=0.9)
+
+class MockRetriever(BioRetriever):
+ def search(self, query, limit=10, filters=None, **kwargs):
+ print(f" [Mock] Searching Vector DB for neighbors...")
+ return [RetrievalResult(id="mol_1", score=0.95, content="CCO", modality=Modality.SMILES)]
+ def ingest(self, content, modality, payload=None): return "1"
+
+# 2. Setup Registry
+print("--- 🛠️ Step 1: Tool Registry Setup ---")
+ToolRegistry.register_encoder("obm", MockEncoder())
+ToolRegistry.register_predictor("deeppurpose", MockPredictor())
+print(ToolRegistry.summary())
+print()
+
+# 3. Load and Visualize Workflow
+print("--- 🗺️ Step 2: Workflow DAG Resolution ---")
+workflow_path = Path("bioflow/workflows/drug_discovery.yaml")
+import yaml
+with open(workflow_path, 'r') as f:
+ config_dict = yaml.safe_load(f)
+
+orchestrator = BioFlowOrchestrator()
+orchestrator.set_retriever(MockRetriever()) # Configured the retriever
+config = WorkflowConfig.from_dict(config_dict)
+orchestrator.register_workflow(config)
+
+# Show topological order
+order = orchestrator._build_execution_order(config)
+print(f"Workflow: {config.name}")
+print("Execution Sequence (Topological Sort):")
+for i, node in enumerate(order):
+ deps = f" (depends on: {', '.join(node.inputs)})" if node.inputs else ""
+ print(f" {i+1}. [{node.id}] Type: {node.type.value}{deps}")
+print()
+
+# 4. Perform Dry Run
+print("--- 🚀 Step 3: Pipeline Execution Dry Run ---")
+input_smiles = "CN1C=NC2=C1C(=O)N(C(=O)N2C)C" # Caffeine
+result = orchestrator.run("drug_discovery_basic", input_smiles)
+
+print("\n--- 📊 Final Report ---")
+if result.success:
+ print(f"Status: ✅ SUCCESS")
+ print(f"Final Output Score: {result.output[0].score if isinstance(result.output, list) else result.output.score}")
+ print(f"Duration: {result.duration_ms:.2f} ms")
+else:
+ print(f"Status: ❌ FAILED")
+ print(f"Errors: {result.context.errors}")
diff --git a/scripts/verify_phase2.py b/scripts/verify_phase2.py
new file mode 100644
index 0000000000000000000000000000000000000000..0a177d61e1d7a0981a342c3cd1c52fae6a810bba
--- /dev/null
+++ b/scripts/verify_phase2.py
@@ -0,0 +1,273 @@
+"""
+Phase 2 Verification Script
+=============================
+
+Tests the real open-source encoder implementations.
+
+Usage:
+ python scripts/verify_phase2.py [--full]
+
+ --full: Run full tests with model downloads (slow, requires GPU recommended)
+
+Without --full, runs quick tests with fallback/mock behavior.
+"""
+
+import sys
+import os
+from pathlib import Path
+
+# Add project root
+sys.path.insert(0, str(Path(__file__).parent.parent))
+
+import logging
+logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
+logger = logging.getLogger(__name__)
+
+
+def test_registry():
+ """Test that all plugins are importable and registry works."""
+ print("\n" + "="*60)
+ print("🛠️ TEST 1: Plugin Registry")
+ print("="*60)
+
+ from bioflow.core import ToolRegistry, Modality
+ from bioflow.plugins import (
+ OBMEncoder,
+ TextEncoder,
+ MoleculeEncoder,
+ ProteinEncoder,
+ QdrantRetriever,
+ DeepPurposePredictor
+ )
+
+ print("✅ All plugins imported successfully")
+
+ # List available
+ print("\nAvailable plugins:")
+ print(" • OBMEncoder (multimodal)")
+ print(" • TextEncoder (PubMedBERT/SciBERT)")
+ print(" • MoleculeEncoder (ChemBERTa/RDKit)")
+ print(" • ProteinEncoder (ESM-2/ProtBERT)")
+ print(" • QdrantRetriever (Qdrant)")
+ print(" • DeepPurposePredictor (DTI)")
+
+ return True
+
+
+def test_rdkit_fallback():
+ """Test RDKit molecule encoding (no GPU needed)."""
+ print("\n" + "="*60)
+ print("🧪 TEST 2: RDKit Molecule Encoder (CPU-only)")
+ print("="*60)
+
+ try:
+ from bioflow.plugins.encoders.molecule_encoder import MoleculeEncoder
+ from bioflow.core import Modality
+
+ encoder = MoleculeEncoder(backend="rdkit_morgan", fp_size=2048)
+
+ test_molecules = [
+ ("CCO", "Ethanol"),
+ ("CC(=O)Oc1ccccc1C(=O)O", "Aspirin"),
+ ("CN1C=NC2=C1C(=O)N(C(=O)N2C)C", "Caffeine"),
+ ]
+
+ print(f"Encoder dimension: {encoder.dimension}")
+ print("\nEncoding molecules:")
+
+ for smiles, name in test_molecules:
+ result = encoder.encode(smiles, Modality.SMILES)
+ nonzero = sum(1 for v in result.vector if v > 0)
+ print(f" • {name}: {nonzero} bits set (of {len(result.vector)})")
+
+ print("✅ RDKit encoding works!")
+ return True
+
+ except ImportError as e:
+ print(f"⚠️ RDKit not installed: {e}")
+ print(" Install with: pip install rdkit")
+ return False
+
+
+def test_deeppurpose_predictor():
+ """Test DeepPurpose predictor (with fallback)."""
+ print("\n" + "="*60)
+ print("🔮 TEST 3: DeepPurpose Predictor")
+ print("="*60)
+
+ from bioflow.plugins.deeppurpose_predictor import DeepPurposePredictor
+
+ predictor = DeepPurposePredictor()
+
+ # Test data
+ drug = "CC(=O)Oc1ccccc1C(=O)O" # Aspirin
+ target = "MKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
+
+ print(f"Drug: Aspirin (SMILES: {drug[:30]}...)")
+ print(f"Target: Protein ({len(target)} amino acids)")
+
+ result = predictor.predict(drug, target)
+
+ print(f"\nPrediction:")
+ print(f" • Score: {result.score:.3f}")
+ print(f" • Label: {result.label}")
+ print(f" • Confidence: {result.confidence:.2f}")
+ print(f" • Method: {result.metadata.get('method', 'unknown')}")
+
+ if result.metadata.get('warning'):
+ print(f" ⚠️ {result.metadata['warning']}")
+
+ print("✅ Predictor works (with fallback if DeepPurpose unavailable)")
+ return True
+
+
+def test_qdrant_retriever():
+ """Test Qdrant retriever with mock encoder."""
+ print("\n" + "="*60)
+ print("🗄️ TEST 4: Qdrant Retriever (In-Memory)")
+ print("="*60)
+
+ try:
+ from bioflow.core import BioEncoder, Modality, EmbeddingResult
+ from bioflow.plugins.qdrant_retriever import QdrantRetriever
+
+ # Mock encoder for testing
+ class MockEncoder(BioEncoder):
+ def encode(self, content, modality):
+ # Simple hash-based vector
+ import hashlib
+ h = hashlib.md5(content.encode()).hexdigest()
+ vector = [int(c, 16) / 15.0 for c in h] * 48 # 768-dim
+ return EmbeddingResult(vector=vector[:768], modality=modality, dimension=768)
+
+ @property
+ def dimension(self): return 768
+
+ encoder = MockEncoder()
+ retriever = QdrantRetriever(encoder=encoder, collection="test_molecules")
+
+ # Ingest test data
+ test_data = [
+ ("CCO", "Ethanol", {"type": "alcohol"}),
+ ("CCCO", "Propanol", {"type": "alcohol"}),
+ ("CC(=O)O", "Acetic acid", {"type": "acid"}),
+ ("c1ccccc1", "Benzene", {"type": "aromatic"}),
+ ]
+
+ print("Ingesting molecules...")
+ for smiles, name, payload in test_data:
+ retriever.ingest(smiles, Modality.SMILES, {"name": name, **payload})
+
+ print(f"Collection size: {retriever.count()}")
+
+ # Search
+ print("\nSearching for 'CCCCO' (Butanol)...")
+ results = retriever.search("CCCCO", limit=3, modality=Modality.SMILES)
+
+ print("Results:")
+ for r in results:
+ print(f" • {r.payload.get('name', 'Unknown')}: score={r.score:.3f}")
+
+ print("✅ Qdrant retriever works!")
+ return True
+
+ except ImportError as e:
+ print(f"⚠️ qdrant-client not installed: {e}")
+ print(" Install with: pip install qdrant-client")
+ return False
+
+
+def test_full_obm_encoder():
+ """Test full OBM encoder with real models (slow, requires downloads)."""
+ print("\n" + "="*60)
+ print("🚀 TEST 5: Full OBM Encoder (requires model downloads)")
+ print("="*60)
+
+ try:
+ from bioflow.plugins.obm_encoder import OBMEncoder
+ from bioflow.core import Modality
+
+ print("Initializing OBMEncoder...")
+ print("(This will download models on first run - ~500MB)")
+
+ obm = OBMEncoder(
+ text_model="pubmedbert",
+ molecule_model="chemberta",
+ protein_model="esm2_t6", # Smallest ESM model
+ lazy_load=True
+ )
+
+ # Test text
+ print("\n1. Encoding text...")
+ text_result = obm.encode("EGFR inhibitor for lung cancer treatment", Modality.TEXT)
+ print(f" Text embedding: {len(text_result.vector)} dims")
+
+ # Test molecule
+ print("2. Encoding molecule...")
+ mol_result = obm.encode("CC(=O)Oc1ccccc1C(=O)O", Modality.SMILES)
+ print(f" Molecule embedding: {len(mol_result.vector)} dims")
+
+ # Test protein
+ print("3. Encoding protein...")
+ prot_result = obm.encode("MKTVRQERLKSIVRILERSKEPVSG", Modality.PROTEIN)
+ print(f" Protein embedding: {len(prot_result.vector)} dims")
+
+ # Cross-modal similarity
+ print("\n4. Cross-modal similarity:")
+ sim = obm.similarity(text_result, mol_result)
+ print(f" Text-Molecule similarity: {sim:.3f}")
+
+ print("\n✅ Full OBM Encoder works!")
+ print(obm.get_encoder_info())
+ return True
+
+ except Exception as e:
+ print(f"❌ Error: {e}")
+ import traceback
+ traceback.print_exc()
+ return False
+
+
+def main():
+ """Run verification tests."""
+ print("="*60)
+ print("🧬 BioFlow Phase 2 Verification")
+ print("="*60)
+
+ full_mode = "--full" in sys.argv
+
+ if full_mode:
+ print("Running FULL tests (with model downloads)")
+ else:
+ print("Running QUICK tests (no model downloads)")
+ print("Add --full flag for complete testing")
+
+ results = {}
+
+ # Always run
+ results["Registry"] = test_registry()
+ results["RDKit"] = test_rdkit_fallback()
+ results["DeepPurpose"] = test_deeppurpose_predictor()
+ results["Qdrant"] = test_qdrant_retriever()
+
+ # Only in full mode
+ if full_mode:
+ results["OBMEncoder"] = test_full_obm_encoder()
+
+ # Summary
+ print("\n" + "="*60)
+ print("📊 VERIFICATION SUMMARY")
+ print("="*60)
+
+ for test, passed in results.items():
+ status = "✅ PASS" if passed else "❌ FAIL"
+ print(f" {test}: {status}")
+
+ all_passed = all(results.values())
+ print("\n" + ("✅ All tests passed!" if all_passed else "⚠️ Some tests failed"))
+
+ return 0 if all_passed else 1
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/scripts/verify_phase3.py b/scripts/verify_phase3.py
new file mode 100644
index 0000000000000000000000000000000000000000..5806d7021757966fe9a177836baae5d8661dcd3a
--- /dev/null
+++ b/scripts/verify_phase3.py
@@ -0,0 +1,351 @@
+"""
+Phase 3 Verification: Unified Workflow
+========================================
+
+Tests the complete discovery pipeline end-to-end:
+1. Ingest sample data into Qdrant
+2. Run discovery pipeline with query
+3. Verify predictions and traceability
+
+Usage:
+ python scripts/verify_phase3.py
+"""
+
+import sys
+from pathlib import Path
+sys.path.insert(0, str(Path(__file__).parent.parent))
+
+import logging
+logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
+logger = logging.getLogger(__name__)
+
+
+def create_mock_components():
+ """Create mock encoder, retriever, predictor for testing."""
+ from bioflow.core import (
+ BioEncoder, BioRetriever, BioPredictor,
+ Modality, EmbeddingResult, RetrievalResult, PredictionResult
+ )
+ import hashlib
+
+ class MockEncoder(BioEncoder):
+ def encode(self, content, modality):
+ h = hashlib.md5(str(content).encode()).hexdigest()
+ vector = [int(c, 16) / 15.0 for c in h] * 48
+ return EmbeddingResult(vector=vector[:768], modality=modality, dimension=768)
+
+ def encode_auto(self, content):
+ return self.encode(content, Modality.TEXT)
+
+ def batch_encode(self, contents, modality):
+ return [self.encode(c, modality) for c in contents]
+
+ @property
+ def dimension(self): return 768
+
+ class MockRetriever(BioRetriever):
+ def __init__(self, encoder):
+ self.encoder = encoder
+ self._data = {}
+ self._vectors = {}
+ self._id_counter = 0
+
+ def search(self, query, limit=10, filters=None, collection=None, modality=None, **kwargs):
+ if isinstance(query, str):
+ query_vec = self.encoder.encode(query, modality or Modality.TEXT).vector
+ else:
+ query_vec = query
+
+ # Simple cosine similarity
+ import math
+ results = []
+ for id_, (vec, payload) in self._vectors.items():
+ dot = sum(a*b for a, b in zip(query_vec, vec))
+ norm_q = math.sqrt(sum(a*a for a in query_vec))
+ norm_v = math.sqrt(sum(b*b for b in vec))
+ score = dot / (norm_q * norm_v) if norm_q * norm_v > 0 else 0
+
+ results.append(RetrievalResult(
+ id=id_,
+ score=score,
+ content=payload.get("content", ""),
+ modality=Modality(payload.get("modality", "text")),
+ payload=payload
+ ))
+
+ results.sort(key=lambda x: x.score, reverse=True)
+ return results[:limit]
+
+ def ingest(self, content, modality, payload=None, collection=None, id=None):
+ self._id_counter += 1
+ id_ = id or f"item_{self._id_counter}"
+ vec = self.encoder.encode(content, modality).vector
+ full_payload = {"content": content, "modality": modality.value, **(payload or {})}
+ self._vectors[id_] = (vec, full_payload)
+ return id_
+
+ def count(self, collection=None):
+ return len(self._vectors)
+
+ class MockPredictor(BioPredictor):
+ def predict(self, drug, target):
+ import random
+ random.seed(hash(drug + target) % 2**32)
+ score = random.uniform(0.2, 0.9)
+ return PredictionResult(
+ score=score,
+ confidence=0.7,
+ label="binding" if score > 0.5 else "non-binding"
+ )
+
+ encoder = MockEncoder()
+ retriever = MockRetriever(encoder)
+ predictor = MockPredictor()
+
+ return encoder, retriever, predictor
+
+
+def test_node_execution():
+ """Test individual node execution."""
+ print("\n" + "="*60)
+ print("🧩 TEST 1: Node Execution")
+ print("="*60)
+
+ from bioflow.core.nodes import (
+ EncodeNode, RetrieveNode, PredictNode, FilterNode, TraceabilityNode
+ )
+ from bioflow.core import Modality
+
+ encoder, retriever, predictor = create_mock_components()
+
+ # Test EncodeNode
+ encode_node = EncodeNode("enc", encoder, Modality.SMILES)
+ result = encode_node.execute("CCO")
+ print(f" EncodeNode: vector dim = {len(result.data.vector)}")
+
+ # Test FilterNode
+ filter_node = FilterNode("filter", threshold=0.5, top_k=3)
+ items = [{"score": 0.9}, {"score": 0.4}, {"score": 0.7}, {"score": 0.3}]
+ result = filter_node.execute(items)
+ print(f" FilterNode: {len(items)} items → {len(result.data)} after filtering")
+
+ # Test TraceabilityNode
+ trace_node = TraceabilityNode("trace")
+ items = [{"id": "PMID_12345", "content": "test", "payload": {"pmid": "12345"}}]
+ result = trace_node.execute(items)
+ print(f" TraceabilityNode: Added {result.metadata['with_evidence']} evidence links")
+
+ print("✅ All nodes execute correctly")
+ return True
+
+
+def test_discovery_pipeline():
+ """Test the full discovery pipeline."""
+ print("\n" + "="*60)
+ print("🔬 TEST 2: Discovery Pipeline")
+ print("="*60)
+
+ from bioflow.workflows import DiscoveryPipeline, generate_sample_molecules
+ from bioflow.core import Modality
+
+ encoder, retriever, predictor = create_mock_components()
+
+ # Create pipeline
+ pipeline = DiscoveryPipeline(
+ encoder=encoder,
+ retriever=retriever,
+ predictor=predictor,
+ collection="test_molecules"
+ )
+
+ # Ingest sample data
+ print("\n1. Ingesting sample molecules...")
+ sample_data = generate_sample_molecules()
+
+ for mol in sample_data:
+ retriever.ingest(
+ content=mol["smiles"],
+ modality=Modality.SMILES,
+ payload={"name": mol["name"], **{k: v for k, v in mol.items() if k not in ["smiles", "modality"]}}
+ )
+
+ print(f" Ingested {retriever.count()} molecules")
+
+ # Run discovery
+ print("\n2. Running discovery pipeline...")
+ target_sequence = "MKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
+
+ result = pipeline.discover(
+ query="anti-inflammatory compound",
+ target_sequence=target_sequence,
+ limit=5,
+ threshold=0.3,
+ top_k=3
+ )
+
+ print(f"\n Discovery Result:")
+ print(f" • Query: {result.query[:40]}...")
+ print(f" • Candidates retrieved: {len(result.candidates)}")
+ print(f" • Predictions made: {len(result.predictions)}")
+ print(f" • Top hits: {len(result.top_hits)}")
+ print(f" • Execution time: {result.execution_time_ms:.0f}ms")
+
+ print("\n3. Top hits:")
+ for i, hit in enumerate(result.top_hits[:3]):
+ drug = hit.get("drug", "")[:30]
+ score = hit.get("score", 0)
+ evidence = hit.get("evidence_links", {})
+ print(f" {i+1}. {drug}... (score: {score:.3f})")
+ if evidence:
+ print(f" Evidence: {list(evidence.keys())}")
+
+ print("\n✅ Discovery pipeline works!")
+ return True
+
+
+def test_simple_search():
+ """Test simple similarity search."""
+ print("\n" + "="*60)
+ print("🔍 TEST 3: Simple Search")
+ print("="*60)
+
+ from bioflow.workflows import DiscoveryPipeline, generate_sample_abstracts
+ from bioflow.core import Modality
+
+ encoder, retriever, predictor = create_mock_components()
+
+ pipeline = DiscoveryPipeline(
+ encoder=encoder,
+ retriever=retriever,
+ predictor=predictor
+ )
+
+ # Ingest abstracts
+ print("\n1. Ingesting sample abstracts...")
+ for abstract in generate_sample_abstracts():
+ retriever.ingest(
+ content=abstract["content"],
+ modality=Modality.TEXT,
+ payload={k: v for k, v in abstract.items() if k not in ["content", "modality"]}
+ )
+
+ print(f" Ingested {retriever.count()} items")
+
+ # Search
+ print("\n2. Searching for 'EGFR cancer treatment'...")
+ results = pipeline.search(
+ query="EGFR cancer treatment",
+ modality=Modality.TEXT,
+ limit=3
+ )
+
+ print(f"\n Found {len(results)} results:")
+ for r in results:
+ print(f" • Score: {r.score:.3f} | {r.content[:50]}...")
+
+ print("\n✅ Search works!")
+ return True
+
+
+def test_ingestion_utilities():
+ """Test data ingestion utilities."""
+ print("\n" + "="*60)
+ print("📥 TEST 4: Ingestion Utilities")
+ print("="*60)
+
+ from bioflow.workflows.ingestion import (
+ generate_sample_molecules,
+ generate_sample_proteins,
+ generate_sample_abstracts
+ )
+
+ molecules = generate_sample_molecules()
+ proteins = generate_sample_proteins()
+ abstracts = generate_sample_abstracts()
+
+ print(f" • Sample molecules: {len(molecules)}")
+ print(f" - Example: {molecules[0]['name']} ({molecules[0]['smiles'][:20]}...)")
+
+ print(f" • Sample proteins: {len(proteins)}")
+ print(f" - Example: {proteins[0]['name']} ({proteins[0]['sequence'][:20]}...)")
+
+ print(f" • Sample abstracts: {len(abstracts)}")
+ print(f" - Example: {abstracts[0]['title']}")
+
+ print("\n✅ Ingestion utilities work!")
+ return True
+
+
+def test_traceability():
+ """Test evidence linking and traceability."""
+ print("\n" + "="*60)
+ print("🔗 TEST 5: Traceability & Evidence Linking")
+ print("="*60)
+
+ from bioflow.core.nodes import TraceabilityNode
+
+ trace_node = TraceabilityNode("trace")
+
+ # Test with different ID formats
+ test_items = [
+ {"id": "PMID_12345678", "content": "Paper about EGFR", "payload": {}},
+ {"id": "mol_1", "content": "CCO", "payload": {"drugbank_id": "DB00316", "pubchem_id": "702"}},
+ {"id": "prot_1", "content": "MKTVRQ...", "payload": {"uniprot": "P00533"}},
+ ]
+
+ result = trace_node.execute(test_items)
+
+ print(" Evidence links generated:")
+ for item in result.data:
+ print(f" • ID: {item['id']}")
+ links = item.get("evidence_links", {})
+ if links:
+ for source, url in links.items():
+ print(f" → {source}: {url}")
+ else:
+ print(f" → No links (payload missing IDs)")
+
+ print(f"\n Items with evidence: {result.metadata['with_evidence']}/{len(test_items)}")
+ print("\n✅ Traceability works!")
+ return True
+
+
+def main():
+ """Run all Phase 3 verification tests."""
+ print("="*60)
+ print("🧬 BioFlow Phase 3 Verification: Unified Workflow")
+ print("="*60)
+
+ results = {}
+
+ results["Nodes"] = test_node_execution()
+ results["Discovery"] = test_discovery_pipeline()
+ results["Search"] = test_simple_search()
+ results["Ingestion"] = test_ingestion_utilities()
+ results["Traceability"] = test_traceability()
+
+ # Summary
+ print("\n" + "="*60)
+ print("📊 VERIFICATION SUMMARY")
+ print("="*60)
+
+ for test, passed in results.items():
+ status = "✅ PASS" if passed else "❌ FAIL"
+ print(f" {test}: {status}")
+
+ all_passed = all(results.values())
+ print("\n" + ("✅ All Phase 3 tests passed!" if all_passed else "⚠️ Some tests failed"))
+
+ if all_passed:
+ print("\n🎉 The unified workflow is ready!")
+ print(" You can now:")
+ print(" • Ingest molecules, proteins, and literature")
+ print(" • Run cross-modal similarity search")
+ print(" • Predict drug-target interactions")
+ print(" • Trace results back to sources")
+
+ return 0 if all_passed else 1
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..36b992f80a0a284662ac3059731c6241ce07d193
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,8 @@
+from setuptools import setup, find_packages
+
+setup(
+ name='openbiomed',
+ version='0.1.0',
+ packages=find_packages(include=["openbiomed", "openbiomed.*"]),
+ install_requires=[],
+)
\ No newline at end of file
diff --git a/third_party/.placeholder b/third_party/.placeholder
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ui/app/api/discovery/route.ts b/ui/app/api/discovery/route.ts
deleted file mode 100644
index 0ba535c39b4944fc5ef15035fae6a74bfce6ec07..0000000000000000000000000000000000000000
--- a/ui/app/api/discovery/route.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { NextResponse } from 'next/server';
-
-export async function POST(request: Request) {
- const body = await request.json();
- const { query } = body;
-
- console.info("Starting discovery for:", query);
-
- // Here you would typically call your Python backend
- // e.g., await fetch('http://localhost:8000/api/discovery', { ... })
-
- // Mock response
- return NextResponse.json({
- success: true,
- jobId: "job_" + Date.now(),
- status: "processing",
- message: "Pipeline started successfully"
- });
-}
diff --git a/ui/app/api/molecules/route.ts b/ui/app/api/molecules/route.ts
deleted file mode 100644
index cc44d5adaaf4b2c3c83e9b1e7e99d61baa90b762..0000000000000000000000000000000000000000
--- a/ui/app/api/molecules/route.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { NextResponse } from 'next/server';
-
-import { molecules } from '../_mock/molecules';
-
-export async function GET() {
- return NextResponse.json(molecules);
-}
diff --git a/ui/app/api/proteins/route.ts b/ui/app/api/proteins/route.ts
deleted file mode 100644
index 6985cd64f8e1922030f6b00d63d3f1f5cf76ca76..0000000000000000000000000000000000000000
--- a/ui/app/api/proteins/route.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { NextResponse } from 'next/server';
-
-import { proteins } from '../_mock/proteins';
-
-export async function GET() {
- return NextResponse.json(proteins);
-}
diff --git a/ui/lib/api-utils.ts b/ui/lib/api-utils.ts
deleted file mode 100644
index 2027029525eb3d1ac0f57ac3e73ed4d962d28bd7..0000000000000000000000000000000000000000
--- a/ui/lib/api-utils.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export function getApiUrl() {
- if (typeof window !== "undefined") return ""; // browser should use relative url
- if (process.env.BACKEND_URL) return `https://${process.env.BACKEND_URL}`; // SSR should use vercel url
- return `http://localhost:${process.env.PORT ?? 3000}`; // dev SSR should use localhost
-}
diff --git a/ui/lib/data-service.ts b/ui/lib/data-service.ts
deleted file mode 100644
index 8e3ba87f85eec2172e4c6143a96e48fabe4caabf..0000000000000000000000000000000000000000
--- a/ui/lib/data-service.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { DataResponse } from "@/types/data";
-
-export async function getData(): Promise {
- // Mock data simulation - replacing actual database/API call
- const datasets = [
- { name: "DrugBank Compounds", type: "Molecules", count: "12,450", size: "45.2 MB", updated: "2024-01-15" },
- { name: "ChEMBL Kinase Inhibitors", type: "Molecules", count: "8,234", size: "32.1 MB", updated: "2024-01-10" },
- { name: "Custom Protein Targets", type: "Proteins", count: "1,245", size: "78.5 MB", updated: "2024-01-08" },
- ];
-
- const stats = {
- datasets: 5,
- molecules: "24.5K",
- proteins: "1.2K",
- storage: "156 MB",
- };
-
- return Promise.resolve({ datasets, stats });
-}
diff --git a/ui/lib/explorer-service.ts b/ui/lib/explorer-service.ts
deleted file mode 100644
index 13bfb5a6a42920fa51bbc7488900993a0f8dc412..0000000000000000000000000000000000000000
--- a/ui/lib/explorer-service.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { ExplorerRequestSchema } from "@/schemas/explorer";
-import { DataPoint,ExplorerResponse } from "@/types/explorer";
-
-const clusters = [
- { cx: 2, cy: 3, color: "var(--color-chart-1)" },
- { cx: -2, cy: -1, color: "var(--color-chart-2)" },
- { cx: 4, cy: -2, color: "var(--color-chart-3)" },
- { cx: -1, cy: 4, color: "var(--color-chart-4)" },
-];
-
-export async function getExplorerPoints(
- dataset?: string,
- view?: string,
- colorBy?: string
-): Promise {
- // Validate params using the schema to ensure defaults are applied if needed, even for internal calls
- // Note: safeParse is synchronous, but we can treat this as an async service
- const result = ExplorerRequestSchema.safeParse({
- dataset,
- view,
- colorBy,
- });
-
- if (!result.success) {
- // Return empty/default response or throw type-safe error
- // For now, adhering to existing behavior, we can just throw or fallback
- throw new Error("Invalid parameters");
- }
-
-
- // TODO: replace mock generation with backend embeddings
- const points: DataPoint[] = [];
- for (let i = 0; i < 200; i++) {
- const cluster = clusters[Math.floor(i / 50)];
- points.push({
- x: cluster.cx + (Math.random() - 0.5) * 2,
- y: cluster.cy + (Math.random() - 0.5) * 2,
- z: Math.random() * 100,
- color: cluster.color,
- name: `Mol_${i}`,
- affinity: Math.random() * 100,
- });
- }
-
- const metrics = {
- activeMolecules: 12450,
- clusters: 4,
- avgConfidence: 0.89,
- };
-
- return Promise.resolve({ points, metrics });
-}
diff --git a/ui/lib/get-strict-context.tsx b/ui/lib/get-strict-context.tsx
deleted file mode 100644
index be139dcd5a5ff35a2d02a80f911998c7cf06d3ab..0000000000000000000000000000000000000000
--- a/ui/lib/get-strict-context.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import * as React from 'react';
-
-function getStrictContext(
- name?: string,
-): readonly [
- ({
- value,
- children,
- }: {
- value: T;
- children?: React.ReactNode;
- }) => React.JSX.Element,
- () => T,
-] {
- const Context = React.createContext(undefined);
-
- const Provider = ({
- value,
- children,
- }: {
- value: T;
- children?: React.ReactNode;
- }) => {children};
-
- const useSafeContext = () => {
- const ctx = React.useContext(Context);
- if (ctx === undefined) {
- throw new Error(`useContext must be used within ${name ?? 'a Provider'}`);
- }
- return ctx;
- };
-
- return [Provider, useSafeContext] as const;
-}
-
-export { getStrictContext };
diff --git a/ui/lib/utils.ts b/ui/lib/utils.ts
deleted file mode 100644
index 5e205c6b807d9491f1b2148838d3fcb7b1d0bf2b..0000000000000000000000000000000000000000
--- a/ui/lib/utils.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { type ClassValue,clsx } from "clsx"
-import { twMerge } from "tailwind-merge"
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs))
-}
diff --git a/ui/lib/visualization-api.ts b/ui/lib/visualization-api.ts
deleted file mode 100644
index 9b0509f8d701049aab88017c54bd07824ff7b8eb..0000000000000000000000000000000000000000
--- a/ui/lib/visualization-api.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import type { Molecule, Protein } from './visualization-types';
-
-const API_BASE = '/api';
-
-// Generic fetch helper with error handling
-async function fetchApi(url: string): Promise {
- const response = await fetch(url);
- if (!response.ok) {
- const error = await response.json().catch(() => ({ error: 'Unknown error' }));
- throw new Error(error.error || `HTTP ${response.status}`);
- }
- return response.json();
-}
-
-async function fetchText(url: string): Promise {
- const response = await fetch(url);
- if (!response.ok) {
- const error = await response.json().catch(() => ({ error: 'Unknown error' }));
- throw new Error(error.error || `HTTP ${response.status}`);
- }
- return response.text();
-}
-
-// Molecule API
-export async function getMolecules(): Promise {
- return fetchApi(`${API_BASE}/molecules`);
-}
-
-export async function getMolecule(id: string): Promise {
- return fetchApi(`${API_BASE}/molecules/${id}`);
-}
-
-export async function getMoleculeSDF(id: string): Promise {
- return fetchText(`${API_BASE}/molecules/${id}/sdf`);
-}
-
-// Protein API
-export async function getProteins(): Promise {
- return fetchApi(`${API_BASE}/proteins`);
-}
-
-export async function getProtein(id: string): Promise {
- return fetchApi(`${API_BASE}/proteins/${id}`);
-}
-
-export async function getProteinPDB(id: string): Promise {
- return fetchText(`${API_BASE}/proteins/${id}/pdb`);
-}
-
-// URL builders for direct links
-export function getMoleculeSdfUrl(id: string): string {
- return `${API_BASE}/molecules/${id}/sdf`;
-}
-
-export function getProteinPdbUrl(id: string): string {
- return `${API_BASE}/proteins/${id}/pdb`;
-}
diff --git a/ui/lib/visualization-types.ts b/ui/lib/visualization-types.ts
deleted file mode 100644
index f07b0559ddce35a41e9435454d690336655850ce..0000000000000000000000000000000000000000
--- a/ui/lib/visualization-types.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-// Molecule types
-export type Molecule = {
- id: string;
- name: string;
- smiles: string;
- pubchemCid: number;
- description?: string;
-};
-
-// Protein types
-export type Protein = {
- id: string;
- pdbId: string;
- name: string;
- description?: string;
-};
-
-// Viewer representation types
-export type MoleculeRepresentation = 'stick' | 'sphere' | 'line' | 'cartoon';
-export type ProteinRepresentation = 'cartoon' | 'ball-and-stick' | 'surface' | 'ribbon';